app-builder-lib 27.0.0-alpha.3 → 27.0.0-alpha.5

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 (238) hide show
  1. package/dist/codeSign/mac/macCodeSign.d.ts.map +1 -1
  2. package/dist/codeSign/mac/macCodeSign.js +3 -6
  3. package/dist/codeSign/mac/macCodeSign.js.map +1 -1
  4. package/dist/codeSign/win/signtoolBaseSignManager.d.ts.map +1 -1
  5. package/dist/codeSign/win/signtoolBaseSignManager.js +11 -3
  6. package/dist/codeSign/win/signtoolBaseSignManager.js.map +1 -1
  7. package/dist/codeSign/win/windowsSignAzureManager.d.ts.map +1 -1
  8. package/dist/codeSign/win/windowsSignAzureManager.js +31 -21
  9. package/dist/codeSign/win/windowsSignAzureManager.js.map +1 -1
  10. package/dist/configuration.d.ts +37 -44
  11. package/dist/configuration.d.ts.map +1 -1
  12. package/dist/configuration.js.map +1 -1
  13. package/dist/electron/ElectronFramework.js +2 -2
  14. package/dist/electron/ElectronFramework.js.map +1 -1
  15. package/dist/electron/electronVersion.d.ts.map +1 -1
  16. package/dist/electron/electronVersion.js +1 -11
  17. package/dist/electron/electronVersion.js.map +1 -1
  18. package/dist/fileMatcher.d.ts +27 -2
  19. package/dist/fileMatcher.d.ts.map +1 -1
  20. package/dist/fileMatcher.js +204 -16
  21. package/dist/fileMatcher.js.map +1 -1
  22. package/dist/indexInternal.d.ts +6 -5
  23. package/dist/indexInternal.d.ts.map +1 -1
  24. package/dist/indexInternal.js +6 -5
  25. package/dist/indexInternal.js.map +1 -1
  26. package/dist/macPackager.d.ts +5 -0
  27. package/dist/macPackager.d.ts.map +1 -1
  28. package/dist/macPackager.js +35 -0
  29. package/dist/macPackager.js.map +1 -1
  30. package/dist/node-module-collector/moduleManager.d.ts +3 -1
  31. package/dist/node-module-collector/moduleManager.d.ts.map +1 -1
  32. package/dist/node-module-collector/moduleManager.js +9 -1
  33. package/dist/node-module-collector/moduleManager.js.map +1 -1
  34. package/dist/node-module-collector/nodeModulesCollector.d.ts +13 -23
  35. package/dist/node-module-collector/nodeModulesCollector.d.ts.map +1 -1
  36. package/dist/node-module-collector/nodeModulesCollector.js +52 -122
  37. package/dist/node-module-collector/nodeModulesCollector.js.map +1 -1
  38. package/dist/node-module-collector/pnpmNodeModulesCollector.js +5 -5
  39. package/dist/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
  40. package/dist/node-module-collector/types.d.ts +2 -0
  41. package/dist/node-module-collector/types.d.ts.map +1 -1
  42. package/dist/node-module-collector/types.js.map +1 -1
  43. package/dist/options/PlatformSpecificBuildOptions.d.ts +0 -6
  44. package/dist/options/PlatformSpecificBuildOptions.d.ts.map +1 -1
  45. package/dist/options/PlatformSpecificBuildOptions.js.map +1 -1
  46. package/dist/options/SnapOptions.d.ts +15 -13
  47. package/dist/options/SnapOptions.d.ts.map +1 -1
  48. package/dist/options/SnapOptions.js.map +1 -1
  49. package/dist/options/linuxOptions.d.ts +0 -10
  50. package/dist/options/linuxOptions.d.ts.map +1 -1
  51. package/dist/options/linuxOptions.js.map +1 -1
  52. package/dist/options/winOptions.d.ts +164 -34
  53. package/dist/options/winOptions.d.ts.map +1 -1
  54. package/dist/options/winOptions.js.map +1 -1
  55. package/dist/packager.d.ts +2 -0
  56. package/dist/packager.d.ts.map +1 -1
  57. package/dist/packager.js +20 -22
  58. package/dist/packager.js.map +1 -1
  59. package/dist/platformPackager.d.ts +3 -0
  60. package/dist/platformPackager.d.ts.map +1 -1
  61. package/dist/platformPackager.js +11 -6
  62. package/dist/platformPackager.js.map +1 -1
  63. package/dist/publish/PublishManager.d.ts +1 -0
  64. package/dist/publish/PublishManager.d.ts.map +1 -1
  65. package/dist/publish/PublishManager.js +7 -2
  66. package/dist/publish/PublishManager.js.map +1 -1
  67. package/dist/targets/linux/FlatpakTarget.d.ts.map +1 -1
  68. package/dist/targets/linux/FlatpakTarget.js +4 -1
  69. package/dist/targets/linux/FlatpakTarget.js.map +1 -1
  70. package/dist/targets/linux/FpmTarget.d.ts +6 -0
  71. package/dist/targets/linux/FpmTarget.d.ts.map +1 -1
  72. package/dist/targets/linux/FpmTarget.js +28 -6
  73. package/dist/targets/linux/FpmTarget.js.map +1 -1
  74. package/dist/targets/linux/LinuxTargetHelper.d.ts +14 -0
  75. package/dist/targets/linux/LinuxTargetHelper.d.ts.map +1 -1
  76. package/dist/targets/linux/LinuxTargetHelper.js +38 -59
  77. package/dist/targets/linux/LinuxTargetHelper.js.map +1 -1
  78. package/dist/targets/linux/appimage/AppImageTarget.d.ts +1 -0
  79. package/dist/targets/linux/appimage/AppImageTarget.d.ts.map +1 -1
  80. package/dist/targets/linux/appimage/AppImageTarget.js +12 -14
  81. package/dist/targets/linux/appimage/AppImageTarget.js.map +1 -1
  82. package/dist/targets/linux/appimage/appImageUtil.d.ts +4 -0
  83. package/dist/targets/linux/appimage/appImageUtil.d.ts.map +1 -1
  84. package/dist/targets/linux/appimage/appImageUtil.js +11 -4
  85. package/dist/targets/linux/appimage/appImageUtil.js.map +1 -1
  86. package/dist/targets/linux/appimage/appLauncher.d.ts.map +1 -1
  87. package/dist/targets/linux/appimage/appLauncher.js +5 -11
  88. package/dist/targets/linux/appimage/appLauncher.js.map +1 -1
  89. package/dist/targets/linux/launcherScript.d.ts +32 -0
  90. package/dist/targets/linux/launcherScript.d.ts.map +1 -0
  91. package/dist/targets/linux/launcherScript.js +24 -0
  92. package/dist/targets/linux/launcherScript.js.map +1 -0
  93. package/dist/targets/linux/snap/SnapTarget.d.ts +1 -1
  94. package/dist/targets/linux/snap/SnapTarget.d.ts.map +1 -1
  95. package/dist/targets/linux/snap/SnapTarget.js +23 -1
  96. package/dist/targets/linux/snap/SnapTarget.js.map +1 -1
  97. package/dist/targets/linux/snap/core24.d.ts +1 -1
  98. package/dist/targets/linux/snap/core24.d.ts.map +1 -1
  99. package/dist/targets/linux/snap/core24.js +3 -2
  100. package/dist/targets/linux/snap/core24.js.map +1 -1
  101. package/dist/targets/linux/snap/coreCustom.d.ts +1 -1
  102. package/dist/targets/linux/snap/coreCustom.d.ts.map +1 -1
  103. package/dist/targets/linux/snap/coreCustom.js +2 -2
  104. package/dist/targets/linux/snap/coreCustom.js.map +1 -1
  105. package/dist/targets/linux/snap/coreLegacy.d.ts +1 -1
  106. package/dist/targets/linux/snap/coreLegacy.d.ts.map +1 -1
  107. package/dist/targets/linux/snap/coreLegacy.js +8 -7
  108. package/dist/targets/linux/snap/coreLegacy.js.map +1 -1
  109. package/dist/targets/linux/snap/snapCommand.d.ts +2 -2
  110. package/dist/targets/linux/snap/snapCommand.d.ts.map +1 -1
  111. package/dist/targets/linux/snap/snapCommand.js +4 -10
  112. package/dist/targets/linux/snap/snapCommand.js.map +1 -1
  113. package/dist/targets/linux/snap/snapcraftBuilder.d.ts +7 -1
  114. package/dist/targets/linux/snap/snapcraftBuilder.d.ts.map +1 -1
  115. package/dist/targets/linux/snap/snapcraftBuilder.js +57 -20
  116. package/dist/targets/linux/snap/snapcraftBuilder.js.map +1 -1
  117. package/dist/targets/targetFactory.d.ts +7 -0
  118. package/dist/targets/targetFactory.d.ts.map +1 -1
  119. package/dist/targets/targetFactory.js +28 -0
  120. package/dist/targets/targetFactory.js.map +1 -1
  121. package/dist/targets/win/AppxTarget.d.ts.map +1 -1
  122. package/dist/targets/win/AppxTarget.js +17 -9
  123. package/dist/targets/win/AppxTarget.js.map +1 -1
  124. package/dist/targets/win/MsiTarget.d.ts.map +1 -1
  125. package/dist/targets/win/MsiTarget.js +8 -11
  126. package/dist/targets/win/MsiTarget.js.map +1 -1
  127. package/dist/targets/win/nsis/NsisTarget.d.ts +3 -2
  128. package/dist/targets/win/nsis/NsisTarget.d.ts.map +1 -1
  129. package/dist/targets/win/nsis/NsisTarget.js +26 -49
  130. package/dist/targets/win/nsis/NsisTarget.js.map +1 -1
  131. package/dist/targets/win/nsis/nsisScriptGenerator.d.ts.map +1 -1
  132. package/dist/targets/win/nsis/nsisScriptGenerator.js +3 -2
  133. package/dist/targets/win/nsis/nsisScriptGenerator.js.map +1 -1
  134. package/dist/targets/win/nsis/nsisUtil.d.ts +5 -2
  135. package/dist/targets/win/nsis/nsisUtil.d.ts.map +1 -1
  136. package/dist/targets/win/nsis/nsisUtil.js +46 -22
  137. package/dist/targets/win/nsis/nsisUtil.js.map +1 -1
  138. package/dist/targets/win/nsis/progId.d.ts +21 -0
  139. package/dist/targets/win/nsis/progId.d.ts.map +1 -0
  140. package/dist/targets/win/nsis/progId.js +60 -0
  141. package/dist/targets/win/nsis/progId.js.map +1 -0
  142. package/dist/toolsets/7zip.d.ts.map +1 -1
  143. package/dist/toolsets/7zip.js +3 -1
  144. package/dist/toolsets/7zip.js.map +1 -1
  145. package/dist/toolsets/appimage.d.ts +3 -3
  146. package/dist/toolsets/appimage.d.ts.map +1 -1
  147. package/dist/toolsets/appimage.js +9 -6
  148. package/dist/toolsets/appimage.js.map +1 -1
  149. package/dist/toolsets/custom.d.ts +1 -3
  150. package/dist/toolsets/custom.d.ts.map +1 -1
  151. package/dist/toolsets/custom.js +4 -133
  152. package/dist/toolsets/custom.js.map +1 -1
  153. package/dist/toolsets/fpm.d.ts.map +1 -1
  154. package/dist/toolsets/fpm.js +11 -5
  155. package/dist/toolsets/fpm.js.map +1 -1
  156. package/dist/toolsets/icons.d.ts.map +1 -1
  157. package/dist/toolsets/icons.js +13 -2
  158. package/dist/toolsets/icons.js.map +1 -1
  159. package/dist/toolsets/linuxToolsMac.d.ts.map +1 -1
  160. package/dist/toolsets/linuxToolsMac.js +4 -1
  161. package/dist/toolsets/linuxToolsMac.js.map +1 -1
  162. package/dist/toolsets/nsis.d.ts.map +1 -1
  163. package/dist/toolsets/nsis.js +6 -3
  164. package/dist/toolsets/nsis.js.map +1 -1
  165. package/dist/toolsets/version.d.ts +12 -0
  166. package/dist/toolsets/version.d.ts.map +1 -0
  167. package/dist/toolsets/version.js +13 -0
  168. package/dist/toolsets/version.js.map +1 -0
  169. package/dist/toolsets/winCodeSign.d.ts +11 -3
  170. package/dist/toolsets/winCodeSign.d.ts.map +1 -1
  171. package/dist/toolsets/winCodeSign.js +45 -27
  172. package/dist/toolsets/winCodeSign.js.map +1 -1
  173. package/dist/toolsets/wine.d.ts +2 -1
  174. package/dist/toolsets/wine.d.ts.map +1 -1
  175. package/dist/toolsets/wine.js +15 -13
  176. package/dist/toolsets/wine.js.map +1 -1
  177. package/dist/util/NodeModuleCopyHelper.js +3 -3
  178. package/dist/util/NodeModuleCopyHelper.js.map +1 -1
  179. package/dist/util/appFileCopier.d.ts +39 -0
  180. package/dist/util/appFileCopier.d.ts.map +1 -1
  181. package/dist/util/appFileCopier.js +71 -20
  182. package/dist/util/appFileCopier.js.map +1 -1
  183. package/dist/util/archCompatibility.d.ts +42 -0
  184. package/dist/util/archCompatibility.d.ts.map +1 -0
  185. package/dist/util/archCompatibility.js +202 -0
  186. package/dist/util/archCompatibility.js.map +1 -0
  187. package/dist/util/config/config.d.ts +1 -0
  188. package/dist/util/config/config.d.ts.map +1 -1
  189. package/dist/util/config/config.js +4 -1
  190. package/dist/util/config/config.js.map +1 -1
  191. package/dist/util/config/load.d.ts +2 -2
  192. package/dist/util/config/load.d.ts.map +1 -1
  193. package/dist/util/config/load.js +3 -12
  194. package/dist/util/config/load.js.map +1 -1
  195. package/dist/util/config/schemaValidator.js +1 -1
  196. package/dist/util/config/schemaValidator.js.map +1 -1
  197. package/dist/util/electronGet.d.ts +6 -3
  198. package/dist/util/electronGet.d.ts.map +1 -1
  199. package/dist/util/electronGet.js +23 -9
  200. package/dist/util/electronGet.js.map +1 -1
  201. package/dist/util/flags.d.ts +0 -1
  202. package/dist/util/flags.d.ts.map +1 -1
  203. package/dist/util/flags.js +0 -3
  204. package/dist/util/flags.js.map +1 -1
  205. package/dist/util/hash.d.ts +1 -1
  206. package/dist/util/hash.d.ts.map +1 -1
  207. package/dist/util/hash.js +1 -15
  208. package/dist/util/hash.js.map +1 -1
  209. package/dist/util/installOrRebuild.d.ts +38 -0
  210. package/dist/util/installOrRebuild.d.ts.map +1 -0
  211. package/dist/util/{yarn.js → installOrRebuild.js} +65 -14
  212. package/dist/util/installOrRebuild.js.map +1 -0
  213. package/dist/util/langs.d.ts.map +1 -1
  214. package/dist/util/langs.js +1 -0
  215. package/dist/util/langs.js.map +1 -1
  216. package/dist/util/mac/macosIconComposer.d.ts +2 -1
  217. package/dist/util/mac/macosIconComposer.d.ts.map +1 -1
  218. package/dist/util/mac/macosIconComposer.js +40 -58
  219. package/dist/util/mac/macosIconComposer.js.map +1 -1
  220. package/dist/util/streamSpawnToFile.d.ts +47 -0
  221. package/dist/util/streamSpawnToFile.d.ts.map +1 -0
  222. package/dist/util/streamSpawnToFile.js +110 -0
  223. package/dist/util/streamSpawnToFile.js.map +1 -0
  224. package/dist/util/toolsetLock.d.ts +2 -0
  225. package/dist/util/toolsetLock.d.ts.map +1 -1
  226. package/dist/util/toolsetLock.js +31 -5
  227. package/dist/util/toolsetLock.js.map +1 -1
  228. package/dist/version.d.ts +1 -1
  229. package/dist/version.js +1 -1
  230. package/dist/version.js.map +1 -1
  231. package/package.json +8 -8
  232. package/scheme.json +94 -130
  233. package/templates/appx/appxmanifest.xml +1 -2
  234. package/templates/nsis/assistedMessages.yml +17 -0
  235. package/templates/nsis/messages.yml +5 -0
  236. package/dist/util/yarn.d.ts +0 -23
  237. package/dist/util/yarn.d.ts.map +0 -1
  238. package/dist/util/yarn.js.map +0 -1
