@hominis/fireforge 0.45.0 → 0.46.1

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 (662) hide show
  1. package/CHANGELOG.md +409 -446
  2. package/dist/bin/fireforge.d.ts +1 -1
  3. package/dist/bin/fireforge.js +21 -15
  4. package/dist/build-info.json +4 -4
  5. package/dist/src/cli-usage-error.d.ts +46 -0
  6. package/dist/src/cli-usage-error.js +81 -0
  7. package/dist/src/cli.d.ts +7 -2
  8. package/dist/src/cli.js +47 -47
  9. package/dist/src/commands/bootstrap-checks.js +2 -1
  10. package/dist/src/commands/bootstrap.js +3 -4
  11. package/dist/src/commands/build.js +27 -17
  12. package/dist/src/commands/config.js +9 -9
  13. package/dist/src/commands/destructive-decision.d.ts +19 -0
  14. package/dist/src/commands/destructive-decision.js +31 -0
  15. package/dist/src/commands/discard.js +5 -5
  16. package/dist/src/commands/doctor-check-core.d.ts +4 -10
  17. package/dist/src/commands/doctor-check-core.js +0 -8
  18. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  19. package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
  20. package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
  21. package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
  22. package/dist/src/commands/doctor-furnace-jar.js +1 -1
  23. package/dist/src/commands/doctor-furnace.js +22 -22
  24. package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
  25. package/dist/src/commands/doctor-orphaned-harness.js +14 -23
  26. package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
  27. package/dist/src/commands/doctor-patch-manifest.js +7 -6
  28. package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
  29. package/dist/src/commands/doctor-source-pin.d.ts +12 -12
  30. package/dist/src/commands/doctor-source-pin.js +14 -14
  31. package/dist/src/commands/doctor-working-tree.d.ts +3 -3
  32. package/dist/src/commands/doctor-working-tree.js +3 -3
  33. package/dist/src/commands/doctor.d.ts +3 -1
  34. package/dist/src/commands/doctor.js +15 -16
  35. package/dist/src/commands/download.js +50 -37
  36. package/dist/src/commands/export-all.js +29 -12
  37. package/dist/src/commands/export-flow.d.ts +5 -5
  38. package/dist/src/commands/export-flow.js +29 -59
  39. package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
  40. package/dist/src/commands/export-placement-conflicts.js +12 -12
  41. package/dist/src/commands/export-placement-gate.d.ts +2 -2
  42. package/dist/src/commands/export-placement-gate.js +7 -13
  43. package/dist/src/commands/export-placement-policy.d.ts +1 -1
  44. package/dist/src/commands/export-placement-policy.js +4 -6
  45. package/dist/src/commands/export-shared.d.ts +51 -32
  46. package/dist/src/commands/export-shared.js +17 -32
  47. package/dist/src/commands/export.js +14 -5
  48. package/dist/src/commands/furnace/apply.js +16 -16
  49. package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
  50. package/dist/src/commands/furnace/authoring-config.js +19 -0
  51. package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
  52. package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
  53. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
  54. package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
  55. package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
  56. package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
  57. package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
  58. package/dist/src/commands/furnace/chrome-doc.js +18 -18
  59. package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
  60. package/dist/src/commands/furnace/create-browser-test.js +7 -12
  61. package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
  62. package/dist/src/commands/furnace/create-dry-run.js +6 -9
  63. package/dist/src/commands/furnace/create-features.d.ts +2 -2
  64. package/dist/src/commands/furnace/create-features.js +2 -2
  65. package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
  66. package/dist/src/commands/furnace/create-mochikit.js +7 -7
  67. package/dist/src/commands/furnace/create-templates.d.ts +31 -15
  68. package/dist/src/commands/furnace/create-templates.js +20 -19
  69. package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
  70. package/dist/src/commands/furnace/create-xpcshell.js +8 -8
  71. package/dist/src/commands/furnace/create.d.ts +1 -1
  72. package/dist/src/commands/furnace/create.js +35 -29
  73. package/dist/src/commands/furnace/deploy.js +15 -6
  74. package/dist/src/commands/furnace/diff.js +7 -7
  75. package/dist/src/commands/furnace/index.js +1 -1
  76. package/dist/src/commands/furnace/init.js +17 -16
  77. package/dist/src/commands/furnace/list.js +2 -2
  78. package/dist/src/commands/furnace/override.d.ts +1 -1
  79. package/dist/src/commands/furnace/override.js +43 -34
  80. package/dist/src/commands/furnace/preview.js +17 -17
  81. package/dist/src/commands/furnace/refresh.js +15 -7
  82. package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
  83. package/dist/src/commands/furnace/remove-mutations.js +19 -19
  84. package/dist/src/commands/furnace/remove-state.d.ts +1 -1
  85. package/dist/src/commands/furnace/remove-state.js +1 -1
  86. package/dist/src/commands/furnace/remove.js +4 -8
  87. package/dist/src/commands/furnace/rename-browser-test.js +10 -15
  88. package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
  89. package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
  90. package/dist/src/commands/furnace/rename.js +36 -36
  91. package/dist/src/commands/furnace/scan.js +3 -3
  92. package/dist/src/commands/furnace/status.js +19 -16
  93. package/dist/src/commands/furnace/sync.js +6 -6
  94. package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
  95. package/dist/src/commands/furnace/test-file-name.js +39 -0
  96. package/dist/src/commands/furnace/validate.js +11 -12
  97. package/dist/src/commands/furnace/validation-output.d.ts +21 -9
  98. package/dist/src/commands/furnace/validation-output.js +3 -8
  99. package/dist/src/commands/import.js +22 -29
  100. package/dist/src/commands/lint-per-patch.d.ts +2 -2
  101. package/dist/src/commands/lint-per-patch.js +27 -12
  102. package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
  103. package/dist/src/commands/lint-per-run-checkjs.js +14 -15
  104. package/dist/src/commands/lint-report.d.ts +3 -3
  105. package/dist/src/commands/lint-report.js +4 -4
  106. package/dist/src/commands/lint.d.ts +5 -4
  107. package/dist/src/commands/lint.js +36 -36
  108. package/dist/src/commands/manifest.d.ts +4 -4
  109. package/dist/src/commands/manifest.js +1 -1
  110. package/dist/src/commands/package.js +4 -6
  111. package/dist/src/commands/patch/compact.d.ts +2 -2
  112. package/dist/src/commands/patch/compact.js +19 -20
  113. package/dist/src/commands/patch/delete.d.ts +1 -1
  114. package/dist/src/commands/patch/delete.js +23 -33
  115. package/dist/src/commands/patch/entry-projection.d.ts +13 -0
  116. package/dist/src/commands/patch/entry-projection.js +24 -0
  117. package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
  118. package/dist/src/commands/patch/lint-ignore.js +33 -44
  119. package/dist/src/commands/patch/move-files-create.d.ts +2 -2
  120. package/dist/src/commands/patch/move-files-create.js +29 -15
  121. package/dist/src/commands/patch/move-files-into.d.ts +2 -2
  122. package/dist/src/commands/patch/move-files-into.js +41 -37
  123. package/dist/src/commands/patch/move-files.js +5 -14
  124. package/dist/src/commands/patch/patch-context.d.ts +1 -1
  125. package/dist/src/commands/patch/rename.d.ts +4 -4
  126. package/dist/src/commands/patch/rename.js +35 -49
  127. package/dist/src/commands/patch/reorder.js +35 -48
  128. package/dist/src/commands/patch/split-plan.d.ts +7 -8
  129. package/dist/src/commands/patch/split-plan.js +10 -13
  130. package/dist/src/commands/patch/split.d.ts +2 -2
  131. package/dist/src/commands/patch/split.js +50 -48
  132. package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
  133. package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
  134. package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
  135. package/dist/src/commands/patch/staged-dependency.js +22 -28
  136. package/dist/src/commands/patch/tier.d.ts +2 -2
  137. package/dist/src/commands/patch/tier.js +20 -30
  138. package/dist/src/commands/patch-rename-map.d.ts +19 -0
  139. package/dist/src/commands/patch-rename-map.js +36 -0
  140. package/dist/src/commands/pending-resolution.d.ts +15 -0
  141. package/dist/src/commands/pending-resolution.js +25 -0
  142. package/dist/src/commands/re-export-adjacent.d.ts +25 -3
  143. package/dist/src/commands/re-export-adjacent.js +40 -24
  144. package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
  145. package/dist/src/commands/re-export-bulk-scan.js +23 -27
  146. package/dist/src/commands/re-export-drift.d.ts +10 -10
  147. package/dist/src/commands/re-export-drift.js +33 -33
  148. package/dist/src/commands/re-export-files.d.ts +2 -3
  149. package/dist/src/commands/re-export-files.js +52 -44
  150. package/dist/src/commands/re-export-lint.d.ts +29 -30
  151. package/dist/src/commands/re-export-lint.js +36 -29
  152. package/dist/src/commands/re-export-options.d.ts +1 -1
  153. package/dist/src/commands/re-export-options.js +1 -1
  154. package/dist/src/commands/re-export-register.d.ts +1 -1
  155. package/dist/src/commands/re-export-register.js +1 -1
  156. package/dist/src/commands/re-export-scan.d.ts +1 -1
  157. package/dist/src/commands/re-export-scan.js +12 -9
  158. package/dist/src/commands/re-export-single.d.ts +23 -4
  159. package/dist/src/commands/re-export-single.js +39 -31
  160. package/dist/src/commands/re-export.js +35 -17
  161. package/dist/src/commands/rebase/abort.js +9 -14
  162. package/dist/src/commands/rebase/continue.js +20 -19
  163. package/dist/src/commands/rebase/index.d.ts +1 -1
  164. package/dist/src/commands/rebase/index.js +5 -5
  165. package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
  166. package/dist/src/commands/rebase/patch-loop.js +20 -24
  167. package/dist/src/commands/register.js +5 -5
  168. package/dist/src/commands/reset.js +1 -1
  169. package/dist/src/commands/resolve.d.ts +2 -2
  170. package/dist/src/commands/resolve.js +21 -13
  171. package/dist/src/commands/run.d.ts +0 -13
  172. package/dist/src/commands/run.js +38 -51
  173. package/dist/src/commands/setup-support.d.ts +16 -4
  174. package/dist/src/commands/setup-support.js +20 -20
  175. package/dist/src/commands/setup.js +4 -10
  176. package/dist/src/commands/source.js +9 -2
  177. package/dist/src/commands/status-check.d.ts +3 -3
  178. package/dist/src/commands/status-check.js +6 -6
  179. package/dist/src/commands/status-json.d.ts +14 -13
  180. package/dist/src/commands/status-json.js +9 -8
  181. package/dist/src/commands/status-output.d.ts +3 -3
  182. package/dist/src/commands/status-output.js +5 -5
  183. package/dist/src/commands/status-ownership.d.ts +3 -3
  184. package/dist/src/commands/status-ownership.js +3 -3
  185. package/dist/src/commands/status.js +25 -26
  186. package/dist/src/commands/test-build-phase.d.ts +3 -3
  187. package/dist/src/commands/test-build-phase.js +48 -24
  188. package/dist/src/commands/test-diagnose.d.ts +1 -1
  189. package/dist/src/commands/test-diagnose.js +20 -20
  190. package/dist/src/commands/test-modes.d.ts +4 -4
  191. package/dist/src/commands/test-modes.js +4 -5
  192. package/dist/src/commands/test-register.js +5 -3
  193. package/dist/src/commands/test-run.d.ts +11 -11
  194. package/dist/src/commands/test-run.js +40 -33
  195. package/dist/src/commands/test-stale-gate.d.ts +12 -12
  196. package/dist/src/commands/test-stale-gate.js +17 -17
  197. package/dist/src/commands/test-verdict.d.ts +19 -5
  198. package/dist/src/commands/test-verdict.js +26 -11
  199. package/dist/src/commands/test.d.ts +3 -3
  200. package/dist/src/commands/test.js +73 -36
  201. package/dist/src/commands/token-coverage.js +3 -3
  202. package/dist/src/commands/token-list.d.ts +26 -0
  203. package/dist/src/commands/token-list.js +153 -0
  204. package/dist/src/commands/token.js +26 -10
  205. package/dist/src/commands/tree.js +26 -21
  206. package/dist/src/commands/typecheck.d.ts +6 -6
  207. package/dist/src/commands/typecheck.js +16 -16
  208. package/dist/src/commands/verify.d.ts +3 -3
  209. package/dist/src/commands/verify.js +10 -10
  210. package/dist/src/commands/watch.js +11 -11
  211. package/dist/src/commands/wire.js +17 -16
  212. package/dist/src/core/ast-utils.d.ts +7 -7
  213. package/dist/src/core/ast-utils.js +8 -8
  214. package/dist/src/core/branding.d.ts +5 -12
  215. package/dist/src/core/branding.js +6 -5
  216. package/dist/src/core/browser-wire.d.ts +1 -1
  217. package/dist/src/core/browser-wire.js +10 -7
  218. package/dist/src/core/build-audit-platform.d.ts +32 -3
  219. package/dist/src/core/build-audit-platform.js +153 -13
  220. package/dist/src/core/build-audit-registration.d.ts +5 -5
  221. package/dist/src/core/build-audit-registration.js +10 -9
  222. package/dist/src/core/build-audit-resolve.d.ts +5 -5
  223. package/dist/src/core/build-audit-resolve.js +6 -6
  224. package/dist/src/core/build-audit-skip.d.ts +57 -0
  225. package/dist/src/core/build-audit-skip.js +112 -0
  226. package/dist/src/core/build-audit-transforms.d.ts +2 -2
  227. package/dist/src/core/build-audit-transforms.js +3 -3
  228. package/dist/src/core/build-audit.d.ts +21 -8
  229. package/dist/src/core/build-audit.js +142 -40
  230. package/dist/src/core/build-baseline-types.d.ts +19 -18
  231. package/dist/src/core/build-baseline-types.js +1 -1
  232. package/dist/src/core/build-baseline.d.ts +48 -31
  233. package/dist/src/core/build-baseline.js +20 -43
  234. package/dist/src/core/build-jar-escalation.d.ts +8 -8
  235. package/dist/src/core/build-jar-escalation.js +18 -17
  236. package/dist/src/core/build-overwrite-guard.d.ts +4 -4
  237. package/dist/src/core/build-overwrite-guard.js +14 -14
  238. package/dist/src/core/build-prepare.d.ts +4 -12
  239. package/dist/src/core/build-prepare.js +22 -26
  240. package/dist/src/core/config-mutate.js +4 -4
  241. package/dist/src/core/config-paths.d.ts +2 -6
  242. package/dist/src/core/config-paths.js +4 -2
  243. package/dist/src/core/config-state.d.ts +0 -6
  244. package/dist/src/core/config-state.js +3 -21
  245. package/dist/src/core/config-validate-build-audit.d.ts +8 -0
  246. package/dist/src/core/config-validate-build-audit.js +80 -0
  247. package/dist/src/core/config-validate-file-size.d.ts +1 -1
  248. package/dist/src/core/config-validate-file-size.js +3 -3
  249. package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
  250. package/dist/src/core/config-validate-patch-policy.js +3 -3
  251. package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
  252. package/dist/src/core/config-validate-test-toolchains.js +4 -5
  253. package/dist/src/core/config-validate.js +22 -12
  254. package/dist/src/core/config.d.ts +12 -12
  255. package/dist/src/core/config.js +21 -25
  256. package/dist/src/core/coverage-extend.d.ts +16 -16
  257. package/dist/src/core/coverage-extend.js +20 -20
  258. package/dist/src/core/destructive.d.ts +14 -14
  259. package/dist/src/core/destructive.js +9 -9
  260. package/dist/src/core/diff-hunks.d.ts +2 -2
  261. package/dist/src/core/diff-hunks.js +7 -7
  262. package/dist/src/core/discard-baseline.d.ts +10 -10
  263. package/dist/src/core/discard-baseline.js +22 -23
  264. package/dist/src/core/display-state.d.ts +11 -11
  265. package/dist/src/core/display-state.js +12 -12
  266. package/dist/src/core/engine-changes.d.ts +2 -2
  267. package/dist/src/core/engine-changes.js +2 -2
  268. package/dist/src/core/engine-precondition.d.ts +5 -13
  269. package/dist/src/core/engine-precondition.js +5 -10
  270. package/dist/src/core/engine-session-lock.d.ts +18 -18
  271. package/dist/src/core/engine-session-lock.js +50 -54
  272. package/dist/src/core/export-moved-code-shape.d.ts +7 -7
  273. package/dist/src/core/export-moved-code-shape.js +10 -10
  274. package/dist/src/core/file-lock-owner.d.ts +103 -0
  275. package/dist/src/core/file-lock-owner.js +259 -0
  276. package/dist/src/core/file-lock.d.ts +14 -19
  277. package/dist/src/core/file-lock.js +90 -128
  278. package/dist/src/core/firefox-cache.d.ts +13 -1
  279. package/dist/src/core/firefox-cache.js +61 -36
  280. package/dist/src/core/firefox-download.d.ts +15 -0
  281. package/dist/src/core/firefox-download.js +38 -22
  282. package/dist/src/core/firefox-extract.d.ts +8 -7
  283. package/dist/src/core/firefox-extract.js +45 -27
  284. package/dist/src/core/firefox.d.ts +34 -36
  285. package/dist/src/core/firefox.js +13 -44
  286. package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
  287. package/dist/src/core/furnace-apply-dry-run.js +2 -8
  288. package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
  289. package/dist/src/core/furnace-apply-ftl.js +8 -8
  290. package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
  291. package/dist/src/core/furnace-apply-helpers.js +28 -39
  292. package/dist/src/core/furnace-apply-output.js +1 -1
  293. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
  294. package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
  295. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
  296. package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
  297. package/dist/src/core/furnace-apply.d.ts +4 -4
  298. package/dist/src/core/furnace-apply.js +50 -29
  299. package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
  300. package/dist/src/core/furnace-checksum-utils.js +5 -5
  301. package/dist/src/core/furnace-config-custom.d.ts +1 -1
  302. package/dist/src/core/furnace-config-custom.js +2 -2
  303. package/dist/src/core/furnace-config-order.js +1 -1
  304. package/dist/src/core/furnace-config-tokens.d.ts +3 -3
  305. package/dist/src/core/furnace-config-tokens.js +3 -3
  306. package/dist/src/core/furnace-config-validate.js +2 -2
  307. package/dist/src/core/furnace-config.d.ts +5 -5
  308. package/dist/src/core/furnace-config.js +40 -53
  309. package/dist/src/core/furnace-constants.d.ts +6 -6
  310. package/dist/src/core/furnace-constants.js +9 -8
  311. package/dist/src/core/furnace-css-fragments.d.ts +6 -6
  312. package/dist/src/core/furnace-css-fragments.js +11 -11
  313. package/dist/src/core/furnace-dir-entry.d.ts +20 -0
  314. package/dist/src/core/furnace-dir-entry.js +21 -0
  315. package/dist/src/core/furnace-jsconfig.d.ts +7 -7
  316. package/dist/src/core/furnace-jsconfig.js +22 -20
  317. package/dist/src/core/furnace-operation.d.ts +22 -19
  318. package/dist/src/core/furnace-operation.js +38 -34
  319. package/dist/src/core/furnace-precondition.d.ts +10 -10
  320. package/dist/src/core/furnace-precondition.js +8 -8
  321. package/dist/src/core/furnace-refresh.d.ts +18 -6
  322. package/dist/src/core/furnace-refresh.js +5 -8
  323. package/dist/src/core/furnace-registration-ast.d.ts +2 -3
  324. package/dist/src/core/furnace-registration-ast.js +9 -12
  325. package/dist/src/core/furnace-registration-remove.d.ts +4 -4
  326. package/dist/src/core/furnace-registration-remove.js +6 -6
  327. package/dist/src/core/furnace-registration-validate.d.ts +2 -2
  328. package/dist/src/core/furnace-registration-validate.js +2 -2
  329. package/dist/src/core/furnace-registration.d.ts +7 -6
  330. package/dist/src/core/furnace-registration.js +29 -36
  331. package/dist/src/core/furnace-rollback.d.ts +1 -1
  332. package/dist/src/core/furnace-rollback.js +5 -5
  333. package/dist/src/core/furnace-scanner.js +3 -6
  334. package/dist/src/core/furnace-stale-export.d.ts +17 -16
  335. package/dist/src/core/furnace-stale-export.js +16 -15
  336. package/dist/src/core/furnace-staleness.d.ts +2 -2
  337. package/dist/src/core/furnace-staleness.js +2 -2
  338. package/dist/src/core/furnace-state-persist.d.ts +12 -12
  339. package/dist/src/core/furnace-state-persist.js +10 -10
  340. package/dist/src/core/furnace-step-errors.d.ts +6 -6
  341. package/dist/src/core/furnace-step-errors.js +6 -6
  342. package/dist/src/core/furnace-validate-accessibility.js +14 -14
  343. package/dist/src/core/furnace-validate-compatibility.js +9 -9
  344. package/dist/src/core/furnace-validate-registration.d.ts +2 -2
  345. package/dist/src/core/furnace-validate-registration.js +18 -20
  346. package/dist/src/core/furnace-validate-structure.d.ts +1 -1
  347. package/dist/src/core/furnace-validate-structure.js +4 -4
  348. package/dist/src/core/furnace-validate.js +9 -9
  349. package/dist/src/core/furnace-version-drift.d.ts +5 -5
  350. package/dist/src/core/furnace-version-drift.js +5 -5
  351. package/dist/src/core/git-base.d.ts +6 -4
  352. package/dist/src/core/git-base.js +29 -7
  353. package/dist/src/core/git-diff-new-file.d.ts +40 -0
  354. package/dist/src/core/git-diff-new-file.js +119 -0
  355. package/dist/src/core/git-diff.d.ts +13 -13
  356. package/dist/src/core/git-diff.js +121 -189
  357. package/dist/src/core/git-file-ops.d.ts +6 -13
  358. package/dist/src/core/git-file-ops.js +11 -35
  359. package/dist/src/core/git-readonly-index.d.ts +12 -14
  360. package/dist/src/core/git-readonly-index.js +12 -16
  361. package/dist/src/core/git-status.d.ts +9 -2
  362. package/dist/src/core/git-status.js +23 -11
  363. package/dist/src/core/git.d.ts +3 -9
  364. package/dist/src/core/git.js +28 -57
  365. package/dist/src/core/harness-orphans.d.ts +17 -17
  366. package/dist/src/core/harness-orphans.js +28 -27
  367. package/dist/src/core/history-log.d.ts +19 -0
  368. package/dist/src/core/history-log.js +29 -0
  369. package/dist/src/core/license-headers.d.ts +19 -18
  370. package/dist/src/core/license-headers.js +29 -28
  371. package/dist/src/core/mach-build-artifacts.d.ts +21 -21
  372. package/dist/src/core/mach-build-artifacts.js +23 -23
  373. package/dist/src/core/mach-error-hints.d.ts +5 -10
  374. package/dist/src/core/mach-error-hints.js +14 -14
  375. package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
  376. package/dist/src/core/mach-known-noise-filter.js +57 -56
  377. package/dist/src/core/mach-mozconfig.d.ts +6 -6
  378. package/dist/src/core/mach-mozconfig.js +17 -16
  379. package/dist/src/core/mach-python.d.ts +3 -0
  380. package/dist/src/core/mach-python.js +13 -7
  381. package/dist/src/core/mach-resource-shim.d.ts +24 -12
  382. package/dist/src/core/mach-resource-shim.js +124 -21
  383. package/dist/src/core/mach.d.ts +59 -73
  384. package/dist/src/core/mach.js +47 -115
  385. package/dist/src/core/marionette-port.d.ts +15 -30
  386. package/dist/src/core/marionette-port.js +46 -89
  387. package/dist/src/core/marionette-preflight.d.ts +6 -6
  388. package/dist/src/core/marionette-preflight.js +32 -50
  389. package/dist/src/core/markdown-table.d.ts +9 -9
  390. package/dist/src/core/markdown-table.js +14 -14
  391. package/dist/src/core/mochitest-server-port.d.ts +8 -8
  392. package/dist/src/core/mochitest-server-port.js +17 -17
  393. package/dist/src/core/module-resolution-preflight.d.ts +8 -8
  394. package/dist/src/core/module-resolution-preflight.js +11 -11
  395. package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
  396. package/dist/src/core/moz-manifest-helpers.js +7 -7
  397. package/dist/src/core/moz-manifest-register.d.ts +1 -1
  398. package/dist/src/core/moz-manifest-register.js +2 -2
  399. package/dist/src/core/moz-manifest-rules.js +46 -42
  400. package/dist/src/core/moz-manifest-tokenizers.js +1 -1
  401. package/dist/src/core/ownership-table.d.ts +5 -5
  402. package/dist/src/core/ownership-table.js +7 -7
  403. package/dist/src/core/parser-fallback.d.ts +3 -3
  404. package/dist/src/core/parser-fallback.js +3 -3
  405. package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
  406. package/dist/src/core/patch-apply-fuzz.js +13 -13
  407. package/dist/src/core/patch-apply.d.ts +13 -14
  408. package/dist/src/core/patch-apply.js +36 -42
  409. package/dist/src/core/patch-export-coverage.d.ts +0 -9
  410. package/dist/src/core/patch-export-coverage.js +1 -30
  411. package/dist/src/core/patch-export-update.d.ts +21 -4
  412. package/dist/src/core/patch-export-update.js +7 -6
  413. package/dist/src/core/patch-export.d.ts +20 -30
  414. package/dist/src/core/patch-export.js +55 -77
  415. package/dist/src/core/patch-files.d.ts +0 -4
  416. package/dist/src/core/patch-files.js +0 -11
  417. package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
  418. package/dist/src/core/patch-identifier-suggest.js +4 -4
  419. package/dist/src/core/patch-lint-binary.d.ts +12 -18
  420. package/dist/src/core/patch-lint-cache.d.ts +18 -2
  421. package/dist/src/core/patch-lint-cache.js +16 -19
  422. package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
  423. package/dist/src/core/patch-lint-checkjs.js +78 -64
  424. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
  425. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
  426. package/dist/src/core/patch-lint-creators.d.ts +5 -9
  427. package/dist/src/core/patch-lint-creators.js +3 -3
  428. package/dist/src/core/patch-lint-cross.d.ts +27 -19
  429. package/dist/src/core/patch-lint-cross.js +67 -110
  430. package/dist/src/core/patch-lint-css.d.ts +1 -1
  431. package/dist/src/core/patch-lint-css.js +15 -11
  432. package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
  433. package/dist/src/core/patch-lint-diff-tag.js +5 -5
  434. package/dist/src/core/patch-lint-diff.d.ts +4 -4
  435. package/dist/src/core/patch-lint-diff.js +4 -4
  436. package/dist/src/core/patch-lint-file-size.d.ts +3 -3
  437. package/dist/src/core/patch-lint-file-size.js +6 -6
  438. package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
  439. package/dist/src/core/patch-lint-forward-registration.js +210 -0
  440. package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
  441. package/dist/src/core/patch-lint-jsdoc.js +46 -46
  442. package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
  443. package/dist/src/core/patch-lint-module-registration.js +1 -1
  444. package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
  445. package/dist/src/core/patch-lint-mozbuild.js +10 -10
  446. package/dist/src/core/patch-lint-observer.d.ts +3 -3
  447. package/dist/src/core/patch-lint-observer.js +7 -7
  448. package/dist/src/core/patch-lint-ownership.d.ts +6 -6
  449. package/dist/src/core/patch-lint-ownership.js +6 -6
  450. package/dist/src/core/patch-lint-prettier.d.ts +6 -6
  451. package/dist/src/core/patch-lint-prettier.js +7 -7
  452. package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
  453. package/dist/src/core/patch-lint-queue-types.js +12 -0
  454. package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
  455. package/dist/src/core/patch-lint-staged-registration.js +90 -0
  456. package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
  457. package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
  458. package/dist/src/core/patch-lint.d.ts +41 -35
  459. package/dist/src/core/patch-lint.js +52 -49
  460. package/dist/src/core/patch-lock.d.ts +1 -1
  461. package/dist/src/core/patch-lock.js +11 -11
  462. package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
  463. package/dist/src/core/patch-manifest-consistency.js +16 -17
  464. package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
  465. package/dist/src/core/patch-manifest-files-affected.js +3 -3
  466. package/dist/src/core/patch-manifest-io.d.ts +14 -14
  467. package/dist/src/core/patch-manifest-io.js +35 -34
  468. package/dist/src/core/patch-manifest-query.d.ts +1 -1
  469. package/dist/src/core/patch-manifest-query.js +4 -4
  470. package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
  471. package/dist/src/core/patch-manifest-resolve.js +7 -7
  472. package/dist/src/core/patch-manifest-validate.js +3 -3
  473. package/dist/src/core/patch-manifest.d.ts +2 -2
  474. package/dist/src/core/patch-manifest.js +2 -2
  475. package/dist/src/core/patch-parse.d.ts +32 -21
  476. package/dist/src/core/patch-parse.js +40 -15
  477. package/dist/src/core/patch-policy.js +15 -27
  478. package/dist/src/core/patch-registration-refs.d.ts +4 -4
  479. package/dist/src/core/patch-registration-refs.js +7 -7
  480. package/dist/src/core/patch-source-metadata.d.ts +1 -3
  481. package/dist/src/core/patch-source-metadata.js +0 -4
  482. package/dist/src/core/patch-transform.d.ts +8 -16
  483. package/dist/src/core/patch-transform.js +13 -23
  484. package/dist/src/core/process-cpu-time.d.ts +1 -1
  485. package/dist/src/core/process-cpu-time.js +6 -6
  486. package/dist/src/core/rebase-session.d.ts +9 -15
  487. package/dist/src/core/rebase-session.js +13 -25
  488. package/dist/src/core/register-browser-content.js +3 -2
  489. package/dist/src/core/register-browser-test.js +2 -1
  490. package/dist/src/core/register-module.js +2 -1
  491. package/dist/src/core/register-result.d.ts +1 -1
  492. package/dist/src/core/register-result.js +1 -1
  493. package/dist/src/core/register-scaffold.d.ts +2 -2
  494. package/dist/src/core/register-scaffold.js +8 -7
  495. package/dist/src/core/register-shared-css.d.ts +3 -3
  496. package/dist/src/core/register-shared-css.js +6 -5
  497. package/dist/src/core/register-xpcshell-test.d.ts +2 -2
  498. package/dist/src/core/register-xpcshell-test.js +2 -2
  499. package/dist/src/core/run-log-redact.d.ts +38 -0
  500. package/dist/src/core/run-log-redact.js +69 -0
  501. package/dist/src/core/run-log.d.ts +21 -10
  502. package/dist/src/core/run-log.js +76 -27
  503. package/dist/src/core/shared-ftl.d.ts +2 -2
  504. package/dist/src/core/shared-ftl.js +6 -6
  505. package/dist/src/core/signal-critical.d.ts +2 -2
  506. package/dist/src/core/signal-critical.js +4 -6
  507. package/dist/src/core/smoke-patterns.d.ts +5 -6
  508. package/dist/src/core/smoke-patterns.js +15 -20
  509. package/dist/src/core/state-file.d.ts +15 -4
  510. package/dist/src/core/state-file.js +14 -1
  511. package/dist/src/core/status-binary.d.ts +8 -8
  512. package/dist/src/core/status-binary.js +12 -12
  513. package/dist/src/core/status-classify.d.ts +17 -17
  514. package/dist/src/core/status-classify.js +13 -12
  515. package/dist/src/core/test-changed-prefs.d.ts +12 -12
  516. package/dist/src/core/test-changed-prefs.js +40 -25
  517. package/dist/src/core/test-harness-crash.d.ts +39 -39
  518. package/dist/src/core/test-harness-crash.js +69 -69
  519. package/dist/src/core/test-harness-output.d.ts +7 -7
  520. package/dist/src/core/test-harness-output.js +7 -7
  521. package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
  522. package/dist/src/core/test-harness-verdict-notes.js +4 -4
  523. package/dist/src/core/test-path-scope.d.ts +8 -8
  524. package/dist/src/core/test-path-scope.js +11 -11
  525. package/dist/src/core/test-stale-check.d.ts +22 -23
  526. package/dist/src/core/test-stale-check.js +31 -30
  527. package/dist/src/core/test-stale-symlink.d.ts +1 -1
  528. package/dist/src/core/test-stale-symlink.js +1 -1
  529. package/dist/src/core/test-stall-triage.d.ts +9 -9
  530. package/dist/src/core/test-stall-triage.js +22 -22
  531. package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
  532. package/dist/src/core/test-xpcshell-retry.js +14 -11
  533. package/dist/src/core/token-category.d.ts +35 -2
  534. package/dist/src/core/token-category.js +67 -58
  535. package/dist/src/core/token-coverage.js +4 -5
  536. package/dist/src/core/token-dark-mode.d.ts +9 -9
  537. package/dist/src/core/token-dark-mode.js +13 -25
  538. package/dist/src/core/token-docs.d.ts +1 -1
  539. package/dist/src/core/token-inventory.d.ts +56 -0
  540. package/dist/src/core/token-inventory.js +109 -0
  541. package/dist/src/core/token-manager.d.ts +4 -4
  542. package/dist/src/core/token-manager.js +22 -22
  543. package/dist/src/core/token-scaffold.d.ts +4 -4
  544. package/dist/src/core/token-scaffold.js +4 -4
  545. package/dist/src/core/token-variant.d.ts +14 -14
  546. package/dist/src/core/token-variant.js +52 -53
  547. package/dist/src/core/toolchain-preflight.d.ts +15 -15
  548. package/dist/src/core/toolchain-preflight.js +23 -23
  549. package/dist/src/core/tree-cow.d.ts +3 -5
  550. package/dist/src/core/tree-cow.js +8 -8
  551. package/dist/src/core/tree-guard.d.ts +3 -3
  552. package/dist/src/core/tree-guard.js +23 -23
  553. package/dist/src/core/tree-store.d.ts +15 -15
  554. package/dist/src/core/tree-store.js +39 -38
  555. package/dist/src/core/typecheck-shim.d.ts +16 -15
  556. package/dist/src/core/typecheck-shim.js +26 -25
  557. package/dist/src/core/typecheck.d.ts +12 -12
  558. package/dist/src/core/typecheck.js +33 -33
  559. package/dist/src/core/wire-destroy.d.ts +2 -2
  560. package/dist/src/core/wire-destroy.js +5 -5
  561. package/dist/src/core/wire-dom-fragment.d.ts +3 -3
  562. package/dist/src/core/wire-dom-fragment.js +12 -23
  563. package/dist/src/core/wire-init.d.ts +2 -2
  564. package/dist/src/core/wire-init.js +7 -7
  565. package/dist/src/core/wire-subscript.d.ts +1 -1
  566. package/dist/src/core/wire-subscript.js +3 -3
  567. package/dist/src/core/wire-utils.d.ts +9 -9
  568. package/dist/src/core/wire-utils.js +16 -28
  569. package/dist/src/core/xpcshell-appdir.d.ts +20 -20
  570. package/dist/src/core/xpcshell-appdir.js +28 -30
  571. package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
  572. package/dist/src/core/xpcshell-profile-dir.js +7 -7
  573. package/dist/src/errors/base.d.ts +69 -16
  574. package/dist/src/errors/base.js +95 -26
  575. package/dist/src/errors/build.d.ts +6 -6
  576. package/dist/src/errors/build.js +26 -34
  577. package/dist/src/errors/codes.d.ts +10 -10
  578. package/dist/src/errors/codes.js +10 -10
  579. package/dist/src/errors/config.d.ts +0 -14
  580. package/dist/src/errors/config.js +13 -34
  581. package/dist/src/errors/download.d.ts +13 -0
  582. package/dist/src/errors/download.js +53 -24
  583. package/dist/src/errors/furnace.d.ts +2 -2
  584. package/dist/src/errors/furnace.js +8 -9
  585. package/dist/src/errors/git.d.ts +9 -9
  586. package/dist/src/errors/git.js +21 -31
  587. package/dist/src/errors/patch.d.ts +3 -3
  588. package/dist/src/errors/patch.js +11 -13
  589. package/dist/src/errors/rebase.d.ts +1 -1
  590. package/dist/src/errors/rebase.js +8 -8
  591. package/dist/src/errors/run.d.ts +1 -1
  592. package/dist/src/errors/run.js +1 -1
  593. package/dist/src/index.d.ts +4 -4
  594. package/dist/src/index.js +4 -4
  595. package/dist/src/types/commands/options.d.ts +155 -200
  596. package/dist/src/types/commands/patches.d.ts +19 -19
  597. package/dist/src/types/commands/project.d.ts +3 -3
  598. package/dist/src/types/config.d.ts +52 -19
  599. package/dist/src/types/furnace.d.ts +17 -17
  600. package/dist/src/types/index.d.ts +0 -1
  601. package/dist/src/types/json.d.ts +3 -3
  602. package/dist/src/types/json.js +2 -2
  603. package/dist/src/types/typecheck.d.ts +3 -3
  604. package/dist/src/utils/assert.d.ts +4 -16
  605. package/dist/src/utils/assert.js +7 -24
  606. package/dist/src/utils/build-info.d.ts +6 -6
  607. package/dist/src/utils/build-info.js +6 -6
  608. package/dist/src/utils/child-env.d.ts +7 -6
  609. package/dist/src/utils/child-env.js +5 -5
  610. package/dist/src/utils/concurrency.d.ts +2 -2
  611. package/dist/src/utils/concurrency.js +2 -2
  612. package/dist/src/utils/elapsed.js +10 -1
  613. package/dist/src/utils/errors.d.ts +8 -8
  614. package/dist/src/utils/errors.js +8 -8
  615. package/dist/src/utils/fs.d.ts +1 -1
  616. package/dist/src/utils/fs.js +15 -20
  617. package/dist/src/utils/hash.d.ts +12 -0
  618. package/dist/src/utils/hash.js +16 -0
  619. package/dist/src/utils/line-dispatch.d.ts +15 -0
  620. package/dist/src/utils/line-dispatch.js +48 -0
  621. package/dist/src/utils/logger.d.ts +4 -4
  622. package/dist/src/utils/logger.js +11 -11
  623. package/dist/src/utils/machine-output.js +2 -2
  624. package/dist/src/utils/options.d.ts +14 -20
  625. package/dist/src/utils/options.js +26 -27
  626. package/dist/src/utils/package-root.js +5 -14
  627. package/dist/src/utils/paths.d.ts +4 -4
  628. package/dist/src/utils/paths.js +4 -4
  629. package/dist/src/utils/platform.d.ts +0 -4
  630. package/dist/src/utils/process-group.d.ts +10 -9
  631. package/dist/src/utils/process-group.js +37 -36
  632. package/dist/src/utils/process.d.ts +70 -55
  633. package/dist/src/utils/process.js +129 -179
  634. package/dist/src/utils/ps-duration.d.ts +4 -4
  635. package/dist/src/utils/ps-duration.js +9 -9
  636. package/dist/src/utils/regex.d.ts +4 -4
  637. package/dist/src/utils/regex.js +7 -7
  638. package/dist/src/utils/sleep.d.ts +26 -0
  639. package/dist/src/utils/sleep.js +31 -0
  640. package/dist/src/utils/stdio-drain.d.ts +7 -7
  641. package/dist/src/utils/stdio-drain.js +8 -8
  642. package/dist/src/utils/validation.d.ts +12 -49
  643. package/dist/src/utils/validation.js +26 -36
  644. package/docs/README.md +2 -2
  645. package/docs/configuration.md +163 -69
  646. package/docs/exit-codes.md +66 -49
  647. package/docs/furnace.md +20 -19
  648. package/docs/lifecycle-invariants.md +414 -247
  649. package/docs/machine-output.md +58 -34
  650. package/docs/patch-workflow.md +48 -44
  651. package/docs/run-logs.md +72 -28
  652. package/docs/testing.md +105 -98
  653. package/docs/verification-trees.md +23 -22
  654. package/package.json +7 -6
  655. package/dist/src/commands/rebase.d.ts +0 -4
  656. package/dist/src/commands/rebase.js +0 -5
  657. package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
  658. package/dist/src/core/patch-artifact-normalize.js +0 -24
  659. package/dist/src/core/patch-lint-reexports.d.ts +0 -7
  660. package/dist/src/core/patch-lint-reexports.js +0 -8
  661. package/dist/src/core/wire-targets.d.ts +0 -7
  662. package/dist/src/core/wire-targets.js +0 -8
