app-builder-lib 26.0.0-alpha.1 → 26.0.0-alpha.3

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.
Files changed (57) hide show
  1. package/out/appInfo.js +1 -1
  2. package/out/appInfo.js.map +1 -1
  3. package/out/asar/asarFileChecker.d.ts +2 -1
  4. package/out/asar/asarFileChecker.js +8 -21
  5. package/out/asar/asarFileChecker.js.map +1 -1
  6. package/out/asar/asarUtil.js +94 -213
  7. package/out/asar/asarUtil.js.map +1 -1
  8. package/out/asar/unpackDetector.js +4 -23
  9. package/out/asar/unpackDetector.js.map +1 -1
  10. package/out/codeSign/windowsSignAzureManager.js +1 -1
  11. package/out/codeSign/windowsSignAzureManager.js.map +1 -1
  12. package/out/configuration.d.ts +60 -0
  13. package/out/configuration.js.map +1 -1
  14. package/out/index.d.ts +2 -2
  15. package/out/index.js.map +1 -1
  16. package/out/linuxPackager.js +1 -1
  17. package/out/linuxPackager.js.map +1 -1
  18. package/out/options/CommonWindowsInstallerConfiguration.js +1 -1
  19. package/out/options/CommonWindowsInstallerConfiguration.js.map +1 -1
  20. package/out/options/PlatformSpecificBuildOptions.d.ts +3 -0
  21. package/out/options/PlatformSpecificBuildOptions.js.map +1 -1
  22. package/out/platformPackager.d.ts +13 -0
  23. package/out/platformPackager.js +69 -3
  24. package/out/platformPackager.js.map +1 -1
  25. package/out/publish/PublishManager.d.ts +1 -1
  26. package/out/publish/PublishManager.js +10 -16
  27. package/out/publish/PublishManager.js.map +1 -1
  28. package/out/util/appFileCopier.js +1 -2
  29. package/out/util/appFileCopier.js.map +1 -1
  30. package/out/version.d.ts +1 -1
  31. package/out/version.js +1 -1
  32. package/out/version.js.map +1 -1
  33. package/out/winPackager.js +1 -1
  34. package/out/winPackager.js.map +1 -1
  35. package/package.json +9 -9
  36. package/scheme.json +64 -5
  37. package/out/publish/BitbucketPublisher.d.ts +0 -16
  38. package/out/publish/BitbucketPublisher.js +0 -60
  39. package/out/publish/BitbucketPublisher.js.map +0 -1
  40. package/out/publish/KeygenPublisher.d.ts +0 -101
  41. package/out/publish/KeygenPublisher.js +0 -165
  42. package/out/publish/KeygenPublisher.js.map +0 -1
  43. package/out/publish/SnapStorePublisher.d.ts +0 -9
  44. package/out/publish/SnapStorePublisher.js +0 -35
  45. package/out/publish/SnapStorePublisher.js.map +0 -1
  46. package/out/publish/s3/BaseS3Publisher.d.ts +0 -10
  47. package/out/publish/s3/BaseS3Publisher.js +0 -64
  48. package/out/publish/s3/BaseS3Publisher.js.map +0 -1
  49. package/out/publish/s3/s3Publisher.d.ts +0 -12
  50. package/out/publish/s3/s3Publisher.js +0 -66
  51. package/out/publish/s3/s3Publisher.js.map +0 -1
  52. package/out/publish/s3/spacesPublisher.d.ts +0 -11
  53. package/out/publish/s3/spacesPublisher.js +0 -44
  54. package/out/publish/s3/spacesPublisher.js.map +0 -1
  55. package/out/util/filename.d.ts +0 -2
  56. package/out/util/filename.js +0 -39
  57. package/out/util/filename.js.map +0 -1
package/out/appInfo.js CHANGED
@@ -6,7 +6,7 @@ exports.filterCFBundleIdentifier = filterCFBundleIdentifier;
6
6
  const builder_util_1 = require("builder-util");
7
7
  const semver_1 = require("semver");
8
8
  const macroExpander_1 = require("./util/macroExpander");
9
- const filename_1 = require("./util/filename");
9
+ const filename_1 = require("builder-util/out/filename");
10
10
  // fpm bug - rpm build --description is not escaped, well... decided to replace quite to smart quote
11
11
  // http://leancrew.com/all-this/2010/11/smart-quotes-in-javascript/
