diff --git a/src/ast/nodes/AssignmentExpression.ts b/src/ast/nodes/AssignmentExpression.ts index 3d7bfa21e2c..32dba815c7d 100644 --- a/src/ast/nodes/AssignmentExpression.ts +++ b/src/ast/nodes/AssignmentExpression.ts @@ -1,7 +1,9 @@ import MagicString from 'magic-string'; import { RenderOptions } from '../../utils/renderHelpers'; +import { getSystemExportStatement } from '../../utils/systemJsRendering'; import { ExecutionPathOptions } from '../ExecutionPathOptions'; import { EMPTY_PATH, ObjectPath, UNKNOWN_PATH } from '../values'; +import Variable from '../variables/Variable'; import * as NodeType from './NodeType'; import { ExpressionNode, NodeBase } from './shared/Node'; import { PatternNode } from './shared/Pattern'; @@ -47,12 +49,24 @@ export default class AssignmentExpression extends NodeBase { render(code: MagicString, options: RenderOptions) { this.left.render(code, options); this.right.render(code, options); - if (options.format === 'system' && this.left.variable && this.left.variable.exportName) { - code.prependLeft( - code.original.indexOf('=', this.left.end) + 1, - ` exports('${this.left.variable.exportName}',` - ); - code.appendLeft(this.right.end, `)`); + if (options.format === 'system') { + if (this.left.variable && this.left.variable.exportName) { + code.prependLeft( + code.original.indexOf('=', this.left.end) + 1, + ` exports('${this.left.variable.exportName}',` + ); + code.appendLeft(this.right.end, `)`); + } else if ('addExportedVariables' in this.left) { + const systemPatternExports: Variable[] = []; + this.left.addExportedVariables(systemPatternExports); + if (systemPatternExports.length > 0) { + code.prependRight( + this.start, + `function (v) {${getSystemExportStatement(systemPatternExports)} return v;} (` + ); + code.appendLeft(this.end, ')'); + } + } } } } diff --git a/src/ast/nodes/VariableDeclaration.ts b/src/ast/nodes/VariableDeclaration.ts index 6667bb9a6b7..837f6b03a9f 100644 --- a/src/ast/nodes/VariableDeclaration.ts +++ b/src/ast/nodes/VariableDeclaration.ts @@ -5,6 +5,7 @@ import { NodeRenderOptions, RenderOptions } from '../../utils/renderHelpers'; +import { getSystemExportStatement } from '../../utils/systemJsRendering'; import { ExecutionPathOptions } from '../ExecutionPathOptions'; import { EMPTY_PATH, ObjectPath } from '../values'; import Variable from '../variables/Variable'; @@ -38,27 +39,6 @@ function areAllDeclarationsIncludedAndNotExported(declarations: VariableDeclarat return true; } -function renderSystemExports( - code: MagicString, - systemPatternExports: Variable[], - appendPosition: number -) { - if (systemPatternExports.length === 1) { - code.appendRight( - appendPosition, - ` exports('${systemPatternExports[0].safeExportName || - systemPatternExports[0].exportName}', ${systemPatternExports[0].getName()});` - ); - } else { - code.appendRight( - appendPosition, - ` exports({${systemPatternExports - .map(variable => `${variable.safeExportName || variable.exportName}: ${variable.getName()}`) - .join(', ')}});` - ); - } -} - export default class VariableDeclaration extends NodeBase { type: NodeType.tVariableDeclaration; declarations: VariableDeclarator[]; @@ -238,7 +218,7 @@ export default class VariableDeclaration extends NodeBase { code.appendLeft(renderedContentEnd, separatorString); } if (systemPatternExports.length > 0) { - renderSystemExports(code, systemPatternExports, renderedContentEnd); + code.appendLeft(renderedContentEnd, ' ' + getSystemExportStatement(systemPatternExports)); } } } diff --git a/src/rollup/types.d.ts b/src/rollup/types.d.ts index bf0d0be823a..409ce2b4387 100644 --- a/src/rollup/types.d.ts +++ b/src/rollup/types.d.ts @@ -237,7 +237,6 @@ export interface InputOptions { moduleContext?: string | ((id: string) => string) | { [id: string]: string }; watch?: WatcherOptions; experimentalCodeSplitting?: boolean; - experimentalDynamicImport?: boolean; experimentalTopLevelAwait?: boolean; inlineDynamicImports?: boolean; preserveSymlinks?: boolean; diff --git a/src/utils/systemJsRendering.ts b/src/utils/systemJsRendering.ts new file mode 100644 index 00000000000..15a3ade830f --- /dev/null +++ b/src/utils/systemJsRendering.ts @@ -0,0 +1,12 @@ +import Variable from '../ast/variables/Variable'; + +export function getSystemExportStatement(exportedVariables: Variable[]): string { + if (exportedVariables.length === 1) { + return `exports('${exportedVariables[0].safeExportName || + exportedVariables[0].exportName}', ${exportedVariables[0].getName()});`; + } else { + return `exports({${exportedVariables + .map(variable => `${variable.safeExportName || variable.exportName}: ${variable.getName()}`) + .join(', ')}});`; + } +} diff --git a/test/form/samples/system-export-destructuring-assignment/_config.js b/test/form/samples/system-export-destructuring-assignment/_config.js index 2cabb52ce30..82ec35dd48d 100644 --- a/test/form/samples/system-export-destructuring-assignment/_config.js +++ b/test/form/samples/system-export-destructuring-assignment/_config.js @@ -1,5 +1,5 @@ module.exports = { - description: 'Supports destructuring declarations and assignments for SystemJS', + description: 'supports destructuring assignments of exports for systemJS', options: { output: { format: 'system' diff --git a/test/form/samples/system-export-destructuring-assignment/_expected.js b/test/form/samples/system-export-destructuring-assignment/_expected.js index 32d922fd76f..d4efb012846 100644 --- a/test/form/samples/system-export-destructuring-assignment/_expected.js +++ b/test/form/samples/system-export-destructuring-assignment/_expected.js @@ -3,12 +3,16 @@ System.register([], function (exports, module) { return { execute: function () { - const {a = 1, ...b} = global1, c = exports('c', global2), {d} = global3; exports({a: a, b: b, d: d}); - const [e, ...f] = global4; exports({e: e, f: f}); - const {g, x: h = 2, y: {z: i}, a: [j ,k,, l]} = global5; exports({g: g, h: h, i: i, j: j, k: k, l: l}); + exports({ + a: void 0, + b: void 0, + c: void 0 + }); - var m = exports('m', 1); - var {m} = global6; exports('m', m); + let a, b, c; + + console.log(function (v) {exports('a', a); return v;} ({a} = someObject)); + (function (v) {exports({b: b, c: c}); return v;} ({b, c} = someObject)); } }; diff --git a/test/form/samples/system-export-destructuring-assignment/main.js b/test/form/samples/system-export-destructuring-assignment/main.js index aacc41461f2..5f3831cdff7 100644 --- a/test/form/samples/system-export-destructuring-assignment/main.js +++ b/test/form/samples/system-export-destructuring-assignment/main.js @@ -1,6 +1,4 @@ -export const {a = 1, ...b} = global1, c = global2, {d} = global3; -export const [e, ...f] = global4; -export const {g, x: h = 2, y: {z: i}, a: [j ,k,, l]} = global5; +export let a, b, c; -export var m = 1; -var {m} = global6; +console.log({a} = someObject); +({b, c} = someObject); diff --git a/test/form/samples/system-export-destructuring-declaration/_config.js b/test/form/samples/system-export-destructuring-declaration/_config.js new file mode 100644 index 00000000000..db198f829d5 --- /dev/null +++ b/test/form/samples/system-export-destructuring-declaration/_config.js @@ -0,0 +1,8 @@ +module.exports = { + description: 'supports destructuring declarations for systemJS', + options: { + output: { + format: 'system' + } + } +}; diff --git a/test/form/samples/system-export-destructuring-declaration/_expected.js b/test/form/samples/system-export-destructuring-declaration/_expected.js new file mode 100644 index 00000000000..32d922fd76f --- /dev/null +++ b/test/form/samples/system-export-destructuring-declaration/_expected.js @@ -0,0 +1,15 @@ +System.register([], function (exports, module) { + 'use strict'; + return { + execute: function () { + + const {a = 1, ...b} = global1, c = exports('c', global2), {d} = global3; exports({a: a, b: b, d: d}); + const [e, ...f] = global4; exports({e: e, f: f}); + const {g, x: h = 2, y: {z: i}, a: [j ,k,, l]} = global5; exports({g: g, h: h, i: i, j: j, k: k, l: l}); + + var m = exports('m', 1); + var {m} = global6; exports('m', m); + + } + }; +}); diff --git a/test/form/samples/system-export-destructuring-declaration/main.js b/test/form/samples/system-export-destructuring-declaration/main.js new file mode 100644 index 00000000000..aacc41461f2 --- /dev/null +++ b/test/form/samples/system-export-destructuring-declaration/main.js @@ -0,0 +1,6 @@ +export const {a = 1, ...b} = global1, c = global2, {d} = global3; +export const [e, ...f] = global4; +export const {g, x: h = 2, y: {z: i}, a: [j ,k,, l]} = global5; + +export var m = 1; +var {m} = global6;