@@ -3,10 +3,26 @@
3
3
  * command entrypoint so the generator is unit-testable in isolation and the
4
4
  * command file stays under the per-file LOC budget.
5
5
  */
6
+ export interface GenerateMjsContentOptions {
7
+ /** Custom element tag name. */
8
+ name: string;
9
+ /** Generated component class name. */
10
+ className: string;
11
+ /** Human-readable component description. */
12
+ description: string;
13
+ /** Whether to emit the Fluent wiring. */
14
+ localized: boolean;
15
+ /** License header prepended to the module. */
16
+ header: string;
17
+ /** chrome:// sub-path for the generated FTL reference, when localized. */
18
+ ftlChromeSubPath: string | undefined;
19
+ /** Explicit shared FTL path, used verbatim when supplied. */
20
+ sharedFtl: string | undefined;
21
+ }
6
22
  /**
7
23
  * Generates the .mjs file content for a custom component.
8
24
  *
9
- * `MozLitElement` does NOT expose `insertFTLIfNeeded` — that method lives on
25
+ * `MozLitElement` does not expose `insertFTLIfNeeded`. That method lives on
10
26
  * `MozXULElement`. Calling it from `connectedCallback` on a Lit-based
11
27
  * component throws `TypeError: this.insertFTLIfNeeded is not a function` at
12
28
  * every connect. Upstream Firefox components (e.g. `moz-input-folder.mjs`)
@@ -15,15 +31,15 @@
15
31
  * that pattern here so `--localized` produces functional code.
16
32
  *
17
33
  * Path resolution precedence (when `localized` is true):
18
- * 1. `sharedFtl` — used verbatim. The caller has resolved it from
19
- * `--shared-ftl` / `furnace.json`; this template does no rewriting.
34
+ * 1. `sharedFtl`: used verbatim. The caller has resolved it from
35
+ * `--shared-ftl` / `furnace.json`. This template does no rewriting.
20
36
  * Use this when the component participates in a feature-scoped
21
37
  * bundle that another component owns.
22
- * 2. `<ftlChromeSubPath>/<name>.ftl` — the default per-component path,
38
+ * 2. `<ftlChromeSubPath>/<name>.ftl`: the default per-component path,
23
39
  * matching the locale jar.mn entry that `furnace apply` writes.
24
- * 3. `<name>.ftl` — fallback when no chrome sub-path was resolvable.
40
+ * 3. `<name>.ftl`: fallback when no chrome sub-path was resolvable.
25
41
  */
