diff --git a/lib/builder.js b/lib/builder.js index c571887..67232d3 100644 --- a/lib/builder.js +++ b/lib/builder.js @@ -456,6 +456,7 @@ function processCompileOpts(options, defaults) { format: 'umd', globalDeps: {}, globalName: null, + exportDefault: false, // conditionalResolutions: {}, // can add a special object here that matches condition predicates to direct module names to use for sfx diff --git a/lib/compile.js b/lib/compile.js index 328aa42..5b744e9 100644 --- a/lib/compile.js +++ b/lib/compile.js @@ -63,6 +63,16 @@ function getEncoding(canonical, encodings) { return encodings[canonical] = highestEncoding.toString(16); } +function getName(encoding, encodings) { + var match + Object.keys(encodings).some(function(e) { + if (encodings[e] == encoding) { + match = e; + return true; + } + }); + return match; +} // used to support leading #!/usr/bin/env in scripts as supported in Node var hashBangRegEx = /^\#\!.*/; @@ -429,7 +439,14 @@ function wrapSFXOutputs(loader, tree, modules, outputs, entryPoints, compileOpts // for NodeJS execution to work correctly, we need to ensure the scoped module, exports and require variables are nulled out outputs.unshift("var require = this.require, exports = this.exports, module = this.module;"); - outputs.unshift(sfxcore.toString(), "(" + JSON.stringify(entryPoints) + ", " + JSON.stringify(externalDepIds) + ", function(" + compileOpts.systemGlobal + ") {"); + // if the first entry point is a dynamic module, then it is exportDefault always by default + var exportDefault = compileOpts.exportDefault; + var exportedLoad = tree[compileOpts.encodeNames && getName(entryPoints[0], cache.encodings) || entryPoints[0]]; + if (exportedLoad.metadata.format != 'register' && exportedLoad.metadata.format != 'esm') + exportDefault = true; + + outputs.unshift(sfxcore.toString(), "(" + JSON.stringify(entryPoints) + ", " + JSON.stringify(externalDepIds) + ", " + + (exportDefault ? "true" : "false") + ", function(" + compileOpts.systemGlobal + ") {"); outputs.push("})"); return asp(fs.readFile)(path.resolve(__dirname, '../templates/sfx-' + compileOpts.format + '.js')) diff --git a/lib/rollup.js b/lib/rollup.js index 341e768..1004c2a 100644 --- a/lib/rollup.js +++ b/lib/rollup.js @@ -244,8 +244,13 @@ exports.rollupTree = function(loader, tree, entryPoints, traceOpts, compileOpts) .then(function(bundle) { var entryPointLoad = tree[entryPoint]; + var defaultExport = compileOpts.defaultExport; + if (entryPointLoad.metadata.format != 'esm' && entryPointLoad.metadata.format != 'register') + defaultExport = true; + var generateOptions = { - sourceMap: compileOpts.sourceMaps + sourceMap: compileOpts.sourceMaps, + exports: defaultExport ? 'default' : 'named' }; // for a full tree rollup, we pass all the output options into rollup itself diff --git a/templates/sfx-core-register.js b/templates/sfx-core-register.js index d707539..c6a420a 100644 --- a/templates/sfx-core-register.js +++ b/templates/sfx-core-register.js @@ -138,17 +138,18 @@ function getESModule(exports) { var esModule = {}; // don't trigger getters/setters in environments that support them - if (typeof exports == 'object' || typeof exports == 'function') { - var hasOwnProperty = exports && exports.hasOwnProperty; + if ((typeof exports == 'object' || typeof exports == 'function') && exports !== global) { if (getOwnPropertyDescriptor) { - for (var p in exports) { - if (!trySilentDefineProperty(esModule, exports, p)) - setPropertyIfHasOwnProperty(esModule, exports, p, hasOwnProperty); - } + for (var p in exports) + defineOrCopyProperty(esModule, exports, p); } else { - for (var p in exports) - setPropertyIfHasOwnProperty(esModule, exports, p, hasOwnProperty); + var hasOwnProperty = exports && exports.hasOwnProperty; + for (var p in exports) { + if (hasOwnProperty && !exports.hasOwnProperty(p)) + continue; + esModule[p] = exports[p]; + } } } esModule['default'] = exports; @@ -158,20 +159,16 @@ return esModule; } - function setPropertyIfHasOwnProperty(targetObj, sourceObj, propName, hasOwnProperty) { - if (!hasOwnProperty || sourceObj.hasOwnProperty(propName)) - targetObj[propName] = sourceObj[propName]; - } - - function trySilentDefineProperty(targetObj, sourceObj, propName) { + function defineOrCopyProperty(targetObj, sourceObj, propName) { try { var d; if (d = Object.getOwnPropertyDescriptor(sourceObj, propName)) defineProperty(targetObj, propName, d); - - return true; - } catch (ex) { - // Object.getOwnPropertyDescriptor threw an exception, fall back to normal set property. + } + catch (ex) { + // Object.getOwnPropertyDescriptor threw an exception, fall back to normal set property + // we dont need hasOwnProperty here because getOwnPropertyDescriptor would have returned undefined above + targetObj[propName] = sourceObj[propName]; return false; } } @@ -249,7 +246,7 @@ return modules[name] = entry.declarative ? entry.module.exports : entry.esModule; }; - return function(mains, depNames, declare) { + return function(mains, depNames, exportDefault, declare) { return function(formatDetect) { formatDetect(function(deps) { // register external dependencies @@ -269,7 +266,7 @@ for (var i = 1; i < mains.length; i++) load(mains[i]); - if (firstLoad.__useDefault) + if (exportDefault) return firstLoad['default']; else return firstLoad; diff --git a/templates/sfx-core-register.min.js b/templates/sfx-core-register.min.js index d128bce..4036967 100644 --- a/templates/sfx-core-register.min.js +++ b/templates/sfx-core-register.min.js @@ -1 +1 @@ -!function(e){function r(e,r,t){e in l||(l[e]={name:e,declarative:!0,deps:r,declare:t,normalizedDeps:r})}function t(e){return v[e]||(v[e]={name:e,dependencies:[],exports:{},importers:[]})}function n(r){if(!r.module){var o=r.module=t(r.name),u=r.module.exports,a=r.declare.call(e,function(e,r){if(o.locked=!0,"object"==typeof e)for(var t in e)u[t]=e[t];else u[e]=r;for(var n=0,a=o.importers.length;a>n;n++){var i=o.importers[n];if(!i.locked)for(var s=0;si;i++){var c,d=r.normalizedDeps[i],p=l[d],m=v[d];m?c=m.exports:p&&!p.declarative?c=p.esModule:p?(n(p),m=p.module,c=m.exports):c=s(d),m&&m.importers?(m.importers.push(o),o.dependencies.push(m)):o.dependencies.push(null),o.setters[i]&&o.setters[i](c)}}}function o(e){var r={};if("object"==typeof e||"function"==typeof e){var t=e&&e.hasOwnProperty;if(c)for(var n in e)a(r,e,n)||u(r,e,n,t);else for(var n in e)u(r,e,n,t)}return r["default"]=e,p(r,"__useDefault",{value:!0}),r}function u(e,r,t,n){(!n||r.hasOwnProperty(t))&&(e[t]=r[t])}function a(e,r,t){try{var n;return(n=Object.getOwnPropertyDescriptor(r,t))&&p(e,t,n),!0}catch(o){return!1}}function i(r,t){var n=l[r];if(n&&!n.evaluated&&n.declarative){t.push(r);for(var o=0,u=n.normalizedDeps.length;u>o;o++){var a=n.normalizedDeps[o];-1==f.call(t,a)&&(l[a]?i(a,t):s(a))}n.evaluated||(n.evaluated=!0,n.module.execute.call(e))}}function s(e){if(y[e])return y[e];if("@node/"==e.substr(0,6))return m(e.substr(6));var r=l[e];if(!r)throw"Module "+e+" not present.";return n(l[e]),i(e,[]),l[e]=void 0,r.declarative&&p(r.module.exports,"__esModule",{value:!0}),y[e]=r.declarative?r.module.exports:r.esModule}var l={},f=Array.prototype.indexOf||function(e){for(var r=0,t=this.length;t>r;r++)if(this[r]===e)return r;return-1},c=!0;try{Object.getOwnPropertyDescriptor({a:0},"a")}catch(d){c=!1}var p;!function(){try{Object.defineProperty({},"a",{})&&(p=Object.defineProperty)}catch(e){p=function(e,r,t){try{e[r]=t.value||t.get.call(e)}catch(n){}}}}();var v={},m="undefined"!=typeof System&&System._nodeRequire||"undefined"!=typeof require&&require.resolve&&"undefined"!=typeof process&&require,y={"@empty":{}};return function(e,t,n){return function(u){u(function(u){for(var a=0;a1)for(var a=1;an;n++){var i=o.importers[n];if(!i.locked)for(var s=0;sl;l++){var f,c=r.normalizedDeps[l],v=s[c],m=p[c];m?f=m.exports:v&&!v.declarative?f=v.esModule:v?(n(v),m=v.module,f=m.exports):f=i(c),m&&m.importers?(m.importers.push(o),o.dependencies.push(m)):o.dependencies.push(null),o.setters[l]&&o.setters[l](f)}}}function o(r){var t={};if(("object"==typeof r||"function"==typeof r)&&r!==e)if(d)for(var n in r)a(t,r,n);else{var o=r&&r.hasOwnProperty;for(var n in r)(!o||r.hasOwnProperty(n))&&(t[n]=r[n])}return t["default"]=r,c(t,"__useDefault",{value:!0}),t}function a(e,r,t){try{var n;(n=Object.getOwnPropertyDescriptor(r,t))&&c(e,t,n)}catch(o){return e[t]=r[t],!1}}function u(r,t){var n=s[r];if(n&&!n.evaluated&&n.declarative){t.push(r);for(var o=0,a=n.normalizedDeps.length;a>o;o++){var d=n.normalizedDeps[o];-1==l.call(t,d)&&(s[d]?u(d,t):i(d))}n.evaluated||(n.evaluated=!0,n.module.execute.call(e))}}function i(e){if(m[e])return m[e];if("@node/"==e.substr(0,6))return v(e.substr(6));var r=s[e];if(!r)throw"Module "+e+" not present.";return n(s[e]),u(e,[]),s[e]=void 0,r.declarative&&c(r.module.exports,"__esModule",{value:!0}),m[e]=r.declarative?r.module.exports:r.esModule}var s={},l=Array.prototype.indexOf||function(e){for(var r=0,t=this.length;t>r;r++)if(this[r]===e)return r;return-1},d=!0;try{Object.getOwnPropertyDescriptor({a:0},"a")}catch(f){d=!1}var c;!function(){try{Object.defineProperty({},"a",{})&&(c=Object.defineProperty)}catch(e){c=function(e,r,t){try{e[r]=t.value||t.get.call(e)}catch(n){}}}}();var p={},v="undefined"!=typeof System&&System._nodeRequire||"undefined"!=typeof require&&require.resolve&&"undefined"!=typeof process&&require,m={"@empty":{}};return function(e,t,n,a){return function(u){u(function(u){for(var s=0;s1)for(var s=1;st;t++){var a=e.normalizedDeps[t],u=v[a];if(u&&!u.evaluated){var d=e.groupIndex+(u.declarative!=e.declarative);if(void 0===u.groupIndex||u.groupIndex=0;a--){for(var u=t[a],i=0;ia;a++){var d=t.importers[a];if(!d.locked)for(var i=0;ia;a++){var l,s=r.normalizedDeps[a],c=v[s],f=y[s];f?l=f.exports:c&&!c.declarative?l=c.esModule:c?(d(c),f=c.module,l=f.exports):l=p(s),f&&f.importers?(f.importers.push(t),t.dependencies.push(f)):t.dependencies.push(null),t.setters[a]&&t.setters[a](l)}}}function i(e){var r,t=v[e];if(t)t.declarative?f(e,[]):t.evaluated||l(t),r=t.module.exports;else if(r=p(e),!r)throw new Error("Unable to load dependency "+e+".");return(!t||t.declarative)&&r&&r.__useDefault?r["default"]:r}function l(r){if(!r.module){var t={},n=r.module={exports:t,id:r.name};if(!r.executingRequire)for(var o=0,a=r.normalizedDeps.length;a>o;o++){var u=r.normalizedDeps[o],d=v[u];d&&l(d)}r.evaluated=!0;var c=r.execute.call(e,function(e){for(var t=0,n=r.deps.length;n>t;t++)if(r.deps[t]==e)return i(r.normalizedDeps[t]);throw new TypeError("Module "+e+" not declared as a dependency.")},t,n);c&&(n.exports=c),t=n.exports,t&&t.__esModule?r.esModule=t:r.esModule=s(t)}}function s(r){var t={};if(("object"==typeof r||"function"==typeof r)&&r!==e)if(m)for(var n in r)c(t,r,n);else{var o=r&&r.hasOwnProperty;for(var n in r)(!o||r.hasOwnProperty(n))&&(t[n]=r[n])}return t["default"]=r,x(t,"__useDefault",{value:!0}),t}function c(e,r,t){try{var n;(n=Object.getOwnPropertyDescriptor(r,t))&&x(e,t,n)}catch(o){return e[t]=r[t],!1}}function f(r,t){var n=v[r];if(n&&!n.evaluated&&n.declarative){t.push(r);for(var o=0,a=n.normalizedDeps.length;a>o;o++){var u=n.normalizedDeps[o];-1==g.call(t,u)&&(v[u]?f(u,t):p(u))}n.evaluated||(n.evaluated=!0,n.module.execute.call(e))}}function p(e){if(_[e])return _[e];if("@node/"==e.substr(0,6))return D(e.substr(6));var r=v[e];if(!r)throw"Module "+e+" not present.";return a(e),f(e,[]),v[e]=void 0,r.declarative&&x(r.module.exports,"__esModule",{value:!0}),_[e]=r.declarative?r.module.exports:r.esModule}var v={},g=Array.prototype.indexOf||function(e){for(var r=0,t=this.length;t>r;r++)if(this[r]===e)return r;return-1},m=!0;try{Object.getOwnPropertyDescriptor({a:0},"a")}catch(h){m=!1}var x;!function(){try{Object.defineProperty({},"a",{})&&(x=Object.defineProperty)}catch(e){x=function(e,r,t){try{e[r]=t.value||t.get.call(e)}catch(n){}}}}();var y={},D="undefined"!=typeof System&&System._nodeRequire||"undefined"!=typeof require&&require.resolve&&"undefined"!=typeof process&&require,_={"@empty":{}};return function(e,n,o){return function(a){a(function(a){for(var u={_nodeRequire:D,register:r,registerDynamic:t,get:p,set:function(e,r){_[e]=r},newModule:function(e){return e}},d=0;d1)for(var d=1;dt;t++){var a=e.normalizedDeps[t],u=v[a];if(u&&!u.evaluated){var d=e.groupIndex+(u.declarative!=e.declarative);if(void 0===u.groupIndex||u.groupIndex=0;a--){for(var u=t[a],i=0;ia;a++){var d=t.importers[a];if(!d.locked)for(var i=0;ia;a++){var l,s=r.normalizedDeps[a],c=v[s],f=y[s];f?l=f.exports:c&&!c.declarative?l=c.esModule:c?(d(c),f=c.module,l=f.exports):l=p(s),f&&f.importers?(f.importers.push(t),t.dependencies.push(f)):t.dependencies.push(null),t.setters[a]&&t.setters[a](l)}}}function i(e){var r,t=v[e];if(t)t.declarative?f(e,[]):t.evaluated||l(t),r=t.module.exports;else if(r=p(e),!r)throw new Error("Unable to load dependency "+e+".");return(!t||t.declarative)&&r&&r.__useDefault?r["default"]:r}function l(r){if(!r.module){var t={},n=r.module={exports:t,id:r.name};if(!r.executingRequire)for(var o=0,a=r.normalizedDeps.length;a>o;o++){var u=r.normalizedDeps[o],d=v[u];d&&l(d)}r.evaluated=!0;var c=r.execute.call(e,function(e){for(var t=0,n=r.deps.length;n>t;t++)if(r.deps[t]==e)return i(r.normalizedDeps[t]);throw new TypeError("Module "+e+" not declared as a dependency.")},t,n);c&&(n.exports=c),t=n.exports,t&&t.__esModule?r.esModule=t:r.esModule=s(t)}}function s(r){var t={};if(("object"==typeof r||"function"==typeof r)&&r!==e)if(m)for(var n in r)c(t,r,n);else{var o=r&&r.hasOwnProperty;for(var n in r)(!o||r.hasOwnProperty(n))&&(t[n]=r[n])}return t["default"]=r,x(t,"__useDefault",{value:!0}),t}function c(e,r,t){try{var n;(n=Object.getOwnPropertyDescriptor(r,t))&&x(e,t,n)}catch(o){return e[t]=r[t],!1}}function f(r,t){var n=v[r];if(n&&!n.evaluated&&n.declarative){t.push(r);for(var o=0,a=n.normalizedDeps.length;a>o;o++){var u=n.normalizedDeps[o];-1==g.call(t,u)&&(v[u]?f(u,t):p(u))}n.evaluated||(n.evaluated=!0,n.module.execute.call(e))}}function p(e){if(I[e])return I[e];if("@node/"==e.substr(0,6))return D(e.substr(6));var r=v[e];if(!r)throw"Module "+e+" not present.";return a(e),f(e,[]),v[e]=void 0,r.declarative&&x(r.module.exports,"__esModule",{value:!0}),I[e]=r.declarative?r.module.exports:r.esModule}var v={},g=Array.prototype.indexOf||function(e){for(var r=0,t=this.length;t>r;r++)if(this[r]===e)return r;return-1},m=!0;try{Object.getOwnPropertyDescriptor({a:0},"a")}catch(h){m=!1}var x;!function(){try{Object.defineProperty({},"a",{})&&(x=Object.defineProperty)}catch(e){x=function(e,r,t){try{e[r]=t.value||t.get.call(e)}catch(n){}}}}();var y={},D="undefined"!=typeof System&&System._nodeRequire||"undefined"!=typeof require&&require.resolve&&"undefined"!=typeof process&&require,I={"@empty":{}};return function(e,n,o,a){return function(u){u(function(u){for(var d={_nodeRequire:D,register:r,registerDynamic:t,get:p,set:function(e,r){I[e]=r},newModule:function(e){return e}},i=0;i1)for(var i=1;i