From f3234f63b81c2fdf4c514d7eed4e6d74bd5f7a95 Mon Sep 17 00:00:00 2001 From: Ivan Plesskih Date: Fri, 30 Oct 2020 18:29:57 +0500 Subject: [PATCH 1/5] Expose syntheticNamedExports in module info, added docs --- docs/05-plugin-development.md | 2 ++ src/Module.ts | 3 ++- src/rollup/types.d.ts | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/05-plugin-development.md b/docs/05-plugin-development.md index 80e26ff4745..9ba78903d74 100644 --- a/docs/05-plugin-development.md +++ b/docs/05-plugin-development.md @@ -647,6 +647,8 @@ Returns additional information about the module in question in the form implicitlyLoadedAfterOneOf: string[], // implicit relationships, declared via this.emitChunk implicitlyLoadedBefore: string[], // implicit relationships, declared via this.emitChunk hasModuleSideEffects: boolean | "no-treeshake" // are imports of this module included if nothing is imported from it + meta: {[plugin: string]: any} // custom module meta-data + syntheticNamedExports: boolean | string // final value of synthetic named exports } ``` diff --git a/src/Module.ts b/src/Module.ts index 3d42a0227f0..37276e5667b 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -284,7 +284,8 @@ export default class Module { }, isEntry, isExternal: false, - meta + meta, + syntheticNamedExports }; } diff --git a/src/rollup/types.d.ts b/src/rollup/types.d.ts index 7e7c4f1778f..217c826dd95 100644 --- a/src/rollup/types.d.ts +++ b/src/rollup/types.d.ts @@ -171,6 +171,7 @@ interface ModuleInfo { isEntry: boolean; isExternal: boolean; meta: CustomPluginOptions; + syntheticNamedExports: boolean | string; } export type GetModuleInfo = (moduleId: string) => ModuleInfo | null; From 2e2fa6bf87850b82912d840b88d86dedf9617b25 Mon Sep 17 00:00:00 2001 From: Ivan Plesskih Date: Fri, 30 Oct 2020 19:12:05 +0500 Subject: [PATCH 2/5] Updated tests, changed info after transform --- src/ExternalModule.ts | 3 ++- src/Module.ts | 1 + .../implicitly-dependent-emitted-entry/_config.js | 6 ++++-- .../implicitly-dependent-entry/_config.js | 6 ++++-- .../multiple-dependencies/_config.js | 9 ++++++--- .../single-dependency/_config.js | 6 ++++-- .../deprecated/manual-chunks-info/_config.js | 12 ++++++++---- .../samples/manual-chunks-info/_config.js | 12 ++++++++---- .../samples/module-parsed-hook/_config.js | 6 ++++-- .../samples/plugin-module-information/_config.js | 15 ++++++++++----- .../non-default-export/_config.js | 5 +++++ 11 files changed, 56 insertions(+), 25 deletions(-) diff --git a/src/ExternalModule.ts b/src/ExternalModule.ts index aef2796394f..f5ffba4bbb2 100644 --- a/src/ExternalModule.ts +++ b/src/ExternalModule.ts @@ -58,7 +58,8 @@ export default class ExternalModule { }, isEntry: false, isExternal: true, - meta + meta, + syntheticNamedExports: false }; } diff --git a/src/Module.ts b/src/Module.ts index 37276e5667b..438357be22a 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -805,6 +805,7 @@ export default class Module { } if (syntheticNamedExports != null) { this.syntheticNamedExports = syntheticNamedExports; + this.info.syntheticNamedExports = syntheticNamedExports; } if (meta != null) { this.info.meta = { ...this.info.meta, ...meta }; diff --git a/test/chunking-form/samples/implicit-dependencies/implicitly-dependent-emitted-entry/_config.js b/test/chunking-form/samples/implicit-dependencies/implicitly-dependent-emitted-entry/_config.js index 41961b92aee..6564522f9b9 100644 --- a/test/chunking-form/samples/implicit-dependencies/implicitly-dependent-emitted-entry/_config.js +++ b/test/chunking-form/samples/implicit-dependencies/implicitly-dependent-emitted-entry/_config.js @@ -80,7 +80,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }); assert.deepStrictEqual(JSON.parse(JSON.stringify(this.getModuleInfo(ID_DEP))), { ast: { @@ -138,7 +139,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }); }, generateBundle(options, bundle) { diff --git a/test/chunking-form/samples/implicit-dependencies/implicitly-dependent-entry/_config.js b/test/chunking-form/samples/implicit-dependencies/implicitly-dependent-entry/_config.js index c3646c4f721..1a44bf6a0bf 100644 --- a/test/chunking-form/samples/implicit-dependencies/implicitly-dependent-entry/_config.js +++ b/test/chunking-form/samples/implicit-dependencies/implicitly-dependent-entry/_config.js @@ -76,7 +76,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }); assert.deepStrictEqual(JSON.parse(JSON.stringify(this.getModuleInfo(ID_DEP))), { ast: { @@ -134,7 +135,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }); }, generateBundle(options, bundle) { diff --git a/test/chunking-form/samples/implicit-dependencies/multiple-dependencies/_config.js b/test/chunking-form/samples/implicit-dependencies/multiple-dependencies/_config.js index 8cb1f3e1b3b..8ae1e81d181 100644 --- a/test/chunking-form/samples/implicit-dependencies/multiple-dependencies/_config.js +++ b/test/chunking-form/samples/implicit-dependencies/multiple-dependencies/_config.js @@ -125,7 +125,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }); assert.deepStrictEqual(JSON.parse(JSON.stringify(this.getModuleInfo(ID_MAIN2))), { ast: { @@ -219,7 +220,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }); assert.deepStrictEqual(JSON.parse(JSON.stringify(this.getModuleInfo(ID_DEP))), { ast: { @@ -312,7 +314,8 @@ module.exports = { importers: [], isEntry: false, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }); } } diff --git a/test/chunking-form/samples/implicit-dependencies/single-dependency/_config.js b/test/chunking-form/samples/implicit-dependencies/single-dependency/_config.js index 1cf66ad7870..1ef3f4bf156 100644 --- a/test/chunking-form/samples/implicit-dependencies/single-dependency/_config.js +++ b/test/chunking-form/samples/implicit-dependencies/single-dependency/_config.js @@ -75,7 +75,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }); assert.deepStrictEqual(JSON.parse(JSON.stringify(this.getModuleInfo(ID_DEP))), { ast: { @@ -133,7 +134,8 @@ module.exports = { importers: [], isEntry: false, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }); }, generateBundle(options, bundle) { diff --git a/test/function/samples/deprecated/manual-chunks-info/_config.js b/test/function/samples/deprecated/manual-chunks-info/_config.js index 2b1476b517b..f6ef4e03eb2 100644 --- a/test/function/samples/deprecated/manual-chunks-info/_config.js +++ b/test/function/samples/deprecated/manual-chunks-info/_config.js @@ -111,7 +111,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }, { ast: null, @@ -126,7 +127,8 @@ module.exports = { importers: [getId('main')], isEntry: false, isExternal: true, - meta: {} + meta: {}, + syntheticNamedExports: false }, { ast: { @@ -154,7 +156,8 @@ module.exports = { importers: [getId('dynamic'), getId('main')], isEntry: false, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }, { ast: { @@ -226,7 +229,8 @@ module.exports = { importers: [], isEntry: false, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false } ] ); diff --git a/test/function/samples/manual-chunks-info/_config.js b/test/function/samples/manual-chunks-info/_config.js index 7f56a4a17ec..28cb13fb36c 100644 --- a/test/function/samples/manual-chunks-info/_config.js +++ b/test/function/samples/manual-chunks-info/_config.js @@ -110,7 +110,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }, { ast: null, @@ -125,7 +126,8 @@ module.exports = { importers: [getId('main')], isEntry: false, isExternal: true, - meta: {} + meta: {}, + syntheticNamedExports: false }, { ast: { @@ -153,7 +155,8 @@ module.exports = { importers: [getId('dynamic'), getId('main')], isEntry: false, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }, { ast: { @@ -225,7 +228,8 @@ module.exports = { importers: [], isEntry: false, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false } ] ); diff --git a/test/function/samples/module-parsed-hook/_config.js b/test/function/samples/module-parsed-hook/_config.js index 4b5c11e0d90..ffe1a6c8b89 100644 --- a/test/function/samples/module-parsed-hook/_config.js +++ b/test/function/samples/module-parsed-hook/_config.js @@ -58,7 +58,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }, { ast: { @@ -102,7 +103,8 @@ module.exports = { importers: [ID_MAIN], isEntry: false, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false } ]); } diff --git a/test/function/samples/plugin-module-information/_config.js b/test/function/samples/plugin-module-information/_config.js index 24e8e472dfc..a36ae8a13af 100644 --- a/test/function/samples/plugin-module-information/_config.js +++ b/test/function/samples/plugin-module-information/_config.js @@ -27,7 +27,8 @@ module.exports = { importers: [], isEntry: id === ID_MAIN, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }); }, renderStart() { @@ -172,7 +173,8 @@ module.exports = { importers: [], isEntry: true, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }, { ast: { @@ -247,7 +249,8 @@ module.exports = { importers: [ID_MAIN, ID_NESTED], isEntry: false, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false }, { ast: null, @@ -262,7 +265,8 @@ module.exports = { importers: [ID_FOO], isEntry: false, isExternal: true, - meta: {} + meta: {}, + syntheticNamedExports: false }, { ast: { @@ -340,7 +344,8 @@ module.exports = { importers: [], isEntry: false, isExternal: false, - meta: {} + meta: {}, + syntheticNamedExports: false } ] ); diff --git a/test/function/samples/synthetic-named-exports/non-default-export/_config.js b/test/function/samples/synthetic-named-exports/non-default-export/_config.js index 542cebf33bf..c29db5a5bc4 100644 --- a/test/function/samples/synthetic-named-exports/non-default-export/_config.js +++ b/test/function/samples/synthetic-named-exports/non-default-export/_config.js @@ -9,6 +9,11 @@ module.exports = { if (id.endsWith('dep.js')) { return { code, syntheticNamedExports: '__synthetic' }; } + }, + moduleParsed({id, syntheticNamedExports}) { + if (id.endsWith('dep.js')) { + assert.strictEqual(syntheticNamedExports, '__synthetic'); + } } } ] From 6d8acef961143e6805dd33fb914673aa3de7f704 Mon Sep 17 00:00:00 2001 From: Ivan Plesskih Date: Fri, 30 Oct 2020 19:48:47 +0500 Subject: [PATCH 3/5] Use getter --- src/Module.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Module.ts b/src/Module.ts index 438357be22a..15084259b3a 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -285,7 +285,10 @@ export default class Module { isEntry, isExternal: false, meta, - syntheticNamedExports + get syntheticNamedExports() { + //since it's public and not readonly, we should use getter to ensure value is always actual + return module.syntheticNamedExports; + } }; } @@ -805,7 +808,6 @@ export default class Module { } if (syntheticNamedExports != null) { this.syntheticNamedExports = syntheticNamedExports; - this.info.syntheticNamedExports = syntheticNamedExports; } if (meta != null) { this.info.meta = { ...this.info.meta, ...meta }; From 4d45a91ebe1c44f2e33fcae75da9ffb4adfc28b5 Mon Sep 17 00:00:00 2001 From: Ivan Plesskih Date: Fri, 30 Oct 2020 19:49:21 +0500 Subject: [PATCH 4/5] Added test for default synthetic export --- .../synthetic-named-exports/dynamic-import/_config.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/function/samples/synthetic-named-exports/dynamic-import/_config.js b/test/function/samples/synthetic-named-exports/dynamic-import/_config.js index 3c20cf5b7b5..596205484f9 100644 --- a/test/function/samples/synthetic-named-exports/dynamic-import/_config.js +++ b/test/function/samples/synthetic-named-exports/dynamic-import/_config.js @@ -9,6 +9,11 @@ module.exports = { if (id.endsWith('dep.js')) { return { code, syntheticNamedExports: true }; } + }, + moduleParsed({id, syntheticNamedExports}) { + if (id.endsWith('dep.js')) { + assert.strictEqual(syntheticNamedExports, true); + } } } ] From e60bb7b64a3a6171fab58341c824fe6e8c16a2e8 Mon Sep 17 00:00:00 2001 From: Amareis Date: Sat, 31 Oct 2020 16:29:32 +0500 Subject: [PATCH 5/5] Moved syntheticNamedExports to ModuleInfo entirely --- src/Chunk.ts | 4 ++-- src/Module.ts | 32 +++++++++++++------------- src/ast/variables/NamespaceVariable.ts | 2 +- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Chunk.ts b/src/Chunk.ts index 4c0b29ed52e..299fcf4d0ab 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -241,7 +241,7 @@ export default class Chunk { if (!chunkModules.has(importer)) { this.dynamicEntryModules.push(module); // Modules with synthetic exports need an artificial namespace for dynamic imports - if (module.syntheticNamedExports && !outputOptions.preserveModules) { + if (module.info.syntheticNamedExports && !outputOptions.preserveModules) { includedNamespaces.add(module); this.exports.add(module.namespace); } @@ -379,7 +379,7 @@ export default class Chunk { } } for (const module of this.dynamicEntryModules) { - if (module.syntheticNamedExports) continue; + if (module.info.syntheticNamedExports) continue; if (!this.facadeModule && this.canModuleBeFacade(module, exposedVariables)) { this.facadeModule = module; this.facadeChunkByModule.set(module, this); diff --git a/src/Module.ts b/src/Module.ts index 15084259b3a..8510b24920d 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -246,7 +246,7 @@ export default class Module { private readonly options: NormalizedInputOptions, isEntry: boolean, hasModuleSideEffects: boolean | 'no-treeshake', - public syntheticNamedExports: boolean | string, + syntheticNamedExports: boolean | string, meta: CustomPluginOptions ) { this.excludeFromSourcemap = /\0/.test(id); @@ -285,10 +285,7 @@ export default class Module { isEntry, isExternal: false, meta, - get syntheticNamedExports() { - //since it's public and not readonly, we should use getter to ensure value is always actual - return module.syntheticNamedExports; - } + syntheticNamedExports }; } @@ -396,7 +393,7 @@ export default class Module { } const exportNamesByVariable: Map = new Map(); for (const exportName of this.getAllExportNames()) { - if (exportName === this.syntheticNamedExports) continue; + if (exportName === this.info.syntheticNamedExports) continue; let tracedVariable = this.getVariableForExportName(exportName); if (tracedVariable instanceof ExportDefaultVariable) { tracedVariable = tracedVariable.getOriginalVariable(); @@ -459,7 +456,9 @@ export default class Module { if (this.syntheticNamespace === null) { this.syntheticNamespace = undefined; this.syntheticNamespace = this.getVariableForExportName( - typeof this.syntheticNamedExports === 'string' ? this.syntheticNamedExports : 'default' + typeof this.info.syntheticNamedExports === 'string' + ? this.info.syntheticNamedExports + : 'default' ); } if (!this.syntheticNamespace) { @@ -469,10 +468,11 @@ export default class Module { message: `Module "${relativeId( this.id )}" that is marked with 'syntheticNamedExports: ${JSON.stringify( - this.syntheticNamedExports + this.info.syntheticNamedExports )}' needs ${ - typeof this.syntheticNamedExports === 'string' && this.syntheticNamedExports !== 'default' - ? `an export named "${this.syntheticNamedExports}"` + typeof this.info.syntheticNamedExports === 'string' && + this.info.syntheticNamedExports !== 'default' + ? `an export named "${this.info.syntheticNamedExports}"` : 'a default export' }.` }); @@ -542,7 +542,7 @@ export default class Module { // we don't want to create shims when we are just // probing export * modules for exports if (!isExportAllSearch) { - if (this.syntheticNamedExports) { + if (this.info.syntheticNamedExports) { let syntheticExport = this.syntheticExports.get(name); if (!syntheticExport) { const syntheticNamespace = this.getSyntheticNamespace(); @@ -584,7 +584,7 @@ export default class Module { } for (const exportName of this.getExports()) { - if (includeNamespaceMembers || exportName !== this.syntheticNamedExports) { + if (includeNamespaceMembers || exportName !== this.info.syntheticNamedExports) { const variable = this.getVariableForExportName(exportName); variable.deoptimizePath(UNKNOWN_PATH); if (!variable.included) { @@ -740,7 +740,7 @@ export default class Module { }; this.scope = new ModuleScope(this.graph.scope, this.astContext); - this.namespace = new NamespaceVariable(this.astContext, this.syntheticNamedExports); + this.namespace = new NamespaceVariable(this.astContext, this.info.syntheticNamedExports); this.ast = new Program(ast, { type: 'Module', context: this.astContext }, this.scope); this.info.ast = ast; @@ -761,7 +761,7 @@ export default class Module { originalSourcemap: this.originalSourcemap, resolvedIds: this.resolvedIds, sourcemapChain: this.sourcemapChain, - syntheticNamedExports: this.syntheticNamedExports, + syntheticNamedExports: this.info.syntheticNamedExports, transformDependencies: this.transformDependencies, transformFiles: this.transformFiles }; @@ -807,7 +807,7 @@ export default class Module { this.info.hasModuleSideEffects = moduleSideEffects; } if (syntheticNamedExports != null) { - this.syntheticNamedExports = syntheticNamedExports; + this.info.syntheticNamedExports = syntheticNamedExports; } if (meta != null) { this.info.meta = { ...this.info.meta, ...meta }; @@ -968,7 +968,7 @@ export default class Module { externalVariable.include(); this.imports.add(externalVariable); mergedNamespaces.push(externalVariable); - } else if (module.syntheticNamedExports) { + } else if (module.info.syntheticNamedExports) { const syntheticNamespace = module.getSyntheticNamespace(); syntheticNamespace.include(); this.imports.add(syntheticNamespace); diff --git a/src/ast/variables/NamespaceVariable.ts b/src/ast/variables/NamespaceVariable.ts index 98690863f3b..5312518e013 100644 --- a/src/ast/variables/NamespaceVariable.ts +++ b/src/ast/variables/NamespaceVariable.ts @@ -46,7 +46,7 @@ export default class NamespaceVariable extends Variable { } const memberVariables = Object.create(null); for (const name of this.context.getExports().concat(this.context.getReexports())) { - if (name[0] !== '*' && name !== this.module.syntheticNamedExports) { + if (name[0] !== '*' && name !== this.module.info.syntheticNamedExports) { memberVariables[name] = this.context.traceExport(name); } }