@hominis/fireforge 0.43.0 → 0.44.0

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 (470) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/README.md +10 -1
  3. package/dist/bin/fireforge.d.ts +4 -9
  4. package/dist/bin/fireforge.js +42 -40
  5. package/dist/build-info.json +4 -4
  6. package/dist/src/cli.js +74 -8
  7. package/dist/src/commands/bootstrap.js +17 -20
  8. package/dist/src/commands/build.js +25 -32
  9. package/dist/src/commands/config.js +34 -41
  10. package/dist/src/commands/discard.js +8 -9
  11. package/dist/src/commands/doctor-check-core.d.ts +4 -18
  12. package/dist/src/commands/doctor-check-core.js +8 -35
  13. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  14. package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
  15. package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
  16. package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
  17. package/dist/src/commands/doctor-furnace-jar.js +7 -9
  18. package/dist/src/commands/doctor-furnace.js +21 -24
  19. package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
  20. package/dist/src/commands/doctor-orphaned-harness.js +18 -44
  21. package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
  22. package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
  23. package/dist/src/commands/doctor-working-tree.d.ts +10 -12
  24. package/dist/src/commands/doctor-working-tree.js +11 -18
  25. package/dist/src/commands/doctor.js +35 -53
  26. package/dist/src/commands/download.js +32 -48
  27. package/dist/src/commands/export-all.js +29 -33
  28. package/dist/src/commands/export-flow.js +6 -6
  29. package/dist/src/commands/export-placement-conflicts.js +10 -9
  30. package/dist/src/commands/export-placement-gate.js +5 -5
  31. package/dist/src/commands/export-shared.d.ts +30 -33
  32. package/dist/src/commands/export-shared.js +45 -43
  33. package/dist/src/commands/export.js +21 -27
  34. package/dist/src/commands/furnace/apply.js +14 -23
  35. package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
  36. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
  37. package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
  38. package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
  39. package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
  40. package/dist/src/commands/furnace/chrome-doc.js +31 -41
  41. package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
  42. package/dist/src/commands/furnace/create-browser-test.js +8 -8
  43. package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
  44. package/dist/src/commands/furnace/create-mochikit.js +8 -9
  45. package/dist/src/commands/furnace/create-readback.d.ts +12 -13
  46. package/dist/src/commands/furnace/create-readback.js +12 -13
  47. package/dist/src/commands/furnace/create-templates.d.ts +22 -28
  48. package/dist/src/commands/furnace/create-templates.js +35 -30
  49. package/dist/src/commands/furnace/create-xpcshell.js +2 -2
  50. package/dist/src/commands/furnace/create.js +33 -23
  51. package/dist/src/commands/furnace/deploy.js +16 -24
  52. package/dist/src/commands/furnace/diff.js +9 -9
  53. package/dist/src/commands/furnace/init.js +33 -36
  54. package/dist/src/commands/furnace/override.js +23 -25
  55. package/dist/src/commands/furnace/preview.js +47 -67
  56. package/dist/src/commands/furnace/refresh.js +12 -16
  57. package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
  58. package/dist/src/commands/furnace/remove-mutations.js +9 -16
  59. package/dist/src/commands/furnace/remove-state.js +1 -1
  60. package/dist/src/commands/furnace/remove.js +33 -38
  61. package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
  62. package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
  63. package/dist/src/commands/furnace/rename.js +59 -69
  64. package/dist/src/commands/furnace/scan.js +19 -33
  65. package/dist/src/commands/furnace/status.js +12 -9
  66. package/dist/src/commands/furnace/sync.js +9 -16
  67. package/dist/src/commands/furnace/validate.js +20 -20
  68. package/dist/src/commands/import.js +42 -35
  69. package/dist/src/commands/lint-per-patch.js +15 -10
  70. package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
  71. package/dist/src/commands/lint-per-run-checkjs.js +13 -13
  72. package/dist/src/commands/lint-report.js +6 -7
  73. package/dist/src/commands/lint.d.ts +15 -16
  74. package/dist/src/commands/lint.js +86 -102
  75. package/dist/src/commands/package.js +6 -11
  76. package/dist/src/commands/patch/compact.js +1 -1
  77. package/dist/src/commands/patch/delete.js +24 -33
  78. package/dist/src/commands/patch/index.d.ts +5 -6
  79. package/dist/src/commands/patch/index.js +10 -12
  80. package/dist/src/commands/patch/lint-ignore.js +14 -13
  81. package/dist/src/commands/patch/move-files-create.d.ts +6 -6
  82. package/dist/src/commands/patch/move-files-create.js +8 -8
  83. package/dist/src/commands/patch/move-files-into.d.ts +6 -6
  84. package/dist/src/commands/patch/move-files-into.js +8 -8
  85. package/dist/src/commands/patch/patch-context.d.ts +2 -3
  86. package/dist/src/commands/patch/patch-context.js +2 -3
  87. package/dist/src/commands/patch/rename.d.ts +10 -11
  88. package/dist/src/commands/patch/rename.js +11 -12
  89. package/dist/src/commands/patch/reorder.js +8 -9
  90. package/dist/src/commands/patch/split-plan.js +1 -1
  91. package/dist/src/commands/patch/split.d.ts +8 -10
  92. package/dist/src/commands/patch/split.js +9 -11
  93. package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
  94. package/dist/src/commands/patch/staged-dependency.js +7 -3
  95. package/dist/src/commands/patch/tier.d.ts +9 -9
  96. package/dist/src/commands/patch/tier.js +18 -15
  97. package/dist/src/commands/re-export-adjacent.js +9 -8
  98. package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
  99. package/dist/src/commands/re-export-bulk-scan.js +22 -21
  100. package/dist/src/commands/re-export-drift.js +10 -10
  101. package/dist/src/commands/re-export-files.d.ts +6 -7
  102. package/dist/src/commands/re-export-files.js +34 -44
  103. package/dist/src/commands/re-export-lint.d.ts +10 -13
  104. package/dist/src/commands/re-export-lint.js +16 -14
  105. package/dist/src/commands/re-export-options.d.ts +6 -6
  106. package/dist/src/commands/re-export-options.js +6 -6
  107. package/dist/src/commands/re-export-register.d.ts +4 -10
  108. package/dist/src/commands/re-export-register.js +5 -11
  109. package/dist/src/commands/re-export-scan.js +1 -1
  110. package/dist/src/commands/re-export-single.d.ts +3 -3
  111. package/dist/src/commands/re-export-single.js +33 -25
  112. package/dist/src/commands/re-export.js +13 -21
  113. package/dist/src/commands/rebase/abort.js +3 -3
  114. package/dist/src/commands/rebase/confirm.js +2 -1
  115. package/dist/src/commands/rebase/continue.d.ts +1 -1
  116. package/dist/src/commands/rebase/continue.js +14 -9
  117. package/dist/src/commands/rebase/index.js +11 -11
  118. package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
  119. package/dist/src/commands/rebase/patch-loop.js +60 -39
  120. package/dist/src/commands/rebase/summary.js +1 -1
  121. package/dist/src/commands/register.js +5 -7
  122. package/dist/src/commands/reset.js +2 -1
  123. package/dist/src/commands/resolve.d.ts +16 -13
  124. package/dist/src/commands/resolve.js +30 -33
  125. package/dist/src/commands/run.js +33 -35
  126. package/dist/src/commands/setup-support.js +15 -19
  127. package/dist/src/commands/setup.js +13 -9
  128. package/dist/src/commands/status-check.d.ts +6 -6
  129. package/dist/src/commands/status-json.d.ts +6 -6
  130. package/dist/src/commands/status-json.js +5 -0
  131. package/dist/src/commands/status-output.d.ts +5 -5
  132. package/dist/src/commands/status-output.js +6 -6
  133. package/dist/src/commands/status-ownership.d.ts +16 -14
  134. package/dist/src/commands/status-ownership.js +16 -14
  135. package/dist/src/commands/status.js +42 -34
  136. package/dist/src/commands/test-build-phase.js +26 -13
  137. package/dist/src/commands/test-diagnose.js +44 -44
  138. package/dist/src/commands/test-register.js +1 -0
  139. package/dist/src/commands/test-run.d.ts +14 -16
  140. package/dist/src/commands/test-run.js +21 -13
  141. package/dist/src/commands/test-stale-gate.d.ts +15 -16
  142. package/dist/src/commands/test-stale-gate.js +15 -16
  143. package/dist/src/commands/test-verdict.d.ts +20 -3
  144. package/dist/src/commands/test-verdict.js +30 -0
  145. package/dist/src/commands/test.js +83 -76
  146. package/dist/src/commands/token-coverage.js +3 -4
  147. package/dist/src/commands/token.js +16 -18
  148. package/dist/src/commands/tree.js +47 -31
  149. package/dist/src/commands/typecheck.d.ts +10 -12
  150. package/dist/src/commands/typecheck.js +24 -27
  151. package/dist/src/commands/verify.js +13 -15
  152. package/dist/src/commands/watch.js +21 -23
  153. package/dist/src/commands/wire.js +52 -62
  154. package/dist/src/core/ast-utils.d.ts +8 -7
  155. package/dist/src/core/ast-utils.js +8 -7
  156. package/dist/src/core/branding.d.ts +9 -14
  157. package/dist/src/core/branding.js +7 -11
  158. package/dist/src/core/browser-wire.d.ts +1 -1
  159. package/dist/src/core/browser-wire.js +14 -19
  160. package/dist/src/core/build-audit-platform.js +25 -33
  161. package/dist/src/core/build-audit-registration.js +17 -25
  162. package/dist/src/core/build-audit-resolve.d.ts +15 -17
  163. package/dist/src/core/build-audit-resolve.js +27 -33
  164. package/dist/src/core/build-audit-transforms.js +18 -19
  165. package/dist/src/core/build-audit.js +28 -42
  166. package/dist/src/core/build-baseline-types.d.ts +29 -35
  167. package/dist/src/core/build-baseline.d.ts +5 -4
  168. package/dist/src/core/build-baseline.js +14 -14
  169. package/dist/src/core/build-overwrite-guard.d.ts +7 -14
  170. package/dist/src/core/build-overwrite-guard.js +62 -19
  171. package/dist/src/core/build-prepare.d.ts +2 -2
  172. package/dist/src/core/build-prepare.js +8 -9
  173. package/dist/src/core/config-state.js +12 -4
  174. package/dist/src/core/config-validate.js +8 -5
  175. package/dist/src/core/config.d.ts +5 -8
  176. package/dist/src/core/config.js +7 -16
  177. package/dist/src/core/coverage-extend.d.ts +15 -13
  178. package/dist/src/core/coverage-extend.js +15 -13
  179. package/dist/src/core/destructive.d.ts +31 -9
  180. package/dist/src/core/destructive.js +29 -26
  181. package/dist/src/core/diff-hunks.js +10 -12
  182. package/dist/src/core/discard-baseline.d.ts +8 -8
  183. package/dist/src/core/discard-baseline.js +16 -15
  184. package/dist/src/core/display-state.d.ts +12 -14
  185. package/dist/src/core/display-state.js +12 -14
  186. package/dist/src/core/engine-changes.d.ts +2 -4
  187. package/dist/src/core/engine-changes.js +2 -4
  188. package/dist/src/core/engine-precondition.d.ts +28 -13
  189. package/dist/src/core/engine-precondition.js +25 -10
  190. package/dist/src/core/engine-session-lock.d.ts +47 -21
  191. package/dist/src/core/engine-session-lock.js +168 -33
  192. package/dist/src/core/export-moved-code-shape.d.ts +10 -10
  193. package/dist/src/core/export-moved-code-shape.js +10 -10
  194. package/dist/src/core/file-lock.d.ts +62 -5
  195. package/dist/src/core/file-lock.js +196 -59
  196. package/dist/src/core/firefox-cache.js +1 -3
  197. package/dist/src/core/firefox-extract.js +10 -14
  198. package/dist/src/core/firefox.d.ts +7 -5
  199. package/dist/src/core/firefox.js +4 -5
  200. package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
  201. package/dist/src/core/furnace-apply-dry-run.js +3 -2
  202. package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
  203. package/dist/src/core/furnace-apply-ftl.js +12 -12
  204. package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
  205. package/dist/src/core/furnace-apply-helpers.js +19 -16
  206. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
  207. package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
  208. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
  209. package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
  210. package/dist/src/core/furnace-apply.d.ts +5 -8
  211. package/dist/src/core/furnace-apply.js +19 -24
  212. package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
  213. package/dist/src/core/furnace-checksum-utils.js +16 -0
  214. package/dist/src/core/furnace-config.d.ts +21 -30
  215. package/dist/src/core/furnace-config.js +32 -54
  216. package/dist/src/core/furnace-constants.d.ts +8 -0
  217. package/dist/src/core/furnace-constants.js +10 -2
  218. package/dist/src/core/furnace-css-fragments.d.ts +5 -5
  219. package/dist/src/core/furnace-css-fragments.js +5 -5
  220. package/dist/src/core/furnace-jsconfig.d.ts +11 -12
  221. package/dist/src/core/furnace-jsconfig.js +11 -12
  222. package/dist/src/core/furnace-marker.d.ts +7 -8
  223. package/dist/src/core/furnace-marker.js +7 -8
  224. package/dist/src/core/furnace-operation.d.ts +31 -0
  225. package/dist/src/core/furnace-operation.js +54 -17
  226. package/dist/src/core/furnace-precondition.d.ts +61 -0
  227. package/dist/src/core/furnace-precondition.js +67 -0
  228. package/dist/src/core/furnace-registration-remove.d.ts +5 -6
  229. package/dist/src/core/furnace-registration-remove.js +6 -7
  230. package/dist/src/core/furnace-registration-validate.d.ts +13 -0
  231. package/dist/src/core/furnace-registration-validate.js +20 -1
  232. package/dist/src/core/furnace-registration.d.ts +5 -6
  233. package/dist/src/core/furnace-registration.js +10 -12
  234. package/dist/src/core/furnace-rollback.js +7 -7
  235. package/dist/src/core/furnace-scanner.d.ts +1 -0
  236. package/dist/src/core/furnace-scanner.js +1 -2
  237. package/dist/src/core/furnace-stale-export.d.ts +10 -10
  238. package/dist/src/core/furnace-stale-export.js +10 -10
  239. package/dist/src/core/furnace-state-persist.d.ts +6 -8
  240. package/dist/src/core/furnace-state-persist.js +6 -8
  241. package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
  242. package/dist/src/core/furnace-validate-accessibility.js +310 -1
  243. package/dist/src/core/furnace-validate-compatibility.js +141 -1
  244. package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
  245. package/dist/src/core/furnace-validate-helpers.js +0 -491
  246. package/dist/src/core/furnace-validate-registration.d.ts +7 -0
  247. package/dist/src/core/furnace-validate-registration.js +115 -41
  248. package/dist/src/core/furnace-validate.d.ts +16 -0
  249. package/dist/src/core/furnace-validate.js +188 -145
  250. package/dist/src/core/furnace-version-drift.d.ts +10 -11
  251. package/dist/src/core/furnace-version-drift.js +10 -11
  252. package/dist/src/core/git-base.d.ts +7 -9
  253. package/dist/src/core/git-base.js +7 -9
  254. package/dist/src/core/git-diff.d.ts +20 -9
  255. package/dist/src/core/git-diff.js +148 -63
  256. package/dist/src/core/git-file-ops.d.ts +19 -19
  257. package/dist/src/core/git-file-ops.js +19 -19
  258. package/dist/src/core/git-readonly-index.d.ts +53 -19
  259. package/dist/src/core/git-readonly-index.js +75 -31
  260. package/dist/src/core/git-status.d.ts +5 -6
  261. package/dist/src/core/git-status.js +5 -6
  262. package/dist/src/core/git.d.ts +9 -10
  263. package/dist/src/core/git.js +54 -70
  264. package/dist/src/core/license-headers.d.ts +17 -23
  265. package/dist/src/core/license-headers.js +17 -23
  266. package/dist/src/core/mach-build-artifacts.d.ts +9 -9
  267. package/dist/src/core/mach-build-artifacts.js +57 -19
  268. package/dist/src/core/mach-error-hints.js +42 -29
  269. package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
  270. package/dist/src/core/mach-known-noise-filter.js +18 -20
  271. package/dist/src/core/mach-mozconfig.d.ts +14 -0
  272. package/dist/src/core/mach-mozconfig.js +30 -0
  273. package/dist/src/core/mach-resource-shim.d.ts +43 -58
  274. package/dist/src/core/mach-resource-shim.js +50 -67
  275. package/dist/src/core/mach.d.ts +37 -41
  276. package/dist/src/core/mach.js +50 -51
  277. package/dist/src/core/marionette-port.d.ts +36 -1
  278. package/dist/src/core/marionette-port.js +96 -31
  279. package/dist/src/core/marionette-preflight.d.ts +8 -12
  280. package/dist/src/core/marionette-preflight.js +86 -52
  281. package/dist/src/core/mochitest-server-port.d.ts +42 -0
  282. package/dist/src/core/mochitest-server-port.js +119 -0
  283. package/dist/src/core/module-resolution-preflight.d.ts +9 -11
  284. package/dist/src/core/module-resolution-preflight.js +9 -11
  285. package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
  286. package/dist/src/core/moz-manifest-helpers.js +163 -0
  287. package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
  288. package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
  289. package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
  290. package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
  291. package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
  292. package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
  293. package/dist/src/core/ownership-table.d.ts +14 -16
  294. package/dist/src/core/ownership-table.js +14 -16
  295. package/dist/src/core/parser-fallback.d.ts +15 -1
  296. package/dist/src/core/parser-fallback.js +22 -3
  297. package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
  298. package/dist/src/core/patch-apply-fuzz.js +15 -18
  299. package/dist/src/core/patch-apply.d.ts +13 -34
  300. package/dist/src/core/patch-apply.js +16 -76
  301. package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
  302. package/dist/src/core/patch-artifact-normalize.js +13 -15
  303. package/dist/src/core/patch-export-metadata.d.ts +12 -2
  304. package/dist/src/core/patch-export-metadata.js +13 -4
  305. package/dist/src/core/patch-export-update.d.ts +13 -1
  306. package/dist/src/core/patch-export-update.js +25 -8
  307. package/dist/src/core/patch-export.d.ts +15 -8
  308. package/dist/src/core/patch-export.js +10 -11
  309. package/dist/src/core/patch-files.d.ts +5 -6
  310. package/dist/src/core/patch-files.js +5 -6
  311. package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
  312. package/dist/src/core/patch-identifier-suggest.js +14 -19
  313. package/dist/src/core/patch-lint-binary.d.ts +51 -0
  314. package/dist/src/core/patch-lint-binary.js +39 -0
  315. package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
  316. package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
  317. package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
  318. package/dist/src/core/patch-lint-checkjs.js +16 -16
  319. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
  320. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
  321. package/dist/src/core/patch-lint-creators.d.ts +8 -8
  322. package/dist/src/core/patch-lint-creators.js +8 -8
  323. package/dist/src/core/patch-lint-cross.d.ts +17 -20
  324. package/dist/src/core/patch-lint-cross.js +16 -16
  325. package/dist/src/core/patch-lint-css.d.ts +3 -5
  326. package/dist/src/core/patch-lint-css.js +17 -22
  327. package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
  328. package/dist/src/core/patch-lint-diff-tag.js +14 -16
  329. package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
  330. package/dist/src/core/patch-lint-jsdoc.js +26 -19
  331. package/dist/src/core/patch-lint-mozbuild.js +20 -20
  332. package/dist/src/core/patch-lint-observer.d.ts +7 -7
  333. package/dist/src/core/patch-lint-observer.js +7 -7
  334. package/dist/src/core/patch-lint.d.ts +38 -29
  335. package/dist/src/core/patch-lint.js +89 -121
  336. package/dist/src/core/patch-lock.d.ts +1 -1
  337. package/dist/src/core/patch-lock.js +45 -9
  338. package/dist/src/core/patch-manifest-consistency.d.ts +2 -1
  339. package/dist/src/core/patch-manifest-consistency.js +25 -27
  340. package/dist/src/core/patch-manifest-io.js +14 -18
  341. package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
  342. package/dist/src/core/patch-manifest-resolve.js +9 -12
  343. package/dist/src/core/patch-manifest-validate.d.ts +6 -1
  344. package/dist/src/core/patch-manifest-validate.js +25 -13
  345. package/dist/src/core/patch-parse.d.ts +24 -13
  346. package/dist/src/core/patch-parse.js +19 -14
  347. package/dist/src/core/patch-policy.d.ts +2 -2
  348. package/dist/src/core/patch-policy.js +2 -2
  349. package/dist/src/core/patch-registration-refs.d.ts +7 -8
  350. package/dist/src/core/patch-registration-refs.js +9 -9
  351. package/dist/src/core/process-cpu-time.d.ts +12 -0
  352. package/dist/src/core/process-cpu-time.js +52 -0
  353. package/dist/src/core/rebase-session.d.ts +38 -26
  354. package/dist/src/core/rebase-session.js +55 -28
  355. package/dist/src/core/register-browser-content.js +9 -74
  356. package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
  357. package/dist/src/core/register-module.js +10 -43
  358. package/dist/src/core/register-scaffold.d.ts +8 -8
  359. package/dist/src/core/register-scaffold.js +10 -10
  360. package/dist/src/core/register-shared-css.d.ts +9 -12
  361. package/dist/src/core/register-shared-css.js +17 -87
  362. package/dist/src/core/register-xpcshell-test.d.ts +6 -7
  363. package/dist/src/core/register-xpcshell-test.js +7 -8
  364. package/dist/src/core/shared-ftl.js +12 -4
  365. package/dist/src/core/state-file.d.ts +45 -0
  366. package/dist/src/core/state-file.js +34 -0
  367. package/dist/src/core/status-binary.d.ts +18 -11
  368. package/dist/src/core/status-binary.js +19 -12
  369. package/dist/src/core/status-classify.d.ts +30 -36
  370. package/dist/src/core/status-classify.js +21 -26
  371. package/dist/src/core/test-changed-prefs.d.ts +30 -0
  372. package/dist/src/core/test-changed-prefs.js +78 -0
  373. package/dist/src/core/test-harness-crash.d.ts +25 -63
  374. package/dist/src/core/test-harness-crash.js +121 -142
  375. package/dist/src/core/test-harness-signature.d.ts +18 -0
  376. package/dist/src/core/test-harness-signature.js +13 -0
  377. package/dist/src/core/test-path-scope.d.ts +12 -15
  378. package/dist/src/core/test-path-scope.js +15 -18
  379. package/dist/src/core/test-stale-check.d.ts +17 -17
  380. package/dist/src/core/test-stale-check.js +50 -43
  381. package/dist/src/core/test-stall-triage.d.ts +51 -0
  382. package/dist/src/core/test-stall-triage.js +126 -0
  383. package/dist/src/core/token-category.js +5 -7
  384. package/dist/src/core/token-coverage.js +9 -9
  385. package/dist/src/core/token-dark-mode.d.ts +9 -11
  386. package/dist/src/core/token-dark-mode.js +9 -11
  387. package/dist/src/core/token-docs.d.ts +2 -0
  388. package/dist/src/core/token-docs.js +2 -0
  389. package/dist/src/core/token-manager.d.ts +10 -2
  390. package/dist/src/core/token-manager.js +17 -8
  391. package/dist/src/core/token-scaffold.d.ts +7 -7
  392. package/dist/src/core/token-scaffold.js +7 -7
  393. package/dist/src/core/token-variant.d.ts +4 -4
  394. package/dist/src/core/token-variant.js +4 -4
  395. package/dist/src/core/toolchain-preflight.d.ts +20 -21
  396. package/dist/src/core/toolchain-preflight.js +28 -31
  397. package/dist/src/core/tree-guard.js +12 -2
  398. package/dist/src/core/tree-store.d.ts +41 -27
  399. package/dist/src/core/tree-store.js +63 -42
  400. package/dist/src/core/typecheck-shim.d.ts +23 -24
  401. package/dist/src/core/typecheck-shim.js +23 -24
  402. package/dist/src/core/typecheck.js +8 -8
  403. package/dist/src/core/wire-destroy.d.ts +3 -3
  404. package/dist/src/core/wire-destroy.js +7 -15
  405. package/dist/src/core/wire-dom-fragment.d.ts +9 -17
  406. package/dist/src/core/wire-dom-fragment.js +11 -44
  407. package/dist/src/core/wire-init.d.ts +2 -3
  408. package/dist/src/core/wire-init.js +8 -19
  409. package/dist/src/core/wire-subscript.d.ts +2 -3
  410. package/dist/src/core/wire-subscript.js +4 -13
  411. package/dist/src/core/wire-utils.d.ts +7 -8
  412. package/dist/src/core/wire-utils.js +7 -8
  413. package/dist/src/core/xpcshell-appdir.d.ts +38 -45
  414. package/dist/src/core/xpcshell-appdir.js +38 -45
  415. package/dist/src/errors/base.d.ts +37 -16
  416. package/dist/src/errors/base.js +37 -16
  417. package/dist/src/errors/build.d.ts +13 -1
  418. package/dist/src/errors/build.js +14 -2
  419. package/dist/src/errors/codes.d.ts +16 -0
  420. package/dist/src/errors/codes.js +16 -0
  421. package/dist/src/errors/furnace.d.ts +4 -4
  422. package/dist/src/errors/git.d.ts +6 -10
  423. package/dist/src/errors/git.js +6 -10
  424. package/dist/src/errors/patch.d.ts +7 -7
  425. package/dist/src/errors/patch.js +7 -7
  426. package/dist/src/errors/rebase.d.ts +4 -4
  427. package/dist/src/errors/rebase.js +4 -4
  428. package/dist/src/index.d.ts +7 -1
  429. package/dist/src/index.js +5 -0
  430. package/dist/src/types/commands/index.d.ts +2 -2
  431. package/dist/src/types/commands/options.d.ts +88 -70
  432. package/dist/src/types/commands/patches.d.ts +24 -34
  433. package/dist/src/types/commands/project.d.ts +5 -34
  434. package/dist/src/types/config.d.ts +25 -23
  435. package/dist/src/types/config.js +6 -1
  436. package/dist/src/types/furnace.d.ts +37 -13
  437. package/dist/src/types/furnace.js +19 -1
  438. package/dist/src/types/index.d.ts +3 -3
  439. package/dist/src/utils/build-info.d.ts +7 -8
  440. package/dist/src/utils/build-info.js +12 -11
  441. package/dist/src/utils/errors.d.ts +6 -8
  442. package/dist/src/utils/errors.js +6 -8
  443. package/dist/src/utils/logger.d.ts +27 -10
  444. package/dist/src/utils/logger.js +28 -16
  445. package/dist/src/utils/machine-output.d.ts +12 -0
  446. package/dist/src/utils/machine-output.js +33 -0
  447. package/dist/src/utils/options.d.ts +31 -14
  448. package/dist/src/utils/options.js +86 -30
  449. package/dist/src/utils/paths.d.ts +10 -8
  450. package/dist/src/utils/paths.js +10 -8
  451. package/dist/src/utils/platform.d.ts +0 -25
  452. package/dist/src/utils/platform.js +1 -42
  453. package/dist/src/utils/process-group.d.ts +9 -4
  454. package/dist/src/utils/process-group.js +19 -5
  455. package/dist/src/utils/process.d.ts +42 -7
  456. package/dist/src/utils/process.js +44 -17
  457. package/dist/src/utils/ps-duration.d.ts +31 -0
  458. package/dist/src/utils/ps-duration.js +70 -0
  459. package/dist/src/utils/regex.d.ts +9 -10
  460. package/dist/src/utils/regex.js +9 -10
  461. package/dist/src/utils/validation.d.ts +58 -28
  462. package/dist/src/utils/validation.js +60 -33
  463. package/package.json +2 -2
  464. package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
  465. package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
  466. package/dist/src/core/manifest-helpers.d.ts +0 -38
  467. package/dist/src/core/manifest-helpers.js +0 -120
  468. /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
  469. /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
  470. /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import type { CustomComponentConfig, DryRunAction, OverrideComponentConfig, StepError } from '../types/furnace.js';
