app-builder-lib 27.0.0-alpha.8 → 27.0.0-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/asar/asarUtil.js +21 -11
  2. package/dist/asar/asarUtil.js.map +1 -1
  3. package/dist/configuration.d.ts +31 -1
  4. package/dist/configuration.d.ts.map +1 -1
  5. package/dist/configuration.js.map +1 -1
  6. package/dist/electron/ElectronFramework.d.ts +2 -1
  7. package/dist/electron/ElectronFramework.d.ts.map +1 -1
  8. package/dist/electron/ElectronFramework.js +14 -7
  9. package/dist/electron/ElectronFramework.js.map +1 -1
  10. package/dist/electron/mac/electronMac.js +2 -6
  11. package/dist/electron/mac/electronMac.js.map +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +13 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/indexInternal.d.ts +9 -2
  16. package/dist/indexInternal.d.ts.map +1 -1
  17. package/dist/indexInternal.js +8 -2
  18. package/dist/indexInternal.js.map +1 -1
  19. package/dist/linuxPackager.d.ts.map +1 -1
  20. package/dist/linuxPackager.js +19 -1
  21. package/dist/linuxPackager.js.map +1 -1
  22. package/dist/macPackager.d.ts.map +1 -1
  23. package/dist/macPackager.js +20 -0
  24. package/dist/macPackager.js.map +1 -1
  25. package/dist/node-module-collector/index.d.ts.map +1 -1
  26. package/dist/node-module-collector/index.js +47 -16
  27. package/dist/node-module-collector/index.js.map +1 -1
  28. package/dist/node-module-collector/moduleManager.d.ts.map +1 -1
  29. package/dist/node-module-collector/moduleManager.js +16 -8
  30. package/dist/node-module-collector/moduleManager.js.map +1 -1
  31. package/dist/node-module-collector/nodeModulesCollector.d.ts +7 -2
  32. package/dist/node-module-collector/nodeModulesCollector.d.ts.map +1 -1
  33. package/dist/node-module-collector/nodeModulesCollector.js +13 -17
  34. package/dist/node-module-collector/nodeModulesCollector.js.map +1 -1
  35. package/dist/node-module-collector/pnpmNodeModulesCollector.d.ts +44 -4
  36. package/dist/node-module-collector/pnpmNodeModulesCollector.d.ts.map +1 -1
  37. package/dist/node-module-collector/pnpmNodeModulesCollector.js +130 -34
  38. package/dist/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
  39. package/dist/options/PlatformSpecificBuildOptions.d.ts +29 -0
  40. package/dist/options/PlatformSpecificBuildOptions.d.ts.map +1 -1
  41. package/dist/options/PlatformSpecificBuildOptions.js.map +1 -1
  42. package/dist/options/SquirrelWindowsOptions.d.ts +0 -5
  43. package/dist/options/SquirrelWindowsOptions.d.ts.map +1 -1
  44. package/dist/options/SquirrelWindowsOptions.js.map +1 -1
  45. package/dist/options/macOptions.d.ts +11 -6
  46. package/dist/options/macOptions.d.ts.map +1 -1
  47. package/dist/options/macOptions.js.map +1 -1
  48. package/dist/packager.d.ts +2 -0
  49. package/dist/packager.d.ts.map +1 -1
  50. package/dist/packager.js +47 -0
  51. package/dist/packager.js.map +1 -1
  52. package/dist/packagerApi.d.ts +1 -1
  53. package/dist/packagerApi.d.ts.map +1 -1
  54. package/dist/packagerApi.js.map +1 -1
  55. package/dist/platformPackager.d.ts +13 -1
  56. package/dist/platformPackager.d.ts.map +1 -1
  57. package/dist/platformPackager.js +26 -2
  58. package/dist/platformPackager.js.map +1 -1
  59. package/dist/publish/PublishManager.d.ts.map +1 -1
  60. package/dist/publish/PublishManager.js +89 -7
  61. package/dist/publish/PublishManager.js.map +1 -1
  62. package/dist/publish/updateInfoBuilder.d.ts.map +1 -1
  63. package/dist/publish/updateInfoBuilder.js +57 -4
  64. package/dist/publish/updateInfoBuilder.js.map +1 -1
  65. package/dist/targets/ArchiveTarget.js +1 -1
  66. package/dist/targets/ArchiveTarget.js.map +1 -1
  67. package/dist/targets/archive.d.ts +12 -0
  68. package/dist/targets/archive.d.ts.map +1 -1
  69. package/dist/targets/archive.js +44 -1
  70. package/dist/targets/archive.js.map +1 -1
  71. package/dist/targets/differentialUpdateInfoBuilder.d.ts +2 -1
  72. package/dist/targets/differentialUpdateInfoBuilder.d.ts.map +1 -1
  73. package/dist/targets/differentialUpdateInfoBuilder.js +2 -2
  74. package/dist/targets/differentialUpdateInfoBuilder.js.map +1 -1
  75. package/dist/targets/linux/FlatpakTarget.d.ts.map +1 -1
  76. package/dist/targets/linux/FlatpakTarget.js +5 -1
  77. package/dist/targets/linux/FlatpakTarget.js.map +1 -1
  78. package/dist/targets/linux/FpmTarget.d.ts.map +1 -1
  79. package/dist/targets/linux/FpmTarget.js +25 -2
  80. package/dist/targets/linux/FpmTarget.js.map +1 -1
  81. package/dist/targets/linux/LinuxTargetHelper.d.ts +1 -0
  82. package/dist/targets/linux/LinuxTargetHelper.d.ts.map +1 -1
  83. package/dist/targets/linux/LinuxTargetHelper.js +17 -1
  84. package/dist/targets/linux/LinuxTargetHelper.js.map +1 -1
  85. package/dist/targets/linux/snap/core24.js +3 -3
  86. package/dist/targets/linux/snap/core24.js.map +1 -1
  87. package/dist/targets/linux/snap/coreLegacy.js +1 -1
  88. package/dist/targets/linux/snap/coreLegacy.js.map +1 -1
  89. package/dist/targets/mac/MacTargetHelper.d.ts +70 -4
  90. package/dist/targets/mac/MacTargetHelper.d.ts.map +1 -1
  91. package/dist/targets/mac/MacTargetHelper.js +294 -36
  92. package/dist/targets/mac/MacTargetHelper.js.map +1 -1
  93. package/dist/targets/mac/pkg.d.ts +16 -0
  94. package/dist/targets/mac/pkg.d.ts.map +1 -1
  95. package/dist/targets/mac/pkg.js +26 -0
  96. package/dist/targets/mac/pkg.js.map +1 -1
  97. package/dist/targets/win/MsiTarget.d.ts.map +1 -1
  98. package/dist/targets/win/MsiTarget.js +6 -3
  99. package/dist/targets/win/MsiTarget.js.map +1 -1
  100. package/dist/targets/win/nsis/Defines.d.ts +2 -0
  101. package/dist/targets/win/nsis/Defines.d.ts.map +1 -1
  102. package/dist/targets/win/nsis/Defines.js.map +1 -1
  103. package/dist/targets/win/nsis/NsisTarget.d.ts +18 -0
  104. package/dist/targets/win/nsis/NsisTarget.d.ts.map +1 -1
  105. package/dist/targets/win/nsis/NsisTarget.js +79 -19
  106. package/dist/targets/win/nsis/NsisTarget.js.map +1 -1
  107. package/dist/targets/win/nsis/WebInstallerTarget.d.ts.map +1 -1
  108. package/dist/targets/win/nsis/WebInstallerTarget.js +19 -12
  109. package/dist/targets/win/nsis/WebInstallerTarget.js.map +1 -1
  110. package/dist/targets/win/nsis/nsisOptions.d.ts +29 -4
  111. package/dist/targets/win/nsis/nsisOptions.d.ts.map +1 -1
  112. package/dist/targets/win/nsis/nsisOptions.js.map +1 -1
  113. package/dist/toolsets/wine.d.ts.map +1 -1
  114. package/dist/toolsets/wine.js +17 -12
  115. package/dist/toolsets/wine.js.map +1 -1
  116. package/dist/util/NodeModuleCopyHelper.js +12 -4
  117. package/dist/util/NodeModuleCopyHelper.js.map +1 -1
  118. package/dist/util/appFileCopier.d.ts +5 -0
  119. package/dist/util/appFileCopier.d.ts.map +1 -1
  120. package/dist/util/appFileCopier.js +39 -1
  121. package/dist/util/appFileCopier.js.map +1 -1
  122. package/dist/util/config/config.d.ts.map +1 -1
  123. package/dist/util/config/config.js +4 -0
  124. package/dist/util/config/config.js.map +1 -1
  125. package/dist/util/config/legacyConfigGuard.d.ts +7 -0
  126. package/dist/util/config/legacyConfigGuard.d.ts.map +1 -0
  127. package/dist/util/config/legacyConfigGuard.js +187 -0
  128. package/dist/util/config/legacyConfigGuard.js.map +1 -0
  129. package/dist/util/config/legacyOptions.d.ts +73 -0
  130. package/dist/util/config/legacyOptions.d.ts.map +1 -0
  131. package/dist/util/config/legacyOptions.js +369 -0
  132. package/dist/util/config/legacyOptions.js.map +1 -0
  133. package/dist/util/config/schemaValidator.d.ts.map +1 -1
  134. package/dist/util/config/schemaValidator.js +16 -0
  135. package/dist/util/config/schemaValidator.js.map +1 -1
  136. package/dist/util/electronGet.d.ts +0 -4
  137. package/dist/util/electronGet.d.ts.map +1 -1
  138. package/dist/util/electronGet.js +17 -0
  139. package/dist/util/electronGet.js.map +1 -1
  140. package/dist/util/flags.d.ts +5 -0
  141. package/dist/util/flags.d.ts.map +1 -1
  142. package/dist/util/flags.js +124 -1
  143. package/dist/util/flags.js.map +1 -1
  144. package/dist/util/packageMetadata.js +11 -0
  145. package/dist/util/packageMetadata.js.map +1 -1
  146. package/dist/util/resolve.js +1 -1
  147. package/dist/util/resolve.js.map +1 -1
  148. package/dist/version.d.ts +1 -1
  149. package/dist/version.js +1 -1
  150. package/dist/version.js.map +1 -1
  151. package/package.json +10 -10
  152. package/scheme.json +368 -23
  153. package/templates/entitlements.mac.adhoc.plist +15 -0
  154. package/templates/entitlements.mac.plist +9 -6
  155. package/templates/nsis/include/installer.nsh +1 -30
  156. package/templates/nsis/include/webPackage.nsh +33 -23
  157. package/templates/nsis/multiUserUi.nsh +1 -1