12
12
  function smarten(s) {
@@ -1 +1 @@
1
- {"version":3,"file":"appInfo.js","sourceRoot":"","sources":["../src/appInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyOrSpaces, log } from \"builder-util\"\nimport { prerelease } from \"semver\"\nimport { PlatformSpecificBuildOptions } from \"./options/PlatformSpecificBuildOptions\"\nimport { Packager } from \"./packager\"\nimport { expandMacro } from \"./util/macroExpander\"\nimport { sanitizeFileName } from \"./util/filename\"\n\n// fpm bug - rpm build --description is not escaped, well... decided to replace quite to smart quote\n// http://leancrew.com/all-this/2010/11/smart-quotes-in-javascript/\nexport function smarten(s: string): string {\n // opening singles\n s = s.replace(/(^|[-\\u2014\\s([\"])'/g, \"$1\\u2018\")\n // closing singles & apostrophes\n s = s.replace(/'/g, \"\\u2019\")\n // opening doubles\n s = s.replace(/(^|[-\\u2014/[(\\u2018\\s])\"/g, \"$1\\u201c\")\n // closing doubles\n s = s.replace(/\"/g, \"\\u201d\")\n return s\n}\n\nexport class AppInfo {\n readonly description = smarten(this.info.metadata.description || \"\")\n readonly version: string\n readonly type: string | undefined\n readonly shortVersion: string | undefined\n readonly shortVersionWindows: string | undefined\n\n readonly buildNumber: string | undefined\n readonly buildVersion: string\n\n readonly productName: string\n readonly sanitizedProductName: string\n readonly productFilename: string\n\n constructor(\n private readonly info: Packager,\n buildVersion: string | null | undefined,\n private readonly platformSpecificOptions: PlatformSpecificBuildOptions | null = null,\n normalizeNfd = false\n ) {\n this.version = info.metadata.version!\n this.type = info.metadata.type\n\n if (buildVersion == null) {\n buildVersion = info.config.buildVersion\n }\n\n const buildNumberEnvs =\n process.env.BUILD_NUMBER ||\n process.env.TRAVIS_BUILD_NUMBER ||\n process.env.APPVEYOR_BUILD_NUMBER ||\n process.env.CIRCLE_BUILD_NUM ||\n process.env.BUILD_BUILDNUMBER ||\n process.env.CI_PIPELINE_IID\n this.buildNumber = info.config.buildNumber || buildNumberEnvs\n if (buildVersion == null) {\n buildVersion = this.version\n if (!isEmptyOrSpaces(this.buildNumber)) {\n buildVersion += `.${this.buildNumber}`\n }\n }\n this.buildVersion = buildVersion\n\n if (info.metadata.shortVersion) {\n this.shortVersion = info.metadata.shortVersion\n }\n if (info.metadata.shortVersionWindows) {\n this.shortVersionWindows = info.metadata.shortVersionWindows\n }\n\n this.productName = info.config.productName || info.metadata.productName || info.metadata.name!\n this.sanitizedProductName = sanitizeFileName(this.productName, normalizeNfd)\n\n const executableName = platformSpecificOptions?.executableName ?? info.config.executableName\n this.productFilename = executableName != null ? sanitizeFileName(executableName, normalizeNfd) : this.sanitizedProductName\n }\n\n get channel(): string | null {\n const prereleaseInfo = prerelease(this.version)\n if (prereleaseInfo != null && prereleaseInfo.length > 0) {\n return prereleaseInfo[0] as string | null\n }\n return null\n }\n\n getVersionInWeirdWindowsForm(isSetBuildNumber = true): string {\n const [major, maybe_minor, maybe_patch] = this.version.split(\".\").map(versionPart => parseInt(versionPart))\n // The major component must be present. Here it can be either NaN or undefined, which\n // both returns true from isNaN.\n if (isNaN(major)) {\n throw new Error(`Invalid major number in: ${this.version}`)\n }\n // Allow missing version parts. Minor and patch can be left out and default to zero\n const minor = maybe_minor ?? 0\n const patch = maybe_patch ?? 0\n // ... but reject non-integer version parts. '1.a' is not going to fly\n if (isNaN(minor) || isNaN(patch)) {\n throw new Error(`Invalid minor or patch number in: ${this.version}`)\n }\n // https://github.com/electron-userland/electron-builder/issues/2635#issuecomment-371792272\n let buildNumber = isSetBuildNumber ? this.buildNumber : null\n if (buildNumber == null || !/^\\d+$/.test(buildNumber)) {\n buildNumber = \"0\"\n }\n return `${major}.${minor}.${patch}.${buildNumber}`\n }\n\n private get notNullDevMetadata() {\n return this.info.devMetadata || {}\n }\n\n get companyName(): string | null {\n const author = this.info.metadata.author || this.notNullDevMetadata.author\n return author == null ? null : author.name\n }\n\n get id(): string {\n let appId: string | null | undefined = null\n for (const options of [this.platformSpecificOptions, this.info.config]) {\n if (options != null && appId == null) {\n appId = options.appId\n }\n }\n\n const generateDefaultAppId = () => {\n const info = this.info\n return `${info.framework.defaultAppIdPrefix}${info.metadata.name!.toLowerCase()}`\n }\n\n if (appId != null && (appId === \"your.id\" || isEmptyOrSpaces(appId))) {\n const incorrectAppId = appId\n appId = generateDefaultAppId()\n log.warn(`do not use \"${incorrectAppId}\" as appId, \"${appId}\" will be used instead`)\n }\n\n return appId == null ? generateDefaultAppId() : appId\n }\n\n get macBundleIdentifier(): string {\n return filterCFBundleIdentifier(this.id)\n }\n\n get name(): string {\n return this.info.metadata.name!\n }\n\n get linuxPackageName(): string {\n const name = this.name\n // https://github.com/electron-userland/electron-builder/issues/2963\n return name.startsWith(\"@\") ? this.sanitizedProductName : name\n }\n\n get sanitizedName(): string {\n return sanitizeFileName(this.name)\n }\n\n get updaterCacheDirName(): string {\n return this.sanitizedName.toLowerCase() + \"-updater\"\n }\n\n get copyright(): string {\n const copyright = this.info.config.copyright\n if (copyright != null) {\n return expandMacro(copyright, null, this)\n }\n return `Copyright © ${new Date().getFullYear()} ${this.companyName || this.productName}`\n }\n\n async computePackageUrl(): Promise<string | null> {\n const url = this.info.metadata.homepage || this.notNullDevMetadata.homepage\n if (url != null) {\n return url\n }\n\n const info = await this.info.repositoryInfo\n return info == null || info.type !== \"github\" ? null : `https://${info.domain}/${info.user}/${info.project}`\n }\n}\n\n/** @internal */\nexport function filterCFBundleIdentifier(identifier: string) {\n // Remove special characters and allow only alphanumeric (A-Z,a-z,0-9), hyphen (-), and period (.)\n // Apple documentation: https://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070\n return identifier.replace(/ /g, \"-\").replace(/[^a-zA-Z0-9.-]/g, \"\")\n}\n"]}
1
+ {"version":3,"file":"appInfo.js","sourceRoot":"","sources":["../src/appInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyOrSpaces, log } from \"builder-util\"\nimport { prerelease } from \"semver\"\nimport { PlatformSpecificBuildOptions } from \"./options/PlatformSpecificBuildOptions\"\nimport { Packager } from \"./packager\"\nimport { expandMacro } from \"./util/macroExpander\"\nimport { sanitizeFileName } from \"builder-util/out/filename\"\n\n// fpm bug - rpm build --description is not escaped, well... decided to replace quite to smart quote\n// http://leancrew.com/all-this/2010/11/smart-quotes-in-javascript/\nexport function smarten(s: string): string {\n // opening singles\n s = s.replace(/(^|[-\\u2014\\s([\"])'/g, \"$1\\u2018\")\n // closing singles & apostrophes\n s = s.replace(/'/g, \"\\u2019\")\n // opening doubles\n s = s.replace(/(^|[-\\u2014/[(\\u2018\\s])\"/g, \"$1\\u201c\")\n // closing doubles\n s = s.replace(/\"/g, \"\\u201d\")\n return s\n}\n\nexport class AppInfo {\n readonly description = smarten(this.info.metadata.description || \"\")\n readonly version: string\n readonly type: string | undefined\n readonly shortVersion: string | undefined\n readonly shortVersionWindows: string | undefined\n\n readonly buildNumber: string | undefined\n readonly buildVersion: string\n\n readonly productName: string\n readonly sanitizedProductName: string\n readonly productFilename: string\n\n constructor(\n private readonly info: Packager,\n buildVersion: string | null | undefined,\n private readonly platformSpecificOptions: PlatformSpecificBuildOptions | null = null,\n normalizeNfd = false\n ) {\n this.version = info.metadata.version!\n this.type = info.metadata.type\n\n if (buildVersion == null) {\n buildVersion = info.config.buildVersion\n }\n\n const buildNumberEnvs =\n process.env.BUILD_NUMBER ||\n process.env.TRAVIS_BUILD_NUMBER ||\n process.env.APPVEYOR_BUILD_NUMBER ||\n process.env.CIRCLE_BUILD_NUM ||\n process.env.BUILD_BUILDNUMBER ||\n process.env.CI_PIPELINE_IID\n this.buildNumber = info.config.buildNumber || buildNumberEnvs\n if (buildVersion == null) {\n buildVersion = this.version\n if (!isEmptyOrSpaces(this.buildNumber)) {\n buildVersion += `.${this.buildNumber}`\n }\n }\n this.buildVersion = buildVersion\n\n if (info.metadata.shortVersion) {\n this.shortVersion = info.metadata.shortVersion\n }\n if (info.metadata.shortVersionWindows) {\n this.shortVersionWindows = info.metadata.shortVersionWindows\n }\n\n this.productName = info.config.productName || info.metadata.productName || info.metadata.name!\n this.sanitizedProductName = sanitizeFileName(this.productName, normalizeNfd)\n\n const executableName = platformSpecificOptions?.executableName ?? info.config.executableName\n this.productFilename = executableName != null ? sanitizeFileName(executableName, normalizeNfd) : this.sanitizedProductName\n }\n\n get channel(): string | null {\n const prereleaseInfo = prerelease(this.version)\n if (prereleaseInfo != null && prereleaseInfo.length > 0) {\n return prereleaseInfo[0] as string | null\n }\n return null\n }\n\n getVersionInWeirdWindowsForm(isSetBuildNumber = true): string {\n const [major, maybe_minor, maybe_patch] = this.version.split(\".\").map(versionPart => parseInt(versionPart))\n // The major component must be present. Here it can be either NaN or undefined, which\n // both returns true from isNaN.\n if (isNaN(major)) {\n throw new Error(`Invalid major number in: ${this.version}`)\n }\n // Allow missing version parts. Minor and patch can be left out and default to zero\n const minor = maybe_minor ?? 0\n const patch = maybe_patch ?? 0\n // ... but reject non-integer version parts. '1.a' is not going to fly\n if (isNaN(minor) || isNaN(patch)) {\n throw new Error(`Invalid minor or patch number in: ${this.version}`)\n }\n // https://github.com/electron-userland/electron-builder/issues/2635#issuecomment-371792272\n let buildNumber = isSetBuildNumber ? this.buildNumber : null\n if (buildNumber == null || !/^\\d+$/.test(buildNumber)) {\n buildNumber = \"0\"\n }\n return `${major}.${minor}.${patch}.${buildNumber}`\n }\n\n private get notNullDevMetadata() {\n return this.info.devMetadata || {}\n }\n\n get companyName(): string | null {\n const author = this.info.metadata.author || this.notNullDevMetadata.author\n return author == null ? null : author.name\n }\n\n get id(): string {\n let appId: string | null | undefined = null\n for (const options of [this.platformSpecificOptions, this.info.config]) {\n if (options != null && appId == null) {\n appId = options.appId\n }\n }\n\n const generateDefaultAppId = () => {\n const info = this.info\n return `${info.framework.defaultAppIdPrefix}${info.metadata.name!.toLowerCase()}`\n }\n\n if (appId != null && (appId === \"your.id\" || isEmptyOrSpaces(appId))) {\n const incorrectAppId = appId\n appId = generateDefaultAppId()\n log.warn(`do not use \"${incorrectAppId}\" as appId, \"${appId}\" will be used instead`)\n }\n\n return appId == null ? generateDefaultAppId() : appId\n }\n\n get macBundleIdentifier(): string {\n return filterCFBundleIdentifier(this.id)\n }\n\n get name(): string {\n return this.info.metadata.name!\n }\n\n get linuxPackageName(): string {\n const name = this.name\n // https://github.com/electron-userland/electron-builder/issues/2963\n return name.startsWith(\"@\") ? this.sanitizedProductName : name\n }\n\n get sanitizedName(): string {\n return sanitizeFileName(this.name)\n }\n\n get updaterCacheDirName(): string {\n return this.sanitizedName.toLowerCase() + \"-updater\"\n }\n\n get copyright(): string {\n const copyright = this.info.config.copyright\n if (copyright != null) {\n return expandMacro(copyright, null, this)\n }\n return `Copyright © ${new Date().getFullYear()} ${this.companyName || this.productName}`\n }\n\n async computePackageUrl(): Promise<string | null> {\n const url = this.info.metadata.homepage || this.notNullDevMetadata.homepage\n if (url != null) {\n return url\n }\n\n const info = await this.info.repositoryInfo\n return info == null || info.type !== \"github\" ? null : `https://${info.domain}/${info.user}/${info.project}`\n }\n}\n\n/** @internal */\nexport function filterCFBundleIdentifier(identifier: string) {\n // Remove special characters and allow only alphanumeric (A-Z,a-z,0-9), hyphen (-), and period (.)\n // Apple documentation: https://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070\n return identifier.replace(/ /g, \"-\").replace(/[^a-zA-Z0-9.-]/g, \"\")\n}\n"]}
@@ -1 +1,2 @@
1
- export {};
1
+ import { FilesystemEntry } from "@electron/asar/lib/filesystem";
2
+ export declare function checkFileInArchive(asarFile: string, relativeFile: string, messagePrefix: string): FilesystemEntry;
@@ -1,37 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.checkFileInArchive = checkFileInArchive;
4
- const builder_util_1 = require("builder-util");
5
- const asar_1 = require("./asar");
6
- /** @internal */
7
- async function checkFileInArchive(asarFile, relativeFile, messagePrefix) {
4
+ const asar = require("@electron/asar");
5
+ function checkFileInArchive(asarFile, relativeFile, messagePrefix) {
8
6
  function error(text) {
9
7
  return new Error(`${messagePrefix} "${relativeFile}" in the "${asarFile}" ${text}`);
10
8
  }
11
- let fs;
12
- try {
13
- fs = await (0, asar_1.readAsar)(asarFile);
14
- }
15
- catch (e) {
16
- throw error(`is corrupted: ${e}`);
17
- }
18
9
  let stat;
19
10
  try {
20
- stat = fs.getFile(relativeFile);
11
+ stat = asar.statFile(asarFile, relativeFile, false);
21
12
  }
22
- catch (_e) {
23
- const fileStat = await (0, builder_util_1.statOrNull)(asarFile);
24
- if (fileStat == null) {
25
- throw error(`does not exist. Seems like a wrong configuration.`);
13
+ catch (e) {
14
+ if (e.message.includes("Cannot read properties of undefined (reading 'link')")) {
15
+ throw error("does not exist. Seems like a wrong configuration.");
26
16
  }
27
- // asar throws error on access to undefined object (info.link)
28
- stat = null;
29
- }
30
- if (stat == null) {
31
- throw error(`does not exist. Seems like a wrong configuration.`);
17
+ throw error(`is corrupted: ${e}`);
32
18
  }
33
19
  if (stat.size === 0) {
34
20
  throw error(`is corrupted: size 0`);
35
21
  }
22
+ return stat;
36
23
  }
37
24
  //# sourceMappingURL=asarFileChecker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"asarFileChecker.js","sourceRoot":"","sources":["../../src/asar/asarFileChecker.ts"],"names":[],"mappings":";;AAIA,gDA+BC;AAnCD,+CAAyC;AACzC,iCAAuC;AAEvC,gBAAgB;AACT,KAAK,UAAU,kBAAkB,CAAC,QAAgB,EAAE,YAAoB,EAAE,aAAqB;IACpG,SAAS,KAAK,CAAC,IAAY;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,aAAa,KAAK,YAAY,aAAa,QAAQ,KAAK,IAAI,EAAE,CAAC,CAAA;IACrF,CAAC;IAED,IAAI,EAAE,CAAA;IACN,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,IAAA,eAAQ,EAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;IAED,IAAI,IAAiB,CAAA;IACrB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACjC,CAAC;IAAC,OAAO,EAAO,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,MAAM,IAAA,yBAAU,EAAC,QAAQ,CAAC,CAAA;QAC3C,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC,mDAAmD,CAAC,CAAA;QAClE,CAAC;QAED,8DAA8D;QAC9D,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;IAED,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,MAAM,KAAK,CAAC,mDAAmD,CAAC,CAAA;IAClE,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACrC,CAAC;AACH,CAAC","sourcesContent":["import { statOrNull } from \"builder-util\"\nimport { Node, readAsar } from \"./asar\"\n\n/** @internal */\nexport async function checkFileInArchive(asarFile: string, relativeFile: string, messagePrefix: string) {\n function error(text: string) {\n return new Error(`${messagePrefix} \"${relativeFile}\" in the \"${asarFile}\" ${text}`)\n }\n\n let fs\n try {\n fs = await readAsar(asarFile)\n } catch (e: any) {\n throw error(`is corrupted: ${e}`)\n }\n\n let stat: Node | null\n try {\n stat = fs.getFile(relativeFile)\n } catch (_e: any) {\n const fileStat = await statOrNull(asarFile)\n if (fileStat == null) {\n throw error(`does not exist. Seems like a wrong configuration.`)\n }\n\n // asar throws error on access to undefined object (info.link)\n stat = null\n }\n\n if (stat == null) {\n throw error(`does not exist. Seems like a wrong configuration.`)\n }\n if (stat.size === 0) {\n throw error(`is corrupted: size 0`)\n }\n}\n"]}
1
+ {"version":3,"file":"asarFileChecker.js","sourceRoot":"","sources":["../../src/asar/asarFileChecker.ts"],"names":[],"mappings":";;AAGA,gDAiBC;AApBD,uCAAsC;AAGtC,SAAgB,kBAAkB,CAAC,QAAgB,EAAE,YAAoB,EAAE,aAAqB;IAC9F,SAAS,KAAK,CAAC,IAAY;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,aAAa,KAAK,YAAY,aAAa,QAAQ,KAAK,IAAI,EAAE,CAAC,CAAA;IACrF,CAAC;IACD,IAAI,IAAqB,CAAA;IACzB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAA;IACrD,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,sDAAsD,CAAC,EAAE,CAAC;YAC/E,MAAM,KAAK,CAAC,mDAAmD,CAAC,CAAA;QAClE,CAAC;QACD,MAAM,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;IACD,IAAK,IAA4B,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import * as asar from \"@electron/asar\"\nimport { FilesystemEntry, FilesystemFileEntry } from \"@electron/asar/lib/filesystem\"\n\nexport function checkFileInArchive(asarFile: string, relativeFile: string, messagePrefix: string) {\n function error(text: string) {\n return new Error(`${messagePrefix} \"${relativeFile}\" in the \"${asarFile}\" ${text}`)\n }\n let stat: FilesystemEntry\n try {\n stat = asar.statFile(asarFile, relativeFile, false)\n } catch (e: any) {\n if (e.message.includes(\"Cannot read properties of undefined (reading 'link')\")) {\n throw error(\"does not exist. Seems like a wrong configuration.\")\n }\n throw error(`is corrupted: ${e}`)\n }\n if ((stat as FilesystemFileEntry).size === 0) {\n throw error(`is corrupted: size 0`)\n }\n return stat\n}\n"]}
@@ -1,255 +1,136 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AsarPackager = void 0;
4
+ const asar_1 = require("@electron/asar");
4
5
  const builder_util_1 = require("builder-util");
5
- const builder_util_2 = require("builder-util");
6
- const fs_1 = require("fs");
7
- const promises_1 = require("fs/promises");
6
+ const builder_util_runtime_1 = require("builder-util-runtime");
7
+ const fs_1 = require("builder-util/out/fs");
8
+ const fsNode = require("fs");
9
+ const fs = require("fs-extra");
8
10
  const path = require("path");
11
+ const tempFile = require("temp-file");
9
12
  const appFileCopier_1 = require("../util/appFileCopier");
10
- const asar_1 = require("./asar");
11
- const integrity_1 = require("./integrity");
12
13
  const unpackDetector_1 = require("./unpackDetector");
13
- const pickle = require("chromium-pickle-js");
14
14
  /** @internal */
15
15
  class AsarPackager {
16
- constructor(src, destination, options, unpackPattern) {
17
- this.src = src;
18
- this.destination = destination;
19
- this.options = options;
20
- this.unpackPattern = unpackPattern;
21
- this.fs = new asar_1.AsarFilesystem(this.src);
22
- this.outFile = path.join(destination, "app.asar");
23
- this.unpackedDest = `${this.outFile}.unpacked`;
16
+ constructor(config) {
17
+ this.config = config;
18
+ this.tmpDir = new tempFile.TmpDir();
19
+ this.outFile = path.join(config.resourcePath, `app.asar`);
24
20
  }
25
- // sort files to minimize file change (i.e. asar file is not changed dramatically on small change)
26
- async pack(fileSets, packager) {
27
- if (this.options.ordering != null) {
28
- // ordering doesn't support transformed files, but ordering is not used functionality - wait user report to fix it
29
- await order(fileSets[0].files, this.options.ordering, fileSets[0].src);
30
- }
31
- await (0, promises_1.mkdir)(path.dirname(this.outFile), { recursive: true });
32
- const unpackedFileIndexMap = new Map();
21
+ async pack(fileSets, _packager) {
22
+ this.rootForAppFilesWithoutAsar = await this.tmpDir.getTempDir({ prefix: "asar-app" });
23
+ const cancellationToken = new builder_util_runtime_1.CancellationToken();
24
+ cancellationToken.on("cancel", () => this.tmpDir.cleanupSync());
33
25
  const orderedFileSets = [
34
26
  // Write dependencies first to minimize offset changes to asar header
35
27
  ...fileSets.slice(1),
36
28
  // Finish with the app files that change most often
37
29
  fileSets[0],
38
30
  ].map(orderFileSet);
39
- for (const fileSet of orderedFileSets) {
40
- unpackedFileIndexMap.set(fileSet, await this.createPackageFromFiles(fileSet, packager.info));
31
+ const { unpackedPaths, copiedFiles } = await this.detectAndCopy(orderedFileSets, cancellationToken);
32
+ const unpackGlob = unpackedPaths.length > 1 ? `{${unpackedPaths.join(",")}}` : unpackedPaths.pop();
33
+ let ordering = this.config.options.ordering || undefined;
34
+ if (!ordering) {
35
+ // `copiedFiles` are already ordered due to `orderedFileSets` input, so we just map to their relative paths (via substring) within the asar.
36
+ const filesSorted = copiedFiles.map(file => file.substring(this.rootForAppFilesWithoutAsar.length));
37
+ ordering = await this.tmpDir.getTempFile({ prefix: "asar-ordering", suffix: ".txt" });
38
+ await fs.writeFile(ordering, filesSorted.join("\n"));
41
39
  }
42
- await this.writeAsarFile(orderedFileSets, unpackedFileIndexMap);
40
+ const options = {
41
+ unpack: unpackGlob,
42
+ unpackDir: unpackGlob,
43
+ ordering,
44
+ dot: true,
45
+ };
46
+ // override logger temporarily to clean up console (electron/asar does some internal logging that blogs up the default electron-builder logs)
47
+ const consoleLogger = console.log;
48
+ console.log = (...args) => {
49
+ if (args[0] === "Ordering file has 100% coverage.") {
50
+ return; // no need to log, this means our ordering logic is working correctly
51
+ }
52
+ builder_util_1.log.info({ args }, "logging @electron/asar");
53
+ };
54
+ await (0, asar_1.createPackageWithOptions)(this.rootForAppFilesWithoutAsar, this.outFile, options);
55
+ console.log = consoleLogger;
56
+ await this.tmpDir.cleanup();
43
57
  }
44
- async createPackageFromFiles(fileSet, packager) {
45
- const metadata = fileSet.metadata;
46
- // search auto unpacked dir
47
- const unpackedDirs = new Set();
48
- const rootForAppFilesWithoutAsar = path.join(this.destination, "app");
49
- if (this.options.smartUnpack !== false) {
50
- await (0, unpackDetector_1.detectUnpackedDirs)(fileSet, unpackedDirs, this.unpackedDest, rootForAppFilesWithoutAsar);
51
- }
52
- const dirToCreateForUnpackedFiles = new Set(unpackedDirs);
53
- const correctDirNodeUnpackedFlag = async (filePathInArchive, dirNode) => {
54
- for (const dir of unpackedDirs) {
55
- if (filePathInArchive.length > dir.length + 2 && filePathInArchive[dir.length] === path.sep && filePathInArchive.startsWith(dir)) {
56
- dirNode.unpacked = true;
57
- unpackedDirs.add(filePathInArchive);
58
- // not all dirs marked as unpacked after first iteration - because node module dir can be marked as unpacked after processing node module dir content
59
- // e.g. node-notifier/example/advanced.js processed, but only on process vendor/terminal-notifier.app module will be marked as unpacked
60
- await (0, promises_1.mkdir)(path.join(this.unpackedDest, filePathInArchive), { recursive: true });
61
- break;
62
- }
58
+ async detectAndCopy(fileSets, cancellationToken) {
59
+ var _a;
60
+ const taskManager = new builder_util_1.AsyncTaskManager(cancellationToken);
61
+ const unpackedPaths = new Set();
62
+ const copiedFiles = new Set();
63
+ const matchUnpacker = (file, dest, stat) => {
64
+ var _a, _b;
65
+ if ((_b = (_a = this.config).unpackPattern) === null || _b === void 0 ? void 0 : _b.call(_a, file, stat)) {
66
+ builder_util_1.log.debug({ file }, "unpacking");
67
+ unpackedPaths.add(dest);
68
+ return;
63
69
  }
64
70
  };
65
- const transformedFiles = fileSet.transformedFiles;
66
- const taskManager = new builder_util_1.AsyncTaskManager(packager.cancellationToken);
67
- const fileCopier = new builder_util_2.FileCopier();
68
- let currentDirNode = null;
69
- let currentDirPath = null;
70
- const unpackedFileIndexSet = new Set();
71
- for (let i = 0, n = fileSet.files.length; i < n; i++) {
72
- const file = fileSet.files[i];
73
- const stat = metadata.get(file);
74
- if (stat == null) {
75
- continue;
71
+ const writeFileOrSymlink = async (transformedData, source, destination, stat) => {
72
+ copiedFiles.add(destination);
73
+ // If transformed data, skip symlink logic
74
+ if (transformedData) {
75
+ return this.copyFileOrData(transformedData, source, destination, stat);
76
76
  }
77
- const pathInArchive = path.relative(rootForAppFilesWithoutAsar, (0, appFileCopier_1.getDestinationPath)(file, fileSet));
78
- if (stat.isSymbolicLink()) {
79
- const s = stat;
80
- this.fs.getOrCreateNode(pathInArchive).link = s.relativeLink;
81
- s.pathInArchive = pathInArchive;
82
- unpackedFileIndexSet.add(i);
83
- continue;
77
+ const realPathFile = await fs.realpath(source);
78
+ if (source === realPathFile) {
79
+ return this.copyFileOrData(undefined, source, destination, stat);
84
80
  }
85
- let fileParent = path.dirname(pathInArchive);
86
- if (fileParent === ".") {
87
- fileParent = "";
81
+ const realPathRelative = path.relative(this.config.appDir, realPathFile);
82
+ const symlinkTarget = path.resolve(this.rootForAppFilesWithoutAsar, realPathRelative);
83
+ const isOutsidePackage = realPathRelative.startsWith("..");
84
+ if (isOutsidePackage) {
85
+ builder_util_1.log.error({ source: builder_util_1.log.filePath(source), realPathFile: builder_util_1.log.filePath(realPathFile) }, `unable to copy, file is symlinked outside the package`);
86
+ throw new Error(`Cannot copy file (${path.basename(source)}) symlinked to file (${path.basename(realPathFile)}) outside the package as that violates asar security integrity`);
88
87
  }
89
- if (currentDirPath !== fileParent) {
90
- if (fileParent.startsWith("..")) {
91
- throw new Error(`Internal error: path must not start with "..": ${fileParent}`);
92
- }
93
- currentDirPath = fileParent;
94
- currentDirNode = this.fs.getOrCreateNode(fileParent);
95
- // do not check for root
96
- if (fileParent !== "" && !currentDirNode.unpacked) {
97
- if (unpackedDirs.has(fileParent)) {
98
- currentDirNode.unpacked = true;
99
- }
100
- else {
101
- await correctDirNodeUnpackedFlag(fileParent, currentDirNode);
102
- }
103
- }
88
+ await this.copyFileOrData(undefined, source, symlinkTarget, stat);
89
+ const target = path.relative(path.dirname(destination), symlinkTarget);
90
+ fsNode.symlinkSync(target, destination);
91
+ copiedFiles.add(symlinkTarget);
92
+ };
93
+ for await (const fileSet of fileSets) {
94
+ if (this.config.options.smartUnpack !== false) {
95
+ (0, unpackDetector_1.detectUnpackedDirs)(fileSet, unpackedPaths, this.config.defaultDestination);
104
96
  }
105
- const dirNode = currentDirNode;
106
- const newData = transformedFiles == null ? undefined : transformedFiles.get(i);
107
- const isUnpacked = dirNode.unpacked || (this.unpackPattern != null && this.unpackPattern(file, stat));
108
- const integrity = newData === undefined ? await (0, integrity_1.hashFile)(file) : (0, integrity_1.hashFileContents)(newData);
109
- this.fs.addFileNode(file, dirNode, newData == undefined ? stat.size : Buffer.byteLength(newData), isUnpacked, stat, integrity);
110
- if (isUnpacked) {
111
- if (!dirNode.unpacked && !dirToCreateForUnpackedFiles.has(fileParent)) {
112
- dirToCreateForUnpackedFiles.add(fileParent);
113
- await (0, promises_1.mkdir)(path.join(this.unpackedDest, fileParent), { recursive: true });
114
- }
115
- const unpackedFile = path.join(this.unpackedDest, pathInArchive);
116
- taskManager.addTask(copyFileOrData(fileCopier, newData, file, unpackedFile, stat));
117
- if (taskManager.tasks.length > builder_util_2.MAX_FILE_REQUESTS) {
97
+ for (let i = 0; i < fileSet.files.length; i++) {
98
+ const file = fileSet.files[i];
99
+ const transformedData = (_a = fileSet.transformedFiles) === null || _a === void 0 ? void 0 : _a.get(i);
100
+ const metadata = fileSet.metadata.get(file) || (await fs.lstat(file));
101
+ const relative = path.relative(this.config.defaultDestination, (0, appFileCopier_1.getDestinationPath)(file, fileSet));
102
+ const dest = path.resolve(this.rootForAppFilesWithoutAsar, relative);
103
+ matchUnpacker(file, dest, metadata);
104
+ taskManager.addTask(writeFileOrSymlink(transformedData, file, dest, metadata));
105
+ if (taskManager.tasks.length > fs_1.MAX_FILE_REQUESTS) {
118
106
  await taskManager.awaitTasks();
119
107
  }
120
- unpackedFileIndexSet.add(i);
121
108
  }
122
109
  }
123
- if (taskManager.tasks.length > 0) {
124
- await taskManager.awaitTasks();
125
- }
126
- return unpackedFileIndexSet;
127
- }
128
- writeAsarFile(fileSets, unpackedFileIndexMap) {
129
- return new Promise((resolve, reject) => {
130
- const headerPickle = pickle.createEmpty();
131
- headerPickle.writeString(JSON.stringify(this.fs.header));
132
- const headerBuf = headerPickle.toBuffer();
133
- const sizePickle = pickle.createEmpty();
134
- sizePickle.writeUInt32(headerBuf.length);
135
- const sizeBuf = sizePickle.toBuffer();
136
- const writeStream = (0, fs_1.createWriteStream)(this.outFile);
137
- writeStream.on("error", reject);
138
- writeStream.on("close", resolve);
139
- writeStream.write(sizeBuf);
140
- let fileSetIndex = 0;
141
- let files = fileSets[0].files;
142
- let metadata = fileSets[0].metadata;
143
- let transformedFiles = fileSets[0].transformedFiles;
144
- let unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[0]);
145
- const w = (index) => {
146
- while (true) {
147
- if (index >= files.length) {
148
- if (++fileSetIndex >= fileSets.length) {
149
- writeStream.end();
150
- return;
151
- }
152
- else {
153
- files = fileSets[fileSetIndex].files;
154
- metadata = fileSets[fileSetIndex].metadata;
155
- transformedFiles = fileSets[fileSetIndex].transformedFiles;
156
- unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[fileSetIndex]);
157
- index = 0;
158
- }
159
- }
160
- if (!unpackedFileIndexSet.has(index)) {
161
- break;
162
- }
163
- else {
164
- const stat = metadata.get(files[index]);
165
- if (stat != null && stat.isSymbolicLink()) {
166
- (0, fs_1.symlink)(stat.linkRelativeToFile, path.join(this.unpackedDest, stat.pathInArchive), () => w(index + 1));
167
- return;
168
- }
169
- }
170
- index++;
171
- }
172
- const data = transformedFiles == null ? null : transformedFiles.get(index);
173
- const file = files[index];
174
- if (data !== null && data !== undefined) {
175
- writeStream.write(data, () => w(index + 1));
176
- return;
177
- }
178
- // https://github.com/yarnpkg/yarn/pull/3539
179
- const stat = metadata.get(file);
180
- if (stat != null && stat.size < 2 * 1024 * 1024) {
181
- (0, promises_1.readFile)(file)
182
- .then(it => {
183
- writeStream.write(it, () => w(index + 1));
184
- })
185
- .catch((e) => reject(`Cannot read file ${file}: ${e.stack || e}`));
186
- }
187
- else {
188
- const readStream = (0, fs_1.createReadStream)(file);
189
- readStream.on("error", reject);
190
- readStream.once("end", () => w(index + 1));
191
- readStream.on("open", () => {
192
- readStream.pipe(writeStream, {
193
- end: false,
194
- });
195
- });
196
- }
197
- };
198
- writeStream.write(headerBuf, () => w(0));
199
- });
200
- }
201
- }
202
- exports.AsarPackager = AsarPackager;
203
- async function order(filenames, orderingFile, src) {
204
- const orderingFiles = (await (0, promises_1.readFile)(orderingFile, "utf8")).split("\n").map(line => {
205
- if (line.indexOf(":") !== -1) {
206
- line = line.split(":").pop();
207
- }
208
- line = line.trim();
209
- if (line[0] === "/") {
210
- line = line.slice(1);
211
- }
212
- return line;
213
- });
214
- const ordering = [];
215
- for (const file of orderingFiles) {
216
- const pathComponents = file.split(path.sep);
217
- for (const pathComponent of pathComponents) {
218
- ordering.push(path.join(src, pathComponent));
219
- }
110
+ await taskManager.awaitTasks();
111
+ return {
112
+ unpackedPaths: Array.from(unpackedPaths),
113
+ copiedFiles: Array.from(copiedFiles),
114
+ };
220
115
  }
221
- const sortedFiles = [];
222
- let missing = 0;
223
- const total = filenames.length;
224
- for (const file of ordering) {
225
- if (!sortedFiles.includes(file) && filenames.includes(file)) {
226
- sortedFiles.push(file);
116
+ async copyFileOrData(data, source, destination, stat) {
117
+ await fs.mkdir(path.dirname(destination), { recursive: true });
118
+ if (data) {
119
+ await fs.writeFile(destination, data, { mode: stat.mode });
227
120
  }
228
- }
229
- for (const file of filenames) {
230
- if (!sortedFiles.includes(file)) {
231
- sortedFiles.push(file);
232
- missing += 1;
121
+ else {
122
+ await fs.copyFile(source, destination);
233
123
  }
234
124
  }
235
- builder_util_1.log.info({ coverage: ((total - missing) / total) * 100 }, "ordering files in ASAR archive");
236
- return sortedFiles;
237
- }
238
- function copyFileOrData(fileCopier, data, source, destination, stats) {
239
- if (data == null) {
240
- return fileCopier.copy(source, destination, stats);
241
- }
242
- else {
243
- return (0, promises_1.writeFile)(destination, data);
244
- }
245
125
  }
126
+ exports.AsarPackager = AsarPackager;
246
127
  function orderFileSet(fileSet) {
247
128
  const sortedFileEntries = Array.from(fileSet.files.entries());
248
129
  sortedFileEntries.sort(([, a], [, b]) => {
249
130
  if (a === b) {
250
131
  return 0;
251
132
  }
252
- // Place addons last because their signature change
133
+ // Place addons last because their signature changes per build
253
134
  const isAAddon = a.endsWith(".node");
254
135
  const isBAddon = b.endsWith(".node");
255
136
  if (isAAddon && !isBAddon) {
@@ -1 +1 @@
1
- {"version":3,"file":"asarUtil.js","sourceRoot":"","sources":["../../src/asar/asarUtil.ts"],"names":[],"mappings":";;;AAAA,+CAAoD;AACpD,+CAAoE;AACpE,2BAAwE;AACxE,0CAAwD;AACxD,6BAA4B;AAI5B,yDAA2E;AAC3E,iCAA6C;AAC7C,2CAAwD;AACxD,qDAAqD;AAErD,MAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAE5C,gBAAgB;AAChB,MAAa,YAAY;IAKvB,YACmB,GAAW,EACX,WAAmB,EACnB,OAAoB,EACpB,aAA4B;QAH5B,QAAG,GAAH,GAAG,CAAQ;QACX,gBAAW,GAAX,WAAW,CAAQ;QACnB,YAAO,GAAP,OAAO,CAAa;QACpB,kBAAa,GAAb,aAAa,CAAe;QAR9B,OAAE,GAAG,IAAI,qBAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAUhD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;QACjD,IAAI,CAAC,YAAY,GAAG,GAAG,IAAI,CAAC,OAAO,WAAW,CAAA;IAChD,CAAC;IAED,kGAAkG;IAClG,KAAK,CAAC,IAAI,CAAC,QAAgC,EAAE,QAA+B;QAC1E,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YAClC,kHAAkH;YAClH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACxE,CAAC;QACD,MAAM,IAAA,gBAAK,EAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5D,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAgC,CAAA;QACpE,MAAM,eAAe,GAAG;YACtB,qEAAqE;YACrE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAEpB,mDAAmD;YACnD,QAAQ,CAAC,CAAC,CAAC;SACZ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAEnB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9F,CAAC;QACD,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAA;IACjE,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,OAAwB,EAAE,QAAkB;QAC/E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QACjC,2BAA2B;QAC3B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;QACtC,MAAM,0BAA0B,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QAErE,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YACvC,MAAM,IAAA,mCAAkB,EAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAA;QAChG,CAAC;QAED,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAAS,YAAY,CAAC,CAAA;QAEjE,MAAM,0BAA0B,GAAG,KAAK,EAAE,iBAAyB,EAAE,OAAa,EAAE,EAAE;YACpF,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAC/B,IAAI,iBAAiB,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAA;oBACvB,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;oBACnC,qJAAqJ;oBACrJ,uIAAuI;oBACvI,MAAM,IAAA,gBAAK,EAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;oBACjF,MAAK;gBACP,CAAC;YACH,CAAC;QACH,CAAC,CAAA;QAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAA;QACjD,MAAM,WAAW,GAAG,IAAI,+BAAgB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;QACpE,MAAM,UAAU,GAAG,IAAI,yBAAU,EAAE,CAAA;QAEnC,IAAI,cAAc,GAAgB,IAAI,CAAA;QACtC,IAAI,cAAc,GAAkB,IAAI,CAAA;QAExC,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAA;QAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC/B,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,SAAQ;YACV,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,0BAA0B,EAAE,IAAA,kCAAkB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;YAElG,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC1B,MAAM,CAAC,GAAG,IAAW,CAAA;gBACrB,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,YAAY,CAAA;gBAC5D,CAAC,CAAC,aAAa,GAAG,aAAa,CAAA;gBAC/B,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBAC3B,SAAQ;YACV,CAAC;YAED,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;YAC5C,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;gBACvB,UAAU,GAAG,EAAE,CAAA;YACjB,CAAC;YAED,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;gBAClC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChC,MAAM,IAAI,KAAK,CAAC,kDAAkD,UAAU,EAAE,CAAC,CAAA;gBACjF,CAAC;gBAED,cAAc,GAAG,UAAU,CAAA;gBAC3B,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;gBACpD,wBAAwB;gBACxB,IAAI,UAAU,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;oBAClD,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBACjC,cAAc,CAAC,QAAQ,GAAG,IAAI,CAAA;oBAChC,CAAC;yBAAM,CAAC;wBACN,MAAM,0BAA0B,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;oBAC9D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,cAAe,CAAA;YAC/B,MAAM,OAAO,GAAG,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;YACrG,MAAM,SAAS,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,IAAA,oBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAA,4BAAgB,EAAC,OAAO,CAAC,CAAA;YAC1F,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;YAC9H,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBACtE,2BAA2B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;oBAC3C,MAAM,IAAA,gBAAK,EAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC5E,CAAC;gBAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;gBAChE,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAA;gBAClF,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,gCAAiB,EAAE,CAAC;oBACjD,MAAM,WAAW,CAAC,UAAU,EAAE,CAAA;gBAChC,CAAC;gBAED,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,WAAW,CAAC,UAAU,EAAE,CAAA;QAChC,CAAC;QAED,OAAO,oBAAoB,CAAA;IAC7B,CAAC;IAEO,aAAa,CAAC,QAAgC,EAAE,oBAAuD;QAC7G,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;YACzC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;YACxD,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAA;YAEzC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;YACvC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YAExC,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAA;YACrC,MAAM,WAAW,GAAG,IAAA,sBAAiB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACnD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAC/B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAChC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAE1B,IAAI,YAAY,GAAG,CAAC,CAAA;YAEpB,IAAI,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;YAC7B,IAAI,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;YACnC,IAAI,gBAAgB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAA;YACnD,IAAI,oBAAoB,GAAG,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,CAAA;YACjE,MAAM,CAAC,GAAG,CAAC,KAAa,EAAE,EAAE;gBAC1B,OAAO,IAAI,EAAE,CAAC;oBACZ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;wBAC1B,IAAI,EAAE,YAAY,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;4BACtC,WAAW,CAAC,GAAG,EAAE,CAAA;4BACjB,OAAM;wBACR,CAAC;6BAAM,CAAC;4BACN,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAA;4BACpC,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAA;4BAC1C,gBAAgB,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,gBAAgB,CAAA;4BAC1D,oBAAoB,GAAG,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAE,CAAA;4BACxE,KAAK,GAAG,CAAC,CAAA;wBACX,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;wBACrC,MAAK;oBACP,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;wBACvC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;4BAC1C,IAAA,YAAO,EAAE,IAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAG,IAAY,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;4BACxH,OAAM;wBACR,CAAC;oBACH,CAAC;oBACD,KAAK,EAAE,CAAA;gBACT,CAAC;gBAED,MAAM,IAAI,GAAG,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;gBACzB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACxC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;oBAC3C,OAAM;gBACR,CAAC;gBAED,4CAA4C;gBAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC/B,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;oBAChD,IAAA,mBAAQ,EAAC,IAAI,CAAC;yBACX,IAAI,CAAC,EAAE,CAAC,EAAE;wBACT,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;oBAC3C,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,oBAAoB,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC3E,CAAC;qBAAM,CAAC;oBACN,MAAM,UAAU,GAAG,IAAA,qBAAgB,EAAC,IAAI,CAAC,CAAA;oBACzC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;oBAC9B,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;oBAC1C,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;wBACzB,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE;4BAC3B,GAAG,EAAE,KAAK;yBACX,CAAC,CAAA;oBACJ,CAAC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC,CAAA;YAED,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAxND,oCAwNC;AAED,KAAK,UAAU,KAAK,CAAC,SAAwB,EAAE,YAAoB,EAAE,GAAW;IAC9E,MAAM,aAAa,GAAG,CAAC,MAAM,IAAA,mBAAQ,EAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAClF,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAA;QAC/B,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAClB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACtB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAkB,EAAE,CAAA;IAClC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3C,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAkB,EAAE,CAAA;IACrC,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAA;IAC9B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACtB,OAAO,IAAI,CAAC,CAAA;QACd,CAAC;IACH,CAAC;IACD,kBAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,EAAE,gCAAgC,CAAC,CAAA;IAC3F,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,SAAS,cAAc,CAAC,UAAsB,EAAE,IAAwC,EAAE,MAAc,EAAE,WAAmB,EAAE,KAAY;IACzI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,CAAA;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,IAAA,oBAAS,EAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACrC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAwB;IAC5C,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAE7D,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACtC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,CAAA;QACV,CAAC;QAED,mDAAmD;QACnD,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACpC,IAAI,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAA;QACV,CAAC;QACD,IAAI,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC,CAAA;QACX,CAAC;QAED,0BAA0B;QAC1B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,IAAI,gBAA0D,CAAA;IAC9D,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAA;QAE5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;QAC1C,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;YACjE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAClC,CAAC;QAED,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACvC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;gBACpC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,+BAA+B,CAAC,CAAA;YACzE,CAAC;YAED,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAE9C,OAAO;QACL,GAAG;QACH,WAAW;QACX,QAAQ;QACR,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;QAChD,gBAAgB;KACjB,CAAA;AACH,CAAC","sourcesContent":["import { AsyncTaskManager, log } from \"builder-util\"\nimport { FileCopier, Filter, MAX_FILE_REQUESTS } from \"builder-util\"\nimport { symlink, createReadStream, createWriteStream, Stats } from \"fs\"\nimport { writeFile, readFile, mkdir } from \"fs/promises\"\nimport * as path from \"path\"\nimport { AsarOptions } from \"../options/PlatformSpecificBuildOptions\"\nimport { Packager } from \"../packager\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { getDestinationPath, ResolvedFileSet } from \"../util/appFileCopier\"\nimport { AsarFilesystem, Node } from \"./asar\"\nimport { hashFile, hashFileContents } from \"./integrity\"\nimport { detectUnpackedDirs } from \"./unpackDetector\"\n\nconst pickle = require(\"chromium-pickle-js\")\n\n/** @internal */\nexport class AsarPackager {\n private readonly fs = new AsarFilesystem(this.src)\n private readonly outFile: string\n private readonly unpackedDest: string\n\n constructor(\n private readonly src: string,\n private readonly destination: string,\n private readonly options: AsarOptions,\n private readonly unpackPattern: Filter | null\n ) {\n this.outFile = path.join(destination, \"app.asar\")\n this.unpackedDest = `${this.outFile}.unpacked`\n }\n\n // sort files to minimize file change (i.e. asar file is not changed dramatically on small change)\n async pack(fileSets: Array<ResolvedFileSet>, packager: PlatformPackager<any>) {\n if (this.options.ordering != null) {\n // ordering doesn't support transformed files, but ordering is not used functionality - wait user report to fix it\n await order(fileSets[0].files, this.options.ordering, fileSets[0].src)\n }\n await mkdir(path.dirname(this.outFile), { recursive: true })\n const unpackedFileIndexMap = new Map<ResolvedFileSet, Set<number>>()\n const orderedFileSets = [\n // Write dependencies first to minimize offset changes to asar header\n ...fileSets.slice(1),\n\n // Finish with the app files that change most often\n fileSets[0],\n ].map(orderFileSet)\n\n for (const fileSet of orderedFileSets) {\n unpackedFileIndexMap.set(fileSet, await this.createPackageFromFiles(fileSet, packager.info))\n }\n await this.writeAsarFile(orderedFileSets, unpackedFileIndexMap)\n }\n\n private async createPackageFromFiles(fileSet: ResolvedFileSet, packager: Packager) {\n const metadata = fileSet.metadata\n // search auto unpacked dir\n const unpackedDirs = new Set<string>()\n const rootForAppFilesWithoutAsar = path.join(this.destination, \"app\")\n\n if (this.options.smartUnpack !== false) {\n await detectUnpackedDirs(fileSet, unpackedDirs, this.unpackedDest, rootForAppFilesWithoutAsar)\n }\n\n const dirToCreateForUnpackedFiles = new Set<string>(unpackedDirs)\n\n const correctDirNodeUnpackedFlag = async (filePathInArchive: string, dirNode: Node) => {\n for (const dir of unpackedDirs) {\n if (filePathInArchive.length > dir.length + 2 && filePathInArchive[dir.length] === path.sep && filePathInArchive.startsWith(dir)) {\n dirNode.unpacked = true\n unpackedDirs.add(filePathInArchive)\n // not all dirs marked as unpacked after first iteration - because node module dir can be marked as unpacked after processing node module dir content\n // e.g. node-notifier/example/advanced.js processed, but only on process vendor/terminal-notifier.app module will be marked as unpacked\n await mkdir(path.join(this.unpackedDest, filePathInArchive), { recursive: true })\n break\n }\n }\n }\n\n const transformedFiles = fileSet.transformedFiles\n const taskManager = new AsyncTaskManager(packager.cancellationToken)\n const fileCopier = new FileCopier()\n\n let currentDirNode: Node | null = null\n let currentDirPath: string | null = null\n\n const unpackedFileIndexSet = new Set<number>()\n\n for (let i = 0, n = fileSet.files.length; i < n; i++) {\n const file = fileSet.files[i]\n const stat = metadata.get(file)\n if (stat == null) {\n continue\n }\n\n const pathInArchive = path.relative(rootForAppFilesWithoutAsar, getDestinationPath(file, fileSet))\n\n if (stat.isSymbolicLink()) {\n const s = stat as any\n this.fs.getOrCreateNode(pathInArchive).link = s.relativeLink\n s.pathInArchive = pathInArchive\n unpackedFileIndexSet.add(i)\n continue\n }\n\n let fileParent = path.dirname(pathInArchive)\n if (fileParent === \".\") {\n fileParent = \"\"\n }\n\n if (currentDirPath !== fileParent) {\n if (fileParent.startsWith(\"..\")) {\n throw new Error(`Internal error: path must not start with \"..\": ${fileParent}`)\n }\n\n currentDirPath = fileParent\n currentDirNode = this.fs.getOrCreateNode(fileParent)\n // do not check for root\n if (fileParent !== \"\" && !currentDirNode.unpacked) {\n if (unpackedDirs.has(fileParent)) {\n currentDirNode.unpacked = true\n } else {\n await correctDirNodeUnpackedFlag(fileParent, currentDirNode)\n }\n }\n }\n\n const dirNode = currentDirNode!\n const newData = transformedFiles == null ? undefined : transformedFiles.get(i)\n const isUnpacked = dirNode.unpacked || (this.unpackPattern != null && this.unpackPattern(file, stat))\n const integrity = newData === undefined ? await hashFile(file) : hashFileContents(newData)\n this.fs.addFileNode(file, dirNode, newData == undefined ? stat.size : Buffer.byteLength(newData), isUnpacked, stat, integrity)\n if (isUnpacked) {\n if (!dirNode.unpacked && !dirToCreateForUnpackedFiles.has(fileParent)) {\n dirToCreateForUnpackedFiles.add(fileParent)\n await mkdir(path.join(this.unpackedDest, fileParent), { recursive: true })\n }\n\n const unpackedFile = path.join(this.unpackedDest, pathInArchive)\n taskManager.addTask(copyFileOrData(fileCopier, newData, file, unpackedFile, stat))\n if (taskManager.tasks.length > MAX_FILE_REQUESTS) {\n await taskManager.awaitTasks()\n }\n\n unpackedFileIndexSet.add(i)\n }\n }\n\n if (taskManager.tasks.length > 0) {\n await taskManager.awaitTasks()\n }\n\n return unpackedFileIndexSet\n }\n\n private writeAsarFile(fileSets: Array<ResolvedFileSet>, unpackedFileIndexMap: Map<ResolvedFileSet, Set<number>>): Promise<any> {\n return new Promise<string>((resolve, reject) => {\n const headerPickle = pickle.createEmpty()\n headerPickle.writeString(JSON.stringify(this.fs.header))\n const headerBuf = headerPickle.toBuffer()\n\n const sizePickle = pickle.createEmpty()\n sizePickle.writeUInt32(headerBuf.length)\n\n const sizeBuf = sizePickle.toBuffer()\n const writeStream = createWriteStream(this.outFile)\n writeStream.on(\"error\", reject)\n writeStream.on(\"close\", resolve)\n writeStream.write(sizeBuf)\n\n let fileSetIndex = 0\n\n let files = fileSets[0].files\n let metadata = fileSets[0].metadata\n let transformedFiles = fileSets[0].transformedFiles\n let unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[0])!\n const w = (index: number) => {\n while (true) {\n if (index >= files.length) {\n if (++fileSetIndex >= fileSets.length) {\n writeStream.end()\n return\n } else {\n files = fileSets[fileSetIndex].files\n metadata = fileSets[fileSetIndex].metadata\n transformedFiles = fileSets[fileSetIndex].transformedFiles\n unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[fileSetIndex])!\n index = 0\n }\n }\n\n if (!unpackedFileIndexSet.has(index)) {\n break\n } else {\n const stat = metadata.get(files[index])\n if (stat != null && stat.isSymbolicLink()) {\n symlink((stat as any).linkRelativeToFile, path.join(this.unpackedDest, (stat as any).pathInArchive), () => w(index + 1))\n return\n }\n }\n index++\n }\n\n const data = transformedFiles == null ? null : transformedFiles.get(index)\n const file = files[index]\n if (data !== null && data !== undefined) {\n writeStream.write(data, () => w(index + 1))\n return\n }\n\n // https://github.com/yarnpkg/yarn/pull/3539\n const stat = metadata.get(file)\n if (stat != null && stat.size < 2 * 1024 * 1024) {\n readFile(file)\n .then(it => {\n writeStream.write(it, () => w(index + 1))\n })\n .catch((e: any) => reject(`Cannot read file ${file}: ${e.stack || e}`))\n } else {\n const readStream = createReadStream(file)\n readStream.on(\"error\", reject)\n readStream.once(\"end\", () => w(index + 1))\n readStream.on(\"open\", () => {\n readStream.pipe(writeStream, {\n end: false,\n })\n })\n }\n }\n\n writeStream.write(headerBuf, () => w(0))\n })\n }\n}\n\nasync function order(filenames: Array<string>, orderingFile: string, src: string) {\n const orderingFiles = (await readFile(orderingFile, \"utf8\")).split(\"\\n\").map(line => {\n if (line.indexOf(\":\") !== -1) {\n line = line.split(\":\").pop()!\n }\n line = line.trim()\n if (line[0] === \"/\") {\n line = line.slice(1)\n }\n return line\n })\n\n const ordering: Array<string> = []\n for (const file of orderingFiles) {\n const pathComponents = file.split(path.sep)\n for (const pathComponent of pathComponents) {\n ordering.push(path.join(src, pathComponent))\n }\n }\n\n const sortedFiles: Array<string> = []\n let missing = 0\n const total = filenames.length\n for (const file of ordering) {\n if (!sortedFiles.includes(file) && filenames.includes(file)) {\n sortedFiles.push(file)\n }\n }\n for (const file of filenames) {\n if (!sortedFiles.includes(file)) {\n sortedFiles.push(file)\n missing += 1\n }\n }\n log.info({ coverage: ((total - missing) / total) * 100 }, \"ordering files in ASAR archive\")\n return sortedFiles\n}\n\nfunction copyFileOrData(fileCopier: FileCopier, data: string | Buffer | undefined | null, source: string, destination: string, stats: Stats) {\n if (data == null) {\n return fileCopier.copy(source, destination, stats)\n } else {\n return writeFile(destination, data)\n }\n}\n\nfunction orderFileSet(fileSet: ResolvedFileSet): ResolvedFileSet {\n const sortedFileEntries = Array.from(fileSet.files.entries())\n\n sortedFileEntries.sort(([, a], [, b]) => {\n if (a === b) {\n return 0\n }\n\n // Place addons last because their signature change\n const isAAddon = a.endsWith(\".node\")\n const isBAddon = b.endsWith(\".node\")\n if (isAAddon && !isBAddon) {\n return 1\n }\n if (isBAddon && !isAAddon) {\n return -1\n }\n\n // Otherwise order by name\n return a < b ? -1 : 1\n })\n\n let transformedFiles: Map<number, string | Buffer> | undefined\n if (fileSet.transformedFiles) {\n transformedFiles = new Map()\n\n const indexMap = new Map<number, number>()\n for (const [newIndex, [oldIndex]] of sortedFileEntries.entries()) {\n indexMap.set(oldIndex, newIndex)\n }\n\n for (const [oldIndex, value] of fileSet.transformedFiles) {\n const newIndex = indexMap.get(oldIndex)\n if (newIndex === undefined) {\n const file = fileSet.files[oldIndex]\n throw new Error(`Internal error: ${file} was lost while ordering asar`)\n }\n\n transformedFiles.set(newIndex, value)\n }\n }\n\n const { src, destination, metadata } = fileSet\n\n return {\n src,\n destination,\n metadata,\n files: sortedFileEntries.map(([, file]) => file),\n transformedFiles,\n }\n}\n"]}
1
+ {"version":3,"file":"asarUtil.js","sourceRoot":"","sources":["../../src/asar/asarUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { CreateOptions, createPackageWithOptions } from \"@electron/asar\"\nimport { AsyncTaskManager, log } from \"builder-util\"\nimport { CancellationToken } from \"builder-util-runtime\"\nimport { Filter, MAX_FILE_REQUESTS } from \"builder-util/out/fs\"\nimport * as fsNode from \"fs\"\nimport * as fs from \"fs-extra\"\nimport * as path from \"path\"\nimport * as tempFile from \"temp-file\"\nimport { AsarOptions } from \"../options/PlatformSpecificBuildOptions\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { ResolvedFileSet, getDestinationPath } from \"../util/appFileCopier\"\nimport { detectUnpackedDirs } from \"./unpackDetector\"\n\n/** @internal */\nexport class AsarPackager {\n private readonly outFile: string\n private rootForAppFilesWithoutAsar!: string\n private readonly tmpDir = new tempFile.TmpDir()\n\n constructor(\n private readonly config: {\n appDir: string\n defaultDestination: string\n resourcePath: string\n options: AsarOptions\n unpackPattern: Filter | undefined\n }\n ) {\n this.outFile = path.join(config.resourcePath, `app.asar`)\n }\n\n async pack(fileSets: Array<ResolvedFileSet>, _packager: PlatformPackager<any>) {\n this.rootForAppFilesWithoutAsar = await this.tmpDir.getTempDir({ prefix: \"asar-app\" })\n\n const cancellationToken = new CancellationToken()\n cancellationToken.on(\"cancel\", () => this.tmpDir.cleanupSync())\n\n const orderedFileSets = [\n // Write dependencies first to minimize offset changes to asar header\n ...fileSets.slice(1),\n\n // Finish with the app files that change most often\n fileSets[0],\n ].map(orderFileSet)\n\n const { unpackedPaths, copiedFiles } = await this.detectAndCopy(orderedFileSets, cancellationToken)\n const unpackGlob = unpackedPaths.length > 1 ? `{${unpackedPaths.join(\",\")}}` : unpackedPaths.pop()\n\n let ordering = this.config.options.ordering || undefined\n if (!ordering) {\n // `copiedFiles` are already ordered due to `orderedFileSets` input, so we just map to their relative paths (via substring) within the asar.\n const filesSorted = copiedFiles.map(file => file.substring(this.rootForAppFilesWithoutAsar.length))\n ordering = await this.tmpDir.getTempFile({ prefix: \"asar-ordering\", suffix: \".txt\" })\n await fs.writeFile(ordering, filesSorted.join(\"\\n\"))\n }\n\n const options: CreateOptions = {\n unpack: unpackGlob,\n unpackDir: unpackGlob,\n ordering,\n dot: true,\n }\n // override logger temporarily to clean up console (electron/asar does some internal logging that blogs up the default electron-builder logs)\n const consoleLogger = console.log\n console.log = (...args) => {\n if (args[0] === \"Ordering file has 100% coverage.\") {\n return // no need to log, this means our ordering logic is working correctly\n }\n log.info({ args }, \"logging @electron/asar\")\n }\n await createPackageWithOptions(this.rootForAppFilesWithoutAsar, this.outFile, options)\n console.log = consoleLogger\n\n await this.tmpDir.cleanup()\n }\n\n private async detectAndCopy(fileSets: ResolvedFileSet[], cancellationToken: CancellationToken) {\n const taskManager = new AsyncTaskManager(cancellationToken)\n const unpackedPaths = new Set<string>()\n const copiedFiles = new Set<string>()\n\n const matchUnpacker = (file: string, dest: string, stat: fs.Stats) => {\n if (this.config.unpackPattern?.(file, stat)) {\n log.debug({ file }, \"unpacking\")\n unpackedPaths.add(dest)\n return\n }\n }\n const writeFileOrSymlink = async (transformedData: string | Buffer | undefined, source: string, destination: string, stat: fs.Stats) => {\n copiedFiles.add(destination)\n\n // If transformed data, skip symlink logic\n if (transformedData) {\n return this.copyFileOrData(transformedData, source, destination, stat)\n }\n\n const realPathFile = await fs.realpath(source)\n\n if (source === realPathFile) {\n return this.copyFileOrData(undefined, source, destination, stat)\n }\n\n const realPathRelative = path.relative(this.config.appDir, realPathFile)\n const symlinkTarget = path.resolve(this.rootForAppFilesWithoutAsar, realPathRelative)\n const isOutsidePackage = realPathRelative.startsWith(\"..\")\n if (isOutsidePackage) {\n log.error({ source: log.filePath(source), realPathFile: log.filePath(realPathFile) }, `unable to copy, file is symlinked outside the package`)\n throw new Error(\n `Cannot copy file (${path.basename(source)}) symlinked to file (${path.basename(realPathFile)}) outside the package as that violates asar security integrity`\n )\n }\n\n await this.copyFileOrData(undefined, source, symlinkTarget, stat)\n const target = path.relative(path.dirname(destination), symlinkTarget)\n fsNode.symlinkSync(target, destination)\n\n copiedFiles.add(symlinkTarget)\n }\n\n for await (const fileSet of fileSets) {\n if (this.config.options.smartUnpack !== false) {\n detectUnpackedDirs(fileSet, unpackedPaths, this.config.defaultDestination)\n }\n for (let i = 0; i < fileSet.files.length; i++) {\n const file = fileSet.files[i]\n const transformedData = fileSet.transformedFiles?.get(i)\n const metadata = fileSet.metadata.get(file) || (await fs.lstat(file))\n\n const relative = path.relative(this.config.defaultDestination, getDestinationPath(file, fileSet))\n const dest = path.resolve(this.rootForAppFilesWithoutAsar, relative)\n\n matchUnpacker(file, dest, metadata)\n taskManager.addTask(writeFileOrSymlink(transformedData, file, dest, metadata))\n\n if (taskManager.tasks.length > MAX_FILE_REQUESTS) {\n await taskManager.awaitTasks()\n }\n }\n }\n await taskManager.awaitTasks()\n return {\n unpackedPaths: Array.from(unpackedPaths),\n copiedFiles: Array.from(copiedFiles),\n }\n }\n\n private async copyFileOrData(data: string | Buffer | undefined, source: string, destination: string, stat: fs.Stats) {\n await fs.mkdir(path.dirname(destination), { recursive: true })\n if (data) {\n await fs.writeFile(destination, data, { mode: stat.mode })\n } else {\n await fs.copyFile(source, destination)\n }\n }\n}\n\nfunction orderFileSet(fileSet: ResolvedFileSet): ResolvedFileSet {\n const sortedFileEntries = Array.from(fileSet.files.entries())\n\n sortedFileEntries.sort(([, a], [, b]) => {\n if (a === b) {\n return 0\n }\n\n // Place addons last because their signature changes per build\n const isAAddon = a.endsWith(\".node\")\n const isBAddon = b.endsWith(\".node\")\n if (isAAddon && !isBAddon) {\n return 1\n }\n if (isBAddon && !isAAddon) {\n return -1\n }\n\n // Otherwise order by name\n return a < b ? -1 : 1\n })\n\n let transformedFiles: Map<number, string | Buffer> | undefined\n if (fileSet.transformedFiles) {\n transformedFiles = new Map()\n\n const indexMap = new Map<number, number>()\n for (const [newIndex, [oldIndex]] of sortedFileEntries.entries()) {\n indexMap.set(oldIndex, newIndex)\n }\n\n for (const [oldIndex, value] of fileSet.transformedFiles) {\n const newIndex = indexMap.get(oldIndex)\n if (newIndex === undefined) {\n const file = fileSet.files[oldIndex]\n throw new Error(`Internal error: ${file} was lost while ordering asar`)\n }\n\n transformedFiles.set(newIndex, value)\n }\n }\n\n const { src, destination, metadata } = fileSet\n\n return {\n src,\n destination,\n metadata,\n files: sortedFileEntries.map(([, file]) => file),\n transformedFiles,\n }\n}\n"]}