"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const scopeManager_1 = require("../scopeManager"); const assert = require("assert"); const referencer_1 = require("../referencer"); const reference_1 = require("../reference"); const childScopesTraverser_1 = require("./childScopesTraverser"); const exportManager_1 = require("../exportManager"); const virtualScope_1 = require("./virtualScope"); const importManager_1 = require("../importManager"); Object.defineProperty(Array.prototype, "flatMap", { value(f) { return this.reduce((ys, x) => { return ys.concat(f.call(this, x)); }, []); }, enumerable: false, }); class ModuleAnalyser { constructor(name, module, scopeManager = null) { this.name = name; this.module = module; this.scopeManager = scopeManager; this.extractorMap = new Map(); this.virtualScopeMap = new WeakMap(); this.virtualScopes = []; this.initVirtualScopes = []; this.comments = []; this.handleNotExportReferences = (refs) => { const moduleScopeRefs = refs.filter(ref => ref.resolved && ref.resolved.scope.type === "module"); const pureVScopes = this.virtualScopes.filter(vs => vs.contentType === virtualScope_1.VScopeContentType.PureFunctionCall); const nodeContains = (node, [start, end]) => { return node.start >= start && node.end <= end; }; moduleScopeRefs.forEach(ref => { for (const vs of pureVScopes) { if (vs instanceof virtualScope_1.VariableVirtualScope) { const range = vs.pureRange; if (nodeContains(ref.identifier, range)) { return; } } } const resolvedName = ref.resolved; const vs = this.virtualScopeMap.get(resolvedName); if (!ref.init) { this.initVirtualScopes.push(vs); } }); }; } defaultOptions() { return { optimistic: false, directive: false, nodejsScope: false, impliedStrict: false, sourceType: "module", ecmaVersion: 6, childVisitorKeys: null, fallback: "iteration", comments: [], }; } analyze(tree, providedOptions) { const options = this.updateDeeply(this.defaultOptions(), providedOptions); this.comments = options.comments; const scopeManager = new scopeManager_1.ScopeManager(options); const referencer = new referencer_1.Referencer(options, scopeManager); referencer.visit(tree); assert(scopeManager.__currentScope === null, "currentScope should be null."); this.scopeManager = scopeManager; const pureCommentEndsSet = this.processComments(); const { moduleScope } = this; moduleScope.variables.forEach(variable => { let virtualScope; if (moduleScope.importManager.idMap.get(variable.name)) { virtualScope = new virtualScope_1.VariableVirtualScope(virtualScope_1.VScopeContentType.Import, variable); } else { const def = variable.defs[0]; switch (def.node.type) { case "FunctionDeclaration": virtualScope = new virtualScope_1.VariableVirtualScope(virtualScope_1.VScopeContentType.FunctionDeclaration, variable); break; case "ClassDeclaration": virtualScope = new virtualScope_1.VariableVirtualScope(virtualScope_1.VScopeContentType.ClassDeclaration, variable); break; case "VariableDeclarator": let isChildrenDependent = true; if (def.node.init) { const { init } = def.node; if (["let", "var", "const"].indexOf(def.kind) < 0) { throw new TypeError("def.kind muse be in ['let', 'var', 'const']"); } if (def.kind === "let" || def.kind === "var") { for (let i = 1; i < variable.references.length; i++) { const ref = variable.references[i]; if (ref.flag === reference_1.Reference.WRITE || ref.flag === reference_1.Reference.RW) { isChildrenDependent = false; break; } } } let scopeType = virtualScope_1.VScopeContentType.Undefined; switch (init.type) { case "ClassExpression": scopeType = virtualScope_1.VScopeContentType.ClassExpression; break; case "FunctionExpression": scopeType = virtualScope_1.VScopeContentType.FunctionExpression; break; case "ArrowFunctionExpression": scopeType = virtualScope_1.VScopeContentType.ArrowFunction; break; case "CallExpression": if (pureCommentEndsSet.has(init.range[0])) { scopeType = virtualScope_1.VScopeContentType.PureFunctionCall; } else { scopeType = virtualScope_1.VScopeContentType.NormalFunctionCall; } } virtualScope = new virtualScope_1.VariableVirtualScope(scopeType, variable, isChildrenDependent); } else { virtualScope = new virtualScope_1.VariableVirtualScope(virtualScope_1.VScopeContentType.Undefined, variable, false); } break; default: virtualScope = new virtualScope_1.VariableVirtualScope(virtualScope_1.VScopeContentType.Undefined, variable, false); } } this.virtualScopeMap.set(variable, virtualScope); this.virtualScopes.push(virtualScope); }); const visitedSet = new WeakSet(); this.handleExportDefaultDeclaration(); this.virtualScopes.forEach(vs => vs.findAllReferencesToVirtualScope(visitedSet, scopeManager, this.virtualScopeMap)); const independentScopes = moduleScope.childScopes.filter(item => !visitedSet.has(item)); this.traverseIndependentScopes(independentScopes); this.handleNotExportReferences(moduleScope.references.filter(ref => !ref.isExport)); } processComments() { const pureCommentEndsSet = new Set(); this.comments.forEach(comment => { if (comment.type === "Block" && /(@|#)__PURE__/.test(comment.value)) { pureCommentEndsSet.add(comment.end); } }); return pureCommentEndsSet; } handleExportDefaultDeclaration() { const moduleScope = this.moduleScope; const { exportManager } = moduleScope; if (exportManager.exportDefaultDeclaration) { let vsType; switch (exportManager.exportDefaultDeclaration.type) { case "FunctionDeclaration": vsType = virtualScope_1.VScopeContentType.FunctionDeclaration; break; case "ArrowFunctionExpression": vsType = virtualScope_1.VScopeContentType.ArrowFunction; break; case "ClassDeclaration": vsType = virtualScope_1.VScopeContentType.ClassDeclaration; break; case "ClassExpression": vsType = virtualScope_1.VScopeContentType.ClassExpression; break; case "Identifier": vsType = virtualScope_1.VScopeContentType.Reference; break; default: return; } this.virtualScopes.push(new virtualScope_1.ExportDefaultVirtualScope(vsType, exportManager.exportDefaultDeclaration, true)); } } generateExportInfo(usedExports) { const { exportManager } = this.moduleScope; const resultList = []; const moduleScopeIds = []; for (let i = 0; i < usedExports.length; i++) { const usedExport = usedExports[i]; const exportVar = exportManager.exportsMap.get(usedExport); if (typeof exportVar === "undefined") { continue; } switch (exportVar.type) { case exportManager_1.ExportVariableType.Local: if (exportVar.localName !== null || exportVar.exportName === "default") { moduleScopeIds.push(exportVar.localName || exportVar.exportName); } break; case exportManager_1.ExportVariableType.External: if (exportVar.moduleType === exportManager_1.ExternalType.Identifier) { resultList.push({ sourceName: exportVar.names.sourceName, moduleName: exportVar.moduleName, }); } break; } } const visitedVScope = new WeakSet(); const traverseVirtualScope = (vs) => { if (visitedVScope.has(vs)) return; visitedVScope.add(vs); if (vs.type === virtualScope_1.VirtualScopeType.Variable) { const varVScope = vs; if (vs.contentType === virtualScope_1.VScopeContentType.Import) { const name = varVScope.variable.name; const importInfo = this.moduleScope.importManager.idMap.get(name); if (importInfo.type === importManager_1.ImportType.Namespace) { resultList.push({ sourceName: true, moduleName: importInfo.moduleName, }); } else { resultList.push({ sourceName: importInfo.sourceName, moduleName: importInfo.moduleName, }); } } } for (const child of vs.children) { traverseVirtualScope(child); } }; this.initVirtualScopes.forEach(traverseVirtualScope); moduleScopeIds.forEach(id => { if (id === "default") { const defaultVs = this.virtualScopes.filter(vs => vs.type === virtualScope_1.VirtualScopeType.Default); defaultVs.forEach(vs => traverseVirtualScope(vs)); } else { const variable = this.moduleScope.set.get(id); const vs = this.virtualScopeMap.get(variable); traverseVirtualScope(vs); } }); const resultMap = {}; for (const entity of resultList) { const { sourceName, moduleName } = entity; if (resultMap[moduleName] === true) continue; if (sourceName === true) { resultMap[moduleName] = true; } else if (moduleName in resultMap) { resultMap[moduleName].add(sourceName); } else { resultMap[moduleName] = new Set([sourceName]); } } for (const key in resultMap) { if (resultMap.hasOwnProperty(key)) { const value = resultMap[key]; if (value !== true) { resultMap[key] = [...value].sort(); } } } return resultMap; } traverseIndependentScopes(scopes) { for (const scope of scopes) { const traverser = new childScopesTraverser_1.ChildScopesTraverser(scope); traverser.refsToModule.forEach(ref => { const variable = this.moduleScope.set.get(ref); const vs = this.virtualScopeMap.get(variable); this.initVirtualScopes.push(vs); }); } } updateDeeply(target, override) { function isHashObject(value) { return (typeof value === "object" && value instanceof Object && !(value instanceof Array) && !(value instanceof RegExp)); } for (const key in override) { if (override.hasOwnProperty(key)) { const val = override[key]; if (isHashObject(val)) { if (isHashObject(target[key])) { this.updateDeeply(target[key], val); } else { target[key] = this.updateDeeply({}, val); } } else { target[key] = val; } } } return target; } get moduleScope() { return this.scopeManager.scopes[1]; } } exports.ModuleAnalyser = ModuleAnalyser; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlQW5hbHlzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYW5hbHlzZXIvbW9kdWxlQW5hbHlzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrREFBK0M7QUFFL0MsaUNBQWlDO0FBQ2pDLDhDQUEyQztBQUczQyw0Q0FBeUM7QUFFekMsaUVBQXFGO0FBQ3JGLG9EQUFvRTtBQUVwRSxpREFNd0I7QUFDeEIsb0RBQThDO0FBWTlDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUU7SUFDaEQsS0FBSyxDQUFjLENBQU07UUFDdkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBTyxFQUFFLENBQU0sRUFBRSxFQUFFO1lBQ3JDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFDRCxVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDLENBQUM7QUFFSDtJQVNFLFlBQ2tCLElBQVksRUFDWixNQUFXLEVBQ3BCLGVBQW9DLElBQUk7UUFGL0IsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFdBQU0sR0FBTixNQUFNLENBQUs7UUFDcEIsaUJBQVksR0FBWixZQUFZLENBQTRCO1FBWGpDLGlCQUFZLEdBQXVDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFN0Qsb0JBQWUsR0FBb0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNqRSxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFDbkMsc0JBQWlCLEdBQW1CLEVBQUUsQ0FBQztRQUUvQyxhQUFRLEdBQWUsRUFBRSxDQUFDO1FBNFQxQiw4QkFBeUIsR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUN4RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUNqQyxH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