26
- export declare function generateMjsContent(name: string, className: string, description: string, localized: boolean, header: string, ftlChromeSubPath: string | undefined, sharedFtl: string | undefined): string;
42
+ export declare function generateMjsContent(options: GenerateMjsContentOptions): string;
27
43
  /** Generates the .css file content for a custom component. */
28
44
  export declare function generateCssContent(header: string): string;
29
45
  /** Generates the .ftl file content for a custom component. */
@@ -34,7 +50,7 @@ export declare function xpcshellTestFileName(name: string): string;
34
50
  * Generates an xpcshell test file for a custom component.
35
51
  *
36
52
  * xpcshell cannot execute a component module that imports
37
- * `chrome://global/content/vendor/lit.all.mjs` — the Lit bundle touches
53
+ * `chrome://global/content/vendor/lit.all.mjs`: the Lit bundle touches
38
54
  * `window` at module-load time and the xpcshell harness has no `window`
39
55
  * global. A scaffold that calls `ChromeUtils.importESModule` on the
40
56
  * component's MJS therefore fails with `ReferenceError: window is not
@@ -45,15 +61,15 @@ export declare function xpcshellTestFileName(name: string): string;
45
61
  * This template mirrors the chrome-doc packaging test instead: XCurProcD is
46
62
  * probed at a pair of candidate layouts (dist/bin/browser and the macOS
47
63
  * .app-bundle / ESR layout) to confirm the `.mjs` and `.css` files landed
