Launch Week Day 2: Introducing Reports: An Extensible Reporting Framework for Socket Data.Learn More
Socket
Book a DemoSign in
Socket

@linaria/utils

Package Overview
Dependencies
Maintainers
4
Versions
29
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@linaria/utils - npm Package Compare versions

Comparing version
4.2.3
to
4.2.4
+66
-52
esm/scopeHelpers.js

@@ -83,23 +83,40 @@ /* eslint-disable no-restricted-syntax */

const deletingNodes = new WeakSet();
export function findParentForDelete(path) {
const isEmptyList = list => list.length === 0 || list.every(i => deletingNodes.has(i));
const getPathFromAction = action => {
if (!Array.isArray(action)) {
return action;
}
if (action[0] === 'replace' || action[0] === 'remove') {
return action[1];
}
throw new Error(`Unknown action type: ${action[0]}`);
};
export function findActionForNode(path) {
if (isRemoved(path)) return null;
deletingNodes.add(path);
const parent = path.parentPath;
if (!parent) return path;
if (!parent) return ['remove', path];
if (parent.isProgram()) {
// Do not delete Program node
return path;
return ['remove', path];
}
if (parent.isFunction() && path.listKey === 'params') {
// Do not remove params of functions
return null;
}
if (parent.isLogicalExpression({
operator: '&&'
})) {
mutate(parent, p => {
p.replaceWith({
type: 'BooleanLiteral',
value: false
});
});
return null;
return ['replace', parent, {
type: 'BooleanLiteral',
value: false
}];
}

@@ -117,25 +134,22 @@

if (maybeDefineProperty?.isCallExpression() && maybeDefineProperty.get('callee').matchesPattern('Object.defineProperty')) {
return findParentForDelete(maybeDefineProperty);
return findActionForNode(maybeDefineProperty);
}
}
return findParentForDelete(parent);
return findActionForNode(parent);
}
if (parent.isTemplateLiteral()) {
mutate(path, p => {
p.replaceWith({
type: 'StringLiteral',
value: ''
});
});
return null;
return ['replace', path, {
type: 'StringLiteral',
value: ''
}];
}
if (parent.isAssignmentExpression()) {
return findParentForDelete(parent);
return findActionForNode(parent);
}
if (parent.isCallExpression()) {
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -146,3 +160,3 @@

})) {
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -153,3 +167,3 @@

}) || parent.isFunctionDeclaration() || parent.isObjectMethod() || parent.isClassMethod()) {
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -160,4 +174,4 @@

if (body.length === 1) {
return findParentForDelete(parent);
if (isEmptyList(body)) {
return findActionForNode(parent);
}

@@ -172,3 +186,3 @@

// It's `if (…) return …`, we can remove it.
return findParentForDelete(prevStatement);
return findActionForNode(prevStatement);
}

@@ -178,3 +192,3 @@ } else if (body.slice(1).every(statement => deletingNodes.has(statement))) {

// are marked for deletion, we can remove the whole block.
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -185,7 +199,7 @@ }

if (parent.isVariableDeclarator()) {
return findParentForDelete(parent);
return findActionForNode(parent);
}
if (parent.isExportNamedDeclaration() && (parent.node.specifiers.length === 1 && parent.node.specifiers[0] === path.node || parent.node.declaration === path.node)) {
return findParentForDelete(parent);
if (parent.isExportNamedDeclaration() && (path.key === 'specifiers' && isEmptyList(parent.get('specifiers')) || path.key === 'declaration' && parent.node.declaration === path.node)) {
return findActionForNode(parent);
}

@@ -197,4 +211,4 @@

if (list.length === 1) {
return findParentForDelete(parent);
if (isEmptyList(list)) {
return findActionForNode(parent);
}

@@ -205,3 +219,3 @@ }

if (parent.isTryStatement()) {
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -214,3 +228,3 @@

// The parent node isn't valid without this field, so we should remove it also.
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -221,7 +235,7 @@ }

if (path.key === key && parent.get(key) === path) {
return findParentForDelete(parent);
return findActionForNode(parent);
}
}
return path;
return ['remove', path];
} // @babel/preset-typescript transpiles enums, but doesn't reference used identifiers.

