@wyw-in-js/transform 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/esm/plugins/shaker.js +20 -8
  2. package/esm/plugins/shaker.js.map +1 -1
  3. package/esm/shaker.js +1 -1
  4. package/esm/shaker.js.map +1 -1
  5. package/esm/transform/generators/extract.js +4 -3
  6. package/esm/transform/generators/extract.js.map +1 -1
  7. package/esm/transform/generators/transform.js +1 -0
  8. package/esm/transform/generators/transform.js.map +1 -1
  9. package/esm/transform/helpers/loadWywOptions.js +1 -1
  10. package/esm/transform/helpers/loadWywOptions.js.map +1 -1
  11. package/esm/utils/collectExportsAndImports.js +14 -10
  12. package/esm/utils/collectExportsAndImports.js.map +1 -1
  13. package/esm/utils/scopeHelpers.js +13 -0
  14. package/esm/utils/scopeHelpers.js.map +1 -1
  15. package/lib/plugins/shaker.js +21 -9
  16. package/lib/plugins/shaker.js.map +1 -1
  17. package/lib/shaker.js +2 -1
  18. package/lib/shaker.js.map +1 -1
  19. package/lib/transform/generators/extract.js +3 -2
  20. package/lib/transform/generators/extract.js.map +1 -1
  21. package/lib/transform/generators/transform.js +1 -0
  22. package/lib/transform/generators/transform.js.map +1 -1
  23. package/lib/transform/helpers/loadWywOptions.js +3 -4
  24. package/lib/transform/helpers/loadWywOptions.js.map +1 -1
  25. package/lib/utils/collectExportsAndImports.js +14 -10
  26. package/lib/utils/collectExportsAndImports.js.map +1 -1
  27. package/lib/utils/scopeHelpers.js +13 -0
  28. package/lib/utils/scopeHelpers.js.map +1 -1
  29. package/package.json +7 -7
  30. package/types/plugins/shaker.js +23 -9
  31. package/types/shaker.d.ts +1 -1
  32. package/types/shaker.js +3 -1
  33. package/types/transform/generators/extract.js +2 -2
  34. package/types/transform/generators/transform.js +1 -0
  35. package/types/transform/helpers/loadWywOptions.js +3 -6
  36. package/types/utils/collectExportsAndImports.js +14 -10
  37. package/types/utils/scopeHelpers.js +13 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scopeHelpers.js","names":["NODE_FIELDS","findIdentifiers","nonType","getScope","isNotNull","isRemoved","validateField","node","key","val","field","validate","optional","getBinding","path","binding","name","undefined","reference","referencePath","force","isReferencedIdentifier","referencePaths","includes","referenced","push","references","length","isReferenced","kind","isFunctionExpression","parentPath","isVariableDeclarator","id","get","isIdentifier","idBinding","every","i","find","ancestor","isTSType","isFlowType","isReferencedConstantViolation","p","isAssignmentExpression","isExpressionStatement","dereference","isReference","referencesInConstantViolations","constantViolations","filter","isConstantViolation","nonTypeReferences","dereferenceAll","map","identifierPath","referenceAll","forEach","deletingNodes","WeakSet","isEmptyList","list","has","getPathFromAction","action","Array","isArray","Error","isPrototypeAssignment","left","type","object","property","canFunctionBeDelete","fnPath","fnScope","scope","parentScope","parent","listKey","findActionForNode","add","isProgram","isClassDeclaration","isClassExpression","body","isFunction","isBlockStatement","async","directives","generator","params","isConditionalExpression","alternate","isLogicalExpression","operator","value","right","isObjectProperty","maybeDefineProperty","isCallExpression","matchesPattern","isTemplateLiteral","isForInStatement","isFunctionDeclaration","isObjectMethod","isClassMethod","prevStatement","isIfStatement","isReturnStatement","slice","statement","isExportNamedDeclaration","declaration","isTryStatement","referenceEnums","program","traverse","ExpressionStatement","expressionStatement","expression","callee","args","arg","fixed","removeUnreferenced","items","Set","item","hasReferences","forDeleting","identifier","removeWithRelated","result","sort","a","b","localeCompare","getNodeForValue","staticEvaluate","evaluated","evaluate","confident","applyAction","test","isBooleanLiteral","consequent","mutate","remove","replaceWith","paths","rootPath","getProgramParent","actions","affectedPaths","referencedIdentifiers","referencesOfBinding","reduce","acc","ref","isExportDefaultDeclaration","clean","join","fn","dereferenced","mutated","dead","assignments","assignment","declared","Object","values","getOuterBindingIdentifiers","init","Identifier","isArrayPattern","elements"],"sources":["../../src/utils/scopeHelpers.ts"],"sourcesContent":["/* eslint-disable no-restricted-syntax */\n/* eslint @typescript-eslint/no-use-before-define: [\"error\", { \"functions\": false }] */\n\nimport type { Binding, NodePath } from '@babel/traverse';\nimport type {\n FieldOptions,\n Function as FunctionNode,\n Identifier,\n JSXIdentifier,\n Node,\n Program,\n} from '@babel/types';\nimport { NODE_FIELDS } from '@babel/types';\n\nimport { findIdentifiers, nonType } from './findIdentifiers';\nimport { getScope } from './getScope';\nimport { isNotNull } from './isNotNull';\nimport { isRemoved } from './isRemoved';\n\nfunction validateField(\n node: Node,\n key: string,\n val: unknown,\n field: FieldOptions\n) {\n if (!(field != null && field.validate)) return true;\n if (field.optional && val == null) return true;\n try {\n field.validate(node, key, val);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getBinding(path: NodePath<Identifier | JSXIdentifier>) {\n const binding = getScope(path).getBinding(path.node.name);\n if (!binding) {\n return undefined;\n }\n\n return binding;\n}\n\nexport function reference(\n path: NodePath<Identifier | JSXIdentifier>,\n referencePath: NodePath = path,\n force = false\n): void {\n if (!force && !path.isReferencedIdentifier()) return;\n\n const binding = getBinding(path);\n if (!binding) return;\n\n if (binding.referencePaths.includes(referencePath)) {\n return;\n }\n\n binding.referenced = true;\n binding.referencePaths.push(referencePath ?? path);\n binding.references = binding.referencePaths.length;\n}\n\nfunction isReferenced(binding: Binding): boolean {\n const { kind, referenced, referencePaths, path } = binding;\n\n if (\n path.isFunctionExpression() &&\n path.key === 'init' &&\n path.parentPath.isVariableDeclarator()\n ) {\n // It is a function expression in a variable declarator\n const id = path.parentPath.get('id');\n if (id.isIdentifier()) {\n const idBinding = getBinding(id);\n return idBinding ? isReferenced(idBinding) : true;\n }\n\n return true;\n }\n\n if (!referenced) {\n return false;\n }\n\n // If it's a param binding, we can't just remove it\n // because it brakes the function signature. Keep it alive for now.\n if ((kind as string) === 'param') {\n return true;\n }\n\n // If all remaining references are in TS/Flow types, binding is unreferenced\n return (\n referencePaths.length > 0 ||\n referencePaths.every((i) =>\n i.find((ancestor) => ancestor.isTSType() || ancestor.isFlowType())\n )\n );\n}\n\nfunction isReferencedConstantViolation(path: NodePath, binding: Binding) {\n if (path.find((p) => p === binding.path)) {\n // function a(flag) { return (a = function(flag) { flag ? 1 : 2 }) }\n // ^ Looks crazy, yeh? Welcome to the wonderful world of transpilers!\n // `a = …` here isn't a reference.\n return false;\n }\n\n if (!path.isReferenced()) {\n return false;\n }\n\n if (\n path.isAssignmentExpression() &&\n path.parentPath.isExpressionStatement()\n ) {\n // A root assignment without a parent expression statement is not a reference\n return false;\n }\n\n return true;\n}\n\nexport function dereference(\n path: NodePath<Identifier | JSXIdentifier>\n): Binding | null {\n const binding = getBinding(path);\n if (!binding) return null;\n\n const isReference = binding.referencePaths.includes(path);\n let referencesInConstantViolations = binding.constantViolations.filter((i) =>\n isReferencedConstantViolation(i, binding)\n );\n\n const isConstantViolation = referencesInConstantViolations.includes(path);\n\n if (!isReference && !isConstantViolation) {\n return null;\n }\n\n if (isReference) {\n binding.referencePaths = binding.referencePaths.filter((i) => i !== path);\n binding.references -= 1;\n } else {\n referencesInConstantViolations = referencesInConstantViolations.filter(\n (i) => i !== path\n );\n }\n\n const nonTypeReferences = binding.referencePaths.filter(nonType);\n binding.referenced =\n nonTypeReferences.length + referencesInConstantViolations.length > 0;\n\n return binding;\n}\n\nfunction dereferenceAll(path: NodePath): Binding[] {\n return findIdentifiers([path])\n .map((identifierPath) => dereference(identifierPath))\n .filter(isNotNull);\n}\n\nexport function referenceAll(path: NodePath): void {\n findIdentifiers([path]).forEach((identifierPath) =>\n reference(identifierPath)\n );\n}\n\nconst deletingNodes = new WeakSet<NodePath>();\n\nconst isEmptyList = (list: NodePath[]) =>\n list.length === 0 || list.every((i) => deletingNodes.has(i));\n\ntype ReplaceAction = [action: 'replace', what: NodePath, by: Node];\ntype RemoveAction = [action: 'remove', what: NodePath];\n\nconst getPathFromAction = (action: RemoveAction | ReplaceAction) => {\n if (!Array.isArray(action)) {\n return action;\n }\n\n if (action[0] === 'replace' || action[0] === 'remove') {\n return action[1];\n }\n\n throw new Error(`Unknown action type: ${action[0]}`);\n};\n\nfunction isPrototypeAssignment(path: NodePath) {\n if (!path.isAssignmentExpression()) {\n return false;\n }\n\n const { left } = path.node;\n if (!left) {\n return false;\n }\n\n if (left.type !== 'MemberExpression') {\n return false;\n }\n\n const { object, property } = left;\n if (!object || !property) {\n return false;\n }\n\n return (\n object.type === 'MemberExpression' &&\n object.property.type === 'Identifier' &&\n object.property.name === 'prototype'\n );\n}\n\nfunction canFunctionBeDelete(fnPath: NodePath<FunctionNode>) {\n if (isPrototypeAssignment(fnPath.parentPath)) {\n // It is a prototype assignment, we can't delete it since we can't find all usages\n return false;\n }\n\n const fnScope = fnPath.scope;\n const parentScope = fnScope.parent;\n if (parentScope.parent) {\n // It isn't a top-level function, so we can't delete it\n return true;\n }\n\n if (fnPath.listKey === 'arguments') {\n // It is passed as an argument to another function, we can't delete it\n return true;\n }\n\n return false;\n}\n\nexport function findActionForNode(\n path: NodePath\n): RemoveAction | ReplaceAction | null {\n if (isRemoved(path)) return null;\n\n deletingNodes.add(path);\n\n const parent = path.parentPath;\n\n if (!parent) return ['remove', path];\n\n if (parent.isProgram()) {\n // Do not delete Program node\n return ['remove', path];\n }\n\n if (parent.isClassDeclaration() || parent.isClassExpression()) {\n if (path.key === 'body') {\n return ['replace', path, { type: 'ClassBody', body: [] }];\n }\n }\n\n if (parent.isFunction()) {\n if (path.listKey === 'params') {\n // Do not remove params of functions\n return null;\n }\n\n if (\n (path.isBlockStatement() && isEmptyList(path.get('body'))) ||\n path === parent.get('body')\n ) {\n if (!canFunctionBeDelete(parent)) {\n return [\n 'replace',\n parent,\n {\n ...parent.node,\n async: false,\n body: {\n type: 'BlockStatement',\n body: [],\n directives: [],\n },\n generator: false,\n params: [],\n },\n ];\n }\n }\n }\n\n if (parent.isConditionalExpression()) {\n if (path.key === 'test') {\n return ['replace', parent, parent.node.alternate];\n }\n\n if (path.key === 'consequent') {\n return ['replace', path, { type: 'Identifier', name: 'undefined' }];\n }\n\n if (path.key === 'alternate') {\n return ['replace', path, { type: 'Identifier', name: 'undefined' }];\n }\n }\n\n if (parent.isLogicalExpression({ operator: '&&' })) {\n return [\n 'replace',\n parent,\n {\n type: 'BooleanLiteral',\n value: false,\n },\n ];\n }\n\n if (parent.isLogicalExpression({ operator: '||' })) {\n return [\n 'replace',\n parent,\n path.key === 'left' ? parent.node.right : parent.node.left,\n ];\n }\n\n if (parent.isObjectProperty()) {\n // let's check if it is a special case with Object.defineProperty\n const key = parent.get('key');\n if (key.isIdentifier({ name: 'get' })) {\n const maybeDefineProperty = parent.parentPath.parentPath;\n if (\n maybeDefineProperty?.isCallExpression() &&\n maybeDefineProperty\n .get('callee')\n .matchesPattern('Object.defineProperty')\n ) {\n return findActionForNode(maybeDefineProperty);\n }\n }\n\n return findActionForNode(parent);\n }\n\n if (parent.isTemplateLiteral()) {\n return [\n 'replace',\n path,\n {\n type: 'StringLiteral',\n value: '',\n },\n ];\n }\n\n if (parent.isAssignmentExpression()) {\n return findActionForNode(parent);\n }\n\n if (parent.isCallExpression()) {\n return findActionForNode(parent);\n }\n\n if (parent.isForInStatement({ left: path.node })) {\n return findActionForNode(parent);\n }\n\n if (\n parent.isFunctionExpression({ body: path.node }) ||\n parent.isFunctionDeclaration() ||\n parent.isObjectMethod() ||\n parent.isClassMethod()\n ) {\n return findActionForNode(parent);\n }\n\n if (parent.isBlockStatement()) {\n const body = parent.get('body');\n if (isEmptyList(body)) {\n return findActionForNode(parent);\n }\n\n if (path.listKey === 'body' && typeof path.key === 'number') {\n if (path.key > 0) {\n // We can check whether the previous one can be removed\n const prevStatement = body[path.key - 1];\n if (\n prevStatement.isIfStatement() &&\n prevStatement.get('consequent').isReturnStatement()\n ) {\n // It's `if (…) return …`, we can remove it.\n return findActionForNode(prevStatement);\n }\n } else if (\n body.slice(1).every((statement) => deletingNodes.has(statement))\n ) {\n // If it is the first statement and all other statements\n // are marked for deletion, we can remove the whole block.\n return findActionForNode(parent);\n }\n }\n }\n\n if (parent.isVariableDeclarator()) {\n return findActionForNode(parent);\n }\n\n if (\n parent.isExportNamedDeclaration() &&\n ((path.key === 'specifiers' && isEmptyList(parent.get('specifiers'))) ||\n (path.key === 'declaration' && parent.node.declaration === path.node))\n ) {\n return findActionForNode(parent);\n }\n\n for (const key of ['body', 'declarations', 'specifiers']) {\n if (path.listKey === key && typeof path.key === 'number') {\n const list = parent.get(key) as NodePath[];\n if (isEmptyList(list)) {\n return findActionForNode(parent);\n }\n }\n }\n\n if (parent.isTryStatement()) {\n return findActionForNode(parent);\n }\n\n if (!path.listKey && path.key) {\n const field = NODE_FIELDS[parent.type][path.key];\n if (!validateField(parent.node, path.key as string, null, field)) {\n // The parent node isn't valid without this field, so we should remove it also.\n return findActionForNode(parent);\n }\n }\n\n for (const key of [\n 'argument',\n 'block',\n 'body',\n 'callee',\n 'discriminant',\n 'expression',\n 'id',\n 'left',\n 'object',\n 'property',\n 'right',\n 'test',\n ]) {\n if (path.key === key && parent.get(key) === path) {\n return findActionForNode(parent);\n }\n }\n\n return ['remove', path];\n}\n\n// @babel/preset-typescript transpiles enums, but doesn't reference used identifiers.\nfunction referenceEnums(program: NodePath<Program>) {\n /*\n * We are looking for transpiled enums.\n * (function (Colors) {\n * Colors[\"BLUE\"] = \"#27509A\";\n * })(Colors || (Colors = {}));\n */\n program.traverse({\n ExpressionStatement(expressionStatement) {\n const expression = expressionStatement.get('expression');\n if (!expression.isCallExpression()) return;\n\n const callee = expression.get('callee');\n const args = expression.get('arguments');\n if (!callee.isFunctionExpression() || args.length !== 1) return;\n const [arg] = args;\n if (arg.isLogicalExpression({ operator: '||' })) {\n referenceAll(arg);\n }\n },\n });\n}\n\nconst fixed = new WeakSet<NodePath<Program>>();\n\nfunction removeUnreferenced(items: NodePath<Identifier | JSXIdentifier>[]) {\n const referenced = new Set<NodePath<Identifier | JSXIdentifier>>();\n items.forEach((item) => {\n if (!item.node || isRemoved(item)) return;\n const binding = getScope(item).getBinding(item.node.name);\n if (!binding) return;\n const hasReferences =\n binding.referencePaths.filter((i) => !isRemoved(i)).length > 0;\n if (hasReferences) {\n referenced.add(item);\n return;\n }\n\n const forDeleting = [binding.path, ...binding.constantViolations]\n .map(findActionForNode)\n .filter(isNotNull)\n .map(getPathFromAction);\n\n if (forDeleting.length === 0) return;\n\n findIdentifiers(forDeleting).forEach((identifier) => {\n referenced.add(identifier);\n });\n\n removeWithRelated(forDeleting);\n });\n\n const result = [...referenced];\n result.sort((a, b) => a.node?.name.localeCompare(b.node?.name));\n\n return result;\n}\n\nfunction getNodeForValue(value: unknown): Node | undefined {\n if (typeof value === 'string') {\n return {\n type: 'StringLiteral',\n value,\n };\n }\n\n if (typeof value === 'number') {\n return {\n type: 'NumericLiteral',\n value,\n };\n }\n\n if (typeof value === 'boolean') {\n return {\n type: 'BooleanLiteral',\n value,\n };\n }\n\n if (value === null) {\n return {\n type: 'NullLiteral',\n };\n }\n\n if (value === undefined) {\n return {\n type: 'Identifier',\n name: 'undefined',\n };\n }\n\n return undefined;\n}\n\nfunction staticEvaluate(path: NodePath | null | undefined): void {\n if (!path) return;\n const evaluated = path.evaluate();\n if (evaluated.confident) {\n const node = getNodeForValue(evaluated.value);\n if (node) {\n applyAction(['replace', path, node]);\n return;\n }\n }\n\n if (path.isIfStatement()) {\n const test = path.get('test');\n if (!test.isBooleanLiteral()) {\n return;\n }\n\n const { consequent, alternate } = path.node;\n if (test.node.value) {\n applyAction(['replace', path, consequent]);\n } else if (alternate) {\n applyAction(['replace', path, alternate]);\n } else {\n applyAction(['remove', path]);\n }\n }\n}\n\nfunction applyAction(action: ReplaceAction | RemoveAction) {\n mutate(action[1], (p) => {\n if (isRemoved(p)) return;\n\n const parent = p.parentPath;\n\n if (action[0] === 'remove') {\n p.remove();\n }\n\n if (action[0] === 'replace') {\n p.replaceWith(action[2]);\n }\n\n staticEvaluate(parent);\n });\n}\n\nfunction removeWithRelated(paths: NodePath[]) {\n if (paths.length === 0) return;\n\n const rootPath = getScope(paths[0]).getProgramParent()\n .path as NodePath<Program>;\n\n if (!fixed.has(rootPath)) {\n // Some libraries don't care about bindings, references, and other staff\n // So we have to fix the scope before we can detect unused code\n referenceEnums(rootPath);\n fixed.add(rootPath);\n }\n\n const actions: (ReplaceAction | RemoveAction)[] = paths\n .map(findActionForNode)\n .filter(isNotNull);\n\n const affectedPaths = actions.map(getPathFromAction);\n\n let referencedIdentifiers = findIdentifiers(affectedPaths, 'reference');\n referencedIdentifiers.sort(\n (a, b) => a.node?.name.localeCompare(b.node?.name)\n );\n\n const referencesOfBinding = findIdentifiers(affectedPaths, 'declaration')\n .map((i) => (i.node && getScope(i).getBinding(i.node.name)) ?? null)\n .filter(isNotNull)\n .reduce(\n (acc, i) => [...acc, ...i.referencePaths.filter(nonType)],\n [] as NodePath[]\n )\n .filter(\n (ref) =>\n // Do not remove `export default function`\n !ref.isExportDefaultDeclaration() ||\n !ref.get('declaration').isFunctionDeclaration()\n );\n\n actions.forEach(applyAction);\n\n removeWithRelated(referencesOfBinding);\n\n let clean = false;\n while (!clean && referencedIdentifiers.length > 0) {\n const referenced = removeUnreferenced(referencedIdentifiers);\n clean =\n referenced.map((i) => i.node?.name).join('|') ===\n referencedIdentifiers.map((i) => i.node?.name).join('|');\n referencedIdentifiers = referenced;\n }\n}\n\nfunction mutate<T extends NodePath>(path: T, fn: (p: T) => NodePath[] | void) {\n const dereferenced = dereferenceAll(path);\n\n const mutated = fn(path);\n\n referenceAll(path);\n mutated?.forEach((p) => referenceAll(p));\n\n const dead = dereferenced.filter((p) => !isReferenced(p));\n\n const forDeleting: NodePath[] = [];\n dead.forEach((binding) => {\n const assignments = [binding.path, ...binding.constantViolations];\n assignments.forEach((assignment) => {\n const { scope } = assignment;\n const declared = Object.values(\n assignment.getOuterBindingIdentifiers(false)\n );\n if (\n declared.length === 1 &&\n 'name' in declared[0] &&\n declared[0].name === binding.identifier.name\n ) {\n const init = assignment.get('init');\n if (!Array.isArray(init) && init?.isAssignmentExpression()) {\n // `const a = b = 1` → `b = 1`\n assignment.parentPath?.replaceWith({\n type: 'ExpressionStatement',\n expression: init.node,\n });\n\n const left = init.get('left');\n if (left.isIdentifier()) {\n // If it was forcefully referenced in the shaker\n dereference(left);\n }\n\n return;\n }\n // Only one identifier is declared, so we can remove the whole declaration\n forDeleting.push(assignment);\n return;\n }\n\n if (\n declared.every(\n (identifier) =>\n identifier.type === 'Identifier' &&\n !scope.getBinding(identifier.name)?.referenced\n )\n ) {\n // No other identifier is referenced, so we can remove the whole declaration\n forDeleting.push(assignment);\n return;\n }\n\n // We can't remove the binding, but we can remove the part of it\n assignment.traverse({\n Identifier(identifier) {\n if (identifier.node.name === binding.identifier.name) {\n const parent = identifier.parentPath;\n if (\n parent.isArrayPattern() &&\n identifier.listKey === 'elements' &&\n typeof identifier.key === 'number'\n ) {\n parent.node.elements[identifier.key] = null;\n } else if (parent.isObjectProperty()) {\n forDeleting.push(parent);\n }\n }\n },\n });\n });\n });\n\n removeWithRelated(forDeleting);\n}\n\nexport { applyAction, mutate, removeWithRelated };\n"],"mappings":"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"}
1
+ {"version":3,"file":"scopeHelpers.js","names":["NODE_FIELDS","findIdentifiers","nonType","getScope","isNotNull","isRemoved","validateField","node","key","val","field","validate","optional","getBinding","path","binding","name","undefined","reference","referencePath","force","isReferencedIdentifier","referencePaths","includes","referenced","push","references","length","isReferenced","kind","isFunctionExpression","parentPath","isVariableDeclarator","id","get","isIdentifier","idBinding","every","i","find","ancestor","isTSType","isFlowType","isReferencedConstantViolation","p","isAssignmentExpression","isExpressionStatement","dereference","isReference","referencesInConstantViolations","constantViolations","filter","isConstantViolation","nonTypeReferences","dereferenceAll","map","identifierPath","referenceAll","forEach","deletingNodes","WeakSet","isEmptyList","list","has","getPathFromAction","action","Array","isArray","Error","isPrototypeAssignment","left","type","object","property","canFunctionBeDelete","fnPath","fnScope","scope","parentScope","parent","listKey","findActionForNode","add","isProgram","isClassDeclaration","isClassExpression","body","isFunction","isBlockStatement","async","directives","generator","params","isConditionalExpression","alternate","isLogicalExpression","operator","value","right","isObjectProperty","maybeDefineProperty","isCallExpression","matchesPattern","isTemplateLiteral","isForInStatement","isFunctionDeclaration","isObjectMethod","isClassMethod","prevStatement","isIfStatement","isReturnStatement","slice","statement","init","isExportNamedDeclaration","declaration","isTryStatement","referenceEnums","program","traverse","ExpressionStatement","expressionStatement","expression","callee","args","arg","fixed","removeUnreferenced","items","Set","item","hasReferences","forDeleting","identifier","removeWithRelated","result","sort","a","b","localeCompare","getNodeForValue","staticEvaluate","evaluated","evaluate","confident","applyAction","test","isBooleanLiteral","consequent","mutate","remove","replaceWith","paths","rootPath","getProgramParent","actions","affectedPaths","referencedIdentifiers","referencesOfBinding","reduce","acc","ref","isExportDefaultDeclaration","clean","join","fn","dereferenced","mutated","dead","assignments","assignment","declared","Object","values","getOuterBindingIdentifiers","Identifier","isArrayPattern","elements"],"sources":["../../src/utils/scopeHelpers.ts"],"sourcesContent":["/* eslint-disable no-restricted-syntax */\n/* eslint @typescript-eslint/no-use-before-define: [\"error\", { \"functions\": false }] */\n\nimport type { Binding, NodePath } from '@babel/traverse';\nimport type {\n FieldOptions,\n Function as FunctionNode,\n Identifier,\n JSXIdentifier,\n Node,\n Program,\n} from '@babel/types';\nimport { NODE_FIELDS } from '@babel/types';\n\nimport { findIdentifiers, nonType } from './findIdentifiers';\nimport { getScope } from './getScope';\nimport { isNotNull } from './isNotNull';\nimport { isRemoved } from './isRemoved';\n\nfunction validateField(\n node: Node,\n key: string,\n val: unknown,\n field: FieldOptions\n) {\n if (!(field != null && field.validate)) return true;\n if (field.optional && val == null) return true;\n try {\n field.validate(node, key, val);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getBinding(path: NodePath<Identifier | JSXIdentifier>) {\n const binding = getScope(path).getBinding(path.node.name);\n if (!binding) {\n return undefined;\n }\n\n return binding;\n}\n\nexport function reference(\n path: NodePath<Identifier | JSXIdentifier>,\n referencePath: NodePath = path,\n force = false\n): void {\n if (!force && !path.isReferencedIdentifier()) return;\n\n const binding = getBinding(path);\n if (!binding) return;\n\n if (binding.referencePaths.includes(referencePath)) {\n return;\n }\n\n binding.referenced = true;\n binding.referencePaths.push(referencePath ?? path);\n binding.references = binding.referencePaths.length;\n}\n\nfunction isReferenced(binding: Binding): boolean {\n const { kind, referenced, referencePaths, path } = binding;\n\n if (\n path.isFunctionExpression() &&\n path.key === 'init' &&\n path.parentPath.isVariableDeclarator()\n ) {\n // It is a function expression in a variable declarator\n const id = path.parentPath.get('id');\n if (id.isIdentifier()) {\n const idBinding = getBinding(id);\n return idBinding ? isReferenced(idBinding) : true;\n }\n\n return true;\n }\n\n if (!referenced) {\n return false;\n }\n\n // If it's a param binding, we can't just remove it\n // because it brakes the function signature. Keep it alive for now.\n if ((kind as string) === 'param') {\n return true;\n }\n\n // If all remaining references are in TS/Flow types, binding is unreferenced\n return (\n referencePaths.length > 0 ||\n referencePaths.every((i) =>\n i.find((ancestor) => ancestor.isTSType() || ancestor.isFlowType())\n )\n );\n}\n\nfunction isReferencedConstantViolation(path: NodePath, binding: Binding) {\n if (path.find((p) => p === binding.path)) {\n // function a(flag) { return (a = function(flag) { flag ? 1 : 2 }) }\n // ^ Looks crazy, yeh? Welcome to the wonderful world of transpilers!\n // `a = …` here isn't a reference.\n return false;\n }\n\n if (!path.isReferenced()) {\n return false;\n }\n\n if (\n path.isAssignmentExpression() &&\n path.parentPath.isExpressionStatement()\n ) {\n // A root assignment without a parent expression statement is not a reference\n return false;\n }\n\n return true;\n}\n\nexport function dereference(\n path: NodePath<Identifier | JSXIdentifier>\n): Binding | null {\n const binding = getBinding(path);\n if (!binding) return null;\n\n const isReference = binding.referencePaths.includes(path);\n let referencesInConstantViolations = binding.constantViolations.filter((i) =>\n isReferencedConstantViolation(i, binding)\n );\n\n const isConstantViolation = referencesInConstantViolations.includes(path);\n\n if (!isReference && !isConstantViolation) {\n return null;\n }\n\n if (isReference) {\n binding.referencePaths = binding.referencePaths.filter((i) => i !== path);\n binding.references -= 1;\n } else {\n referencesInConstantViolations = referencesInConstantViolations.filter(\n (i) => i !== path\n );\n }\n\n const nonTypeReferences = binding.referencePaths.filter(nonType);\n binding.referenced =\n nonTypeReferences.length + referencesInConstantViolations.length > 0;\n\n return binding;\n}\n\nfunction dereferenceAll(path: NodePath): Binding[] {\n return findIdentifiers([path])\n .map((identifierPath) => dereference(identifierPath))\n .filter(isNotNull);\n}\n\nexport function referenceAll(path: NodePath): void {\n findIdentifiers([path]).forEach((identifierPath) =>\n reference(identifierPath)\n );\n}\n\nconst deletingNodes = new WeakSet<NodePath>();\n\nconst isEmptyList = (list: NodePath[]) =>\n list.length === 0 || list.every((i) => deletingNodes.has(i));\n\ntype ReplaceAction = [action: 'replace', what: NodePath, by: Node];\ntype RemoveAction = [action: 'remove', what: NodePath];\n\nconst getPathFromAction = (action: RemoveAction | ReplaceAction) => {\n if (!Array.isArray(action)) {\n return action;\n }\n\n if (action[0] === 'replace' || action[0] === 'remove') {\n return action[1];\n }\n\n throw new Error(`Unknown action type: ${action[0]}`);\n};\n\nfunction isPrototypeAssignment(path: NodePath) {\n if (!path.isAssignmentExpression()) {\n return false;\n }\n\n const { left } = path.node;\n if (!left) {\n return false;\n }\n\n if (left.type !== 'MemberExpression') {\n return false;\n }\n\n const { object, property } = left;\n if (!object || !property) {\n return false;\n }\n\n return (\n object.type === 'MemberExpression' &&\n object.property.type === 'Identifier' &&\n object.property.name === 'prototype'\n );\n}\n\nfunction canFunctionBeDelete(fnPath: NodePath<FunctionNode>) {\n if (isPrototypeAssignment(fnPath.parentPath)) {\n // It is a prototype assignment, we can't delete it since we can't find all usages\n return false;\n }\n\n const fnScope = fnPath.scope;\n const parentScope = fnScope.parent;\n if (parentScope.parent) {\n // It isn't a top-level function, so we can't delete it\n return true;\n }\n\n if (fnPath.listKey === 'arguments') {\n // It is passed as an argument to another function, we can't delete it\n return true;\n }\n\n return false;\n}\n\nexport function findActionForNode(\n path: NodePath\n): RemoveAction | ReplaceAction | null {\n if (isRemoved(path)) return null;\n\n deletingNodes.add(path);\n\n const parent = path.parentPath;\n\n if (!parent) return ['remove', path];\n\n if (parent.isProgram()) {\n // Do not delete Program node\n return ['remove', path];\n }\n\n if (parent.isClassDeclaration() || parent.isClassExpression()) {\n if (path.key === 'body') {\n return ['replace', path, { type: 'ClassBody', body: [] }];\n }\n }\n\n if (parent.isFunction()) {\n if (path.listKey === 'params') {\n // Do not remove params of functions\n return null;\n }\n\n if (\n (path.isBlockStatement() && isEmptyList(path.get('body'))) ||\n path === parent.get('body')\n ) {\n if (!canFunctionBeDelete(parent)) {\n return [\n 'replace',\n parent,\n {\n ...parent.node,\n async: false,\n body: {\n type: 'BlockStatement',\n body: [],\n directives: [],\n },\n generator: false,\n params: [],\n },\n ];\n }\n }\n }\n\n if (parent.isConditionalExpression()) {\n if (path.key === 'test') {\n return ['replace', parent, parent.node.alternate];\n }\n\n if (path.key === 'consequent') {\n return ['replace', path, { type: 'Identifier', name: 'undefined' }];\n }\n\n if (path.key === 'alternate') {\n return ['replace', path, { type: 'Identifier', name: 'undefined' }];\n }\n }\n\n if (parent.isLogicalExpression({ operator: '&&' })) {\n return [\n 'replace',\n parent,\n {\n type: 'BooleanLiteral',\n value: false,\n },\n ];\n }\n\n if (parent.isLogicalExpression({ operator: '||' })) {\n return [\n 'replace',\n parent,\n path.key === 'left' ? parent.node.right : parent.node.left,\n ];\n }\n\n if (parent.isObjectProperty()) {\n // let's check if it is a special case with Object.defineProperty\n const key = parent.get('key');\n if (key.isIdentifier({ name: 'get' })) {\n const maybeDefineProperty = parent.parentPath.parentPath;\n if (\n maybeDefineProperty?.isCallExpression() &&\n maybeDefineProperty\n .get('callee')\n .matchesPattern('Object.defineProperty')\n ) {\n return findActionForNode(maybeDefineProperty);\n }\n }\n\n return findActionForNode(parent);\n }\n\n if (parent.isTemplateLiteral()) {\n return [\n 'replace',\n path,\n {\n type: 'StringLiteral',\n value: '',\n },\n ];\n }\n\n if (parent.isAssignmentExpression()) {\n if (path.isAssignmentExpression()) {\n // `foo = bar = 42` should be replaced with `foo = 42`\n return ['replace', path, path.node.right];\n }\n\n return findActionForNode(parent);\n }\n\n if (parent.isCallExpression()) {\n return findActionForNode(parent);\n }\n\n if (parent.isForInStatement({ left: path.node })) {\n return findActionForNode(parent);\n }\n\n if (\n parent.isFunctionExpression({ body: path.node }) ||\n parent.isFunctionDeclaration() ||\n parent.isObjectMethod() ||\n parent.isClassMethod()\n ) {\n return findActionForNode(parent);\n }\n\n if (parent.isBlockStatement()) {\n const body = parent.get('body');\n if (isEmptyList(body)) {\n return findActionForNode(parent);\n }\n\n if (path.listKey === 'body' && typeof path.key === 'number') {\n if (path.key > 0) {\n // We can check whether the previous one can be removed\n const prevStatement = body[path.key - 1];\n if (\n prevStatement.isIfStatement() &&\n prevStatement.get('consequent').isReturnStatement()\n ) {\n // It's `if (…) return …`, we can remove it.\n return findActionForNode(prevStatement);\n }\n } else if (\n body.slice(1).every((statement) => deletingNodes.has(statement))\n ) {\n // If it is the first statement and all other statements\n // are marked for deletion, we can remove the whole block.\n return findActionForNode(parent);\n }\n }\n }\n\n if (parent.isVariableDeclarator()) {\n if (path.key === 'init' && path.isAssignmentExpression()) {\n // We are removing `bar` in `var foo = bar = 42`. Path should be replaced with `var foo = 42`\n return ['replace', path, path.node.right];\n }\n\n const init = parent.get('init');\n if (path.key === 'id' && init.isAssignmentExpression()) {\n // We are removing `foo` in `var foo = bar = 42`. Ignore it.\n return null;\n }\n\n return findActionForNode(parent);\n }\n\n if (\n parent.isExportNamedDeclaration() &&\n ((path.key === 'specifiers' && isEmptyList(parent.get('specifiers'))) ||\n (path.key === 'declaration' && parent.node.declaration === path.node))\n ) {\n return findActionForNode(parent);\n }\n\n for (const key of ['body', 'declarations', 'specifiers']) {\n if (path.listKey === key && typeof path.key === 'number') {\n const list = parent.get(key) as NodePath[];\n if (isEmptyList(list)) {\n return findActionForNode(parent);\n }\n }\n }\n\n if (parent.isTryStatement()) {\n return findActionForNode(parent);\n }\n\n if (!path.listKey && path.key) {\n const field = NODE_FIELDS[parent.type][path.key];\n if (!validateField(parent.node, path.key as string, null, field)) {\n // The parent node isn't valid without this field, so we should remove it also.\n return findActionForNode(parent);\n }\n }\n\n for (const key of [\n 'argument',\n 'block',\n 'body',\n 'callee',\n 'discriminant',\n 'expression',\n 'id',\n 'left',\n 'object',\n 'property',\n 'right',\n 'test',\n ]) {\n if (path.key === key && parent.get(key) === path) {\n return findActionForNode(parent);\n }\n }\n\n return ['remove', path];\n}\n\n// @babel/preset-typescript transpiles enums, but doesn't reference used identifiers.\nfunction referenceEnums(program: NodePath<Program>) {\n /*\n * We are looking for transpiled enums.\n * (function (Colors) {\n * Colors[\"BLUE\"] = \"#27509A\";\n * })(Colors || (Colors = {}));\n */\n program.traverse({\n ExpressionStatement(expressionStatement) {\n const expression = expressionStatement.get('expression');\n if (!expression.isCallExpression()) return;\n\n const callee = expression.get('callee');\n const args = expression.get('arguments');\n if (!callee.isFunctionExpression() || args.length !== 1) return;\n const [arg] = args;\n if (arg.isLogicalExpression({ operator: '||' })) {\n referenceAll(arg);\n }\n },\n });\n}\n\nconst fixed = new WeakSet<NodePath<Program>>();\n\nfunction removeUnreferenced(items: NodePath<Identifier | JSXIdentifier>[]) {\n const referenced = new Set<NodePath<Identifier | JSXIdentifier>>();\n items.forEach((item) => {\n if (!item.node || isRemoved(item)) return;\n const binding = getScope(item).getBinding(item.node.name);\n if (!binding) return;\n const hasReferences =\n binding.referencePaths.filter((i) => !isRemoved(i)).length > 0;\n if (hasReferences) {\n referenced.add(item);\n return;\n }\n\n const forDeleting = [binding.path, ...binding.constantViolations]\n .map(findActionForNode)\n .filter(isNotNull)\n .map(getPathFromAction);\n\n if (forDeleting.length === 0) return;\n\n findIdentifiers(forDeleting).forEach((identifier) => {\n referenced.add(identifier);\n });\n\n removeWithRelated(forDeleting);\n });\n\n const result = [...referenced];\n result.sort((a, b) => a.node?.name.localeCompare(b.node?.name));\n\n return result;\n}\n\nfunction getNodeForValue(value: unknown): Node | undefined {\n if (typeof value === 'string') {\n return {\n type: 'StringLiteral',\n value,\n };\n }\n\n if (typeof value === 'number') {\n return {\n type: 'NumericLiteral',\n value,\n };\n }\n\n if (typeof value === 'boolean') {\n return {\n type: 'BooleanLiteral',\n value,\n };\n }\n\n if (value === null) {\n return {\n type: 'NullLiteral',\n };\n }\n\n if (value === undefined) {\n return {\n type: 'Identifier',\n name: 'undefined',\n };\n }\n\n return undefined;\n}\n\nfunction staticEvaluate(path: NodePath | null | undefined): void {\n if (!path) return;\n const evaluated = path.evaluate();\n if (evaluated.confident) {\n const node = getNodeForValue(evaluated.value);\n if (node) {\n applyAction(['replace', path, node]);\n return;\n }\n }\n\n if (path.isIfStatement()) {\n const test = path.get('test');\n if (!test.isBooleanLiteral()) {\n return;\n }\n\n const { consequent, alternate } = path.node;\n if (test.node.value) {\n applyAction(['replace', path, consequent]);\n } else if (alternate) {\n applyAction(['replace', path, alternate]);\n } else {\n applyAction(['remove', path]);\n }\n }\n}\n\nfunction applyAction(action: ReplaceAction | RemoveAction) {\n mutate(action[1], (p) => {\n if (isRemoved(p)) return;\n\n const parent = p.parentPath;\n\n if (action[0] === 'remove') {\n p.remove();\n }\n\n if (action[0] === 'replace') {\n p.replaceWith(action[2]);\n }\n\n staticEvaluate(parent);\n });\n}\n\nfunction removeWithRelated(paths: NodePath[]) {\n if (paths.length === 0) return;\n\n const rootPath = getScope(paths[0]).getProgramParent()\n .path as NodePath<Program>;\n\n if (!fixed.has(rootPath)) {\n // Some libraries don't care about bindings, references, and other staff\n // So we have to fix the scope before we can detect unused code\n referenceEnums(rootPath);\n fixed.add(rootPath);\n }\n\n const actions: (ReplaceAction | RemoveAction)[] = paths\n .map(findActionForNode)\n .filter(isNotNull);\n\n const affectedPaths = actions.map(getPathFromAction);\n\n let referencedIdentifiers = findIdentifiers(affectedPaths, 'reference');\n referencedIdentifiers.sort(\n (a, b) => a.node?.name.localeCompare(b.node?.name)\n );\n\n const referencesOfBinding = findIdentifiers(affectedPaths, 'declaration')\n .map((i) => (i.node && getScope(i).getBinding(i.node.name)) ?? null)\n .filter(isNotNull)\n .reduce(\n (acc, i) => [...acc, ...i.referencePaths.filter(nonType)],\n [] as NodePath[]\n )\n .filter(\n (ref) =>\n // Do not remove `export default function`\n !ref.isExportDefaultDeclaration() ||\n !ref.get('declaration').isFunctionDeclaration()\n );\n\n actions.forEach(applyAction);\n\n removeWithRelated(referencesOfBinding);\n\n let clean = false;\n while (!clean && referencedIdentifiers.length > 0) {\n const referenced = removeUnreferenced(referencedIdentifiers);\n clean =\n referenced.map((i) => i.node?.name).join('|') ===\n referencedIdentifiers.map((i) => i.node?.name).join('|');\n referencedIdentifiers = referenced;\n }\n}\n\nfunction mutate<T extends NodePath>(path: T, fn: (p: T) => NodePath[] | void) {\n const dereferenced = dereferenceAll(path);\n\n const mutated = fn(path);\n\n referenceAll(path);\n mutated?.forEach((p) => referenceAll(p));\n\n const dead = dereferenced.filter((p) => !isReferenced(p));\n\n const forDeleting: NodePath[] = [];\n dead.forEach((binding) => {\n const assignments = [binding.path, ...binding.constantViolations];\n assignments.forEach((assignment) => {\n const { scope } = assignment;\n const declared = Object.values(\n assignment.getOuterBindingIdentifiers(false)\n );\n if (\n declared.length === 1 &&\n 'name' in declared[0] &&\n declared[0].name === binding.identifier.name\n ) {\n const init = assignment.get('init');\n if (!Array.isArray(init) && init?.isAssignmentExpression()) {\n // `const a = b = 1` → `b = 1`\n assignment.parentPath?.replaceWith({\n type: 'ExpressionStatement',\n expression: init.node,\n });\n\n const left = init.get('left');\n if (left.isIdentifier()) {\n // If it was forcefully referenced in the shaker\n dereference(left);\n }\n\n return;\n }\n // Only one identifier is declared, so we can remove the whole declaration\n forDeleting.push(assignment);\n return;\n }\n\n if (\n declared.every(\n (identifier) =>\n identifier.type === 'Identifier' &&\n !scope.getBinding(identifier.name)?.referenced\n )\n ) {\n // No other identifier is referenced, so we can remove the whole declaration\n forDeleting.push(assignment);\n return;\n }\n\n // We can't remove the binding, but we can remove the part of it\n assignment.traverse({\n Identifier(identifier) {\n if (identifier.node.name === binding.identifier.name) {\n const parent = identifier.parentPath;\n if (\n parent.isArrayPattern() &&\n identifier.listKey === 'elements' &&\n typeof identifier.key === 'number'\n ) {\n parent.node.elements[identifier.key] = null;\n } else if (parent.isObjectProperty()) {\n forDeleting.push(parent);\n }\n }\n },\n });\n });\n });\n\n removeWithRelated(forDeleting);\n}\n\nexport { applyAction, mutate, removeWithRelated };\n"],"mappings":"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"}
@@ -49,6 +49,7 @@ function rearrangeExports({
49
49
  };
50
50
  const rootScope = root.scope;
51
51
  exportRefs.forEach((refs, name) => {
52
+ var _constantViolations;
52
53
  if (refs.length <= 1) {
53
54
  if (refs.length === 1) {
54
55
  // Maybe exports is assigned to another variable?
@@ -64,24 +65,26 @@ function rearrangeExports({
64
65
  // Define variable in the beginning
65
66
  const [declaration] = root.unshiftContainer('body', [t.variableDeclaration('var', [t.variableDeclarator(t.identifier(uid))])]);
66
67
  rootScope.registerDeclaration(declaration);
67
-
68
+ const constantViolations = [];
68
69
  // Replace every reference with defined variable
69
70
  refs.forEach(ref => {
70
71
  const [replaced] = ref.replaceWith(t.identifier(uid));
71
72
  if (replaced.isBindingIdentifier()) {
72
- var _replaced$parentPath;
73
- rootScope.registerConstantViolation(replaced);
74
- if ((_replaced$parentPath = replaced.parentPath) !== null && _replaced$parentPath !== void 0 && (_replaced$parentPath = _replaced$parentPath.parentPath) !== null && _replaced$parentPath !== void 0 && _replaced$parentPath.isVariableDeclarator()) {
75
- // This is `const foo = exports.foo = "value"` case
76
- (0, _scopeHelpers.reference)(replaced, replaced, true);
77
- }
73
+ constantViolations.push(replaced);
78
74
  } else {
79
75
  (0, _scopeHelpers.reference)(replaced);
80
76
  }
81
77
  });
78
+ constantViolations.forEach(id => {
79
+ rootScope.registerConstantViolation(id);
80
+ });
81
+ const assigmentToExport = t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('exports'), t.identifier(name)), t.identifier(uid)));
82
82
 
83
- // Assign defined variable to the export
84
- const [pushed] = root.pushContainer('body', [t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('exports'), t.identifier(name)), t.identifier(uid)))]);
83
+ // export.foo = _foo will be inserted either after the last _foo assigment or in the end of the file
84
+ const body = root.get('body');
85
+ const lastViolation = (_constantViolations = constantViolations[constantViolations.length - 1]) !== null && _constantViolations !== void 0 ? _constantViolations : body[body.length - 1];
86
+ const pathInRoot = root.get('body').find(n => lastViolation.isDescendant(n));
87
+ const [pushed] = pathInRoot.insertAfter(assigmentToExport);
85
88
  const local = pushed.get('expression.right');
86
89
  (0, _scopeHelpers.reference)(local);
87
90
  rearranged[name] = local;
@@ -254,6 +257,15 @@ function shakerPlugin(babel, {
254
257
  }
255
258
  });
256
259
  dereferenced = [];
260
+
261
+ // Find and mark for deleting all unreferenced variables
262
+ const unreferenced = Object.values(file.scope.getAllBindings()).filter(i => !i.referenced);
263
+ for (const binding of unreferenced) {
264
+ if (binding.path.isVariableDeclarator() && !forDeleting.includes(binding.path.get('id'))) {
265
+ forDeleting.push(binding.path.get('id'));
266
+ changed = true;
267
+ }
268
+ }
257
269
  }
258
270
  }
259
271
  this.imports = withoutRemoved(collected.imports);
@@ -1 +1 @@
1
- {"version":3,"file":"shaker.js","names":["_shared","require","_collectExportsAndImports","_getFileIdx","_isRemoved","_scopeHelpers","_traversalCache","EXT_REGEX","ALLOWED_EXTENSIONS","shouldKeepSideEffect","importPath","ext","match","includes","getBindingForExport","exportPath","isIdentifier","scope","getBinding","node","name","variableDeclarator","findParent","p","isVariableDeclarator","id","get","isAssignmentExpression","left","isFunctionDeclaration","isClassDeclaration","undefined","withoutRemoved","items","filter","local","isRemoved","rearrangeExports","types","t","root","exportRefs","exports","rearranged","rootScope","forEach","refs","length","declarator","uid","generateUid","declaration","unshiftContainer","variableDeclaration","identifier","registerDeclaration","ref","replaced","replaceWith","isBindingIdentifier","_replaced$parentPath","registerConstantViolation","parentPath","reference","pushed","pushContainer","expressionStatement","assignmentExpression","memberExpression","shakerPlugin","babel","keepSideEffects","ifUnknownExport","onlyExports","shakerLogger","logger","extend","pre","file","filename","opts","log","getFileIdx","join","onlyExportsSet","Set","collected","collectExportsAndImports","path","sideEffectImports","imports","sideEffectImport","Object","values","reexports","hasWywPreval","__wywPreval","hasDefault","default","has","delete","size","deadExports","keys","remove","importedAsSideEffect","isEsModule","add","aliveExports","importNames","map","imported","entries","exported","some","alive","exp","exportToPath","Map","set","notFoundExports","clear","isAllExportsFound","Error","forDeleting","i","source","push","deleted","dereferenced","changed","binding","action","findActionForNode","parent","outerReferences","referencePaths","isAncestor","dereference","applyAction","removeWithRelated","visitor","post","processedImports","addImport","metadata","wywEvaluator","invalidateTraversalCache"],"sources":["../../src/plugins/shaker.ts"],"sourcesContent":["import type { BabelFile, PluginObj, NodePath } from '@babel/core';\nimport type { Binding } from '@babel/traverse';\nimport type {\n Identifier,\n MemberExpression,\n Program,\n VariableDeclarator,\n} from '@babel/types';\n\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { Core } from '../babel';\nimport type { IMetadata } from '../utils/ShakerMetadata';\nimport type { Exports, IState } from '../utils/collectExportsAndImports';\nimport {\n collectExportsAndImports,\n sideEffectImport,\n} from '../utils/collectExportsAndImports';\nimport { getFileIdx } from '../utils/getFileIdx';\nimport { isRemoved } from '../utils/isRemoved';\nimport {\n applyAction,\n dereference,\n findActionForNode,\n reference,\n removeWithRelated,\n} from '../utils/scopeHelpers';\nimport { invalidateTraversalCache } from '../utils/traversalCache';\n\nconst EXT_REGEX = /\\.[0-9a-z]+$/;\nconst ALLOWED_EXTENSIONS = ['.js', '.cjs', '.mjs'];\n\nfunction shouldKeepSideEffect(importPath: string) {\n const [ext] = importPath.match(EXT_REGEX) || [''];\n\n return ext === '' || ALLOWED_EXTENSIONS.includes(ext);\n}\n\nexport interface IShakerOptions {\n ifUnknownExport?: 'error' | 'ignore' | 'reexport-all' | 'skip-shaking';\n keepSideEffects?: boolean;\n onlyExports: string[];\n}\n\ninterface NodeWithName {\n name: string;\n}\n\nfunction getBindingForExport(exportPath: NodePath): Binding | undefined {\n if (exportPath.isIdentifier()) {\n return exportPath.scope.getBinding(exportPath.node.name);\n }\n\n const variableDeclarator = exportPath.findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n if (variableDeclarator) {\n const id = variableDeclarator.get('id');\n if (id.isIdentifier()) {\n return variableDeclarator.scope.getBinding(id.node.name);\n }\n }\n\n if (exportPath.isAssignmentExpression()) {\n const left = exportPath.get('left');\n if (left.isIdentifier()) {\n return exportPath.scope.getBinding(left.node.name);\n }\n }\n\n if (exportPath.isFunctionDeclaration() || exportPath.isClassDeclaration()) {\n return exportPath.scope.getBinding(exportPath.node.id!.name);\n }\n\n return undefined;\n}\n\nconst withoutRemoved = <T extends { local: NodePath }>(items: T[]): T[] =>\n items.filter(({ local }) => !isRemoved(local));\n\nfunction rearrangeExports(\n { types: t }: Core,\n root: NodePath<Program>,\n exportRefs: Map<string, NodePath<MemberExpression>[]>,\n exports: Exports\n): Exports {\n const rearranged = {\n ...exports,\n };\n\n const rootScope = root.scope;\n exportRefs.forEach((refs, name) => {\n if (refs.length <= 1) {\n if (refs.length === 1) {\n // Maybe exports is assigned to another variable?\n const declarator = refs[0].findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n\n if (!declarator) {\n return;\n }\n } else {\n return;\n }\n }\n\n const uid = rootScope.generateUid(name);\n // Define variable in the beginning\n const [declaration] = root.unshiftContainer('body', [\n t.variableDeclaration('var', [t.variableDeclarator(t.identifier(uid))]),\n ]);\n\n rootScope.registerDeclaration(declaration);\n\n // Replace every reference with defined variable\n refs.forEach((ref) => {\n const [replaced] = ref.replaceWith(t.identifier(uid));\n if (replaced.isBindingIdentifier()) {\n rootScope.registerConstantViolation(replaced);\n if (replaced.parentPath?.parentPath?.isVariableDeclarator()) {\n // This is `const foo = exports.foo = \"value\"` case\n reference(replaced, replaced, true);\n }\n } else {\n reference(replaced);\n }\n });\n\n // Assign defined variable to the export\n const [pushed] = root.pushContainer('body', [\n t.expressionStatement(\n t.assignmentExpression(\n '=',\n t.memberExpression(t.identifier('exports'), t.identifier(name)),\n t.identifier(uid)\n )\n ),\n ]);\n\n const local = pushed.get('expression.right') as NodePath<Identifier>;\n reference(local);\n\n rearranged[name] = local;\n });\n\n return rearranged;\n}\n\nexport default function shakerPlugin(\n babel: Core,\n {\n keepSideEffects = false,\n ifUnknownExport = 'skip-shaking',\n onlyExports,\n }: IShakerOptions\n): PluginObj<IState & { filename: string }> {\n const shakerLogger = logger.extend('shaker');\n\n return {\n name: '@wyw-in-js/transform/shaker',\n pre(file: BabelFile) {\n this.filename = file.opts.filename!;\n const log = shakerLogger.extend(getFileIdx(this.filename));\n\n log('start', `${this.filename}, onlyExports: ${onlyExports.join(',')}`);\n const onlyExportsSet = new Set(onlyExports);\n\n const collected = collectExportsAndImports(file.path);\n const sideEffectImports = collected.imports.filter(sideEffectImport);\n log(\n 'import-and-exports',\n [\n `imports: ${collected.imports.length} (side-effects: ${sideEffectImports.length})`,\n `exports: ${Object.values(collected.exports).length}`,\n `reexports: ${collected.reexports.length}`,\n ].join(', ')\n );\n\n // We cannot just throw out exports if they are referred in the code\n // Let's dome some replacements\n const exports = rearrangeExports(\n babel,\n file.path,\n collected.exportRefs,\n collected.exports\n );\n\n Object.values(exports).forEach((local) => {\n if (local.isAssignmentExpression()) {\n const left = local.get('left');\n if (left.isIdentifier()) {\n // For some reason babel does not mark id in AssignmentExpression as a reference\n // So we need to do it manually\n reference(left, left, true);\n }\n }\n });\n\n const hasWywPreval = exports.__wywPreval !== undefined;\n const hasDefault = exports.default !== undefined;\n\n // If __wywPreval is not exported, we can remove it from onlyExports\n if (onlyExportsSet.has('__wywPreval') && !hasWywPreval) {\n onlyExportsSet.delete('__wywPreval');\n }\n\n if (onlyExportsSet.size === 0) {\n // Fast-lane: if there are no exports to keep, we can just shake out the whole file\n this.imports = [];\n this.exports = {};\n this.reexports = [];\n this.deadExports = Object.keys(exports);\n\n file.path.get('body').forEach((p) => {\n p.remove();\n });\n\n return;\n }\n\n const importedAsSideEffect = onlyExportsSet.has('side-effect');\n onlyExportsSet.delete('side-effect');\n\n // Hackaround for packages which include a 'default' export without specifying __esModule; such packages cannot be\n // shaken as they will break interopRequireDefault babel helper\n // See example in shaker-plugin.test.ts\n // Real-world example was found in preact/compat npm package\n if (\n onlyExportsSet.has('default') &&\n hasDefault &&\n !collected.isEsModule\n ) {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n return;\n }\n\n if (!onlyExportsSet.has('*')) {\n // __esModule should be kept alive\n onlyExportsSet.add('__esModule');\n\n const aliveExports = new Set<NodePath>();\n const importNames = collected.imports.map(({ imported }) => imported);\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (onlyExportsSet.has(exported)) {\n aliveExports.add(local);\n } else if (\n importNames.includes((local.node as NodeWithName).name || '')\n ) {\n aliveExports.add(local);\n } else if ([...aliveExports].some((alive) => alive === local)) {\n // It's possible to export multiple values from a single variable initializer, e.g\n // export const { foo, bar } = baz();\n // We need to treat all of them as used if any of them are used, since otherwise\n // we'll attempt to delete the baz() call\n aliveExports.add(local);\n }\n });\n\n collected.reexports.forEach((exp) => {\n if (onlyExportsSet.has(exp.exported)) {\n aliveExports.add(exp.local);\n }\n });\n\n const exportToPath = new Map<string, NodePath>();\n Object.entries(exports).forEach(([exported, local]) => {\n exportToPath.set(exported, local);\n });\n\n collected.reexports.forEach((exp) => {\n exportToPath.set(exp.exported, exp.local);\n });\n\n const notFoundExports = [...onlyExportsSet].filter(\n (exp) =>\n exp !== '__esModule' && !aliveExports.has(exportToPath.get(exp)!)\n );\n exportToPath.clear();\n\n const isAllExportsFound = notFoundExports.length === 0;\n if (!isAllExportsFound && ifUnknownExport !== 'ignore') {\n if (ifUnknownExport === 'error') {\n throw new Error(\n `Unknown export(s) requested: ${onlyExports.join(',')}`\n );\n }\n\n if (ifUnknownExport === 'reexport-all') {\n // If there are unknown exports, we have keep alive all re-exports.\n if (exports['*'] !== undefined) {\n aliveExports.add(exports['*']);\n }\n\n collected.reexports.forEach((exp) => {\n if (exp.exported === '*') {\n aliveExports.add(exp.local);\n }\n });\n }\n\n if (ifUnknownExport === 'skip-shaking') {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n\n return;\n }\n }\n\n const forDeleting = [\n ...Object.values(exports),\n ...collected.reexports.map((i) => i.local),\n ].filter((exp) => !aliveExports.has(exp));\n\n if (!keepSideEffects && !importedAsSideEffect) {\n // Remove all imports that don't import something explicitly and should not be kept\n sideEffectImports.forEach((i) => {\n if (!shouldKeepSideEffect(i.source)) {\n forDeleting.push(i.local);\n }\n });\n }\n\n const deleted = new Set<NodePath>();\n\n let dereferenced: NodePath<Identifier>[] = [];\n let changed = true;\n while (changed && deleted.size < forDeleting.length) {\n changed = false;\n // eslint-disable-next-line no-restricted-syntax\n for (const path of forDeleting) {\n if (deleted.has(path)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const binding = getBindingForExport(path);\n const action = findActionForNode(path);\n const parent = action?.[1];\n const outerReferences = (binding?.referencePaths || []).filter(\n (ref) => ref !== parent && !parent?.isAncestor(ref)\n );\n if (outerReferences.length > 0 && path.isIdentifier()) {\n // Temporary deref it in order to simplify further checks.\n dereference(path);\n dereferenced.push(path);\n }\n\n if (\n !deleted.has(path) &&\n (!binding || outerReferences.length === 0)\n ) {\n if (action) {\n applyAction(action);\n } else {\n removeWithRelated([path]);\n }\n\n deleted.add(path);\n changed = true;\n }\n }\n\n dereferenced.forEach((path) => {\n // If path is still alive, we need to reference it back\n if (!isRemoved(path)) {\n reference(path);\n }\n });\n\n dereferenced = [];\n }\n }\n\n this.imports = withoutRemoved(collected.imports);\n this.exports = {};\n this.deadExports = [];\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (isRemoved(local)) {\n this.deadExports.push(exported);\n } else {\n this.exports[exported] = local;\n }\n });\n\n this.reexports = withoutRemoved(collected.reexports);\n },\n visitor: {},\n post(file: BabelFile) {\n const log = shakerLogger.extend(getFileIdx(file.opts.filename!));\n\n const processedImports = new Set<string>();\n const imports = new Map<string, string[]>();\n const addImport = ({\n imported,\n source,\n }: {\n imported: string;\n source: string;\n }) => {\n if (processedImports.has(`${source}:${imported}`)) {\n return;\n }\n\n if (!imports.has(source)) {\n imports.set(source, []);\n }\n\n if (imported) {\n imports.get(source)!.push(imported);\n }\n\n processedImports.add(`${source}:${imported}`);\n };\n\n this.imports.forEach(addImport);\n this.reexports.forEach(addImport);\n\n log('end', `remaining imports: %O`, imports);\n\n // eslint-disable-next-line no-param-reassign\n (file.metadata as IMetadata).wywEvaluator = {\n imports,\n };\n\n invalidateTraversalCache(file.path);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shaker.js","names":["_shared","require","_collectExportsAndImports","_getFileIdx","_isRemoved","_scopeHelpers","_traversalCache","EXT_REGEX","ALLOWED_EXTENSIONS","shouldKeepSideEffect","importPath","ext","match","includes","getBindingForExport","exportPath","isIdentifier","scope","getBinding","node","name","variableDeclarator","findParent","p","isVariableDeclarator","id","get","isAssignmentExpression","left","isFunctionDeclaration","isClassDeclaration","undefined","withoutRemoved","items","filter","local","isRemoved","rearrangeExports","types","t","root","exportRefs","exports","rearranged","rootScope","forEach","refs","_constantViolations","length","declarator","uid","generateUid","declaration","unshiftContainer","variableDeclaration","identifier","registerDeclaration","constantViolations","ref","replaced","replaceWith","isBindingIdentifier","push","reference","registerConstantViolation","assigmentToExport","expressionStatement","assignmentExpression","memberExpression","body","lastViolation","pathInRoot","find","n","isDescendant","pushed","insertAfter","shakerPlugin","babel","keepSideEffects","ifUnknownExport","onlyExports","shakerLogger","logger","extend","pre","file","filename","opts","log","getFileIdx","join","onlyExportsSet","Set","collected","collectExportsAndImports","path","sideEffectImports","imports","sideEffectImport","Object","values","reexports","hasWywPreval","__wywPreval","hasDefault","default","has","delete","size","deadExports","keys","remove","importedAsSideEffect","isEsModule","add","aliveExports","importNames","map","imported","entries","exported","some","alive","exp","exportToPath","Map","set","notFoundExports","clear","isAllExportsFound","Error","forDeleting","i","source","deleted","dereferenced","changed","binding","action","findActionForNode","parent","outerReferences","referencePaths","isAncestor","dereference","applyAction","removeWithRelated","unreferenced","getAllBindings","referenced","visitor","post","processedImports","addImport","metadata","wywEvaluator","invalidateTraversalCache"],"sources":["../../src/plugins/shaker.ts"],"sourcesContent":["import type { BabelFile, PluginObj, NodePath } from '@babel/core';\nimport type { Binding } from '@babel/traverse';\nimport type {\n Identifier,\n MemberExpression,\n Program,\n VariableDeclarator,\n} from '@babel/types';\n\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { Core } from '../babel';\nimport type { IMetadata } from '../utils/ShakerMetadata';\nimport type { Exports, IState } from '../utils/collectExportsAndImports';\nimport {\n collectExportsAndImports,\n sideEffectImport,\n} from '../utils/collectExportsAndImports';\nimport { getFileIdx } from '../utils/getFileIdx';\nimport { isRemoved } from '../utils/isRemoved';\nimport {\n applyAction,\n dereference,\n findActionForNode,\n reference,\n removeWithRelated,\n} from '../utils/scopeHelpers';\nimport { invalidateTraversalCache } from '../utils/traversalCache';\n\nconst EXT_REGEX = /\\.[0-9a-z]+$/;\nconst ALLOWED_EXTENSIONS = ['.js', '.cjs', '.mjs'];\n\nfunction shouldKeepSideEffect(importPath: string) {\n const [ext] = importPath.match(EXT_REGEX) || [''];\n\n return ext === '' || ALLOWED_EXTENSIONS.includes(ext);\n}\n\nexport interface IShakerOptions {\n ifUnknownExport?: 'error' | 'ignore' | 'reexport-all' | 'skip-shaking';\n keepSideEffects?: boolean;\n onlyExports: string[];\n}\n\ninterface NodeWithName {\n name: string;\n}\n\nfunction getBindingForExport(exportPath: NodePath): Binding | undefined {\n if (exportPath.isIdentifier()) {\n return exportPath.scope.getBinding(exportPath.node.name);\n }\n\n const variableDeclarator = exportPath.findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n if (variableDeclarator) {\n const id = variableDeclarator.get('id');\n if (id.isIdentifier()) {\n return variableDeclarator.scope.getBinding(id.node.name);\n }\n }\n\n if (exportPath.isAssignmentExpression()) {\n const left = exportPath.get('left');\n if (left.isIdentifier()) {\n return exportPath.scope.getBinding(left.node.name);\n }\n }\n\n if (exportPath.isFunctionDeclaration() || exportPath.isClassDeclaration()) {\n return exportPath.scope.getBinding(exportPath.node.id!.name);\n }\n\n return undefined;\n}\n\nconst withoutRemoved = <T extends { local: NodePath }>(items: T[]): T[] =>\n items.filter(({ local }) => !isRemoved(local));\n\nfunction rearrangeExports(\n { types: t }: Core,\n root: NodePath<Program>,\n exportRefs: Map<string, NodePath<MemberExpression>[]>,\n exports: Exports\n): Exports {\n const rearranged = {\n ...exports,\n };\n\n const rootScope = root.scope;\n exportRefs.forEach((refs, name) => {\n if (refs.length <= 1) {\n if (refs.length === 1) {\n // Maybe exports is assigned to another variable?\n const declarator = refs[0].findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n\n if (!declarator) {\n return;\n }\n } else {\n return;\n }\n }\n\n const uid = rootScope.generateUid(name);\n // Define variable in the beginning\n const [declaration] = root.unshiftContainer('body', [\n t.variableDeclaration('var', [t.variableDeclarator(t.identifier(uid))]),\n ]);\n\n rootScope.registerDeclaration(declaration);\n\n const constantViolations: NodePath<Identifier>[] = [];\n // Replace every reference with defined variable\n refs.forEach((ref) => {\n const [replaced] = ref.replaceWith(t.identifier(uid));\n if (replaced.isBindingIdentifier()) {\n constantViolations.push(replaced);\n } else {\n reference(replaced);\n }\n });\n\n constantViolations.forEach((id) => {\n rootScope.registerConstantViolation(id);\n });\n\n const assigmentToExport = t.expressionStatement(\n t.assignmentExpression(\n '=',\n t.memberExpression(t.identifier('exports'), t.identifier(name)),\n t.identifier(uid)\n )\n );\n\n // export.foo = _foo will be inserted either after the last _foo assigment or in the end of the file\n const body = root.get('body');\n const lastViolation =\n constantViolations[constantViolations.length - 1] ??\n body[body.length - 1];\n const pathInRoot = root\n .get('body')\n .find((n) => lastViolation.isDescendant(n))!;\n\n const [pushed] = pathInRoot.insertAfter(assigmentToExport);\n\n const local = pushed.get('expression.right') as NodePath<Identifier>;\n reference(local);\n\n rearranged[name] = local;\n });\n\n return rearranged;\n}\n\nexport default function shakerPlugin(\n babel: Core,\n {\n keepSideEffects = false,\n ifUnknownExport = 'skip-shaking',\n onlyExports,\n }: IShakerOptions\n): PluginObj<IState & { filename: string }> {\n const shakerLogger = logger.extend('shaker');\n\n return {\n name: '@wyw-in-js/transform/shaker',\n pre(file: BabelFile) {\n this.filename = file.opts.filename!;\n const log = shakerLogger.extend(getFileIdx(this.filename));\n\n log('start', `${this.filename}, onlyExports: ${onlyExports.join(',')}`);\n const onlyExportsSet = new Set(onlyExports);\n\n const collected = collectExportsAndImports(file.path);\n const sideEffectImports = collected.imports.filter(sideEffectImport);\n log(\n 'import-and-exports',\n [\n `imports: ${collected.imports.length} (side-effects: ${sideEffectImports.length})`,\n `exports: ${Object.values(collected.exports).length}`,\n `reexports: ${collected.reexports.length}`,\n ].join(', ')\n );\n\n // We cannot just throw out exports if they are referred in the code\n // Let's dome some replacements\n const exports = rearrangeExports(\n babel,\n file.path,\n collected.exportRefs,\n collected.exports\n );\n\n Object.values(exports).forEach((local) => {\n if (local.isAssignmentExpression()) {\n const left = local.get('left');\n if (left.isIdentifier()) {\n // For some reason babel does not mark id in AssignmentExpression as a reference\n // So we need to do it manually\n reference(left, left, true);\n }\n }\n });\n\n const hasWywPreval = exports.__wywPreval !== undefined;\n const hasDefault = exports.default !== undefined;\n\n // If __wywPreval is not exported, we can remove it from onlyExports\n if (onlyExportsSet.has('__wywPreval') && !hasWywPreval) {\n onlyExportsSet.delete('__wywPreval');\n }\n\n if (onlyExportsSet.size === 0) {\n // Fast-lane: if there are no exports to keep, we can just shake out the whole file\n this.imports = [];\n this.exports = {};\n this.reexports = [];\n this.deadExports = Object.keys(exports);\n\n file.path.get('body').forEach((p) => {\n p.remove();\n });\n\n return;\n }\n\n const importedAsSideEffect = onlyExportsSet.has('side-effect');\n onlyExportsSet.delete('side-effect');\n\n // Hackaround for packages which include a 'default' export without specifying __esModule; such packages cannot be\n // shaken as they will break interopRequireDefault babel helper\n // See example in shaker-plugin.test.ts\n // Real-world example was found in preact/compat npm package\n if (\n onlyExportsSet.has('default') &&\n hasDefault &&\n !collected.isEsModule\n ) {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n return;\n }\n\n if (!onlyExportsSet.has('*')) {\n // __esModule should be kept alive\n onlyExportsSet.add('__esModule');\n\n const aliveExports = new Set<NodePath>();\n const importNames = collected.imports.map(({ imported }) => imported);\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (onlyExportsSet.has(exported)) {\n aliveExports.add(local);\n } else if (\n importNames.includes((local.node as NodeWithName).name || '')\n ) {\n aliveExports.add(local);\n } else if ([...aliveExports].some((alive) => alive === local)) {\n // It's possible to export multiple values from a single variable initializer, e.g\n // export const { foo, bar } = baz();\n // We need to treat all of them as used if any of them are used, since otherwise\n // we'll attempt to delete the baz() call\n aliveExports.add(local);\n }\n });\n\n collected.reexports.forEach((exp) => {\n if (onlyExportsSet.has(exp.exported)) {\n aliveExports.add(exp.local);\n }\n });\n\n const exportToPath = new Map<string, NodePath>();\n Object.entries(exports).forEach(([exported, local]) => {\n exportToPath.set(exported, local);\n });\n\n collected.reexports.forEach((exp) => {\n exportToPath.set(exp.exported, exp.local);\n });\n\n const notFoundExports = [...onlyExportsSet].filter(\n (exp) =>\n exp !== '__esModule' && !aliveExports.has(exportToPath.get(exp)!)\n );\n exportToPath.clear();\n\n const isAllExportsFound = notFoundExports.length === 0;\n if (!isAllExportsFound && ifUnknownExport !== 'ignore') {\n if (ifUnknownExport === 'error') {\n throw new Error(\n `Unknown export(s) requested: ${onlyExports.join(',')}`\n );\n }\n\n if (ifUnknownExport === 'reexport-all') {\n // If there are unknown exports, we have keep alive all re-exports.\n if (exports['*'] !== undefined) {\n aliveExports.add(exports['*']);\n }\n\n collected.reexports.forEach((exp) => {\n if (exp.exported === '*') {\n aliveExports.add(exp.local);\n }\n });\n }\n\n if (ifUnknownExport === 'skip-shaking') {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n\n return;\n }\n }\n\n const forDeleting = [\n ...Object.values(exports),\n ...collected.reexports.map((i) => i.local),\n ].filter((exp) => !aliveExports.has(exp));\n\n if (!keepSideEffects && !importedAsSideEffect) {\n // Remove all imports that don't import something explicitly and should not be kept\n sideEffectImports.forEach((i) => {\n if (!shouldKeepSideEffect(i.source)) {\n forDeleting.push(i.local);\n }\n });\n }\n\n const deleted = new Set<NodePath>();\n\n let dereferenced: NodePath<Identifier>[] = [];\n let changed = true;\n while (changed && deleted.size < forDeleting.length) {\n changed = false;\n // eslint-disable-next-line no-restricted-syntax\n for (const path of forDeleting) {\n if (deleted.has(path)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const binding = getBindingForExport(path);\n const action = findActionForNode(path);\n const parent = action?.[1];\n const outerReferences = (binding?.referencePaths || []).filter(\n (ref) => ref !== parent && !parent?.isAncestor(ref)\n );\n if (outerReferences.length > 0 && path.isIdentifier()) {\n // Temporary deref it in order to simplify further checks.\n dereference(path);\n dereferenced.push(path);\n }\n\n if (\n !deleted.has(path) &&\n (!binding || outerReferences.length === 0)\n ) {\n if (action) {\n applyAction(action);\n } else {\n removeWithRelated([path]);\n }\n\n deleted.add(path);\n changed = true;\n }\n }\n\n dereferenced.forEach((path) => {\n // If path is still alive, we need to reference it back\n if (!isRemoved(path)) {\n reference(path);\n }\n });\n\n dereferenced = [];\n\n // Find and mark for deleting all unreferenced variables\n const unreferenced = Object.values(\n file.scope.getAllBindings()\n ).filter((i) => !i.referenced);\n\n for (const binding of unreferenced) {\n if (\n binding.path.isVariableDeclarator() &&\n !forDeleting.includes(binding.path.get('id'))\n ) {\n forDeleting.push(binding.path.get('id'));\n changed = true;\n }\n }\n }\n }\n\n this.imports = withoutRemoved(collected.imports);\n this.exports = {};\n this.deadExports = [];\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (isRemoved(local)) {\n this.deadExports.push(exported);\n } else {\n this.exports[exported] = local;\n }\n });\n\n this.reexports = withoutRemoved(collected.reexports);\n },\n visitor: {},\n post(file: BabelFile) {\n const log = shakerLogger.extend(getFileIdx(file.opts.filename!));\n\n const processedImports = new Set<string>();\n const imports = new Map<string, string[]>();\n const addImport = ({\n imported,\n source,\n }: {\n imported: string;\n source: string;\n }) => {\n if (processedImports.has(`${source}:${imported}`)) {\n return;\n }\n\n if (!imports.has(source)) {\n imports.set(source, []);\n }\n\n if (imported) {\n imports.get(source)!.push(imported);\n }\n\n processedImports.add(`${source}:${imported}`);\n };\n\n this.imports.forEach(addImport);\n this.reexports.forEach(addImport);\n\n log('end', `remaining imports: %O`, imports);\n\n // eslint-disable-next-line no-param-reassign\n (file.metadata as IMetadata).wywEvaluator = {\n imports,\n };\n\n invalidateTraversalCache(file.path);\n },\n };\n}\n"],"mappings":"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"}
package/lib/shaker.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.shaker = exports.default = void 0;
7
7
  var _ShakerMetadata = require("./utils/ShakerMetadata");
8
8
  var _getPluginKey = require("./utils/getPluginKey");
9
9
  const hasKeyInList = (plugin, list) => {
@@ -54,5 +54,6 @@ const shaker = (evalConfig, ast, code, {
54
54
  }
55
55
  return [transformed.ast, (_transformed$code = transformed.code) !== null && _transformed$code !== void 0 ? _transformed$code : '', transformed.metadata.wywEvaluator.imports];
56
56
  };
57
+ exports.shaker = shaker;
57
58
  var _default = exports.default = shaker;
58
59
  //# sourceMappingURL=shaker.js.map
package/lib/shaker.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shaker.js","names":["_ShakerMetadata","require","_getPluginKey","hasKeyInList","plugin","list","pluginKey","getPluginKey","some","i","includes","safeResolve","id","paths","resolve","filter","shaker","evalConfig","ast","code","highPriorityPlugins","config","babel","_evalConfig$plugins$f","_evalConfig$plugins","_evalConfig$plugins2","_evalConfig$plugins3","_evalConfig$filename","_evalConfig$filename2","_transformed$code","preShakePlugins","plugins","hasCommonjsPlugin","push","filename","endsWith","_evalConfig$plugins4","hasTypescriptPlugin","preset","transformOptions","caller","name","transformed","transformFromAstSync","hasShakerMetadata","metadata","Error","wywEvaluator","imports","_default","exports","default"],"sources":["../src/shaker.ts"],"sourcesContent":["import type { TransformOptions, PluginItem } from '@babel/core';\n\nimport type { Evaluator } from '@wyw-in-js/shared';\n\nimport { hasShakerMetadata } from './utils/ShakerMetadata';\nimport { getPluginKey } from './utils/getPluginKey';\n\nconst hasKeyInList = (plugin: PluginItem, list: string[]): boolean => {\n const pluginKey = getPluginKey(plugin);\n return pluginKey ? list.some((i) => pluginKey.includes(i)) : false;\n};\n\nconst safeResolve = (id: string, paths: (string | null)[]): string | null => {\n try {\n return require.resolve(id, {\n paths: paths.filter((i) => i !== null) as string[],\n });\n } catch {\n return null;\n }\n};\n\nconst shaker: Evaluator = (\n evalConfig,\n ast,\n code,\n { highPriorityPlugins, ...config },\n babel\n) => {\n const preShakePlugins =\n evalConfig.plugins?.filter((i) => hasKeyInList(i, highPriorityPlugins)) ??\n [];\n\n const plugins = [\n ...preShakePlugins,\n [require.resolve('./plugins/shaker'), config],\n ...(evalConfig.plugins ?? []).filter(\n (i) => !hasKeyInList(i, highPriorityPlugins)\n ),\n ];\n\n const hasCommonjsPlugin = evalConfig.plugins?.some(\n (i) => getPluginKey(i) === 'transform-modules-commonjs'\n );\n\n if (!hasCommonjsPlugin) {\n plugins.push(require.resolve('@babel/plugin-transform-modules-commonjs'));\n }\n\n if (\n evalConfig.filename?.endsWith('.ts') ||\n evalConfig.filename?.endsWith('.tsx')\n ) {\n const hasTypescriptPlugin = evalConfig.plugins?.some(\n (i) => getPluginKey(i) === 'transform-typescript'\n );\n\n if (!hasTypescriptPlugin) {\n const preset = safeResolve('@babel/preset-typescript', [\n evalConfig.filename,\n ]);\n const plugin = safeResolve('@babel/plugin-transform-typescript', [\n evalConfig.filename,\n preset,\n ]);\n\n if (plugin) {\n plugins.push(plugin);\n }\n }\n }\n\n const transformOptions: TransformOptions = {\n ...evalConfig,\n caller: {\n name: 'wyw-in-js',\n },\n plugins,\n };\n\n const transformed = babel.transformFromAstSync(ast, code, transformOptions);\n\n if (!transformed || !hasShakerMetadata(transformed.metadata)) {\n throw new Error(`${evalConfig.filename} has no shaker metadata`);\n }\n\n return [\n transformed.ast!,\n transformed.code ?? '',\n transformed.metadata.wywEvaluator.imports,\n ];\n};\n\nexport default shaker;\n"],"mappings":"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"}
1
+ {"version":3,"file":"shaker.js","names":["_ShakerMetadata","require","_getPluginKey","hasKeyInList","plugin","list","pluginKey","getPluginKey","some","i","includes","safeResolve","id","paths","resolve","filter","shaker","evalConfig","ast","code","highPriorityPlugins","config","babel","_evalConfig$plugins$f","_evalConfig$plugins","_evalConfig$plugins2","_evalConfig$plugins3","_evalConfig$filename","_evalConfig$filename2","_transformed$code","preShakePlugins","plugins","hasCommonjsPlugin","push","filename","endsWith","_evalConfig$plugins4","hasTypescriptPlugin","preset","transformOptions","caller","name","transformed","transformFromAstSync","hasShakerMetadata","metadata","Error","wywEvaluator","imports","exports","_default","default"],"sources":["../src/shaker.ts"],"sourcesContent":["import type { TransformOptions, PluginItem } from '@babel/core';\n\nimport type { Evaluator } from '@wyw-in-js/shared';\n\nimport { hasShakerMetadata } from './utils/ShakerMetadata';\nimport { getPluginKey } from './utils/getPluginKey';\n\nconst hasKeyInList = (plugin: PluginItem, list: string[]): boolean => {\n const pluginKey = getPluginKey(plugin);\n return pluginKey ? list.some((i) => pluginKey.includes(i)) : false;\n};\n\nconst safeResolve = (id: string, paths: (string | null)[]): string | null => {\n try {\n return require.resolve(id, {\n paths: paths.filter((i) => i !== null) as string[],\n });\n } catch {\n return null;\n }\n};\n\nexport const shaker: Evaluator = (\n evalConfig,\n ast,\n code,\n { highPriorityPlugins, ...config },\n babel\n) => {\n const preShakePlugins =\n evalConfig.plugins?.filter((i) => hasKeyInList(i, highPriorityPlugins)) ??\n [];\n\n const plugins = [\n ...preShakePlugins,\n [require.resolve('./plugins/shaker'), config],\n ...(evalConfig.plugins ?? []).filter(\n (i) => !hasKeyInList(i, highPriorityPlugins)\n ),\n ];\n\n const hasCommonjsPlugin = evalConfig.plugins?.some(\n (i) => getPluginKey(i) === 'transform-modules-commonjs'\n );\n\n if (!hasCommonjsPlugin) {\n plugins.push(require.resolve('@babel/plugin-transform-modules-commonjs'));\n }\n\n if (\n evalConfig.filename?.endsWith('.ts') ||\n evalConfig.filename?.endsWith('.tsx')\n ) {\n const hasTypescriptPlugin = evalConfig.plugins?.some(\n (i) => getPluginKey(i) === 'transform-typescript'\n );\n\n if (!hasTypescriptPlugin) {\n const preset = safeResolve('@babel/preset-typescript', [\n evalConfig.filename,\n ]);\n const plugin = safeResolve('@babel/plugin-transform-typescript', [\n evalConfig.filename,\n preset,\n ]);\n\n if (plugin) {\n plugins.push(plugin);\n }\n }\n }\n\n const transformOptions: TransformOptions = {\n ...evalConfig,\n caller: {\n name: 'wyw-in-js',\n },\n plugins,\n };\n\n const transformed = babel.transformFromAstSync(ast, code, transformOptions);\n\n if (!transformed || !hasShakerMetadata(transformed.metadata)) {\n throw new Error(`${evalConfig.filename} has no shaker metadata`);\n }\n\n return [\n transformed.ast!,\n transformed.code ?? '',\n transformed.metadata.wywEvaluator.imports,\n ];\n};\n\nexport default shaker;\n"],"mappings":"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"}
@@ -22,7 +22,8 @@ function transformUrl(url, outputFilename, sourceFilename, platformPath = _path.
22
22
  }
23
23
  function createStylisPreprocessor(options) {
24
24
  function stylisPreprocess(selector, text) {
25
- return (0, _stylis.serialize)((0, _stylis.compile)(`${selector} {${text}}\n`), (0, _stylis.middleware)([element => {
25
+ const compiled = (0, _stylis.compile)(`${selector} {${text}}\n`);
26
+ return (0, _stylis.serialize)(compiled, (0, _stylis.middleware)([element => {
26
27
  const {
27
28
  outputFilename
28
29
  } = options;
@@ -32,7 +33,7 @@ function createStylisPreprocessor(options) {
32
33
  // eslint-disable-next-line no-param-reassign
33
34
  element.return = element.value.replace(/\b(url\((["']?))(\.[^)]+?)(\2\))/g, (match, p1, p2, p3, p4) => p1 + transformUrl(p3, outputFilename, options.filename) + p4);
34
35
  }
35
- }, _stylis.namespace, _stylis.prefixer, _stylis.stringify]));
36
+ }, _stylis.prefixer, _stylis.stringify]));
36
37
  }
37
38
  return stylisPreprocess;
38
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":["_path","_interopRequireDefault","require","_sourceMap","_stylis","obj","__esModule","default","posixSep","path","posix","sep","transformUrl","url","outputFilename","sourceFilename","platformPath","relative","dirname","resolve","split","join","createStylisPreprocessor","options","stylisPreprocess","selector","text","serialize","compile","middleware","element","type","return","value","replace","match","p1","p2","p3","p4","filename","namespace","prefixer","stringify","extractCssFromAst","rules","originalCode","mappings","cssText","preprocessor","Object","keys","forEach","index","push","generated","line","column","original","start","name","source","atom","cssSourceMapText","length","generator","SourceMapGenerator","file","mapping","addMapping","setSourceContent","toString","extract","services","entrypoint","processors","data","loadedAndParsed","evaluator","Error","allRules","allReplacements","processor","artifacts","artifact","replacements","code"],"sources":["../../../src/transform/generators/extract.ts"],"sourcesContent":["import path from 'path';\n\nimport type { Mapping } from 'source-map';\nimport { SourceMapGenerator } from 'source-map';\nimport {\n compile,\n serialize,\n stringify,\n middleware,\n prefixer,\n namespace,\n} from 'stylis';\n\nimport type { Replacements, Rules } from '@wyw-in-js/shared';\n\nimport type { Options, PreprocessorFn } from '../../types';\nimport type { IExtractAction, SyncScenarioForAction } from '../types';\n\nconst posixSep = path.posix.sep;\n\nexport function transformUrl(\n url: string,\n outputFilename: string,\n sourceFilename: string,\n platformPath: typeof path = path\n) {\n // Replace asset path with new path relative to the output CSS\n const relative = platformPath.relative(\n platformPath.dirname(outputFilename),\n // Get the absolute path to the asset from the path relative to the JS file\n platformPath.resolve(platformPath.dirname(sourceFilename), url)\n );\n\n if (platformPath.sep === posixSep) {\n return relative;\n }\n\n return relative.split(platformPath.sep).join(posixSep);\n}\n\nfunction createStylisPreprocessor(options: Options) {\n function stylisPreprocess(selector: string, text: string): string {\n return serialize(\n compile(`${selector} {${text}}\\n`),\n middleware([\n (element: { return: string; type: string; value: string }) => {\n const { outputFilename } = options;\n if (element.type === 'decl' && outputFilename) {\n // When writing to a file, we need to adjust the relative paths inside url(..) expressions.\n // It'll allow css-loader to resolve an imported asset properly.\n // eslint-disable-next-line no-param-reassign\n element.return = element.value.replace(\n /\\b(url\\(([\"']?))(\\.[^)]+?)(\\2\\))/g,\n (match, p1, p2, p3, p4) =>\n p1 + transformUrl(p3, outputFilename, options.filename) + p4\n );\n }\n },\n namespace,\n prefixer,\n stringify,\n ])\n );\n }\n return stylisPreprocess;\n}\n\nfunction extractCssFromAst(\n rules: Rules,\n originalCode: string,\n options: Pick<Options, 'preprocessor' | 'filename' | 'outputFilename'>\n): { cssSourceMapText: string; cssText: string; rules: Rules } {\n const mappings: Mapping[] = [];\n\n let cssText = '';\n\n let preprocessor: PreprocessorFn;\n if (typeof options.preprocessor === 'function') {\n // eslint-disable-next-line prefer-destructuring\n preprocessor = options.preprocessor;\n } else {\n switch (options.preprocessor) {\n case 'none':\n preprocessor = (selector, text) => `${selector} {${text}}\\n`;\n break;\n case 'stylis':\n default:\n preprocessor = createStylisPreprocessor(options);\n }\n }\n\n Object.keys(rules).forEach((selector, index) => {\n mappings.push({\n generated: {\n line: index + 1,\n column: 0,\n },\n original: rules[selector].start!,\n name: selector,\n source: '',\n });\n\n if (rules[selector].atom) {\n // For atoms, we just directly insert cssText, to give the atomizer full control over the rules\n cssText += `${rules[selector].cssText}\\n`;\n } else {\n // Run each rule through stylis to support nesting\n cssText += `${preprocessor(selector, rules[selector].cssText)}\\n`;\n }\n });\n\n return {\n cssText,\n rules,\n\n get cssSourceMapText() {\n if (mappings?.length) {\n const generator = new SourceMapGenerator({\n file: options.filename.replace(/\\.js$/, '.css'),\n });\n\n mappings.forEach((mapping) =>\n generator.addMapping({ ...mapping, source: options.filename })\n );\n\n generator.setSourceContent(options.filename, originalCode);\n\n return generator.toString();\n }\n\n return '';\n },\n };\n}\n\n/**\n * Extract artifacts (e.g. CSS) from processors\n */\n// eslint-disable-next-line require-yield\nexport function* extract(\n this: IExtractAction\n): SyncScenarioForAction<IExtractAction> {\n const { options } = this.services;\n const { entrypoint } = this;\n const { processors } = this.data;\n const { loadedAndParsed } = entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n throw new Error('entrypoint was ignored');\n }\n\n let allRules: Rules = {};\n const allReplacements: Replacements = [];\n processors.forEach((processor) => {\n processor.artifacts.forEach((artifact) => {\n if (artifact[0] !== 'css') return;\n const [rules, replacements] = artifact[1] as [\n rules: Rules,\n sourceMapReplacements: Replacements,\n ];\n\n allRules = {\n ...allRules,\n ...rules,\n };\n\n allReplacements.push(...replacements);\n });\n });\n\n return {\n ...extractCssFromAst(allRules, loadedAndParsed.code, options),\n replacements: allReplacements,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","names":["_path","_interopRequireDefault","require","_sourceMap","_stylis","obj","__esModule","default","posixSep","path","posix","sep","transformUrl","url","outputFilename","sourceFilename","platformPath","relative","dirname","resolve","split","join","createStylisPreprocessor","options","stylisPreprocess","selector","text","compiled","compile","serialize","middleware","element","type","return","value","replace","match","p1","p2","p3","p4","filename","prefixer","stringify","extractCssFromAst","rules","originalCode","mappings","cssText","preprocessor","Object","keys","forEach","index","push","generated","line","column","original","start","name","source","atom","cssSourceMapText","length","generator","SourceMapGenerator","file","mapping","addMapping","setSourceContent","toString","extract","services","entrypoint","processors","data","loadedAndParsed","evaluator","Error","allRules","allReplacements","processor","artifacts","artifact","replacements","code"],"sources":["../../../src/transform/generators/extract.ts"],"sourcesContent":["import path from 'path';\n\nimport type { Mapping } from 'source-map';\nimport { SourceMapGenerator } from 'source-map';\nimport { compile, serialize, stringify, middleware, prefixer } from 'stylis';\n\nimport type { Replacements, Rules } from '@wyw-in-js/shared';\n\nimport type { Options, PreprocessorFn } from '../../types';\nimport type { IExtractAction, SyncScenarioForAction } from '../types';\n\nconst posixSep = path.posix.sep;\n\nexport function transformUrl(\n url: string,\n outputFilename: string,\n sourceFilename: string,\n platformPath: typeof path = path\n) {\n // Replace asset path with new path relative to the output CSS\n const relative = platformPath.relative(\n platformPath.dirname(outputFilename),\n // Get the absolute path to the asset from the path relative to the JS file\n platformPath.resolve(platformPath.dirname(sourceFilename), url)\n );\n\n if (platformPath.sep === posixSep) {\n return relative;\n }\n\n return relative.split(platformPath.sep).join(posixSep);\n}\n\nfunction createStylisPreprocessor(options: Options) {\n function stylisPreprocess(selector: string, text: string): string {\n const compiled = compile(`${selector} {${text}}\\n`);\n return serialize(\n compiled,\n middleware([\n (element: { return: string; type: string; value: string }) => {\n const { outputFilename } = options;\n if (element.type === 'decl' && outputFilename) {\n // When writing to a file, we need to adjust the relative paths inside url(..) expressions.\n // It'll allow css-loader to resolve an imported asset properly.\n // eslint-disable-next-line no-param-reassign\n element.return = element.value.replace(\n /\\b(url\\(([\"']?))(\\.[^)]+?)(\\2\\))/g,\n (match, p1, p2, p3, p4) =>\n p1 + transformUrl(p3, outputFilename, options.filename) + p4\n );\n }\n },\n prefixer,\n stringify,\n ])\n );\n }\n return stylisPreprocess;\n}\n\nfunction extractCssFromAst(\n rules: Rules,\n originalCode: string,\n options: Pick<Options, 'preprocessor' | 'filename' | 'outputFilename'>\n): { cssSourceMapText: string; cssText: string; rules: Rules } {\n const mappings: Mapping[] = [];\n\n let cssText = '';\n\n let preprocessor: PreprocessorFn;\n if (typeof options.preprocessor === 'function') {\n // eslint-disable-next-line prefer-destructuring\n preprocessor = options.preprocessor;\n } else {\n switch (options.preprocessor) {\n case 'none':\n preprocessor = (selector, text) => `${selector} {${text}}\\n`;\n break;\n case 'stylis':\n default:\n preprocessor = createStylisPreprocessor(options);\n }\n }\n\n Object.keys(rules).forEach((selector, index) => {\n mappings.push({\n generated: {\n line: index + 1,\n column: 0,\n },\n original: rules[selector].start!,\n name: selector,\n source: '',\n });\n\n if (rules[selector].atom) {\n // For atoms, we just directly insert cssText, to give the atomizer full control over the rules\n cssText += `${rules[selector].cssText}\\n`;\n } else {\n // Run each rule through stylis to support nesting\n cssText += `${preprocessor(selector, rules[selector].cssText)}\\n`;\n }\n });\n\n return {\n cssText,\n rules,\n\n get cssSourceMapText() {\n if (mappings?.length) {\n const generator = new SourceMapGenerator({\n file: options.filename.replace(/\\.js$/, '.css'),\n });\n\n mappings.forEach((mapping) =>\n generator.addMapping({ ...mapping, source: options.filename })\n );\n\n generator.setSourceContent(options.filename, originalCode);\n\n return generator.toString();\n }\n\n return '';\n },\n };\n}\n\n/**\n * Extract artifacts (e.g. CSS) from processors\n */\n// eslint-disable-next-line require-yield\nexport function* extract(\n this: IExtractAction\n): SyncScenarioForAction<IExtractAction> {\n const { options } = this.services;\n const { entrypoint } = this;\n const { processors } = this.data;\n const { loadedAndParsed } = entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n throw new Error('entrypoint was ignored');\n }\n\n let allRules: Rules = {};\n const allReplacements: Replacements = [];\n processors.forEach((processor) => {\n processor.artifacts.forEach((artifact) => {\n if (artifact[0] !== 'css') return;\n const [rules, replacements] = artifact[1] as [\n rules: Rules,\n sourceMapReplacements: Replacements,\n ];\n\n allRules = {\n ...allRules,\n ...rules,\n };\n\n allReplacements.push(...replacements);\n });\n });\n\n return {\n ...extractCssFromAst(allRules, loadedAndParsed.code, options),\n replacements: allReplacements,\n };\n}\n"],"mappings":"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"}
@@ -64,6 +64,7 @@ const prepareCode = (services, item, originalAst) => {
64
64
  }
65
65
  log('[preeval] metadata %O', transformMetadata);
66
66
  log('[evaluator:start] using %s', evaluator.name);
67
+ log.extend('source')('%s', preevalStageResult.code);
67
68
  const evaluatorConfig = {
68
69
  onlyExports: only,
69
70
  highPriorityPlugins: pluginOptions.highPriorityPlugins,
@@ -1 +1 @@
1
- {"version":3,"file":"transform.js","names":["_buildOptions","require","_TransformMetadata","_getPluginKey","EMPTY_FILE","hasKeyInList","plugin","list","pluginKey","getPluginKey","some","i","includes","runPreevalStage","babel","evalConfig","pluginOptions","code","originalAst","eventEmitter","_evalConfig$plugins$f","_evalConfig$plugins","_evalConfig$plugins2","_result$ast","preShakePlugins","plugins","filter","highPriorityPlugins","resolve","transformConfig","buildOptions","envName","result","transformFromAstSync","ast","program","Error","prepareCode","services","item","log","only","loadedAndParsed","evaluator","_loadedAndParsed$code","options","preevalStageResult","perf","transformMetadata","getTransformMetadata","metadata","length","name","evaluatorConfig","onlyExports","features","transformedCode","imports","exports","internalTransform","prepareFn","entrypoint","_loadedAndParsed$code2","preparedCode","extend","_loadedAndParsed$code3","size","resolvedImports","getNext","resolved","transform","call"],"sources":["../../../src/transform/generators/transform.ts"],"sourcesContent":["import type {\n BabelFileResult,\n PluginItem,\n TransformOptions,\n} from '@babel/core';\nimport type { File } from '@babel/types';\n\nimport type { EvaluatorConfig, StrictOptions } from '@wyw-in-js/shared';\n\nimport type { Core } from '../../babel';\nimport { buildOptions } from '../../options/buildOptions';\nimport type { EventEmitter } from '../../utils/EventEmitter';\nimport type { WYWTransformMetadata } from '../../utils/TransformMetadata';\nimport { getTransformMetadata } from '../../utils/TransformMetadata';\nimport { getPluginKey } from '../../utils/getPluginKey';\nimport type { Entrypoint } from '../Entrypoint';\nimport type {\n ITransformAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\nconst EMPTY_FILE = '=== empty file ===';\n\nconst hasKeyInList = (plugin: PluginItem, list: string[]): boolean => {\n const pluginKey = getPluginKey(plugin);\n return pluginKey ? list.some((i) => pluginKey.includes(i)) : false;\n};\n\nfunction runPreevalStage(\n babel: Core,\n evalConfig: TransformOptions,\n pluginOptions: StrictOptions,\n code: string,\n originalAst: File,\n eventEmitter: EventEmitter\n): BabelFileResult {\n const preShakePlugins =\n evalConfig.plugins?.filter((i) =>\n hasKeyInList(i, pluginOptions.highPriorityPlugins)\n ) ?? [];\n\n const plugins = [\n ...preShakePlugins,\n [\n require.resolve('../../plugins/preeval'),\n { ...pluginOptions, eventEmitter },\n ],\n [require.resolve('../../plugins/dynamic-import')],\n ...(evalConfig.plugins ?? []).filter(\n (i) => !hasKeyInList(i, pluginOptions.highPriorityPlugins)\n ),\n ];\n\n const transformConfig = buildOptions({\n ...evalConfig,\n envName: 'wyw-in-js',\n plugins,\n });\n\n const result = babel.transformFromAstSync(originalAst, code, transformConfig);\n\n if (!result || !result.ast?.program) {\n throw new Error('Babel transform failed');\n }\n\n return result;\n}\n\ntype PrepareCodeFn = (\n services: Services,\n item: Entrypoint,\n originalAst: File\n) => [\n code: string,\n imports: Map<string, string[]> | null,\n metadata: WYWTransformMetadata | null,\n];\n\nexport const prepareCode = (\n services: Services,\n item: Entrypoint,\n originalAst: File\n): ReturnType<PrepareCodeFn> => {\n const { log, only, loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const { code, evalConfig, evaluator } = loadedAndParsed;\n const { options, babel, eventEmitter } = services;\n const { pluginOptions } = options;\n\n const preevalStageResult = eventEmitter.perf('transform:preeval', () =>\n runPreevalStage(\n babel,\n evalConfig,\n pluginOptions,\n code,\n originalAst,\n eventEmitter\n )\n );\n\n const transformMetadata = getTransformMetadata(preevalStageResult.metadata);\n\n if (only.length === 1 && only[0] === '__wywPreval' && !transformMetadata) {\n log('[evaluator:end] no metadata');\n return [preevalStageResult.code!, null, null];\n }\n\n log('[preeval] metadata %O', transformMetadata);\n log('[evaluator:start] using %s', evaluator.name);\n\n const evaluatorConfig: EvaluatorConfig = {\n onlyExports: only,\n highPriorityPlugins: pluginOptions.highPriorityPlugins,\n features: pluginOptions.features,\n };\n\n const [, transformedCode, imports] = eventEmitter.perf(\n 'transform:evaluator',\n () =>\n evaluator(\n evalConfig,\n preevalStageResult.ast!,\n preevalStageResult.code!,\n evaluatorConfig,\n babel\n )\n );\n\n log('[evaluator:end]');\n\n return [transformedCode, imports, transformMetadata ?? null];\n};\n\nexport function* internalTransform(\n this: ITransformAction,\n prepareFn: PrepareCodeFn\n): SyncScenarioForAction<ITransformAction> {\n const { only, loadedAndParsed, log } = this.entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n log('>> (%o)', only);\n\n const [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n loadedAndParsed.ast\n );\n\n if (loadedAndParsed.code === preparedCode) {\n log('<< (%o)\\n === no changes ===', only);\n } else {\n log('<< (%o)', only);\n log.extend('source')('%s', preparedCode || EMPTY_FILE);\n }\n\n if (preparedCode === '') {\n log('is skipped');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n if (imports !== null && imports.size > 0) {\n const resolvedImports = yield* this.getNext(\n 'resolveImports',\n this.entrypoint,\n {\n imports,\n }\n );\n\n if (resolvedImports.length !== 0) {\n yield [\n 'processImports',\n this.entrypoint,\n {\n resolved: resolvedImports,\n },\n ];\n }\n }\n\n return {\n code: preparedCode,\n metadata,\n };\n}\n\n/**\n * Prepares the code for evaluation. This includes removing dead and potentially unsafe code.\n * Emits resolveImports and processImports events.\n */\nexport function transform(this: ITransformAction) {\n return internalTransform.call(this, prepareCode);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transform.js","names":["_buildOptions","require","_TransformMetadata","_getPluginKey","EMPTY_FILE","hasKeyInList","plugin","list","pluginKey","getPluginKey","some","i","includes","runPreevalStage","babel","evalConfig","pluginOptions","code","originalAst","eventEmitter","_evalConfig$plugins$f","_evalConfig$plugins","_evalConfig$plugins2","_result$ast","preShakePlugins","plugins","filter","highPriorityPlugins","resolve","transformConfig","buildOptions","envName","result","transformFromAstSync","ast","program","Error","prepareCode","services","item","log","only","loadedAndParsed","evaluator","_loadedAndParsed$code","options","preevalStageResult","perf","transformMetadata","getTransformMetadata","metadata","length","name","extend","evaluatorConfig","onlyExports","features","transformedCode","imports","exports","internalTransform","prepareFn","entrypoint","_loadedAndParsed$code2","preparedCode","_loadedAndParsed$code3","size","resolvedImports","getNext","resolved","transform","call"],"sources":["../../../src/transform/generators/transform.ts"],"sourcesContent":["import type {\n BabelFileResult,\n PluginItem,\n TransformOptions,\n} from '@babel/core';\nimport type { File } from '@babel/types';\n\nimport type { EvaluatorConfig, StrictOptions } from '@wyw-in-js/shared';\n\nimport type { Core } from '../../babel';\nimport { buildOptions } from '../../options/buildOptions';\nimport type { EventEmitter } from '../../utils/EventEmitter';\nimport type { WYWTransformMetadata } from '../../utils/TransformMetadata';\nimport { getTransformMetadata } from '../../utils/TransformMetadata';\nimport { getPluginKey } from '../../utils/getPluginKey';\nimport type { Entrypoint } from '../Entrypoint';\nimport type {\n ITransformAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\nconst EMPTY_FILE = '=== empty file ===';\n\nconst hasKeyInList = (plugin: PluginItem, list: string[]): boolean => {\n const pluginKey = getPluginKey(plugin);\n return pluginKey ? list.some((i) => pluginKey.includes(i)) : false;\n};\n\nfunction runPreevalStage(\n babel: Core,\n evalConfig: TransformOptions,\n pluginOptions: StrictOptions,\n code: string,\n originalAst: File,\n eventEmitter: EventEmitter\n): BabelFileResult {\n const preShakePlugins =\n evalConfig.plugins?.filter((i) =>\n hasKeyInList(i, pluginOptions.highPriorityPlugins)\n ) ?? [];\n\n const plugins = [\n ...preShakePlugins,\n [\n require.resolve('../../plugins/preeval'),\n { ...pluginOptions, eventEmitter },\n ],\n [require.resolve('../../plugins/dynamic-import')],\n ...(evalConfig.plugins ?? []).filter(\n (i) => !hasKeyInList(i, pluginOptions.highPriorityPlugins)\n ),\n ];\n\n const transformConfig = buildOptions({\n ...evalConfig,\n envName: 'wyw-in-js',\n plugins,\n });\n\n const result = babel.transformFromAstSync(originalAst, code, transformConfig);\n\n if (!result || !result.ast?.program) {\n throw new Error('Babel transform failed');\n }\n\n return result;\n}\n\ntype PrepareCodeFn = (\n services: Services,\n item: Entrypoint,\n originalAst: File\n) => [\n code: string,\n imports: Map<string, string[]> | null,\n metadata: WYWTransformMetadata | null,\n];\n\nexport const prepareCode = (\n services: Services,\n item: Entrypoint,\n originalAst: File\n): ReturnType<PrepareCodeFn> => {\n const { log, only, loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const { code, evalConfig, evaluator } = loadedAndParsed;\n const { options, babel, eventEmitter } = services;\n const { pluginOptions } = options;\n\n const preevalStageResult = eventEmitter.perf('transform:preeval', () =>\n runPreevalStage(\n babel,\n evalConfig,\n pluginOptions,\n code,\n originalAst,\n eventEmitter\n )\n );\n\n const transformMetadata = getTransformMetadata(preevalStageResult.metadata);\n\n if (only.length === 1 && only[0] === '__wywPreval' && !transformMetadata) {\n log('[evaluator:end] no metadata');\n return [preevalStageResult.code!, null, null];\n }\n\n log('[preeval] metadata %O', transformMetadata);\n log('[evaluator:start] using %s', evaluator.name);\n log.extend('source')('%s', preevalStageResult.code!);\n\n const evaluatorConfig: EvaluatorConfig = {\n onlyExports: only,\n highPriorityPlugins: pluginOptions.highPriorityPlugins,\n features: pluginOptions.features,\n };\n\n const [, transformedCode, imports] = eventEmitter.perf(\n 'transform:evaluator',\n () =>\n evaluator(\n evalConfig,\n preevalStageResult.ast!,\n preevalStageResult.code!,\n evaluatorConfig,\n babel\n )\n );\n\n log('[evaluator:end]');\n\n return [transformedCode, imports, transformMetadata ?? null];\n};\n\nexport function* internalTransform(\n this: ITransformAction,\n prepareFn: PrepareCodeFn\n): SyncScenarioForAction<ITransformAction> {\n const { only, loadedAndParsed, log } = this.entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n log('>> (%o)', only);\n\n const [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n loadedAndParsed.ast\n );\n\n if (loadedAndParsed.code === preparedCode) {\n log('<< (%o)\\n === no changes ===', only);\n } else {\n log('<< (%o)', only);\n log.extend('source')('%s', preparedCode || EMPTY_FILE);\n }\n\n if (preparedCode === '') {\n log('is skipped');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n if (imports !== null && imports.size > 0) {\n const resolvedImports = yield* this.getNext(\n 'resolveImports',\n this.entrypoint,\n {\n imports,\n }\n );\n\n if (resolvedImports.length !== 0) {\n yield [\n 'processImports',\n this.entrypoint,\n {\n resolved: resolvedImports,\n },\n ];\n }\n }\n\n return {\n code: preparedCode,\n metadata,\n };\n}\n\n/**\n * Prepares the code for evaluation. This includes removing dead and potentially unsafe code.\n * Emits resolveImports and processImports events.\n */\nexport function transform(this: ITransformAction) {\n return internalTransform.call(this, prepareCode);\n}\n"],"mappings":"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"}