48
- * where jar.mn promised. That is the assertion xpcshell CAN make. Functional
64
+ * where jar.mn promised. That is the assertion xpcshell can make. Functional
49
65
  * tests that need DOM/shadow-root/keyboard behaviour belong in a
50
- * browser-chrome mochitest — scaffolded via
66
+ * browser-chrome mochitest, scaffolded via
51
67
  * `fireforge furnace create --test-style browser-chrome`.
52
68
  */
53
69
  export declare function generateXpcshellTestContent(name: string, header: string): string;
54
70
  /**
55
71
  * Generates an `xpcshell.toml` manifest for a custom component's test
56
- * directory. Kept minimal — adding prefs, head.js, and support-files is
72
+ * directory. Kept minimal: adding prefs, head.js, and support-files is
57
73
  * left to the operator because those decisions depend on what the
58
74
  * component actually touches (Services.storage, observer topics, etc.).
59
75
  */
@@ -68,17 +84,17 @@ export declare function mochikitTestFileName(name: string): string;
68
84
  * They run on forks whose top-level chrome document lacks a `tabbrowser`
69
85
  * because they do not traverse `URILoadingHelper.openLinkIn`.
70
86
  *
71
- * The scaffold is a smoke test — the component is defined and the
87
+ * The scaffold is a smoke test: the component is defined and the
72
88
  * constructor is a function. Real UI assertions (render output, l10n wiring,
73
89
  * keyboard interactions) are left out because they depend on the
