| | "use strict"; |
| |
|
| | Object.defineProperty(exports, "__esModule", { |
| | value: true |
| | }); |
| | Object.defineProperty(exports, "buildDynamicImport", { |
| | enumerable: true, |
| | get: function () { |
| | return _dynamicImport.buildDynamicImport; |
| | } |
| | }); |
| | exports.buildNamespaceInitStatements = buildNamespaceInitStatements; |
| | exports.ensureStatementsHoisted = ensureStatementsHoisted; |
| | Object.defineProperty(exports, "getModuleName", { |
| | enumerable: true, |
| | get: function () { |
| | return _getModuleName.default; |
| | } |
| | }); |
| | Object.defineProperty(exports, "hasExports", { |
| | enumerable: true, |
| | get: function () { |
| | return _normalizeAndLoadMetadata.hasExports; |
| | } |
| | }); |
| | Object.defineProperty(exports, "isModule", { |
| | enumerable: true, |
| | get: function () { |
| | return _helperModuleImports.isModule; |
| | } |
| | }); |
| | Object.defineProperty(exports, "isSideEffectImport", { |
| | enumerable: true, |
| | get: function () { |
| | return _normalizeAndLoadMetadata.isSideEffectImport; |
| | } |
| | }); |
| | exports.rewriteModuleStatementsAndPrepareHeader = rewriteModuleStatementsAndPrepareHeader; |
| | Object.defineProperty(exports, "rewriteThis", { |
| | enumerable: true, |
| | get: function () { |
| | return _rewriteThis.default; |
| | } |
| | }); |
| | exports.wrapInterop = wrapInterop; |
| | var _assert = require("assert"); |
| | var _core = require("@babel/core"); |
| | var _helperModuleImports = require("@babel/helper-module-imports"); |
| | var _rewriteThis = require("./rewrite-this.js"); |
| | var _rewriteLiveReferences = require("./rewrite-live-references.js"); |
| | var _normalizeAndLoadMetadata = require("./normalize-and-load-metadata.js"); |
| | var Lazy = require("./lazy-modules.js"); |
| | var _dynamicImport = require("./dynamic-import.js"); |
| | var _getModuleName = require("./get-module-name.js"); |
| | { |
| | exports.getDynamicImportSource = require("./dynamic-import").getDynamicImportSource; |
| | } |
| | function rewriteModuleStatementsAndPrepareHeader(path, { |
| | exportName, |
| | strict, |
| | allowTopLevelThis, |
| | strictMode, |
| | noInterop, |
| | importInterop = noInterop ? "none" : "babel", |
| | lazy, |
| | getWrapperPayload = Lazy.toGetWrapperPayload(lazy != null ? lazy : false), |
| | wrapReference = Lazy.wrapReference, |
| | esNamespaceOnly, |
| | filename, |
| | constantReexports = arguments[1].loose, |
| | enumerableModuleMeta = arguments[1].loose, |
| | noIncompleteNsImportDetection |
| | }) { |
| | (0, _normalizeAndLoadMetadata.validateImportInteropOption)(importInterop); |
| | _assert((0, _helperModuleImports.isModule)(path), "Cannot process module statements in a script"); |
| | path.node.sourceType = "script"; |
| | const meta = (0, _normalizeAndLoadMetadata.default)(path, exportName, { |
| | importInterop, |
| | initializeReexports: constantReexports, |
| | getWrapperPayload, |
| | esNamespaceOnly, |
| | filename |
| | }); |
| | if (!allowTopLevelThis) { |
| | (0, _rewriteThis.default)(path); |
| | } |
| | (0, _rewriteLiveReferences.default)(path, meta, wrapReference); |
| | if (strictMode !== false) { |
| | const hasStrict = path.node.directives.some(directive => { |
| | return directive.value.value === "use strict"; |
| | }); |
| | if (!hasStrict) { |
| | path.unshiftContainer("directives", _core.types.directive(_core.types.directiveLiteral("use strict"))); |
| | } |
| | } |
| | const headers = []; |
| | if ((0, _normalizeAndLoadMetadata.hasExports)(meta) && !strict) { |
| | headers.push(buildESModuleHeader(meta, enumerableModuleMeta)); |
| | } |
| | const nameList = buildExportNameListDeclaration(path, meta); |
| | if (nameList) { |
| | meta.exportNameListName = nameList.name; |
| | headers.push(nameList.statement); |
| | } |
| | headers.push(...buildExportInitializationStatements(path, meta, wrapReference, constantReexports, noIncompleteNsImportDetection)); |
| | return { |
| | meta, |
| | headers |
| | }; |
| | } |
| | function ensureStatementsHoisted(statements) { |
| | statements.forEach(header => { |
| | header._blockHoist = 3; |
| | }); |
| | } |
| | function wrapInterop(programPath, expr, type) { |
| | if (type === "none") { |
| | return null; |
| | } |
| | if (type === "node-namespace") { |
| | return _core.types.callExpression(programPath.hub.addHelper("interopRequireWildcard"), [expr, _core.types.booleanLiteral(true)]); |
| | } else if (type === "node-default") { |
| | return null; |
| | } |
| | let helper; |
| | if (type === "default") { |
| | helper = "interopRequireDefault"; |
| | } else if (type === "namespace") { |
| | helper = "interopRequireWildcard"; |
| | } else { |
| | throw new Error(`Unknown interop: ${type}`); |
| | } |
| | return _core.types.callExpression(programPath.hub.addHelper(helper), [expr]); |
| | } |
| | function buildNamespaceInitStatements(metadata, sourceMetadata, constantReexports = false, wrapReference = Lazy.wrapReference) { |
| | var _wrapReference; |
| | const statements = []; |
| | const srcNamespaceId = _core.types.identifier(sourceMetadata.name); |
| | for (const localName of sourceMetadata.importsNamespace) { |
| | if (localName === sourceMetadata.name) continue; |
| | statements.push(_core.template.statement`var NAME = SOURCE;`({ |
| | NAME: localName, |
| | SOURCE: _core.types.cloneNode(srcNamespaceId) |
| | })); |
| | } |
| | const srcNamespace = (_wrapReference = wrapReference(srcNamespaceId, sourceMetadata.wrap)) != null ? _wrapReference : srcNamespaceId; |
| | if (constantReexports) { |
| | statements.push(...buildReexportsFromMeta(metadata, sourceMetadata, true, wrapReference)); |
| | } |
| | for (const exportName of sourceMetadata.reexportNamespace) { |
| | statements.push((!_core.types.isIdentifier(srcNamespace) ? _core.template.statement` |
| | Object.defineProperty(EXPORTS, "NAME", { |
| | enumerable: true, |
| | get: function() { |
| | return NAMESPACE; |
| | } |
| | }); |
| | ` : _core.template.statement`EXPORTS.NAME = NAMESPACE;`)({ |
| | EXPORTS: metadata.exportName, |
| | NAME: exportName, |
| | NAMESPACE: _core.types.cloneNode(srcNamespace) |
| | })); |
| | } |
| | if (sourceMetadata.reexportAll) { |
| | const statement = buildNamespaceReexport(metadata, _core.types.cloneNode(srcNamespace), constantReexports); |
| | statement.loc = sourceMetadata.reexportAll.loc; |
| | statements.push(statement); |
| | } |
| | return statements; |
| | } |
| | const ReexportTemplate = { |
| | constant: ({ |
| | exports, |
| | exportName, |
| | namespaceImport |
| | }) => _core.template.statement.ast` |
| | ${exports}.${exportName} = ${namespaceImport}; |
| | `, |
| | constantComputed: ({ |
| | exports, |
| | exportName, |
| | namespaceImport |
| | }) => _core.template.statement.ast` |
| | ${exports}["${exportName}"] = ${namespaceImport}; |
| | `, |
| | spec: ({ |
| | exports, |
| | exportName, |
| | namespaceImport |
| | }) => _core.template.statement.ast` |
| | Object.defineProperty(${exports}, "${exportName}", { |
| | enumerable: true, |
| | get: function() { |
| | return ${namespaceImport}; |
| | }, |
| | }); |
| | ` |
| | }; |
| | function buildReexportsFromMeta(meta, metadata, constantReexports, wrapReference) { |
| | var _wrapReference2; |
| | let namespace = _core.types.identifier(metadata.name); |
| | namespace = (_wrapReference2 = wrapReference(namespace, metadata.wrap)) != null ? _wrapReference2 : namespace; |
| | const { |
| | stringSpecifiers |
| | } = meta; |
| | return Array.from(metadata.reexports, ([exportName, importName]) => { |
| | let namespaceImport = _core.types.cloneNode(namespace); |
| | if (importName === "default" && metadata.interop === "node-default") {} else if (stringSpecifiers.has(importName)) { |
| | namespaceImport = _core.types.memberExpression(namespaceImport, _core.types.stringLiteral(importName), true); |
| | } else { |
| | namespaceImport = _core.types.memberExpression(namespaceImport, _core.types.identifier(importName)); |
| | } |
| | const astNodes = { |
| | exports: meta.exportName, |
| | exportName, |
| | namespaceImport |
| | }; |
| | if (constantReexports || _core.types.isIdentifier(namespaceImport)) { |
| | if (stringSpecifiers.has(exportName)) { |
| | return ReexportTemplate.constantComputed(astNodes); |
| | } else { |
| | return ReexportTemplate.constant(astNodes); |
| | } |
| | } else { |
| | return ReexportTemplate.spec(astNodes); |
| | } |
| | }); |
| | } |
| | function buildESModuleHeader(metadata, enumerableModuleMeta = false) { |
| | return (enumerableModuleMeta ? _core.template.statement` |
| | EXPORTS.__esModule = true; |
| | ` : _core.template.statement` |
| | Object.defineProperty(EXPORTS, "__esModule", { |
| | value: true, |
| | }); |
| | `)({ |
| | EXPORTS: metadata.exportName |
| | }); |
| | } |
| | function buildNamespaceReexport(metadata, namespace, constantReexports) { |
| | return (constantReexports ? _core.template.statement` |
| | Object.keys(NAMESPACE).forEach(function(key) { |
| | if (key === "default" || key === "__esModule") return; |
| | VERIFY_NAME_LIST; |
| | if (key in EXPORTS && EXPORTS[key] === NAMESPACE[key]) return; |
| | |
| | EXPORTS[key] = NAMESPACE[key]; |
| | }); |
| | ` : _core.template.statement` |
| | Object.keys(NAMESPACE).forEach(function(key) { |
| | if (key === "default" || key === "__esModule") return; |
| | VERIFY_NAME_LIST; |
| | if (key in EXPORTS && EXPORTS[key] === NAMESPACE[key]) return; |
| | |
| | Object.defineProperty(EXPORTS, key, { |
| | enumerable: true, |
| | get: function() { |
| | return NAMESPACE[key]; |
| | }, |
| | }); |
| | }); |
| | `)({ |
| | NAMESPACE: namespace, |
| | EXPORTS: metadata.exportName, |
| | VERIFY_NAME_LIST: metadata.exportNameListName ? (0, _core.template)` |
| | if (Object.prototype.hasOwnProperty.call(EXPORTS_LIST, key)) return; |
| | `({ |
| | EXPORTS_LIST: metadata.exportNameListName |
| | }) : null |
| | }); |
| | } |
| | function buildExportNameListDeclaration(programPath, metadata) { |
| | const exportedVars = Object.create(null); |
| | for (const data of metadata.local.values()) { |
| | for (const name of data.names) { |
| | exportedVars[name] = true; |
| | } |
| | } |
| | let hasReexport = false; |
| | for (const data of metadata.source.values()) { |
| | for (const exportName of data.reexports.keys()) { |
| | exportedVars[exportName] = true; |
| | } |
| | for (const exportName of data.reexportNamespace) { |
| | exportedVars[exportName] = true; |
| | } |
| | hasReexport = hasReexport || !!data.reexportAll; |
| | } |
| | if (!hasReexport || Object.keys(exportedVars).length === 0) return null; |
| | const name = programPath.scope.generateUidIdentifier("exportNames"); |
| | delete exportedVars.default; |
| | return { |
| | name: name.name, |
| | statement: _core.types.variableDeclaration("var", [_core.types.variableDeclarator(name, _core.types.valueToNode(exportedVars))]) |
| | }; |
| | } |
| | function buildExportInitializationStatements(programPath, metadata, wrapReference, constantReexports = false, noIncompleteNsImportDetection = false) { |
| | const initStatements = []; |
| | for (const [localName, data] of metadata.local) { |
| | if (data.kind === "import") {} else if (data.kind === "hoisted") { |
| | initStatements.push([data.names[0], buildInitStatement(metadata, data.names, _core.types.identifier(localName))]); |
| | } else if (!noIncompleteNsImportDetection) { |
| | for (const exportName of data.names) { |
| | initStatements.push([exportName, null]); |
| | } |
| | } |
| | } |
| | for (const data of metadata.source.values()) { |
| | if (!constantReexports) { |
| | const reexportsStatements = buildReexportsFromMeta(metadata, data, false, wrapReference); |
| | const reexports = [...data.reexports.keys()]; |
| | for (let i = 0; i < reexportsStatements.length; i++) { |
| | initStatements.push([reexports[i], reexportsStatements[i]]); |
| | } |
| | } |
| | if (!noIncompleteNsImportDetection) { |
| | for (const exportName of data.reexportNamespace) { |
| | initStatements.push([exportName, null]); |
| | } |
| | } |
| | } |
| | initStatements.sort(([a], [b]) => { |
| | if (a < b) return -1; |
| | if (b < a) return 1; |
| | return 0; |
| | }); |
| | const results = []; |
| | if (noIncompleteNsImportDetection) { |
| | for (const [, initStatement] of initStatements) { |
| | results.push(initStatement); |
| | } |
| | } else { |
| | const chunkSize = 100; |
| | for (let i = 0; i < initStatements.length; i += chunkSize) { |
| | let uninitializedExportNames = []; |
| | for (let j = 0; j < chunkSize && i + j < initStatements.length; j++) { |
| | const [exportName, initStatement] = initStatements[i + j]; |
| | if (initStatement !== null) { |
| | if (uninitializedExportNames.length > 0) { |
| | results.push(buildInitStatement(metadata, uninitializedExportNames, programPath.scope.buildUndefinedNode())); |
| | uninitializedExportNames = []; |
| | } |
| | results.push(initStatement); |
| | } else { |
| | uninitializedExportNames.push(exportName); |
| | } |
| | } |
| | if (uninitializedExportNames.length > 0) { |
| | results.push(buildInitStatement(metadata, uninitializedExportNames, programPath.scope.buildUndefinedNode())); |
| | } |
| | } |
| | } |
| | return results; |
| | } |
| | const InitTemplate = { |
| | computed: ({ |
| | exports, |
| | name, |
| | value |
| | }) => _core.template.expression.ast`${exports}["${name}"] = ${value}`, |
| | default: ({ |
| | exports, |
| | name, |
| | value |
| | }) => _core.template.expression.ast`${exports}.${name} = ${value}`, |
| | define: ({ |
| | exports, |
| | name, |
| | value |
| | }) => _core.template.expression.ast` |
| | Object.defineProperty(${exports}, "${name}", { |
| | enumerable: true, |
| | value: void 0, |
| | writable: true |
| | })["${name}"] = ${value}` |
| | }; |
| | function buildInitStatement(metadata, exportNames, initExpr) { |
| | const { |
| | stringSpecifiers, |
| | exportName: exports |
| | } = metadata; |
| | return _core.types.expressionStatement(exportNames.reduce((value, name) => { |
| | const params = { |
| | exports, |
| | name, |
| | value |
| | }; |
| | if (name === "__proto__") { |
| | return InitTemplate.define(params); |
| | } |
| | if (stringSpecifiers.has(name)) { |
| | return InitTemplate.computed(params); |
| | } |
| | return InitTemplate.default(params); |
| | }, initExpr)); |
| | } |
| |
|
| | |
| |
|