Skip to content

Commit

Permalink
Allow overriding individual exports of reexported external namespaces
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Feb 12, 2021
1 parent 0e3445b commit 272ffd9
Show file tree
Hide file tree
Showing 43 changed files with 300 additions and 127 deletions.
47 changes: 23 additions & 24 deletions src/finalisers/shared/getExportBlock.ts
Expand Up @@ -29,30 +29,6 @@ export function getExportBlock(

let exportBlock = '';

// star exports must always output first for precedence
for (const { name, reexports } of dependencies) {
if (reexports && namedExportsMode) {
for (const specifier of reexports) {
if (specifier.reexported === '*') {
if (exportBlock) exportBlock += n;
if (specifier.needsLiveBinding) {
exportBlock +=
`Object.keys(${name}).forEach(function${_}(k)${_}{${n}` +
`${t}if${_}(k${_}!==${_}'default')${_}Object.defineProperty(exports,${_}k,${_}{${n}` +
`${t}${t}enumerable:${_}true,${n}` +
`${t}${t}get:${_}function${_}()${_}{${n}` +
`${t}${t}${t}return ${name}[k];${n}` +
`${t}${t}}${n}${t}});${n}});`;
} else {
exportBlock +=
`Object.keys(${name}).forEach(function${_}(k)${_}{${n}` +
`${t}if${_}(k${_}!==${_}'default')${_}exports[k]${_}=${_}${name}[k];${n}});`;
}
}
}
}
}

for (const {
defaultVariableName,
id,
Expand Down Expand Up @@ -98,6 +74,29 @@ export function getExportBlock(
}
}

for (const { name, reexports } of dependencies) {
if (reexports && namedExportsMode) {
for (const specifier of reexports) {
if (specifier.reexported === '*') {
if (exportBlock) exportBlock += n;
if (specifier.needsLiveBinding) {
exportBlock +=
`Object.keys(${name}).forEach(function${_}(k)${_}{${n}` +
`${t}if${_}(k${_}!==${_}'default'${_}&&${_}!exports.hasOwnProperty(k))${_}Object.defineProperty(exports,${_}k,${_}{${n}` +
`${t}${t}enumerable:${_}true,${n}` +
`${t}${t}get:${_}function${_}()${_}{${n}` +
`${t}${t}${t}return ${name}[k];${n}` +
`${t}${t}}${n}${t}});${n}});`;
} else {
exportBlock +=
`Object.keys(${name}).forEach(function${_}(k)${_}{${n}` +
`${t}if${_}(k${_}!==${_}'default'${_}&&${_}!exports.hasOwnProperty(k))${_}exports[k]${_}=${_}${name}[k];${n}});`;
}
}
}
}
}

if (exportBlock) {
return `${n}${n}${exportBlock}`;
}
Expand Down
Expand Up @@ -2,14 +2,6 @@ define(['exports', 'starexternal1', 'external1', './generated-dep', 'starexterna

var main = '1';

Object.keys(starexternal1).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return starexternal1[k];
}
});
});
Object.defineProperty(exports, 'e', {
enumerable: true,
get: function () {
Expand All @@ -18,6 +10,14 @@ define(['exports', 'starexternal1', 'external1', './generated-dep', 'starexterna
});
exports.dep = dep.dep;
exports.main = main;
Object.keys(starexternal1).forEach(function (k) {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return starexternal1[k];
}
});
});

Object.defineProperty(exports, '__esModule', { value: true });

Expand Down
Expand Up @@ -2,14 +2,6 @@ define(['exports', './generated-dep', 'external2', 'starexternal2'], function (e

var main = '2';

Object.keys(starexternal2).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return starexternal2[k];
}
});
});
exports.dep = dep.dep;
Object.defineProperty(exports, 'e', {
enumerable: true,
Expand All @@ -18,6 +10,14 @@ define(['exports', './generated-dep', 'external2', 'starexternal2'], function (e
}
});
exports.main = main;
Object.keys(starexternal2).forEach(function (k) {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return starexternal2[k];
}
});
});

Object.defineProperty(exports, '__esModule', { value: true });

Expand Down
Expand Up @@ -10,14 +10,6 @@ require('external2');

var main = '1';

Object.keys(starexternal1).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return starexternal1[k];
}
});
});
Object.defineProperty(exports, 'e', {
enumerable: true,
get: function () {
Expand All @@ -26,3 +18,11 @@ Object.defineProperty(exports, 'e', {
});
exports.dep = dep.dep;
exports.main = main;
Object.keys(starexternal1).forEach(function (k) {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return starexternal1[k];
}
});
});
Expand Up @@ -8,14 +8,6 @@ var starexternal2 = require('starexternal2');

var main = '2';