74
- * component's shape; operators can extend the test using the same SimpleTest
90
+ * component's shape. Operators can extend the test using the same SimpleTest
75
91
  * APIs upstream toolkit widgets rely on.
76
92
  *
77
- * The template deliberately omits `SimpleTest.waitForExplicitFinish()`.
93
+ * The template omits `SimpleTest.waitForExplicitFinish()` on purpose.
78
94
  * `add_task` owns the test lifecycle: when every queued task resolves, the
79
95
  * task harness calls `SimpleTest.finish()` itself. Combining
80
96
  * `waitForExplicitFinish()` with `add_task` and no explicit
81
- * `SimpleTest.finish()` in the task body makes the harness wait forever —
97
+ * `SimpleTest.finish()` in the task body makes the harness wait forever,
82
98
  * an indefinite hang on `fireforge test --headless`. Omitting it matches the
83
99
  * convention upstream toolkit widget tests use.
84
100
  */
@@ -86,7 +102,7 @@ export declare function generateMochikitTestContent(name: string): string;
86
102
  /**
87
103
  * Generates the `chrome.toml` entry block to append for a newly scaffolded
88
104
  * mochikit test. When the manifest already exists the caller appends this
89
- * snippet; when absent, the caller writes a file that starts with a
105
+ * snippet. When it is absent, the caller writes a file that starts with a
90
106
  * `[DEFAULT]` stanza followed by this block.
91
107
  */
92
108
  export declare function generateMochikitChromeTomlEntry(name: string): string;