@@ -0,0 +1,42 @@
1
+ import { Arch } from "builder-util";
2
+ /**
3
+ * The `cpu`/`os` constraint fields as declared in a package's `package.json`.
4
+ * npm/pnpm only *install* the optional platform package matching the host, but the
5
+ * declared values are what we use to decide whether a package belongs in a given build.
6
+ */
7
+ export interface PackagePlatformFields {
8
+ os?: string | string[] | null;
9
+ cpu?: string | string[] | null;
10
+ }
11
+ export declare function archToNodeCpu(arch: Arch): string | null;
12
+ /**
13
+ * Whether a package may be bundled for the given target `cpu`/`os`, per its declared
14
+ * `package.json` `cpu`/`os` fields. A package with no constraint (plain JS) is always compatible.
15
+ */
16
+ export declare function isPackageCompatible(pkg: PackagePlatformFields, targetCpu: string | null, targetOs: string): boolean;
17
+ /**
18
+ * Whether a package is inherently single-architecture — i.e. its `cpu` constraint cannot satisfy
19
+ * *both* slices of a macOS universal build (`x64` and `arm64`). Such packages (e.g. `@esbuild/darwin-arm64`)
20
+ * cannot be merged into a universal Mach-O and must be treated as single-arch by `@electron/universal`.
21
+ */
22
+ export declare function isSingleArchPackage(pkg: PackagePlatformFields): boolean;
23
+ /**
24
+ * Recursively walks a `node_modules` directory (handling `@scope` dirs and nested `node_modules`) and
25
+ * collects the `name` of every package whose `package.json` `cpu` marks it as {@link isSingleArchPackage single-arch}.
26
+ * Missing/unreadable directories are treated as empty.
27
+ */
28
+ export declare function collectSingleArchPackageNames(nodeModulesDir: string, names?: Set<string>): Promise<Set<string>>;
29
+ /**
30
+ * Finds single-arch Mach-O files that are byte-identical in BOTH universal slices — the exact case
31
+ * `@electron/universal` aborts on (`x64Sha === arm64Sha` for a non-fat Mach-O). This catches host binaries
32
+ * placed in packages that declare no `cpu`/`os`, e.g. esbuild's install script overwriting `esbuild/bin/esbuild`
33
+ * with the platform binary. Per-arch binaries (different SHA, e.g. rebuilt `.node` addons) are left for lipo.
34
+ * Returns paths relative to `unpackedDirA`, posix-normalized for matching by `@electron/universal`.
35
+ */
36
+ export declare function collectIdenticalSingleArchMachOFiles(unpackedDirA: string, unpackedDirB: string): Promise<string[]>;
37
+ /**
38
+ * Combines the given minimatch patterns (as consumed by `@electron/universal`'s `singleArchFiles`) into a
39
+ * single pattern, merged with any user-provided pattern. Returns `userPattern` (possibly undefined) when empty.
40
+ */
41
+ export declare function buildSingleArchFilesPattern(patterns: Iterable<string>, userPattern: string | undefined): string | undefined;
42
+ //# sourceMappingURL=archCompatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archCompatibility.d.ts","sourceRoot":"","sources":["../../src/util/archCompatibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAKnC;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAA;IAC7B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAA;CAC/B;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAavD;AAgCD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAUnH;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAMvE;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,GAAE,GAAG,CAAC,MAAM,CAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CA8BxI;AAuDD;;;;;;GAMG;AACH,wBAAsB,oCAAoC,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAaxH;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAO3H"}
@@ -0,0 +1,202 @@
1
+ import { Arch } from "builder-util";
2
+ import { createHash } from "crypto";
3
+ import { open, readdir, readFile } from "fs/promises";
4
+ import * as path from "path";
5
+ // Maps electron-builder's `Arch` to the npm `cpu` token used in `package.json` `cpu` fields.
6
+ // Returns `null` for arches we don't filter on (e.g. `universal`).
7
+ export function archToNodeCpu(arch) {
8
+ switch (arch) {
9
+ case Arch.ia32:
10
+ return "ia32";
11
+ case Arch.x64:
12
+ return "x64";
13
+ case Arch.armv7l:
14
+ return "arm";
15
+ case Arch.arm64:
16
+ return "arm64";
17
+ default:
18
+ return null;
19
+ }
20
+ }
21
+ function toList(value) {
22
+ if (value == null) {
23
+ return null;
24
+ }
25
+ const list = Array.isArray(value) ? value : [value];
26
+ return list.length > 0 ? list : null;
27
+ }
28
+ // Mirrors npm's `checkList` semantics (npm-install-checks): supports `"any"` and `"!"` negation.
29
+ // Returns true when `value` is allowed by `list`.
30
+ function checkList(value, list) {
31
+ if (list.length === 1 && list[0] === "any") {
32
+ return true;
33
+ }
34
+ let blacklistCount = 0;
35
+ let match = false;
36
+ for (const entry of list) {
37
+ if (entry.startsWith("!")) {
38
+ if (entry.slice(1) === value) {
39
+ return false;
40
+ }
41
+ blacklistCount++;
42
+ }
43
+ else if (entry === value) {
44
+ match = true;
45
+ }
46
+ }
47
+ // allowed if it matched a positive entry, or every entry was a (non-matching) negation
48
+ return match || blacklistCount === list.length;
49
+ }
50
+ /**
51
+ * Whether a package may be bundled for the given target `cpu`/`os`, per its declared
52
+ * `package.json` `cpu`/`os` fields. A package with no constraint (plain JS) is always compatible.
53
+ */
54
+ export function isPackageCompatible(pkg, targetCpu, targetOs) {
55
+ const os = toList(pkg.os);
56
+ if (os != null && !checkList(targetOs, os)) {
57
+ return false;
58
+ }
59
+ const cpu = toList(pkg.cpu);
60
+ if (targetCpu != null && cpu != null && !checkList(targetCpu, cpu)) {
61
+ return false;
62
+ }
63
+ return true;
64
+ }
65
+ /**
66
+ * Whether a package is inherently single-architecture — i.e. its `cpu` constraint cannot satisfy
67
+ * *both* slices of a macOS universal build (`x64` and `arm64`). Such packages (e.g. `@esbuild/darwin-arm64`)
68
+ * cannot be merged into a universal Mach-O and must be treated as single-arch by `@electron/universal`.
69
+ */
70
+ export function isSingleArchPackage(pkg) {
71
+ const cpu = toList(pkg.cpu);
72
+ if (cpu == null) {
73
+ return false;
74
+ }
75
+ return !(checkList("x64", cpu) && checkList("arm64", cpu));
76
+ }
77
+ /**
78
+ * Recursively walks a `node_modules` directory (handling `@scope` dirs and nested `node_modules`) and
79
+ * collects the `name` of every package whose `package.json` `cpu` marks it as {@link isSingleArchPackage single-arch}.
80
+ * Missing/unreadable directories are treated as empty.
81
+ */
82
+ export async function collectSingleArchPackageNames(nodeModulesDir, names = new Set()) {
83
+ let entries;
84
+ try {
85
+ entries = await readdir(nodeModulesDir, { withFileTypes: true });
86
+ }
87
+ catch {
88
+ return names; // directory does not exist (no unpacked node_modules) or is unreadable
89
+ }
90
+ for (const entry of entries) {
91
+ if (!entry.isDirectory() || entry.name === ".bin") {
92
+ continue;
93
+ }
94
+ if (entry.name.startsWith("@")) {
95
+ // scope directory: its children are the actual packages
96
+ const scopeDir = path.join(nodeModulesDir, entry.name);
97
+ let scoped;
98
+ try {
99
+ scoped = await readdir(scopeDir, { withFileTypes: true });
100
+ }
101
+ catch {
102
+ continue;
103
+ }
104
+ for (const child of scoped) {
105
+ if (child.isDirectory()) {
106
+ await inspectPackageDir(path.join(scopeDir, child.name), names);
107
+ }
108
+ }
109
+ }
110
+ else {
111
+ await inspectPackageDir(path.join(nodeModulesDir, entry.name), names);
112
+ }
113
+ }
114
+ return names;
115
+ }
116
+ async function inspectPackageDir(packageDir, names) {
117
+ try {
118
+ const pkg = JSON.parse(await readFile(path.join(packageDir, "package.json"), "utf8"));
119
+ if (pkg.name && isSingleArchPackage(pkg)) {
120
+ names.add(pkg.name);
121
+ }
122
+ }
123
+ catch {
124
+ // missing/invalid package.json — skip
125
+ }
126
+ await collectSingleArchPackageNames(path.join(packageDir, "node_modules"), names);
127
+ }
128
+ // Single-arch (non-fat) Mach-O magics, read big-endian from the first 4 bytes. The fat/universal magics
129
+ // (`0xcafebabe`/`0xbebafeca`) are intentionally excluded — those are already-merged binaries that lipo handles.
130
+ const SINGLE_ARCH_MACHO_MAGICS = new Set([0xfeedface, 0xfeedfacf, 0xcefaedfe, 0xcffaedfe]);
131
+ async function isSingleArchMachO(file) {
132
+ let fh;
133
+ try {
134
+ fh = await open(file, "r");
135
+ const buf = Buffer.alloc(4);
136
+ const { bytesRead } = await fh.read(buf, 0, 4, 0);
137
+ return bytesRead === 4 && SINGLE_ARCH_MACHO_MAGICS.has(buf.readUInt32BE(0));
138
+ }
139
+ catch {
140
+ return false; // missing/unreadable file
141
+ }
142
+ finally {
143
+ await fh?.close();
144
+ }
145
+ }
146
+ async function sha256(file) {
147
+ return createHash("sha256")
148
+ .update(await readFile(file))
149
+ .digest("hex");
150
+ }
151
+ async function walkFiles(dir, onFile) {
152
+ let entries;
153
+ try {
154
+ entries = await readdir(dir, { withFileTypes: true });
155
+ }
156
+ catch {
157
+ return; // directory does not exist or is unreadable
158
+ }
159
+ for (const entry of entries) {
160
+ const p = path.join(dir, entry.name);
161
+ if (entry.isDirectory()) {
162
+ await walkFiles(p, onFile);
163
+ }
164
+ else if (entry.isFile()) {
165
+ await onFile(p);
166
+ }
167
+ }
168
+ }
169
+ /**
170
+ * Finds single-arch Mach-O files that are byte-identical in BOTH universal slices — the exact case
171
+ * `@electron/universal` aborts on (`x64Sha === arm64Sha` for a non-fat Mach-O). This catches host binaries
172
+ * placed in packages that declare no `cpu`/`os`, e.g. esbuild's install script overwriting `esbuild/bin/esbuild`
173
+ * with the platform binary. Per-arch binaries (different SHA, e.g. rebuilt `.node` addons) are left for lipo.
174
+ * Returns paths relative to `unpackedDirA`, posix-normalized for matching by `@electron/universal`.
175
+ */
176
+ export async function collectIdenticalSingleArchMachOFiles(unpackedDirA, unpackedDirB) {
177
+ const result = [];
178
+ await walkFiles(unpackedDirA, async (fileA) => {
179
+ if (!(await isSingleArchMachO(fileA))) {
180
+ return;
181
+ }
182
+ const rel = path.relative(unpackedDirA, fileA);
183
+ const fileB = path.join(unpackedDirB, rel);
184
+ if ((await isSingleArchMachO(fileB)) && (await sha256(fileA)) === (await sha256(fileB))) {
185
+ result.push(rel.split(path.sep).join("/"));
186
+ }
187
+ });
188
+ return result;
189
+ }
190
+ /**
191
+ * Combines the given minimatch patterns (as consumed by `@electron/universal`'s `singleArchFiles`) into a
192
+ * single pattern, merged with any user-provided pattern. Returns `userPattern` (possibly undefined) when empty.
193
+ */
194
+ export function buildSingleArchFilesPattern(patterns, userPattern) {
195
+ const sorted = Array.from(new Set(patterns)).sort();
196
+ if (sorted.length === 0) {
197
+ return userPattern;
198
+ }
199
+ const detected = sorted.length === 1 ? sorted[0] : `{${sorted.join(",")}}`;
200
+ return userPattern ? `{${userPattern},${detected}}` : detected;
201
+ }
202
+ //# sourceMappingURL=archCompatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archCompatibility.js","sourceRoot":"","sources":["../../src/util/archCompatibility.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch } from \"builder-util\"\nimport { createHash } from \"crypto\"\nimport { open, readdir, readFile } from \"fs/promises\"\nimport * as path from \"path\"\n\n/**\n * The `cpu`/`os` constraint fields as declared in a package's `package.json`.\n * npm/pnpm only *install* the optional platform package matching the host, but the\n * declared values are what we use to decide whether a package belongs in a given build.\n */\nexport interface PackagePlatformFields {\n os?: string | string[] | null\n cpu?: string | string[] | null\n}\n\n// Maps electron-builder's `Arch` to the npm `cpu` token used in `package.json` `cpu` fields.\n// Returns `null` for arches we don't filter on (e.g. `universal`).\nexport function archToNodeCpu(arch: Arch): string | null {\n switch (arch) {\n case Arch.ia32:\n return \"ia32\"\n case Arch.x64:\n return \"x64\"\n case Arch.armv7l:\n return \"arm\"\n case Arch.arm64:\n return \"arm64\"\n default:\n return null\n }\n}\n\nfunction toList(value: string | string[] | null | undefined): string[] | null {\n if (value == null) {\n return null\n }\n const list = Array.isArray(value) ? value : [value]\n return list.length > 0 ? list : null\n}\n\n// Mirrors npm's `checkList` semantics (npm-install-checks): supports `\"any\"` and `\"!\"` negation.\n// Returns true when `value` is allowed by `list`.\nfunction checkList(value: string, list: string[]): boolean {\n if (list.length === 1 && list[0] === \"any\") {\n return true\n }\n let blacklistCount = 0\n let match = false\n for (const entry of list) {\n if (entry.startsWith(\"!\")) {\n if (entry.slice(1) === value) {\n return false\n }\n blacklistCount++\n } else if (entry === value) {\n match = true\n }\n }\n // allowed if it matched a positive entry, or every entry was a (non-matching) negation\n return match || blacklistCount === list.length\n}\n\n/**\n * Whether a package may be bundled for the given target `cpu`/`os`, per its declared\n * `package.json` `cpu`/`os` fields. A package with no constraint (plain JS) is always compatible.\n */\nexport function isPackageCompatible(pkg: PackagePlatformFields, targetCpu: string | null, targetOs: string): boolean {\n const os = toList(pkg.os)\n if (os != null && !checkList(targetOs, os)) {\n return false\n }\n const cpu = toList(pkg.cpu)\n if (targetCpu != null && cpu != null && !checkList(targetCpu, cpu)) {\n return false\n }\n return true\n}\n\n/**\n * Whether a package is inherently single-architecture — i.e. its `cpu` constraint cannot satisfy\n * *both* slices of a macOS universal build (`x64` and `arm64`). Such packages (e.g. `@esbuild/darwin-arm64`)\n * cannot be merged into a universal Mach-O and must be treated as single-arch by `@electron/universal`.\n */\nexport function isSingleArchPackage(pkg: PackagePlatformFields): boolean {\n const cpu = toList(pkg.cpu)\n if (cpu == null) {\n return false\n }\n return !(checkList(\"x64\", cpu) && checkList(\"arm64\", cpu))\n}\n\n/**\n * Recursively walks a `node_modules` directory (handling `@scope` dirs and nested `node_modules`) and\n * collects the `name` of every package whose `package.json` `cpu` marks it as {@link isSingleArchPackage single-arch}.\n * Missing/unreadable directories are treated as empty.\n */\nexport async function collectSingleArchPackageNames(nodeModulesDir: string, names: Set<string> = new Set<string>()): Promise<Set<string>> {\n let entries\n try {\n entries = await readdir(nodeModulesDir, { withFileTypes: true })\n } catch {\n return names // directory does not exist (no unpacked node_modules) or is unreadable\n }\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name === \".bin\") {\n continue\n }\n if (entry.name.startsWith(\"@\")) {\n // scope directory: its children are the actual packages\n const scopeDir = path.join(nodeModulesDir, entry.name)\n let scoped\n try {\n scoped = await readdir(scopeDir, { withFileTypes: true })\n } catch {\n continue\n }\n for (const child of scoped) {\n if (child.isDirectory()) {\n await inspectPackageDir(path.join(scopeDir, child.name), names)\n }\n }\n } else {\n await inspectPackageDir(path.join(nodeModulesDir, entry.name), names)\n }\n }\n return names\n}\n\nasync function inspectPackageDir(packageDir: string, names: Set<string>): Promise<void> {\n try {\n const pkg: PackagePlatformFields & { name?: string } = JSON.parse(await readFile(path.join(packageDir, \"package.json\"), \"utf8\"))\n if (pkg.name && isSingleArchPackage(pkg)) {\n names.add(pkg.name)\n }\n } catch {\n // missing/invalid package.json — skip\n }\n await collectSingleArchPackageNames(path.join(packageDir, \"node_modules\"), names)\n}\n\n// Single-arch (non-fat) Mach-O magics, read big-endian from the first 4 bytes. The fat/universal magics\n// (`0xcafebabe`/`0xbebafeca`) are intentionally excluded — those are already-merged binaries that lipo handles.\nconst SINGLE_ARCH_MACHO_MAGICS = new Set([0xfeedface, 0xfeedfacf, 0xcefaedfe, 0xcffaedfe])\n\nasync function isSingleArchMachO(file: string): Promise<boolean> {\n let fh\n try {\n fh = await open(file, \"r\")\n const buf = Buffer.alloc(4)\n const { bytesRead } = await fh.read(buf, 0, 4, 0)\n return bytesRead === 4 && SINGLE_ARCH_MACHO_MAGICS.has(buf.readUInt32BE(0))\n } catch {\n return false // missing/unreadable file\n } finally {\n await fh?.close()\n }\n}\n\nasync function sha256(file: string): Promise<string> {\n return createHash(\"sha256\")\n .update(await readFile(file))\n .digest(\"hex\")\n}\n\nasync function walkFiles(dir: string, onFile: (absolutePath: string) => Promise<void>): Promise<void> {\n let entries\n try {\n entries = await readdir(dir, { withFileTypes: true })\n } catch {\n return // directory does not exist or is unreadable\n }\n for (const entry of entries) {\n const p = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n await walkFiles(p, onFile)\n } else if (entry.isFile()) {\n await onFile(p)\n }\n }\n}\n\n/**\n * Finds single-arch Mach-O files that are byte-identical in BOTH universal slices — the exact case\n * `@electron/universal` aborts on (`x64Sha === arm64Sha` for a non-fat Mach-O). This catches host binaries\n * placed in packages that declare no `cpu`/`os`, e.g. esbuild's install script overwriting `esbuild/bin/esbuild`\n * with the platform binary. Per-arch binaries (different SHA, e.g. rebuilt `.node` addons) are left for lipo.\n * Returns paths relative to `unpackedDirA`, posix-normalized for matching by `@electron/universal`.\n */\nexport async function collectIdenticalSingleArchMachOFiles(unpackedDirA: string, unpackedDirB: string): Promise<string[]> {\n const result: string[] = []\n await walkFiles(unpackedDirA, async fileA => {\n if (!(await isSingleArchMachO(fileA))) {\n return\n }\n const rel = path.relative(unpackedDirA, fileA)\n const fileB = path.join(unpackedDirB, rel)\n if ((await isSingleArchMachO(fileB)) && (await sha256(fileA)) === (await sha256(fileB))) {\n result.push(rel.split(path.sep).join(\"/\"))\n }\n })\n return result\n}\n\n/**\n * Combines the given minimatch patterns (as consumed by `@electron/universal`'s `singleArchFiles`) into a\n * single pattern, merged with any user-provided pattern. Returns `userPattern` (possibly undefined) when empty.\n */\nexport function buildSingleArchFilesPattern(patterns: Iterable<string>, userPattern: string | undefined): string | undefined {\n const sorted = Array.from(new Set(patterns)).sort()\n if (sorted.length === 0) {\n return userPattern\n }\n const detected = sorted.length === 1 ? sorted[0] : `{${sorted.join(\",\")}}`\n return userPattern ? `{${userPattern},${detected}}` : detected\n}\n"]}
@@ -2,6 +2,7 @@ import { DebugLogger } from "builder-util";
2
2
  import { Nullish } from "builder-util-runtime";
