UNPKG

19.6 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../src/util/packageDependencies.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { isEnvTrue, log } from \"builder-util\"\nimport { CONCURRENCY, statOrNull } from \"builder-util/out/fs\"\nimport { orNullIfFileNotExist } from \"builder-util/out/promise\"\nimport { lstat, readdir, readFile, realpath, Stats } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\n\nexport interface Dependency {\n name: string\n version: string\n path: string\n extraneous: boolean\n optional: boolean\n\n dependencies: Map<string, Dependency> | null\n directDependencyNames: Array<string> | null\n peerDependencies: { [key: string]: any } | null\n optionalDependencies: { [key: string]: any } | null\n\n realName: string\n link?: string\n\n parent?: Dependency\n\n // only if link\n stat?: Stats\n}\n\n// noinspection SpellCheckingInspection\nconst knownAlwaysIgnoredDevDeps = new Set([\n \"electron-builder-tslint-config\", \"electron-download\", \"libui-download\",\n \"electron-forge\", \"electron-packager\", \"electron-compilers\",\n \"prebuild-install\", \"nan\",\n \"electron-webpack\", \"electron-webpack-ts\", \"electron-webpack-vue\",\n \"@types\",\n])\n\n// noinspection JSUnusedGlobalSymbols\nexport function createLazyProductionDeps(projectDir: string) {\n return new Lazy(() => getProductionDependencies(projectDir))\n}\n\n/** @internal */\nexport async function getProductionDependencies(folder: string): Promise<Array<Dependency>> {\n const result: Array<Dependency> = []\n computeSortedPaths(await new Collector().collect(folder), result, false)\n return result\n}\n\nconst ignoredProperties = new Set([\"description\", \"author\", \"bugs\", \"engines\", \"repository\", \"build\", \"main\", \"license\", \"homepage\", \"scripts\", \"maintainers\", \"contributors\", \"keywords\", \"devDependencies\", \"files\", \"typings\", \"types\", \"xo\", \"resolutions\"])\n\nfunction readJson(file: string) {\n return readFile(file, \"utf-8\")\n .then(it => JSON.parse(it, (key, value) => ignoredProperties.has(key) ? undefined : value))\n}\n\nfunction computeSortedPaths(parent: Dependency, result: Array<Dependency>, isExtraneous: boolean) {\n const dependencies = parent.dependencies\n if (dependencies == null) {\n return\n }\n\n for (const dep of dependencies.values()) {\n if (dep.extraneous === isExtraneous) {\n result.push(dep)\n computeSortedPaths(dep, result, isExtraneous)\n }\n }\n}\n\nclass Collector {\n readonly pathToMetadata = new Map<string, Dependency>()\n private unresolved = new Map<string, boolean>()\n\n async collect(dir: string) {\n const rootDependency: Dependency = await readJson(path.join(dir, \"package.json\"))\n await this.readInstalled(path.join(dir, \"node_modules\"), rootDependency, rootDependency.name)\n this.unmarkExtraneous(rootDependency)\n\n if (this.unresolved.size > 0) {\n log.debug({unresolved: Array.from(this.unresolved.keys()).join(\", \")}, \"unresolved dependencies after first round\")\n await this.resolveUnresolvedHoisted(rootDependency, dir)\n }\n return rootDependency\n }\n\n private async resolveUnresolvedHoisted(rootDependency: Dependency, dir: string): Promise<void> {\n let nameToMetadata = rootDependency.dependencies\n if (nameToMetadata == null) {\n rootDependency.dependencies = new Map<string, Dependency>()\n nameToMetadata = rootDependency.dependencies\n }\n\n let parentDir = dir\n do {\n parentDir = path.dirname(parentDir)\n if (parentDir === \"\" || parentDir.endsWith(\"/\") || parentDir.endsWith(\"\\\\\")) {\n // https://github.com/electron-userland/electron-builder/issues/2220\n const list = Array.from(this.unresolved.keys()).filter(it => !this.unresolved.get(it))\n if (list.length === 1 && list[0] === \"proton-native\") {\n // resolve in tests\n parentDir = process.cwd()\n }\n else {\n if (list.length !== 0) {\n const message = `Unresolved node modules: ${list.join(\", \")}`\n if (isEnvTrue(process.env.ELECTRON_BUILDER_ALLOW_UNRESOLVED_DEPENDENCIES)) {\n log.warn(message)\n }\n else {\n throw new Error(message)\n }\n }\n break\n }\n }\n\n const parentNodeModulesDir = parentDir + path.sep + \"node_modules\"\n const dirStat = await statOrNull(parentNodeModulesDir)\n if (dirStat == null || !dirStat.isDirectory()) {\n if (dirStat == null || !dirStat.isDirectory()) {\n continue\n }\n }\n\n // https://github.com/electron-userland/electron-builder/issues/2222#issuecomment-339060335\n // step 1: resolve current unresolved\n // step n: try to resolve new unresolved in the same parent dir until at least something is resolved in the dir\n while (true) {\n const unresolved = Array.from(this.unresolved.keys())\n this.unresolved.clear()\n\n const resolved = await BluebirdPromise.map(unresolved, it => {\n return this.readChildPackage(it, parentNodeModulesDir, rootDependency)\n .catch(e => {\n if ((e as any).code === \"ENOENT\") {\n return null\n }\n else {\n throw e\n }\n })\n }, CONCURRENCY)\n\n let hasResolved = false\n\n for (const dep of resolved) {\n if (dep != null) {\n hasResolved = true\n this.unmarkExtraneous(dep)\n nameToMetadata.set(dep.realName, dep)\n }\n }\n\n if (!hasResolved) {\n break\n }\n\n this.unmarkExtraneous(rootDependency)\n\n if (this.unresolved.size === 0) {\n return\n }\n }\n }\n while (this.unresolved.size > 0)\n }\n\n private async readInstalled(nodeModulesDir: string, dependency: Dependency, name: string): Promise<void> {\n dependency.realName = name\n dependency.directDependencyNames = dependency.dependencies == null ? null : Object.keys(dependency.dependencies)\n\n // mark as extraneous at this point.\n // this will be un-marked in unmarkExtraneous, where we mark as not-extraneous everything that is required in some way from the root object.\n dependency.extraneous = true\n dependency.optional = true\n\n if (dependency.dependencies == null && dependency.optionalDependencies == null) {\n // package has only dev or peer dependencies - no need to check child node_module\n dependency.dependencies = null\n return\n }\n\n const childModules = await readNodeModulesDir(nodeModulesDir)\n if (childModules == null) {\n dependency.dependencies = null\n return\n }\n\n const deps = await BluebirdPromise.map(childModules, it => this.readChildPackage(it, nodeModulesDir, dependency), CONCURRENCY)\n if (deps.length === 0) {\n dependency.dependencies = null\n return\n }\n\n const nameToMetadata = new Map<string, Dependency>()\n for (const dep of deps) {\n if (dep != null) {\n nameToMetadata.set(dep.realName, dep)\n }\n }\n dependency.dependencies = nameToMetadata\n }\n\n private async readChildPackage(name: string, nodeModulesDir: string, parent: Dependency): Promise<Dependency | null> {\n const rawDir = path.join(nodeModulesDir, name)\n let dir: string | null = rawDir\n const stat = await lstat(dir)\n const isSymbolicLink = stat.isSymbolicLink()\n if (isSymbolicLink) {\n dir = await orNullIfFileNotExist(realpath(dir))\n if (dir == null) {\n log.debug({path: rawDir}, \"broken symlink\")\n return null\n }\n }\n\n const processed = this.pathToMetadata.get(dir)\n if (processed != null) {\n return processed\n }\n\n const metadata: Dependency = await orNullIfFileNotExist(readJson(path.join(dir, \"package.json\")))\n if (metadata == null) {\n return null\n }\n\n if (isSymbolicLink) {\n metadata.link = dir\n metadata.stat = stat\n }\n else {\n metadata.parent = parent\n\n // overwrite if already set by project package.json\n metadata.link = undefined\n }\n\n metadata.path = rawDir\n\n // do not add root project to result\n this.pathToMetadata.set(dir, metadata)\n\n await this.readInstalled(dir + path.sep + \"node_modules\", metadata, name)\n return metadata\n }\n\n private unmark(deps: Iterable<string>, obj: Dependency, unsetOptional: boolean, isOptional: boolean) {\n for (const name of deps) {\n const dep = this.findDep(obj, name, isOptional)\n if (dep != null) {\n if (unsetOptional) {\n dep.optional = false\n }\n if (dep.extraneous) {\n this.unmarkExtraneous(dep)\n }\n }\n }\n }\n\n private unmarkExtraneous(obj: Dependency) {\n // Mark all non-required deps as extraneous.\n // start from the root object and mark as non-extraneous all modules\n // that haven't been previously flagged as extraneous then propagate to all their dependencies\n\n obj.extraneous = false\n\n if (obj.directDependencyNames != null) {\n this.unmark(obj.directDependencyNames, obj, true, false)\n }\n\n if (obj.peerDependencies != null) {\n this.unmark(Object.keys(obj.peerDependencies), obj, true, false)\n }\n\n if (obj.optionalDependencies != null) {\n this.unmark(Object.keys(obj.optionalDependencies), obj, false, true)\n }\n }\n\n // find the one that will actually be loaded by require() so we can make sure it's valid\n private findDep(obj: Dependency, name: string, isOptional: boolean) {\n if (isIgnoredDep(name)) {\n return null\n }\n\n let r: Dependency | null | undefined = obj\n let found = null\n while (r != null && found == null) {\n // if r is a valid choice, then use that.\n // kinda weird if a pkg depends on itself, but after the first iteration of this loop, it indicates a dep cycle.\n found = r.dependencies == null ? null : r.dependencies.get(name)\n if (found == null && r.realName === name) {\n found = r\n }\n r = r.link == null ? r.parent : null\n }\n\n if (found == null) {\n this.unresolved.set(name, isOptional)\n }\n return found\n }\n}\n\nfunction isIgnoredDep(name: string) {\n return knownAlwaysIgnoredDevDeps.has(name) || name.startsWith(\"@types/\")\n}\n\nasync function readNodeModulesDir(dir: string): Promise<Array<string> | null> {\n let files: Array<string>\n try {\n files = (await readdir(dir)).filter(it => !it.startsWith(\".\") && !knownAlwaysIgnoredDevDeps.has(it))\n }\n catch (e) {\n // error indicates that nothing is installed here\n return null\n }\n\n files.sort()\n\n const scopes = files.filter(it => it.startsWith(\"@\"))\n if (scopes.length === 0) {\n return files\n }\n\n const result = files.filter(it => !it.startsWith(\"@\"))\n const scopeFileList = await BluebirdPromise.map(scopes, it => readdir(path.join(dir, it)))\n for (let i = 0; i < scopes.length; i++) {\n const list = scopeFileList[i]\n list.sort()\n for (const file of list) {\n if (!file.startsWith(\".\")) {\n result.push(`${scopes[i]}/${file}`)\n }\n }\n }\n\n return result\n}\n"],"sourceRoot":""}