Object.keys(starexternal2).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return starexternal2[k];
}
});
});
exports.dep = dep.dep;
Object.defineProperty(exports, 'e', {
enumerable: true,
Expand All @@ -24,3 +16,11 @@ Object.defineProperty(exports, 'e', {
}
});
exports.main = main;
Object.keys(starexternal2).forEach(function (k) {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return starexternal2[k];
}
});
});
4 changes: 2 additions & 2 deletions test/form/samples/export-all-before-named/_expected/amd.js
Expand Up @@ -4,15 +4,15 @@ define(['exports', 'external'], function (exports, external) { 'use strict';
return path[0] === '.';
}

exports.internalFn = internalFn;
Object.keys(external).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return external[k];
}
});
});
exports.internalFn = internalFn;

Object.defineProperty(exports, '__esModule', { value: true });

Expand Down
4 changes: 2 additions & 2 deletions test/form/samples/export-all-before-named/_expected/cjs.js
Expand Up @@ -8,12 +8,12 @@ function internalFn(path) {
return path[0] === '.';
}

exports.internalFn = internalFn;
Object.keys(external).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return external[k];
}
});
});
exports.internalFn = internalFn;
4 changes: 2 additions & 2 deletions test/form/samples/export-all-before-named/_expected/iife.js
Expand Up @@ -5,15 +5,15 @@ var exposedInternals = (function (exports, external) {
return path[0] === '.';
}

exports.internalFn = internalFn;
Object.keys(external).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return external[k];
}
});
});
exports.internalFn = internalFn;

Object.defineProperty(exports, '__esModule', { value: true });

Expand Down
4 changes: 2 additions & 2 deletions test/form/samples/export-all-before-named/_expected/umd.js
Expand Up @@ -8,15 +8,15 @@
return path[0] === '.';
}

exports.internalFn = internalFn;
Object.keys(external).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return external[k];
}
});
});
exports.internalFn = internalFn;

Object.defineProperty(exports, '__esModule', { value: true });

Expand Down
6 changes: 3 additions & 3 deletions test/form/samples/export-all-multiple/_expected/amd.js
Expand Up @@ -3,23 +3,23 @@ define(['exports', 'foo', 'bar', 'baz'], function (exports, foo, bar, baz) { 'us


Object.keys(foo).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return foo[k];
}
});
});
Object.keys(bar).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return bar[k];
}
});
});
Object.keys(baz).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return baz[k];
Expand Down
6 changes: 3 additions & 3 deletions test/form/samples/export-all-multiple/_expected/cjs.js
Expand Up @@ -9,23 +9,23 @@ var baz = require('baz');


Object.keys(foo).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return foo[k];
}
});
});
Object.keys(bar).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return bar[k];
}
});
});
Object.keys(baz).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return baz[k];
Expand Down
6 changes: 3 additions & 3 deletions test/form/samples/export-all-multiple/_expected/iife.js
Expand Up @@ -4,23 +4,23 @@ var myBundle = (function (exports, foo, bar, baz) {


Object.keys(foo).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return foo[k];
}
});
});
Object.keys(bar).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return bar[k];
}
});
});
Object.keys(baz).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return baz[k];
Expand Down
6 changes: 3 additions & 3 deletions test/form/samples/export-all-multiple/_expected/umd.js
Expand Up @@ -5,23 +5,23 @@
}(this, (function (exports, foo, bar, baz) { 'use strict';

Object.keys(foo).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return foo[k];
}
});
});
Object.keys(bar).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return bar[k];
}
});
});
Object.keys(baz).forEach(function (k) {
if (k !== 'default') Object.defineProperty(exports, k, {
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () {
return baz[k];
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions test/form/samples/no-external-live-bindings/_expected/amd.js
Expand Up @@ -14,11 +14,11 @@ define(['require', 'exports', 'external1', 'external2'], function (require, expo

const dynamic = new Promise(function (resolve, reject) { require(['external3'], function (m) { resolve(/*#__PURE__*/_interopNamespace(m)); }, reject) });

Object.keys(external2).forEach(function (k) {
if (k !== 'default') exports[k] = external2[k];
});
exports.external1 = external1.external1;
exports.dynamic = dynamic;
Object.keys(external2).forEach(function (k) {
if (k !== 'default' && !exports.hasOwnProperty(k)) exports[k] = external2[k];
});

Object.defineProperty(exports, '__esModule', { value: true });

Expand Down
6 changes: 3 additions & 3 deletions test/form/samples/no-external-live-bindings/_expected/cjs.js
Expand Up @@ -19,8 +19,8 @@ function _interopNamespace(e) {

const dynamic = Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('external3')); });

Object.keys(external2).forEach(function (k) {
if (k !== 'default') exports[k] = external2[k];
});
exports.external1 = external1.external1;
exports.dynamic = dynamic;
Object.keys(external2).forEach(function (k) {
if (k !== 'default' && !exports.hasOwnProperty(k)) exports[k] = external2[k];
});

0 comments on commit 272ffd9

Please sign in to comment.