3
3
  import { Lazy } from "lazy-val";
4
4
  import { Configuration } from "../../configuration.js";
5
+ export declare function createProjectMetadataLazy(projectDir: string): Lazy<Record<string, any> | null>;
5
6
  export declare function getConfig(projectDir: string, configPath: string | null, configFromOptions: Configuration | Nullish, packageMetadata?: Lazy<Record<string, any> | null>): Promise<Configuration>;
6
7
  /**
7
8
  * `doMergeConfigs` takes configs in the order you would pass them to
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/util/config/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAiE,MAAM,cAAc,CAAA;AAGzG,OAAO,EAAc,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAgCtD,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,iBAAiB,EAAE,aAAa,GAAG,OAAO,EAC1C,eAAe,GAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAyF,GACxI,OAAO,CAAC,aAAa,CAAC,CA0CxB;AAuGD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,CAgBtE;AAaD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,iBAwB1F;AAID,wBAAsB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBlH"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/util/config/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAiE,MAAM,cAAc,CAAA;AAGzG,OAAO,EAAc,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAgCtD,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAE9F;AAED,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,iBAAiB,EAAE,aAAa,GAAG,OAAO,EAC1C,eAAe,GAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAyC,GACxF,OAAO,CAAC,aAAa,CAAC,CA0CxB;AAuGD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,CAgBtE;AAaD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,iBAwB1F;AAID,wBAAsB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBlH"}
@@ -30,7 +30,10 @@ function mergePublish(config, configFromOptions) {
30
30
  deepAssign(listOnDisk[0], publish);
31
31
  }
32
32
  }
33
- export async function getConfig(projectDir, configPath, configFromOptions, packageMetadata = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, "package.json"))))) {
33
+ export function createProjectMetadataLazy(projectDir) {
34
+ return new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, "package.json"))));
35
+ }
36
+ export async function getConfig(projectDir, configPath, configFromOptions, packageMetadata = createProjectMetadataLazy(projectDir)) {
34
37
  const configRequest = { packageKey: "build", configFilename: "electron-builder", projectDir, packageMetadata };
35
38
  const configAndEffectiveFile = await _getConfig(configRequest, configPath);
36
39
  const config = configAndEffectiveFile == null ? {} : configAndEffectiveFile.result;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/util/config/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\"\nimport { DebugLogger, InvalidConfigurationError, log, safeStringifyJson, statOrNull } from \"builder-util\"\n\nconst _requireResolve = createRequire(import.meta.url).resolve\nimport { deepAssign, Nullish } from \"builder-util-runtime\"\n\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Configuration } from \"../../configuration.js\"\nimport { FileSet } from \"../../options/PlatformSpecificBuildOptions.js\"\nimport { reactCra } from \"../../presets/rectCra.js\"\nimport { PACKAGE_VERSION } from \"../../version.js\"\nimport { getConfig as _getConfig, loadParentConfig, orNullIfFileNotExist, ReadConfigRequest } from \"./load.js\"\nimport { validateSchema } from \"./schemaValidator.js\"\nimport _fsExtra from \"fs-extra\"\nconst { readJson } = _fsExtra\n\n// https://github.com/electron-userland/electron-builder/issues/1847\nfunction mergePublish(config: Configuration, configFromOptions: Configuration) {\n // if config from disk doesn't have publish (or object), no need to handle, it will be simply merged by deepAssign\n const publish = Array.isArray(config.publish) ? configFromOptions.publish : null\n if (publish != null) {\n delete (configFromOptions as any).publish\n }\n\n deepAssign(config, configFromOptions)\n\n if (publish == null) {\n return\n }\n\n const listOnDisk = config.publish as Array<any>\n if (listOnDisk.length === 0) {\n config.publish = publish\n } else {\n // apply to first\n deepAssign(listOnDisk[0], publish)\n }\n}\n\nexport async function getConfig(\n projectDir: string,\n configPath: string | null,\n configFromOptions: Configuration | Nullish,\n packageMetadata: Lazy<Record<string, any> | null> = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, \"package.json\"))))\n): Promise<Configuration> {\n const configRequest: ReadConfigRequest = { packageKey: \"build\", configFilename: \"electron-builder\", projectDir, packageMetadata }\n const configAndEffectiveFile = await _getConfig<Configuration>(configRequest, configPath)\n const config = configAndEffectiveFile == null ? {} : configAndEffectiveFile.result\n if (configFromOptions != null) {\n mergePublish(config, configFromOptions)\n }\n\n if (configAndEffectiveFile != null) {\n log.info({ file: configAndEffectiveFile.configFile == null ? 'package.json (\"build\" field)' : configAndEffectiveFile.configFile }, \"loaded configuration\")\n }\n\n if (config.extends == null && config.extends !== null) {\n const metadata = (await packageMetadata.value) || {}\n const devDependencies = metadata.devDependencies\n const dependencies = metadata.dependencies\n if ((dependencies != null && \"react-scripts\" in dependencies) || (devDependencies != null && \"react-scripts\" in devDependencies)) {\n config.extends = \"react-cra\"\n } else if (devDependencies != null && \"electron-webpack\" in devDependencies) {\n let file = \"electron-webpack/out/electron-builder.js\"\n try {\n file = _requireResolve(file)\n } catch (_ignore) {\n file = _requireResolve(\"electron-webpack/electron-builder.yml\")\n }\n config.extends = `file:${file}`\n }\n }\n\n const parentConfigs = await loadParentConfigsRecursively(config.extends, async configExtend => {\n if (configExtend === \"react-cra\") {\n const result = await reactCra(projectDir)\n log.info({ preset: configExtend }, \"loaded parent configuration\")\n return result\n } else {\n const { configFile, result } = await loadParentConfig<Configuration>(configRequest, configExtend)\n log.info({ file: configFile }, \"loaded parent configuration\")\n return result\n }\n })\n\n return doMergeConfigs([...parentConfigs, config])\n}\n\nfunction asArray(value: string[] | string | Nullish): string[] {\n return Array.isArray(value) ? value : typeof value === \"string\" ? [value] : []\n}\n\nasync function loadParentConfigsRecursively(configExtends: Configuration[\"extends\"], loader: (configExtend: string) => Promise<Configuration>): Promise<Configuration[]> {\n const configs = []\n\n for (const configExtend of asArray(configExtends)) {\n const result = await loader(configExtend)\n const parentConfigs = await loadParentConfigsRecursively(result.extends, loader)\n configs.push(...parentConfigs, result)\n }\n\n return configs\n}\n\n// normalize for easy merge\nfunction normalizeFiles(configuration: Configuration, name: \"files\" | \"extraFiles\" | \"extraResources\") {\n let value = configuration[name]\n if (value == null) {\n return\n }\n\n if (!Array.isArray(value)) {\n value = [value]\n }\n\n itemLoop: for (let i = 0; i < value.length; i++) {\n let item = value[i]\n if (typeof item === \"string\") {\n // merge with previous if possible\n if (i !== 0) {\n let prevItemIndex = i - 1\n let prevItem: FileSet\n do {\n prevItem = value[prevItemIndex--] as FileSet\n } while (prevItem == null)\n\n if (prevItem.from == null && prevItem.to == null) {\n if (prevItem.filter == null) {\n prevItem.filter = [item]\n } else {\n ;(prevItem.filter as Array<string>).push(item)\n }\n value[i] = null as any\n continue itemLoop\n }\n }\n\n item = {\n filter: [item],\n }\n value[i] = item\n } else if (Array.isArray(item)) {\n throw new Error(`${name} configuration is invalid, nested array not expected for index ${i}: ${item}`)\n }\n\n // make sure that merge logic is not complex - unify different presentations\n if (item.from === \".\") {\n item.from = undefined\n }\n\n if (item.to === \".\") {\n item.to = undefined\n }\n\n if (item.filter != null && typeof item.filter === \"string\") {\n item.filter = [item.filter]\n }\n }\n\n configuration[name] = value.filter(it => it != null)\n}\n\nfunction isSimilarFileSet(value: FileSet, other: FileSet): boolean {\n return value.from === other.from && value.to === other.to\n}\n\ntype Filter = FileSet[\"filter\"]\n\nfunction mergeFilters(value: Filter, other: Filter): string[] {\n return asArray(value).concat(asArray(other))\n}\n\nfunction mergeFileSets(lists: FileSet[][]): FileSet[] {\n const result: FileSet[] = []\n\n for (const list of lists) {\n for (const item of list) {\n const existingItem = result.find(i => isSimilarFileSet(i, item))\n if (existingItem) {\n existingItem.filter = mergeFilters(item.filter, existingItem.filter)\n } else {\n result.push(item)\n }\n }\n }\n\n return result\n}\n\n/**\n * `doMergeConfigs` takes configs in the order you would pass them to\n * Object.assign as sources.\n */\nexport function doMergeConfigs(configs: Configuration[]): Configuration {\n for (const config of configs) {\n normalizeFiles(config, \"files\")\n normalizeFiles(config, \"extraFiles\")\n normalizeFiles(config, \"extraResources\")\n }\n\n const result = deepAssign(getDefaultConfig(), ...configs)\n\n // `deepAssign` prioritises latter configs, while `mergeFilesSets` prioritises\n // former configs, so we have to reverse the order, because latter configs\n // must have higher priority.\n configs = configs.slice().reverse()\n\n result.files = mergeFileSets(configs.map(config => (config.files ?? []) as FileSet[]))\n return result\n}\n\nfunction getDefaultConfig(): Configuration {\n return {\n directories: {\n output: \"dist\",\n buildResources: \"build\",\n },\n }\n}\n\nconst schemeDataPromise = new Lazy(() => readJson(path.join(import.meta.dirname, \"..\", \"..\", \"..\", \"scheme.json\")))\n\nexport async function validateConfiguration(config: Configuration, debugLogger: DebugLogger) {\n validateSchema(await schemeDataPromise.value, config, {\n name: `electron-builder ${PACKAGE_VERSION}`,\n postFormatter: (formattedError, error): string => {\n if (debugLogger.isEnabled) {\n debugLogger.add(\"invalidConfig\", safeStringifyJson(error))\n }\n\n const site = \"https://www.electron.build\"\n let url = `${site}/configuration`\n const targets = new Set([\"mac\", \"dmg\", \"pkg\", \"mas\", \"win\", \"nsis\", \"appx\", \"linux\", \"appimage\", \"snap\"])\n const firstSegment = (error.instancePath ?? \"\").split(\"/\").filter(Boolean)[0]?.toLowerCase()\n if (firstSegment != null && targets.has(firstSegment)) {\n url = `${site}/${firstSegment}`\n }\n\n return `${formattedError}\\n How to fix:\n 1. Open ${url}\n 2. Search the option name on the page (or type in into Search to find across the docs).\n * Not found? The option was deprecated or not exists (check spelling).\n * Found? Check that the option in the appropriate place. e.g. \"title\" only in the \"dmg\", not in the root.\n`\n },\n })\n}\n\nconst DEFAULT_APP_DIR_NAMES = [\"app\", \"www\"]\n\nexport async function computeDefaultAppDirectory(projectDir: string, userAppDir: string | Nullish): Promise<string> {\n if (userAppDir != null) {\n const absolutePath = path.resolve(projectDir, userAppDir)\n const stat = await statOrNull(absolutePath)\n if (stat == null) {\n throw new InvalidConfigurationError(`Application directory ${userAppDir} doesn't exist`)\n } else if (!stat.isDirectory()) {\n throw new InvalidConfigurationError(`Application directory ${userAppDir} is not a directory`)\n } else if (projectDir === absolutePath) {\n log.warn({ appDirectory: userAppDir }, `Specified application directory equals to project dir — superfluous or wrong configuration`)\n }\n return absolutePath\n }\n\n for (const dir of DEFAULT_APP_DIR_NAMES) {\n const absolutePath = path.join(projectDir, dir)\n const packageJson = path.join(absolutePath, \"package.json\")\n const stat = await statOrNull(packageJson)\n if (stat != null && stat.isFile()) {\n return absolutePath\n }\n }\n return projectDir\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/util/config/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\"\nimport { DebugLogger, InvalidConfigurationError, log, safeStringifyJson, statOrNull } from \"builder-util\"\n\nconst _requireResolve = createRequire(import.meta.url).resolve\nimport { deepAssign, Nullish } from \"builder-util-runtime\"\n\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Configuration } from \"../../configuration.js\"\nimport { FileSet } from \"../../options/PlatformSpecificBuildOptions.js\"\nimport { reactCra } from \"../../presets/rectCra.js\"\nimport { PACKAGE_VERSION } from \"../../version.js\"\nimport { getConfig as _getConfig, loadParentConfig, orNullIfFileNotExist, ReadConfigRequest } from \"./load.js\"\nimport { validateSchema } from \"./schemaValidator.js\"\nimport _fsExtra from \"fs-extra\"\nconst { readJson } = _fsExtra\n\n// https://github.com/electron-userland/electron-builder/issues/1847\nfunction mergePublish(config: Configuration, configFromOptions: Configuration) {\n // if config from disk doesn't have publish (or object), no need to handle, it will be simply merged by deepAssign\n const publish = Array.isArray(config.publish) ? configFromOptions.publish : null\n if (publish != null) {\n delete (configFromOptions as any).publish\n }\n\n deepAssign(config, configFromOptions)\n\n if (publish == null) {\n return\n }\n\n const listOnDisk = config.publish as Array<any>\n if (listOnDisk.length === 0) {\n config.publish = publish\n } else {\n // apply to first\n deepAssign(listOnDisk[0], publish)\n }\n}\n\nexport function createProjectMetadataLazy(projectDir: string): Lazy<Record<string, any> | null> {\n return new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, \"package.json\"))))\n}\n\nexport async function getConfig(\n projectDir: string,\n configPath: string | null,\n configFromOptions: Configuration | Nullish,\n packageMetadata: Lazy<Record<string, any> | null> = createProjectMetadataLazy(projectDir)\n): Promise<Configuration> {\n const configRequest: ReadConfigRequest = { packageKey: \"build\", configFilename: \"electron-builder\", projectDir, packageMetadata }\n const configAndEffectiveFile = await _getConfig<Configuration>(configRequest, configPath)\n const config = configAndEffectiveFile == null ? {} : configAndEffectiveFile.result\n if (configFromOptions != null) {\n mergePublish(config, configFromOptions)\n }\n\n if (configAndEffectiveFile != null) {\n log.info({ file: configAndEffectiveFile.configFile == null ? 'package.json (\"build\" field)' : configAndEffectiveFile.configFile }, \"loaded configuration\")\n }\n\n if (config.extends == null && config.extends !== null) {\n const metadata = (await packageMetadata.value) || {}\n const devDependencies = metadata.devDependencies\n const dependencies = metadata.dependencies\n if ((dependencies != null && \"react-scripts\" in dependencies) || (devDependencies != null && \"react-scripts\" in devDependencies)) {\n config.extends = \"react-cra\"\n } else if (devDependencies != null && \"electron-webpack\" in devDependencies) {\n let file = \"electron-webpack/out/electron-builder.js\"\n try {\n file = _requireResolve(file)\n } catch (_ignore) {\n file = _requireResolve(\"electron-webpack/electron-builder.yml\")\n }\n config.extends = `file:${file}`\n }\n }\n\n const parentConfigs = await loadParentConfigsRecursively(config.extends, async configExtend => {\n if (configExtend === \"react-cra\") {\n const result = await reactCra(projectDir)\n log.info({ preset: configExtend }, \"loaded parent configuration\")\n return result\n } else {\n const { configFile, result } = await loadParentConfig<Configuration>(configRequest, configExtend)\n log.info({ file: configFile }, \"loaded parent configuration\")\n return result\n }\n })\n\n return doMergeConfigs([...parentConfigs, config])\n}\n\nfunction asArray(value: string[] | string | Nullish): string[] {\n return Array.isArray(value) ? value : typeof value === \"string\" ? [value] : []\n}\n\nasync function loadParentConfigsRecursively(configExtends: Configuration[\"extends\"], loader: (configExtend: string) => Promise<Configuration>): Promise<Configuration[]> {\n const configs = []\n\n for (const configExtend of asArray(configExtends)) {\n const result = await loader(configExtend)\n const parentConfigs = await loadParentConfigsRecursively(result.extends, loader)\n configs.push(...parentConfigs, result)\n }\n\n return configs\n}\n\n// normalize for easy merge\nfunction normalizeFiles(configuration: Configuration, name: \"files\" | \"extraFiles\" | \"extraResources\") {\n let value = configuration[name]\n if (value == null) {\n return\n }\n\n if (!Array.isArray(value)) {\n value = [value]\n }\n\n itemLoop: for (let i = 0; i < value.length; i++) {\n let item = value[i]\n if (typeof item === \"string\") {\n // merge with previous if possible\n if (i !== 0) {\n let prevItemIndex = i - 1\n let prevItem: FileSet\n do {\n prevItem = value[prevItemIndex--] as FileSet\n } while (prevItem == null)\n\n if (prevItem.from == null && prevItem.to == null) {\n if (prevItem.filter == null) {\n prevItem.filter = [item]\n } else {\n ;(prevItem.filter as Array<string>).push(item)\n }\n value[i] = null as any\n continue itemLoop\n }\n }\n\n item = {\n filter: [item],\n }\n value[i] = item\n } else if (Array.isArray(item)) {\n throw new Error(`${name} configuration is invalid, nested array not expected for index ${i}: ${item}`)\n }\n\n // make sure that merge logic is not complex - unify different presentations\n if (item.from === \".\") {\n item.from = undefined\n }\n\n if (item.to === \".\") {\n item.to = undefined\n }\n\n if (item.filter != null && typeof item.filter === \"string\") {\n item.filter = [item.filter]\n }\n }\n\n configuration[name] = value.filter(it => it != null)\n}\n\nfunction isSimilarFileSet(value: FileSet, other: FileSet): boolean {\n return value.from === other.from && value.to === other.to\n}\n\ntype Filter = FileSet[\"filter\"]\n\nfunction mergeFilters(value: Filter, other: Filter): string[] {\n return asArray(value).concat(asArray(other))\n}\n\nfunction mergeFileSets(lists: FileSet[][]): FileSet[] {\n const result: FileSet[] = []\n\n for (const list of lists) {\n for (const item of list) {\n const existingItem = result.find(i => isSimilarFileSet(i, item))\n if (existingItem) {\n existingItem.filter = mergeFilters(item.filter, existingItem.filter)\n } else {\n result.push(item)\n }\n }\n }\n\n return result\n}\n\n/**\n * `doMergeConfigs` takes configs in the order you would pass them to\n * Object.assign as sources.\n */\nexport function doMergeConfigs(configs: Configuration[]): Configuration {\n for (const config of configs) {\n normalizeFiles(config, \"files\")\n normalizeFiles(config, \"extraFiles\")\n normalizeFiles(config, \"extraResources\")\n }\n\n const result = deepAssign(getDefaultConfig(), ...configs)\n\n // `deepAssign` prioritises latter configs, while `mergeFilesSets` prioritises\n // former configs, so we have to reverse the order, because latter configs\n // must have higher priority.\n configs = configs.slice().reverse()\n\n result.files = mergeFileSets(configs.map(config => (config.files ?? []) as FileSet[]))\n return result\n}\n\nfunction getDefaultConfig(): Configuration {\n return {\n directories: {\n output: \"dist\",\n buildResources: \"build\",\n },\n }\n}\n\nconst schemeDataPromise = new Lazy(() => readJson(path.join(import.meta.dirname, \"..\", \"..\", \"..\", \"scheme.json\")))\n\nexport async function validateConfiguration(config: Configuration, debugLogger: DebugLogger) {\n validateSchema(await schemeDataPromise.value, config, {\n name: `electron-builder ${PACKAGE_VERSION}`,\n postFormatter: (formattedError, error): string => {\n if (debugLogger.isEnabled) {\n debugLogger.add(\"invalidConfig\", safeStringifyJson(error))\n }\n\n const site = \"https://www.electron.build\"\n let url = `${site}/configuration`\n const targets = new Set([\"mac\", \"dmg\", \"pkg\", \"mas\", \"win\", \"nsis\", \"appx\", \"linux\", \"appimage\", \"snap\"])\n const firstSegment = (error.instancePath ?? \"\").split(\"/\").filter(Boolean)[0]?.toLowerCase()\n if (firstSegment != null && targets.has(firstSegment)) {\n url = `${site}/${firstSegment}`\n }\n\n return `${formattedError}\\n How to fix:\n 1. Open ${url}\n 2. Search the option name on the page (or type in into Search to find across the docs).\n * Not found? The option was deprecated or not exists (check spelling).\n * Found? Check that the option in the appropriate place. e.g. \"title\" only in the \"dmg\", not in the root.\n`\n },\n })\n}\n\nconst DEFAULT_APP_DIR_NAMES = [\"app\", \"www\"]\n\nexport async function computeDefaultAppDirectory(projectDir: string, userAppDir: string | Nullish): Promise<string> {\n if (userAppDir != null) {\n const absolutePath = path.resolve(projectDir, userAppDir)\n const stat = await statOrNull(absolutePath)\n if (stat == null) {\n throw new InvalidConfigurationError(`Application directory ${userAppDir} doesn't exist`)\n } else if (!stat.isDirectory()) {\n throw new InvalidConfigurationError(`Application directory ${userAppDir} is not a directory`)\n } else if (projectDir === absolutePath) {\n log.warn({ appDirectory: userAppDir }, `Specified application directory equals to project dir — superfluous or wrong configuration`)\n }\n return absolutePath\n }\n\n for (const dir of DEFAULT_APP_DIR_NAMES) {\n const absolutePath = path.join(projectDir, dir)\n const packageJson = path.join(absolutePath, \"package.json\")\n const stat = await statOrNull(packageJson)\n if (stat != null && stat.isFile()) {\n return absolutePath\n }\n }\n return projectDir\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { orNullIfFileNotExist } from "builder-util";
1
2
  import { DotenvParseInput } from "dotenv-expand";
2
3
  import { Lazy } from "lazy-val";
3
4
  export interface ReadConfigResult<T> {
@@ -5,8 +6,7 @@ export interface ReadConfigResult<T> {
5
6
  readonly configFile: string | null;
6
7
  }
7
8
  export declare function findAndReadConfig<T>(request: ReadConfigRequest): Promise<ReadConfigResult<T> | null>;
8
- export declare function orNullIfFileNotExist<T>(promise: Promise<T>): Promise<T | null>;
9
- export declare function orIfFileNotExist<T>(promise: Promise<T>, fallbackValue: T): Promise<T>;
9
+ export { orNullIfFileNotExist };
10
10
  export interface ReadConfigRequest {
11
11
  packageKey: string;
12
12
  configFilename: string;
@@ -1 +1 @@
1
- {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/util/config/load.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAU,MAAM,eAAe,CAAA;AAIxD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAM/B,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CACnC;AAiCD,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAU1G;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAE9E;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOrF;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IAEtB,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;CACzD;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CASnG;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAMxH;AAED,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CA0BhH;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,oCAgB5C"}
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/util/config/load.ts"],"names":[],"mappings":"AACA,OAAO,EAAO,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAIxD,OAAO,EAAE,gBAAgB,EAAU,MAAM,eAAe,CAAA;AAIxD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAM/B,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CACnC;AAiCD,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAU1G;AAGD,OAAO,EAAE,oBAAoB,EAAE,CAAA;AAE/B,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IAEtB,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;CACzD;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CASnG;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAMxH;AAED,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CA0BhH;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,oCAgB5C"}
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from "node:module";
2
- import { log } from "builder-util";
2
+ import { log, orNullIfFileNotExist } from "builder-util";
3
3
  const require = createRequire(import.meta.url);
4
4
  import { parse as parseEnv } from "dotenv";
5
5
  import { expand } from "dotenv-expand";
@@ -52,17 +52,8 @@ export async function findAndReadConfig(request) {
52
52
  }
53
53
  return null;
54
54
  }
55
- export function orNullIfFileNotExist(promise) {
56
- return orIfFileNotExist(promise, null);
57
- }
58
- export function orIfFileNotExist(promise, fallbackValue) {
59
- return promise.catch(e => {
60
- if (e.code === "ENOENT" || e.code === "ENOTDIR") {
61
- return fallbackValue;
62
- }
63
- throw e;
64
- });
65
- }
55
+ // re-exported for downstream consumers (indexInternal.ts, config.ts, electronVersion.ts) that historically imported it from here
56
+ export { orNullIfFileNotExist };
66
57
  export async function loadConfig(request) {
67
58
  let packageMetadata = request.packageMetadata == null ? null : await request.packageMetadata.value;
68
59
  if (packageMetadata == null) {
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/util/config/load.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\"\nimport { log } from \"builder-util\"\n\nconst require = createRequire(import.meta.url)\nimport { parse as parseEnv } from \"dotenv\"\nimport { DotenvParseInput, expand } from \"dotenv-expand\"\nimport { promises as fs } from \"fs\"\nimport { createJiti } from \"jiti\"\nimport { load } from \"js-yaml\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { resolveModule } from \"../resolve.js\"\n\nconst jiti = createJiti(import.meta.filename)\n\nexport interface ReadConfigResult<T> {\n readonly result: T\n readonly configFile: string | null\n}\n\nasync function readConfig<T>(configFile: string, request: ReadConfigRequest): Promise<ReadConfigResult<T>> {\n const data = await fs.readFile(configFile, \"utf8\")\n let result: any\n if (configFile.endsWith(\".json5\") || configFile.endsWith(\".json\")) {\n result = require(\"json5\").parse(data)\n } else if (configFile.endsWith(\".js\") || configFile.endsWith(\".cjs\") || configFile.endsWith(\".mjs\")) {\n const json = await orNullIfFileNotExist(fs.readFile(path.join(process.cwd(), \"package.json\"), \"utf8\"))\n const moduleType = json === null ? null : JSON.parse(json).type\n result = await resolveModule(moduleType, configFile)\n if (result.default != null) {\n result = result.default\n }\n if (typeof result === \"function\") {\n result = result(request)\n }\n result = await Promise.resolve(result)\n } else if (configFile.endsWith(\".ts\")) {\n result = await jiti.import(configFile, { default: true })\n\n if (typeof result === \"function\") {\n result = result(request)\n }\n result = await Promise.resolve(result)\n } else if (configFile.endsWith(\".toml\")) {\n result = require(\"toml\").parse(data)\n } else {\n result = load(data)\n }\n return { result, configFile }\n}\n\nexport async function findAndReadConfig<T>(request: ReadConfigRequest): Promise<ReadConfigResult<T> | null> {\n const prefix = request.configFilename\n for (const configFile of [`${prefix}.yml`, `${prefix}.yaml`, `${prefix}.json`, `${prefix}.json5`, `${prefix}.toml`, `${prefix}.js`, `${prefix}.cjs`, `${prefix}.ts`]) {\n const data = await orNullIfFileNotExist(readConfig<T>(path.join(request.projectDir, configFile), request))\n if (data != null) {\n return data\n }\n }\n\n return null\n}\n\nexport function orNullIfFileNotExist<T>(promise: Promise<T>): Promise<T | null> {\n return orIfFileNotExist(promise, null)\n}\n\nexport function orIfFileNotExist<T>(promise: Promise<T>, fallbackValue: T): Promise<T> {\n return promise.catch(e => {\n if (e.code === \"ENOENT\" || e.code === \"ENOTDIR\") {\n return fallbackValue\n }\n throw e\n })\n}\n\nexport interface ReadConfigRequest {\n packageKey: string\n configFilename: string\n\n projectDir: string\n packageMetadata: Lazy<Record<string, any> | null> | null\n}\n\nexport async function loadConfig<T>(request: ReadConfigRequest): Promise<ReadConfigResult<T> | null> {\n let packageMetadata = request.packageMetadata == null ? null : await request.packageMetadata.value\n if (packageMetadata == null) {\n const json = await orNullIfFileNotExist(fs.readFile(path.join(request.projectDir, \"package.json\"), \"utf8\"))\n packageMetadata = json == null ? null : JSON.parse(json)\n }\n\n const data: T = packageMetadata == null ? null : packageMetadata[request.packageKey]\n return data == null ? findAndReadConfig<T>(request) : { result: data, configFile: null }\n}\n\nexport function getConfig<T>(request: ReadConfigRequest, configPath?: string | null): Promise<ReadConfigResult<T> | null> {\n if (configPath == null) {\n return loadConfig<T>(request)\n } else {\n return readConfig<T>(path.resolve(request.projectDir, configPath), request)\n }\n}\n\nexport async function loadParentConfig<T>(request: ReadConfigRequest, spec: string): Promise<ReadConfigResult<T>> {\n let isFileSpec: boolean | undefined\n if (spec.startsWith(\"file:\")) {\n spec = spec.substring(\"file:\".length)\n isFileSpec = true\n }\n\n let parentConfig = await orNullIfFileNotExist(readConfig<T>(path.resolve(request.projectDir, spec), request))\n if (parentConfig == null && isFileSpec !== true) {\n let resolved: string | null = null\n try {\n resolved = require.resolve(spec)\n } catch (_e) {\n // ignore\n }\n\n if (resolved != null) {\n parentConfig = await readConfig<T>(resolved, request)\n }\n }\n\n if (parentConfig == null) {\n throw new Error(`Cannot find parent config file: ${spec}`)\n }\n\n return parentConfig\n}\n\nexport async function loadEnv(envFile: string) {\n const data = await orNullIfFileNotExist(fs.readFile(envFile, \"utf8\"))\n if (data == null) {\n return null\n }\n\n const parsed = parseEnv<DotenvParseInput>(data)\n\n log.info({ envFile }, \"injecting environment\")\n Object.entries(parsed).forEach(([key, value]) => {\n if (!Object.prototype.hasOwnProperty.call(process.env, key)) {\n process.env[key] = value\n }\n })\n expand({ parsed })\n return parsed\n}\n"]}
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/util/config/load.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\"\nimport { log, orNullIfFileNotExist } from \"builder-util\"\n\nconst require = createRequire(import.meta.url)\nimport { parse as parseEnv } from \"dotenv\"\nimport { DotenvParseInput, expand } from \"dotenv-expand\"\nimport { promises as fs } from \"fs\"\nimport { createJiti } from \"jiti\"\nimport { load } from \"js-yaml\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { resolveModule } from \"../resolve.js\"\n\nconst jiti = createJiti(import.meta.filename)\n\nexport interface ReadConfigResult<T> {\n readonly result: T\n readonly configFile: string | null\n}\n\nasync function readConfig<T>(configFile: string, request: ReadConfigRequest): Promise<ReadConfigResult<T>> {\n const data = await fs.readFile(configFile, \"utf8\")\n let result: any\n if (configFile.endsWith(\".json5\") || configFile.endsWith(\".json\")) {\n result = require(\"json5\").parse(data)\n } else if (configFile.endsWith(\".js\") || configFile.endsWith(\".cjs\") || configFile.endsWith(\".mjs\")) {\n const json = await orNullIfFileNotExist(fs.readFile(path.join(process.cwd(), \"package.json\"), \"utf8\"))\n const moduleType = json === null ? null : JSON.parse(json).type\n result = await resolveModule(moduleType, configFile)\n if (result.default != null) {\n result = result.default\n }\n if (typeof result === \"function\") {\n result = result(request)\n }\n result = await Promise.resolve(result)\n } else if (configFile.endsWith(\".ts\")) {\n result = await jiti.import(configFile, { default: true })\n\n if (typeof result === \"function\") {\n result = result(request)\n }\n result = await Promise.resolve(result)\n } else if (configFile.endsWith(\".toml\")) {\n result = require(\"toml\").parse(data)\n } else {\n result = load(data)\n }\n return { result, configFile }\n}\n\nexport async function findAndReadConfig<T>(request: ReadConfigRequest): Promise<ReadConfigResult<T> | null> {\n const prefix = request.configFilename\n for (const configFile of [`${prefix}.yml`, `${prefix}.yaml`, `${prefix}.json`, `${prefix}.json5`, `${prefix}.toml`, `${prefix}.js`, `${prefix}.cjs`, `${prefix}.ts`]) {\n const data = await orNullIfFileNotExist(readConfig<T>(path.join(request.projectDir, configFile), request))\n if (data != null) {\n return data\n }\n }\n\n return null\n}\n\n// re-exported for downstream consumers (indexInternal.ts, config.ts, electronVersion.ts) that historically imported it from here\nexport { orNullIfFileNotExist }\n\nexport interface ReadConfigRequest {\n packageKey: string\n configFilename: string\n\n projectDir: string\n packageMetadata: Lazy<Record<string, any> | null> | null\n}\n\nexport async function loadConfig<T>(request: ReadConfigRequest): Promise<ReadConfigResult<T> | null> {\n let packageMetadata = request.packageMetadata == null ? null : await request.packageMetadata.value\n if (packageMetadata == null) {\n const json = await orNullIfFileNotExist(fs.readFile(path.join(request.projectDir, \"package.json\"), \"utf8\"))\n packageMetadata = json == null ? null : JSON.parse(json)\n }\n\n const data: T = packageMetadata == null ? null : packageMetadata[request.packageKey]\n return data == null ? findAndReadConfig<T>(request) : { result: data, configFile: null }\n}\n\nexport function getConfig<T>(request: ReadConfigRequest, configPath?: string | null): Promise<ReadConfigResult<T> | null> {\n if (configPath == null) {\n return loadConfig<T>(request)\n } else {\n return readConfig<T>(path.resolve(request.projectDir, configPath), request)\n }\n}\n\nexport async function loadParentConfig<T>(request: ReadConfigRequest, spec: string): Promise<ReadConfigResult<T>> {\n let isFileSpec: boolean | undefined\n if (spec.startsWith(\"file:\")) {\n spec = spec.substring(\"file:\".length)\n isFileSpec = true\n }\n\n let parentConfig = await orNullIfFileNotExist(readConfig<T>(path.resolve(request.projectDir, spec), request))\n if (parentConfig == null && isFileSpec !== true) {\n let resolved: string | null = null\n try {\n resolved = require.resolve(spec)\n } catch (_e) {\n // ignore\n }\n\n if (resolved != null) {\n parentConfig = await readConfig<T>(resolved, request)\n }\n }\n\n if (parentConfig == null) {\n throw new Error(`Cannot find parent config file: ${spec}`)\n }\n\n return parentConfig\n}\n\nexport async function loadEnv(envFile: string) {\n const data = await orNullIfFileNotExist(fs.readFile(envFile, \"utf8\"))\n if (data == null) {\n return null\n }\n\n const parsed = parseEnv<DotenvParseInput>(data)\n\n log.info({ envFile }, \"injecting environment\")\n Object.entries(parsed).forEach(([key, value]) => {\n if (!Object.prototype.hasOwnProperty.call(process.env, key)) {\n process.env[key] = value\n }\n })\n expand({ parsed })\n return parsed\n}\n"]}
@@ -31,7 +31,7 @@ export function validateSchema(schema, data, config = {}) {
31
31
  const guidance = [
32
32
  `Please check the documentation to ensure that your configuration matches the expected schema: https://www.electron.build/configuration`,
33
33
  `If you recently upgraded electron-builder to v27, please run \`electron-builder migrate-schema\` to automatically update your configuration.`,
34
- `Check the release notes for breaking changes: https://www.electron.build/docs/migration/v26-to-v27`,
34
+ `Check the release notes for breaking changes: https://www.electron.build/docs/migration/v27-breaking-changes`,
35
35
  ];
36
36
  throw new Error(`${header}\n${formatted.join("\n")}\n${guidance.join("\n")}`);
37
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schemaValidator.js","sourceRoot":"","sources":["../../../src/util/config/schemaValidator.ts"],"names":[],"mappings":"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","sourcesContent":["import { Ajv, ErrorObject, ValidateFunction } from \"ajv\"\n\nexport type PostFormatter = (formattedError: string, error: ErrorObject) => string\n\nexport interface ValidationConfig {\n name?: string\n postFormatter?: PostFormatter\n}\n\nconst ajv = new Ajv({\n allErrors: true,\n verbose: true,\n coerceTypes: true,\n strict: false,\n})\n\n// Cache the compiled validator for the canonical scheme.json so it is only\n// compiled once per process lifetime.\nlet _cachedValidate: ValidateFunction | undefined\n\nexport function validateSchema(schema: unknown, data: unknown, config: ValidationConfig = {}): void {\n if (_cachedValidate == null || _cachedValidate.schema !== schema) {\n _cachedValidate = ajv.compile(schema as object)\n }\n const validate = _cachedValidate\n\n if (validate(data)) {\n return\n }\n\n const errors = validate.errors ?? []\n const baseDataPath = \"configuration\"\n const name = config.name ?? \"Object\"\n\n const relevant = filterRelevantErrors(errors)\n const formatted = relevant.map(error => {\n let msg = formatError(error, baseDataPath)\n if (config.postFormatter != null) {\n msg = config.postFormatter(msg, error)\n }\n return ` - ${indentNewlines(msg, \" \")}`\n })\n\n const header = `Invalid configuration object. ${name} has been initialized using a configuration object that does not match the API schema.`\n const guidance = [\n `Please check the documentation to ensure that your configuration matches the expected schema: https://www.electron.build/configuration`,\n `If you recently upgraded electron-builder to v27, please run \\`electron-builder migrate-schema\\` to automatically update your configuration.`,\n `Check the release notes for breaking changes: https://www.electron.build/docs/migration/v26-to-v27`,\n ]\n throw new Error(`${header}\\n${formatted.join(\"\\n\")}\\n${guidance.join(\"\\n\")}`)\n}\n\n/**\n * Filters the flat list of ajv errors to the most actionable subset.\n * Composite keywords (anyOf/oneOf/if) are suppressed when more specific\n * errors exist at the same or deeper paths. When all errors share the\n * same instancePath and a composite parent for that path exists, the\n * parent is kept instead so the user sees a single \"should be one of\"\n * message rather than every failed branch listed separately.\n */\nfunction filterRelevantErrors(errors: ErrorObject[]): ErrorObject[] {\n const compositeKeywords = new Set([\"anyOf\", \"oneOf\", \"if\"])\n const specific = errors.filter(e => !compositeKeywords.has(e.keyword))\n\n if (specific.length === 0) {\n return errors.filter(e => compositeKeywords.has(e.keyword))\n }\n\n // Group specific errors by instancePath\n const byPath = new Map<string, ErrorObject[]>()\n for (const e of specific) {\n const list = byPath.get(e.instancePath)\n if (list != null) {\n list.push(e)\n } else {\n byPath.set(e.instancePath, [e])\n }\n }\n\n const result: ErrorObject[] = []\n for (const [path, group] of byPath) {\n if (group.length > 1) {\n // additionalProperties errors are the most actionable (\"has unknown\n // property X\") — prefer them over anyOf-parent collapse or type noise.\n const additionalProps = group.filter(e => e.keyword === \"additionalProperties\")\n if (additionalProps.length > 0) {\n result.push(...additionalProps)\n continue\n }\n // For other multi-error groups, prefer the anyOf parent (one concise\n // \"should be one of these\" message).\n const parent = errors.find(e => e.instancePath === path && compositeKeywords.has(e.keyword))\n if (parent != null) {\n result.push(parent)\n continue\n }\n }\n result.push(...group)\n }\n return result\n}\n\n/** Decodes a single RFC 6901 JSON Pointer segment (`~1` → `/`, `~0` → `~`). */\nfunction decodePointerSegment(segment: string): string {\n return segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\")\n}\n\nfunction instancePathToLabel(instancePath: string, baseDataPath: string): string {\n if (!instancePath) {\n return baseDataPath\n }\n const segments = instancePath.split(\"/\").filter(Boolean).map(decodePointerSegment)\n return [baseDataPath, ...segments].join(\".\")\n}\n\nfunction formatError(error: ErrorObject, baseDataPath: string): string {\n const label = instancePathToLabel(error.instancePath, baseDataPath)\n const params = error.params as Record<string, unknown>\n const parentSchema = (error as ErrorObject & { parentSchema?: Record<string, unknown> }).parentSchema\n\n switch (error.keyword) {\n case \"additionalProperties\":\n return `${label} has an unknown property '${params.additionalProperty}'`\n\n case \"required\": {\n const missingProp = String(params.missingProperty).replace(/^\\./, \"\")\n return `${label} misses the property '${missingProp}'`\n }\n\n case \"type\": {\n const type = params.type\n if (Array.isArray(type)) {\n const typeList = (type as string[]).join(\" | \")\n const desc = descriptionSuffix(parentSchema)\n return `${label} should be:\\n${typeList}${desc}`\n }\n return `${label} should be a ${type}`\n }\n\n case \"enum\": {\n const enumVals = (parentSchema?.enum as unknown[] | undefined) ?? []\n if (enumVals.length === 1) {\n return `${label} should be ${JSON.stringify(enumVals[0])}`\n }\n return `${label} should be one of these:\\n${enumVals.map(v => JSON.stringify(v)).join(\" | \")}`\n }\n\n case \"anyOf\":\n case \"oneOf\": {\n const schemaText = formatSchemaType(parentSchema)\n return `${label} should be one of these:\\n${schemaText}`\n }\n\n default:\n return `${label} ${error.message}`\n }\n}\n\nfunction descriptionSuffix(schema: Record<string, unknown> | undefined): string {\n return typeof schema?.description === \"string\" ? `\\n-> ${schema.description}` : \"\"\n}\n\nfunction formatSchemaType(schema: Record<string, unknown> | undefined): string {\n if (schema == null) {\n return \"\"\n }\n if (Array.isArray(schema.type)) {\n return (schema.type as string[]).join(\" | \")\n }\n if (typeof schema.type === \"string\") {\n return schema.type\n }\n if (Array.isArray(schema.anyOf)) {\n return (schema.anyOf as Array<Record<string, unknown>>)\n .map(s => {\n if (Array.isArray(s.type)) {\n return (s.type as string[]).join(\" | \")\n }\n return typeof s.type === \"string\" ? s.type : \"\"\n })\n .filter(Boolean)\n .join(\" | \")\n }\n return JSON.stringify(schema)\n}\n\nfunction indentNewlines(str: string, prefix: string): string {\n return str.replace(/\\n(?!$)/g, `\\n${prefix}`)\n}\n"]}
1
+ {"version":3,"file":"schemaValidator.js","sourceRoot":"","sources":["../../../src/util/config/schemaValidator.ts"],"names":[],"mappings":"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","sourcesContent":["import { Ajv, ErrorObject, ValidateFunction } from \"ajv\"\n\nexport type PostFormatter = (formattedError: string, error: ErrorObject) => string\n\nexport interface ValidationConfig {\n name?: string\n postFormatter?: PostFormatter\n}\n\nconst ajv = new Ajv({\n allErrors: true,\n verbose: true,\n coerceTypes: true,\n strict: false,\n})\n\n// Cache the compiled validator for the canonical scheme.json so it is only\n// compiled once per process lifetime.\nlet _cachedValidate: ValidateFunction | undefined\n\nexport function validateSchema(schema: unknown, data: unknown, config: ValidationConfig = {}): void {\n if (_cachedValidate == null || _cachedValidate.schema !== schema) {\n _cachedValidate = ajv.compile(schema as object)\n }\n const validate = _cachedValidate\n\n if (validate(data)) {\n return\n }\n\n const errors = validate.errors ?? []\n const baseDataPath = \"configuration\"\n const name = config.name ?? \"Object\"\n\n const relevant = filterRelevantErrors(errors)\n const formatted = relevant.map(error => {\n let msg = formatError(error, baseDataPath)\n if (config.postFormatter != null) {\n msg = config.postFormatter(msg, error)\n }\n return ` - ${indentNewlines(msg, \" \")}`\n })\n\n const header = `Invalid configuration object. ${name} has been initialized using a configuration object that does not match the API schema.`\n const guidance = [\n `Please check the documentation to ensure that your configuration matches the expected schema: https://www.electron.build/configuration`,\n `If you recently upgraded electron-builder to v27, please run \\`electron-builder migrate-schema\\` to automatically update your configuration.`,\n `Check the release notes for breaking changes: https://www.electron.build/docs/migration/v27-breaking-changes`,\n ]\n throw new Error(`${header}\\n${formatted.join(\"\\n\")}\\n${guidance.join(\"\\n\")}`)\n}\n\n/**\n * Filters the flat list of ajv errors to the most actionable subset.\n * Composite keywords (anyOf/oneOf/if) are suppressed when more specific\n * errors exist at the same or deeper paths. When all errors share the\n * same instancePath and a composite parent for that path exists, the\n * parent is kept instead so the user sees a single \"should be one of\"\n * message rather than every failed branch listed separately.\n */\nfunction filterRelevantErrors(errors: ErrorObject[]): ErrorObject[] {\n const compositeKeywords = new Set([\"anyOf\", \"oneOf\", \"if\"])\n const specific = errors.filter(e => !compositeKeywords.has(e.keyword))\n\n if (specific.length === 0) {\n return errors.filter(e => compositeKeywords.has(e.keyword))\n }\n\n // Group specific errors by instancePath\n const byPath = new Map<string, ErrorObject[]>()\n for (const e of specific) {\n const list = byPath.get(e.instancePath)\n if (list != null) {\n list.push(e)\n } else {\n byPath.set(e.instancePath, [e])\n }\n }\n\n const result: ErrorObject[] = []\n for (const [path, group] of byPath) {\n if (group.length > 1) {\n // additionalProperties errors are the most actionable (\"has unknown\n // property X\") — prefer them over anyOf-parent collapse or type noise.\n const additionalProps = group.filter(e => e.keyword === \"additionalProperties\")\n if (additionalProps.length > 0) {\n result.push(...additionalProps)\n continue\n }\n // For other multi-error groups, prefer the anyOf parent (one concise\n // \"should be one of these\" message).\n const parent = errors.find(e => e.instancePath === path && compositeKeywords.has(e.keyword))\n if (parent != null) {\n result.push(parent)\n continue\n }\n }\n result.push(...group)\n }\n return result\n}\n\n/** Decodes a single RFC 6901 JSON Pointer segment (`~1` → `/`, `~0` → `~`). */\nfunction decodePointerSegment(segment: string): string {\n return segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\")\n}\n\nfunction instancePathToLabel(instancePath: string, baseDataPath: string): string {\n if (!instancePath) {\n return baseDataPath\n }\n const segments = instancePath.split(\"/\").filter(Boolean).map(decodePointerSegment)\n return [baseDataPath, ...segments].join(\".\")\n}\n\nfunction formatError(error: ErrorObject, baseDataPath: string): string {\n const label = instancePathToLabel(error.instancePath, baseDataPath)\n const params = error.params as Record<string, unknown>\n const parentSchema = (error as ErrorObject & { parentSchema?: Record<string, unknown> }).parentSchema\n\n switch (error.keyword) {\n case \"additionalProperties\":\n return `${label} has an unknown property '${params.additionalProperty}'`\n\n case \"required\": {\n const missingProp = String(params.missingProperty).replace(/^\\./, \"\")\n return `${label} misses the property '${missingProp}'`\n }\n\n case \"type\": {\n const type = params.type\n if (Array.isArray(type)) {\n const typeList = (type as string[]).join(\" | \")\n const desc = descriptionSuffix(parentSchema)\n return `${label} should be:\\n${typeList}${desc}`\n }\n return `${label} should be a ${type}`\n }\n\n case \"enum\": {\n const enumVals = (parentSchema?.enum as unknown[] | undefined) ?? []\n if (enumVals.length === 1) {\n return `${label} should be ${JSON.stringify(enumVals[0])}`\n }\n return `${label} should be one of these:\\n${enumVals.map(v => JSON.stringify(v)).join(\" | \")}`\n }\n\n case \"anyOf\":\n case \"oneOf\": {\n const schemaText = formatSchemaType(parentSchema)\n return `${label} should be one of these:\\n${schemaText}`\n }\n\n default:\n return `${label} ${error.message}`\n }\n}\n\nfunction descriptionSuffix(schema: Record<string, unknown> | undefined): string {\n return typeof schema?.description === \"string\" ? `\\n-> ${schema.description}` : \"\"\n}\n\nfunction formatSchemaType(schema: Record<string, unknown> | undefined): string {\n if (schema == null) {\n return \"\"\n }\n if (Array.isArray(schema.type)) {\n return (schema.type as string[]).join(\" | \")\n }\n if (typeof schema.type === \"string\") {\n return schema.type\n }\n if (Array.isArray(schema.anyOf)) {\n return (schema.anyOf as Array<Record<string, unknown>>)\n .map(s => {\n if (Array.isArray(s.type)) {\n return (s.type as string[]).join(\" | \")\n }\n return typeof s.type === \"string\" ? s.type : \"\"\n })\n .filter(Boolean)\n .join(\" | \")\n }\n return JSON.stringify(schema)\n}\n\nfunction indentNewlines(str: string, prefix: string): string {\n return str.replace(/\\n(?!$)/g, `\\n${prefix}`)\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { ElectronPlatformArtifactDetails, MirrorOptions } from "@electron/get";
2
+ import { MemoLazy } from "builder-util-runtime";
2
3
  export interface ElectronGetOptions extends Omit<ElectronPlatformArtifactDetails, "platform" | "arch" | "version" | "artifactName" | "artifactSuffix" | "customFilename" | "tempDirectory" | "downloader" | "cacheMode" | "cacheRoot" | "downloadOptions" | "isGeneric" | "mirrorOptions"> {
3
4
  mirrorOptions?: Omit<MirrorOptions, "customDir" | "customFilename" | "customVersion">;
4
5
  }
@@ -10,11 +11,13 @@ export type ArtifactDownloadOptions = {
10
11
  version: string;
11
12
  cacheDir?: string;
12
13
  };
13
- export declare function getCacheDirectory(options: {
14
+ export declare function hashUrlSafe(input: string, length?: number): string;
15
+ export declare const cacheDirectoryOverrideAllowed: MemoLazy<string | undefined, string>;
16
+ export declare function getCacheDirectoryInternal(options: {
14
17
  isAvoidSystemOnWindows?: boolean;
15
18
  allowEnvVarOverride: boolean;
16
- }): string;
17
- export declare function extractArchive(file: string, dir: string): Promise<void>;
19
+ }): Promise<string>;
20
+ export declare function extractArchive(archive: string, dir: string): Promise<void>;
18
21
  /**
19
22
  * Forces undici's global proxy dispatcher to re-read the current HTTP(S)_PROXY / NO_PROXY env vars,
20
23
  * bypassing the once-guard in initializeProxyOnce(). Exported for integration testing only.