@@ -7,7 +7,7 @@
7
7
  /**
8
8
  * Generates the .mjs file content for a custom component.
9
9
  *
10
- * `MozLitElement` does NOT expose `insertFTLIfNeeded` — that method lives on
10
+ * `MozLitElement` does not expose `insertFTLIfNeeded`. That method lives on
11
11
  * `MozXULElement`. Calling it from `connectedCallback` on a Lit-based
12
12
  * component throws `TypeError: this.insertFTLIfNeeded is not a function` at
13
13
  * every connect. Upstream Firefox components (e.g. `moz-input-folder.mjs`)
@@ -16,15 +16,16 @@
16
16
  * that pattern here so `--localized` produces functional code.
17
17
  *
18
18
  * Path resolution precedence (when `localized` is true):
19
- * 1. `sharedFtl` — used verbatim. The caller has resolved it from
20
- * `--shared-ftl` / `furnace.json`; this template does no rewriting.
19
+ * 1. `sharedFtl`: used verbatim. The caller has resolved it from
20
+ * `--shared-ftl` / `furnace.json`. This template does no rewriting.
21
21
  * Use this when the component participates in a feature-scoped
22
22
  * bundle that another component owns.
23
- * 2. `<ftlChromeSubPath>/<name>.ftl` — the default per-component path,
23
+ * 2. `<ftlChromeSubPath>/<name>.ftl`: the default per-component path,
24
24
  * matching the locale jar.mn entry that `furnace apply` writes.
25
- * 3. `<name>.ftl` — fallback when no chrome sub-path was resolvable.
25
+ * 3. `<name>.ftl`: fallback when no chrome sub-path was resolvable.
26
26
  */
