@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":["_types","require","_findIdentifiers","_getScope","_isNotNull","_isRemoved","validateField","node","key","val","field","validate","optional","getBinding","path","binding","getScope","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","nonType","dereferenceAll","findIdentifiers","map","identifierPath","isNotNull","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","isRemoved","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","NODE_FIELDS","referenceEnums","program","traverse","ExpressionStatement","expressionStatement","expression","callee","args","arg","fixed","removeUnreferenced","items","Set","item","hasReferences","forDeleting","identifier","removeWithRelated","result","sort","a","b","_a$node","_b$node","localeCompare","getNodeForValue","staticEvaluate","evaluated","evaluate","confident","applyAction","test","isBooleanLiteral","consequent","mutate","remove","replaceWith","paths","rootPath","getProgramParent","actions","affectedPaths","referencedIdentifiers","_a$node2","_b$node2","referencesOfBinding","_ref","reduce","acc","ref","isExportDefaultDeclaration","clean","_i$node","join","_i$node2","fn","dereferenced","mutated","dead","assignments","assignment","declared","Object","values","getOuterBindingIdentifiers","init","_assignment$parentPat","_scope$getBinding","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":["_types","require","_findIdentifiers","_getScope","_isNotNull","_isRemoved","validateField","node","key","val","field","validate","optional","getBinding","path","binding","getScope","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","nonType","dereferenceAll","findIdentifiers","map","identifierPath","isNotNull","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","isRemoved","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","NODE_FIELDS","referenceEnums","program","traverse","ExpressionStatement","expressionStatement","expression","callee","args","arg","fixed","removeUnreferenced","items","Set","item","hasReferences","forDeleting","identifier","removeWithRelated","result","sort","a","b","_a$node","_b$node","localeCompare","getNodeForValue","staticEvaluate","evaluated","evaluate","confident","applyAction","test","isBooleanLiteral","consequent","mutate","remove","replaceWith","paths","rootPath","getProgramParent","actions","affectedPaths","referencedIdentifiers","_a$node2","_b$node2","referencesOfBinding","_ref","reduce","acc","ref","isExportDefaultDeclaration","clean","_i$node","join","_i$node2","fn","dereferenced","mutated","dead","assignments","assignment","declared","Object","values","getOuterBindingIdentifiers","_assignment$parentPat","_scope$getBinding","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wyw-in-js/transform",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "dependencies": {
5
5
  "@babel/core": "^7.23.5",
6
6
  "@babel/generator": "^7.23.5",
@@ -15,8 +15,8 @@
15
15
  "source-map": "^0.7.4",
16
16
  "stylis": "^4.3.0",
17
17
  "ts-invariant": "^0.10.3",
18
- "@wyw-in-js/processor-utils": "0.2.1",
19
- "@wyw-in-js/shared": "0.2.1"
18
+ "@wyw-in-js/processor-utils": "0.2.2",
19
+ "@wyw-in-js/shared": "0.2.2"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@babel/plugin-syntax-typescript": "^7.23.3",
@@ -37,10 +37,10 @@
37
37
  "glob": "^10.3.10",
38
38
  "strip-ansi": "^5.2.0",
39
39
  "typescript": "^5.2.2",
40
- "@wyw-in-js/babel-config": "0.2.1",
41
- "@wyw-in-js/eslint-config": "0.2.1",
42
- "@wyw-in-js/jest-preset": "0.2.1",
43
- "@wyw-in-js/ts-config": "0.2.1"
40
+ "@wyw-in-js/babel-config": "0.2.2",
41
+ "@wyw-in-js/eslint-config": "0.2.2",
42
+ "@wyw-in-js/jest-preset": "0.2.2",
43
+ "@wyw-in-js/ts-config": "0.2.2"
44
44
  },
45
45
  "engines": {
46
46
  "node": ">=16.0.0"
@@ -59,24 +59,29 @@ function rearrangeExports({ types: t }, root, exportRefs, exports) {
59
59
  t.variableDeclaration('var', [t.variableDeclarator(t.identifier(uid))]),
60
60
  ]);
61
61
  rootScope.registerDeclaration(declaration);
62
+ const constantViolations = [];
62
63
  // Replace every reference with defined variable
63
64
  refs.forEach((ref) => {
64
65
  const [replaced] = ref.replaceWith(t.identifier(uid));
65
66
  if (replaced.isBindingIdentifier()) {
66
- rootScope.registerConstantViolation(replaced);
67
- if (replaced.parentPath?.parentPath?.isVariableDeclarator()) {
68
- // This is `const foo = exports.foo = "value"` case
69
- (0, scopeHelpers_1.reference)(replaced, replaced, true);
70
- }
67
+ constantViolations.push(replaced);
71
68
  }
72
69
  else {
73
70
  (0, scopeHelpers_1.reference)(replaced);
74
71
  }
75
72
  });
