UNPKG

knip

Version:

Find and fix unused dependencies, exports and files in your TypeScript and JavaScript projects

169 lines (168 loc) 7.56 kB
import { OPAQUE } from "../../constants.js"; import { addValue } from "../../util/module-graph.js"; import { getStringValue, isStringLiteral } from "./helpers.js"; import { isShadowed } from "./walk.js"; export function handleMemberExpression(node, s) { if (node.object.type === 'MemberExpression' && node.object.object.type === 'MemberExpression') { s.chainedMemberExprs.add(node.object); } if (node.object.type === 'Identifier') { const localName = node.object.name; const shadowed = isShadowed(localName, node.object.start); const _import = !shadowed ? s.localImportMap.get(localName) : undefined; if (_import) { const internalImport = s.internal.get(_import.filePath); if (internalImport) { let memberName; if (node.computed === false && node.property.type === 'Identifier') { memberName = node.property.name; } else if (node.computed && isStringLiteral(node.property)) { memberName = getStringValue(node.property); } else if (node.computed && _import.isNamespace) { addValue(internalImport.import, OPAQUE, s.filePath); return; } if (memberName) { if (_import.isDynamicImport) { addValue(internalImport.import, memberName, s.filePath); } else { s.addNsMemberRefs(internalImport, localName, memberName); } } } } else if (!shadowed) { const memberName = node.computed === false && node.property.type === 'Identifier' ? node.property.name : undefined; if (memberName) { s.memberRefsInFile.push(localName, memberName); } } const aliases = s.importAliases.get(localName); if (aliases) { s.accessedAliases.add(localName); let memberName; if (node.computed === false && node.property.type === 'Identifier') { memberName = node.property.name; } else if (node.computed && isStringLiteral(node.property)) { memberName = getStringValue(node.property); } if (memberName) { for (const alias of aliases) { const internalImport = s.internal.get(alias.filePath); if (internalImport) { s.addNsMemberRefs(internalImport, alias.id, memberName); } } } } } if (node.object.type === 'MemberExpression' && !node.object.computed && node.object.object.type === 'Identifier' && node.object.property.type === 'Identifier' && !node.computed && node.property.type === 'Identifier') { const rootName = node.object.object.name; if (!isShadowed(rootName, node.object.object.start)) { const _import = s.localImportMap.get(rootName); if (_import) { const internalImport = s.internal.get(_import.filePath); if (internalImport) { const mid = node.object.property.name; s.addNsMemberRefs(internalImport, rootName, mid); if (!s.chainedMemberExprs.has(node)) { s.addNsMemberRefs(internalImport, rootName, `${mid}.${node.property.name}`); } } if (!_import.isNamespace) { const mid = node.object.property.name; const _import = s.localImportMap.get(mid); if (_import) { const midImport = s.internal.get(_import.filePath); if (midImport) s.addNsMemberRefs(midImport, mid, node.property.name); } } } else { const mid = node.object.property.name; s.memberRefsInFile.push(rootName, mid, rootName, `${mid}.${node.property.name}`); } } } if (node.object.type === 'MemberExpression' && !node.object.computed && node.object.object.type === 'MemberExpression' && !node.object.object.computed && node.object.object.object.type === 'Identifier' && node.object.object.property.type === 'Identifier' && node.object.property.type === 'Identifier' && !node.computed && node.property.type === 'Identifier') { const rootName = node.object.object.object.name; if (!isShadowed(rootName, node.object.object.object.start)) { const _import = s.localImportMap.get(rootName); if (_import) { const internalImport = s.internal.get(_import.filePath); if (internalImport) { const a = node.object.object.property.name; const b = node.object.property.name; const c = node.property.name; s.addNsMemberRefs(internalImport, rootName, a); s.addNsMemberRefs(internalImport, rootName, `${a}.${b}`); s.addNsMemberRefs(internalImport, rootName, `${a}.${b}.${c}`); } } else { const a = node.object.object.property.name; const b = node.object.property.name; const c = node.property.name; s.memberRefsInFile.push(rootName, a, rootName, `${a}.${b}`, rootName, `${a}.${b}.${c}`); } } } if (node.object.type === 'MemberExpression' && !node.object.computed && node.object.object.type === 'Identifier' && node.object.property.type === 'Identifier') { const containerName = node.object.object.name; const propKey = node.object.property.name; const nsName = s.nsContainers.get(containerName)?.get(propKey); if (nsName) { const _import = s.localImportMap.get(nsName); if (_import) { const internalImport = s.internal.get(_import.filePath); if (internalImport) { let memberName; if (!node.computed && node.property.type === 'Identifier') memberName = node.property.name; else if (node.computed && isStringLiteral(node.property)) memberName = getStringValue(node.property); if (memberName) { s.addNsMemberRefs(internalImport, nsName, memberName); s.accessedNsContainers.add(`${containerName}.${propKey}`); } } } } } } export function handleJSXMemberExpression(node, s) { if (node.object.type === 'JSXIdentifier') { const localName = node.object.name; const memberName = node.property.type === 'JSXIdentifier' ? node.property.name : undefined; if (memberName) { const _import = s.localImportMap.get(localName); if (_import) { const internalImport = s.internal.get(_import.filePath); if (internalImport) { s.addNsMemberRefs(internalImport, localName, memberName); } } } } }