You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					393 lines
				
				12 KiB
			
		
		
			
		
	
	
					393 lines
				
				12 KiB
			| 
											3 years ago
										 | "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, "getDynamicImportSource", { | ||
|  |   enumerable: true, | ||
|  |   get: function () { | ||
|  |     return _dynamicImport.getDynamicImportSource; | ||
|  |   } | ||
|  | }); | ||
|  | 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 _t = require("@babel/types"); | ||
|  | var _template = require("@babel/template"); | ||
|  | var _helperModuleImports = require("@babel/helper-module-imports"); | ||
|  | var _rewriteThis = require("./rewrite-this"); | ||
|  | var _rewriteLiveReferences = require("./rewrite-live-references"); | ||
|  | var _normalizeAndLoadMetadata = require("./normalize-and-load-metadata"); | ||
|  | var _dynamicImport = require("./dynamic-import"); | ||
|  | var _getModuleName = require("./get-module-name"); | ||
|  | const { | ||
|  |   booleanLiteral, | ||
|  |   callExpression, | ||
|  |   cloneNode, | ||
|  |   directive, | ||
|  |   directiveLiteral, | ||
|  |   expressionStatement, | ||
|  |   identifier, | ||
|  |   isIdentifier, | ||
|  |   memberExpression, | ||
|  |   stringLiteral, | ||
|  |   valueToNode, | ||
|  |   variableDeclaration, | ||
|  |   variableDeclarator | ||
|  | } = _t; | ||
|  | function rewriteModuleStatementsAndPrepareHeader(path, { | ||
|  |   loose, | ||
|  |   exportName, | ||
|  |   strict, | ||
|  |   allowTopLevelThis, | ||
|  |   strictMode, | ||
|  |   noInterop, | ||
|  |   importInterop = noInterop ? "none" : "babel", | ||
|  |   lazy, | ||
|  |   esNamespaceOnly, | ||
|  |   filename, | ||
|  |   constantReexports = loose, | ||
|  |   enumerableModuleMeta = 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, | ||
|  |     lazy, | ||
|  |     esNamespaceOnly, | ||
|  |     filename | ||
|  |   }); | ||
|  |   if (!allowTopLevelThis) { | ||
|  |     (0, _rewriteThis.default)(path); | ||
|  |   } | ||
|  |   (0, _rewriteLiveReferences.default)(path, meta); | ||
|  |   if (strictMode !== false) { | ||
|  |     const hasStrict = path.node.directives.some(directive => { | ||
|  |       return directive.value.value === "use strict"; | ||
|  |     }); | ||
|  |     if (!hasStrict) { | ||
|  |       path.unshiftContainer("directives", directive(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, 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 callExpression(programPath.hub.addHelper("interopRequireWildcard"), [expr, 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 callExpression(programPath.hub.addHelper(helper), [expr]); | ||
|  | } | ||
|  | 
 | ||
|  | function buildNamespaceInitStatements(metadata, sourceMetadata, constantReexports = false) { | ||
|  |   const statements = []; | ||
|  |   let srcNamespace = identifier(sourceMetadata.name); | ||
|  |   if (sourceMetadata.lazy) srcNamespace = callExpression(srcNamespace, []); | ||
|  |   for (const localName of sourceMetadata.importsNamespace) { | ||
|  |     if (localName === sourceMetadata.name) continue; | ||
|  | 
 | ||
|  |     statements.push(_template.default.statement`var NAME = SOURCE;`({ | ||
|  |       NAME: localName, | ||
|  |       SOURCE: cloneNode(srcNamespace) | ||
|  |     })); | ||
|  |   } | ||
|  |   if (constantReexports) { | ||
|  |     statements.push(...buildReexportsFromMeta(metadata, sourceMetadata, true)); | ||
|  |   } | ||
|  |   for (const exportName of sourceMetadata.reexportNamespace) { | ||
|  |     statements.push((sourceMetadata.lazy ? _template.default.statement`
 | ||
|  |             Object.defineProperty(EXPORTS, "NAME", { | ||
|  |               enumerable: true, | ||
|  |               get: function() { | ||
|  |                 return NAMESPACE; | ||
|  |               } | ||
|  |             }); | ||
|  |           ` : _template.default.statement`EXPORTS.NAME = NAMESPACE;`)({
 | ||
|  |       EXPORTS: metadata.exportName, | ||
|  |       NAME: exportName, | ||
|  |       NAMESPACE: cloneNode(srcNamespace) | ||
|  |     })); | ||
|  |   } | ||
|  |   if (sourceMetadata.reexportAll) { | ||
|  |     const statement = buildNamespaceReexport(metadata, cloneNode(srcNamespace), constantReexports); | ||
|  |     statement.loc = sourceMetadata.reexportAll.loc; | ||
|  | 
 | ||
|  |     statements.push(statement); | ||
|  |   } | ||
|  |   return statements; | ||
|  | } | ||
|  | const ReexportTemplate = { | ||
|  |   constant: _template.default.statement`EXPORTS.EXPORT_NAME = NAMESPACE_IMPORT;`, | ||
|  |   constantComputed: _template.default.statement`EXPORTS["EXPORT_NAME"] = NAMESPACE_IMPORT;`, | ||
|  |   spec: _template.default.statement`
 | ||
|  |     Object.defineProperty(EXPORTS, "EXPORT_NAME", { | ||
|  |       enumerable: true, | ||
|  |       get: function() { | ||
|  |         return NAMESPACE_IMPORT; | ||
|  |       }, | ||
|  |     }); | ||
|  |     `
 | ||
|  | }; | ||
|  | function buildReexportsFromMeta(meta, metadata, constantReexports) { | ||
|  |   const namespace = metadata.lazy ? callExpression(identifier(metadata.name), []) : identifier(metadata.name); | ||
|  |   const { | ||
|  |     stringSpecifiers | ||
|  |   } = meta; | ||
|  |   return Array.from(metadata.reexports, ([exportName, importName]) => { | ||
|  |     let NAMESPACE_IMPORT = cloneNode(namespace); | ||
|  |     if (importName === "default" && metadata.interop === "node-default") { | ||
|  |     } else if (stringSpecifiers.has(importName)) { | ||
|  |       NAMESPACE_IMPORT = memberExpression(NAMESPACE_IMPORT, stringLiteral(importName), true); | ||
|  |     } else { | ||
|  |       NAMESPACE_IMPORT = memberExpression(NAMESPACE_IMPORT, identifier(importName)); | ||
|  |     } | ||
|  |     const astNodes = { | ||
|  |       EXPORTS: meta.exportName, | ||
|  |       EXPORT_NAME: exportName, | ||
|  |       NAMESPACE_IMPORT | ||
|  |     }; | ||
|  |     if (constantReexports || isIdentifier(NAMESPACE_IMPORT)) { | ||
|  |       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 ? _template.default.statement`
 | ||
|  |         EXPORTS.__esModule = true; | ||
|  |       ` : _template.default.statement` | ||
|  |         Object.defineProperty(EXPORTS, "__esModule", { | ||
|  |           value: true, | ||
|  |         }); | ||
|  |       `)({
 | ||
|  |     EXPORTS: metadata.exportName | ||
|  |   }); | ||
|  | } | ||
|  | 
 | ||
|  | function buildNamespaceReexport(metadata, namespace, constantReexports) { | ||
|  |   return (constantReexports ? _template.default.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]; | ||
|  |         }); | ||
|  |       ` :
 | ||
|  |   _template.default.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, _template.default)`
 | ||
|  |             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: variableDeclaration("var", [variableDeclarator(name, valueToNode(exportedVars))]) | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | function buildExportInitializationStatements(programPath, metadata, 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, 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); | ||
|  |       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: _template.default.expression`EXPORTS["NAME"] = VALUE`, | ||
|  |   default: _template.default.expression`EXPORTS.NAME = VALUE` | ||
|  | }; | ||
|  | function buildInitStatement(metadata, exportNames, initExpr) { | ||
|  |   const { | ||
|  |     stringSpecifiers, | ||
|  |     exportName: EXPORTS | ||
|  |   } = metadata; | ||
|  |   return expressionStatement(exportNames.reduce((acc, exportName) => { | ||
|  |     const params = { | ||
|  |       EXPORTS, | ||
|  |       NAME: exportName, | ||
|  |       VALUE: acc | ||
|  |     }; | ||
|  |     if (stringSpecifiers.has(exportName)) { | ||
|  |       return InitTemplate.computed(params); | ||
|  |     } else { | ||
|  |       return InitTemplate.default(params); | ||
|  |     } | ||
|  |   }, initExpr)); | ||
|  | } | ||
|  | 
 | ||
|  | //# sourceMappingURL=index.js.map
 |