76
- // Assign defined variable to the export
77
- const [pushed] = root.pushContainer('body', [
78
- t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('exports'), t.identifier(name)), t.identifier(uid))),
79
- ]);
73
+ constantViolations.forEach((id) => {
74
+ rootScope.registerConstantViolation(id);
75
+ });
76
+ const assigmentToExport = t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('exports'), t.identifier(name)), t.identifier(uid)));
77
+ // export.foo = _foo will be inserted either after the last _foo assigment or in the end of the file
78
+ const body = root.get('body');
79
+ const lastViolation = constantViolations[constantViolations.length - 1] ??
80
+ body[body.length - 1];
81
+ const pathInRoot = root
82
+ .get('body')
83
+ .find((n) => lastViolation.isDescendant(n));
84
+ const [pushed] = pathInRoot.insertAfter(assigmentToExport);
80
85
  const local = pushed.get('expression.right');
81
86
  (0, scopeHelpers_1.reference)(local);
82
87
  rearranged[name] = local;
@@ -253,6 +258,15 @@ function shakerPlugin(babel, { keepSideEffects = false, ifUnknownExport = 'skip-
253
258
  }
254
259
  });
255
260
  dereferenced = [];
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() &&
265
+ !forDeleting.includes(binding.path.get('id'))) {
266
+ forDeleting.push(binding.path.get('id'));
267
+ changed = true;
268
+ }
269
+ }
256
270
  }
257
271
  }
258
272
  this.imports = withoutRemoved(collected.imports);
package/types/shaker.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import type { Evaluator } from '@wyw-in-js/shared';
2
- declare const shaker: Evaluator;
2
+ export declare const shaker: Evaluator;
3
3
  export default shaker;
package/types/shaker.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shaker = void 0;
3
4
  const ShakerMetadata_1 = require("./utils/ShakerMetadata");
4
5
  const getPluginKey_1 = require("./utils/getPluginKey");
5
6
  const hasKeyInList = (plugin, list) => {
@@ -61,4 +62,5 @@ const shaker = (evalConfig, ast, code, { highPriorityPlugins, ...config }, babel
61
62
  transformed.metadata.wywEvaluator.imports,
62
63
  ];
63
64
  };