@@ -0,0 +1,187 @@
1
+ import { InvalidConfigurationError, log } from "builder-util";
2
+ import { BREAKING_CHANGES_URL, formatLegacyOptionMessage, RESOLVED_LEGACY_CONFIG_OPTIONS } from "./legacyOptions.js";
3
+ /**
4
+ * Build-time guard for configurations still written against v26.
5
+ *
6
+ * Almost every removed key is already rejected by `scheme.json` (`additionalProperties: false`), but
7
+ * ajv can only say "has an unknown property 'identity'" — it cannot say the option moved to
8
+ * `mac.sign.identity`. This pass runs *before* schema validation so the targeted message wins, and it
9
+ * aggregates every legacy key into a single error: a config with a dozen moved mac options should
10
+ * not take a dozen build attempts to fix.
11
+ *
12
+ * Nothing here rejects a value a valid v27 config can contain — every guarded path is covered by a
13
+ * test asserting the v27 schema rejects it too.
14
+ */
15
+ const PLATFORMS_WITH_PUBLISH = ["mac", "win", "linux"];
16
+ /** v26 `snap` options that belong under the base-named sub-key in v27, not directly on `snapcraft`. */
17
+ const SNAPCRAFT_BASE_LEVEL_KEYS = new Set([
18
+ "confinement",
19
+ "grade",
20
+ "stagePackages",
21
+ "buildPackages",
22
+ "plugs",
23
+ "slots",
24
+ "after",
25
+ "environment",
26
+ "hooks",
27
+ "layout",
28
+ "appPartStage",
29
+ "assumes",
30
+ "autoStart",
31
+ "summary",
32
+ "title",
33
+ "compression",
34
+ "allowNativeWayland",
35
+ "useTemplateApp",
36
+ ]);
37
+ const SNAPCRAFT_BASES = ["core18", "core20", "core22", "core24", "custom"];
38
+ function docLink(anchor) {
39
+ return ` ${BREAKING_CHANGES_URL}#${anchor}`;
40
+ }
41
+ function isPlainObject(value) {
42
+ return value != null && typeof value === "object" && !Array.isArray(value);
43
+ }
44
+ /** Resolves `path` against `config`, returning the holding object or null when any segment is missing. */
45
+ function resolveParent(config, path) {
46
+ let node = config;
47
+ for (const segment of path) {
48
+ const next = node[segment];
49
+ if (!isPlainObject(next)) {
50
+ return null;
51
+ }
52
+ node = next;
53
+ }
54
+ return node;
55
+ }
56
+ /** Collects the legacy keys present anywhere in the config, using the shared mapping table. */
57
+ function collectLegacyKeys(config, errors, warnings) {
58
+ for (const option of RESOLVED_LEGACY_CONFIG_OPTIONS) {
59
+ const parent = resolveParent(config, option.parentPath);
60
+ if (parent == null || !(option.key in parent)) {
61
+ continue;
62
+ }
63
+ const message = formatLegacyOptionMessage(option);
64
+ if (option.severity === "error") {
65
+ errors.push(message);
66
+ }
67
+ else {
68
+ warnings.push(message);
69
+ }
70
+ }
71
+ }
72
+ /**
73
+ * `mac.sign` is a single union in v27, so a custom signer and an options bag can no longer coexist.
74
+ * The sibling fields are already reported by `collectLegacyKeys`; this adds the union explanation so
75
+ * the user knows the two forms are mutually exclusive rather than assuming a mechanical move works.
76
+ */
77
+ function checkMacCustomSigner(config, errors) {
78
+ for (const platform of ["mac", "mas", "masDev"]) {
79
+ const platformConfig = config[platform];
80
+ if (!isPlainObject(platformConfig)) {
81
+ continue;
82
+ }
83
+ const sign = platformConfig.sign;
84
+ if (typeof sign !== "string" && typeof sign !== "function") {
85
+ continue;
86
+ }
87
+ const legacySiblings = RESOLVED_LEGACY_CONFIG_OPTIONS.filter(o => o.parentPath.length === 1 && o.parentPath[0] === platform && o.key in platformConfig).map(o => o.key);
88
+ if (legacySiblings.length === 0) {
89
+ continue;
90
+ }
91
+ errors.push(`\`${platform}.sign\` is a custom signing function or module path, and \`${platform}\` also sets [${legacySiblings.join(", ")}].\n` +
92
+ ` In v27 \`${platform}.sign\` is a single union — a custom signer cannot carry signing options alongside it.\n` +
93
+ ` Either keep the custom signer and read those options inside it, or drop it and use an ElectronSignOptions object.\n` +
94
+ docLink("macos-signing-macsign"));
95
+ }
96
+ }
97
+ /**
98
+ * `win.sign` is a discriminated union in v27. Without `type`, ajv reports one
99
+ * "unknown property" error per union branch and never mentions the missing discriminator.
100
+ */
101
+ function checkWinSignDiscriminator(config, errors) {
102
+ const sign = config.win?.sign;
103
+ if (!isPlainObject(sign) || "type" in sign) {
104
+ return;
105
+ }
106
+ errors.push("`win.sign` is missing its `type` discriminator.\n" +
107
+ ' v27 types `win.sign` as a union: `type: "signtool" | "hsm" | "pkcs11" | "azure"`.\n' +
108
+ ' A config migrated from `win.signtoolOptions` needs `type: "signtool"`; one from `win.azureSignOptions` needs `type: "azure"`.\n' +
109
+ docLink("windows-signing-winsign"));
110
+ }
111
+ /**
112
+ * `snapcraft.base` is required, but because `snapcraft` is `anyOf[SnapcraftOptions, null]` the ajv
113
+ * output collapses to "configuration.snapcraft should be one of these: null" — which reads as an
114
+ * instruction to null out the config.
115
+ */
116
+ function checkSnapcraftShape(config, errors) {
117
+ const snapcraft = config.snapcraft;
118
+ if (!isPlainObject(snapcraft)) {
119
+ return;
120
+ }
121
+ if (!("base" in snapcraft)) {
122
+ errors.push("`snapcraft` is missing the required `base` field.\n" +
123
+ ` Set it to one of ${SNAPCRAFT_BASES.map(b => `"${b}"`).join(" | ")} and nest that base's options under a matching sub-key, ` +
124
+ 'e.g. `{ "snapcraft": { "base": "core22", "core22": { … } } }`.\n' +
125
+ docLink("snap-snapcraft"));
126
+ return;
127
+ }
128
+ const flatKeys = Object.keys(snapcraft).filter(k => SNAPCRAFT_BASE_LEVEL_KEYS.has(k));
129
+ if (flatKeys.length > 0) {
130
+ errors.push(`\`snapcraft\` sets [${flatKeys.join(", ")}] directly, but in v27 those belong under the base-named sub-key.\n` +
131
+ ` Move them under \`snapcraft.${snapcraft.base}\`, e.g. \`{ "snapcraft": { "base": "${snapcraft.base}", "${snapcraft.base}": { "${flatKeys[0]}": … } } }\`.\n` +
132
+ docLink("snap-snapcraft"));
133
+ }
134
+ }
135
+ /**
136
+ * `vPrefixedTagName` was removed from GitHub publish options only — GitLab still supports it, so the
137
+ * check has to discriminate on `provider` rather than on the key name.
138
+ */
139
+ function checkPublishEntries(config, errors) {
140
+ const check = (value, label) => {
141
+ if (value == null) {
142
+ return;
143
+ }
144
+ for (const entry of Array.isArray(value) ? value : [value]) {
145
+ if (!isPlainObject(entry) || entry.provider !== "github" || !("vPrefixedTagName" in entry)) {
146
+ continue;
147
+ }
148
+ const suggested = entry.vPrefixedTagName === false ? '""' : '"v"';
149
+ errors.push(`\`${label}.vPrefixedTagName\` was removed from the GitHub publish options in v27.\n` +
150
+ ` Use \`tagNamePrefix: ${suggested}\` instead (it defaults to "v", so you can drop the key entirely to keep the default).\n` +
151
+ " This applies to GitHub only — GitLab's `vPrefixedTagName` is unchanged.\n" +
152
+ " Run `electron-builder migrate-schema` to update your configuration automatically.\n" +
153
+ docLink("githuboptions-gitlaboptions-vprefixedtagname"));
154
+ }
155
+ };
156
+ check(config.publish, "publish");
157
+ for (const platform of PLATFORMS_WITH_PUBLISH) {
158
+ check(config[platform]?.publish, `${platform}.publish`);
159
+ }
160
+ }
161
+ /**
162
+ * Throws a single aggregated {@link InvalidConfigurationError} naming every v26 option found, and
163
+ * warns about the ones that are merely discouraged. Runs before schema validation.
164
+ */
165
+ export function checkLegacyConfiguration(config) {
166
+ const raw = config;
167
+ const errors = [];
168
+ const warnings = [];
169
+ collectLegacyKeys(raw, errors, warnings);
170
+ checkMacCustomSigner(raw, errors);
171
+ checkWinSignDiscriminator(raw, errors);
172
+ checkSnapcraftShape(raw, errors);
173
+ checkPublishEntries(raw, errors);
174
+ for (const warning of warnings) {
175
+ log.warn(warning);
176
+ }
177
+ if (errors.length === 0) {
178
+ return;
179
+ }
180
+ const header = errors.length === 1
181
+ ? "Your configuration uses an option that was removed in electron-builder v27:"
182
+ : `Your configuration uses ${errors.length} options that were removed in electron-builder v27:`;
183
+ const message = [header, "", ...errors.map(e => `• ${e}`), "", `Full list of breaking changes: ${BREAKING_CHANGES_URL}`].join("\n");
184
+ log.error(null, "invalid configuration");
185
+ throw new InvalidConfigurationError(message);
186
+ }
187
+ //# sourceMappingURL=legacyConfigGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacyConfigGuard.js","sourceRoot":"","sources":["../../../src/util/config/legacyConfigGuard.ts"],"names":[],"mappings":"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","sourcesContent":["import { InvalidConfigurationError, log } from \"builder-util\"\nimport { Configuration } from \"../../configuration.js\"\nimport { BREAKING_CHANGES_URL, formatLegacyOptionMessage, RESOLVED_LEGACY_CONFIG_OPTIONS } from \"./legacyOptions.js\"\n\n/**\n * Build-time guard for configurations still written against v26.\n *\n * Almost every removed key is already rejected by `scheme.json` (`additionalProperties: false`), but\n * ajv can only say \"has an unknown property 'identity'\" — it cannot say the option moved to\n * `mac.sign.identity`. This pass runs *before* schema validation so the targeted message wins, and it\n * aggregates every legacy key into a single error: a config with a dozen moved mac options should\n * not take a dozen build attempts to fix.\n *\n * Nothing here rejects a value a valid v27 config can contain — every guarded path is covered by a\n * test asserting the v27 schema rejects it too.\n */\n\nconst PLATFORMS_WITH_PUBLISH = [\"mac\", \"win\", \"linux\"] as const\n\n/** v26 `snap` options that belong under the base-named sub-key in v27, not directly on `snapcraft`. */\nconst SNAPCRAFT_BASE_LEVEL_KEYS = new Set([\n \"confinement\",\n \"grade\",\n \"stagePackages\",\n \"buildPackages\",\n \"plugs\",\n \"slots\",\n \"after\",\n \"environment\",\n \"hooks\",\n \"layout\",\n \"appPartStage\",\n \"assumes\",\n \"autoStart\",\n \"summary\",\n \"title\",\n \"compression\",\n \"allowNativeWayland\",\n \"useTemplateApp\",\n])\n\nconst SNAPCRAFT_BASES = [\"core18\", \"core20\", \"core22\", \"core24\", \"custom\"]\n\nfunction docLink(anchor: string): string {\n return ` ${BREAKING_CHANGES_URL}#${anchor}`\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, any> {\n return value != null && typeof value === \"object\" && !Array.isArray(value)\n}\n\n/** Resolves `path` against `config`, returning the holding object or null when any segment is missing. */\nfunction resolveParent(config: Record<string, any>, path: readonly string[]): Record<string, any> | null {\n let node: Record<string, any> = config\n for (const segment of path) {\n const next = node[segment]\n if (!isPlainObject(next)) {\n return null\n }\n node = next\n }\n return node\n}\n\n/** Collects the legacy keys present anywhere in the config, using the shared mapping table. */\nfunction collectLegacyKeys(config: Record<string, any>, errors: string[], warnings: string[]): void {\n for (const option of RESOLVED_LEGACY_CONFIG_OPTIONS) {\n const parent = resolveParent(config, option.parentPath)\n if (parent == null || !(option.key in parent)) {\n continue\n }\n const message = formatLegacyOptionMessage(option)\n if (option.severity === \"error\") {\n errors.push(message)\n } else {\n warnings.push(message)\n }\n }\n}\n\n/**\n * `mac.sign` is a single union in v27, so a custom signer and an options bag can no longer coexist.\n * The sibling fields are already reported by `collectLegacyKeys`; this adds the union explanation so\n * the user knows the two forms are mutually exclusive rather than assuming a mechanical move works.\n */\nfunction checkMacCustomSigner(config: Record<string, any>, errors: string[]): void {\n for (const platform of [\"mac\", \"mas\", \"masDev\"] as const) {\n const platformConfig = config[platform]\n if (!isPlainObject(platformConfig)) {\n continue\n }\n const sign = platformConfig.sign\n if (typeof sign !== \"string\" && typeof sign !== \"function\") {\n continue\n }\n const legacySiblings = RESOLVED_LEGACY_CONFIG_OPTIONS.filter(o => o.parentPath.length === 1 && o.parentPath[0] === platform && o.key in platformConfig).map(o => o.key)\n if (legacySiblings.length === 0) {\n continue\n }\n errors.push(\n `\\`${platform}.sign\\` is a custom signing function or module path, and \\`${platform}\\` also sets [${legacySiblings.join(\", \")}].\\n` +\n ` In v27 \\`${platform}.sign\\` is a single union — a custom signer cannot carry signing options alongside it.\\n` +\n ` Either keep the custom signer and read those options inside it, or drop it and use an ElectronSignOptions object.\\n` +\n docLink(\"macos-signing-macsign\")\n )\n }\n}\n\n/**\n * `win.sign` is a discriminated union in v27. Without `type`, ajv reports one\n * \"unknown property\" error per union branch and never mentions the missing discriminator.\n */\nfunction checkWinSignDiscriminator(config: Record<string, any>, errors: string[]): void {\n const sign = config.win?.sign\n if (!isPlainObject(sign) || \"type\" in sign) {\n return\n }\n errors.push(\n \"`win.sign` is missing its `type` discriminator.\\n\" +\n ' v27 types `win.sign` as a union: `type: \"signtool\" | \"hsm\" | \"pkcs11\" | \"azure\"`.\\n' +\n ' A config migrated from `win.signtoolOptions` needs `type: \"signtool\"`; one from `win.azureSignOptions` needs `type: \"azure\"`.\\n' +\n docLink(\"windows-signing-winsign\")\n )\n}\n\n/**\n * `snapcraft.base` is required, but because `snapcraft` is `anyOf[SnapcraftOptions, null]` the ajv\n * output collapses to \"configuration.snapcraft should be one of these: null\" — which reads as an\n * instruction to null out the config.\n */\nfunction checkSnapcraftShape(config: Record<string, any>, errors: string[]): void {\n const snapcraft = config.snapcraft\n if (!isPlainObject(snapcraft)) {\n return\n }\n if (!(\"base\" in snapcraft)) {\n errors.push(\n \"`snapcraft` is missing the required `base` field.\\n\" +\n ` Set it to one of ${SNAPCRAFT_BASES.map(b => `\"${b}\"`).join(\" | \")} and nest that base's options under a matching sub-key, ` +\n 'e.g. `{ \"snapcraft\": { \"base\": \"core22\", \"core22\": { … } } }`.\\n' +\n docLink(\"snap-snapcraft\")\n )\n return\n }\n const flatKeys = Object.keys(snapcraft).filter(k => SNAPCRAFT_BASE_LEVEL_KEYS.has(k))\n if (flatKeys.length > 0) {\n errors.push(\n `\\`snapcraft\\` sets [${flatKeys.join(\", \")}] directly, but in v27 those belong under the base-named sub-key.\\n` +\n ` Move them under \\`snapcraft.${snapcraft.base}\\`, e.g. \\`{ \"snapcraft\": { \"base\": \"${snapcraft.base}\", \"${snapcraft.base}\": { \"${flatKeys[0]}\": … } } }\\`.\\n` +\n docLink(\"snap-snapcraft\")\n )\n }\n}\n\n/**\n * `vPrefixedTagName` was removed from GitHub publish options only — GitLab still supports it, so the\n * check has to discriminate on `provider` rather than on the key name.\n */\nfunction checkPublishEntries(config: Record<string, any>, errors: string[]): void {\n const check = (value: unknown, label: string) => {\n if (value == null) {\n return\n }\n for (const entry of Array.isArray(value) ? value : [value]) {\n if (!isPlainObject(entry) || entry.provider !== \"github\" || !(\"vPrefixedTagName\" in entry)) {\n continue\n }\n const suggested = entry.vPrefixedTagName === false ? '\"\"' : '\"v\"'\n errors.push(\n `\\`${label}.vPrefixedTagName\\` was removed from the GitHub publish options in v27.\\n` +\n ` Use \\`tagNamePrefix: ${suggested}\\` instead (it defaults to \"v\", so you can drop the key entirely to keep the default).\\n` +\n \" This applies to GitHub only — GitLab's `vPrefixedTagName` is unchanged.\\n\" +\n \" Run `electron-builder migrate-schema` to update your configuration automatically.\\n\" +\n docLink(\"githuboptions-gitlaboptions-vprefixedtagname\")\n )\n }\n }\n check(config.publish, \"publish\")\n for (const platform of PLATFORMS_WITH_PUBLISH) {\n check(config[platform]?.publish, `${platform}.publish`)\n }\n}\n\n/**\n * Throws a single aggregated {@link InvalidConfigurationError} naming every v26 option found, and\n * warns about the ones that are merely discouraged. Runs before schema validation.\n */\nexport function checkLegacyConfiguration(config: Configuration): void {\n const raw = config as unknown as Record<string, any>\n const errors: string[] = []\n const warnings: string[] = []\n\n collectLegacyKeys(raw, errors, warnings)\n checkMacCustomSigner(raw, errors)\n checkWinSignDiscriminator(raw, errors)\n checkSnapcraftShape(raw, errors)\n checkPublishEntries(raw, errors)\n\n for (const warning of warnings) {\n log.warn(warning)\n }\n\n if (errors.length === 0) {\n return\n }\n\n const header =\n errors.length === 1\n ? \"Your configuration uses an option that was removed in electron-builder v27:\"\n : `Your configuration uses ${errors.length} options that were removed in electron-builder v27:`\n const message = [header, \"\", ...errors.map(e => `• ${e}`), \"\", `Full list of breaking changes: ${BREAKING_CHANGES_URL}`].join(\"\\n\")\n log.error(null, \"invalid configuration\")\n throw new InvalidConfigurationError(message)\n}\n"]}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Single source of truth for the v26 → v27 configuration migration.
3
+ *
4
+ * Two consumers read this table and must never drift apart:
5
+ * - `checkLegacyConfiguration` (this package) — the build-time guard that tells a user who upgraded
6
+ * without reading the migration guide exactly which key moved where.
7
+ * - `electron-builder migrate-schema` (the `electron-builder` package) — the opt-in rewriter.
8
+ *
9
+ * The migrator lives in a package that depends on this one, so the table has to live here for both
10
+ * to share it. Keeping the field lists in one place is not cosmetic: `gatekeeperAssess` was moved
11
+ * into `mac.sign` by the migrator while the schema rejected it there, producing configs that failed
12
+ * validation on the next build.
13
+ */
14
+ /** macOS signing fields that moved from the platform root into the `sign` (ElectronSignOptions) bag. */
15
+ export declare const MAC_SIGN_FIELDS: readonly ["identity", "entitlements", "entitlementsInherit", "entitlementsLoginHelper", "provisioningProfile", "type", "binaries", "requirements", "hardenedRuntime", "strictVerify", "preAutoEntitlements", "timestamp", "additionalArguments"];
16
+ /**
17
+ * macOS signing fields that were removed outright rather than moved under `sign`.
18
+ * `@electron/osx-sign` 2.x dropped the `spctl --assess` step, so there is no `sign.gatekeeperAssess`
19
+ * to migrate to — `ElectronSignOptions` omits it and the schema rejects it.
20
+ */
21
+ export declare const MAC_SIGN_REMOVED_FIELDS: readonly ["gatekeeperAssess"];
22
+ /** Universal-build fields that moved from the platform root into the `universal` bag. */
23
+ export declare const MAC_UNIVERSAL_FIELDS: readonly ["mergeASARs", "singleArchFiles", "x64ArchFiles"];
24
+ /**
25
+ * Azure Trusted Signing typed fields in v27 (everything else is an extra key → `additionalMetadata`).
26
+ * `type` is included so it is not mistakenly moved to `additionalMetadata` if already present.
27
+ */
28
+ export declare const AZURE_KNOWN_FIELDS: Set<string>;
29
+ /** `electronDownload` fields with no equivalent in the v27 `ElectronGetOptions` (@electron/get v5) shape. */
30
+ export declare const ELECTRON_DOWNLOAD_DROPPED: readonly ["cache", "customDir", "customFilename", "strictSSL", "platform", "arch", "version", "force"];
31
+ /** Platform keys that accept the macOS signing/universal options. */
32
+ export declare const MAC_PLATFORM_KEYS: readonly ["mac", "mas", "masDev"];
33
+ /** Every platform key that accepted the shared per-platform options in v26. */
34
+ export declare const ALL_PLATFORM_KEYS: readonly ["mac", "mas", "masDev", "win", "linux"];
35
+ export declare const BREAKING_CHANGES_URL = "https://www.electron.build/docs/migration/v27-breaking-changes";
36
+ export interface LegacyConfigOption {
37
+ /** The removed key itself. */
38
+ readonly key: string;
39
+ /** Path to the object holding `key`. Empty = the configuration root. */
40
+ readonly parent?: readonly string[];
41
+ /**
42
+ * When set, `parent` is ignored and one entry is generated per platform key:
43
+ * `"mac"` → mac/mas/masDev, `"all"` → those plus win/linux.
44
+ */
45
+ readonly scope?: "mac" | "all";
46
+ /** The v27 form, or `null` when the option was removed with no replacement. */
47
+ readonly replacement: string | null;
48
+ /** True when `electron-builder migrate-schema` rewrites this automatically. */
49
+ readonly autoMigrated: boolean;
50
+ readonly severity: "error" | "warn";
51
+ /** Extra sentence appended to the message — inverted polarity, lost behaviour, etc. */
52
+ readonly detail?: string;
53
+ /** Anchor within the breaking-changes page. */
54
+ readonly anchor: string;
55
+ }
56
+ export declare const LEGACY_CONFIG_OPTIONS: readonly LegacyConfigOption[];
57
+ /** A `LegacyConfigOption` with its `scope` expanded to a concrete parent path. */
58
+ export interface ResolvedLegacyConfigOption extends LegacyConfigOption {
59
+ /** Concrete path of the object holding `key`. */
60
+ readonly parentPath: readonly string[];
61
+ /** Dot-joined `parentPath` + `key`, as it appears in a user's config. */
62
+ readonly fullPath: string;
63
+ }
64
+ /** `LEGACY_CONFIG_OPTIONS` with every `scope` expanded into concrete paths. */
65
+ export declare const RESOLVED_LEGACY_CONFIG_OPTIONS: readonly ResolvedLegacyConfigOption[];
66
+ /**
67
+ * Renders the user-facing message for a single legacy option.
68
+ *
69
+ * A scoped option's `replacement` is relative to its platform key (`sign.identity`), so it is
70
+ * prefixed with the resolved parent to read as the user wrote it (`mac.sign.identity`).
71
+ */
72
+ export declare function formatLegacyOptionMessage(option: ResolvedLegacyConfigOption): string;
73
+ //# sourceMappingURL=legacyOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacyOptions.d.ts","sourceRoot":"","sources":["../../../src/util/config/legacyOptions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,wGAAwG;AACxG,eAAO,MAAM,eAAe,kPAclB,CAAA;AAEV;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,+BAAgC,CAAA;AAEpE,yFAAyF;AACzF,eAAO,MAAM,oBAAoB,4DAA6D,CAAA;AAE9F;;;GAGG;AACH,eAAO,MAAM,kBAAkB,aAU7B,CAAA;AAEF,6GAA6G;AAC7G,eAAO,MAAM,yBAAyB,wGAAyG,CAAA;AAE/I,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,mCAAoC,CAAA;AAElE,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,mDAAoD,CAAA;AAElF,eAAO,MAAM,oBAAoB,mEAAmE,CAAA;AAEpG,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAA;IACnC,uFAAuF;IACvF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAQD,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAuR9D,CAAA;AAED,kFAAkF;AAClF,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAcD,+EAA+E;AAC/E,eAAO,MAAM,8BAA8B,EAAE,SAAS,0BAA0B,EAAmC,CAAA;AAEnH;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CAmBpF"}