app-builder-lib 27.0.0-alpha.8 → 27.0.0-alpha.9
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/dist/asar/asarUtil.js +21 -11
- package/dist/asar/asarUtil.js.map +1 -1
- package/dist/configuration.d.ts +31 -1
- package/dist/configuration.d.ts.map +1 -1
- package/dist/configuration.js.map +1 -1
- package/dist/electron/ElectronFramework.d.ts +2 -1
- package/dist/electron/ElectronFramework.d.ts.map +1 -1
- package/dist/electron/ElectronFramework.js +14 -7
- package/dist/electron/ElectronFramework.js.map +1 -1
- package/dist/electron/mac/electronMac.js +2 -6
- package/dist/electron/mac/electronMac.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/indexInternal.d.ts +9 -2
- package/dist/indexInternal.d.ts.map +1 -1
- package/dist/indexInternal.js +8 -2
- package/dist/indexInternal.js.map +1 -1
- package/dist/linuxPackager.d.ts.map +1 -1
- package/dist/linuxPackager.js +19 -1
- package/dist/linuxPackager.js.map +1 -1
- package/dist/macPackager.d.ts.map +1 -1
- package/dist/macPackager.js +20 -0
- package/dist/macPackager.js.map +1 -1
- package/dist/node-module-collector/index.d.ts.map +1 -1
- package/dist/node-module-collector/index.js +47 -16
- package/dist/node-module-collector/index.js.map +1 -1
- package/dist/node-module-collector/moduleManager.d.ts.map +1 -1
- package/dist/node-module-collector/moduleManager.js +16 -8
- package/dist/node-module-collector/moduleManager.js.map +1 -1
- package/dist/node-module-collector/nodeModulesCollector.d.ts +7 -2
- package/dist/node-module-collector/nodeModulesCollector.d.ts.map +1 -1
- package/dist/node-module-collector/nodeModulesCollector.js +13 -17
- package/dist/node-module-collector/nodeModulesCollector.js.map +1 -1
- package/dist/node-module-collector/pnpmNodeModulesCollector.d.ts +44 -4
- package/dist/node-module-collector/pnpmNodeModulesCollector.d.ts.map +1 -1
- package/dist/node-module-collector/pnpmNodeModulesCollector.js +130 -34
- package/dist/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
- package/dist/options/PlatformSpecificBuildOptions.d.ts +29 -0
- package/dist/options/PlatformSpecificBuildOptions.d.ts.map +1 -1
- package/dist/options/PlatformSpecificBuildOptions.js.map +1 -1
- package/dist/options/SquirrelWindowsOptions.d.ts +0 -5
- package/dist/options/SquirrelWindowsOptions.d.ts.map +1 -1
- package/dist/options/SquirrelWindowsOptions.js.map +1 -1
- package/dist/options/macOptions.d.ts +11 -6
- package/dist/options/macOptions.d.ts.map +1 -1
- package/dist/options/macOptions.js.map +1 -1
- package/dist/packager.d.ts +2 -0
- package/dist/packager.d.ts.map +1 -1
- package/dist/packager.js +47 -0
- package/dist/packager.js.map +1 -1
- package/dist/packagerApi.d.ts +1 -1
- package/dist/packagerApi.d.ts.map +1 -1
- package/dist/packagerApi.js.map +1 -1
- package/dist/platformPackager.d.ts +13 -1
- package/dist/platformPackager.d.ts.map +1 -1
- package/dist/platformPackager.js +26 -2
- package/dist/platformPackager.js.map +1 -1
- package/dist/publish/PublishManager.d.ts.map +1 -1
- package/dist/publish/PublishManager.js +89 -7
- package/dist/publish/PublishManager.js.map +1 -1
- package/dist/publish/updateInfoBuilder.d.ts.map +1 -1
- package/dist/publish/updateInfoBuilder.js +57 -4
- package/dist/publish/updateInfoBuilder.js.map +1 -1
- package/dist/targets/ArchiveTarget.js +1 -1
- package/dist/targets/ArchiveTarget.js.map +1 -1
- package/dist/targets/archive.d.ts +12 -0
- package/dist/targets/archive.d.ts.map +1 -1
- package/dist/targets/archive.js +44 -1
- package/dist/targets/archive.js.map +1 -1
- package/dist/targets/differentialUpdateInfoBuilder.d.ts +2 -1
- package/dist/targets/differentialUpdateInfoBuilder.d.ts.map +1 -1
- package/dist/targets/differentialUpdateInfoBuilder.js +2 -2
- package/dist/targets/differentialUpdateInfoBuilder.js.map +1 -1
- package/dist/targets/linux/FlatpakTarget.d.ts.map +1 -1
- package/dist/targets/linux/FlatpakTarget.js +5 -1
- package/dist/targets/linux/FlatpakTarget.js.map +1 -1
- package/dist/targets/linux/FpmTarget.d.ts.map +1 -1
- package/dist/targets/linux/FpmTarget.js +25 -2
- package/dist/targets/linux/FpmTarget.js.map +1 -1
- package/dist/targets/linux/LinuxTargetHelper.d.ts +1 -0
- package/dist/targets/linux/LinuxTargetHelper.d.ts.map +1 -1
- package/dist/targets/linux/LinuxTargetHelper.js +17 -1
- package/dist/targets/linux/LinuxTargetHelper.js.map +1 -1
- package/dist/targets/linux/snap/core24.js +3 -3
- package/dist/targets/linux/snap/core24.js.map +1 -1
- package/dist/targets/linux/snap/coreLegacy.js +1 -1
- package/dist/targets/linux/snap/coreLegacy.js.map +1 -1
- package/dist/targets/mac/MacTargetHelper.d.ts +70 -4
- package/dist/targets/mac/MacTargetHelper.d.ts.map +1 -1
- package/dist/targets/mac/MacTargetHelper.js +294 -36
- package/dist/targets/mac/MacTargetHelper.js.map +1 -1
- package/dist/targets/mac/pkg.d.ts +16 -0
- package/dist/targets/mac/pkg.d.ts.map +1 -1
- package/dist/targets/mac/pkg.js +26 -0
- package/dist/targets/mac/pkg.js.map +1 -1
- package/dist/targets/win/MsiTarget.d.ts.map +1 -1
- package/dist/targets/win/MsiTarget.js +6 -3
- package/dist/targets/win/MsiTarget.js.map +1 -1
- package/dist/targets/win/nsis/Defines.d.ts +2 -0
- package/dist/targets/win/nsis/Defines.d.ts.map +1 -1
- package/dist/targets/win/nsis/Defines.js.map +1 -1
- package/dist/targets/win/nsis/NsisTarget.d.ts +18 -0
- package/dist/targets/win/nsis/NsisTarget.d.ts.map +1 -1
- package/dist/targets/win/nsis/NsisTarget.js +79 -19
- package/dist/targets/win/nsis/NsisTarget.js.map +1 -1
- package/dist/targets/win/nsis/WebInstallerTarget.d.ts.map +1 -1
- package/dist/targets/win/nsis/WebInstallerTarget.js +19 -12
- package/dist/targets/win/nsis/WebInstallerTarget.js.map +1 -1
- package/dist/targets/win/nsis/nsisOptions.d.ts +29 -4
- package/dist/targets/win/nsis/nsisOptions.d.ts.map +1 -1
- package/dist/targets/win/nsis/nsisOptions.js.map +1 -1
- package/dist/toolsets/wine.d.ts.map +1 -1
- package/dist/toolsets/wine.js +17 -12
- package/dist/toolsets/wine.js.map +1 -1
- package/dist/util/NodeModuleCopyHelper.js +12 -4
- package/dist/util/NodeModuleCopyHelper.js.map +1 -1
- package/dist/util/appFileCopier.d.ts +5 -0
- package/dist/util/appFileCopier.d.ts.map +1 -1
- package/dist/util/appFileCopier.js +39 -1
- package/dist/util/appFileCopier.js.map +1 -1
- package/dist/util/config/config.d.ts.map +1 -1
- package/dist/util/config/config.js +4 -0
- package/dist/util/config/config.js.map +1 -1
- package/dist/util/config/legacyConfigGuard.d.ts +7 -0
- package/dist/util/config/legacyConfigGuard.d.ts.map +1 -0
- package/dist/util/config/legacyConfigGuard.js +187 -0
- package/dist/util/config/legacyConfigGuard.js.map +1 -0
- package/dist/util/config/legacyOptions.d.ts +73 -0
- package/dist/util/config/legacyOptions.d.ts.map +1 -0
- package/dist/util/config/legacyOptions.js +369 -0
- package/dist/util/config/legacyOptions.js.map +1 -0
- package/dist/util/config/schemaValidator.d.ts.map +1 -1
- package/dist/util/config/schemaValidator.js +16 -0
- package/dist/util/config/schemaValidator.js.map +1 -1
- package/dist/util/electronGet.d.ts +0 -4
- package/dist/util/electronGet.d.ts.map +1 -1
- package/dist/util/electronGet.js +17 -0
- package/dist/util/electronGet.js.map +1 -1
- package/dist/util/flags.d.ts +5 -0
- package/dist/util/flags.d.ts.map +1 -1
- package/dist/util/flags.js +124 -1
- package/dist/util/flags.js.map +1 -1
- package/dist/util/packageMetadata.js +11 -0
- package/dist/util/packageMetadata.js.map +1 -1
- package/dist/util/resolve.js +1 -1
- package/dist/util/resolve.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +10 -10
- package/scheme.json +368 -23
- package/templates/entitlements.mac.adhoc.plist +15 -0
- package/templates/entitlements.mac.plist +9 -6
- package/templates/nsis/include/installer.nsh +1 -30
- package/templates/nsis/include/webPackage.nsh +33 -23
- package/templates/nsis/multiUserUi.nsh +1 -1
package/dist/targets/archive.js
CHANGED
|
@@ -158,6 +158,21 @@ export async function archive(format, outFile, dirToArchive, options = {}) {
|
|
|
158
158
|
log.warn({ reason: "7z doesn't support NFD-normalized filenames" }, `using zip`);
|
|
159
159
|
use7z = false;
|
|
160
160
|
}
|
|
161
|
+
// Resolve storedPaths before the main pass so they can be excluded from it. Member names are
|
|
162
|
+
// native-separator, relative to the 7za cwd (which differs with withoutDir), so the same string
|
|
163
|
+
// works as both the exact `-x!` exclude mask and the append argument.
|
|
164
|
+
const storedMembers = [];
|
|
165
|
+
for (const storedPath of options.storedPaths ?? []) {
|
|
166
|
+
if (storedPath.includes("..")) {
|
|
167
|
+
throw new Error(`Stored archive path contains path traversal sequence: "${storedPath}"`);
|
|
168
|
+
}
|
|
169
|
+
if (await exists(path.join(dirToArchive, storedPath))) {
|
|
170
|
+
storedMembers.push(path.normalize(options.withoutDir ? storedPath : path.join(path.basename(dirToArchive), storedPath)));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (storedMembers.length > 0 && !use7z) {
|
|
174
|
+
throw new Error("storedPaths is not supported with the native zip fallback");
|
|
175
|
+
}
|
|
161
176
|
if (use7z) {
|
|
162
177
|
const args = compute7zCompressArgs(format, options);
|
|
163
178
|
// Modern 7-Zip (24.09) dereferences symlinks by default; the 7-Zip 16.02 bundled before
|
|
@@ -170,8 +185,11 @@ export async function archive(format, outFile, dirToArchive, options = {}) {
|
|
|
170
185
|
await unlinkIfExists(outFile);
|
|
171
186
|
args.push(outFile, options.withoutDir ? "." : path.basename(dirToArchive));
|
|
172
187
|
args.push(...buildExcludeArgs(options.excluded, "-xr!"));
|
|
188
|
+
// `-x!` (exact, non-recursive) so only the member itself is skipped, never a same-named sibling
|
|
189
|
+
args.push(...storedMembers.map(member => `-x!${member}`));
|
|
190
|
+
const cwd = options.withoutDir ? dirToArchive : path.dirname(dirToArchive);
|
|
173
191
|
try {
|
|
174
|
-
await exec(await getPath7za(), args, { cwd
|
|
192
|
+
await exec(await getPath7za(), args, { cwd }, debug7z.enabled);
|
|
175
193
|
}
|
|
176
194
|
catch (e) {
|
|
177
195
|
if (e.code === "ENOENT" && !(await exists(dirToArchive))) {
|
|
@@ -181,6 +199,31 @@ export async function archive(format, outFile, dirToArchive, options = {}) {
|
|
|
181
199
|
throw e;
|
|
182
200
|
}
|
|
183
201
|
}
|
|
202
|
+
if (storedMembers.length > 0) {
|
|
203
|
+
// Second pass: append the stored members with no compression. -mx=0 unconditionally — the
|
|
204
|
+
// compression-level env override must not reach these members (see storedPaths docs). The
|
|
205
|
+
// main pass's symlink, timestamp, and header-compression flags are mirrored so the option
|
|
206
|
+
// stays generic: the append rewrites the archive header and may itself store a symlink.
|
|
207
|
+
const appendArgs = debug7zArgs("a");
|
|
208
|
+
appendArgs.push("-mx=0");
|
|
209
|
+
if (options.preserveSymlinks) {
|
|
210
|
+
appendArgs.push("-snl");
|
|
211
|
+
}
|
|
212
|
+
if (!options.isRegularFile) {
|
|
213
|
+
appendArgs.push("-mtc=off");
|
|
214
|
+
}
|
|
215
|
+
if (format === "7z" || format.endsWith(".7z")) {
|
|
216
|
+
if (options.isArchiveHeaderCompressed === false) {
|
|
217
|
+
appendArgs.push("-mhc=off");
|
|
218
|
+
}
|
|
219
|
+
appendArgs.push("-mtm=off", "-mta=off");
|
|
220
|
+
}
|
|
221
|
+
else if (format === "zip") {
|
|
222
|
+
appendArgs.push("-mm=Copy", "-mcu");
|
|
223
|
+
}
|
|
224
|
+
appendArgs.push(outFile, ...storedMembers);
|
|
225
|
+
await exec(await getPath7za(), appendArgs, { cwd }, debug7z.enabled);
|
|
226
|
+
}
|
|
184
227
|
}
|
|
185
228
|
else {
|
|
186
229
|
// macOS native zip (NFD fallback): -y preserves symlinks
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/targets/archive.ts"],"names":[],"mappings":"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","sourcesContent":["import { debug7z, exec, exists, log, statOrNull, unlinkIfExists } from \"builder-util\"\nimport * as path from \"path\"\nimport { create } from \"tar\"\nimport type { TarOptionsWithAliasesAsync } from \"tar\"\nimport { TmpDir } from \"temp-file\"\nimport { CompressionLevel, Platform } from \"../core.js\"\nimport { getLinuxToolsMacToolset } from \"../toolsets/linuxToolsMac.js\"\nimport { ToolsetConfig } from \"../configuration.js\"\nimport { getPath7za } from \"../toolsets/7zip.js\"\nimport _fsExtra from \"fs-extra\"\nconst { move } = _fsExtra\n\n// Values accepted by ELECTRON_BUILDER_7Z_FILTER (passed through as `-mf=<value>`). \"OFF\" disables the\n// branch/exec filter entirely (plain LZMA2); the rest are 7-Zip branch converters. 7za matches these\n// case-insensitively, so the value is canonicalized to uppercase before use.\nconst ALLOWED_7Z_FILTERS = new Set([\"OFF\", \"BCJ\", \"BCJ2\", \"ARM\", \"ARMT\", \"IA64\", \"PPC\", \"SPARC\", \"DELTA\"])\n\nfunction validateCompressionLevel(level: string): void {\n if (!/^[0-9]$/.test(level)) {\n throw new Error(`ELECTRON_BUILDER_COMPRESSION_LEVEL must be a single digit 0-9, got: \"${level}\"`)\n }\n}\n\ntype TarConfig = {\n compression: CompressionLevel | null | undefined\n format: string\n outFile: string\n dirToArchive: string\n isMacApp: boolean\n tempDirManager: TmpDir\n linuxToolsMac: ToolsetConfig[\"linuxToolsMac\"]\n buildResourcesDir: string\n}\n\n/** @internal */\nexport async function tar({ compression, format, outFile, dirToArchive, isMacApp, tempDirManager, linuxToolsMac, buildResourcesDir }: TarConfig): Promise<void> {\n const tarFile = await tempDirManager.getTempFile({ suffix: \".tar\" })\n const tarArgs: TarOptionsWithAliasesAsync = {\n file: tarFile,\n portable: true,\n cwd: dirToArchive,\n prefix: path.basename(outFile, `.${format}`),\n }\n let tarDirectory = \".\"\n if (isMacApp) {\n delete tarArgs.prefix\n tarArgs.cwd = path.dirname(dirToArchive)\n tarDirectory = path.basename(dirToArchive)\n }\n\n await Promise.all([\n create(tarArgs, [tarDirectory]),\n // remove file before - 7z doesn't overwrite file, but update\n unlinkIfExists(outFile),\n ])\n\n if (format === \"tar.lz\") {\n const lzipPath = process.platform === \"darwin\" ? (await getLinuxToolsMacToolset(linuxToolsMac, buildResourcesDir)).lzip : \"lzip\"\n await exec(lzipPath, [compression === \"store\" ? \"-1\" : \"-9\", \"--keep\" /* keep (don't delete) input files */, tarFile])\n // lzip creates the output file in the same directory as the input with a .lz suffix\n await move(`${tarFile}.lz`, outFile)\n return\n }\n\n const compressFormat = format === \"tar.xz\" ? \"xz\" : format === \"tar.bz2\" ? \"bzip2\" : \"gzip\"\n const args = compute7zCompressArgs(compressFormat, { isRegularFile: true, method: \"DEFAULT\", compression })\n args.push(outFile, tarFile)\n await exec(await getPath7za(), args, { cwd: path.dirname(dirToArchive) }, debug7z.enabled)\n}\n\nexport interface ArchiveOptions {\n compression?: CompressionLevel | null\n\n /**\n * @default false\n */\n withoutDir?: boolean\n\n /**\n * @default true\n */\n solid?: boolean\n\n /**\n * @default true\n */\n isArchiveHeaderCompressed?: boolean\n\n dictSize?: number\n excluded?: Array<string> | null\n\n // DEFAULT allows to disable custom logic and do not pass method switch at all\n method?: \"Copy\" | \"LZMA\" | \"Deflate\" | \"DEFAULT\"\n\n isRegularFile?: boolean\n\n /**\n * Preserve symlinks (e.g. macOS .framework `Versions/Current`) instead of dereferencing them.\n * Passes `-snl` to 7za — modern 7-Zip derefs by default, which breaks bundle codesigning. See #9846.\n * @default false\n */\n preserveSymlinks?: boolean\n\n /**\n * Restrict the 7z filter to one the install-time extractor (the self-vendored Nsis7z plugin) can\n * decode. Modern 7za (24.09) auto-applies a CPU branch converter to executable content at\n * `-mx>=1` — `BCJ2` on x86/x64 and `ARM64` on arm64 — which that decoder silently skips, dropping\n * every executable from the install. When set, the archive is pinned to the single-stream `BCJ`\n * filter while compressing (decodable, and the best-ratio filter that decoder supports) and to\n * plain `Copy` while storing. Deliberately NOT overridable by `ELECTRON_BUILDER_7Z_FILTER`, which\n * could otherwise reintroduce an unreadable archive. Only affects the 7z format. See #9983.\n * @default false\n */\n installTimeDecodable?: boolean\n}\n\n/**\n * Whether archives for the given target platform should preserve symlinks (i.e. pass `-snl`).\n * Non-Windows targets preserve them: macOS `.framework` bundles need them for codesigning (#9846)\n * and Linux bundles may legitimately contain them. Windows dereferences because restoring symlinks\n * there requires elevated privileges. Keyed on the target platform, not the build host.\n */\nexport function shouldPreserveSymlinks(platform: Platform): boolean {\n return platform !== Platform.WINDOWS\n}\n\n/**\n * Builds the exclude switches for the given masks, rejecting any pattern that contains a path\n * traversal sequence. `prefix` is the tool-specific flag (`-xr!` for 7za, `-x` for native zip).\n */\nfunction buildExcludeArgs(excluded: Array<string> | null | undefined, prefix: string): Array<string> {\n if (excluded == null) {\n return []\n }\n return excluded.map(mask => {\n if (mask.includes(\"..\")) {\n throw new Error(`Excluded archive pattern contains path traversal sequence: \"${mask}\"`)\n }\n return `${prefix}${mask}`\n })\n}\n\nexport function compute7zCompressArgs(format: string, options: ArchiveOptions = {}) {\n let storeOnly = options.compression === \"store\"\n const args = debug7zArgs(\"a\")\n\n const compressionLevel = process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL\n if (compressionLevel != null) {\n validateCompressionLevel(compressionLevel)\n storeOnly = false // env var overrides \"store\" config\n args.push(`-mx=${compressionLevel}`)\n } else if (storeOnly) {\n // -mx=0 is the universal \"no compression\" flag across all formats (zip, 7z, gzip, xz, bzip2).\n // -mm=Copy would only be valid for zip/7z and causes E_INVALIDARG on xz/gzip/bzip2.\n args.push(\"-mx=0\")\n } else {\n const isZip = format === \"zip\"\n // ZIP uses level 7 by default; everything else (7z, gzip, xz, bzip2) uses level 9\n args.push(\"-mx=\" + (isZip && options.compression !== \"maximum\" ? \"7\" : \"9\"))\n if (isZip && options.compression === \"maximum\") {\n // http://superuser.com/a/742034\n args.push(\"-mfb=258\", \"-mpass=15\")\n }\n }\n\n if (options.dictSize != null) {\n args.push(`-md=${options.dictSize}m`)\n }\n\n // Disable NTFS timestamps for reproducible archives\n if (!options.isRegularFile) {\n args.push(\"-mtc=off\")\n }\n\n if (format === \"7z\" || format.endsWith(\".7z\")) {\n if (options.solid === false) {\n args.push(\"-ms=off\")\n }\n\n if (options.isArchiveHeaderCompressed === false) {\n args.push(\"-mhc=off\")\n }\n\n // Branch/exec filter selection. installTimeDecodable archives are unpacked by the self-vendored\n // Nsis7z extractor, whose decoder only understands plain LZMA2/Copy and the single-stream BCJ\n // filter — not the CPU branch converters modern 7za auto-applies (BCJ2 on x86/x64, ARM64 on\n // arm64). So pin them to BCJ while compressing (the best filter that decoder can read; Copy\n // needs none) and do not honor ELECTRON_BUILDER_7Z_FILTER, which could reintroduce an unreadable\n // archive. Any other 7z archive may use ELECTRON_BUILDER_7Z_FILTER, else 7za's auto-selection.\n if (options.installTimeDecodable) {\n if (!storeOnly) {\n args.push(\"-mf=BCJ\")\n }\n } else {\n const sevenZFilter = process.env.ELECTRON_BUILDER_7Z_FILTER\n if (sevenZFilter) {\n const canonicalFilter = sevenZFilter.toUpperCase()\n if (!ALLOWED_7Z_FILTERS.has(canonicalFilter)) {\n throw new Error(`ELECTRON_BUILDER_7Z_FILTER must be one of: ${[...ALLOWED_7Z_FILTERS].join(\", \")}`)\n }\n args.push(`-mf=${canonicalFilter}`)\n }\n }\n\n args.push(\"-mtm=off\", \"-mta=off\")\n }\n\n if (options.method != null && options.method !== \"DEFAULT\") {\n args.push(`-mm=${options.method}`)\n } else if (format === \"zip\") {\n // -mm is only set explicitly for zip (Deflate/Copy) and includes the UTF-8 flag.\n // For all other formats the codec is implicit from the output file extension.\n args.push(`-mm=${storeOnly ? \"Copy\" : \"Deflate\"}`)\n args.push(\"-mcu\")\n }\n\n return args\n}\n\n// 7z is very fast, so, use ultra compression\n/** @internal */\nexport async function archive(format: string, outFile: string, dirToArchive: string, options: ArchiveOptions = {}): Promise<string> {\n const outFileStat = await statOrNull(outFile)\n const dirStat = await statOrNull(dirToArchive)\n if (outFileStat && dirStat && outFileStat.mtime > dirStat.mtime) {\n log.info({ reason: \"Archive file is up to date\", outFile }, `skipped archiving`)\n return outFile\n }\n\n // Use 7za for all formats (matches pre-26.15 behavior). Native macOS `zip` is only a\n // fallback for NFD-normalized filenames, which 7za mangles.\n let use7z = true\n if (process.platform === \"darwin\" && format === \"zip\" && dirToArchive.normalize(\"NFC\") !== dirToArchive) {\n log.warn({ reason: \"7z doesn't support NFD-normalized filenames\" }, `using zip`)\n use7z = false\n }\n\n if (use7z) {\n const args = compute7zCompressArgs(format, options)\n // Modern 7-Zip (24.09) dereferences symlinks by default; the 7-Zip 16.02 bundled before\n // 26.15 stored them as links. Without -snl, a macOS .framework `Versions/Current` extracts\n // as a real directory → codesign \"bundle format is ambiguous\" → breaks Squirrel.Mac\n // auto-update (#9846). Callers enable it for all non-Windows targets (see ArchiveTarget).\n if (options.preserveSymlinks) {\n args.push(\"-snl\")\n }\n await unlinkIfExists(outFile)\n args.push(outFile, options.withoutDir ? \".\" : path.basename(dirToArchive))\n args.push(...buildExcludeArgs(options.excluded, \"-xr!\"))\n\n try {\n await exec(await getPath7za(), args, { cwd: options.withoutDir ? dirToArchive : path.dirname(dirToArchive) }, debug7z.enabled)\n } catch (e: any) {\n if (e.code === \"ENOENT\" && !(await exists(dirToArchive))) {\n throw new Error(`Cannot create archive: \"${dirToArchive}\" doesn't exist`)\n } else {\n throw e\n }\n }\n } else {\n // macOS native zip (NFD fallback): -y preserves symlinks\n const args = [\"-q\", \"-r\", \"-y\"]\n if (debug7z.enabled) {\n args.push(\"-v\")\n }\n if (options.compression === \"store\") {\n args.push(\"-0\")\n } else {\n args.push(options.compression === \"maximum\" ? \"-9\" : \"-7\")\n }\n await unlinkIfExists(outFile)\n args.push(outFile, options.withoutDir ? \".\" : path.basename(dirToArchive))\n args.push(...buildExcludeArgs(options.excluded, \"-x\"))\n await exec(\"zip\", args, { cwd: options.withoutDir ? dirToArchive : path.dirname(dirToArchive) }, debug7z.enabled)\n }\n\n return outFile\n}\n\nfunction debug7zArgs(command: \"a\" | \"x\"): Array<string> {\n const args = [command, \"-bd\"]\n if (debug7z.enabled) {\n args.push(\"-bb\")\n }\n return args\n}\n"]}
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/targets/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AACrF,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAG5B,OAAO,EAAoB,QAAQ,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAEtE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAA;AAEzB,sGAAsG;AACtG,qGAAqG;AACrG,6EAA6E;AAC7E,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;AAE1G,SAAS,wBAAwB,CAAC,KAAa;IAC7C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,wEAAwE,KAAK,GAAG,CAAC,CAAA;IACnG,CAAC;AACH,CAAC;AAaD,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAa;IAC7I,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACpE,MAAM,OAAO,GAA+B;QAC1C,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,MAAM,EAAE,CAAC;KAC7C,CAAA;IACD,IAAI,YAAY,GAAG,GAAG,CAAA;IACtB,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,OAAO,CAAC,MAAM,CAAA;QACrB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QACxC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,MAAM,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC;QAC/B,6DAA6D;QAC7D,cAAc,CAAC,OAAO,CAAC;KACxB,CAAC,CAAA;IAEF,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,uBAAuB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;QAChI,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAC,CAAA;QACtH,oFAAoF;QACpF,MAAM,IAAI,CAAC,GAAG,OAAO,KAAK,EAAE,OAAO,CAAC,CAAA;QACpC,OAAM;IACR,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;IAC3F,MAAM,IAAI,GAAG,qBAAqB,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAA;IAC3G,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC3B,MAAM,IAAI,CAAC,MAAM,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;AAC5F,CAAC;AA6DD;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAkB;IACvD,OAAO,QAAQ,KAAK,QAAQ,CAAC,OAAO,CAAA;AACtC,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,QAA0C,EAAE,MAAc;IAClF,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,+DAA+D,IAAI,GAAG,CAAC,CAAA;QACzF,CAAC;QACD,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,UAA0B,EAAE;IAChF,IAAI,SAAS,GAAG,OAAO,CAAC,WAAW,KAAK,OAAO,CAAA;IAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAE7B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAA;IACvE,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;QAC7B,wBAAwB,CAAC,gBAAgB,CAAC,CAAA;QAC1C,SAAS,GAAG,KAAK,CAAA,CAAC,mCAAmC;QACrD,IAAI,CAAC,IAAI,CAAC,OAAO,gBAAgB,EAAE,CAAC,CAAA;IACtC,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,8FAA8F;QAC9F,oFAAoF;QACpF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,KAAK,KAAK,CAAA;QAC9B,kFAAkF;QAClF,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5E,IAAI,KAAK,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAC/C,gCAAgC;YAChC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACvC,CAAC;IAED,oDAAoD;IACpD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACvB,CAAC;IAED,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACtB,CAAC;QAED,IAAI,OAAO,CAAC,yBAAyB,KAAK,KAAK,EAAE,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACvB,CAAC;QAED,gGAAgG;QAChG,8FAA8F;QAC9F,4FAA4F;QAC5F,4FAA4F;QAC5F,iGAAiG;QACjG,+FAA+F;QAC/F,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAA;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,eAAe,GAAG,YAAY,CAAC,WAAW,EAAE,CAAA;gBAClD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;oBAC7C,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,GAAG,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACrG,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,OAAO,eAAe,EAAE,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IACnC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC5B,iFAAiF;QACjF,8EAA8E;QAC9E,IAAI,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,6CAA6C;AAC7C,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,OAAe,EAAE,YAAoB,EAAE,UAA0B,EAAE;IAC/G,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAA;IAC9C,IAAI,WAAW,IAAI,OAAO,IAAI,WAAW,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAE,OAAO,EAAE,EAAE,mBAAmB,CAAC,CAAA;QAChF,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,qFAAqF;IACrF,4DAA4D;IAC5D,IAAI,KAAK,GAAG,IAAI,CAAA;IAChB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK,IAAI,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,YAAY,EAAE,CAAC;QACxG,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,6CAA6C,EAAE,EAAE,WAAW,CAAC,CAAA;QAChF,KAAK,GAAG,KAAK,CAAA;IACf,CAAC;IAED,6FAA6F;IAC7F,gGAAgG;IAChG,sEAAsE;IACtE,MAAM,aAAa,GAAkB,EAAE,CAAA;IACvC,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QACnD,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,0DAA0D,UAAU,GAAG,CAAC,CAAA;QAC1F,CAAC;QACD,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YACtD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;QAC1H,CAAC;IACH,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;IAC9E,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACnD,wFAAwF;QACxF,2FAA2F;QAC3F,oFAAoF;QACpF,0FAA0F;QAC1F,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnB,CAAC;QACD,MAAM,cAAc,CAAC,OAAO,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAA;QAC1E,IAAI,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;QACxD,gGAAgG;QAChG,IAAI,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAA;QAEzD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QAC1E,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QAChE,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,iBAAiB,CAAC,CAAA;YAC3E,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAA;YACT,CAAC;QACH,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,0FAA0F;YAC1F,0FAA0F;YAC1F,0FAA0F;YAC1F,wFAAwF;YACxF,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;YACnC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACxB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACzB,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC7B,CAAC;YACD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,IAAI,OAAO,CAAC,yBAAyB,KAAK,KAAK,EAAE,CAAC;oBAChD,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBAC7B,CAAC;gBACD,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;YACzC,CAAC;iBAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC5B,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;YACrC,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,CAAA;YAC1C,MAAM,IAAI,CAAC,MAAM,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QACtE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,yDAAyD;QACzD,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAC/B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC5D,CAAC;QACD,MAAM,cAAc,CAAC,OAAO,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAA;QAC1E,IAAI,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;QACtD,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACnH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,OAAkB;IACrC,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC7B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import { debug7z, exec, exists, log, statOrNull, unlinkIfExists } from \"builder-util\"\nimport * as path from \"path\"\nimport { create } from \"tar\"\nimport type { TarOptionsWithAliasesAsync } from \"tar\"\nimport { TmpDir } from \"temp-file\"\nimport { CompressionLevel, Platform } from \"../core.js\"\nimport { getLinuxToolsMacToolset } from \"../toolsets/linuxToolsMac.js\"\nimport { ToolsetConfig } from \"../configuration.js\"\nimport { getPath7za } from \"../toolsets/7zip.js\"\nimport _fsExtra from \"fs-extra\"\nconst { move } = _fsExtra\n\n// Values accepted by ELECTRON_BUILDER_7Z_FILTER (passed through as `-mf=<value>`). \"OFF\" disables the\n// branch/exec filter entirely (plain LZMA2); the rest are 7-Zip branch converters. 7za matches these\n// case-insensitively, so the value is canonicalized to uppercase before use.\nconst ALLOWED_7Z_FILTERS = new Set([\"OFF\", \"BCJ\", \"BCJ2\", \"ARM\", \"ARMT\", \"IA64\", \"PPC\", \"SPARC\", \"DELTA\"])\n\nfunction validateCompressionLevel(level: string): void {\n if (!/^[0-9]$/.test(level)) {\n throw new Error(`ELECTRON_BUILDER_COMPRESSION_LEVEL must be a single digit 0-9, got: \"${level}\"`)\n }\n}\n\ntype TarConfig = {\n compression: CompressionLevel | null | undefined\n format: string\n outFile: string\n dirToArchive: string\n isMacApp: boolean\n tempDirManager: TmpDir\n linuxToolsMac: ToolsetConfig[\"linuxToolsMac\"]\n buildResourcesDir: string\n}\n\n/** @internal */\nexport async function tar({ compression, format, outFile, dirToArchive, isMacApp, tempDirManager, linuxToolsMac, buildResourcesDir }: TarConfig): Promise<void> {\n const tarFile = await tempDirManager.getTempFile({ suffix: \".tar\" })\n const tarArgs: TarOptionsWithAliasesAsync = {\n file: tarFile,\n portable: true,\n cwd: dirToArchive,\n prefix: path.basename(outFile, `.${format}`),\n }\n let tarDirectory = \".\"\n if (isMacApp) {\n delete tarArgs.prefix\n tarArgs.cwd = path.dirname(dirToArchive)\n tarDirectory = path.basename(dirToArchive)\n }\n\n await Promise.all([\n create(tarArgs, [tarDirectory]),\n // remove file before - 7z doesn't overwrite file, but update\n unlinkIfExists(outFile),\n ])\n\n if (format === \"tar.lz\") {\n const lzipPath = process.platform === \"darwin\" ? (await getLinuxToolsMacToolset(linuxToolsMac, buildResourcesDir)).lzip : \"lzip\"\n await exec(lzipPath, [compression === \"store\" ? \"-1\" : \"-9\", \"--keep\" /* keep (don't delete) input files */, tarFile])\n // lzip creates the output file in the same directory as the input with a .lz suffix\n await move(`${tarFile}.lz`, outFile)\n return\n }\n\n const compressFormat = format === \"tar.xz\" ? \"xz\" : format === \"tar.bz2\" ? \"bzip2\" : \"gzip\"\n const args = compute7zCompressArgs(compressFormat, { isRegularFile: true, method: \"DEFAULT\", compression })\n args.push(outFile, tarFile)\n await exec(await getPath7za(), args, { cwd: path.dirname(dirToArchive) }, debug7z.enabled)\n}\n\nexport interface ArchiveOptions {\n compression?: CompressionLevel | null\n\n /**\n * @default false\n */\n withoutDir?: boolean\n\n /**\n * @default true\n */\n solid?: boolean\n\n /**\n * @default true\n */\n isArchiveHeaderCompressed?: boolean\n\n dictSize?: number\n excluded?: Array<string> | null\n\n // DEFAULT allows to disable custom logic and do not pass method switch at all\n method?: \"Copy\" | \"LZMA\" | \"Deflate\" | \"DEFAULT\"\n\n isRegularFile?: boolean\n\n /**\n * Preserve symlinks (e.g. macOS .framework `Versions/Current`) instead of dereferencing them.\n * Passes `-snl` to 7za — modern 7-Zip derefs by default, which breaks bundle codesigning. See #9846.\n * @default false\n */\n preserveSymlinks?: boolean\n\n /**\n * Paths, relative to the archived directory, to append as uncompressed (`Copy`) members instead of\n * compressing them with the rest of the archive. Differential updates diff the *compressed* archive\n * with a content-defined blockmap, and a large compressed member (an asar) diverges wholesale from\n * its previous version on any change — storing it keeps unchanged regions byte-identical between\n * builds, so the delta stays proportional to what actually changed. The stored members are excluded\n * from the main (compressed) pass and appended in a second 7za invocation with `-mx=0`; the\n * `ELECTRON_BUILDER_COMPRESSION_LEVEL` override deliberately does not apply to them (byte-stability\n * is the point), while `preserveSymlinks` and `isArchiveHeaderCompressed` are mirrored into the\n * append pass. Paths that do not exist are skipped. Not supported by the native-zip NFD fallback.\n */\n storedPaths?: Array<string> | null\n\n /**\n * Restrict the 7z filter to one the install-time extractor (the self-vendored Nsis7z plugin) can\n * decode. Modern 7za (24.09) auto-applies a CPU branch converter to executable content at\n * `-mx>=1` — `BCJ2` on x86/x64 and `ARM64` on arm64 — which that decoder silently skips, dropping\n * every executable from the install. When set, the archive is pinned to the single-stream `BCJ`\n * filter while compressing (decodable, and the best-ratio filter that decoder supports) and to\n * plain `Copy` while storing. Deliberately NOT overridable by `ELECTRON_BUILDER_7Z_FILTER`, which\n * could otherwise reintroduce an unreadable archive. Only affects the 7z format. See #9983.\n * @default false\n */\n installTimeDecodable?: boolean\n}\n\n/**\n * Whether archives for the given target platform should preserve symlinks (i.e. pass `-snl`).\n * Non-Windows targets preserve them: macOS `.framework` bundles need them for codesigning (#9846)\n * and Linux bundles may legitimately contain them. Windows dereferences because restoring symlinks\n * there requires elevated privileges. Keyed on the target platform, not the build host.\n */\nexport function shouldPreserveSymlinks(platform: Platform): boolean {\n return platform !== Platform.WINDOWS\n}\n\n/**\n * Builds the exclude switches for the given masks, rejecting any pattern that contains a path\n * traversal sequence. `prefix` is the tool-specific flag (`-xr!` for 7za, `-x` for native zip).\n */\nfunction buildExcludeArgs(excluded: Array<string> | null | undefined, prefix: string): Array<string> {\n if (excluded == null) {\n return []\n }\n return excluded.map(mask => {\n if (mask.includes(\"..\")) {\n throw new Error(`Excluded archive pattern contains path traversal sequence: \"${mask}\"`)\n }\n return `${prefix}${mask}`\n })\n}\n\nexport function compute7zCompressArgs(format: string, options: ArchiveOptions = {}) {\n let storeOnly = options.compression === \"store\"\n const args = debug7zArgs(\"a\")\n\n const compressionLevel = process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL\n if (compressionLevel != null) {\n validateCompressionLevel(compressionLevel)\n storeOnly = false // env var overrides \"store\" config\n args.push(`-mx=${compressionLevel}`)\n } else if (storeOnly) {\n // -mx=0 is the universal \"no compression\" flag across all formats (zip, 7z, gzip, xz, bzip2).\n // -mm=Copy would only be valid for zip/7z and causes E_INVALIDARG on xz/gzip/bzip2.\n args.push(\"-mx=0\")\n } else {\n const isZip = format === \"zip\"\n // ZIP uses level 7 by default; everything else (7z, gzip, xz, bzip2) uses level 9\n args.push(\"-mx=\" + (isZip && options.compression !== \"maximum\" ? \"7\" : \"9\"))\n if (isZip && options.compression === \"maximum\") {\n // http://superuser.com/a/742034\n args.push(\"-mfb=258\", \"-mpass=15\")\n }\n }\n\n if (options.dictSize != null) {\n args.push(`-md=${options.dictSize}m`)\n }\n\n // Disable NTFS timestamps for reproducible archives\n if (!options.isRegularFile) {\n args.push(\"-mtc=off\")\n }\n\n if (format === \"7z\" || format.endsWith(\".7z\")) {\n if (options.solid === false) {\n args.push(\"-ms=off\")\n }\n\n if (options.isArchiveHeaderCompressed === false) {\n args.push(\"-mhc=off\")\n }\n\n // Branch/exec filter selection. installTimeDecodable archives are unpacked by the self-vendored\n // Nsis7z extractor, whose decoder only understands plain LZMA2/Copy and the single-stream BCJ\n // filter — not the CPU branch converters modern 7za auto-applies (BCJ2 on x86/x64, ARM64 on\n // arm64). So pin them to BCJ while compressing (the best filter that decoder can read; Copy\n // needs none) and do not honor ELECTRON_BUILDER_7Z_FILTER, which could reintroduce an unreadable\n // archive. Any other 7z archive may use ELECTRON_BUILDER_7Z_FILTER, else 7za's auto-selection.\n if (options.installTimeDecodable) {\n if (!storeOnly) {\n args.push(\"-mf=BCJ\")\n }\n } else {\n const sevenZFilter = process.env.ELECTRON_BUILDER_7Z_FILTER\n if (sevenZFilter) {\n const canonicalFilter = sevenZFilter.toUpperCase()\n if (!ALLOWED_7Z_FILTERS.has(canonicalFilter)) {\n throw new Error(`ELECTRON_BUILDER_7Z_FILTER must be one of: ${[...ALLOWED_7Z_FILTERS].join(\", \")}`)\n }\n args.push(`-mf=${canonicalFilter}`)\n }\n }\n\n args.push(\"-mtm=off\", \"-mta=off\")\n }\n\n if (options.method != null && options.method !== \"DEFAULT\") {\n args.push(`-mm=${options.method}`)\n } else if (format === \"zip\") {\n // -mm is only set explicitly for zip (Deflate/Copy) and includes the UTF-8 flag.\n // For all other formats the codec is implicit from the output file extension.\n args.push(`-mm=${storeOnly ? \"Copy\" : \"Deflate\"}`)\n args.push(\"-mcu\")\n }\n\n return args\n}\n\n// 7z is very fast, so, use ultra compression\n/** @internal */\nexport async function archive(format: string, outFile: string, dirToArchive: string, options: ArchiveOptions = {}): Promise<string> {\n const outFileStat = await statOrNull(outFile)\n const dirStat = await statOrNull(dirToArchive)\n if (outFileStat && dirStat && outFileStat.mtime > dirStat.mtime) {\n log.info({ reason: \"Archive file is up to date\", outFile }, `skipped archiving`)\n return outFile\n }\n\n // Use 7za for all formats (matches pre-26.15 behavior). Native macOS `zip` is only a\n // fallback for NFD-normalized filenames, which 7za mangles.\n let use7z = true\n if (process.platform === \"darwin\" && format === \"zip\" && dirToArchive.normalize(\"NFC\") !== dirToArchive) {\n log.warn({ reason: \"7z doesn't support NFD-normalized filenames\" }, `using zip`)\n use7z = false\n }\n\n // Resolve storedPaths before the main pass so they can be excluded from it. Member names are\n // native-separator, relative to the 7za cwd (which differs with withoutDir), so the same string\n // works as both the exact `-x!` exclude mask and the append argument.\n const storedMembers: Array<string> = []\n for (const storedPath of options.storedPaths ?? []) {\n if (storedPath.includes(\"..\")) {\n throw new Error(`Stored archive path contains path traversal sequence: \"${storedPath}\"`)\n }\n if (await exists(path.join(dirToArchive, storedPath))) {\n storedMembers.push(path.normalize(options.withoutDir ? storedPath : path.join(path.basename(dirToArchive), storedPath)))\n }\n }\n if (storedMembers.length > 0 && !use7z) {\n throw new Error(\"storedPaths is not supported with the native zip fallback\")\n }\n\n if (use7z) {\n const args = compute7zCompressArgs(format, options)\n // Modern 7-Zip (24.09) dereferences symlinks by default; the 7-Zip 16.02 bundled before\n // 26.15 stored them as links. Without -snl, a macOS .framework `Versions/Current` extracts\n // as a real directory → codesign \"bundle format is ambiguous\" → breaks Squirrel.Mac\n // auto-update (#9846). Callers enable it for all non-Windows targets (see ArchiveTarget).\n if (options.preserveSymlinks) {\n args.push(\"-snl\")\n }\n await unlinkIfExists(outFile)\n args.push(outFile, options.withoutDir ? \".\" : path.basename(dirToArchive))\n args.push(...buildExcludeArgs(options.excluded, \"-xr!\"))\n // `-x!` (exact, non-recursive) so only the member itself is skipped, never a same-named sibling\n args.push(...storedMembers.map(member => `-x!${member}`))\n\n const cwd = options.withoutDir ? dirToArchive : path.dirname(dirToArchive)\n try {\n await exec(await getPath7za(), args, { cwd }, debug7z.enabled)\n } catch (e: any) {\n if (e.code === \"ENOENT\" && !(await exists(dirToArchive))) {\n throw new Error(`Cannot create archive: \"${dirToArchive}\" doesn't exist`)\n } else {\n throw e\n }\n }\n\n if (storedMembers.length > 0) {\n // Second pass: append the stored members with no compression. -mx=0 unconditionally — the\n // compression-level env override must not reach these members (see storedPaths docs). The\n // main pass's symlink, timestamp, and header-compression flags are mirrored so the option\n // stays generic: the append rewrites the archive header and may itself store a symlink.\n const appendArgs = debug7zArgs(\"a\")\n appendArgs.push(\"-mx=0\")\n if (options.preserveSymlinks) {\n appendArgs.push(\"-snl\")\n }\n if (!options.isRegularFile) {\n appendArgs.push(\"-mtc=off\")\n }\n if (format === \"7z\" || format.endsWith(\".7z\")) {\n if (options.isArchiveHeaderCompressed === false) {\n appendArgs.push(\"-mhc=off\")\n }\n appendArgs.push(\"-mtm=off\", \"-mta=off\")\n } else if (format === \"zip\") {\n appendArgs.push(\"-mm=Copy\", \"-mcu\")\n }\n appendArgs.push(outFile, ...storedMembers)\n await exec(await getPath7za(), appendArgs, { cwd }, debug7z.enabled)\n }\n } else {\n // macOS native zip (NFD fallback): -y preserves symlinks\n const args = [\"-q\", \"-r\", \"-y\"]\n if (debug7z.enabled) {\n args.push(\"-v\")\n }\n if (options.compression === \"store\") {\n args.push(\"-0\")\n } else {\n args.push(options.compression === \"maximum\" ? \"-9\" : \"-7\")\n }\n await unlinkIfExists(outFile)\n args.push(outFile, options.withoutDir ? \".\" : path.basename(dirToArchive))\n args.push(...buildExcludeArgs(options.excluded, \"-x\"))\n await exec(\"zip\", args, { cwd: options.withoutDir ? dirToArchive : path.dirname(dirToArchive) }, debug7z.enabled)\n }\n\n return outFile\n}\n\nfunction debug7zArgs(command: \"a\" | \"x\"): Array<string> {\n const args = [command, \"-bd\"]\n if (debug7z.enabled) {\n args.push(\"-bb\")\n }\n return args\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Arch } from "builder-util";
|
|
1
2
|
import { BlockMapDataHolder, PackageFileInfo } from "builder-util-runtime";
|
|
2
3
|
import { Target } from "../core.js";
|
|
3
4
|
import { PlatformPackager } from "../platformPackager.js";
|
|
@@ -12,5 +13,5 @@ export declare function createNsisWebDifferentialUpdateInfo(artifactPath: string
|
|
|
12
13
|
} | null;
|
|
13
14
|
export declare function configureDifferentialAwareArchiveOptions(archiveOptions: ArchiveOptions): ArchiveOptions;
|
|
14
15
|
export declare function appendBlockmap(file: string): Promise<BlockMapDataHolder>;
|
|
15
|
-
export declare function createBlockmap(file: string, target: Target, packager: PlatformPackager<any>, safeArtifactName: string | null): Promise<BlockMapDataHolder>;
|
|
16
|
+
export declare function createBlockmap(file: string, target: Target, packager: PlatformPackager<any>, safeArtifactName: string | null, arch?: Arch | null): Promise<BlockMapDataHolder>;
|
|
16
17
|
//# sourceMappingURL=differentialUpdateInfoBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"differentialUpdateInfoBuilder.d.ts","sourceRoot":"","sources":["../../src/targets/differentialUpdateInfoBuilder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"differentialUpdateInfoBuilder.d.ts","sourceRoot":"","sources":["../../src/targets/differentialUpdateInfoBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAO,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE1E,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAG7C,eAAO,MAAM,qBAAqB,cAAc,CAAA;AAEhD,wBAAgB,mCAAmC,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE;IAAE,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAA;CAAE;;;;SAsB1H;AAED,wBAAgB,wCAAwC,CAAC,cAAc,EAAE,cAAc,GAAG,cAAc,CA4BvG;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAG9E;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,IAAI,GAAE,IAAI,GAAG,IAAW,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAa7B"}
|
|
@@ -56,7 +56,7 @@ export async function appendBlockmap(file) {
|
|
|
56
56
|
log.info({ file: log.filePath(file) }, "building embedded block map");
|
|
57
57
|
return buildBlockMap(file, "deflate");
|
|
58
58
|
}
|
|
59
|
-
export async function createBlockmap(file, target, packager, safeArtifactName) {
|
|
59
|
+
export async function createBlockmap(file, target, packager, safeArtifactName, arch = null) {
|
|
60
60
|
const blockMapFile = `${file}${BLOCK_MAP_FILE_SUFFIX}`;
|
|
61
61
|
log.info({ blockMapFile: log.filePath(blockMapFile) }, "building block map");
|
|
62
62
|
const updateInfo = await buildBlockMap(file, "gzip", blockMapFile);
|
|
@@ -64,7 +64,7 @@ export async function createBlockmap(file, target, packager, safeArtifactName) {
|
|
|
64
64
|
file: blockMapFile,
|
|
65
65
|
safeArtifactName: safeArtifactName == null ? null : `${safeArtifactName}${BLOCK_MAP_FILE_SUFFIX}`,
|
|
66
66
|
target,
|
|
67
|
-
arch
|
|
67
|
+
arch,
|
|
68
68
|
packager,
|
|
69
69
|
updateInfo,
|
|
70
70
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"differentialUpdateInfoBuilder.js","sourceRoot":"","sources":["../../src/targets/differentialUpdateInfoBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"differentialUpdateInfoBuilder.js","sourceRoot":"","sources":["../../src/targets/differentialUpdateInfoBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,GAAG,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAI5B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,MAAM,CAAC,MAAM,qBAAqB,GAAG,WAAW,CAAA;AAEhD,MAAM,UAAU,mCAAmC,CAAC,YAAoB,EAAE,YAAiD;IACzH,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACtC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,QAAQ,GAAwC,EAAE,CAAA;IACxD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAChD,QAAQ,CAAC,IAAI,CAAC,GAAG;YACf,GAAG,eAAe;YAClB,IAAI,EAAE,IAAI;YACV,oEAAoE;YACpE,IAAI;SACE,CAAA;IACV,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,wCAAwC,CAAC,cAA8B;IACrF;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,cAAc,CAAC,QAAQ,GAAG,CAAC,CAAA;IAC3B,qDAAqD;IACrD,cAAc,CAAC,KAAK,GAAG,KAAK,CAAA;IAC5B,uEAAuE;IACvE,cAAc,CAAC,WAAW,GAAG,QAAQ,CAAA;IACrC,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,6BAA6B,CAAC,CAAA;IACrE,OAAO,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,MAAc,EACd,QAA+B,EAC/B,gBAA+B,EAC/B,OAAoB,IAAI;IAExB,MAAM,YAAY,GAAG,GAAG,IAAI,GAAG,qBAAqB,EAAE,CAAA;IACtD,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAA;IAC5E,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;IAClE,MAAM,QAAQ,CAAC,0BAA0B,CAAC;QACxC,IAAI,EAAE,YAAY;QAClB,gBAAgB,EAAE,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAG,qBAAqB,EAAE;QACjG,MAAM;QACN,IAAI;QACJ,QAAQ;QACR,UAAU;KACX,CAAC,CAAA;IACF,OAAO,UAAU,CAAA;AACnB,CAAC","sourcesContent":["import { Arch, log } from \"builder-util\"\nimport { BlockMapDataHolder, PackageFileInfo } from \"builder-util-runtime\"\nimport * as path from \"path\"\nimport { Target } from \"../core.js\"\nimport { PlatformPackager } from \"../platformPackager.js\"\nimport { ArchiveOptions } from \"./archive.js\"\nimport { buildBlockMap } from \"./blockmap/blockmap.js\"\n\nexport const BLOCK_MAP_FILE_SUFFIX = \".blockmap\"\n\nexport function createNsisWebDifferentialUpdateInfo(artifactPath: string, packageFiles: { [arch: string]: PackageFileInfo }) {\n if (packageFiles == null) {\n return null\n }\n\n const keys = Object.keys(packageFiles)\n if (keys.length <= 0) {\n return null\n }\n\n const packages: { [arch: string]: PackageFileInfo } = {}\n for (const arch of keys) {\n const packageFileInfo = packageFiles[arch]\n const file = path.basename(packageFileInfo.path)\n packages[arch] = {\n ...packageFileInfo,\n path: file,\n // https://github.com/electron-userland/electron-builder/issues/2583\n file,\n } as any\n }\n return { packages }\n}\n\nexport function configureDifferentialAwareArchiveOptions(archiveOptions: ArchiveOptions): ArchiveOptions {\n /*\n * dict size 64 MB: Full: 33,744.88 KB, To download: 17,630.3 KB (52%)\n * dict size 16 MB: Full: 33,936.84 KB, To download: 16,175.9 KB (48%)\n * dict size 8 MB: Full: 34,187.59 KB, To download: 8,229.9 KB (24%)\n * dict size 4 MB: Full: 34,628.73 KB, To download: 3,782.97 KB (11%)\n\n as we can see, if file changed in one place, all block is invalidated (and update size approximately equals to dict size)\n\n 1 MB is used:\n\n 1MB:\n\n 2018/01/11 11:54:41:0045 File has 59 changed blocks\n 2018/01/11 11:54:41:0050 Full: 71,588.59 KB, To download: 1,243.39 KB (2%)\n\n 4MB:\n\n 2018/01/11 11:31:43:0440 Full: 70,303.55 KB, To download: 4,843.27 KB (7%)\n 2018/01/11 11:31:43:0435 File has 234 changed blocks\n\n */\n archiveOptions.dictSize = 1\n // solid compression leads to a lot of changed blocks\n archiveOptions.solid = false\n // do not allow to change compression level to avoid different packages\n archiveOptions.compression = \"normal\"\n return archiveOptions\n}\n\nexport async function appendBlockmap(file: string): Promise<BlockMapDataHolder> {\n log.info({ file: log.filePath(file) }, \"building embedded block map\")\n return buildBlockMap(file, \"deflate\")\n}\n\nexport async function createBlockmap(\n file: string,\n target: Target,\n packager: PlatformPackager<any>,\n safeArtifactName: string | null,\n arch: Arch | null = null\n): Promise<BlockMapDataHolder> {\n const blockMapFile = `${file}${BLOCK_MAP_FILE_SUFFIX}`\n log.info({ blockMapFile: log.filePath(blockMapFile) }, \"building block map\")\n const updateInfo = await buildBlockMap(file, \"gzip\", blockMapFile)\n await packager.emitArtifactBuildCompleted({\n file: blockMapFile,\n safeArtifactName: safeArtifactName == null ? null : `${safeArtifactName}${BLOCK_MAP_FILE_SUFFIX}`,\n target,\n arch,\n packager,\n updateInfo,\n })\n return updateInfo\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlatpakTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/FlatpakTarget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAwD,MAAM,cAAc,CAAA;AAGzF,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAO1D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,MAAM;IAK7C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,MAAM;IACd,QAAQ,CAAC,MAAM,EAAE,MAAM;IANzB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAA+D;gBAG7F,IAAI,EAAE,MAAM,EACK,QAAQ,EAAE,aAAa,EAChC,MAAM,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM;IAKzB,IAAI,KAAK,IAAI,MAAM,CAElB;IAEK,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;YA2B1C,eAAe;YAQf,uBAAuB;YAOvB,iBAAiB;YAMjB,eAAe;YAQf,SAAS;IAiBvB,OAAO,CAAC,wBAAwB;
|
|
1
|
+
{"version":3,"file":"FlatpakTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/FlatpakTarget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAwD,MAAM,cAAc,CAAA;AAGzF,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAO1D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,MAAM;IAK7C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,MAAM;IACd,QAAQ,CAAC,MAAM,EAAE,MAAM;IANzB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAA+D;gBAG7F,IAAI,EAAE,MAAM,EACK,QAAQ,EAAE,aAAa,EAChC,MAAM,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM;IAKzB,IAAI,KAAK,IAAI,MAAM,CAElB;IAEK,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;YA2B1C,eAAe;YAQf,uBAAuB;YAOvB,iBAAiB;YAMjB,eAAe;YAQf,SAAS;IAiBvB,OAAO,CAAC,wBAAwB;CAmCjC"}
|
|
@@ -93,13 +93,17 @@ export default class FlatpakTarget extends Target {
|
|
|
93
93
|
branch: this.options.branch,
|
|
94
94
|
modules: this.options.modules,
|
|
95
95
|
};
|
|
96
|
+
// `this.options` is `linux` deep-merged with `flatpak`, and deepAssign concatenates arrays, so the
|
|
97
|
+
// shared `linux.files` globs (string | FileSet | array of either) would leak into this [src, dest] tuple
|
|
98
|
+
// list. Read the flatpak-specific list from the raw config instead of the merged options.
|
|
99
|
+
const extraFiles = this.packager.config.flatpak?.files ?? [];
|
|
96
100
|
const buildOptions = {
|
|
97
101
|
baseFlatpakref: `app/${manifest.base}/${flatpakArch}/${manifest.baseVersion}`,
|
|
98
102
|
runtimeFlatpakref: `runtime/${manifest.runtime}/${flatpakArch}/${manifest.runtimeVersion}`,
|
|
99
103
|
sdkFlatpakref: `runtime/${manifest.sdk}/${flatpakArch}/${manifest.runtimeVersion}`,
|
|
100
104
|
arch: flatpakArch,
|
|
101
105
|
bundlePath: path.join(this.outDir, artifactName),
|
|
102
|
-
files: [[stageDir, "/"], [appOutDir, path.join("/lib", appIdentifier)], ...
|
|
106
|
+
files: [[stageDir, "/"], [appOutDir, path.join("/lib", appIdentifier)], ...extraFiles],
|
|
103
107
|
symlinks: [[path.join("/lib", appIdentifier, executableName), path.join("/bin", executableName)], ...(this.options.symlinks || [])],
|
|
104
108
|
};
|
|
105
109
|
return { manifest, buildOptions };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlatpakTarget.js","sourceRoot":"","sources":["../../../src/targets/linux/FlatpakTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { bundle as bundleFlatpak, FlatpakBundlerBuildOptions, FlatpakManifest } from \"@malept/flatpak-bundler\"\nimport { Arch, copyFile, toLinuxArchString, validateShellEmbeddable } from \"builder-util\"\n\nimport * as path from \"path\"\nimport { Target } from \"../../core.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { FlatpakOptions } from \"../../options/linuxOptions.js\"\nimport { getNotLocalizedLicenseFile } from \"../../util/license.js\"\nimport { LinuxTargetHelper } from \"./LinuxTargetHelper.js\"\nimport { shellQuote } from \"./launcherScript.js\"\nimport { createStageDir, StageDir } from \"../targetUtil.js\"\nimport { Nullish } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nconst { chmod, outputFile } = _fsExtra\n\nexport default class FlatpakTarget extends Target {\n readonly options: FlatpakOptions = this.packager.getOptionsForTarget<FlatpakOptions>(this.name)\n\n constructor(\n name: string,\n private readonly packager: LinuxPackager,\n private helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name)\n }\n\n get appId(): string {\n return filterFlatpakAppIdentifier(this.packager.appInfo.id)\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const { packager, options } = this\n const artifactName = packager.expandArtifactNamePattern(options, \"flatpak\", arch, undefined, false)\n const artifactPath = path.join(this.outDir, artifactName)\n await packager.emitArtifactBuildStarted({\n targetPresentableName: \"flatpak\",\n file: artifactPath,\n arch,\n })\n\n const stageDir = await this.prepareStageDir(arch)\n\n const { manifest, buildOptions } = this.getFlatpakBuilderOptions(appOutDir, stageDir.dir, artifactName, arch)\n await bundleFlatpak(manifest, buildOptions)\n\n await stageDir.cleanup()\n\n await packager.emitArtifactBuildCompleted({\n file: artifactPath,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, \"flatpak\", arch, false),\n target: this,\n arch,\n packager,\n isWriteUpdateInfo: false,\n })\n }\n\n private async prepareStageDir(arch: Arch): Promise<StageDir> {\n const stageDir = await createStageDir(this, this.packager, arch)\n\n await Promise.all([this.createSandboxBinWrapper(stageDir), this.createDesktopFile(stageDir), this.copyLicenseFile(stageDir), this.copyIcons(stageDir)])\n\n return stageDir\n }\n\n private async createSandboxBinWrapper(stageDir: StageDir) {\n const useWaylandFlags = !!this.options.useWaylandFlags\n const electronWrapperPath = stageDir.getTempFile(path.join(\"bin\", \"electron-wrapper\"))\n await outputFile(electronWrapperPath, getElectronWrapperScript(this.packager.executableName, this.options.executableArgs, useWaylandFlags))\n await chmod(electronWrapperPath, 0o755)\n }\n\n private async createDesktopFile(stageDir: StageDir) {\n const appIdentifier = this.appId\n const desktopFile = stageDir.getTempFile(path.join(\"share\", \"applications\", `${appIdentifier}.desktop`))\n await this.helper.writeDesktopEntry(this.options, \"electron-wrapper %U\", desktopFile, { Icon: appIdentifier })\n }\n\n private async copyLicenseFile(stageDir: StageDir) {\n const licenseSrc = await getNotLocalizedLicenseFile(this.options.license, this.packager, [\"txt\", \"html\"])\n if (licenseSrc) {\n const licenseDst = stageDir.getTempFile(path.join(\"share\", \"doc\", this.appId, \"copyright\"))\n await copyFile(licenseSrc, licenseDst)\n }\n }\n\n private async copyIcons(stageDir: StageDir) {\n const icons = await this.helper.icons\n const copyIcons = icons.map(async icon => {\n if (icon.size > 512) {\n // Flatpak does not allow icons larger than 512 pixels\n return Promise.resolve()\n }\n const extWithDot = path.extname(icon.file)\n const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n const iconDst = stageDir.getTempFile(path.join(\"share\", \"icons\", \"hicolor\", sizeName, \"apps\", `${this.appId}${extWithDot}`))\n\n return copyFile(icon.file, iconDst)\n })\n\n await Promise.all(copyIcons)\n }\n\n private getFlatpakBuilderOptions(appOutDir: string, stageDir: string, artifactName: string, arch: Arch): { manifest: FlatpakManifest; buildOptions: FlatpakBundlerBuildOptions } {\n const appIdentifier = this.appId\n const { executableName } = this.packager\n const flatpakArch = toLinuxArchString(arch, \"flatpak\")\n\n const manifest: FlatpakManifest = {\n id: appIdentifier,\n command: \"electron-wrapper\",\n runtime: this.options.runtime || flatpakBuilderDefaults.runtime,\n runtimeVersion: this.options.runtimeVersion || flatpakBuilderDefaults.runtimeVersion,\n sdk: this.options.sdk || flatpakBuilderDefaults.sdk,\n base: this.options.base || flatpakBuilderDefaults.base,\n baseVersion: this.options.baseVersion || flatpakBuilderDefaults.baseVersion,\n finishArgs: this.options.finishArgs || flatpakBuilderDefaults.finishArgs,\n branch: this.options.branch,\n modules: this.options.modules,\n }\n\n const buildOptions: FlatpakBundlerBuildOptions = {\n baseFlatpakref: `app/${manifest.base}/${flatpakArch}/${manifest.baseVersion}`,\n runtimeFlatpakref: `runtime/${manifest.runtime}/${flatpakArch}/${manifest.runtimeVersion}`,\n sdkFlatpakref: `runtime/${manifest.sdk}/${flatpakArch}/${manifest.runtimeVersion}`,\n arch: flatpakArch as any,\n bundlePath: path.join(this.outDir, artifactName),\n files: [[stageDir, \"/\"], [appOutDir, path.join(\"/lib\", appIdentifier)], ...(this.options.files || [])],\n symlinks: [[path.join(\"/lib\", appIdentifier, executableName), path.join(\"/bin\", executableName)], ...(this.options.symlinks || [])],\n }\n\n return { manifest, buildOptions }\n }\n}\n\nconst flatpakBuilderDefaults: Omit<FlatpakManifest, \"id\" | \"command\"> = {\n runtime: \"org.freedesktop.Platform\",\n runtimeVersion: \"20.08\",\n sdk: \"org.freedesktop.Sdk\",\n base: \"org.electronjs.Electron2.BaseApp\",\n baseVersion: \"20.08\",\n finishArgs: [\n // Wayland/X11 Rendering\n \"--socket=wayland\",\n \"--socket=x11\",\n \"--share=ipc\",\n // Open GL\n \"--device=dri\",\n // Audio output\n \"--socket=pulseaudio\",\n // Read/write home directory access\n \"--filesystem=home\",\n // Allow communication with network\n \"--share=network\",\n // System notifications with libnotify\n \"--talk-name=org.freedesktop.Notifications\",\n ],\n}\n\nfunction getElectronWrapperScript(executableName: string, executableArgs: string[] | Nullish, useWaylandFlags: boolean): string {\n // executableName is interpolated into the generated POSIX wrapper script below; reject shell\n // metacharacters (matches the snap and AppImage targets) so it cannot inject shell commands.\n validateShellEmbeddable(executableName, \"executableName\")\n // Single-quote each arg so embedded characters (spaces, =, quotes) are passed literally,\n // consistent with the other Linux launcher entrypoints.\n const stringifiedExecutableArgs = (executableArgs ?? []).map(shellQuote).join(\" \")\n if (useWaylandFlags) {\n return `#!/bin/sh\n\nexport TMPDIR=\"$XDG_RUNTIME_DIR/app/$FLATPAK_ID\"\n\nif [ \"\\${XDG_SESSION_TYPE}\" == \"wayland\" ]; then\n zypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} --enable-features=UseOzonePlatform --ozone-platform=wayland \"$@\"\nelse\n zypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} \"$@\"\nfi\n`\n }\n return `#!/bin/sh\n\nexport TMPDIR=\"$XDG_RUNTIME_DIR/app/$FLATPAK_ID\"\n\nzypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} \"$@\"\n`\n}\n\nfunction filterFlatpakAppIdentifier(identifier: string) {\n // Remove special characters and allow only alphanumeric (A-Z,a-z,0-9), underscore (_), and period (.)\n // Flatpak documentation: https://docs.flatpak.org/en/latest/conventions.html#application-ids\n return identifier.replace(/-/g, \"_\").replace(/[^a-zA-Z0-9._]/g, \"\")\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FlatpakTarget.js","sourceRoot":"","sources":["../../../src/targets/linux/FlatpakTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { bundle as bundleFlatpak, FlatpakBundlerBuildOptions, FlatpakManifest } from \"@malept/flatpak-bundler\"\nimport { Arch, copyFile, toLinuxArchString, validateShellEmbeddable } from \"builder-util\"\n\nimport * as path from \"path\"\nimport { Target } from \"../../core.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { FlatpakOptions } from \"../../options/linuxOptions.js\"\nimport { getNotLocalizedLicenseFile } from \"../../util/license.js\"\nimport { LinuxTargetHelper } from \"./LinuxTargetHelper.js\"\nimport { shellQuote } from \"./launcherScript.js\"\nimport { createStageDir, StageDir } from \"../targetUtil.js\"\nimport { Nullish } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nconst { chmod, outputFile } = _fsExtra\n\nexport default class FlatpakTarget extends Target {\n readonly options: FlatpakOptions = this.packager.getOptionsForTarget<FlatpakOptions>(this.name)\n\n constructor(\n name: string,\n private readonly packager: LinuxPackager,\n private helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name)\n }\n\n get appId(): string {\n return filterFlatpakAppIdentifier(this.packager.appInfo.id)\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const { packager, options } = this\n const artifactName = packager.expandArtifactNamePattern(options, \"flatpak\", arch, undefined, false)\n const artifactPath = path.join(this.outDir, artifactName)\n await packager.emitArtifactBuildStarted({\n targetPresentableName: \"flatpak\",\n file: artifactPath,\n arch,\n })\n\n const stageDir = await this.prepareStageDir(arch)\n\n const { manifest, buildOptions } = this.getFlatpakBuilderOptions(appOutDir, stageDir.dir, artifactName, arch)\n await bundleFlatpak(manifest, buildOptions)\n\n await stageDir.cleanup()\n\n await packager.emitArtifactBuildCompleted({\n file: artifactPath,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, \"flatpak\", arch, false),\n target: this,\n arch,\n packager,\n isWriteUpdateInfo: false,\n })\n }\n\n private async prepareStageDir(arch: Arch): Promise<StageDir> {\n const stageDir = await createStageDir(this, this.packager, arch)\n\n await Promise.all([this.createSandboxBinWrapper(stageDir), this.createDesktopFile(stageDir), this.copyLicenseFile(stageDir), this.copyIcons(stageDir)])\n\n return stageDir\n }\n\n private async createSandboxBinWrapper(stageDir: StageDir) {\n const useWaylandFlags = !!this.options.useWaylandFlags\n const electronWrapperPath = stageDir.getTempFile(path.join(\"bin\", \"electron-wrapper\"))\n await outputFile(electronWrapperPath, getElectronWrapperScript(this.packager.executableName, this.options.executableArgs, useWaylandFlags))\n await chmod(electronWrapperPath, 0o755)\n }\n\n private async createDesktopFile(stageDir: StageDir) {\n const appIdentifier = this.appId\n const desktopFile = stageDir.getTempFile(path.join(\"share\", \"applications\", `${appIdentifier}.desktop`))\n await this.helper.writeDesktopEntry(this.options, \"electron-wrapper %U\", desktopFile, { Icon: appIdentifier })\n }\n\n private async copyLicenseFile(stageDir: StageDir) {\n const licenseSrc = await getNotLocalizedLicenseFile(this.options.license, this.packager, [\"txt\", \"html\"])\n if (licenseSrc) {\n const licenseDst = stageDir.getTempFile(path.join(\"share\", \"doc\", this.appId, \"copyright\"))\n await copyFile(licenseSrc, licenseDst)\n }\n }\n\n private async copyIcons(stageDir: StageDir) {\n const icons = await this.helper.icons\n const copyIcons = icons.map(async icon => {\n if (icon.size > 512) {\n // Flatpak does not allow icons larger than 512 pixels\n return Promise.resolve()\n }\n const extWithDot = path.extname(icon.file)\n const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n const iconDst = stageDir.getTempFile(path.join(\"share\", \"icons\", \"hicolor\", sizeName, \"apps\", `${this.appId}${extWithDot}`))\n\n return copyFile(icon.file, iconDst)\n })\n\n await Promise.all(copyIcons)\n }\n\n private getFlatpakBuilderOptions(appOutDir: string, stageDir: string, artifactName: string, arch: Arch): { manifest: FlatpakManifest; buildOptions: FlatpakBundlerBuildOptions } {\n const appIdentifier = this.appId\n const { executableName } = this.packager\n const flatpakArch = toLinuxArchString(arch, \"flatpak\")\n\n const manifest: FlatpakManifest = {\n id: appIdentifier,\n command: \"electron-wrapper\",\n runtime: this.options.runtime || flatpakBuilderDefaults.runtime,\n runtimeVersion: this.options.runtimeVersion || flatpakBuilderDefaults.runtimeVersion,\n sdk: this.options.sdk || flatpakBuilderDefaults.sdk,\n base: this.options.base || flatpakBuilderDefaults.base,\n baseVersion: this.options.baseVersion || flatpakBuilderDefaults.baseVersion,\n finishArgs: this.options.finishArgs || flatpakBuilderDefaults.finishArgs,\n branch: this.options.branch,\n modules: this.options.modules,\n }\n\n // `this.options` is `linux` deep-merged with `flatpak`, and deepAssign concatenates arrays, so the\n // shared `linux.files` globs (string | FileSet | array of either) would leak into this [src, dest] tuple\n // list. Read the flatpak-specific list from the raw config instead of the merged options.\n const extraFiles = this.packager.config.flatpak?.files ?? []\n\n const buildOptions: FlatpakBundlerBuildOptions = {\n baseFlatpakref: `app/${manifest.base}/${flatpakArch}/${manifest.baseVersion}`,\n runtimeFlatpakref: `runtime/${manifest.runtime}/${flatpakArch}/${manifest.runtimeVersion}`,\n sdkFlatpakref: `runtime/${manifest.sdk}/${flatpakArch}/${manifest.runtimeVersion}`,\n arch: flatpakArch as any,\n bundlePath: path.join(this.outDir, artifactName),\n files: [[stageDir, \"/\"], [appOutDir, path.join(\"/lib\", appIdentifier)], ...extraFiles],\n symlinks: [[path.join(\"/lib\", appIdentifier, executableName), path.join(\"/bin\", executableName)], ...(this.options.symlinks || [])],\n }\n\n return { manifest, buildOptions }\n }\n}\n\nconst flatpakBuilderDefaults: Omit<FlatpakManifest, \"id\" | \"command\"> = {\n runtime: \"org.freedesktop.Platform\",\n runtimeVersion: \"20.08\",\n sdk: \"org.freedesktop.Sdk\",\n base: \"org.electronjs.Electron2.BaseApp\",\n baseVersion: \"20.08\",\n finishArgs: [\n // Wayland/X11 Rendering\n \"--socket=wayland\",\n \"--socket=x11\",\n \"--share=ipc\",\n // Open GL\n \"--device=dri\",\n // Audio output\n \"--socket=pulseaudio\",\n // Read/write home directory access\n \"--filesystem=home\",\n // Allow communication with network\n \"--share=network\",\n // System notifications with libnotify\n \"--talk-name=org.freedesktop.Notifications\",\n ],\n}\n\nfunction getElectronWrapperScript(executableName: string, executableArgs: string[] | Nullish, useWaylandFlags: boolean): string {\n // executableName is interpolated into the generated POSIX wrapper script below; reject shell\n // metacharacters (matches the snap and AppImage targets) so it cannot inject shell commands.\n validateShellEmbeddable(executableName, \"executableName\")\n // Single-quote each arg so embedded characters (spaces, =, quotes) are passed literally,\n // consistent with the other Linux launcher entrypoints.\n const stringifiedExecutableArgs = (executableArgs ?? []).map(shellQuote).join(\" \")\n if (useWaylandFlags) {\n return `#!/bin/sh\n\nexport TMPDIR=\"$XDG_RUNTIME_DIR/app/$FLATPAK_ID\"\n\nif [ \"\\${XDG_SESSION_TYPE}\" == \"wayland\" ]; then\n zypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} --enable-features=UseOzonePlatform --ozone-platform=wayland \"$@\"\nelse\n zypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} \"$@\"\nfi\n`\n }\n return `#!/bin/sh\n\nexport TMPDIR=\"$XDG_RUNTIME_DIR/app/$FLATPAK_ID\"\n\nzypak-wrapper \"${executableName}\" ${stringifiedExecutableArgs} \"$@\"\n`\n}\n\nfunction filterFlatpakAppIdentifier(identifier: string) {\n // Remove special characters and allow only alphanumeric (A-Z,a-z,0-9), underscore (_), and period (.)\n // Flatpak documentation: https://docs.flatpak.org/en/latest/conventions.html#application-ids\n return identifier.replace(/-/g, \"_\").replace(/[^a-zA-Z0-9._]/g, \"\")\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FpmTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/FpmTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"FpmTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/linux/FpmTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuI,MAAM,cAAc,CAAA;AAQxK,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAc,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAWtF,OAAO,EAAiB,iBAAiB,EAAwB,MAAM,wBAAwB,CAAA;AAgB/F,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,MAAM;IAOzC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM;IARzB,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAA2E;IAEvH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;gBAGhD,IAAI,EAAE,MAAM,EACK,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,iBAAiB,EACjC,MAAM,EAAE,MAAM;YAOX,aAAa;IAoD3B,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;YAId,yBAAyB;IA+BjC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;IAmMxD;;;;OAIG;YACW,oBAAoB;YAcpB,UAAU;IAmDxB,OAAO,CAAC,kBAAkB;IAI1B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,8BAA8B;CAWvC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { asArray, exec, getArchSuffix, log, stripSensitiveEnvVars, toLinuxArchString, unlinkIfExists, use } from "builder-util";
|
|
1
|
+
import { asArray, exec, getArchSuffix, InvalidConfigurationError, log, stripSensitiveEnvVars, toLinuxArchString, unlinkIfExists, use } from "builder-util";
|
|
2
2
|
import { objectToArgs } from "builder-util-runtime";
|
|
3
3
|
import _fsExtra from "fs-extra";
|
|
4
4
|
import { chmod, mkdir, readFile } from "fs/promises";
|
|
@@ -396,6 +396,27 @@ export default class FpmTarget extends Target {
|
|
|
396
396
|
return [];
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
|
+
/**
|
|
400
|
+
* Legacy EJS interpolation, removed in v27 in favour of shell-style `${var}`.
|
|
401
|
+
*
|
|
402
|
+
* This has to be detected explicitly: the substitution below is a plain `${var}` regex, so an
|
|
403
|
+
* `<%= executable %>` left in a template does not match, is copied verbatim into the maintainer
|
|
404
|
+
* script, and ships inside the .deb/.rpm. The build stays green and every install runs a broken
|
|
405
|
+
* postinst/postrm — so this fails the build rather than warning.
|
|
406
|
+
*/
|
|
407
|
+
const LEGACY_EJS_TAG = /<%[-=]?\s*([\w.]+)\s*%>/;
|
|
408
|
+
function assertNoLegacyEjsTemplate(templatePath, template) {
|
|
409
|
+
const match = LEGACY_EJS_TAG.exec(template);
|
|
410
|
+
if (match == null) {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
const [tag, name] = match;
|
|
414
|
+
throw new InvalidConfigurationError(`${templatePath} uses the EJS template syntax \`${tag}\`, which was removed in electron-builder v27.\n` +
|
|
415
|
+
`Use the shell-style form instead: \${${name}}\n` +
|
|
416
|
+
"Left as-is the tag is copied verbatim into the generated maintainer script and shipped inside the package, " +
|
|
417
|
+
"so every install would run a broken postinst/postrm.\n" +
|
|
418
|
+
"https://www.electron.build/docs/migration/v27-breaking-changes#linux-maintainer-script-ejs-template-syntax");
|
|
419
|
+
}
|
|
399
420
|
async function writeConfigFile(tmpDir, templatePath, options) {
|
|
400
421
|
//noinspection JSUnusedLocalSymbols
|
|
401
422
|
function replacer(match, p1) {
|
|
@@ -406,7 +427,9 @@ async function writeConfigFile(tmpDir, templatePath, options) {
|
|
|
406
427
|
throw new Error(`Macro ${p1} is not defined`);
|
|
407
428
|
}
|
|
408
429
|
}
|
|
409
|
-
const
|
|
430
|
+
const template = await readFile(templatePath, "utf8");
|
|
431
|
+
assertNoLegacyEjsTemplate(templatePath, template);
|
|
432
|
+
const config = template.replace(/\${([a-zA-Z]+)}/g, replacer);
|
|
410
433
|
const outputPath = await tmpDir.getTempFile({ suffix: path.basename(templatePath, ".tpl") });
|
|
411
434
|
await outputFile(outputPath, config);
|
|
412
435
|
return outputPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FpmTarget.js","sourceRoot":"","sources":["../../../src/targets/linux/FpmTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, asArray, exec, getArchSuffix, log, stripSensitiveEnvVars, TmpDir, toLinuxArchString, unlinkIfExists, use } from \"builder-util\"\nimport { Nullish } from \"builder-util-runtime\"\n\nimport { objectToArgs } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { chmod, mkdir, readFile } from \"fs/promises\"\nimport * as path from \"path\"\nimport { smarten } from \"../../appInfo.js\"\nimport { Target } from \"../../core.js\"\nimport * as errorMessages from \"../../errorMessages.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { DebOptions, LinuxTargetSpecificOptions } from \"../../options/linuxOptions.js\"\nimport { ArtifactCreated } from \"../../packagerApi.js\"\nimport { getAppUpdatePublishConfiguration, writeAppUpdateYaml } from \"../../publish/PublishManager.js\"\nimport { getFpmPath } from \"../../toolsets/fpm.js\"\nimport { getLinuxToolsPath } from \"../../toolsets/linuxToolsMac.js\"\nimport { computeEnv } from \"../../util/bundledTool.js\"\nimport { isFpmDebug } from \"../../util/flags.js\"\nimport { hashFile } from \"../../util/hash.js\"\nimport { isMacOsSierra } from \"../../util/mac/macosVersion.js\"\nimport { getTemplatePath } from \"../../util/pathManager.js\"\nimport { buildLauncherScript, shellQuote } from \"./launcherScript.js\"\nimport { installPrefix, LinuxTargetHelper, quoteDesktopExecPath } from \"./LinuxTargetHelper.js\"\nconst { copyFile, outputFile, stat } = _fsExtra\n\ninterface FpmOptions {\n name: string\n maintainer: string | undefined\n vendor: string\n url: string\n}\n\ninterface ScriptFiles {\n afterRemove: string\n afterInstall: string\n appArmor: string\n}\n\nexport default class FpmTarget extends Target {\n readonly options: LinuxTargetSpecificOptions = this.packager.getOptionsForTarget<LinuxTargetSpecificOptions>(this.name)\n\n private readonly scriptFiles: Promise<ScriptFiles>\n\n constructor(\n name: string,\n private readonly packager: LinuxPackager,\n private readonly helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name, false)\n\n this.scriptFiles = this.createScripts()\n }\n\n private async createScripts(): Promise<ScriptFiles> {\n const defaultTemplatesDir = getTemplatePath(\"linux\")\n\n const packager = this.packager\n\n /** Escape a string value for safe interpolation inside a bash single-quoted\n * string (`'...'`). The only character that can break out of a POSIX\n * single-quoted context is a literal single-quote; we replace it with the\n * standard `'\\''` sequence (end quote → escaped quote → start quote).\n *\n * sanitize-filename removes characters that are illegal in filenames but\n * deliberately keeps `'` because it is valid on POSIX systems. Without\n * this extra step, an app named `O'Brien` would terminate the quoted path\n * inside the generated after-install / after-remove shell scripts, enabling\n * arbitrary command injection when the package is installed as root. */\n function bashSingleQuoteEscape(value: string): string {\n return value.replace(/'/g, \"'\\\\''\")\n }\n\n // Bash-script templates embed executable and sanitizedProductName inside\n // single-quoted shell paths — escape single quotes to prevent injection.\n const bashTemplateOptions = {\n // old API compatibility\n executable: bashSingleQuoteEscape(packager.executableName),\n sanitizedProductName: bashSingleQuoteEscape(packager.appInfo.sanitizedProductName),\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n // The AppArmor profile template uses these values inside double-quoted\n // AppArmor path patterns — no single-quote escaping needed or wanted.\n const appArmorTemplateOptions = {\n executable: packager.executableName,\n sanitizedProductName: packager.appInfo.sanitizedProductName,\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n function getResource(value: string | Nullish, defaultFile: string) {\n if (value == null) {\n return path.join(defaultTemplatesDir, defaultFile)\n }\n return path.resolve(packager.projectDir, value)\n }\n\n return {\n afterInstall: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterInstall, \"after-install.tpl\"), bashTemplateOptions),\n afterRemove: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterRemove, \"after-remove.tpl\"), bashTemplateOptions),\n appArmor: await writeConfigFile(packager.tempDirManager, getResource(this.options.appArmorProfile, \"apparmor-profile.tpl\"), appArmorTemplateOptions),\n }\n }\n\n checkOptions(): Promise<any> {\n return this.computeFpmMetaInfoOptions()\n }\n\n private async computeFpmMetaInfoOptions(): Promise<FpmOptions> {\n const packager = this.packager\n const projectUrl = await packager.appInfo.computePackageUrl()\n const errors: Array<string> = []\n if (projectUrl == null) {\n errors.push(\"Please specify project homepage, see https://www.electron.build/configuration#metadata\")\n }\n\n const options = this.options\n let author = options.maintainer\n if (author == null) {\n const a = packager.metadata.author\n if (a == null || a.email == null) {\n errors.push(errorMessages.authorEmailIsMissed)\n } else {\n author = `${a.name} <${a.email}>`\n }\n }\n\n if (errors.length > 0) {\n throw new Error(errors.join(\"\\n\\n\"))\n }\n\n return {\n name: options.packageName ?? this.packager.appInfo.linuxPackageName,\n maintainer: author!,\n url: projectUrl!,\n vendor: options.vendor || author!,\n }\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const target = this.name\n\n // tslint:disable:no-invalid-template-strings\n let nameFormat = \"${name}-${version}-${arch}.${ext}\"\n let isUseArchIfX64 = false\n if (target === \"deb\") {\n nameFormat = \"${name}_${version}_${arch}.${ext}\"\n isUseArchIfX64 = true\n } else if (target === \"rpm\") {\n nameFormat = \"${name}-${version}.${arch}.${ext}\"\n isUseArchIfX64 = true\n }\n\n const packager = this.packager\n const artifactName = packager.expandArtifactNamePattern(this.options, target, arch, nameFormat, !isUseArchIfX64)\n const artifactPath = path.join(this.outDir, artifactName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: target,\n file: artifactPath,\n arch,\n })\n\n await unlinkIfExists(artifactPath)\n if (packager.packagerOptions.prepackaged != null) {\n await mkdir(this.outDir, { recursive: true })\n }\n const linuxDistType = packager.packagerOptions.prepackaged || path.join(this.outDir, `linux${getArchSuffix(arch)}-unpacked`)\n const resourceDir = packager.getResourcesDir(linuxDistType)\n\n const publishConfig = this.supportsAutoUpdate(target)\n ? await getAppUpdatePublishConfiguration(packager, this.options, arch, false /* in any case validation will be done on publish step */)\n : null\n if (publishConfig != null) {\n log.info({ resourceDir: log.filePath(resourceDir) }, `adding autoupdate files for: ${target}`)\n await writeAppUpdateYaml(resourceDir, publishConfig)\n // Extra file needed for auto-updater to detect installation method\n await outputFile(path.join(resourceDir, \"package-type\"), target)\n }\n\n const scripts = await this.scriptFiles\n\n // Install AppArmor support for ubuntu 24+\n // https://github.com/electron-userland/electron-builder/issues/8635\n await copyFile(scripts.appArmor, path.join(resourceDir, \"apparmor-profile\"))\n\n const appInfo = packager.appInfo\n const options = this.options\n const synopsis = options.synopsis\n const args = [\n \"--architecture\",\n toLinuxArchString(arch, target),\n \"--after-install\",\n scripts.afterInstall,\n \"--after-remove\",\n scripts.afterRemove,\n \"--description\",\n smarten(target === \"rpm\" ? this.helper.getDescription(options) : `${synopsis || \"\"}\\n ${this.helper.getDescription(options)}`),\n \"--version\",\n this.helper.getSanitizedVersion(target),\n \"--package\",\n artifactPath,\n ]\n\n const meta = await this.computeFpmMetaInfoOptions()\n args.push(...objectToArgs({ name: meta.name, maintainer: meta.maintainer ?? null, vendor: meta.vendor, url: meta.url }))\n\n const packageCategory = options.packageCategory\n if (packageCategory != null) {\n args.push(\"--category\", packageCategory)\n }\n\n if (target === \"deb\") {\n args.push(\"--deb-priority\", (options as DebOptions).priority ?? \"optional\")\n } else if (target === \"rpm\") {\n if (synopsis != null) {\n args.push(\"--rpm-summary\", smarten(synopsis))\n }\n }\n\n const fpmConfiguration: FpmConfiguration = {\n args,\n target,\n }\n\n if (options.compression != null) {\n fpmConfiguration.compression = options.compression\n }\n\n // noinspection JSDeprecatedSymbols\n const depends = options.depends\n if (depends != null) {\n if (Array.isArray(depends)) {\n fpmConfiguration.customDepends = this.expandDependsDefaults(depends, target)\n } else if (typeof depends === \"string\") {\n fpmConfiguration.customDepends = [depends as string]\n } else {\n throw new Error(`depends must be Array or String, but specified as: ${depends}`)\n }\n } else {\n fpmConfiguration.customDepends = this.getDefaultDepends(target)\n }\n\n if (target === \"deb\") {\n const recommends = (options as DebOptions).recommends\n if (recommends) {\n fpmConfiguration.customRecommends = asArray(recommends)\n } else {\n fpmConfiguration.customRecommends = this.getDefaultRecommends(target)\n }\n }\n\n use(packager.metadata.license, it => args.push(\"--license\", it))\n use(appInfo.buildNumber, it =>\n args.push(\n \"--iteration\",\n // dashes are not supported for iteration in older versions of fpm\n // https://github.com/jordansissel/fpm/issues/1833\n it.split(\"-\").join(\"_\")\n )\n )\n\n use(options.fpm, it => args.push(...it))\n\n args.push(`${appOutDir}/=${installPrefix}/${appInfo.sanitizedProductName}`)\n for (const icon of await this.helper.icons) {\n const extWithDot = path.extname(icon.file)\n const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n args.push(`${icon.file}=/usr/share/icons/hicolor/${sizeName}/apps/${packager.executableName}${extWithDot}`)\n }\n\n const mimeTypeFilePath = await this.helper.mimeTypeFiles\n if (mimeTypeFilePath != null) {\n args.push(`${mimeTypeFilePath}=/usr/share/mime/packages/${packager.executableName}.xml`)\n }\n\n // Launch through a launcher entrypoint so executableArgs are injected in one place and the\n // .desktop Exec key stays a plain command path (consistent with the other Linux targets).\n const launcher = await this.createLauncherScript()\n args.push(`${launcher.tempPath}=${launcher.installPath}`)\n\n const desktopFilePath = await this.helper.writeDesktopEntry(this.options, `${quoteDesktopExecPath(launcher.installPath)} %U`)\n args.push(`${desktopFilePath}=/usr/share/applications/${this.helper.getDesktopFileName()}.desktop`)\n\n if (packager.packagerOptions.effectiveOptionComputed != null && (await packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath]))) {\n return\n }\n\n const env = {\n ...stripSensitiveEnvVars(process.env),\n }\n\n // fpm compresses the deb data.tar by piping GNU tar -J, which exports only\n // XZ_OPT=-<level> — so xz runs single-threaded regardless of the machine,\n // while rpm already defaults to multithreaded \"xzmt\" (measured on one\n // 6.4 GiB tree in one run: deb 1059s vs rpm 171s). xz parses XZ_DEFAULTS\n // before XZ_OPT, so -T0 multithreads the deb pack at the unchanged\n // compression level; an operator-provided XZ_DEFAULTS wins. Fixes #10045.\n if (target === \"deb\" && process.env.XZ_DEFAULTS == null) {\n env.XZ_DEFAULTS = \"-T0\"\n }\n\n // rpmbuild wants directory rpm with some default config files. Even if we can use dylibbundler, path to such config files are not changed (we need to replace in the binary)\n // so, for now, brew install rpm is still required.\n if (target !== \"rpm\" && (await isMacOsSierra())) {\n const linuxToolsPath = await getLinuxToolsPath(packager.config.toolsets?.linuxToolsMac, packager.buildResourcesDir)\n Object.assign(env, {\n PATH: computeEnv(process.env.PATH, [path.join(linuxToolsPath, \"bin\")]),\n DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, [path.join(linuxToolsPath, \"lib\")]),\n })\n }\n\n await this.executeFpm(target, fpmConfiguration, env)\n\n let info: ArtifactCreated = {\n file: artifactPath,\n target: this,\n arch,\n packager,\n }\n if (publishConfig != null) {\n info = {\n ...info,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, target, arch, !isUseArchIfX64),\n isWriteUpdateInfo: true,\n updateInfo: {\n sha512: await hashFile(artifactPath),\n size: (await stat(artifactPath)).size,\n },\n }\n }\n await packager.emitArtifactBuildCompleted(info)\n }\n\n /**\n * Generate the launcher entrypoint script installed alongside the app binary. The launcher execs\n * the real binary with the configured `executableArgs` (single-quoted) and forwards `\"$@\"` so the\n * desktop launcher's field-code expansions (e.g. opened files/URLs) still reach the app.\n */\n private async createLauncherScript(): Promise<{ installPath: string; tempPath: string }> {\n const { appInfo, executableName } = this.packager\n const appDir = `${installPrefix}/${appInfo.sanitizedProductName}`\n // The launcher path is fully resolved (no shell variables to expand), so single-quote the whole\n // token. This passes any embedded character literally and avoids restricting otherwise-valid\n // executable/product names (e.g. those containing `$` or backtick).\n const content = buildLauncherScript({ command: [shellQuote(`${appDir}/${executableName}`)], args: this.options.executableArgs ?? [] })\n\n const tempPath = await this.packager.tempDirManager.getTempFile({ suffix: \"-launcher.sh\" })\n await outputFile(tempPath, content, { mode: 0o755 })\n await chmod(tempPath, 0o755)\n return { installPath: `${appDir}/${executableName}-launcher`, tempPath }\n }\n\n private async executeFpm(target: string, fpmConfiguration: FpmConfiguration, env: any) {\n const fpmArgs = [\"-s\", \"dir\", \"--force\", \"-t\", target]\n const forceDebugLogging = isFpmDebug()\n if (forceDebugLogging) {\n fpmArgs.push(\"--debug\")\n }\n if (log.isDebugEnabled) {\n fpmArgs.push(\"--log\", \"debug\")\n }\n fpmConfiguration.customDepends?.forEach(it => fpmArgs.push(\"-d\", it))\n if (target === \"deb\") {\n fpmConfiguration.customRecommends?.forEach(it => fpmArgs.push(\"--deb-recommends\", it))\n }\n\n const defaultCompression = target === \"rpm\" ? \"xzmt\" : \"xz\"\n fpmArgs.push(...this.configureTargetSpecificOptions(target, fpmConfiguration.compression ?? defaultCompression))\n fpmArgs.push(...fpmConfiguration.args)\n\n const fpmPath = await getFpmPath(this.packager.config.toolsets?.fpm, this.packager.buildResourcesDir)\n\n await exec(fpmPath, fpmArgs, { env }).catch(e => {\n if (e.message.includes(\"Need executable 'rpmbuild' to convert dir to rpm\")) {\n const hint = \"to build rpm, executable rpmbuild is required, please install rpm package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install rpm)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install rpm)\")\n }\n }\n if (e.message.includes(\"xz: not found\")) {\n const hint = \"to build rpm, executable xz is required, please install xz package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install xz)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install xz-utils)\")\n }\n }\n if (e.message.includes(\"error: File not found\")) {\n log.error(\n { fpmArgs, ...fpmConfiguration },\n \"fpm failed to find the specified files. Please check your configuration and ensure all paths are correct. To see what files triggered this, set the environment variable FPM_DEBUG=true\"\n )\n if (forceDebugLogging) {\n log.error(null, e.message)\n }\n throw new Error(`FPM failed to find the specified files. Please check your configuration and ensure all paths are correct. Command: ${fpmPath} ${fpmArgs.join(\" \")}`)\n }\n throw e\n })\n }\n\n private supportsAutoUpdate(target: string) {\n return [\"deb\", \"rpm\", \"pacman\"].includes(target)\n }\n\n /**\n * Expand the `\"default\"` keyword in a user-provided `depends` array to the target's default\n * depends list, so extras can be appended without repeating (and having to keep in sync) the\n * defaults — same convention as the snap target's `plugs`/`stagePackages`/`buildPackages`.\n * The result is deduplicated while preserving order.\n */\n private expandDependsDefaults(depends: string[], target: string): string[] {\n const result: string[] = []\n for (const item of depends) {\n if (item === \"default\") {\n result.push(...this.getDefaultDepends(target))\n } else {\n result.push(item)\n }\n }\n return Array.from(new Set(result))\n }\n\n private getDefaultDepends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libgtk-3-0\", \"libnotify4\", \"libnss3\", \"libxss1\", \"libxtst6\", \"xdg-utils\", \"libatspi2.0-0\", \"libuuid1\", \"libsecret-1-0\"]\n\n case \"rpm\":\n return [\n \"gtk3\" /* for electron 2+ (electron 1 uses gtk2, but this old version is not supported anymore) */,\n \"libnotify\",\n \"nss\",\n \"libXScrnSaver\",\n \"(libXtst or libXtst6)\",\n \"xdg-utils\",\n \"at-spi2-core\" /* since 5.0.0 */,\n \"(libuuid or libuuid1)\" /* since 4.0.0 */,\n ]\n\n case \"pacman\":\n return [\"c-ares\", \"ffmpeg\", \"gtk3\", \"libevent\", \"libvpx\", \"libxslt\", \"libxss\", \"minizip\", \"nss\", \"re2\", \"snappy\", \"libnotify\", \"libappindicator-gtk3\"]\n\n default:\n return []\n }\n }\n\n private getDefaultRecommends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libappindicator3-1\"]\n default:\n return []\n }\n }\n\n private configureTargetSpecificOptions(target: string, compression: string): string[] {\n switch (target) {\n case \"rpm\":\n return [\"--rpm-os\", \"linux\", \"--rpm-compression\", compression === \"xz\" ? \"xzmt\" : compression]\n case \"deb\":\n return [\"--deb-compression\", compression]\n case \"pacman\":\n return [\"--pacman-compression\", compression]\n }\n return []\n }\n}\n\ninterface FpmConfiguration {\n target: string\n args: Array<string>\n customDepends?: Array<string>\n customRecommends?: Array<string>\n compression?: LinuxTargetSpecificOptions[\"compression\"]\n}\n\nasync function writeConfigFile(tmpDir: TmpDir, templatePath: string, options: any): Promise<string> {\n //noinspection JSUnusedLocalSymbols\n function replacer(match: string, p1: string) {\n if (p1 in options) {\n return options[p1]\n } else {\n throw new Error(`Macro ${p1} is not defined`)\n }\n }\n const config = (await readFile(templatePath, \"utf8\")).replace(/\\${([a-zA-Z]+)}/g, replacer)\n\n const outputPath = await tmpDir.getTempFile({ suffix: path.basename(templatePath, \".tpl\") })\n await outputFile(outputPath, config)\n return outputPath\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FpmTarget.js","sourceRoot":"","sources":["../../../src/targets/linux/FpmTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, asArray, exec, getArchSuffix, InvalidConfigurationError, log, stripSensitiveEnvVars, TmpDir, toLinuxArchString, unlinkIfExists, use } from \"builder-util\"\nimport { Nullish } from \"builder-util-runtime\"\n\nimport { objectToArgs } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { chmod, mkdir, readFile } from \"fs/promises\"\nimport * as path from \"path\"\nimport { smarten } from \"../../appInfo.js\"\nimport { Target } from \"../../core.js\"\nimport * as errorMessages from \"../../errorMessages.js\"\nimport { LinuxPackager } from \"../../linuxPackager.js\"\nimport { DebOptions, LinuxTargetSpecificOptions } from \"../../options/linuxOptions.js\"\nimport { ArtifactCreated } from \"../../packagerApi.js\"\nimport { getAppUpdatePublishConfiguration, writeAppUpdateYaml } from \"../../publish/PublishManager.js\"\nimport { getFpmPath } from \"../../toolsets/fpm.js\"\nimport { getLinuxToolsPath } from \"../../toolsets/linuxToolsMac.js\"\nimport { computeEnv } from \"../../util/bundledTool.js\"\nimport { isFpmDebug } from \"../../util/flags.js\"\nimport { hashFile } from \"../../util/hash.js\"\nimport { isMacOsSierra } from \"../../util/mac/macosVersion.js\"\nimport { getTemplatePath } from \"../../util/pathManager.js\"\nimport { buildLauncherScript, shellQuote } from \"./launcherScript.js\"\nimport { installPrefix, LinuxTargetHelper, quoteDesktopExecPath } from \"./LinuxTargetHelper.js\"\nconst { copyFile, outputFile, stat } = _fsExtra\n\ninterface FpmOptions {\n name: string\n maintainer: string | undefined\n vendor: string\n url: string\n}\n\ninterface ScriptFiles {\n afterRemove: string\n afterInstall: string\n appArmor: string\n}\n\nexport default class FpmTarget extends Target {\n readonly options: LinuxTargetSpecificOptions = this.packager.getOptionsForTarget<LinuxTargetSpecificOptions>(this.name)\n\n private readonly scriptFiles: Promise<ScriptFiles>\n\n constructor(\n name: string,\n private readonly packager: LinuxPackager,\n private readonly helper: LinuxTargetHelper,\n readonly outDir: string\n ) {\n super(name, false)\n\n this.scriptFiles = this.createScripts()\n }\n\n private async createScripts(): Promise<ScriptFiles> {\n const defaultTemplatesDir = getTemplatePath(\"linux\")\n\n const packager = this.packager\n\n /** Escape a string value for safe interpolation inside a bash single-quoted\n * string (`'...'`). The only character that can break out of a POSIX\n * single-quoted context is a literal single-quote; we replace it with the\n * standard `'\\''` sequence (end quote → escaped quote → start quote).\n *\n * sanitize-filename removes characters that are illegal in filenames but\n * deliberately keeps `'` because it is valid on POSIX systems. Without\n * this extra step, an app named `O'Brien` would terminate the quoted path\n * inside the generated after-install / after-remove shell scripts, enabling\n * arbitrary command injection when the package is installed as root. */\n function bashSingleQuoteEscape(value: string): string {\n return value.replace(/'/g, \"'\\\\''\")\n }\n\n // Bash-script templates embed executable and sanitizedProductName inside\n // single-quoted shell paths — escape single quotes to prevent injection.\n const bashTemplateOptions = {\n // old API compatibility\n executable: bashSingleQuoteEscape(packager.executableName),\n sanitizedProductName: bashSingleQuoteEscape(packager.appInfo.sanitizedProductName),\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n // The AppArmor profile template uses these values inside double-quoted\n // AppArmor path patterns — no single-quote escaping needed or wanted.\n const appArmorTemplateOptions = {\n executable: packager.executableName,\n sanitizedProductName: packager.appInfo.sanitizedProductName,\n productFilename: packager.appInfo.productFilename,\n ...packager.platformOptions,\n }\n\n function getResource(value: string | Nullish, defaultFile: string) {\n if (value == null) {\n return path.join(defaultTemplatesDir, defaultFile)\n }\n return path.resolve(packager.projectDir, value)\n }\n\n return {\n afterInstall: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterInstall, \"after-install.tpl\"), bashTemplateOptions),\n afterRemove: await writeConfigFile(packager.tempDirManager, getResource(this.options.afterRemove, \"after-remove.tpl\"), bashTemplateOptions),\n appArmor: await writeConfigFile(packager.tempDirManager, getResource(this.options.appArmorProfile, \"apparmor-profile.tpl\"), appArmorTemplateOptions),\n }\n }\n\n checkOptions(): Promise<any> {\n return this.computeFpmMetaInfoOptions()\n }\n\n private async computeFpmMetaInfoOptions(): Promise<FpmOptions> {\n const packager = this.packager\n const projectUrl = await packager.appInfo.computePackageUrl()\n const errors: Array<string> = []\n if (projectUrl == null) {\n errors.push(\"Please specify project homepage, see https://www.electron.build/configuration#metadata\")\n }\n\n const options = this.options\n let author = options.maintainer\n if (author == null) {\n const a = packager.metadata.author\n if (a == null || a.email == null) {\n errors.push(errorMessages.authorEmailIsMissed)\n } else {\n author = `${a.name} <${a.email}>`\n }\n }\n\n if (errors.length > 0) {\n throw new Error(errors.join(\"\\n\\n\"))\n }\n\n return {\n name: options.packageName ?? this.packager.appInfo.linuxPackageName,\n maintainer: author!,\n url: projectUrl!,\n vendor: options.vendor || author!,\n }\n }\n\n async build(appOutDir: string, arch: Arch): Promise<any> {\n const target = this.name\n\n // tslint:disable:no-invalid-template-strings\n let nameFormat = \"${name}-${version}-${arch}.${ext}\"\n let isUseArchIfX64 = false\n if (target === \"deb\") {\n nameFormat = \"${name}_${version}_${arch}.${ext}\"\n isUseArchIfX64 = true\n } else if (target === \"rpm\") {\n nameFormat = \"${name}-${version}.${arch}.${ext}\"\n isUseArchIfX64 = true\n }\n\n const packager = this.packager\n const artifactName = packager.expandArtifactNamePattern(this.options, target, arch, nameFormat, !isUseArchIfX64)\n const artifactPath = path.join(this.outDir, artifactName)\n\n await packager.emitArtifactBuildStarted({\n targetPresentableName: target,\n file: artifactPath,\n arch,\n })\n\n await unlinkIfExists(artifactPath)\n if (packager.packagerOptions.prepackaged != null) {\n await mkdir(this.outDir, { recursive: true })\n }\n const linuxDistType = packager.packagerOptions.prepackaged || path.join(this.outDir, `linux${getArchSuffix(arch)}-unpacked`)\n const resourceDir = packager.getResourcesDir(linuxDistType)\n\n const publishConfig = this.supportsAutoUpdate(target)\n ? await getAppUpdatePublishConfiguration(packager, this.options, arch, false /* in any case validation will be done on publish step */)\n : null\n if (publishConfig != null) {\n log.info({ resourceDir: log.filePath(resourceDir) }, `adding autoupdate files for: ${target}`)\n await writeAppUpdateYaml(resourceDir, publishConfig)\n // Extra file needed for auto-updater to detect installation method\n await outputFile(path.join(resourceDir, \"package-type\"), target)\n }\n\n const scripts = await this.scriptFiles\n\n // Install AppArmor support for ubuntu 24+\n // https://github.com/electron-userland/electron-builder/issues/8635\n await copyFile(scripts.appArmor, path.join(resourceDir, \"apparmor-profile\"))\n\n const appInfo = packager.appInfo\n const options = this.options\n const synopsis = options.synopsis\n const args = [\n \"--architecture\",\n toLinuxArchString(arch, target),\n \"--after-install\",\n scripts.afterInstall,\n \"--after-remove\",\n scripts.afterRemove,\n \"--description\",\n smarten(target === \"rpm\" ? this.helper.getDescription(options) : `${synopsis || \"\"}\\n ${this.helper.getDescription(options)}`),\n \"--version\",\n this.helper.getSanitizedVersion(target),\n \"--package\",\n artifactPath,\n ]\n\n const meta = await this.computeFpmMetaInfoOptions()\n args.push(...objectToArgs({ name: meta.name, maintainer: meta.maintainer ?? null, vendor: meta.vendor, url: meta.url }))\n\n const packageCategory = options.packageCategory\n if (packageCategory != null) {\n args.push(\"--category\", packageCategory)\n }\n\n if (target === \"deb\") {\n args.push(\"--deb-priority\", (options as DebOptions).priority ?? \"optional\")\n } else if (target === \"rpm\") {\n if (synopsis != null) {\n args.push(\"--rpm-summary\", smarten(synopsis))\n }\n }\n\n const fpmConfiguration: FpmConfiguration = {\n args,\n target,\n }\n\n if (options.compression != null) {\n fpmConfiguration.compression = options.compression\n }\n\n // noinspection JSDeprecatedSymbols\n const depends = options.depends\n if (depends != null) {\n if (Array.isArray(depends)) {\n fpmConfiguration.customDepends = this.expandDependsDefaults(depends, target)\n } else if (typeof depends === \"string\") {\n fpmConfiguration.customDepends = [depends as string]\n } else {\n throw new Error(`depends must be Array or String, but specified as: ${depends}`)\n }\n } else {\n fpmConfiguration.customDepends = this.getDefaultDepends(target)\n }\n\n if (target === \"deb\") {\n const recommends = (options as DebOptions).recommends\n if (recommends) {\n fpmConfiguration.customRecommends = asArray(recommends)\n } else {\n fpmConfiguration.customRecommends = this.getDefaultRecommends(target)\n }\n }\n\n use(packager.metadata.license, it => args.push(\"--license\", it))\n use(appInfo.buildNumber, it =>\n args.push(\n \"--iteration\",\n // dashes are not supported for iteration in older versions of fpm\n // https://github.com/jordansissel/fpm/issues/1833\n it.split(\"-\").join(\"_\")\n )\n )\n\n use(options.fpm, it => args.push(...it))\n\n args.push(`${appOutDir}/=${installPrefix}/${appInfo.sanitizedProductName}`)\n for (const icon of await this.helper.icons) {\n const extWithDot = path.extname(icon.file)\n const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n args.push(`${icon.file}=/usr/share/icons/hicolor/${sizeName}/apps/${packager.executableName}${extWithDot}`)\n }\n\n const mimeTypeFilePath = await this.helper.mimeTypeFiles\n if (mimeTypeFilePath != null) {\n args.push(`${mimeTypeFilePath}=/usr/share/mime/packages/${packager.executableName}.xml`)\n }\n\n // Launch through a launcher entrypoint so executableArgs are injected in one place and the\n // .desktop Exec key stays a plain command path (consistent with the other Linux targets).\n const launcher = await this.createLauncherScript()\n args.push(`${launcher.tempPath}=${launcher.installPath}`)\n\n const desktopFilePath = await this.helper.writeDesktopEntry(this.options, `${quoteDesktopExecPath(launcher.installPath)} %U`)\n args.push(`${desktopFilePath}=/usr/share/applications/${this.helper.getDesktopFileName()}.desktop`)\n\n if (packager.packagerOptions.effectiveOptionComputed != null && (await packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath]))) {\n return\n }\n\n const env = {\n ...stripSensitiveEnvVars(process.env),\n }\n\n // fpm compresses the deb data.tar by piping GNU tar -J, which exports only\n // XZ_OPT=-<level> — so xz runs single-threaded regardless of the machine,\n // while rpm already defaults to multithreaded \"xzmt\" (measured on one\n // 6.4 GiB tree in one run: deb 1059s vs rpm 171s). xz parses XZ_DEFAULTS\n // before XZ_OPT, so -T0 multithreads the deb pack at the unchanged\n // compression level; an operator-provided XZ_DEFAULTS wins. Fixes #10045.\n if (target === \"deb\" && process.env.XZ_DEFAULTS == null) {\n env.XZ_DEFAULTS = \"-T0\"\n }\n\n // rpmbuild wants directory rpm with some default config files. Even if we can use dylibbundler, path to such config files are not changed (we need to replace in the binary)\n // so, for now, brew install rpm is still required.\n if (target !== \"rpm\" && (await isMacOsSierra())) {\n const linuxToolsPath = await getLinuxToolsPath(packager.config.toolsets?.linuxToolsMac, packager.buildResourcesDir)\n Object.assign(env, {\n PATH: computeEnv(process.env.PATH, [path.join(linuxToolsPath, \"bin\")]),\n DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, [path.join(linuxToolsPath, \"lib\")]),\n })\n }\n\n await this.executeFpm(target, fpmConfiguration, env)\n\n let info: ArtifactCreated = {\n file: artifactPath,\n target: this,\n arch,\n packager,\n }\n if (publishConfig != null) {\n info = {\n ...info,\n safeArtifactName: packager.computeSafeArtifactName(artifactName, target, arch, !isUseArchIfX64),\n isWriteUpdateInfo: true,\n updateInfo: {\n sha512: await hashFile(artifactPath),\n size: (await stat(artifactPath)).size,\n },\n }\n }\n await packager.emitArtifactBuildCompleted(info)\n }\n\n /**\n * Generate the launcher entrypoint script installed alongside the app binary. The launcher execs\n * the real binary with the configured `executableArgs` (single-quoted) and forwards `\"$@\"` so the\n * desktop launcher's field-code expansions (e.g. opened files/URLs) still reach the app.\n */\n private async createLauncherScript(): Promise<{ installPath: string; tempPath: string }> {\n const { appInfo, executableName } = this.packager\n const appDir = `${installPrefix}/${appInfo.sanitizedProductName}`\n // The launcher path is fully resolved (no shell variables to expand), so single-quote the whole\n // token. This passes any embedded character literally and avoids restricting otherwise-valid\n // executable/product names (e.g. those containing `$` or backtick).\n const content = buildLauncherScript({ command: [shellQuote(`${appDir}/${executableName}`)], args: this.options.executableArgs ?? [] })\n\n const tempPath = await this.packager.tempDirManager.getTempFile({ suffix: \"-launcher.sh\" })\n await outputFile(tempPath, content, { mode: 0o755 })\n await chmod(tempPath, 0o755)\n return { installPath: `${appDir}/${executableName}-launcher`, tempPath }\n }\n\n private async executeFpm(target: string, fpmConfiguration: FpmConfiguration, env: any) {\n const fpmArgs = [\"-s\", \"dir\", \"--force\", \"-t\", target]\n const forceDebugLogging = isFpmDebug()\n if (forceDebugLogging) {\n fpmArgs.push(\"--debug\")\n }\n if (log.isDebugEnabled) {\n fpmArgs.push(\"--log\", \"debug\")\n }\n fpmConfiguration.customDepends?.forEach(it => fpmArgs.push(\"-d\", it))\n if (target === \"deb\") {\n fpmConfiguration.customRecommends?.forEach(it => fpmArgs.push(\"--deb-recommends\", it))\n }\n\n const defaultCompression = target === \"rpm\" ? \"xzmt\" : \"xz\"\n fpmArgs.push(...this.configureTargetSpecificOptions(target, fpmConfiguration.compression ?? defaultCompression))\n fpmArgs.push(...fpmConfiguration.args)\n\n const fpmPath = await getFpmPath(this.packager.config.toolsets?.fpm, this.packager.buildResourcesDir)\n\n await exec(fpmPath, fpmArgs, { env }).catch(e => {\n if (e.message.includes(\"Need executable 'rpmbuild' to convert dir to rpm\")) {\n const hint = \"to build rpm, executable rpmbuild is required, please install rpm package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install rpm)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install rpm)\")\n }\n }\n if (e.message.includes(\"xz: not found\")) {\n const hint = \"to build rpm, executable xz is required, please install xz package on your system. \"\n if (process.platform === \"darwin\") {\n log.error(null, hint + \"(brew install xz)\")\n } else {\n log.error(null, hint + \"(sudo apt-get install xz-utils)\")\n }\n }\n if (e.message.includes(\"error: File not found\")) {\n log.error(\n { fpmArgs, ...fpmConfiguration },\n \"fpm failed to find the specified files. Please check your configuration and ensure all paths are correct. To see what files triggered this, set the environment variable FPM_DEBUG=true\"\n )\n if (forceDebugLogging) {\n log.error(null, e.message)\n }\n throw new Error(`FPM failed to find the specified files. Please check your configuration and ensure all paths are correct. Command: ${fpmPath} ${fpmArgs.join(\" \")}`)\n }\n throw e\n })\n }\n\n private supportsAutoUpdate(target: string) {\n return [\"deb\", \"rpm\", \"pacman\"].includes(target)\n }\n\n /**\n * Expand the `\"default\"` keyword in a user-provided `depends` array to the target's default\n * depends list, so extras can be appended without repeating (and having to keep in sync) the\n * defaults — same convention as the snap target's `plugs`/`stagePackages`/`buildPackages`.\n * The result is deduplicated while preserving order.\n */\n private expandDependsDefaults(depends: string[], target: string): string[] {\n const result: string[] = []\n for (const item of depends) {\n if (item === \"default\") {\n result.push(...this.getDefaultDepends(target))\n } else {\n result.push(item)\n }\n }\n return Array.from(new Set(result))\n }\n\n private getDefaultDepends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libgtk-3-0\", \"libnotify4\", \"libnss3\", \"libxss1\", \"libxtst6\", \"xdg-utils\", \"libatspi2.0-0\", \"libuuid1\", \"libsecret-1-0\"]\n\n case \"rpm\":\n return [\n \"gtk3\" /* for electron 2+ (electron 1 uses gtk2, but this old version is not supported anymore) */,\n \"libnotify\",\n \"nss\",\n \"libXScrnSaver\",\n \"(libXtst or libXtst6)\",\n \"xdg-utils\",\n \"at-spi2-core\" /* since 5.0.0 */,\n \"(libuuid or libuuid1)\" /* since 4.0.0 */,\n ]\n\n case \"pacman\":\n return [\"c-ares\", \"ffmpeg\", \"gtk3\", \"libevent\", \"libvpx\", \"libxslt\", \"libxss\", \"minizip\", \"nss\", \"re2\", \"snappy\", \"libnotify\", \"libappindicator-gtk3\"]\n\n default:\n return []\n }\n }\n\n private getDefaultRecommends(target: string): string[] {\n switch (target) {\n case \"deb\":\n return [\"libappindicator3-1\"]\n default:\n return []\n }\n }\n\n private configureTargetSpecificOptions(target: string, compression: string): string[] {\n switch (target) {\n case \"rpm\":\n return [\"--rpm-os\", \"linux\", \"--rpm-compression\", compression === \"xz\" ? \"xzmt\" : compression]\n case \"deb\":\n return [\"--deb-compression\", compression]\n case \"pacman\":\n return [\"--pacman-compression\", compression]\n }\n return []\n }\n}\n\ninterface FpmConfiguration {\n target: string\n args: Array<string>\n customDepends?: Array<string>\n customRecommends?: Array<string>\n compression?: LinuxTargetSpecificOptions[\"compression\"]\n}\n\n/**\n * Legacy EJS interpolation, removed in v27 in favour of shell-style `${var}`.\n *\n * This has to be detected explicitly: the substitution below is a plain `${var}` regex, so an\n * `<%= executable %>` left in a template does not match, is copied verbatim into the maintainer\n * script, and ships inside the .deb/.rpm. The build stays green and every install runs a broken\n * postinst/postrm — so this fails the build rather than warning.\n */\nconst LEGACY_EJS_TAG = /<%[-=]?\\s*([\\w.]+)\\s*%>/\n\nfunction assertNoLegacyEjsTemplate(templatePath: string, template: string): void {\n const match = LEGACY_EJS_TAG.exec(template)\n if (match == null) {\n return\n }\n const [tag, name] = match\n throw new InvalidConfigurationError(\n `${templatePath} uses the EJS template syntax \\`${tag}\\`, which was removed in electron-builder v27.\\n` +\n `Use the shell-style form instead: \\${${name}}\\n` +\n \"Left as-is the tag is copied verbatim into the generated maintainer script and shipped inside the package, \" +\n \"so every install would run a broken postinst/postrm.\\n\" +\n \"https://www.electron.build/docs/migration/v27-breaking-changes#linux-maintainer-script-ejs-template-syntax\"\n )\n}\n\nasync function writeConfigFile(tmpDir: TmpDir, templatePath: string, options: any): Promise<string> {\n //noinspection JSUnusedLocalSymbols\n function replacer(match: string, p1: string) {\n if (p1 in options) {\n return options[p1]\n } else {\n throw new Error(`Macro ${p1} is not defined`)\n }\n }\n const template = await readFile(templatePath, \"utf8\")\n assertNoLegacyEjsTemplate(templatePath, template)\n const config = template.replace(/\\${([a-zA-Z]+)}/g, replacer)\n\n const outputPath = await tmpDir.getTempFile({ suffix: path.basename(templatePath, \".tpl\") })\n await outputFile(outputPath, config)\n return outputPath\n}\n"]}
|
|
@@ -32,6 +32,7 @@ export declare class LinuxTargetHelper {
|
|
|
32
32
|
writeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, destination?: string | null, extra?: Record<string, string>): Promise<string>;
|
|
33
33
|
private desktopNameWarningEmitted;
|
|
34
34
|
private resolveDesktopName;
|
|
35
|
+
private desktopFilenameChangeWarningEmitted;
|
|
35
36
|
getDesktopFileName(fallback?: string): string;
|
|
36
37
|
computeDesktopEntry(targetSpecificOptions: CommonLinuxOptions, exec?: string, extra?: Record<string, string>): Promise<string>;
|
|
37
38
|
}
|