27
- export function generateMjsContent(name, className, description, localized, header, ftlChromeSubPath, sharedFtl) {
27
+ export function generateMjsContent(options) {
28
+ const { name, className, description, localized, header, ftlChromeSubPath, sharedFtl } = options;
28
29
  // A `*/` in the operator-supplied description would close the JSDoc block
29
30
  // early and leave the remainder as stray code. Escaped here rather than
30
31
  // rejected at input, because the same text is also rendered by
@@ -35,10 +36,10 @@ export function generateMjsContent(name, className, description, localized, head
35
36
  : ftlChromeSubPath !== undefined
36
37
  ? `${ftlChromeSubPath}/${name}.ftl`
37
38
  : `${name}.ftl`;
38
- // Escape at the SINK, not at the validator. `ftlPath` reaches here from
39
- // three sources — the `--shared-ftl` flag, the furnace.json `ftlBasePath`,
40
- // and a derived `<name>.ftl` — and only the first passes through
41
- // `validateSharedFtl`. `JSON.stringify` produces a correctly-escaped JS
39
+ // Escaping happens at the sink rather than at the validator. `ftlPath`
40
+ // reaches here from three sources (the `--shared-ftl` flag, the
41
+ // furnace.json `ftlBasePath`, and a derived `<name>.ftl`), and only the
42
+ // first passes through `validateSharedFtl`. `JSON.stringify` produces a correctly-escaped JS
42
43
  // string literal for all of them, including the `"` and raw-newline cases
43
44
  // that would otherwise break the generated module into a syntax error.
44
45
  const ftlModulePreamble = localized
@@ -117,7 +118,7 @@ export function xpcshellTestFileName(name) {
117
118
  * Generates an xpcshell test file for a custom component.
118
119
  *
119
120
  * xpcshell cannot execute a component module that imports
120
- * `chrome://global/content/vendor/lit.all.mjs` — the Lit bundle touches
121
+ * `chrome://global/content/vendor/lit.all.mjs`: the Lit bundle touches
121
122
  * `window` at module-load time and the xpcshell harness has no `window`
122
123
  * global. A scaffold that calls `ChromeUtils.importESModule` on the
123
124
  * component's MJS therefore fails with `ReferenceError: window is not
@@ -128,9 +129,9 @@ export function xpcshellTestFileName(name) {
128
129
  * This template mirrors the chrome-doc packaging test instead: XCurProcD is
129
130
  * probed at a pair of candidate layouts (dist/bin/browser and the macOS
130
131
  * .app-bundle / ESR layout) to confirm the `.mjs` and `.css` files landed
131
- * where jar.mn promised. That is the assertion xpcshell CAN make. Functional
132
+ * where jar.mn promised. That is the assertion xpcshell can make. Functional
132
133
  * tests that need DOM/shadow-root/keyboard behaviour belong in a
133
- * browser-chrome mochitest — scaffolded via
134
+ * browser-chrome mochitest, scaffolded via
134
135
  * `fireforge furnace create --test-style browser-chrome`.
135
136
  */
136
137
  export function generateXpcshellTestContent(name, header) {
@@ -212,7 +213,7 @@ add_task(async function test_${taskSuffix}_files_packaged() {
212
213
  }
213
214
  /**
214
215
  * Generates an `xpcshell.toml` manifest for a custom component's test
215
- * directory. Kept minimal — adding prefs, head.js, and support-files is
216
+ * directory. Kept minimal: adding prefs, head.js, and support-files is
216
217
  * left to the operator because those decisions depend on what the
217
218
  * component actually touches (Services.storage, observer topics, etc.).
218
219
  */
@@ -237,17 +238,17 @@ export function mochikitTestFileName(name) {
237
238
  * They run on forks whose top-level chrome document lacks a `tabbrowser`
238
239
  * because they do not traverse `URILoadingHelper.openLinkIn`.
239
240
  *
240
- * The scaffold is a smoke test — the component is defined and the
241
+ * The scaffold is a smoke test: the component is defined and the
241
242
  * constructor is a function. Real UI assertions (render output, l10n wiring,
242
243
  * keyboard interactions) are left out because they depend on the
243
- * component's shape; operators can extend the test using the same SimpleTest
244
+ * component's shape. Operators can extend the test using the same SimpleTest
244
245
  * APIs upstream toolkit widgets rely on.
245
246
  *
246
- * The template deliberately omits `SimpleTest.waitForExplicitFinish()`.
247
+ * The template omits `SimpleTest.waitForExplicitFinish()` on purpose.
247
248
  * `add_task` owns the test lifecycle: when every queued task resolves, the
248
249
  * task harness calls `SimpleTest.finish()` itself. Combining
249
250
  * `waitForExplicitFinish()` with `add_task` and no explicit
250
- * `SimpleTest.finish()` in the task body makes the harness wait forever —
251
+ * `SimpleTest.finish()` in the task body makes the harness wait forever,
251
252
  * an indefinite hang on `fireforge test --headless`. Omitting it matches the
252
253
  * convention upstream toolkit widget tests use.
253
254
  */
@@ -280,7 +281,7 @@ export function generateMochikitTestContent(name) {
280
281
  /**
281
282
  * Generates the `chrome.toml` entry block to append for a newly scaffolded
282
283
  * mochikit test. When the manifest already exists the caller appends this
283
- * snippet; when absent, the caller writes a file that starts with a
284
+ * snippet. When it is absent, the caller writes a file that starts with a
284
285
  * `[DEFAULT]` stanza followed by this block.
285
286
  */
286
287
  export function generateMochikitChromeTomlEntry(name) {
@@ -10,15 +10,15 @@ import type { ProjectLicense } from '../../types/config.js';
10
10
  *
11
11
  * xpcshell is the appropriate harness for storage-layer code on forks
12
12
  * without a `tabbrowser` (no `openLinkIn` → `URILoadingHelper`). Browser
13
- * chrome mochitests require tabbrowser; xpcshell does not, so storage,
13
+ * chrome mochitests require tabbrowser, but xpcshell does not, so storage,
14
14
  * observers, and ESM-loading logic can be covered headless.
15
15
  *
16
16
  * Writes `test_<name>_packaged.js` and an `xpcshell.toml` manifest
17
17
  * into `engine/browser/base/content/test/<binary-name>-xpcshell/
18
- * <component-name>/`. moz.build registration is intentionally left to the
19
- * operator — wiring an `XPCSHELL_TESTS_MANIFESTS` entry requires a
20
- * deliberate choice about which moz.build should own it, and an
21
- * auto-insertion that guessed wrong would be worse than a note.
18
+ * <component-name>/`. moz.build registration is left to the operator:
19
+ * wiring an `XPCSHELL_TESTS_MANIFESTS` entry requires a choice about which
20
+ * moz.build should own it, and an auto-insertion that guessed wrong would
21
+ * be worse than a note.
22
22
  */
23
23
  export declare function scaffoldXpcshellTestFiles(componentName: string, license: ProjectLicense, forgeConfig: {
24
24
  binaryName: string;
@@ -16,20 +16,20 @@ import { generateXpcshellManifestContent, generateXpcshellTestContent, xpcshellT
16
16
  *
17
17
  * xpcshell is the appropriate harness for storage-layer code on forks
18
18
  * without a `tabbrowser` (no `openLinkIn` → `URILoadingHelper`). Browser
19
- * chrome mochitests require tabbrowser; xpcshell does not, so storage,
19
+ * chrome mochitests require tabbrowser, but xpcshell does not, so storage,
20
20
  * observers, and ESM-loading logic can be covered headless.
21
21
  *
22
22
  * Writes `test_<name>_packaged.js` and an `xpcshell.toml` manifest
23
23
  * into `engine/browser/base/content/test/<binary-name>-xpcshell/
24
- * <component-name>/`. moz.build registration is intentionally left to the
25
- * operator — wiring an `XPCSHELL_TESTS_MANIFESTS` entry requires a
26
- * deliberate choice about which moz.build should own it, and an
27
- * auto-insertion that guessed wrong would be worse than a note.
24
+ * <component-name>/`. moz.build registration is left to the operator:
25
+ * wiring an `XPCSHELL_TESTS_MANIFESTS` entry requires a choice about which
26
+ * moz.build should own it, and an auto-insertion that guessed wrong would
27
+ * be worse than a note.
28
28
  */
29
29
  export async function scaffoldXpcshellTestFiles(componentName, license, forgeConfig, paths, journal, testDirOverride) {
30
30
  const parentRelDir = xpcshellTestParentDir(forgeConfig.binaryName);
31
31
  const parentDirName = parentRelDir.split('/').slice(-1)[0] ?? `${forgeConfig.binaryName}-xpcshell`;
32
- // --test-dir names the FINAL directory (no per-component segment is
32
+ // --test-dir names the final directory (no per-component segment is
33
33
  // appended) so the operator controls the exact scaffold target.
34
34
  const testDirRel = resolveXpcshellTestDir(forgeConfig.binaryName, componentName, testDirOverride);
35
35
  const testDir = join(paths.engine, testDirRel);
@@ -53,8 +53,8 @@ export async function scaffoldXpcshellTestFiles(componentName, license, forgeCon
53
53
  await writeText(testFilePath, generateXpcshellTestContent(componentName, jsHeader));
54
54
  testFiles.push(testFileName);
55
55
  }
56
- // xpcshell.toml — append the test entry to an existing manifest instead
57
- // of scaffolding over it; write a fresh one only when absent.
56
+ // xpcshell.toml: append the test entry to an existing manifest instead
57
+ // of scaffolding over it. Write a fresh one only when absent.
58
58
  const manifestPath = join(testDir, 'xpcshell.toml');
59
59
  if (await pathExists(manifestPath)) {
60
60
  const existing = await readText(manifestPath);
@@ -7,7 +7,7 @@ import type { ResolvedTestStyle } from '../../types/furnace.js';
7
7
  * Invariants:
8
8
  * - `--xpcshell` alone is equivalent to `--test-style=xpcshell`.
9
9
  * - `--with-tests` alone (no `--test-style`) defaults to `browser-chrome`
10
- * (multi-process mochitest; reliable on macOS for interactive chrome).
10
+ * (multi-process mochitest, reliable on macOS for interactive chrome).
11
11
  * Forks whose chrome document has no `tabbrowser` should pass
12
12
  * `--test-style=mochikit` explicitly.
13
13
  * - When both `--xpcshell` and `--with-tests` are set, `--xpcshell` wins
@@ -3,7 +3,7 @@ import { join } from 'node:path';
3
3
  import { text } from '@clack/prompts';
4
4
  import { getProjectPaths, loadConfig } from '../../core/config.js';
5
5
  import { stdioIsInteractive } from '../../core/destructive.js';
6
- import { createDefaultFurnaceConfig, furnaceConfigExists, getFurnacePaths, loadFurnaceConfig, writeFurnaceConfig, } from '../../core/furnace-config.js';
6
+ import { getFurnacePaths, writeFurnaceConfig } from '../../core/furnace-config.js';
7
7
  import { resolveFtlChromeSubPath, tagNameToClassName, WIDGETS_DIR, } from '../../core/furnace-constants.js';
8
8
  import { completeJournalRollback, runFurnaceMutation, } from '../../core/furnace-operation.js';
9
9
  import { CUSTOM_ELEMENT_TAG_PATTERN, CUSTOM_ELEMENT_TAG_RULES, describeTagNameProblem, } from '../../core/furnace-registration-validate.js';
@@ -15,6 +15,7 @@ import { InvalidArgumentError } from '../../errors/base.js';
15
15
  import { FurnaceError } from '../../errors/furnace.js';
16
16
  import { ensureDir, pathExists, writeText } from '../../utils/fs.js';
17
17
  import { cancel, intro, isCancel, note, outro } from '../../utils/logger.js';
18
+ import { loadAuthoringFurnaceConfig } from './authoring-config.js';
18
19
  import { resolveValidatedTestDir, scaffoldTestFiles } from './create-browser-test.js';
19
20
  import { formatDryRunPlan, formatSuccessNote } from './create-dry-run.js';
20
21
  import { resolveCreateFeatures } from './create-features.js';
@@ -23,12 +24,6 @@ import { assertCustomEntryPersisted } from './create-readback.js';
23
24
  import { generateCssContent, generateFtlContent, generateMjsContent } from './create-templates.js';
24
25
  import { validateCreateAgainstConfig } from './create-validation.js';
25
26
  import { scaffoldXpcshellTestFiles } from './create-xpcshell.js';
26
- async function loadAuthoringFurnaceConfig(projectRoot) {
27
- if (await furnaceConfigExists(projectRoot)) {
28
- return loadFurnaceConfig(projectRoot);
29
- }
30
- return createDefaultFurnaceConfig();
31
- }
32
27
  function knownComponentSet(config) {
33
28
  return new Set([
34
29
  ...config.stock,
@@ -64,24 +59,25 @@ function validateTagName(name) {
64
59
  }
65
60
  /**
66
61
  * Writes the scaffolded component source files to disk.
67
- * @param componentDir - Destination component directory
68
- * @param componentName - Custom element tag name
69
- * @param className - Generated component class name
70
- * @param description - Human-readable component description
71
- * @param localized - Whether to include a Fluent file
72
- * @param license - Project license used for generated headers
73
- * @param ftlChromeSubPath - chrome:// sub-path for the generated FTL reference, when localized
74
- * @param sharedFtl - Explicit shared FTL path from `--shared-ftl`, when supplied
75
- * @param journal - Optional rollback journal that snapshots files before writes
62
+ * @param options - See {@link WriteComponentFilesOptions}
76
63
  * @returns Relative filenames written for the component
77
64
  */
78
- async function writeComponentFiles(componentDir, componentName, className, description, localized, license, ftlChromeSubPath, sharedFtl, journal) {
65
+ async function writeComponentFiles(options) {
66
+ const { componentDir, componentName, className, description, localized, license, ftlChromeSubPath, sharedFtl, journal, } = options;
79
67
  await ensureDir(componentDir);
80
68
  const files = [`${componentName}.mjs`, `${componentName}.css`];
81
69
  const mjsPath = join(componentDir, `${componentName}.mjs`);
82
70
  if (journal)
83
71
  await snapshotFile(journal, mjsPath);
84
- const mjsContent = generateMjsContent(componentName, className, description, localized, getLicenseHeader(license, 'js'), ftlChromeSubPath, sharedFtl);
72
+ const mjsContent = generateMjsContent({
73
+ name: componentName,
74
+ className,
75
+ description,
76
+ localized,
77
+ header: getLicenseHeader(license, 'js'),
78
+ ftlChromeSubPath,
79
+ sharedFtl,
80
+ });
85
81
  await writeText(mjsPath, mjsContent);
86
82
  const cssPath = join(componentDir, `${componentName}.css`);
87
83
  if (journal)
@@ -90,7 +86,7 @@ async function writeComponentFiles(componentDir, componentName, className, descr
90
86
  await writeText(cssPath, cssContent);
91
87
  // Skip the per-component .ftl stub when the component participates in a
92
88
  // pre-existing feature-scoped bundle. The shared bundle is owned
93
- // elsewhere; dropping a stub here would clutter the workspace with
89
+ // elsewhere. Dropping a stub here would clutter the workspace with
94
90
  // empty files that never get packaged (furnace apply also skips copying
95
91
  // them in this mode).
96
92
  if (localized && !sharedFtl) {
@@ -110,7 +106,7 @@ async function writeComponentFiles(componentDir, componentName, className, descr
110
106
  * Invariants:
111
107
  * - `--xpcshell` alone is equivalent to `--test-style=xpcshell`.
112
108
  * - `--with-tests` alone (no `--test-style`) defaults to `browser-chrome`
113
- * (multi-process mochitest; reliable on macOS for interactive chrome).
109
+ * (multi-process mochitest, reliable on macOS for interactive chrome).
114
110
  * Forks whose chrome document has no `tabbrowser` should pass
115
111
  * `--test-style=mochikit` explicitly.
116
112
  * - When both `--xpcshell` and `--with-tests` are set, `--xpcshell` wins
@@ -139,8 +135,8 @@ export function resolveTestStyle(options) {
139
135
  * state.
140
136
  */
141
137
  async function performCreateMutations(args) {
142
- // Invariant: the journal MUST be registered with the operation context
143
- // BEFORE any filesystem mutation (including recordCreatedDir, whose entries
138
+ // Invariant: the journal must be registered with the operation context
139
+ // before any filesystem mutation (including recordCreatedDir, whose entries
144
140
  // are consulted by SIGINT rollback). The try/catch below assumes signal
145
141
  // handlers can find the journal for any partial write that follows.
146
142
  const journal = createRollbackJournal();
@@ -165,7 +161,17 @@ async function performCreateMutations(args) {
165
161
  // so signal-driven rollback can clean it up even if writeComponentFiles
166
162
  // is interrupted mid-ensureDir.
167
163
  recordCreatedDir(journal, args.componentDir);
168
- files = await writeComponentFiles(args.componentDir, args.componentName, args.className, args.description, args.localized, args.license, resolveFtlChromeSubPath(freshConfig.ftlBasePath), args.sharedFtl, journal);
164
+ files = await writeComponentFiles({
165
+ componentDir: args.componentDir,
166
+ componentName: args.componentName,
167
+ className: args.className,
168
+ description: args.description,
169
+ localized: args.localized,
170
+ license: args.license,
171
+ ftlChromeSubPath: resolveFtlChromeSubPath(freshConfig.ftlBasePath),
172
+ sharedFtl: args.sharedFtl,
173
+ journal,
174
+ });
169
175
  const customEntry = {
170
176
  description: args.description,
171
177
  targetPath: `${WIDGETS_DIR}/${args.componentName}`,
@@ -263,7 +269,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
263
269
  const license = forgeConfig.license ?? DEFAULT_LICENSE;
264
270
  const furnacePaths = getFurnacePaths(projectRoot);
265
271
  if (!componentName) {
266
- // Interactive prompt path; non-interactive missing-name was rejected above.
272
+ // Interactive prompt path. Non-interactive missing-name was rejected above.
267
273
  const nameResult = await text({
268
274
  message: 'Component tag name:',
269
275
  placeholder: 'moz-my-widget',
@@ -309,7 +315,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
309
315
  // partial mutation behind.
310
316
  const testStyle = resolveTestStyle(options);
311
317
  const testDir = resolveValidatedTestDir(options.testDir, testStyle);
312
- // Not routed through assertFurnaceEngineReady: this rung is CONDITIONAL on
318
+ // Not routed through assertFurnaceEngineReady: this rung is conditional on
313
319
  // a test style being requested, and it names the component so the refusal
314
320
  // identifies which create failed. Both are outside the shared helper's
315
321
  // shape, and a scaffold without --with-tests must keep working with no
@@ -328,7 +334,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
328
334
  // structural rules with furnace-config.ts so the command and the on-disk
329
335
  // schema cannot diverge. Pass the resolved `localized` rather than a `true`
330
336
  // literal so the validator's cross-field check stays anchored to the real
331
- // feature selection — `resolveCreateFeatures` promotes localized upstream,
337
+ // feature selection. `resolveCreateFeatures` promotes localized upstream,
332
338
  // and hard-coding `true` here would hide a regression if that promotion
333
339
  // ever moved or dropped.
334
340
  let sharedFtl;
@@ -339,10 +345,10 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
339
345
  }
340
346
  sharedFtl = result.value;
341
347
  }
342
- // Dry-run exits here — every validation that does not need a write has
348
+ // Dry-run exits here. Every validation that does not need a write has
343
349
  // already run, so the plan we render reflects exactly what the real
344
350
  // command would do. The mutation phase and its rollback journal are
345
- // intentionally skipped so no furnace.json/engine state is touched.
351
+ // skipped so no furnace.json/engine state is touched.
346
352
  if (isDryRun) {
347
353
  const plan = formatDryRunPlan({
348
354
  componentName,
@@ -351,7 +357,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
351
357
  composes,
352
358
  stockAdditions,
353
359
  // Spread rather than assign so the key is absent when sharedFtl is
354
- // undefined — the DryRunPlanInput type uses strict-optional shape.
360
+ // undefined. The DryRunPlanInput type uses a strict-optional shape.
355
361
  ...(sharedFtl !== undefined ? { sharedFtl } : {}),
356
362
  testStyle,
357
363
  description,
@@ -2,7 +2,7 @@
2
2
  import { loadConfig } from '../../core/config.js';
3
3
  import { applyAllComponents } from '../../core/furnace-apply.js';
4
4
  import { logApplyResult } from '../../core/furnace-apply-output.js';
5
- import { getFurnacePaths, loadFurnaceConfig } from '../../core/furnace-config.js';
5
+ import { getFurnacePaths } from '../../core/furnace-config.js';
6
6
  import { reportJsconfigPathsSync } from '../../core/furnace-jsconfig.js';
7
7
  import { runFurnaceMutation, waitLockMutationOptions, } from '../../core/furnace-operation.js';
8
8
  import { assertFurnaceReady } from '../../core/furnace-precondition.js';
@@ -43,18 +43,18 @@ function getFailedComponentNames(result) {
43
43
  * mode.
44
44
  *
45
45
  * Delegates to {@link applyAllComponents} with a `componentName` filter so
46
- * targeted deploys run the exact same pipeline as deploy-all — including
46
+ * targeted deploys run the exact same pipeline as deploy-all, including
47
47
  * workspace-deletion detection, engine orphan undeploy, and jar.mn /
48
48
  * customElements.js re-sync. Calling the per-component apply helpers
49
49
  * directly never prunes: renaming a helper file in the workspace then leaves
50
50
  * the old deployed file and its stale jar.mn line in the engine.
51
51
  *
52
- * `persistState: false` is load-bearing: the batch persist path *replaces*
52
+ * `persistState: false` matters here: the batch persist path replaces
53
53
  * `appliedChecksums` wholesale with only this run's entries, which for a
54
54
  * named deploy would wipe every other component's state. Named deploy keeps
55
55
  * its per-component state merge ({@link persistSingleComponentState}) and
56
56
  * its atomicity gate ({@link shouldPersistSingleComponentState}) at the call
57
- * site. Rollback on failure happens inside `applyAllComponents`; the journal
57
+ * site. Rollback on failure happens inside `applyAllComponents`. The journal
58
58
  * returned on success is ignored (the deploy keeps its files).
59
59
  *
60
60
  * @param name - Component name to apply
@@ -188,7 +188,7 @@ export async function furnaceDeployCommand(projectRoot, name, options = {}) {
188
188
  applySpinner.stop(isDryRun ? 'Planned actions calculated' : 'Components applied');
189
189
  logApplyResult(result, isDryRun);
190
190
  // Keep the consumer jsconfig's chrome-module `paths` in step with the
191
- // deployed module set. Only after a clean apply — a rolled-back deploy
191
+ // deployed module set. Only after a clean apply: a rolled-back deploy
192
192
  // must not advance the typecheck mapping either.
193
193
  if (result.errors.length === 0 && getStepFailureCount(result) === 0) {
194
194
  await reportJsconfigPathsSync(projectRoot, config, isDryRun);
@@ -203,7 +203,16 @@ export async function furnaceDeployCommand(projectRoot, name, options = {}) {
203
203
  }
204
204
  const validateSpinner = spinner(isDryRun ? 'Validating (read-only)...' : 'Validating...');
205
205
  const failedComponents = getFailedComponentNames(result);
206
- const validation = await runDeployValidation(validateSpinner, name, config, furnacePaths, failedComponents, isDryRun, projectRoot, result.actions);
206
+ const validation = await runDeployValidation({
207
+ validateSpinner,
208
+ name,
209
+ config,
210
+ furnacePaths,
211
+ failedComponents,
212
+ isDryRun,
213
+ projectRoot,
214
+ dryRunActions: result.actions,
215
+ });
207
216
  if (validation.done)
208
217
  return;
209
218
  const { totalErrors, totalWarnings, componentCount, skippedValidationCount } = validation;
@@ -15,9 +15,9 @@ import { normalizePathSlashes } from '../../utils/paths.js';
15
15
  /**
16
16
  * Renders a multi-hunk unified diff between the two strings and returns a
17
17
  * flat list of display-ready lines. Each line has already had its marker
18
- * prefix and color applied by this function; the caller just emits them.
18
+ * prefix and color applied by this function. The caller just emits them.
19
19
  *
20
- * Pure delegation to the `diff-hunks` module — kept here as a thin wrapper
20
+ * Pure delegation to the `diff-hunks` module, kept here as a thin wrapper
21
21
  * so the command file does not need to care about the hunk data shape.
22
22
  */
23
23
  function formatUnifiedDiff(original, modified) {
@@ -48,7 +48,7 @@ async function diffOverride(name, projectRoot, config) {
48
48
  if (!(await pathExists(overrideDir))) {
49
49
  throw new FurnaceError(`Override directory not found: components/overrides/${name}`, name);
50
50
  }
51
- // Prefer the per-override baseCommit (survives download --force); fall back
51
+ // Prefer the per-override baseCommit (survives download --force). Fall back
52
52
  // to the project-wide value for overrides created before this field existed.
53
53
  const state = await loadState(projectRoot);
54
54
  const baseCommit = overrideConfig.baseCommit ?? state.baseCommit;
@@ -64,9 +64,9 @@ async function diffOverride(name, projectRoot, config) {
64
64
  continue;
65
65
  if (!isComponentSourceFile(entry.name))
66
66
  continue;
67
- // git show takes a repo-relative path. paths.engine IS the repo root.
67
+ // git show takes a repo-relative path. paths.engine is the repo root.
68
68
  // The slice leaves the host's separators behind, and `git show <ref>:<path>`
69
- // only understands forward slashes — on Windows the unnormalized form makes
69
+ // only understands forward slashes. On Windows the unnormalized form makes
70
70
  // every baseline read miss, so every overridden file is reported as a new
71
71
  // file and `furnace diff` shows nothing.
72
72
  const enginePath = normalizePathSlashes(getOverrideEngineTargetPath(paths.engine, overrideConfig, entry.name, ftlDir).slice(paths.engine.length + 1));
@@ -109,7 +109,7 @@ async function diffOverride(name, projectRoot, config) {
109
109
  * `furnace apply`.
110
110
  *
111
111
  * `.ftl` files deploy to `engine/<ftlDir>/<name>.ftl` via
112
- * `applyCustomFtlFile` — NOT to `customConfig.targetPath` — so the
112
+ * `applyCustomFtlFile`, not to `customConfig.targetPath`, so the
113
113
  * deployment-target lookup has to branch on extension. Without the branch, a
114
114
  * component's localization file always reports "not yet deployed to engine
115
115
  * (new file)" after a successful apply, because diff looks for it under the
@@ -138,7 +138,7 @@ async function diffCustom(name, projectRoot, config) {
138
138
  const workspacePath = join(customDir, entry.name);
139
139
  const workspaceContent = await readText(workspacePath);
140
140
  // `.ftl` files deploy to the locale tree, not the component's
141
- // targetPath; mirror `applyCustomFtlFile`'s target computation so the
141
+ // targetPath. Mirror `applyCustomFtlFile`'s target computation so the
142
142
  // diff header and the existence probe name the same path apply
143
143
  // writes to. Any change here must stay in lock-step with
144
144
  // `src/core/furnace-apply-ftl.ts`.
@@ -35,7 +35,7 @@ function registerFurnaceApplyCommand(furnace, context) {
35
35
  .option('-w, --watch', 'Watch component directories and re-apply on changes');
36
36
  addWaitLockOption(apply).action(withErrorHandling(async (name, options) => {
37
37
  const { waitLock, ...rest } = options ?? {};
38
- // Resolved ONCE and used twice: the engine session lock below, and
38
+ // Resolved once and used twice: the engine session lock below, and
39
39
  // the furnace lock the mutation takes inside it. Resolving twice
40
40
  // would be the same value today and a drift risk tomorrow.
41
41
  const waitLockSeconds = resolveWaitLockSeconds(waitLock);