UNPKG

31 kBSource Map (JSON)View Raw
1{"version":3,"names":["assignmentExpression","callExpression","cloneNode","expressionStatement","getOuterBindingIdentifiers","identifier","isMemberExpression","isVariableDeclaration","jsxIdentifier","jsxMemberExpression","memberExpression","numericLiteral","sequenceExpression","stringLiteral","variableDeclaration","variableDeclarator","isInType","path","parent","type","parentPath","exportKind","isStatement","isExpression","rewriteLiveReferences","programPath","metadata","imported","Map","exported","requeueInParent","requeue","source","data","localName","importName","imports","set","importsNamespace","local","exportMeta","get","push","names","rewriteBindingInitVisitorState","scope","traverse","rewriteBindingInitVisitor","simplifyAccess","Set","Array","from","keys","rewriteReferencesVisitorState","seen","WeakSet","buildImportReference","identNode","meta","lazy","namespace","name","interop","computed","stringSpecifiers","has","rewriteReferencesVisitor","Scope","skip","ClassDeclaration","id","node","Error","exportNames","length","statement","buildBindingExportAssignmentExpression","_blockHoist","insertAfter","VariableDeclaration","Object","forEach","localExpr","exportsObjectName","exportName","currentScope","hasOwnBinding","rename","reduce","expr","buildImportThrow","template","expression","ast","ReferencedIdentifier","add","importData","buildCodeFrameError","localBinding","getBinding","rootBinding","ref","loc","isCallExpression","callee","isOptionalCallExpression","isTaggedTemplateExpression","tag","replaceWith","isJSXIdentifier","object","property","UpdateExpression","arg","update","isIdentifier","exportedNames","operator","prefix","generateDeclaredUidIdentifier","AssignmentExpression","exit","left","assert","assignment","right","ids","programScopeIds","filter","find","items","isExpressionStatement","programScope","didTransformExport","importConstViolationName","loopBodyScope","ensureBlock","bodyPath","newLoopId","generateUidIdentifierBasedOnNode","registerDeclaration","unshiftContainer"],"sources":["../src/rewrite-live-references.ts"],"sourcesContent":["import assert from \"assert\";\nimport {\n assignmentExpression,\n callExpression,\n cloneNode,\n expressionStatement,\n getOuterBindingIdentifiers,\n identifier,\n isMemberExpression,\n isVariableDeclaration,\n jsxIdentifier,\n jsxMemberExpression,\n memberExpression,\n numericLiteral,\n sequenceExpression,\n stringLiteral,\n variableDeclaration,\n variableDeclarator,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport template from \"@babel/template\";\nimport type { NodePath, Visitor, Scope } from \"@babel/traverse\";\nimport simplifyAccess from \"@babel/helper-simple-access\";\n\nimport type { ModuleMetadata } from \"./normalize-and-load-metadata\";\n\ninterface RewriteReferencesVisitorState {\n exported: Map<any, any>;\n metadata: ModuleMetadata;\n requeueInParent: (path: NodePath) => void;\n scope: Scope;\n imported: Map<any, any>;\n buildImportReference: (\n [source, importName, localName]: readonly [string, string, string],\n identNode: t.Identifier | t.CallExpression | t.JSXIdentifier,\n ) => any;\n seen: WeakSet<object>;\n}\n\ninterface RewriteBindingInitVisitorState {\n exported: Map<any, any>;\n metadata: ModuleMetadata;\n requeueInParent: (path: NodePath) => void;\n scope: Scope;\n}\n\nfunction isInType(path: NodePath) {\n do {\n switch (path.parent.type) {\n case \"TSTypeAnnotation\":\n case \"TSTypeAliasDeclaration\":\n case \"TSTypeReference\":\n case \"TypeAnnotation\":\n case \"TypeAlias\":\n return true;\n case \"ExportSpecifier\":\n return (\n (\n path.parentPath.parent as\n | t.ExportDefaultDeclaration\n | t.ExportNamedDeclaration\n ).exportKind === \"type\"\n );\n default:\n if (path.parentPath.isStatement() || path.parentPath.isExpression()) {\n return false;\n }\n }\n } while ((path = path.parentPath));\n}\n\nexport default function rewriteLiveReferences(\n programPath: NodePath<t.Program>,\n metadata: ModuleMetadata,\n) {\n const imported = new Map();\n const exported = new Map();\n const requeueInParent = (path: NodePath) => {\n // Manually re-queue `exports.default =` expressions so that the ES3\n // transform has an opportunity to convert them. Ideally this would\n // happen automatically from the replaceWith above. See #4140 for\n // more info.\n programPath.requeue(path);\n };\n\n for (const [source, data] of metadata.source) {\n for (const [localName, importName] of data.imports) {\n imported.set(localName, [source, importName, null]);\n }\n for (const localName of data.importsNamespace) {\n imported.set(localName, [source, null, localName]);\n }\n }\n\n for (const [local, data] of metadata.local) {\n let exportMeta = exported.get(local);\n if (!exportMeta) {\n exportMeta = [];\n exported.set(local, exportMeta);\n }\n\n exportMeta.push(...data.names);\n }\n\n // Rewrite initialization of bindings to update exports.\n const rewriteBindingInitVisitorState: RewriteBindingInitVisitorState = {\n metadata,\n requeueInParent,\n scope: programPath.scope,\n exported, // local name => exported name list\n };\n programPath.traverse(\n rewriteBindingInitVisitor,\n rewriteBindingInitVisitorState,\n );\n\n simplifyAccess(\n programPath,\n // NOTE(logan): The 'Array.from' calls are to make this code with in loose mode.\n new Set([...Array.from(imported.keys()), ...Array.from(exported.keys())]),\n false,\n );\n\n // Rewrite reads/writes from imports and exports to have the correct behavior.\n const rewriteReferencesVisitorState: RewriteReferencesVisitorState = {\n seen: new WeakSet(),\n metadata,\n requeueInParent,\n scope: programPath.scope,\n imported, // local / import\n exported, // local name => exported name list\n buildImportReference: ([source, importName, localName], identNode) => {\n const meta = metadata.source.get(source);\n\n if (localName) {\n if (meta.lazy) {\n identNode = callExpression(\n // @ts-expect-error Fixme: we should handle the case when identNode is a JSXIdentifier\n identNode,\n [],\n );\n }\n return identNode;\n }\n\n let namespace: t.Expression = identifier(meta.name);\n if (meta.lazy) namespace = callExpression(namespace, []);\n\n if (importName === \"default\" && meta.interop === \"node-default\") {\n return namespace;\n }\n\n const computed = metadata.stringSpecifiers.has(importName);\n\n return memberExpression(\n namespace,\n computed ? stringLiteral(importName) : identifier(importName),\n computed,\n );\n },\n };\n programPath.traverse(rewriteReferencesVisitor, rewriteReferencesVisitorState);\n}\n\n/**\n * A visitor to inject export update statements during binding initialization.\n */\nconst rewriteBindingInitVisitor: Visitor<RewriteBindingInitVisitorState> = {\n Scope(path) {\n path.skip();\n },\n ClassDeclaration(path) {\n const { requeueInParent, exported, metadata } = this;\n\n const { id } = path.node;\n if (!id) throw new Error(\"Expected class to have a name\");\n const localName = id.name;\n\n const exportNames = exported.get(localName) || [];\n if (exportNames.length > 0) {\n const statement = expressionStatement(\n buildBindingExportAssignmentExpression(\n metadata,\n exportNames,\n identifier(localName),\n path.scope,\n ),\n );\n // @ts-expect-error todo(flow->ts): avoid mutations\n statement._blockHoist = path.node._blockHoist;\n\n requeueInParent(path.insertAfter(statement)[0]);\n }\n },\n VariableDeclaration(path) {\n const { requeueInParent, exported, metadata } = this;\n\n Object.keys(path.getOuterBindingIdentifiers()).forEach(localName => {\n const exportNames = exported.get(localName) || [];\n\n if (exportNames.length > 0) {\n const statement = expressionStatement(\n buildBindingExportAssignmentExpression(\n metadata,\n exportNames,\n identifier(localName),\n path.scope,\n ),\n );\n // @ts-expect-error todo(flow->ts): avoid mutations\n statement._blockHoist = path.node._blockHoist;\n\n requeueInParent(path.insertAfter(statement)[0]);\n }\n });\n },\n};\n\nconst buildBindingExportAssignmentExpression = (\n metadata: ModuleMetadata,\n exportNames: string[],\n localExpr: t.Expression,\n scope: Scope,\n) => {\n const exportsObjectName = metadata.exportName;\n for (\n let currentScope = scope;\n currentScope != null;\n currentScope = currentScope.parent\n ) {\n if (currentScope.hasOwnBinding(exportsObjectName)) {\n currentScope.rename(exportsObjectName);\n }\n }\n return (exportNames || []).reduce((expr, exportName) => {\n // class Foo {} export { Foo, Foo as Bar };\n // as\n // class Foo {} exports.Foo = exports.Bar = Foo;\n const { stringSpecifiers } = metadata;\n const computed = stringSpecifiers.has(exportName);\n return assignmentExpression(\n \"=\",\n memberExpression(\n identifier(exportsObjectName),\n computed ? stringLiteral(exportName) : identifier(exportName),\n /* computed */ computed,\n ),\n expr,\n );\n }, localExpr);\n};\n\nconst buildImportThrow = (localName: string) => {\n return template.expression.ast`\n (function() {\n throw new Error('\"' + '${localName}' + '\" is read-only.');\n })()\n `;\n};\n\nconst rewriteReferencesVisitor: Visitor<RewriteReferencesVisitorState> = {\n ReferencedIdentifier(path) {\n const { seen, buildImportReference, scope, imported, requeueInParent } =\n this;\n if (seen.has(path.node)) return;\n seen.add(path.node);\n\n const localName = path.node.name;\n\n const importData = imported.get(localName);\n if (importData) {\n if (isInType(path)) {\n throw path.buildCodeFrameError(\n `Cannot transform the imported binding \"${localName}\" since it's also used in a type annotation. ` +\n `Please strip type annotations using @babel/preset-typescript or @babel/preset-flow.`,\n );\n }\n\n const localBinding = path.scope.getBinding(localName);\n const rootBinding = scope.getBinding(localName);\n\n // redeclared in this scope\n if (rootBinding !== localBinding) return;\n\n const ref = buildImportReference(importData, path.node);\n\n // Preserve the binding location so that sourcemaps are nicer.\n ref.loc = path.node.loc;\n\n if (\n (path.parentPath.isCallExpression({ callee: path.node }) ||\n path.parentPath.isOptionalCallExpression({ callee: path.node }) ||\n path.parentPath.isTaggedTemplateExpression({ tag: path.node })) &&\n isMemberExpression(ref)\n ) {\n path.replaceWith(sequenceExpression([numericLiteral(0), ref]));\n } else if (path.isJSXIdentifier() && isMemberExpression(ref)) {\n const { object, property } = ref;\n path.replaceWith(\n jsxMemberExpression(\n // @ts-expect-error todo(flow->ts): possible bug `object` might not have a name\n jsxIdentifier(object.name),\n // @ts-expect-error todo(flow->ts): possible bug `property` might not have a name\n jsxIdentifier(property.name),\n ),\n );\n } else {\n path.replaceWith(ref);\n }\n\n requeueInParent(path);\n\n // The path could have been replaced with an identifier that would\n // otherwise be re-visited, so we skip processing its children.\n path.skip();\n }\n },\n\n UpdateExpression(path) {\n const {\n scope,\n seen,\n imported,\n exported,\n requeueInParent,\n buildImportReference,\n } = this;\n\n if (seen.has(path.node)) return;\n\n seen.add(path.node);\n\n const arg = path.get(\"argument\");\n\n // No change needed\n if (arg.isMemberExpression()) return;\n\n const update = path.node;\n\n if (arg.isIdentifier()) {\n const localName = arg.node.name;\n\n // redeclared in this scope\n if (scope.getBinding(localName) !== path.scope.getBinding(localName)) {\n return;\n }\n\n const exportedNames = exported.get(localName);\n const importData = imported.get(localName);\n\n if (exportedNames?.length > 0 || importData) {\n if (importData) {\n path.replaceWith(\n assignmentExpression(\n update.operator[0] + \"=\",\n buildImportReference(importData, arg.node),\n buildImportThrow(localName),\n ),\n );\n } else if (update.prefix) {\n // ++foo\n // => exports.foo = ++foo\n path.replaceWith(\n buildBindingExportAssignmentExpression(\n this.metadata,\n exportedNames,\n cloneNode(update),\n path.scope,\n ),\n );\n } else {\n // foo++\n // => (ref = i++, exports.i = i, ref)\n const ref = scope.generateDeclaredUidIdentifier(localName);\n\n path.replaceWith(\n sequenceExpression([\n assignmentExpression(\"=\", cloneNode(ref), cloneNode(update)),\n buildBindingExportAssignmentExpression(\n this.metadata,\n exportedNames,\n identifier(localName),\n path.scope,\n ),\n cloneNode(ref),\n ]),\n );\n }\n }\n }\n\n requeueInParent(path);\n path.skip();\n },\n\n AssignmentExpression: {\n exit(path) {\n const {\n scope,\n seen,\n imported,\n exported,\n requeueInParent,\n buildImportReference,\n } = this;\n\n if (seen.has(path.node)) return;\n seen.add(path.node);\n\n const left = path.get(\"left\");\n\n // No change needed\n if (left.isMemberExpression()) return;\n\n if (left.isIdentifier()) {\n // Simple update-assign foo += 1; export { foo };\n // => exports.foo = (foo += 1);\n const localName = left.node.name;\n\n // redeclared in this scope\n if (scope.getBinding(localName) !== path.scope.getBinding(localName)) {\n return;\n }\n\n const exportedNames = exported.get(localName);\n const importData = imported.get(localName);\n if (exportedNames?.length > 0 || importData) {\n assert(path.node.operator === \"=\", \"Path was not simplified\");\n\n const assignment = path.node;\n\n if (importData) {\n assignment.left = buildImportReference(importData, left.node);\n\n assignment.right = sequenceExpression([\n assignment.right,\n buildImportThrow(localName),\n ]);\n }\n\n path.replaceWith(\n buildBindingExportAssignmentExpression(\n this.metadata,\n exportedNames,\n assignment,\n path.scope,\n ),\n );\n requeueInParent(path);\n }\n } else {\n const ids = left.getOuterBindingIdentifiers();\n const programScopeIds = Object.keys(ids).filter(\n localName =>\n scope.getBinding(localName) === path.scope.getBinding(localName),\n );\n const id = programScopeIds.find(localName => imported.has(localName));\n\n if (id) {\n path.node.right = sequenceExpression([\n path.node.right,\n buildImportThrow(id),\n ]);\n }\n\n // Complex ({a, b, c} = {}); export { a, c };\n // => ({a, b, c} = {}), (exports.a = a, exports.c = c);\n const items: t.Expression[] = [];\n programScopeIds.forEach(localName => {\n const exportedNames = exported.get(localName) || [];\n if (exportedNames.length > 0) {\n items.push(\n buildBindingExportAssignmentExpression(\n this.metadata,\n exportedNames,\n identifier(localName),\n path.scope,\n ),\n );\n }\n });\n\n if (items.length > 0) {\n let node: t.Node = sequenceExpression(items);\n if (path.parentPath.isExpressionStatement()) {\n node = expressionStatement(node);\n // @ts-expect-error todo(flow->ts): avoid mutations\n node._blockHoist = path.parentPath.node._blockHoist;\n }\n\n const statement = path.insertAfter(node)[0];\n requeueInParent(statement);\n }\n }\n },\n },\n \"ForOfStatement|ForInStatement\"(\n path: NodePath<t.ForOfStatement | t.ForInStatement>,\n ) {\n const { scope, node } = path;\n const { left } = node;\n const { exported, imported, scope: programScope } = this;\n\n if (!isVariableDeclaration(left)) {\n let didTransformExport = false,\n importConstViolationName;\n const loopBodyScope = path.get(\"body\").scope;\n for (const name of Object.keys(getOuterBindingIdentifiers(left))) {\n if (programScope.getBinding(name) === scope.getBinding(name)) {\n if (exported.has(name)) {\n didTransformExport = true;\n if (loopBodyScope.hasOwnBinding(name)) {\n loopBodyScope.rename(name);\n }\n }\n if (imported.has(name) && !importConstViolationName) {\n importConstViolationName = name;\n }\n }\n }\n if (!didTransformExport && !importConstViolationName) {\n return;\n }\n\n path.ensureBlock();\n const bodyPath = path.get(\"body\");\n\n const newLoopId = scope.generateUidIdentifierBasedOnNode(left);\n path\n .get(\"left\")\n .replaceWith(\n variableDeclaration(\"let\", [\n variableDeclarator(cloneNode(newLoopId)),\n ]),\n );\n scope.registerDeclaration(path.get(\"left\"));\n\n if (didTransformExport) {\n bodyPath.unshiftContainer(\n \"body\",\n expressionStatement(assignmentExpression(\"=\", left, newLoopId)),\n );\n }\n if (importConstViolationName) {\n bodyPath.unshiftContainer(\n \"body\",\n expressionStatement(buildImportThrow(importConstViolationName)),\n );\n }\n }\n },\n};\n"],"mappings":"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"}
\No newline at end of file