64
- exports.default = shaker;
65
+ exports.shaker = shaker;
66
+ exports.default = exports.shaker;
@@ -21,7 +21,8 @@ function transformUrl(url, outputFilename, sourceFilename, platformPath = path_1
21
21
  exports.transformUrl = transformUrl;
22
22
  function createStylisPreprocessor(options) {
23
23
  function stylisPreprocess(selector, text) {
24
- return (0, stylis_1.serialize)((0, stylis_1.compile)(`${selector} {${text}}\n`), (0, stylis_1.middleware)([
24
+ const compiled = (0, stylis_1.compile)(`${selector} {${text}}\n`);
25
+ return (0, stylis_1.serialize)(compiled, (0, stylis_1.middleware)([
25
26
  (element) => {
26
27
  const { outputFilename } = options;
27
28
  if (element.type === 'decl' && outputFilename) {
@@ -31,7 +32,6 @@ function createStylisPreprocessor(options) {
31
32
  element.return = element.value.replace(/\b(url\((["']?))(\.[^)]+?)(\2\))/g, (match, p1, p2, p3, p4) => p1 + transformUrl(p3, outputFilename, options.filename) + p4);
32
33
  }
33
34
  },
34
- stylis_1.namespace,
35
35
  stylis_1.prefixer,
36
36
  stylis_1.stringify,
37
37
  ]));
@@ -48,6 +48,7 @@ const prepareCode = (services, item, originalAst) => {
48
48
  }
49
49
  log('[preeval] metadata %O', transformMetadata);
50
50
  log('[evaluator:start] using %s', evaluator.name);
51
+ log.extend('source')('%s', preevalStageResult.code);
51
52
  const evaluatorConfig = {
52
53
  onlyExports: only,
53
54
  highPriorityPlugins: pluginOptions.highPriorityPlugins,
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.loadWywOptions = void 0;
7
4
  const cosmiconfig_1 = require("cosmiconfig");
8
- const shaker_1 = __importDefault(require("../../shaker"));
5
+ const shaker_1 = require("../../shaker");
9
6
  const searchPlaces = [
10
7
  `.wyw-in-jsrc`,
11
8
  `.wyw-in-jsrc.json`,
@@ -51,7 +48,7 @@ function loadWywOptions(overrides = defaultOverrides) {
51
48
  extensions: ['.cjs', '.cts', '.js', '.jsx', '.mjs', '.mts', '.ts', '.tsx'],
52
49
  rules: rules ?? [
53
50
  {
54
- action: shaker_1.default,
51
+ action: shaker_1.shaker,
55
52
  },
56
53
  {
57
54
  // The old `ignore` option is used as a default value for `ignore` rule.
@@ -67,7 +64,7 @@ function loadWywOptions(overrides = defaultOverrides) {
67
64
  // If a file contains `export` or `import` keywords, we assume it's an ES-module
68
65
  return /(?:^|\*\/|;|})\s*(?:export|import)[\s{]/m.test(code);
69
66
  },
70
- action: shaker_1.default,
67
+ action: shaker_1.shaker,
71
68
  },
72
69
  ],
73
70
  babelOptions,
@@ -546,6 +546,13 @@ function addExport(path, exported, state) {
546
546
  state.exports[exported] = path;
547
547
  }
548
548
  }
549
+ const saveRef = (state, exportName, memberExpression) => {
550
+ // Save all export.____ usages for later
551
+ if (!state.exportRefs.has(exportName)) {
552
+ state.exportRefs.set(exportName, []);
553
+ }
554
+ state.exportRefs.get(exportName).push(memberExpression);
555
+ };
549
556
  function collectFromExports(path, state) {
550
557
  if (!(0, isExports_1.isExports)(path))
551
558
  return;
@@ -557,19 +564,12 @@ function collectFromExports(path, state) {
557
564
  return;
558
565
  }
559
566
  const exportName = property.node.name;
560
- const saveRef = () => {
561
- // Save all export.____ usages for later
562
- if (!state.exportRefs.has(exportName)) {
563
- state.exportRefs.set(exportName, []);
564
- }
565
- state.exportRefs.get(exportName).push(memberExpression);
566
- };
567
567
  const assignmentExpression = memberExpression.parentPath;
568
568
  if (!assignmentExpression.isAssignmentExpression({
569
569
  left: memberExpression.node,
570
570
  })) {
571
571
  // If it's not `exports.prop = …`. Just save it.
572
- saveRef();
572
+ saveRef(state, exportName, memberExpression);
573
573
  return;
574
574
  }
575
575
  const right = assignmentExpression.get('right');
@@ -582,7 +582,7 @@ function collectFromExports(path, state) {
582
582
  state.isEsModule = true;
583
583
  return;
584
584
  }
585
- saveRef();
585
+ saveRef(state, exportName, memberExpression);
586
586
  // eslint-disable-next-line no-param-reassign
587
587
  state.exports[property.node.name] = right;
588
588
  return;
@@ -838,7 +838,8 @@ function collectFromAssignmentExpression(path, state) {
838
838
  const left = path.get('left');
839
839
  const right = path.get('right');
840
840
  let exported;
841
- if (left.isMemberExpression() && (0, isExports_1.isExports)(left.get('object'))) {
841
+ const isExportRef = left.isMemberExpression() && (0, isExports_1.isExports)(left.get('object'));
842
+ if (isExportRef) {
842
843
  const property = left.get('property');
843
844
  if (!left.node.computed && property.isIdentifier()) {
844
845
  exported = property.node.name;
@@ -872,6 +873,9 @@ function collectFromAssignmentExpression(path, state) {
872
873
  // eslint-disable-next-line no-param-reassign
873
874
  state.exports[exported] = right;
874
875
  }
876
+ if (isExportRef) {
877
+ saveRef(state, exported, left);
878
+ }
875
879
  path.skip();
876
880
  return;
877
881
  }
@@ -258,6 +258,10 @@ function findActionForNode(path) {
258
258
  ];
259
259
  }
260
260
  if (parent.isAssignmentExpression()) {
261
+ if (path.isAssignmentExpression()) {
262
+ // `foo = bar = 42` should be replaced with `foo = 42`
263
+ return ['replace', path, path.node.right];
264
+ }
261
265
  return findActionForNode(parent);
262
266
  }
263
267
  if (parent.isCallExpression()) {
@@ -295,6 +299,15 @@ function findActionForNode(path) {
295
299
  }
296
300
  }
297
301
  if (parent.isVariableDeclarator()) {
302
+ if (path.key === 'init' && path.isAssignmentExpression()) {
303
+ // We are removing `bar` in `var foo = bar = 42`. Path should be replaced with `var foo = 42`
304
+ return ['replace', path, path.node.right];
305
+ }
306
+ const init = parent.get('init');
307
+ if (path.key === 'id' && init.isAssignmentExpression()) {
308
+ // We are removing `foo` in `var foo = bar = 42`. Ignore it.
309
+ return null;
310
+ }
298
311
  return findActionForNode(parent);
299
312
  }
300
313
  if (parent.isExportNamedDeclaration() &&