app-builder-lib 26.3.0 → 26.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/asar/asarUtil.js +56 -63
- package/out/asar/asarUtil.js.map +1 -1
- package/out/asar/unpackDetector.js +1 -3
- package/out/asar/unpackDetector.js.map +1 -1
- package/out/node-module-collector/index.d.ts +8 -5
- package/out/node-module-collector/index.js +23 -36
- package/out/node-module-collector/index.js.map +1 -1
- package/out/node-module-collector/nodeModulesCollector.d.ts +6 -5
- package/out/node-module-collector/nodeModulesCollector.js +109 -61
- package/out/node-module-collector/nodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/npmNodeModulesCollector.js +9 -4
- package/out/node-module-collector/npmNodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/packageManager.d.ts +8 -6
- package/out/node-module-collector/packageManager.js +32 -5
- package/out/node-module-collector/packageManager.js.map +1 -1
- package/out/node-module-collector/pnpmNodeModulesCollector.d.ts +2 -0
- package/out/node-module-collector/pnpmNodeModulesCollector.js +51 -29
- package/out/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/yarnBerryNodeModulesCollector.js +30 -20
- package/out/node-module-collector/yarnBerryNodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/yarnNodeModulesCollector.js +2 -2
- package/out/node-module-collector/yarnNodeModulesCollector.js.map +1 -1
- package/out/packager.d.ts +1 -1
- package/out/packager.js +2 -20
- package/out/packager.js.map +1 -1
- package/out/targets/tools.js +12 -12
- package/out/targets/tools.js.map +1 -1
- package/out/util/appFileCopier.js +2 -1
- package/out/util/appFileCopier.js.map +1 -1
- package/out/util/macosIconComposer.js +11 -4
- package/out/util/macosIconComposer.js.map +1 -1
- package/out/util/yarn.d.ts +2 -1
- package/out/util/yarn.js +19 -13
- package/out/util/yarn.js.map +1 -1
- package/out/version.d.ts +1 -1
- package/out/version.js +1 -1
- package/out/version.js.map +1 -1
- package/package.json +8 -8
package/out/asar/asarUtil.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AsarPackager = void 0;
|
|
4
4
|
const asar_1 = require("@electron/asar");
|
|
5
5
|
const builder_util_1 = require("builder-util");
|
|
6
|
+
const fs_1 = require("builder-util/out/fs");
|
|
6
7
|
const fs = require("fs-extra");
|
|
7
8
|
const fs_extra_1 = require("fs-extra");
|
|
8
9
|
const path = require("path");
|
|
@@ -10,6 +11,30 @@ const appFileCopier_1 = require("../util/appFileCopier");
|
|
|
10
11
|
const unpackDetector_1 = require("./unpackDetector");
|
|
11
12
|
const stream_1 = require("stream");
|
|
12
13
|
const os = require("os");
|
|
14
|
+
const resolvePath = async (file) => (file && (await (0, fs_1.exists)(file)) ? fs.realpath(file).catch(() => path.resolve(file)) : undefined);
|
|
15
|
+
const resolvePaths = async (filepaths) => {
|
|
16
|
+
return Promise.all(filepaths.map(resolvePath)).then(paths => paths.filter((it) => it != null));
|
|
17
|
+
};
|
|
18
|
+
const DENYLIST = resolvePaths([
|
|
19
|
+
"/usr",
|
|
20
|
+
"/lib",
|
|
21
|
+
"/bin",
|
|
22
|
+
"/sbin",
|
|
23
|
+
"/etc",
|
|
24
|
+
"/tmp",
|
|
25
|
+
"/var", // block whole /var by default. If $HOME is under /var, it's explicitly in ALLOWLIST - https://github.com/electron-userland/electron-builder/issues/9025#issuecomment-3575380041
|
|
26
|
+
// macOS system directories
|
|
27
|
+
"/System",
|
|
28
|
+
"/Library",
|
|
29
|
+
"/private",
|
|
30
|
+
// Windows system directories
|
|
31
|
+
process.env.SystemRoot,
|
|
32
|
+
process.env.WINDIR,
|
|
33
|
+
]);
|
|
34
|
+
const ALLOWLIST = resolvePaths([
|
|
35
|
+
os.tmpdir(), // always allow temp dir
|
|
36
|
+
os.homedir(), // always allow home dir
|
|
37
|
+
]);
|
|
13
38
|
/** @internal */
|
|
14
39
|
class AsarPackager {
|
|
15
40
|
constructor(packager, config) {
|
|
@@ -48,6 +73,7 @@ class AsarPackager {
|
|
|
48
73
|
}
|
|
49
74
|
}
|
|
50
75
|
const results = [];
|
|
76
|
+
const resultsPaths = new Set();
|
|
51
77
|
for (const fileSet of fileSets) {
|
|
52
78
|
// Don't use Promise.all, we need to retain order of execution/iteration through the already-ordered fileset
|
|
53
79
|
for (const [index, file] of fileSet.files.entries()) {
|
|
@@ -62,7 +88,7 @@ class AsarPackager {
|
|
|
62
88
|
const isFileUnpacked = (_c = (_b = (_a = this.config).unpackPattern) === null || _b === void 0 ? void 0 : _b.call(_a, file, stat)) !== null && _c !== void 0 ? _c : false;
|
|
63
89
|
return isChild || isFileUnpacked;
|
|
64
90
|
};
|
|
65
|
-
this.processParentDirectories(isUnpacked, destination, results);
|
|
91
|
+
this.processParentDirectories(isUnpacked, destination, results, resultsPaths);
|
|
66
92
|
const result = await this.processFileOrSymlink({
|
|
67
93
|
file,
|
|
68
94
|
destination,
|
|
@@ -73,12 +99,13 @@ class AsarPackager {
|
|
|
73
99
|
});
|
|
74
100
|
if (result != null) {
|
|
75
101
|
results.push(result);
|
|
102
|
+
resultsPaths.add(result.path);
|
|
76
103
|
}
|
|
77
104
|
}
|
|
78
105
|
}
|
|
79
106
|
return results;
|
|
80
107
|
}
|
|
81
|
-
processParentDirectories(isUnpacked, destination, results) {
|
|
108
|
+
processParentDirectories(isUnpacked, destination, results, resultsPaths) {
|
|
82
109
|
// process parent directories
|
|
83
110
|
let superDir = path.dirname(path.normalize(destination));
|
|
84
111
|
while (superDir !== ".") {
|
|
@@ -88,8 +115,9 @@ class AsarPackager {
|
|
|
88
115
|
unpacked: isUnpacked(superDir),
|
|
89
116
|
};
|
|
90
117
|
// add to results if not already present
|
|
91
|
-
if (!
|
|
118
|
+
if (!resultsPaths.has(dir.path)) {
|
|
92
119
|
results.push(dir);
|
|
120
|
+
resultsPaths.add(dir.path);
|
|
93
121
|
}
|
|
94
122
|
superDir = path.dirname(superDir);
|
|
95
123
|
}
|
|
@@ -114,7 +142,7 @@ class AsarPackager {
|
|
|
114
142
|
return { path: destination, streamGenerator, unpacked, type: "file", stat: { mode: stat.mode, size } };
|
|
115
143
|
}
|
|
116
144
|
// verify that the file is not a direct link or symlinked to access/copy a system file
|
|
117
|
-
await this.protectSystemAndUnsafePaths(file);
|
|
145
|
+
await this.protectSystemAndUnsafePaths(file, await this.packager.info.getWorkspaceRoot());
|
|
118
146
|
const config = {
|
|
119
147
|
path: destination,
|
|
120
148
|
streamGenerator: () => fs.createReadStream(file),
|
|
@@ -128,8 +156,6 @@ class AsarPackager {
|
|
|
128
156
|
type: "file",
|
|
129
157
|
};
|
|
130
158
|
}
|
|
131
|
-
// guard against symlink pointing to outside workspace root
|
|
132
|
-
await this.protectSystemAndUnsafePaths(file, await this.packager.info.getWorkspaceRoot());
|
|
133
159
|
// okay, it must be a symlink. evaluate link to be relative to source file in asar
|
|
134
160
|
let link = await (0, fs_extra_1.readlink)(file);
|
|
135
161
|
if (path.isAbsolute(link)) {
|
|
@@ -184,75 +210,42 @@ class AsarPackager {
|
|
|
184
210
|
transformedFiles,
|
|
185
211
|
};
|
|
186
212
|
}
|
|
187
|
-
async
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
"/sbin",
|
|
194
|
-
"/System",
|
|
195
|
-
"/Library",
|
|
196
|
-
"/private/etc",
|
|
197
|
-
"/private/var/db",
|
|
198
|
-
"/private/var/root",
|
|
199
|
-
"/private/var/log",
|
|
200
|
-
"/private/tmp",
|
|
201
|
-
// macOS legacy symlinks
|
|
202
|
-
"/etc",
|
|
203
|
-
"/var",
|
|
204
|
-
"/tmp",
|
|
205
|
-
// Windows
|
|
206
|
-
process.env.SystemRoot,
|
|
207
|
-
process.env.WINDIR,
|
|
208
|
-
// process.env.ProgramFiles,
|
|
209
|
-
// process.env["ProgramFiles(x86)"],
|
|
210
|
-
// process.env.ProgramData,
|
|
211
|
-
// process.env.CommonProgramFiles,
|
|
212
|
-
// process.env["CommonProgramFiles(x86)"],
|
|
213
|
-
]
|
|
214
|
-
.filter(Boolean)
|
|
215
|
-
.map(p => path.resolve(p));
|
|
216
|
-
// Normalize to real paths to prevent symlink bypasses
|
|
217
|
-
const resolvedPaths = [];
|
|
218
|
-
for (const p of systemPaths) {
|
|
219
|
-
try {
|
|
220
|
-
resolvedPaths.push(await fs.realpath(p));
|
|
221
|
-
}
|
|
222
|
-
catch {
|
|
223
|
-
resolvedPaths.push(path.resolve(p));
|
|
213
|
+
async checkAgainstRoots(target, allowRoots) {
|
|
214
|
+
const resolved = await resolvePath(target);
|
|
215
|
+
for (const root of allowRoots) {
|
|
216
|
+
const resolvedRoot = root;
|
|
217
|
+
if (resolved === resolvedRoot || (resolved === null || resolved === void 0 ? void 0 : resolved.startsWith(resolvedRoot + path.sep))) {
|
|
218
|
+
return true;
|
|
224
219
|
}
|
|
225
220
|
}
|
|
226
|
-
return
|
|
221
|
+
return false;
|
|
227
222
|
}
|
|
228
223
|
async protectSystemAndUnsafePaths(file, workspaceRoot) {
|
|
229
|
-
const resolved = await
|
|
230
|
-
const
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
// Allow temp & cache folders
|
|
238
|
-
const tmpdir = await fs.realpath(os.tmpdir());
|
|
239
|
-
if (resolved.startsWith(tmpdir)) {
|
|
224
|
+
const resolved = await resolvePath(file);
|
|
225
|
+
const logFields = { source: file, realPath: resolved };
|
|
226
|
+
const isUnsafe = async () => {
|
|
227
|
+
const workspace = await resolvePath(workspaceRoot);
|
|
228
|
+
if (workspace && (resolved === null || resolved === void 0 ? void 0 : resolved.startsWith(workspace))) {
|
|
229
|
+
// if in workspace, always safe
|
|
240
230
|
return false;
|
|
241
231
|
}
|
|
242
|
-
const
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
232
|
+
const allowed = await this.checkAgainstRoots(file, await ALLOWLIST);
|
|
233
|
+
if (allowed) {
|
|
234
|
+
return false; // allowlist is priority
|
|
235
|
+
}
|
|
236
|
+
const denied = await this.checkAgainstRoots(file, await DENYLIST);
|
|
237
|
+
if (denied) {
|
|
238
|
+
builder_util_1.log.error(logFields, `denied access to system or unsafe path`);
|
|
239
|
+
return true;
|
|
247
240
|
}
|
|
241
|
+
// default
|
|
242
|
+
builder_util_1.log.debug(logFields, `path is outside of explicit safe paths, defaulting to safe`);
|
|
248
243
|
return false;
|
|
249
244
|
};
|
|
250
|
-
const unsafe = await
|
|
245
|
+
const unsafe = await isUnsafe();
|
|
251
246
|
if (unsafe) {
|
|
252
|
-
builder_util_1.log.error({ source: file, realPath: resolved }, `unable to copy, file is from outside the package to a system or unsafe path`);
|
|
253
247
|
throw new Error(`Cannot copy file [${file}] symlinked to file [${resolved}] outside the package to a system or unsafe path`);
|
|
254
248
|
}
|
|
255
|
-
return unsafe;
|
|
256
249
|
}
|
|
257
250
|
}
|
|
258
251
|
exports.AsarPackager = AsarPackager;
|
package/out/asar/asarUtil.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asarUtil.js","sourceRoot":"","sources":["../../src/asar/asarUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { createPackageFromStreams, AsarStreamType, AsarDirectory } from \"@electron/asar\"\nimport { log } from \"builder-util\"\nimport { Filter } from \"builder-util/out/fs\"\nimport * as fs from \"fs-extra\"\nimport { readlink } from \"fs-extra\"\nimport * as path from \"path\"\nimport { AsarOptions } from \"../options/PlatformSpecificBuildOptions\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { ResolvedFileSet, getDestinationPath } from \"../util/appFileCopier\"\nimport { detectUnpackedDirs } from \"./unpackDetector\"\nimport { Readable } from \"stream\"\nimport * as os from \"os\"\n\n/** @internal */\nexport class AsarPackager {\n private readonly outFile: string\n\n constructor(\n readonly packager: PlatformPackager<any>,\n private readonly config: {\n defaultDestination: string\n resourcePath: string\n options: AsarOptions\n unpackPattern: Filter | undefined\n }\n ) {\n this.outFile = path.join(config.resourcePath, `app.asar`)\n }\n\n async pack(fileSets: Array<ResolvedFileSet>) {\n const orderedFileSets = [\n // Write dependencies first to minimize offset changes to asar header\n ...fileSets.slice(1),\n\n // Finish with the app files that change most often\n fileSets[0],\n ].map(set => this.orderFileSet(set))\n\n const streams = await this.processFileSets(orderedFileSets)\n await this.executeElectronAsar(streams)\n }\n\n private async executeElectronAsar(streams: AsarStreamType[]) {\n // override logger temporarily to clean up console (electron/asar does some internal logging that blogs up the default electron-builder logs)\n const consoleLogger = console.log\n console.log = (...args) => {\n if (args[0] === \"Ordering file has 100% coverage.\") {\n return // no need to log, this means our ordering logic is working correctly\n }\n log.info({ args }, \"logging @electron/asar\")\n }\n await createPackageFromStreams(this.outFile, streams)\n console.log = consoleLogger\n }\n\n private async processFileSets(fileSets: ResolvedFileSet[]): Promise<AsarStreamType[]> {\n const unpackedPaths = new Set<string>()\n if (this.config.options.smartUnpack !== false) {\n for (const fileSet of fileSets) {\n detectUnpackedDirs(fileSet, unpackedPaths)\n }\n }\n\n const results: AsarStreamType[] = []\n for (const fileSet of fileSets) {\n // Don't use Promise.all, we need to retain order of execution/iteration through the already-ordered fileset\n for (const [index, file] of fileSet.files.entries()) {\n const transformedData = fileSet.transformedFiles?.get(index)\n const stat = fileSet.metadata.get(file)!\n const destination = path.relative(this.config.defaultDestination, getDestinationPath(file, fileSet))\n\n const paths = Array.from(unpackedPaths).map(p => path.normalize(p))\n\n const isChildDirectory = (fileOrDirPath: string) =>\n paths.includes(path.normalize(fileOrDirPath)) || paths.some(unpackedPath => path.normalize(fileOrDirPath).startsWith(unpackedPath + path.sep))\n const isUnpacked = (dir: string) => {\n const isChild = isChildDirectory(dir)\n const isFileUnpacked = this.config.unpackPattern?.(file, stat) ?? false\n return isChild || isFileUnpacked\n }\n\n this.processParentDirectories(isUnpacked, destination, results)\n\n const result = await this.processFileOrSymlink({\n file,\n destination,\n fileSet,\n transformedData,\n stat,\n isUnpacked,\n })\n if (result != null) {\n results.push(result)\n }\n }\n }\n return results\n }\n\n private processParentDirectories(isUnpacked: (path: string) => boolean, destination: string, results: AsarStreamType[]) {\n // process parent directories\n let superDir = path.dirname(path.normalize(destination))\n while (superDir !== \".\") {\n const dir: AsarDirectory = {\n type: \"directory\",\n path: superDir,\n unpacked: isUnpacked(superDir),\n }\n // add to results if not already present\n if (!results.some(r => r.path === dir.path)) {\n results.push(dir)\n }\n\n superDir = path.dirname(superDir)\n }\n }\n\n private async processFileOrSymlink(options: {\n file: string\n destination: string\n stat: fs.Stats\n fileSet: ResolvedFileSet\n transformedData: string | Buffer | undefined\n isUnpacked: (path: string) => boolean\n }): Promise<AsarStreamType> {\n const { isUnpacked, transformedData, file, destination, stat } = options\n const unpacked = isUnpacked(destination)\n\n if (!stat.isFile() && !stat.isSymbolicLink()) {\n return { path: destination, unpacked, type: \"directory\" }\n }\n\n // write any data if provided, skip symlink check\n if (transformedData != null) {\n const streamGenerator = () => {\n return new Readable({\n read() {\n this.push(transformedData)\n this.push(null)\n },\n })\n }\n const size = Buffer.byteLength(transformedData)\n return { path: destination, streamGenerator, unpacked, type: \"file\", stat: { mode: stat.mode, size } }\n }\n\n // verify that the file is not a direct link or symlinked to access/copy a system file\n await this.protectSystemAndUnsafePaths(file)\n\n const config = {\n path: destination,\n streamGenerator: () => fs.createReadStream(file),\n unpacked,\n stat,\n }\n\n // file, stream directly\n if (!stat.isSymbolicLink()) {\n return {\n ...config,\n type: \"file\",\n }\n }\n\n // guard against symlink pointing to outside workspace root\n await this.protectSystemAndUnsafePaths(file, await this.packager.info.getWorkspaceRoot())\n\n // okay, it must be a symlink. evaluate link to be relative to source file in asar\n let link = await readlink(file)\n if (path.isAbsolute(link)) {\n link = path.relative(path.dirname(file), link)\n }\n return {\n ...config,\n type: \"link\",\n symlink: link,\n }\n }\n\n private orderFileSet(fileSet: ResolvedFileSet): ResolvedFileSet {\n const sortedFileEntries = Array.from(fileSet.files.entries())\n\n sortedFileEntries.sort(([, a], [, b]) => {\n if (a === b) {\n return 0\n }\n\n // Place addons last because their signature changes per build\n const isAAddon = a.endsWith(\".node\")\n const isBAddon = b.endsWith(\".node\")\n if (isAAddon && !isBAddon) {\n return 1\n }\n if (isBAddon && !isAAddon) {\n return -1\n }\n\n // Otherwise order by name\n return a < b ? -1 : 1\n })\n\n let transformedFiles: Map<number, string | Buffer> | undefined\n if (fileSet.transformedFiles) {\n transformedFiles = new Map()\n\n const indexMap = new Map<number, number>()\n for (const [newIndex, [oldIndex]] of sortedFileEntries.entries()) {\n indexMap.set(oldIndex, newIndex)\n }\n\n for (const [oldIndex, value] of fileSet.transformedFiles) {\n const newIndex = indexMap.get(oldIndex)\n if (newIndex === undefined) {\n const file = fileSet.files[oldIndex]\n throw new Error(`Internal error: ${file} was lost while ordering asar`)\n }\n\n transformedFiles.set(newIndex, value)\n }\n }\n\n const { src, destination, metadata } = fileSet\n\n return {\n src,\n destination,\n metadata,\n files: sortedFileEntries.map(([, file]) => file),\n transformedFiles,\n }\n }\n\n private async getProtectedPaths(): Promise<string[]> {\n const systemPaths = [\n // Generic *nix\n \"/usr\",\n \"/lib\",\n \"/bin\",\n \"/sbin\",\n \"/System\",\n \"/Library\",\n \"/private/etc\",\n \"/private/var/db\",\n \"/private/var/root\",\n \"/private/var/log\",\n \"/private/tmp\",\n\n // macOS legacy symlinks\n \"/etc\",\n \"/var\",\n \"/tmp\",\n\n // Windows\n process.env.SystemRoot,\n process.env.WINDIR,\n // process.env.ProgramFiles,\n // process.env[\"ProgramFiles(x86)\"],\n // process.env.ProgramData,\n // process.env.CommonProgramFiles,\n // process.env[\"CommonProgramFiles(x86)\"],\n ]\n .filter(Boolean)\n .map(p => path.resolve(p as string))\n\n // Normalize to real paths to prevent symlink bypasses\n const resolvedPaths: string[] = []\n for (const p of systemPaths) {\n try {\n resolvedPaths.push(await fs.realpath(p))\n } catch {\n resolvedPaths.push(path.resolve(p))\n }\n }\n\n return resolvedPaths\n }\n\n private async protectSystemAndUnsafePaths(file: string, workspaceRoot?: string): Promise<boolean> {\n const resolved = await fs.realpath(file).catch(() => path.resolve(file))\n\n const scan = async () => {\n if (workspaceRoot) {\n const workspace = path.resolve(workspaceRoot)\n\n if (!resolved.startsWith(workspace)) {\n return true\n }\n }\n\n // Allow temp & cache folders\n const tmpdir = await fs.realpath(os.tmpdir())\n if (resolved.startsWith(tmpdir)) {\n return false\n }\n\n const blockedSystemPaths = await this.getProtectedPaths()\n for (const sys of blockedSystemPaths) {\n if (resolved.startsWith(sys)) {\n return true\n }\n }\n\n return false\n }\n\n const unsafe = await scan()\n\n if (unsafe) {\n log.error({ source: file, realPath: resolved }, `unable to copy, file is from outside the package to a system or unsafe path`)\n throw new Error(`Cannot copy file [${file}] symlinked to file [${resolved}] outside the package to a system or unsafe path`)\n }\n return unsafe\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"asarUtil.js","sourceRoot":"","sources":["../../src/asar/asarUtil.ts"],"names":[],"mappings":";;;AAAA,yCAAwF;AACxF,+CAAkC;AAClC,4CAAoD;AACpD,+BAA8B;AAC9B,uCAAmC;AACnC,6BAA4B;AAG5B,yDAA2E;AAC3E,qDAAqD;AACrD,mCAAiC;AACjC,yBAAwB;AAExB,MAAM,WAAW,GAAG,KAAK,EAAE,IAAwB,EAA+B,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,IAAA,WAAM,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;AACnL,MAAM,YAAY,GAAG,KAAK,EAAE,SAAiC,EAAE,EAAE;IAC/D,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAA;AAC9G,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,YAAY,CAAC;IAC5B,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IAEN,MAAM;IACN,MAAM,EAAE,gLAAgL;IAExL,2BAA2B;IAC3B,SAAS;IACT,UAAU;IACV,UAAU;IAEV,6BAA6B;IAC7B,OAAO,CAAC,GAAG,CAAC,UAAU;IACtB,OAAO,CAAC,GAAG,CAAC,MAAM;CACnB,CAAC,CAAA;AAEF,MAAM,SAAS,GAAG,YAAY,CAAC;IAC7B,EAAE,CAAC,MAAM,EAAE,EAAE,wBAAwB;IACrC,EAAE,CAAC,OAAO,EAAE,EAAE,wBAAwB;CACvC,CAAC,CAAA;AAEF,gBAAgB;AAChB,MAAa,YAAY;IAGvB,YACW,QAA+B,EACvB,MAKhB;QANQ,aAAQ,GAAR,QAAQ,CAAuB;QACvB,WAAM,GAAN,MAAM,CAKtB;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgC;QACzC,MAAM,eAAe,GAAG;YACtB,qEAAqE;YACrE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAEpB,mDAAmD;YACnD,QAAQ,CAAC,CAAC,CAAC;SACZ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;QAEpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAA;QAC3D,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,OAAyB;QACzD,6IAA6I;QAC7I,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAA;QACjC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,kCAAkC,EAAE,CAAC;gBACnD,OAAM,CAAC,qEAAqE;YAC9E,CAAC;YACD,kBAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,wBAAwB,CAAC,CAAA;QAC9C,CAAC,CAAA;QACD,MAAM,IAAA,+BAAwB,EAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACrD,OAAO,CAAC,GAAG,GAAG,aAAa,CAAA;IAC7B,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,QAA2B;;QACvD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;QACvC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAA,mCAAkB,EAAC,OAAO,EAAE,aAAa,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAqB,EAAE,CAAA;QACpC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;QACtC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,4GAA4G;YAC5G,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBACpD,MAAM,eAAe,GAAG,MAAA,OAAO,CAAC,gBAAgB,0CAAE,GAAG,CAAC,KAAK,CAAC,CAAA;gBAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAA;gBACxC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAA,kCAAkB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;gBAEpG,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;gBAEnE,MAAM,gBAAgB,GAAG,CAAC,aAAqB,EAAE,EAAE,CACjD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;gBAChJ,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;;oBACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;oBACrC,MAAM,cAAc,GAAG,MAAA,MAAA,MAAA,IAAI,CAAC,MAAM,EAAC,aAAa,mDAAG,IAAI,EAAE,IAAI,CAAC,mCAAI,KAAK,CAAA;oBACvE,OAAO,OAAO,IAAI,cAAc,CAAA;gBAClC,CAAC,CAAA;gBAED,IAAI,CAAC,wBAAwB,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;gBAE7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC;oBAC7C,IAAI;oBACJ,WAAW;oBACX,OAAO;oBACP,eAAe;oBACf,IAAI;oBACJ,UAAU;iBACX,CAAC,CAAA;gBACF,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACnB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBACpB,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,wBAAwB,CAAC,UAAqC,EAAE,WAAmB,EAAE,OAAyB,EAAE,YAAyB;QAC/I,6BAA6B;QAC7B,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAA;QACxD,OAAO,QAAQ,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,GAAG,GAAkB;gBACzB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC;aAC/B,CAAA;YACD,wCAAwC;YACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACjB,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC5B,CAAC;YAED,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,OAOlC;QACC,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;QACxE,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;QAExC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC7C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;QAC3D,CAAC;QAED,iDAAiD;QACjD,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;YAC5B,MAAM,eAAe,GAAG,GAAG,EAAE;gBAC3B,OAAO,IAAI,iBAAQ,CAAC;oBAClB,IAAI;wBACF,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;wBAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oBACjB,CAAC;iBACF,CAAC,CAAA;YACJ,CAAC,CAAA;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;YAC/C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;QACxG,CAAC;QAED,sFAAsF;QACtF,MAAM,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;QAEzF,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,WAAW;YACjB,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAChD,QAAQ;YACR,IAAI;SACL,CAAA;QAED,wBAAwB;QACxB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,OAAO;gBACL,GAAG,MAAM;gBACT,IAAI,EAAE,MAAM;aACb,CAAA;QACH,CAAC;QAED,kFAAkF;QAClF,IAAI,IAAI,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;QAChD,CAAC;QACD,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAEO,YAAY,CAAC,OAAwB;QAC3C,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAE7D,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACZ,OAAO,CAAC,CAAA;YACV,CAAC;YAED,8DAA8D;YAC9D,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YACpC,IAAI,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1B,OAAO,CAAC,CAAA;YACV,CAAC;YACD,IAAI,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1B,OAAO,CAAC,CAAC,CAAA;YACX,CAAC;YAED,0BAA0B;YAC1B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;QAEF,IAAI,gBAA0D,CAAA;QAC9D,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAA;YAE5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;YAC1C,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;gBACjE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAClC,CAAC;YAED,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACvC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;oBACpC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,+BAA+B,CAAC,CAAA;gBACzE,CAAC;gBAED,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;QAE9C,OAAO;YACL,GAAG;YACH,WAAW;YACX,QAAQ;YACR,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;YAChD,gBAAgB;SACjB,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,MAAc,EAAE,UAAoB;QAClE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAA;QAE1C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAA;YACzB,IAAI,QAAQ,KAAK,YAAY,KAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA,EAAE,CAAC;gBAC/E,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,KAAK,CAAC,2BAA2B,CAAC,IAAY,EAAE,aAAqB;QAC3E,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,SAAS,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;QAEtD,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,CAAA;YAElD,IAAI,SAAS,KAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,CAAC,SAAS,CAAC,CAAA,EAAE,CAAC;gBACjD,+BAA+B;gBAC/B,OAAO,KAAK,CAAA;YACd,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,SAAS,CAAC,CAAA;YACnE,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,KAAK,CAAA,CAAC,wBAAwB;YACvC,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,CAAA;YACjE,IAAI,MAAM,EAAE,CAAC;gBACX,kBAAG,CAAC,KAAK,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAA;gBAC9D,OAAO,IAAI,CAAA;YACb,CAAC;YACD,UAAU;YACV,kBAAG,CAAC,KAAK,CAAC,SAAS,EAAE,4DAA4D,CAAC,CAAA;YAClF,OAAO,KAAK,CAAA;QACd,CAAC,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAA;QAE/B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,wBAAwB,QAAQ,kDAAkD,CAAC,CAAA;QAC9H,CAAC;IACH,CAAC;CACF;AAvQD,oCAuQC","sourcesContent":["import { createPackageFromStreams, AsarStreamType, AsarDirectory } from \"@electron/asar\"\nimport { log } from \"builder-util\"\nimport { exists, Filter } from \"builder-util/out/fs\"\nimport * as fs from \"fs-extra\"\nimport { readlink } from \"fs-extra\"\nimport * as path from \"path\"\nimport { AsarOptions } from \"../options/PlatformSpecificBuildOptions\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { ResolvedFileSet, getDestinationPath } from \"../util/appFileCopier\"\nimport { detectUnpackedDirs } from \"./unpackDetector\"\nimport { Readable } from \"stream\"\nimport * as os from \"os\"\n\nconst resolvePath = async (file: string | undefined): Promise<string | undefined> => (file && (await exists(file)) ? fs.realpath(file).catch(() => path.resolve(file)) : undefined)\nconst resolvePaths = async (filepaths: (string | undefined)[]) => {\n return Promise.all(filepaths.map(resolvePath)).then(paths => paths.filter((it): it is string => it != null))\n}\n\nconst DENYLIST = resolvePaths([\n \"/usr\",\n \"/lib\",\n \"/bin\",\n \"/sbin\",\n \"/etc\",\n\n \"/tmp\",\n \"/var\", // block whole /var by default. If $HOME is under /var, it's explicitly in ALLOWLIST - https://github.com/electron-userland/electron-builder/issues/9025#issuecomment-3575380041\n\n // macOS system directories\n \"/System\",\n \"/Library\",\n \"/private\",\n\n // Windows system directories\n process.env.SystemRoot,\n process.env.WINDIR,\n])\n\nconst ALLOWLIST = resolvePaths([\n os.tmpdir(), // always allow temp dir\n os.homedir(), // always allow home dir\n])\n\n/** @internal */\nexport class AsarPackager {\n private readonly outFile: string\n\n constructor(\n readonly packager: PlatformPackager<any>,\n private readonly config: {\n defaultDestination: string\n resourcePath: string\n options: AsarOptions\n unpackPattern: Filter | undefined\n }\n ) {\n this.outFile = path.join(config.resourcePath, `app.asar`)\n }\n\n async pack(fileSets: Array<ResolvedFileSet>) {\n const orderedFileSets = [\n // Write dependencies first to minimize offset changes to asar header\n ...fileSets.slice(1),\n\n // Finish with the app files that change most often\n fileSets[0],\n ].map(set => this.orderFileSet(set))\n\n const streams = await this.processFileSets(orderedFileSets)\n await this.executeElectronAsar(streams)\n }\n\n private async executeElectronAsar(streams: AsarStreamType[]) {\n // override logger temporarily to clean up console (electron/asar does some internal logging that blogs up the default electron-builder logs)\n const consoleLogger = console.log\n console.log = (...args) => {\n if (args[0] === \"Ordering file has 100% coverage.\") {\n return // no need to log, this means our ordering logic is working correctly\n }\n log.info({ args }, \"logging @electron/asar\")\n }\n await createPackageFromStreams(this.outFile, streams)\n console.log = consoleLogger\n }\n\n private async processFileSets(fileSets: ResolvedFileSet[]): Promise<AsarStreamType[]> {\n const unpackedPaths = new Set<string>()\n if (this.config.options.smartUnpack !== false) {\n for (const fileSet of fileSets) {\n detectUnpackedDirs(fileSet, unpackedPaths)\n }\n }\n\n const results: AsarStreamType[] = []\n const resultsPaths = new Set<string>()\n for (const fileSet of fileSets) {\n // Don't use Promise.all, we need to retain order of execution/iteration through the already-ordered fileset\n for (const [index, file] of fileSet.files.entries()) {\n const transformedData = fileSet.transformedFiles?.get(index)\n const stat = fileSet.metadata.get(file)!\n const destination = path.relative(this.config.defaultDestination, getDestinationPath(file, fileSet))\n\n const paths = Array.from(unpackedPaths).map(p => path.normalize(p))\n\n const isChildDirectory = (fileOrDirPath: string) =>\n paths.includes(path.normalize(fileOrDirPath)) || paths.some(unpackedPath => path.normalize(fileOrDirPath).startsWith(unpackedPath + path.sep))\n const isUnpacked = (dir: string) => {\n const isChild = isChildDirectory(dir)\n const isFileUnpacked = this.config.unpackPattern?.(file, stat) ?? false\n return isChild || isFileUnpacked\n }\n\n this.processParentDirectories(isUnpacked, destination, results, resultsPaths)\n\n const result = await this.processFileOrSymlink({\n file,\n destination,\n fileSet,\n transformedData,\n stat,\n isUnpacked,\n })\n if (result != null) {\n results.push(result)\n resultsPaths.add(result.path)\n }\n }\n }\n return results\n }\n\n private processParentDirectories(isUnpacked: (path: string) => boolean, destination: string, results: AsarStreamType[], resultsPaths: Set<string>) {\n // process parent directories\n let superDir = path.dirname(path.normalize(destination))\n while (superDir !== \".\") {\n const dir: AsarDirectory = {\n type: \"directory\",\n path: superDir,\n unpacked: isUnpacked(superDir),\n }\n // add to results if not already present\n if (!resultsPaths.has(dir.path)) {\n results.push(dir)\n resultsPaths.add(dir.path)\n }\n\n superDir = path.dirname(superDir)\n }\n }\n\n private async processFileOrSymlink(options: {\n file: string\n destination: string\n stat: fs.Stats\n fileSet: ResolvedFileSet\n transformedData: string | Buffer | undefined\n isUnpacked: (path: string) => boolean\n }): Promise<AsarStreamType> {\n const { isUnpacked, transformedData, file, destination, stat } = options\n const unpacked = isUnpacked(destination)\n\n if (!stat.isFile() && !stat.isSymbolicLink()) {\n return { path: destination, unpacked, type: \"directory\" }\n }\n\n // write any data if provided, skip symlink check\n if (transformedData != null) {\n const streamGenerator = () => {\n return new Readable({\n read() {\n this.push(transformedData)\n this.push(null)\n },\n })\n }\n const size = Buffer.byteLength(transformedData)\n return { path: destination, streamGenerator, unpacked, type: \"file\", stat: { mode: stat.mode, size } }\n }\n\n // verify that the file is not a direct link or symlinked to access/copy a system file\n await this.protectSystemAndUnsafePaths(file, await this.packager.info.getWorkspaceRoot())\n\n const config = {\n path: destination,\n streamGenerator: () => fs.createReadStream(file),\n unpacked,\n stat,\n }\n\n // file, stream directly\n if (!stat.isSymbolicLink()) {\n return {\n ...config,\n type: \"file\",\n }\n }\n\n // okay, it must be a symlink. evaluate link to be relative to source file in asar\n let link = await readlink(file)\n if (path.isAbsolute(link)) {\n link = path.relative(path.dirname(file), link)\n }\n return {\n ...config,\n type: \"link\",\n symlink: link,\n }\n }\n\n private orderFileSet(fileSet: ResolvedFileSet): ResolvedFileSet {\n const sortedFileEntries = Array.from(fileSet.files.entries())\n\n sortedFileEntries.sort(([, a], [, b]) => {\n if (a === b) {\n return 0\n }\n\n // Place addons last because their signature changes per build\n const isAAddon = a.endsWith(\".node\")\n const isBAddon = b.endsWith(\".node\")\n if (isAAddon && !isBAddon) {\n return 1\n }\n if (isBAddon && !isAAddon) {\n return -1\n }\n\n // Otherwise order by name\n return a < b ? -1 : 1\n })\n\n let transformedFiles: Map<number, string | Buffer> | undefined\n if (fileSet.transformedFiles) {\n transformedFiles = new Map()\n\n const indexMap = new Map<number, number>()\n for (const [newIndex, [oldIndex]] of sortedFileEntries.entries()) {\n indexMap.set(oldIndex, newIndex)\n }\n\n for (const [oldIndex, value] of fileSet.transformedFiles) {\n const newIndex = indexMap.get(oldIndex)\n if (newIndex === undefined) {\n const file = fileSet.files[oldIndex]\n throw new Error(`Internal error: ${file} was lost while ordering asar`)\n }\n\n transformedFiles.set(newIndex, value)\n }\n }\n\n const { src, destination, metadata } = fileSet\n\n return {\n src,\n destination,\n metadata,\n files: sortedFileEntries.map(([, file]) => file),\n transformedFiles,\n }\n }\n\n private async checkAgainstRoots(target: string, allowRoots: string[]): Promise<boolean> {\n const resolved = await resolvePath(target)\n\n for (const root of allowRoots) {\n const resolvedRoot = root\n if (resolved === resolvedRoot || resolved?.startsWith(resolvedRoot + path.sep)) {\n return true\n }\n }\n return false\n }\n\n private async protectSystemAndUnsafePaths(file: string, workspaceRoot: string): Promise<void> {\n const resolved = await resolvePath(file)\n const logFields = { source: file, realPath: resolved }\n\n const isUnsafe = async () => {\n const workspace = await resolvePath(workspaceRoot)\n\n if (workspace && resolved?.startsWith(workspace)) {\n // if in workspace, always safe\n return false\n }\n\n const allowed = await this.checkAgainstRoots(file, await ALLOWLIST)\n if (allowed) {\n return false // allowlist is priority\n }\n\n const denied = await this.checkAgainstRoots(file, await DENYLIST)\n if (denied) {\n log.error(logFields, `denied access to system or unsafe path`)\n return true\n }\n // default\n log.debug(logFields, `path is outside of explicit safe paths, defaulting to safe`)\n return false\n }\n\n const unsafe = await isUnsafe()\n\n if (unsafe) {\n throw new Error(`Cannot copy file [${file}] symlinked to file [${resolved}] outside the package to a system or unsafe path`)\n }\n }\n}\n"]}
|
|
@@ -36,9 +36,7 @@ function detectUnpackedDirs(fileSet, autoUnpackDirs) {
|
|
|
36
36
|
if (!shouldUnpack) {
|
|
37
37
|
continue;
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
builder_util_1.log.debug({ file: stat.moduleFullFilePath, reason: "contains executable code" }, "not packed into asar archive");
|
|
41
|
-
}
|
|
39
|
+
builder_util_1.log.debug({ file: stat.moduleFullFilePath, reason: "contains executable code" }, "not packed into asar archive");
|
|
42
40
|
autoUnpackDirs.add(stat.moduleRootPath);
|
|
43
41
|
}
|
|
44
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unpackDetector.js","sourceRoot":"","sources":["../../src/asar/unpackDetector.ts"],"names":[],"mappings":";;AAKA,gCAGC;AAGD,
|
|
1
|
+
{"version":3,"file":"unpackDetector.js","sourceRoot":"","sources":["../../src/asar/unpackDetector.ts"],"names":[],"mappings":";;AAKA,gCAGC;AAGD,gDAiCC;AA5CD,+CAA+C;AAC/C,+CAA+C;AAC/C,6BAA4B;AAG5B,SAAgB,UAAU,CAAC,IAAY;IACrC,oEAAoE;IACpE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AACpI,CAAC;AAED,gBAAgB;AAChB,SAAgB,kBAAkB,CAAC,OAAwB,EAAE,cAA2B;IACtF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,IAAI,GAAgB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACpE,SAAQ;QACV,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,SAAQ;QACV,CAAC;QAED,oEAAoE;QACpE,IAAI,YAAY,GAAG,KAAK,CAAA;QACxB,uEAAuE;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QAC/C,IAAI,UAAU,KAAK,gBAAgB,IAAI,UAAU,KAAK,eAAe,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1F,YAAY,GAAG,IAAI,CAAA;QACrB,CAAC;aAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACzB,YAAY,GAAG,CAAC,CAAC,IAAA,+BAAgB,EAAC,IAAI,CAAC,CAAA;QACzC,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,SAAQ;QACV,CAAC;QAED,kBAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,0BAA0B,EAAE,EAAE,8BAA8B,CAAC,CAAA;QAChH,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACzC,CAAC;AACH,CAAC","sourcesContent":["import { FilterStats, log } from \"builder-util\"\nimport { isBinaryFileSync } from \"isbinaryfile\"\nimport * as path from \"path\"\nimport { ResolvedFileSet } from \"../util/appFileCopier\"\n\nexport function isLibOrExe(file: string): boolean {\n // https://github.com/electron-userland/electron-builder/issues/3038\n return file.endsWith(\".dll\") || file.endsWith(\".exe\") || file.endsWith(\".dylib\") || file.endsWith(\".so\") || file.endsWith(\".node\")\n}\n\n/** @internal */\nexport function detectUnpackedDirs(fileSet: ResolvedFileSet, autoUnpackDirs: Set<string>) {\n const metadata = fileSet.metadata\n\n for (let i = 0, n = fileSet.files.length; i < n; i++) {\n const file = fileSet.files[i]\n const stat: FilterStats = metadata.get(file)!\n if (!stat.moduleRootPath || autoUnpackDirs.has(stat.moduleRootPath)) {\n continue\n }\n\n if (!stat.isFile()) {\n continue\n }\n\n // https://github.com/electron-userland/electron-builder/issues/2679\n let shouldUnpack = false\n // ffprobe-static and ffmpeg-static are known packages to always unpack\n const moduleName = stat.moduleName\n const fileBaseName = path.basename(file)\n const hasExtension = path.extname(fileBaseName)\n if (moduleName === \"ffprobe-static\" || moduleName === \"ffmpeg-static\" || isLibOrExe(file)) {\n shouldUnpack = true\n } else if (!hasExtension) {\n shouldUnpack = !!isBinaryFileSync(file)\n }\n\n if (!shouldUnpack) {\n continue\n }\n\n log.debug({ file: stat.moduleFullFilePath, reason: \"contains executable code\" }, \"not packed into asar archive\")\n autoUnpackDirs.add(stat.moduleRootPath)\n }\n}\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { CancellationToken } from "builder-util-runtime";
|
|
1
|
+
import { CancellationToken, Nullish } from "builder-util-runtime";
|
|
2
2
|
import { TmpDir } from "temp-file";
|
|
3
3
|
import { NpmNodeModulesCollector } from "./npmNodeModulesCollector";
|
|
4
4
|
import { getPackageManagerCommand, PM } from "./packageManager";
|
|
5
5
|
import { PnpmNodeModulesCollector } from "./pnpmNodeModulesCollector";
|
|
6
6
|
import { NodeModuleInfo } from "./types";
|
|
7
7
|
import { YarnNodeModulesCollector } from "./yarnNodeModulesCollector";
|
|
8
|
+
import { Lazy } from "lazy-val";
|
|
8
9
|
export { getPackageManagerCommand, PM };
|
|
9
10
|
export declare function getCollectorByPackageManager(pm: PM, rootDir: string, tempDirManager: TmpDir): NpmNodeModulesCollector | PnpmNodeModulesCollector | YarnNodeModulesCollector;
|
|
10
11
|
export declare function getNodeModules(pm: PM, { rootDir, tempDirManager, cancellationToken, packageName, }: {
|
|
@@ -13,9 +14,11 @@ export declare function getNodeModules(pm: PM, { rootDir, tempDirManager, cancel
|
|
|
13
14
|
cancellationToken: CancellationToken;
|
|
14
15
|
packageName: string;
|
|
15
16
|
}): Promise<NodeModuleInfo[]>;
|
|
16
|
-
export declare
|
|
17
|
+
export declare const determinePackageManagerEnv: ({ projectDir, appDir, workspaceRoot }: {
|
|
18
|
+
projectDir: string;
|
|
19
|
+
appDir: string;
|
|
20
|
+
workspaceRoot: string | Nullish;
|
|
21
|
+
}) => Lazy<{
|
|
17
22
|
pm: PM;
|
|
18
|
-
|
|
19
|
-
resolvedDirectory: string | undefined;
|
|
23
|
+
workspaceRoot: Promise<string | undefined>;
|
|
20
24
|
}>;
|
|
21
|
-
export declare function findWorkspaceRoot(pm: PM, cwd: string): Promise<string | undefined>;
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PM = exports.getPackageManagerCommand = void 0;
|
|
3
|
+
exports.determinePackageManagerEnv = exports.PM = exports.getPackageManagerCommand = void 0;
|
|
4
4
|
exports.getCollectorByPackageManager = getCollectorByPackageManager;
|
|
5
5
|
exports.getNodeModules = getNodeModules;
|
|
6
|
-
exports.detectPackageManager = detectPackageManager;
|
|
7
|
-
exports.findWorkspaceRoot = findWorkspaceRoot;
|
|
8
|
-
const builder_util_1 = require("builder-util");
|
|
9
|
-
const fs = require("fs-extra");
|
|
10
|
-
const path = require("path");
|
|
11
6
|
const npmNodeModulesCollector_1 = require("./npmNodeModulesCollector");
|
|
12
7
|
const packageManager_1 = require("./packageManager");
|
|
13
8
|
Object.defineProperty(exports, "getPackageManagerCommand", { enumerable: true, get: function () { return packageManager_1.getPackageManagerCommand; } });
|
|
@@ -16,6 +11,10 @@ const pnpmNodeModulesCollector_1 = require("./pnpmNodeModulesCollector");
|
|
|
16
11
|
const yarnBerryNodeModulesCollector_1 = require("./yarnBerryNodeModulesCollector");
|
|
17
12
|
const yarnNodeModulesCollector_1 = require("./yarnNodeModulesCollector");
|
|
18
13
|
const bunNodeModulesCollector_1 = require("./bunNodeModulesCollector");
|
|
14
|
+
const lazy_val_1 = require("lazy-val");
|
|
15
|
+
const builder_util_1 = require("builder-util");
|
|
16
|
+
const fs = require("fs-extra");
|
|
17
|
+
const path = require("path");
|
|
19
18
|
function getCollectorByPackageManager(pm, rootDir, tempDirManager) {
|
|
20
19
|
switch (pm) {
|
|
21
20
|
case packageManager_1.PM.PNPM:
|
|
@@ -27,7 +26,6 @@ function getCollectorByPackageManager(pm, rootDir, tempDirManager) {
|
|
|
27
26
|
case packageManager_1.PM.BUN:
|
|
28
27
|
return new bunNodeModulesCollector_1.BunNodeModulesCollector(rootDir, tempDirManager);
|
|
29
28
|
case packageManager_1.PM.NPM:
|
|
30
|
-
default:
|
|
31
29
|
return new npmNodeModulesCollector_1.NpmNodeModulesCollector(rootDir, tempDirManager);
|
|
32
30
|
}
|
|
33
31
|
}
|
|
@@ -35,40 +33,29 @@ function getNodeModules(pm, { rootDir, tempDirManager, cancellationToken, packag
|
|
|
35
33
|
const collector = getCollectorByPackageManager(pm, rootDir, tempDirManager);
|
|
36
34
|
return collector.getNodeModules({ cancellationToken, packageName });
|
|
37
35
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const resolvedPackageManager = await resolveIfYarn(pm, version, dir);
|
|
50
|
-
builder_util_1.log.debug({ resolvedPackageManager, packageManager, cwd: dir }, "packageManager field detected in package.json");
|
|
51
|
-
return { pm: resolvedPackageManager, corepackConfig: packageManager, resolvedDirectory: dir };
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
pm = await (0, packageManager_1.detectPackageManagerByFile)(dir);
|
|
55
|
-
if (pm) {
|
|
56
|
-
const resolvedPackageManager = await resolveIfYarn(pm, "", dir);
|
|
57
|
-
builder_util_1.log.debug({ resolvedPackageManager, cwd: dir }, "packageManager detected by file");
|
|
58
|
-
return { pm: resolvedPackageManager, resolvedDirectory: dir, corepackConfig: undefined };
|
|
59
|
-
}
|
|
36
|
+
const determinePackageManagerEnv = ({ projectDir, appDir, workspaceRoot }) => new lazy_val_1.Lazy(async () => {
|
|
37
|
+
const availableDirs = [projectDir, appDir, workspaceRoot].filter((it) => it != null);
|
|
38
|
+
const pm = await (0, packageManager_1.detectPackageManager)(availableDirs);
|
|
39
|
+
const root = await findWorkspaceRoot(pm.pm, projectDir);
|
|
40
|
+
if (root != null) {
|
|
41
|
+
// re-detect package manager from workspace root, this seems particularly necessary for pnpm workspaces
|
|
42
|
+
const actualPm = await (0, packageManager_1.detectPackageManager)([root]);
|
|
43
|
+
return {
|
|
44
|
+
pm: actualPm.pm,
|
|
45
|
+
workspaceRoot: Promise.resolve(actualPm.resolvedDirectory),
|
|
46
|
+
};
|
|
60
47
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
48
|
+
return {
|
|
49
|
+
pm: pm.pm,
|
|
50
|
+
workspaceRoot: Promise.resolve(pm.resolvedDirectory),
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
exports.determinePackageManagerEnv = determinePackageManagerEnv;
|
|
67
54
|
async function findWorkspaceRoot(pm, cwd) {
|
|
68
55
|
let command;
|
|
69
56
|
switch (pm) {
|
|
70
57
|
case packageManager_1.PM.PNPM:
|
|
71
|
-
command = { command: "pnpm", args: ["root", "
|
|
58
|
+
command = { command: "pnpm", args: ["--workspace-root", "exec", "pwd"] };
|
|
72
59
|
break;
|
|
73
60
|
case packageManager_1.PM.YARN_BERRY:
|
|
74
61
|
command = { command: "yarn", args: ["config", "get", "workspaceRoot"] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node-module-collector/index.ts"],"names":[],"mappings":";;;AAeA,oEAcC;AAED,wCAgBC;AAED,oDA+BC;AAED,8CA6CC;AA/HD,+CAAiD;AAEjD,+BAA8B;AAC9B,6BAA4B;AAE5B,uEAAmE;AACnE,qDAA4J;AAOnJ,yGAP6F,yCAAwB,OAO7F;AAAE,mFAP6F,mBAAE,OAO7F;AANrC,yEAAqE;AAErE,mFAA+E;AAC/E,yEAAqE;AACrE,uEAAmE;AAInE,SAAgB,4BAA4B,CAAC,EAAM,EAAE,OAAe,EAAE,cAAsB;IAC1F,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,mBAAE,CAAC,IAAI;YACV,OAAO,IAAI,mDAAwB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAC9D,KAAK,mBAAE,CAAC,IAAI;YACV,OAAO,IAAI,mDAAwB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAC9D,KAAK,mBAAE,CAAC,UAAU;YAChB,OAAO,IAAI,6DAA6B,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QACnE,KAAK,mBAAE,CAAC,GAAG;YACT,OAAO,IAAI,iDAAuB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAC7D,KAAK,mBAAE,CAAC,GAAG,CAAC;QACZ;YACE,OAAO,IAAI,iDAAuB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAC5B,EAAM,EACN,EACE,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,WAAW,GAMZ;IAED,MAAM,SAAS,GAAG,4BAA4B,CAAC,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC,CAAA;IAC3E,OAAO,SAAS,CAAC,cAAc,CAAC,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,CAAA;AACrE,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAC,WAAqB;;IAC9D,IAAI,EAAE,GAAc,IAAI,CAAA;IACxB,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA,CAAC,wFAAwF;IAE9I,MAAM,aAAa,GAAG,CAAC,EAAM,EAAE,OAAe,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,mBAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,gCAAiB,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAEvH,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QACtD,MAAM,cAAc,GAAG,CAAC,MAAM,IAAA,qBAAM,EAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,0CAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;QACjI,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC/C,IAAI,MAAM,CAAC,MAAM,CAAC,mBAAE,CAAC,CAAC,QAAQ,CAAC,EAAQ,CAAC,EAAE,CAAC;gBACzC,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,EAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;gBAC1E,kBAAG,CAAC,KAAK,CAAC,EAAE,sBAAsB,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,+CAA+C,CAAC,CAAA;gBAChH,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAA;YAC/F,CAAC;QACH,CAAC;QAED,EAAE,GAAG,MAAM,IAAA,2CAA0B,EAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;YAC/D,kBAAG,CAAC,KAAK,CAAC,EAAE,sBAAsB,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,iCAAiC,CAAC,CAAA;YAClF,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,CAAA;QAC1F,CAAC;IACH,CAAC;IAED,EAAE,GAAG,IAAA,0CAAyB,GAAE,IAAI,mBAAE,CAAC,GAAG,CAAA;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,mCAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/H,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;IAC/D,kBAAG,CAAC,KAAK,CAAC,EAAE,sBAAsB,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,4EAA4E,CAAC,CAAA;IAClI,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,CAAA;AAChG,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,EAAM,EAAE,GAAW;IACzD,IAAI,OAAwD,CAAA;IAE5D,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,mBAAE,CAAC,IAAI;YACV,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAA;YACnD,MAAK;QAEP,KAAK,mBAAE,CAAC,UAAU;YAChB,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,CAAA;YACvE,MAAK;QAEP,KAAK,mBAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACb,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAA;YACvE,MAAK;QACP,CAAC;QAED,KAAK,mBAAE,CAAC,GAAG;YACT,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAA;YAC1D,MAAK;QAEP,KAAK,mBAAE,CAAC,GAAG,CAAC;QACZ;YACE,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAA;YACpD,MAAK;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAK,EAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;SACpG,IAAI,CAAC,EAAE,CAAC,EAAE;QACT,MAAM,GAAG,GAAG,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,IAAI,EAAE,CAAA;QACtB,IAAI,EAAE,KAAK,mBAAE,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,CAAC,oCAAoC;YACpD,OAAO,8BAA8B,CAAC,GAAG,CAAC,CAAA;QAC5C,CAAC;aAAM,IAAI,EAAE,KAAK,mBAAE,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3C,OAAO,8BAA8B,CAAC,GAAG,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM,CAAA,IAAI,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAA;IAC9D,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE,CAAC,8BAA8B,CAAC,GAAG,CAAC,CAAC,CAAA;IAEnD,kBAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAA;IAC1H,OAAO,MAAM,CAAA;AACf,CAAC;AAED,KAAK,UAAU,8BAA8B,CAAC,GAAW;IACvD,IAAI,OAAO,GAAG,GAAG,CAAA;IACjB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAClD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;YAC1D,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBACnB,OAAO,OAAO,CAAA;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACpC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,MAAK;QACP,CAAC;QACD,OAAO,GAAG,MAAM,CAAA;IAClB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["import { exists, log, spawn } from \"builder-util\"\nimport { CancellationToken } from \"builder-util-runtime\"\nimport * as fs from \"fs-extra\"\nimport * as path from \"path\"\nimport { TmpDir } from \"temp-file\"\nimport { NpmNodeModulesCollector } from \"./npmNodeModulesCollector\"\nimport { detectYarnBerry as detectIfYarnBerry, detectPackageManagerByEnv, detectPackageManagerByFile, getPackageManagerCommand, PM } from \"./packageManager\"\nimport { PnpmNodeModulesCollector } from \"./pnpmNodeModulesCollector\"\nimport { NodeModuleInfo } from \"./types\"\nimport { YarnBerryNodeModulesCollector } from \"./yarnBerryNodeModulesCollector\"\nimport { YarnNodeModulesCollector } from \"./yarnNodeModulesCollector\"\nimport { BunNodeModulesCollector } from \"./bunNodeModulesCollector\"\n\nexport { getPackageManagerCommand, PM }\n\nexport function getCollectorByPackageManager(pm: PM, rootDir: string, tempDirManager: TmpDir) {\n switch (pm) {\n case PM.PNPM:\n return new PnpmNodeModulesCollector(rootDir, tempDirManager)\n case PM.YARN:\n return new YarnNodeModulesCollector(rootDir, tempDirManager)\n case PM.YARN_BERRY:\n return new YarnBerryNodeModulesCollector(rootDir, tempDirManager)\n case PM.BUN:\n return new BunNodeModulesCollector(rootDir, tempDirManager)\n case PM.NPM:\n default:\n return new NpmNodeModulesCollector(rootDir, tempDirManager)\n }\n}\n\nexport function getNodeModules(\n pm: PM,\n {\n rootDir,\n tempDirManager,\n cancellationToken,\n packageName,\n }: {\n rootDir: string\n tempDirManager: TmpDir\n cancellationToken: CancellationToken\n packageName: string\n }\n): Promise<NodeModuleInfo[]> {\n const collector = getCollectorByPackageManager(pm, rootDir, tempDirManager)\n return collector.getNodeModules({ cancellationToken, packageName })\n}\n\nexport async function detectPackageManager(searchPaths: string[]): Promise<{ pm: PM; corepackConfig: string | undefined; resolvedDirectory: string | undefined }> {\n let pm: PM | null = null\n const dedupedPaths = Array.from(new Set(searchPaths)) // reduce file operations, dedupe paths since primary use case has projectDir === appDir\n\n const resolveIfYarn = (pm: PM, version: string, cwd: string) => (pm === PM.YARN ? detectIfYarnBerry(cwd, version) : pm)\n\n for (const dir of dedupedPaths) {\n const packageJsonPath = path.join(dir, \"package.json\")\n const packageManager = (await exists(packageJsonPath)) ? (await fs.readJson(packageJsonPath, \"utf8\"))?.packageManager : undefined\n if (packageManager) {\n const [pm, version] = packageManager.split(\"@\")\n if (Object.values(PM).includes(pm as PM)) {\n const resolvedPackageManager = await resolveIfYarn(pm as PM, version, dir)\n log.debug({ resolvedPackageManager, packageManager, cwd: dir }, \"packageManager field detected in package.json\")\n return { pm: resolvedPackageManager, corepackConfig: packageManager, resolvedDirectory: dir }\n }\n }\n\n pm = await detectPackageManagerByFile(dir)\n if (pm) {\n const resolvedPackageManager = await resolveIfYarn(pm, \"\", dir)\n log.debug({ resolvedPackageManager, cwd: dir }, \"packageManager detected by file\")\n return { pm: resolvedPackageManager, resolvedDirectory: dir, corepackConfig: undefined }\n }\n }\n\n pm = detectPackageManagerByEnv() || PM.NPM\n const cwd = process.env.npm_package_json ? path.dirname(process.env.npm_package_json) : (process.env.INIT_CWD ?? process.cwd())\n const resolvedPackageManager = await resolveIfYarn(pm, \"\", cwd)\n log.debug({ resolvedPackageManager, detected: cwd }, \"packageManager not detected by file, falling back to environment detection\")\n return { pm: resolvedPackageManager, resolvedDirectory: undefined, corepackConfig: undefined }\n}\n\nexport async function findWorkspaceRoot(pm: PM, cwd: string): Promise<string | undefined> {\n let command: { command: string; args: string[] } | undefined\n\n switch (pm) {\n case PM.PNPM:\n command = { command: \"pnpm\", args: [\"root\", \"-w\"] }\n break\n\n case PM.YARN_BERRY:\n command = { command: \"yarn\", args: [\"config\", \"get\", \"workspaceRoot\"] }\n break\n\n case PM.YARN: {\n command = { command: \"yarn\", args: [\"workspaces\", \"info\", \"--silent\"] }\n break\n }\n\n case PM.BUN:\n command = { command: \"bun\", args: [\"pm\", \"ls\", \"--json\"] }\n break\n\n case PM.NPM:\n default:\n command = { command: \"npm\", args: [\"prefix\", \"-w\"] }\n break\n }\n\n const output = await spawn(command.command, command.args, { cwd, stdio: [\"ignore\", \"pipe\", \"ignore\"] })\n .then(it => {\n const out = it?.trim()\n if (pm === PM.YARN) {\n JSON.parse(out) // if JSON valid, workspace detected\n return findNearestWithWorkspacesField(cwd)\n } else if (pm === PM.BUN) {\n const json = JSON.parse(out)\n if (Array.isArray(json) && json.length > 0) {\n return findNearestWithWorkspacesField(cwd)\n }\n }\n return !out?.length || out === \"undefined\" ? undefined : out\n })\n .catch(() => findNearestWithWorkspacesField(cwd))\n\n log.debug({ root: output || cwd }, output ? \"workspace root detected\" : \"workspace root not detected, using project root\")\n return output\n}\n\nasync function findNearestWithWorkspacesField(dir: string): Promise<string | undefined> {\n let current = dir\n while (true) {\n const pkgPath = path.join(current, \"package.json\")\n try {\n const pkg = JSON.parse(await fs.readFile(pkgPath, \"utf8\"))\n if (pkg.workspaces) {\n return current\n }\n } catch {\n // ignore\n }\n const parent = path.dirname(current)\n if (parent === current) {\n break\n }\n current = parent\n }\n return undefined\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node-module-collector/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { CancellationToken, Nullish } from \"builder-util-runtime\"\nimport { TmpDir } from \"temp-file\"\nimport { NpmNodeModulesCollector } from \"./npmNodeModulesCollector\"\nimport { detectPackageManager, getPackageManagerCommand, PM } from \"./packageManager\"\nimport { PnpmNodeModulesCollector } from \"./pnpmNodeModulesCollector\"\nimport { NodeModuleInfo } from \"./types\"\nimport { YarnBerryNodeModulesCollector } from \"./yarnBerryNodeModulesCollector\"\nimport { YarnNodeModulesCollector } from \"./yarnNodeModulesCollector\"\nimport { BunNodeModulesCollector } from \"./bunNodeModulesCollector\"\nimport { Lazy } from \"lazy-val\"\nimport { spawn, log } from \"builder-util\"\nimport * as fs from \"fs-extra\"\nimport * as path from \"path\"\n\nexport { getPackageManagerCommand, PM }\n\nexport function getCollectorByPackageManager(pm: PM, rootDir: string, tempDirManager: TmpDir) {\n switch (pm) {\n case PM.PNPM:\n return new PnpmNodeModulesCollector(rootDir, tempDirManager)\n case PM.YARN:\n return new YarnNodeModulesCollector(rootDir, tempDirManager)\n case PM.YARN_BERRY:\n return new YarnBerryNodeModulesCollector(rootDir, tempDirManager)\n case PM.BUN:\n return new BunNodeModulesCollector(rootDir, tempDirManager)\n case PM.NPM:\n return new NpmNodeModulesCollector(rootDir, tempDirManager)\n }\n}\n\nexport function getNodeModules(\n pm: PM,\n {\n rootDir,\n tempDirManager,\n cancellationToken,\n packageName,\n }: {\n rootDir: string\n tempDirManager: TmpDir\n cancellationToken: CancellationToken\n packageName: string\n }\n): Promise<NodeModuleInfo[]> {\n const collector = getCollectorByPackageManager(pm, rootDir, tempDirManager)\n return collector.getNodeModules({ cancellationToken, packageName })\n}\n\nexport const determinePackageManagerEnv = ({ projectDir, appDir, workspaceRoot }: { projectDir: string; appDir: string; workspaceRoot: string | Nullish }) =>\n new Lazy(async () => {\n const availableDirs = [projectDir, appDir, workspaceRoot].filter((it): it is string => it != null)\n const pm = await detectPackageManager(availableDirs)\n const root = await findWorkspaceRoot(pm.pm, projectDir)\n if (root != null) {\n // re-detect package manager from workspace root, this seems particularly necessary for pnpm workspaces\n const actualPm = await detectPackageManager([root])\n return {\n pm: actualPm.pm,\n workspaceRoot: Promise.resolve(actualPm.resolvedDirectory),\n }\n }\n return {\n pm: pm.pm,\n workspaceRoot: Promise.resolve(pm.resolvedDirectory),\n }\n })\n\nasync function findWorkspaceRoot(pm: PM, cwd: string): Promise<string | undefined> {\n let command: { command: string; args: string[] } | undefined\n\n switch (pm) {\n case PM.PNPM:\n command = { command: \"pnpm\", args: [\"--workspace-root\", \"exec\", \"pwd\"] }\n break\n\n case PM.YARN_BERRY:\n command = { command: \"yarn\", args: [\"config\", \"get\", \"workspaceRoot\"] }\n break\n\n case PM.YARN: {\n command = { command: \"yarn\", args: [\"workspaces\", \"info\", \"--silent\"] }\n break\n }\n\n case PM.BUN:\n command = { command: \"bun\", args: [\"pm\", \"ls\", \"--json\"] }\n break\n\n case PM.NPM:\n default:\n command = { command: \"npm\", args: [\"prefix\", \"-w\"] }\n break\n }\n\n const output = await spawn(command.command, command.args, { cwd, stdio: [\"ignore\", \"pipe\", \"ignore\"] })\n .then(it => {\n const out = it?.trim()\n if (pm === PM.YARN) {\n JSON.parse(out) // if JSON valid, workspace detected\n return findNearestWithWorkspacesField(cwd)\n } else if (pm === PM.BUN) {\n const json = JSON.parse(out)\n if (Array.isArray(json) && json.length > 0) {\n return findNearestWithWorkspacesField(cwd)\n }\n }\n return !out?.length || out === \"undefined\" ? undefined : out\n })\n .catch(() => findNearestWithWorkspacesField(cwd))\n\n log.debug({ root: output || cwd }, output ? \"workspace root detected\" : \"workspace root not detected, using project root\")\n return output\n}\n\nasync function findNearestWithWorkspacesField(dir: string): Promise<string | undefined> {\n let current = dir\n while (true) {\n const pkgPath = path.join(current, \"package.json\")\n try {\n const pkg = JSON.parse(await fs.readFile(pkgPath, \"utf8\"))\n if (pkg.workspaces) {\n return current\n }\n } catch {\n // ignore\n }\n const parent = path.dirname(current)\n if (parent === current) {\n break\n }\n current = parent\n }\n return undefined\n}\n"]}
|
|
@@ -13,6 +13,7 @@ export declare abstract class NodeModulesCollector<ProdDepType extends Dependenc
|
|
|
13
13
|
protected productionGraph: DependencyGraph;
|
|
14
14
|
protected pkgJsonCache: Map<string, string>;
|
|
15
15
|
protected memoResolvedModules: Map<string, Promise<string | null>>;
|
|
16
|
+
private importMetaResolve;
|
|
16
17
|
protected cache: ModuleCache;
|
|
17
18
|
protected isHoisted: Lazy<boolean>;
|
|
18
19
|
protected appPkgJson: Lazy<PackageJson>;
|
|
@@ -34,14 +35,14 @@ export declare abstract class NodeModulesCollector<ProdDepType extends Dependenc
|
|
|
34
35
|
protected readJsonMemoized(filePath: string): Promise<PackageJson>;
|
|
35
36
|
protected lstatMemoized(filePath: string): Promise<fs.Stats>;
|
|
36
37
|
protected realpathMemoized(filePath: string): Promise<string>;
|
|
38
|
+
protected requireMemoized(pkgPath: string): PackageJson;
|
|
39
|
+
protected existsSyncMemoized(filePath: string): boolean;
|
|
37
40
|
protected resolvePath(filePath: string): Promise<string>;
|
|
38
41
|
/**
|
|
39
42
|
* Resolves a package to its filesystem location using Node.js module resolution.
|
|
40
43
|
* Returns the directory containing the package, not the package.json path.
|
|
41
44
|
*/
|
|
42
|
-
protected resolvePackageDir
|
|
43
|
-
protected requireMemoized(pkgPath: string): PackageJson;
|
|
44
|
-
protected existsSyncMemoized(filePath: string): boolean;
|
|
45
|
+
protected resolvePackageDir(packageName: string, fromDir: string): Promise<string | null>;
|
|
45
46
|
protected cacheKey(pkg: ProdDepType): string;
|
|
46
47
|
protected packageVersionString(pkg: ProdDepType): string;
|
|
47
48
|
/**
|
|
@@ -51,12 +52,12 @@ export declare abstract class NodeModulesCollector<ProdDepType extends Dependenc
|
|
|
51
52
|
name: string;
|
|
52
53
|
version: string;
|
|
53
54
|
};
|
|
54
|
-
protected getTreeFromWorkspaces(tree: ProdDepType): Promise<ProdDepType>;
|
|
55
|
+
protected getTreeFromWorkspaces(tree: ProdDepType, packageName: string): Promise<ProdDepType>;
|
|
55
56
|
private transformToHoisterTree;
|
|
56
57
|
private _getNodeModules;
|
|
57
58
|
asyncExec(command: string, args: string[], cwd?: string): Promise<{
|
|
58
59
|
stdout: string | undefined;
|
|
59
60
|
stderr: string | undefined;
|
|
60
61
|
}>;
|
|
61
|
-
|
|
62
|
+
streamCollectorCommandToFile(command: string, args: string[], cwd: string, tempOutputFile: string): Promise<void>;
|
|
62
63
|
}
|