@@ -270,3 +284,3 @@

const forDeleting = [binding.path, ...binding.constantViolations].map(i => findParentForDelete(i)).filter(isNotNull);
const forDeleting = [binding.path, ...binding.constantViolations].map(findActionForNode).filter(isNotNull).map(getPathFromAction);
if (forDeleting.length === 0) return;

@@ -294,20 +308,20 @@ findIdentifiers(forDeleting).forEach(identifier => {

let clean = false;
let referencedIdentifiers = [];
const declared = [];
paths.forEach(path => {
const deletingPath = findParentForDelete(path);
if (!deletingPath) return;
referencedIdentifiers.push(...findIdentifiers([deletingPath], 'referenced'));
declared.push(...findIdentifiers([deletingPath], 'binding').map(i => getScope(i).getBinding(i.node.name)));
mutate(deletingPath, p => {
if (!isRemoved(p)) p.remove();
const actions = paths.map(findActionForNode).filter(isNotNull);
const affectedPaths = actions.map(getPathFromAction);
let referencedIdentifiers = findIdentifiers(affectedPaths, 'referenced');
const referencesOfBinding = findIdentifiers(affectedPaths, 'binding').map(i => (i.node && getScope(i).getBinding(i.node.name)) ?? null).filter(isNotNull).reduce((acc, i) => [...acc, ...i.referencePaths.filter(nonType)], []);
actions.forEach(action => {
mutate(action[1], p => {
if (isRemoved(p)) return;
if (action[0] === 'remove') {
p.remove();
} else if (action[0] === 'replace') {
p.replaceWith(action[2]);
}
});
});
if (declared.length > 0) {
removeWithRelated(declared.reduce((acc, i) => [...acc, ...i.referencePaths.filter(nonType)], []));
}
removeWithRelated(referencesOfBinding);
referencedIdentifiers.sort((a, b) => a.node?.name.localeCompare(b.node?.name));
let clean = false;

@@ -314,0 +328,0 @@ while (!clean && referencedIdentifiers.length > 0) {

@@ -1,1 +0,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","references","push","isReferenced","kind","some","i","find","ancestor","isTSType","isFlowType","dereference","filter","length","dereferenceAll","map","identifierPath","referenceAll","forEach","deletingNodes","WeakSet","findParentForDelete","add","parent","parentPath","isProgram","isLogicalExpression","operator","mutate","p","replaceWith","type","value","isObjectProperty","get","isIdentifier","maybeDefineProperty","isCallExpression","matchesPattern","isTemplateLiteral","isAssignmentExpression","isForInStatement","left","isFunctionExpression","body","isFunctionDeclaration","isObjectMethod","isClassMethod","isBlockStatement","listKey","prevStatement","isIfStatement","isReturnStatement","slice","every","statement","has","isVariableDeclarator","isExportNamedDeclaration","specifiers","declaration","list","isTryStatement","referenceEnums","program","traverse","ExpressionStatement","expressionStatement","expression","callee","args","arg","fixed","removeUnreferenced","items","Set","item","hasReferences","forDeleting","constantViolations","identifier","removeWithRelated","result","sort","a","b","localeCompare","paths","rootPath","getProgramParent","clean","referencedIdentifiers","declared","deletingPath","remove","reduce","acc","join","fn","dereferenced","mutated","dead","assignments","assignment","scope","Object","values","getOuterBindingIdentifiers","Identifier","isArrayPattern","elements"],"sources":["../src/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 Node,\n Identifier,\n JSXIdentifier,\n Program,\n FieldOptions,\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.references += 1;\n binding.referencePaths.push(referencePath ?? path);\n}\n\nfunction isReferenced(binding: Binding) {\n if (!binding.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 ((binding.kind as string) === 'param') {\n return true;\n }\n\n // If all remaining references are in TS/Flow types, binding is unreferenced\n return binding.referencePaths.some(\n (i) => !i.find((ancestor) => ancestor.isTSType() || ancestor.isFlowType())\n );\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 if (!binding.referencePaths.includes(path)) {\n return null;\n }\n\n binding.references -= 1;\n binding.referencePaths = binding.referencePaths.filter((i) => i !== path);\n binding.referenced = binding.referencePaths.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\nexport function findParentForDelete(path: NodePath): NodePath | null {\n if (isRemoved(path)) return null;\n\n deletingNodes.add(path);\n\n const parent = path.parentPath;\n\n if (!parent) return path;\n\n if (parent.isProgram()) {\n // Do not delete Program node\n return path;\n }\n\n if (parent.isLogicalExpression({ operator: '&&' })) {\n mutate(parent, (p) => {\n p.replaceWith({\n type: 'BooleanLiteral',\n value: false,\n });\n });\n\n return null;\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 findParentForDelete(maybeDefineProperty);\n }\n }\n\n return findParentForDelete(parent);\n }\n\n if (parent.isTemplateLiteral()) {\n mutate(path, (p) => {\n p.replaceWith({\n type: 'StringLiteral',\n value: '',\n });\n });\n return null;\n }\n\n if (parent.isAssignmentExpression()) {\n return findParentForDelete(parent);\n }\n\n if (parent.isCallExpression()) {\n return findParentForDelete(parent);\n }\n\n if (parent.isForInStatement({ left: path.node })) {\n return findParentForDelete(parent);\n }\n\n if (\n parent.isFunctionExpression({ body: path.node }) ||\n parent.isFunctionDeclaration() ||\n parent.isObjectMethod() ||\n parent.isClassMethod()\n ) {\n return findParentForDelete(parent);\n }\n\n if (parent.isBlockStatement()) {\n const body = parent.get('body');\n if (body.length === 1) {\n return findParentForDelete(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 findParentForDelete(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 findParentForDelete(parent);\n }\n }\n }\n\n if (parent.isVariableDeclarator()) {\n return findParentForDelete(parent);\n }\n\n if (\n parent.isExportNamedDeclaration() &&\n ((parent.node.specifiers.length === 1 &&\n parent.node.specifiers[0] === path.node) ||\n parent.node.declaration === path.node)\n ) {\n return findParentForDelete(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 (list.length === 1) {\n return findParentForDelete(parent);\n }\n }\n }\n\n if (parent.isTryStatement()) {\n return findParentForDelete(parent);\n }\n\n if (!path.listKey) {\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 findParentForDelete(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 findParentForDelete(parent);\n }\n }\n\n return 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((i) => findParentForDelete(i))\n .filter(isNotNull);\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 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 let clean = false;\n let referencedIdentifiers: NodePath<Identifier | JSXIdentifier>[] = [];\n const declared: Binding[] = [];\n\n paths.forEach((path) => {\n const deletingPath = findParentForDelete(path);\n if (!deletingPath) return;\n\n referencedIdentifiers.push(\n ...findIdentifiers([deletingPath], 'referenced')\n );\n declared.push(\n ...findIdentifiers([deletingPath], 'binding').map(\n (i) => getScope(i).getBinding(i.node.name)!\n )\n );\n\n mutate(deletingPath, (p) => {\n if (!isRemoved(p)) p.remove();\n });\n });\n\n if (declared.length > 0) {\n removeWithRelated(\n declared.reduce(\n (acc, i) => [...acc, ...i.referencePaths.filter(nonType)],\n [] as NodePath[]\n )\n );\n }\n\n referencedIdentifiers.sort((a, b) =>\n a.node?.name.localeCompare(b.node?.name)\n );\n\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 // 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 { mutate, removeWithRelated };\n"],"mappings":"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"}
{"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","references","push","isReferenced","kind","some","i","find","ancestor","isTSType","isFlowType","dereference","filter","length","dereferenceAll","map","identifierPath","referenceAll","forEach","deletingNodes","WeakSet","isEmptyList","list","every","has","getPathFromAction","action","Array","isArray","Error","findActionForNode","add","parent","parentPath","isProgram","isFunction","listKey","isLogicalExpression","operator","type","value","isObjectProperty","get","isIdentifier","maybeDefineProperty","isCallExpression","matchesPattern","isTemplateLiteral","isAssignmentExpression","isForInStatement","left","isFunctionExpression","body","isFunctionDeclaration","isObjectMethod","isClassMethod","isBlockStatement","prevStatement","isIfStatement","isReturnStatement","slice","statement","isVariableDeclarator","isExportNamedDeclaration","declaration","isTryStatement","referenceEnums","program","traverse","ExpressionStatement","expressionStatement","expression","callee","args","arg","fixed","removeUnreferenced","items","Set","item","hasReferences","forDeleting","constantViolations","identifier","removeWithRelated","result","sort","a","b","localeCompare","paths","rootPath","getProgramParent","actions","affectedPaths","referencedIdentifiers","referencesOfBinding","reduce","acc","mutate","p","remove","replaceWith","clean","join","fn","dereferenced","mutated","dead","assignments","assignment","scope","declared","Object","values","getOuterBindingIdentifiers","Identifier","isArrayPattern","elements"],"sources":["../src/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 Node,\n Identifier,\n JSXIdentifier,\n Program,\n FieldOptions,\n} from '@babel/types';\nimport { Function, 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.references += 1;\n binding.referencePaths.push(referencePath ?? path);\n}\n\nfunction isReferenced(binding: Binding) {\n if (!binding.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 ((binding.kind as string) === 'param') {\n return true;\n }\n\n // If all remaining references are in TS/Flow types, binding is unreferenced\n return binding.referencePaths.some(\n (i) => !i.find((ancestor) => ancestor.isTSType() || ancestor.isFlowType())\n );\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 if (!binding.referencePaths.includes(path)) {\n return null;\n }\n\n binding.references -= 1;\n binding.referencePaths = binding.referencePaths.filter((i) => i !== path);\n binding.referenced = binding.referencePaths.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\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.isFunction() && path.listKey === 'params') {\n // Do not remove params of functions\n return null;\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.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) {\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 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, 'referenced');\n const referencesOfBinding = findIdentifiers(affectedPaths, 'binding')\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\n actions.forEach((action) => {\n mutate(action[1], (p) => {\n if (isRemoved(p)) return;\n\n if (action[0] === 'remove') {\n p.remove();\n } else if (action[0] === 'replace') {\n p.replaceWith(action[2]);\n }\n });\n });\n\n removeWithRelated(referencesOfBinding);\n\n referencedIdentifiers.sort((a, b) =>\n a.node?.name.localeCompare(b.node?.name)\n );\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 // 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 { mutate, removeWithRelated };\n"],"mappings":"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"}

@@ -7,3 +7,3 @@ "use strict";

exports.dereference = dereference;
exports.findParentForDelete = findParentForDelete;
exports.findActionForNode = findActionForNode;
exports.mutate = mutate;

@@ -108,23 +108,39 @@ exports.reference = reference;

function findParentForDelete(path) {
const isEmptyList = list => list.length === 0 || list.every(i => deletingNodes.has(i));
const getPathFromAction = action => {
if (!Array.isArray(action)) {
return action;
}
if (action[0] === 'replace' || action[0] === 'remove') {
return action[1];
}
throw new Error(`Unknown action type: ${action[0]}`);
};
function findActionForNode(path) {
if ((0, _isRemoved.default)(path)) return null;
deletingNodes.add(path);
const parent = path.parentPath;
if (!parent) return path;
if (!parent) return ['remove', path];
if (parent.isProgram()) {
// Do not delete Program node
return path;
return ['remove', path];
}
if (parent.isFunction() && path.listKey === 'params') {
// Do not remove params of functions
return null;
}
if (parent.isLogicalExpression({
operator: '&&'
})) {
mutate(parent, p => {
p.replaceWith({
type: 'BooleanLiteral',
value: false
});
});
return null;
return ['replace', parent, {
type: 'BooleanLiteral',
value: false
}];
}

@@ -142,25 +158,22 @@

if (maybeDefineProperty !== null && maybeDefineProperty !== void 0 && maybeDefineProperty.isCallExpression() && maybeDefineProperty.get('callee').matchesPattern('Object.defineProperty')) {
return findParentForDelete(maybeDefineProperty);
return findActionForNode(maybeDefineProperty);
}
}
return findParentForDelete(parent);
return findActionForNode(parent);
}
if (parent.isTemplateLiteral()) {
mutate(path, p => {
p.replaceWith({
type: 'StringLiteral',
value: ''
});
});
return null;
return ['replace', path, {
type: 'StringLiteral',
value: ''
}];
}
if (parent.isAssignmentExpression()) {
return findParentForDelete(parent);
return findActionForNode(parent);
}
if (parent.isCallExpression()) {
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -171,3 +184,3 @@

})) {
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -178,3 +191,3 @@

}) || parent.isFunctionDeclaration() || parent.isObjectMethod() || parent.isClassMethod()) {
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -185,4 +198,4 @@

if (body.length === 1) {
return findParentForDelete(parent);
if (isEmptyList(body)) {
return findActionForNode(parent);
}

@@ -197,3 +210,3 @@

// It's `if (…) return …`, we can remove it.
return findParentForDelete(prevStatement);
return findActionForNode(prevStatement);
}

@@ -203,3 +216,3 @@ } else if (body.slice(1).every(statement => deletingNodes.has(statement))) {

// are marked for deletion, we can remove the whole block.
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -210,7 +223,7 @@ }

if (parent.isVariableDeclarator()) {
return findParentForDelete(parent);
return findActionForNode(parent);
}
if (parent.isExportNamedDeclaration() && (parent.node.specifiers.length === 1 && parent.node.specifiers[0] === path.node || parent.node.declaration === path.node)) {
return findParentForDelete(parent);
if (parent.isExportNamedDeclaration() && (path.key === 'specifiers' && isEmptyList(parent.get('specifiers')) || path.key === 'declaration' && parent.node.declaration === path.node)) {
return findActionForNode(parent);
}

@@ -222,4 +235,4 @@

if (list.length === 1) {
return findParentForDelete(parent);
if (isEmptyList(list)) {
return findActionForNode(parent);
}

@@ -230,3 +243,3 @@ }

if (parent.isTryStatement()) {
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -239,3 +252,3 @@

// The parent node isn't valid without this field, so we should remove it also.
return findParentForDelete(parent);
return findActionForNode(parent);
}

@@ -246,7 +259,7 @@ }

if (path.key === key && parent.get(key) === path) {
return findParentForDelete(parent);
return findActionForNode(parent);
}
}
return path;
return ['remove', path];
} // @babel/preset-typescript transpiles enums, but doesn't reference used identifiers.

@@ -296,3 +309,3 @@

const forDeleting = [binding.path, ...binding.constantViolations].map(i => findParentForDelete(i)).filter(_isNotNull.default);
const forDeleting = [binding.path, ...binding.constantViolations].map(findActionForNode).filter(_isNotNull.default).map(getPathFromAction);
if (forDeleting.length === 0) return;

@@ -324,19 +337,22 @@ (0, _findIdentifiers.default)(forDeleting).forEach(identifier => {

let clean = false;
let referencedIdentifiers = [];
const declared = [];
paths.forEach(path => {
const deletingPath = findParentForDelete(path);
if (!deletingPath) return;
referencedIdentifiers.push(...(0, _findIdentifiers.default)([deletingPath], 'referenced'));
declared.push(...(0, _findIdentifiers.default)([deletingPath], 'binding').map(i => (0, _getScope.getScope)(i).getBinding(i.node.name)));
mutate(deletingPath, p => {
if (!(0, _isRemoved.default)(p)) p.remove();
const actions = paths.map(findActionForNode).filter(_isNotNull.default);
const affectedPaths = actions.map(getPathFromAction);
let referencedIdentifiers = (0, _findIdentifiers.default)(affectedPaths, 'referenced');
const referencesOfBinding = (0, _findIdentifiers.default)(affectedPaths, 'binding').map(i => {
var _ref;
return (_ref = i.node && (0, _getScope.getScope)(i).getBinding(i.node.name)) !== null && _ref !== void 0 ? _ref : null;
}).filter(_isNotNull.default).reduce((acc, i) => [...acc, ...i.referencePaths.filter(_findIdentifiers.nonType)], []);
actions.forEach(action => {
mutate(action[1], p => {
if ((0, _isRemoved.default)(p)) return;
if (action[0] === 'remove') {
p.remove();
} else if (action[0] === 'replace') {
p.replaceWith(action[2]);
}
});
});
if (declared.length > 0) {
removeWithRelated(declared.reduce((acc, i) => [...acc, ...i.referencePaths.filter(_findIdentifiers.nonType)], []));
}
removeWithRelated(referencesOfBinding);
referencedIdentifiers.sort((a, b) => {

@@ -347,2 +363,3 @@ var _a$node2, _b$node2;

});
let clean = false;

@@ -349,0 +366,0 @@ while (!clean && referencedIdentifiers.length > 0) {

@@ -1,1 +0,1 @@

{"version":3,"file":"scopeHelpers.js","names":["validateField","node","key","val","field","validate","optional","getBinding","path","binding","getScope","name","undefined","reference","referencePath","force","isReferencedIdentifier","referencePaths","includes","referenced","references","push","isReferenced","kind","some","i","find","ancestor","isTSType","isFlowType","dereference","filter","length","dereferenceAll","findIdentifiers","map","identifierPath","isNotNull","referenceAll","forEach","deletingNodes","WeakSet","findParentForDelete","isRemoved","add","parent","parentPath","isProgram","isLogicalExpression","operator","mutate","p","replaceWith","type","value","isObjectProperty","get","isIdentifier","maybeDefineProperty","isCallExpression","matchesPattern","isTemplateLiteral","isAssignmentExpression","isForInStatement","left","isFunctionExpression","body","isFunctionDeclaration","isObjectMethod","isClassMethod","isBlockStatement","listKey","prevStatement","isIfStatement","isReturnStatement","slice","every","statement","has","isVariableDeclarator","isExportNamedDeclaration","specifiers","declaration","list","isTryStatement","NODE_FIELDS","referenceEnums","program","traverse","ExpressionStatement","expressionStatement","expression","callee","args","arg","fixed","removeUnreferenced","items","Set","item","hasReferences","forDeleting","constantViolations","identifier","removeWithRelated","result","sort","a","b","localeCompare","paths","rootPath","getProgramParent","clean","referencedIdentifiers","declared","deletingPath","remove","reduce","acc","nonType","join","fn","dereferenced","mutated","dead","assignments","assignment","scope","Object","values","getOuterBindingIdentifiers","Identifier","isArrayPattern","elements"],"sources":["../src/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 Node,\n Identifier,\n JSXIdentifier,\n Program,\n FieldOptions,\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.references += 1;\n binding.referencePaths.push(referencePath ?? path);\n}\n\nfunction isReferenced(binding: Binding) {\n if (!binding.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 ((binding.kind as string) === 'param') {\n return true;\n }\n\n // If all remaining references are in TS/Flow types, binding is unreferenced\n return binding.referencePaths.some(\n (i) => !i.find((ancestor) => ancestor.isTSType() || ancestor.isFlowType())\n );\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 if (!binding.referencePaths.includes(path)) {\n return null;\n }\n\n binding.references -= 1;\n binding.referencePaths = binding.referencePaths.filter((i) => i !== path);\n binding.referenced = binding.referencePaths.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\nexport function findParentForDelete(path: NodePath): NodePath | null {\n if (isRemoved(path)) return null;\n\n deletingNodes.add(path);\n\n const parent = path.parentPath;\n\n if (!parent) return path;\n\n if (parent.isProgram()) {\n // Do not delete Program node\n return path;\n }\n\n if (parent.isLogicalExpression({ operator: '&&' })) {\n mutate(parent, (p) => {\n p.replaceWith({\n type: 'BooleanLiteral',\n value: false,\n });\n });\n\n return null;\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 findParentForDelete(maybeDefineProperty);\n }\n }\n\n return findParentForDelete(parent);\n }\n\n if (parent.isTemplateLiteral()) {\n mutate(path, (p) => {\n p.replaceWith({\n type: 'StringLiteral',\n value: '',\n });\n });\n return null;\n }\n\n if (parent.isAssignmentExpression()) {\n return findParentForDelete(parent);\n }\n\n if (parent.isCallExpression()) {\n return findParentForDelete(parent);\n }\n\n if (parent.isForInStatement({ left: path.node })) {\n return findParentForDelete(parent);\n }\n\n if (\n parent.isFunctionExpression({ body: path.node }) ||\n parent.isFunctionDeclaration() ||\n parent.isObjectMethod() ||\n parent.isClassMethod()\n ) {\n return findParentForDelete(parent);\n }\n\n if (parent.isBlockStatement()) {\n const body = parent.get('body');\n if (body.length === 1) {\n return findParentForDelete(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 findParentForDelete(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 findParentForDelete(parent);\n }\n }\n }\n\n if (parent.isVariableDeclarator()) {\n return findParentForDelete(parent);\n }\n\n if (\n parent.isExportNamedDeclaration() &&\n ((parent.node.specifiers.length === 1 &&\n parent.node.specifiers[0] === path.node) ||\n parent.node.declaration === path.node)\n ) {\n return findParentForDelete(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 (list.length === 1) {\n return findParentForDelete(parent);\n }\n }\n }\n\n if (parent.isTryStatement()) {\n return findParentForDelete(parent);\n }\n\n if (!path.listKey) {\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 findParentForDelete(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 findParentForDelete(parent);\n }\n }\n\n return 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((i) => findParentForDelete(i))\n .filter(isNotNull);\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 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 let clean = false;\n let referencedIdentifiers: NodePath<Identifier | JSXIdentifier>[] = [];\n const declared: Binding[] = [];\n\n paths.forEach((path) => {\n const deletingPath = findParentForDelete(path);\n if (!deletingPath) return;\n\n referencedIdentifiers.push(\n ...findIdentifiers([deletingPath], 'referenced')\n );\n declared.push(\n ...findIdentifiers([deletingPath], 'binding').map(\n (i) => getScope(i).getBinding(i.node.name)!\n )\n );\n\n mutate(deletingPath, (p) => {\n if (!isRemoved(p)) p.remove();\n });\n });\n\n if (declared.length > 0) {\n removeWithRelated(\n declared.reduce(\n (acc, i) => [...acc, ...i.referencePaths.filter(nonType)],\n [] as NodePath[]\n )\n );\n }\n\n referencedIdentifiers.sort((a, b) =>\n a.node?.name.localeCompare(b.node?.name)\n );\n\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 // 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 { mutate, removeWithRelated };\n"],"mappings":"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"}
{"version":3,"file":"scopeHelpers.js","names":["validateField","node","key","val","field","validate","optional","getBinding","path","binding","getScope","name","undefined","reference","referencePath","force","isReferencedIdentifier","referencePaths","includes","referenced","references","push","isReferenced","kind","some","i","find","ancestor","isTSType","isFlowType","dereference","filter","length","dereferenceAll","findIdentifiers","map","identifierPath","isNotNull","referenceAll","forEach","deletingNodes","WeakSet","isEmptyList","list","every","has","getPathFromAction","action","Array","isArray","Error","findActionForNode","isRemoved","add","parent","parentPath","isProgram","isFunction","listKey","isLogicalExpression","operator","type","value","isObjectProperty","get","isIdentifier","maybeDefineProperty","isCallExpression","matchesPattern","isTemplateLiteral","isAssignmentExpression","isForInStatement","left","isFunctionExpression","body","isFunctionDeclaration","isObjectMethod","isClassMethod","isBlockStatement","prevStatement","isIfStatement","isReturnStatement","slice","statement","isVariableDeclarator","isExportNamedDeclaration","declaration","isTryStatement","NODE_FIELDS","referenceEnums","program","traverse","ExpressionStatement","expressionStatement","expression","callee","args","arg","fixed","removeUnreferenced","items","Set","item","hasReferences","forDeleting","constantViolations","identifier","removeWithRelated","result","sort","a","b","localeCompare","paths","rootPath","getProgramParent","actions","affectedPaths","referencedIdentifiers","referencesOfBinding","reduce","acc","nonType","mutate","p","remove","replaceWith","clean","join","fn","dereferenced","mutated","dead","assignments","assignment","scope","declared","Object","values","getOuterBindingIdentifiers","Identifier","isArrayPattern","elements"],"sources":["../src/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 Node,\n Identifier,\n JSXIdentifier,\n Program,\n FieldOptions,\n} from '@babel/types';\nimport { Function, 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.references += 1;\n binding.referencePaths.push(referencePath ?? path);\n}\n\nfunction isReferenced(binding: Binding) {\n if (!binding.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 ((binding.kind as string) === 'param') {\n return true;\n }\n\n // If all remaining references are in TS/Flow types, binding is unreferenced\n return binding.referencePaths.some(\n (i) => !i.find((ancestor) => ancestor.isTSType() || ancestor.isFlowType())\n );\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 if (!binding.referencePaths.includes(path)) {\n return null;\n }\n\n binding.references -= 1;\n binding.referencePaths = binding.referencePaths.filter((i) => i !== path);\n binding.referenced = binding.referencePaths.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\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.isFunction() && path.listKey === 'params') {\n // Do not remove params of functions\n return null;\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.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) {\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 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, 'referenced');\n const referencesOfBinding = findIdentifiers(affectedPaths, 'binding')\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\n actions.forEach((action) => {\n mutate(action[1], (p) => {\n if (isRemoved(p)) return;\n\n if (action[0] === 'remove') {\n p.remove();\n } else if (action[0] === 'replace') {\n p.replaceWith(action[2]);\n }\n });\n });\n\n removeWithRelated(referencesOfBinding);\n\n referencedIdentifiers.sort((a, b) =>\n a.node?.name.localeCompare(b.node?.name)\n );\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 // 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 { mutate, removeWithRelated };\n"],"mappings":"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"}
{
"name": "@linaria/utils",
"description": "Blazing fast zero-runtime CSS in JS library",
"version": "4.2.3",
"version": "4.2.4",
"bugs": "https://github.com/callstack/linaria/issues",

@@ -6,0 +6,0 @@ "dependencies": {

import type { Binding, NodePath } from '@babel/traverse';
import type { Identifier, JSXIdentifier } from '@babel/types';
import type { Node, Identifier, JSXIdentifier } from '@babel/types';
export declare function reference(path: NodePath<Identifier | JSXIdentifier>, referencePath?: NodePath, force?: boolean): void;
export declare function dereference(path: NodePath<Identifier | JSXIdentifier>): Binding | null;
export declare function referenceAll(path: NodePath): void;
export declare function findParentForDelete(path: NodePath): NodePath | null;
declare type ReplaceAction = [action: 'replace', what: NodePath, by: Node];
declare type RemoveAction = [action: 'remove', what: NodePath];
export declare function findActionForNode(path: NodePath): RemoveAction | ReplaceAction | null;
declare function removeWithRelated(paths: NodePath[]): void;
declare function mutate<T extends NodePath>(path: T, fn: (p: T) => NodePath[] | void): void;
export { mutate, removeWithRelated };