1
+ import type { ComponentApplyContext, CustomComponentConfig, DryRunAction, OverrideComponentConfig, StepError } from '../types/furnace.js';
2
2
  import { type RollbackJournal } from './furnace-rollback.js';
3
3
  interface DirectoryEntry {
4
4
  isFile(): boolean;
@@ -7,8 +7,8 @@ interface DirectoryEntry {
7
7
  }
8
8
  /**
9
9
  * True for a plain-file directory entry — symlinks and directories are
10
- * never copy candidates. Exported for the patch-owned overwrite probe
11
- *, which walks the same override copy-candidate set as apply.
10
+ * never copy candidates. Exported for the patch-owned overwrite probe,
11
+ * which walks the same override copy-candidate set as apply.
12
12
  */
13
13
  export declare function isRegularFile(entry: DirectoryEntry): boolean;
14
14
  /**
@@ -86,14 +86,14 @@ export declare function hasComponentChanged(componentDir: string, previousChecks
86
86
  * the comparison when the engine hash still matches, which is the common case
87
87
  * for projects with many components.
88
88
  */
89
- export declare function hasOverrideEngineDrift(engineDir: string, componentDir: string, config: OverrideComponentConfig, ftlDir: string, cachedEngineChecksums?: Record<string, string>): Promise<boolean>;
89
+ export declare function hasOverrideEngineDrift(ctx: Pick<ComponentApplyContext, 'engineDir' | 'componentDir' | 'ftlDir'>, config: OverrideComponentConfig, cachedEngineChecksums?: Record<string, string>): Promise<boolean>;
90
90
  /**
91
91
  * Detects whether a custom component's deployed copies, jar.mn entries, or
92
92
  * customElements.js registration are missing from the engine or out of sync.
93
93
  * Delegates to `checkRegistrationConsistency` so the oracle stays aligned with
94
94
  * the validate command.
95
95
  */
96
- export declare function hasCustomEngineDrift(root: string, name: string, componentDir: string, config: CustomComponentConfig, ftlDir: string): Promise<boolean>;
96
+ export declare function hasCustomEngineDrift(ctx: Pick<ComponentApplyContext, 'root' | 'name' | 'componentDir' | 'ftlDir'>, config: CustomComponentConfig): Promise<boolean>;
97
97
  /** Extra knobs threaded into `applyCustomComponent` from the project config. */
98
98
  export interface CustomApplyOptions {
99
99
  /**
@@ -104,13 +104,13 @@ export interface CustomApplyOptions {
104
104
  markerComment?: string;
105
105
  }
106
106
  /** Applies a custom component into the engine tree and captures registration step errors. */
107
- export declare function applyCustomComponent(engineDir: string, name: string, componentDir: string, config: CustomComponentConfig, ftlDir: string, dryRun?: boolean, rollbackJournal?: RollbackJournal, applyOptions?: CustomApplyOptions): Promise<{
107
+ export declare function applyCustomComponent(ctx: Pick<ComponentApplyContext, 'engineDir' | 'name' | 'componentDir' | 'ftlDir'>, config: CustomComponentConfig, dryRun?: boolean, rollbackJournal?: RollbackJournal, applyOptions?: CustomApplyOptions): Promise<{
108
108
  affectedPaths: string[];
109
109
  stepErrors: StepError[];
110
110
  actions?: DryRunAction[];
111
111
  }>;
112
112
  /** Applies an override component by copying its matching files onto the engine tree. */
113
- export declare function applyOverrideComponent(engineDir: string, name: string, componentDir: string, config: OverrideComponentConfig, ftlDir: string, dryRun?: boolean, rollbackJournal?: RollbackJournal): Promise<{
113
+ export declare function applyOverrideComponent(ctx: Pick<ComponentApplyContext, 'engineDir' | 'name' | 'componentDir' | 'ftlDir'>, config: OverrideComponentConfig, dryRun?: boolean, rollbackJournal?: RollbackJournal): Promise<{
114
114
  affectedPaths: string[];
115
115
  actions?: DryRunAction[];
116
116
  }>;
@@ -8,6 +8,7 @@ import { copyFile, ensureDir, pathExists, readText, removeFile } from '../utils/
8
8
  import { verbose } from '../utils/logger.js';
9
9
  import { buildCustomDryRunActions } from './furnace-apply-dry-run.js';
10
10
  import { applyCustomFtlFile, applySharedFtlPrune, removeCustomFtlJarMnEntry, } from './furnace-apply-ftl.js';
11
+ import { normalizeForChecksum } from './furnace-checksum-utils.js';
11
12
  import { CUSTOM_ELEMENTS_JS, JAR_MN } from './furnace-constants.js';
12
13
  import { deployFileWithFragments, SHARED_FRAGMENTS_DIR } from './furnace-css-fragments.js';
13
14
  import { addCustomElementRegistration, addJarMnEntries } from './furnace-registration.js';
@@ -17,8 +18,8 @@ import { isGitRepository } from './git.js';
17
18
  import { fileExistsInHead, restoreTrackedPath } from './git-file-ops.js';
18
19
  /**
19
20
  * True for a plain-file directory entry — symlinks and directories are
20
- * never copy candidates. Exported for the patch-owned overwrite probe
21
- *, which walks the same override copy-candidate set as apply.
21
+ * never copy candidates. Exported for the patch-owned overwrite probe,
22
+ * which walks the same override copy-candidate set as apply.
22
23
  */
23
24
  export function isRegularFile(entry) {
24
25
  if (!entry.isFile())
@@ -98,8 +99,7 @@ export async function computeComponentChecksums(componentDir) {
98
99
  if (!isChecksummedComponentFile(entry.name))
99
100
  continue;
100
101
  const content = await readText(join(componentDir, entry.name));
101
- const normalized = content.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n');
102
- const hash = createHash('sha256').update(normalized).digest('hex');
102
+ const hash = createHash('sha256').update(normalizeForChecksum(content)).digest('hex');
103
103
  checksums[entry.name] = hash;
104
104
  }
105
105
  return checksums;
@@ -200,9 +200,6 @@ function componentChecksumsChanged(current, previousChecksums) {
200
200
  }
201
201
  return false;
202
202
  }
203
- function normalizeForChecksum(content) {
204
- return content.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n');
205
- }
206
203
  /**
207
204
  * Detects whether an override component's deployed files are missing from the
208
205
  * engine or differ from the source. Used as a guard before skipping apply on a
@@ -215,7 +212,8 @@ function normalizeForChecksum(content) {
215
212
  * the comparison when the engine hash still matches, which is the common case
216
213
  * for projects with many components.
217
214
  */
218
- export async function hasOverrideEngineDrift(engineDir, componentDir, config, ftlDir, cachedEngineChecksums) {
215
+ export async function hasOverrideEngineDrift(ctx, config, cachedEngineChecksums) {
216
+ const { engineDir, componentDir, ftlDir } = ctx;
219
217
  const entries = await readdir(componentDir, { withFileTypes: true, encoding: 'utf8' });
220
218
  for (const entry of entries) {
221
219
  if (!isRegularFile(entry))
@@ -251,7 +249,8 @@ export async function hasOverrideEngineDrift(engineDir, componentDir, config, ft
251
249
  * Delegates to `checkRegistrationConsistency` so the oracle stays aligned with
252
250
  * the validate command.
253
251
  */
254
- export async function hasCustomEngineDrift(root, name, componentDir, config, ftlDir) {
252
+ export async function hasCustomEngineDrift(ctx, config) {
253
+ const { root, name, componentDir, ftlDir } = ctx;
255
254
  const status = await checkRegistrationConsistency(root, name, config, ftlDir);
256
255
  if (!status.targetExists || !status.filesInSync) {
257
256
  return true;
@@ -289,7 +288,10 @@ export async function hasCustomEngineDrift(root, name, componentDir, config, ftl
289
288
  return false;
290
289
  }
291
290
  /** Applies a custom component into the engine tree and captures registration step errors. */
292
- export async function applyCustomComponent(engineDir, name, componentDir, config, ftlDir, dryRun = false, rollbackJournal, applyOptions = {}) {
291
+ export async function applyCustomComponent(ctx, config, dryRun = false, rollbackJournal, applyOptions = {}) {
292
+ // `ftlDir` stays on the context (the FTL and dry-run callees below read
293
+ // it) but is not needed by name here.
294
+ const { engineDir, name, componentDir } = ctx;
293
295
  if (!/^[a-z][a-z0-9-]*$/.test(name)) {
294
296
  throw new FurnaceError(`Invalid component name "${name}": must match /^[a-z][a-z0-9-]*$/`);
295
297
  }
@@ -300,7 +302,7 @@ export async function applyCustomComponent(engineDir, name, componentDir, config
300
302
  verbose(`Skipped ${customSymlinks.length} symlink(s) in "${name}": ${customSymlinks.map((e) => e.name).join(', ')}`);
301
303
  }
302
304
  if (dryRun) {
303
- const { actions, stepErrors } = await buildCustomDryRunActions(name, componentDir, engineDir, config, targetDir, entries, ftlDir);
305
+ const { actions, stepErrors } = await buildCustomDryRunActions(ctx, config, targetDir, entries);
304
306
  return { affectedPaths: [], stepErrors, actions };
305
307
  }
306
308
  if (rollbackJournal && !(await pathExists(targetDir))) {
@@ -323,8 +325,8 @@ export async function applyCustomComponent(engineDir, name, componentDir, config
323
325
  }
324
326
  // Copy phase (parallel — independent file writes to different paths).
325
327
  // CSS files carrying @fireforge-include directives are written as their
326
- // fragment-expanded form (field report D2); the workspace source keeps
327
- // only the directive, so shared CSS stays single-sourced.
328
+ // fragment-expanded form; the workspace source keeps only the directive,
329
+ // so shared CSS stays single-sourced.
328
330
  const sharedDir = join(componentDir, '..', '..', SHARED_FRAGMENTS_DIR);
329
331
  await Promise.all(filesToCopy.map(async (entry) => {
330
332
  const src = join(componentDir, entry.name);
@@ -337,13 +339,13 @@ export async function applyCustomComponent(engineDir, name, componentDir, config
337
339
  // the shared bundle is owned elsewhere and FireForge must not copy or
338
340
  // register a per-component `.ftl` on its behalf.
339
341
  if (config.localized && !config.sharedFtl) {
340
- await applyCustomFtlFile(engineDir, name, componentDir, ftlDir, affectedPaths, stepErrors, rollbackJournal);
342
+ await applyCustomFtlFile(ctx, affectedPaths, stepErrors, rollbackJournal);
341
343
  }
342
344
  else if (config.localized && config.sharedFtl) {
343
345
  // Drop any dangling per-widget locale jar.mn entry that would point at a
344
346
  // non-existent `<chromeSubPath>/<name>.ftl` and fail `mach build`. The
345
347
  // shared bundle (a different chrome path/base name) is never touched.
346
- await applySharedFtlPrune(engineDir, name, ftlDir, config, affectedPaths, stepErrors, rollbackJournal);
348
+ await applySharedFtlPrune(ctx, config, affectedPaths, stepErrors, rollbackJournal);
347
349
  }
348
350
  if (config.register) {
349
351
  try {
@@ -383,7 +385,8 @@ export async function applyCustomComponent(engineDir, name, componentDir, config
383
385
  return { affectedPaths, stepErrors };
384
386
  }
385
387
  /** Applies an override component by copying its matching files onto the engine tree. */
386
- export async function applyOverrideComponent(engineDir, name, componentDir, config, ftlDir, dryRun = false, rollbackJournal) {
388
+ export async function applyOverrideComponent(ctx, config, dryRun = false, rollbackJournal) {
389
+ const { engineDir, name, componentDir, ftlDir } = ctx;
387
390
  const targetDir = join(engineDir, config.basePath);
388
391
  if (!(await pathExists(targetDir))) {
389
392
  throw new FurnaceError(`Override target path not found in engine: ${config.basePath}`, name);
@@ -2,19 +2,18 @@
2
2
  * Patch-owned overwrite warnings for `furnace apply`.
3
3
  *
4
4
  * For Furnace-managed components, apply OVERWRITES the deployed engine
5
- * copies with the `components/` sources. A fix made directly in `engine/`
6
- * and exported into a patch — but never back-ported to the component
7
- * source — is silently undone by the next apply, and the only prior
8
- * signal was a drift line that read like "someone's uncommitted work".
9
- * This module detects that exact case BEFORE the copy: the deployed
10
- * bytes differ from the component source AND the file is patch-owned,
11
- * and produces a loud per-file warning naming the file, the owning
5
+ * copies with the `components/` sources. A fix made directly in `engine/` and
6
+ * exported into a patch — but never back-ported to the component source — is
7
+ * silently undone by the next apply, and a plain drift line reads like
8
+ * "someone's uncommitted work". This module detects that exact case BEFORE
9
+ * the copy (deployed bytes differ from the component source AND the file is
10
+ * patch-owned) and produces a per-file warning naming the file, the owning
12
11
  * patch, and the consequence.
13
12
  *
14
13
  * The per-file byte comparison already exists —
15
14
  * `checkRegistrationConsistency` for custom components (fragment- and
16
- * ftl-aware) and the copy-candidate walk for overrides — this module
17
- * only surfaces what was previously computed and thrown away.
15
+ * ftl-aware) and the copy-candidate walk for overrides — so this module only
16
+ * surfaces what was previously computed and thrown away.
18
17
  */
19
18
  import type { CustomComponentConfig, OverrideComponentConfig } from '../types/furnace.js';
20
19
  /** One deployed, patch-owned file about to be overwritten with different bytes. */
@@ -3,19 +3,18 @@
3
3
  * Patch-owned overwrite warnings for `furnace apply`.
4
4
  *
5
5
  * For Furnace-managed components, apply OVERWRITES the deployed engine
6
- * copies with the `components/` sources. A fix made directly in `engine/`
7
- * and exported into a patch — but never back-ported to the component
8
- * source — is silently undone by the next apply, and the only prior
9
- * signal was a drift line that read like "someone's uncommitted work".
10
- * This module detects that exact case BEFORE the copy: the deployed
11
- * bytes differ from the component source AND the file is patch-owned,
12
- * and produces a loud per-file warning naming the file, the owning
6
+ * copies with the `components/` sources. A fix made directly in `engine/` and
7
+ * exported into a patch — but never back-ported to the component source — is
8
+ * silently undone by the next apply, and a plain drift line reads like
9
+ * "someone's uncommitted work". This module detects that exact case BEFORE
10
+ * the copy (deployed bytes differ from the component source AND the file is
11
+ * patch-owned) and produces a per-file warning naming the file, the owning
13
12
  * patch, and the consequence.
14
13
  *
15
14
  * The per-file byte comparison already exists —
16
15
  * `checkRegistrationConsistency` for custom components (fragment- and
17
- * ftl-aware) and the copy-candidate walk for overrides — this module
18
- * only surfaces what was previously computed and thrown away.
16
+ * ftl-aware) and the copy-candidate walk for overrides — so this module only
17
+ * surfaces what was previously computed and thrown away.
19
18
  */
20
19
  import { readdir } from 'node:fs/promises';
21
20
  import { join, relative } from 'node:path';
@@ -1,8 +1,7 @@
1
1
  /**
2
- * Dry-run action builders for files deleted from a component workspace
3
- * since the last apply. Split out of `furnace-apply.ts` (at the per-file
4
- * line budget after the overwrite-warning wiring); the real
5
- * undeploy paths stay in `furnace-apply-helpers.ts`.
2
+ * Dry-run action builders for files deleted from a component workspace since
3
+ * the last apply. Split out of `furnace-apply.ts` to stay under the per-file
4
+ * line budget; the real undeploy paths stay in `furnace-apply-helpers.ts`.
6
5
  */
7
6
  import type { CustomComponentConfig, DryRunAction, OverrideComponentConfig } from '../types/furnace.js';
8
7
  /** Plans the engine-restore actions for deleted override workspace files. */
@@ -1,9 +1,8 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * Dry-run action builders for files deleted from a component workspace
4
- * since the last apply. Split out of `furnace-apply.ts` (at the per-file
5
- * line budget after the overwrite-warning wiring); the real
6
- * undeploy paths stay in `furnace-apply-helpers.ts`.
3
+ * Dry-run action builders for files deleted from a component workspace since
4
+ * the last apply. Split out of `furnace-apply.ts` to stay under the per-file
5
+ * line budget; the real undeploy paths stay in `furnace-apply-helpers.ts`.
7
6
  */
8
7
  import { join } from 'node:path';
9
8
  import { getOverrideEngineTargetPath } from './furnace-apply-helpers.js';
@@ -1,14 +1,12 @@
1
1
  import type { ApplyResult, DryRunAction } from '../types/furnace.js';
2
2
  import { type FurnaceOperationContext } from './furnace-operation.js';
3
3
  import { type RollbackJournal } from './furnace-rollback.js';
4
- export { computeComponentChecksums, extractComponentChecksums, hasComponentChanged, hasCustomEngineDrift, hasOverrideEngineDrift, prefixChecksums, } from './furnace-apply-helpers.js';
4
+ export { computeComponentChecksums, hasComponentChanged, prefixChecksums, } from './furnace-apply-helpers.js';
5
5
  /**
6
6
  * Result of {@link applyAllComponents}.
7
7
  *
8
- * Named because the anonymous intersection this replaced forced eight
9
- * `Awaited<ReturnType<typeof applyAllComponents>>` indirections across
10
- * `furnace/deploy.ts`, `furnace/preview.ts`, `furnace-state-persist.ts` and
11
- * `build-prepare.ts` — none of which could be read without opening this file.
8
+ * Named so consumers can refer to the shape directly instead of going
9
+ * through `Awaited<ReturnType<typeof applyAllComponents>>`.
12
10
  *
13
11
  * `actions` is populated only on a dry run; `rollbackJournal` only when
14
12
  * `persistState: false` hands journal ownership back to the caller.
@@ -46,7 +44,6 @@ export declare function applyAllComponents(root: string, dryRun?: boolean, optio
46
44
  }): Promise<ApplyAllComponentsResult>; /**
47
45
  * Shared context threaded through the batch apply loops. Bundles the state
48
46
  * both loops mutate (result/actions/checksums) with the immutable run
49
- * parameters — the previous 12–13 positional parameters let call sites
50
- * drift (the named-apply state-wipe bug) and made every new parameter a
51
- * two-signature change.
47
+ * parameters; the 12–13 positional parameters this replaced let call sites
48
+ * drift and made every new parameter a two-signature change.
52
49
  */
@@ -14,11 +14,12 @@ import { CUSTOM_ELEMENTS_JS, JAR_MN, resolveFtlDir } from './furnace-constants.j
14
14
  import { topologicalSortCustom } from './furnace-graph-utils.js';
15
15
  import { resolveFurnaceMarkerComment } from './furnace-marker.js';
16
16
  import { recordFurnaceRollbackFailure } from './furnace-operation.js';
17
+ import { assertFurnaceEngineDirReady } from './furnace-precondition.js';
17
18
  import { addJarMnEntries, removeCustomElementRegistration, removeJarMnEntries, } from './furnace-registration.js';
18
19
  import { createRollbackJournal, restoreRollbackJournalOrThrow, snapshotFile, } from './furnace-rollback.js';
19
20
  import { blockingStepErrors, hasBlockingStepErrors } from './furnace-step-errors.js';
20
21
  import { runPostApplyConsistencyChecks } from './furnace-validate-registration.js';
21
- export { computeComponentChecksums, extractComponentChecksums, hasComponentChanged, hasCustomEngineDrift, hasOverrideEngineDrift, prefixChecksums, } from './furnace-apply-helpers.js';
22
+ export { computeComponentChecksums, hasComponentChanged, prefixChecksums, } from './furnace-apply-helpers.js';
22
23
  function addMissingComponentError(result, name, directoryPath) {
23
24
  result.errors.push({
24
25
  name,
@@ -50,7 +51,7 @@ async function applyOverrideBatch(ctx) {
50
51
  // reset/download/manual edits can silently erase engine files; the
51
52
  // checksum record alone cannot detect that.
52
53
  const cachedEngine = extractComponentChecksums(state.engineChecksums, 'override', name);
53
- const drifted = await hasOverrideEngineDrift(engineDir, componentDir, overrideConfig, ftlDir, cachedEngine);
54
+ const drifted = await hasOverrideEngineDrift({ engineDir, componentDir, ftlDir }, overrideConfig, cachedEngine);
54
55
  if (!drifted) {
55
56
  result.skipped.push({ name, reason: 'No changes since last apply' });
56
57
  Object.assign(newChecksums, prefixChecksums(previous, 'override', name));
@@ -76,7 +77,7 @@ async function applyOverrideBatch(ctx) {
76
77
  if (!dryRun) {
77
78
  // Runs unconditionally — including when the component source
78
79
  // changed — because the lost-work case is precisely a deployed
79
- // engine edit that the incoming copy is about to replace (J6).
80
+ // engine edit that the incoming copy is about to replace.
80
81
  recordOverwriteWarnings(result, await findPatchOwnedOverwrites({
81
82
  type: 'override',
82
83
  engineDir,
@@ -87,7 +88,7 @@ async function applyOverrideBatch(ctx) {
87
88
  patchClaims: ctx.patchClaims,
88
89
  }));
89
90
  }
90
- const { affectedPaths: filesAffected, actions } = await applyOverrideComponent(engineDir, name, componentDir, overrideConfig, ftlDir, dryRun, rollbackJournal);
91
+ const { affectedPaths: filesAffected, actions } = await applyOverrideComponent({ engineDir, name, componentDir, ftlDir }, overrideConfig, dryRun, rollbackJournal);
91
92
  if (dryRun && actions) {
92
93
  allActions.push(...actions);
93
94
  }
@@ -208,7 +209,7 @@ async function applyCustomBatch(ctx, root, markerComment) {
208
209
  // As with overrides, the checksum record is not sufficient on its
209
210
  // own: a reset/download that cleared the engine must trigger a
210
211
  // re-apply even though the workspace is unchanged.
211
- const drifted = await hasCustomEngineDrift(root, name, componentDir, customConfig, ftlDir);
212
+ const drifted = await hasCustomEngineDrift({ root, name, componentDir, ftlDir }, customConfig);
212
213
  if (!drifted) {
213
214
  result.skipped.push({ name, reason: 'No changes since last apply' });
214
215
  Object.assign(newChecksums, prefixChecksums(previous, 'custom', name));
@@ -244,7 +245,7 @@ async function applyCustomBatch(ctx, root, markerComment) {
244
245
  patchClaims: ctx.patchClaims,
245
246
  }));
246
247
  }
247
- const { affectedPaths: filesAffected, stepErrors, actions, } = await applyCustomComponent(engineDir, name, componentDir, customConfig, ftlDir, dryRun, rollbackJournal, markerComment !== undefined ? { markerComment } : {});
248
+ const { affectedPaths: filesAffected, stepErrors, actions, } = await applyCustomComponent({ engineDir, name, componentDir, ftlDir }, customConfig, dryRun, rollbackJournal, markerComment !== undefined ? { markerComment } : {});
248
249
  if (dryRun && actions) {
249
250
  allActions.push(...actions);
250
251
  }
@@ -304,19 +305,14 @@ export async function applyAllComponents(root, dryRun = false, options) {
304
305
  const { engine: engineDir } = getProjectPaths(root);
305
306
  const furnacePaths = getFurnacePaths(root);
306
307
  const ftlDir = resolveFtlDir(config.ftlBasePath);
307
- // 2026-04-26 eval Finding 6: when `markerComment` is unset in
308
- // fireforge.json, default it to `binaryName.toUpperCase()` so the
309
- // furnace-emitted edits to upstream files (e.g. customElements.js)
310
- // carry a marker that satisfies `lintModificationComments` — that
311
- // rule keys on `${binaryName.toUpperCase()}:` and was firing
312
- // `[missing-modification-comment]` on every furnace-applied
313
- // upstream edit because the implicit default was `undefined`. An
314
- // explicit `markerComment` in fireforge.json still wins.
308
+ // When `markerComment` is unset in fireforge.json, default it to
309
+ // `binaryName.toUpperCase()` so the furnace-emitted edits to upstream
310
+ // files (e.g. customElements.js) carry a marker that satisfies
311
+ // `lintModificationComments` — that rule keys on
312
+ // `${binaryName.toUpperCase()}:`. An explicit `markerComment` still wins.
315
313
  const forgeConfig = await loadConfig(root).catch(() => undefined);
316
314
  const markerComment = resolveFurnaceMarkerComment(forgeConfig);
317
- if (!(await pathExists(engineDir))) {
318
- throw new FurnaceError('Engine directory not found. Run "fireforge download" first.');
319
- }
315
+ await assertFurnaceEngineDirReady(engineDir);
320
316
  const rollbackJournal = dryRun ? undefined : createRollbackJournal();
321
317
  if (rollbackJournal && operationContext) {
322
318
  operationContext.registerJournal(rollbackJournal);
@@ -376,10 +372,10 @@ export async function applyAllComponents(root, dryRun = false, options) {
376
372
  }
377
373
  // Recompute AFTER the consistency checks: they MUTATE entry.stepErrors
378
374
  // when the applied output is inconsistent (e.g. a jar.mn entry that
379
- // silently mis-landed). Reading the pre-check snapshot meant those
380
- // failures skipped rollback and persisted checksums for a component
381
- // known to be inconsistent — while the CLI simultaneously reported
382
- // "failed to apply cleanly".
375
+ // silently mis-landed). Reading the pre-check snapshot lets those failures
376
+ // skip rollback and persist checksums for a component known to be
377
+ // inconsistent, while the CLI simultaneously reports "failed to apply
378
+ // cleanly".
383
379
  const hasStepErrors = result.applied.some((entry) => hasBlockingStepErrors(entry));
384
380
  // --- Rollback on failure, persist on success (skip for dry-run) ---
385
381
  if (!dryRun) {
@@ -426,7 +422,6 @@ export async function applyAllComponents(root, dryRun = false, options) {
426
422
  } /**
427
423
  * Shared context threaded through the batch apply loops. Bundles the state
428
424
  * both loops mutate (result/actions/checksums) with the immutable run
429
- * parameters — the previous 12–13 positional parameters let call sites
430
- * drift (the named-apply state-wipe bug) and made every new parameter a
431
- * two-signature change.
425
+ * parameters; the 12–13 positional parameters this replaced let call sites
426
+ * drift and made every new parameter a two-signature change.
432
427
  */
@@ -9,3 +9,17 @@ export declare function prefixChecksums(checksums: Record<string, string>, type:
9
9
  * (sorted alphabetically) so test snapshots and CLI output are deterministic.
10
10
  */
11
11
  export declare function diffDeletedFiles(previous: Record<string, string>, current: Record<string, string>): string[];
12
+ /**
13
+ * Canonical content normalization for every FireForge component checksum.
14
+ *
15
+ * Strips a leading BOM and folds CRLF to LF, so a file that differs from its
16
+ * deployed copy only by line endings or a byte-order mark is not reported as
17
+ * drift. Every comparison that decides "has this component changed?" must
18
+ * use it — otherwise `furnace status` and `furnace validate` can disagree
19
+ * with `apply`'s skip fast-path about the same pair of files on a CRLF
20
+ * checkout.
21
+ *
22
+ * @param content - Raw file content
23
+ * @returns Content with the BOM removed and CRLF folded to LF
24
+ */
25
+ export declare function normalizeForChecksum(content: string): string;
@@ -36,3 +36,19 @@ export function diffDeletedFiles(previous, current) {
36
36
  }
37
37
  return deleted.sort();
38
38
  }
39
+ /**
40
+ * Canonical content normalization for every FireForge component checksum.
41
+ *
42
+ * Strips a leading BOM and folds CRLF to LF, so a file that differs from its
43
+ * deployed copy only by line endings or a byte-order mark is not reported as
44
+ * drift. Every comparison that decides "has this component changed?" must
45
+ * use it — otherwise `furnace status` and `furnace validate` can disagree
46
+ * with `apply`'s skip fast-path about the same pair of files on a CRLF
47
+ * checkout.
48
+ *
49
+ * @param content - Raw file content
50
+ * @returns Content with the BOM removed and CRLF folded to LF
51
+ */
52
+ export function normalizeForChecksum(content) {
53
+ return content.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n');
54
+ }
@@ -53,8 +53,7 @@ export declare function loadFurnaceConfig(root: string): Promise<FurnaceConfig>;
53
53
  * reset, rebase, rebase --abort): every applied checksum describes content
54
54
  * that no longer exists, but pendingRepair tracks authoring-side rollback
55
55
  * issues in the component WORKSPACE and must survive an engine refresh.
56
- * No-ops when the state file does not exist. Centralized because the same
57
- * reset logic had drifted into four separate command files.
56
+ * No-ops when the state file does not exist.
58
57
  */
59
58
  export declare function clearAppliedFurnaceState(root: string): Promise<void>;
60
59
  /**
@@ -65,20 +64,15 @@ export declare function clearAppliedFurnaceState(root: string): Promise<void>;
65
64
  export declare function writeFurnaceConfig(root: string, config: FurnaceConfig): Promise<void>;
66
65
  /**
67
66
  * Stamps every override's `baseVersion` to the supplied version. Used by
68
- * `fireforge rebase` after a successful patch re-export so a successful
69
- * ESR bump does not leave Furnace overrides in a doctor-failing drift
70
- * state. Returns the number of overrides stamped (zero if furnace.json
71
- * has no overrides, or if the file is missing).
67
+ * `fireforge rebase` after a successful patch re-export, so an ESR bump does
68
+ * not leave Furnace overrides in a doctor-failing drift state: `rebase`
69
+ * stamps patch `sourceEsrVersion` via `stampPatchVersions`, and without the
70
+ * matching override stamp `doctor` fails Furnace component validation on
71
+ * every override.
72
72
  *
73
- * Motivating case: a 140.9.0esr → 140.9.1esr rebase stamps patch
74
- * `sourceEsrVersion` via `stampPatchVersions`, but before 0.16.0 no
75
- * equivalent stamping ran for Furnace override `baseVersion`. `doctor`
76
- * then immediately failed Furnace component validation on every
77
- * override. The stamp is deliberately unconditional — `fireforge
78
- * furnace validate` is the right tool for "does this override still
79
- * apply", and rebase already attested that the patch layer re-validated
80
- * against the new ESR; the per-override health check belongs in a
81
- * separate pass, not inline with the stamp.
73
+ * The stamp is deliberately unconditional — `fireforge furnace validate` is
74
+ * the right tool for "does this override still apply", and rebase has
75
+ * already attested that the patch layer re-validated against the new ESR.
82
76
  *
83
77
  * @param root - Root directory of the project
84
78
  * @param version - Firefox version string to stamp onto every override
@@ -90,23 +84,20 @@ export declare function stampFurnaceOverrideBaseVersions(root: string, version:
90
84
  * Creates a default furnace configuration.
91
85
  *
92
86
  * When a `binaryName` is provided, the default config carries a
93
- * `tokenPrefix` derived as `--<binaryName>-`. Without that default,
94
- * `fireforge token coverage` on a fresh project reports `0 tokens` and
95
- * labels every custom-property reference as `unknown` — the scan has
96
- * no prefix to key off. The 2026-04-21 eval walked directly into this
97
- * state (`furnace init` → `token add` → `token coverage` → zero
98
- * tokens), and only recovered after hand-editing furnace.json. Deriving
99
- * the prefix from the binary name matches the convention the scaffolded
100
- * tokens CSS already uses for its `--<binaryName>-*` declarations.
87
+ * `tokenPrefix` derived as `--<binaryName>-`. Without it, `fireforge token
88
+ * coverage` on a fresh project reports `0 tokens` and labels every
89
+ * custom-property reference as `unknown`, because the scan has no prefix to
90
+ * key off. Deriving the prefix from the binary name matches the convention
91
+ * the scaffolded tokens CSS already uses for its `--<binaryName>-*`
92
+ * declarations.
101
93
  *
102
- * `validateFurnaceConfig` treats `tokenPrefix` as optional, so callers
103
- * on the legacy no-arg call shape (existing tests, programmatic callers
104
- * bootstrapping from a not-yet-loaded config) still get a valid config
105
- * without a prefix; the CLI init path always has a `binaryName` from
106
- * `fireforge.json` and always sets one.
94
+ * `validateFurnaceConfig` treats `tokenPrefix` as optional, so callers on
95
+ * the no-arg call shape still get a valid config without a prefix; the CLI
96
+ * init path always has a `binaryName` from `fireforge.json` and always sets
97
+ * one.
107
98
  *
108
- * @param options - Optional init context; pass `{ binaryName }` to
109
- * derive the token prefix.
99
+ * @param options - Optional init context; pass `{ binaryName }` to derive
100
+ * the token prefix.
110
101
  * @returns A valid FurnaceConfig
111
102
  */
112
103
  export declare function createDefaultFurnaceConfig(options?: {