@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
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Minimal Markdown pipe-table parser/writer used by token-manager.
4
4
  *
5
- * This is **not** a general Markdown parser. It understands exactly the
5
+ * This is not a general Markdown parser. It understands exactly the
6
6
  * slice of GitHub-flavoured Markdown that FireForge emits into token docs:
7
7
  *
8
8
  * - Leading `|` per row, trailing `|` optional.
@@ -13,10 +13,10 @@
13
13
  * - Literal `|` and `\` inside a cell are expressed as `\|` and `\\`
14
14
  * respectively. The parser treats any other backslash as a literal
15
15
  * so prose-style backslashes in cell values (e.g. a Windows path)
16
- * still round-trip. Unescaping happens at split time; serialization
16
+ * still round-trip. Unescaping happens at split time. Serialization
17
17
  * re-applies escapes so round-trips are exact for well-formed input.
18
18
  *
19
- * The parser returns **positional metadata** (`startLine`, `endLine`) so
19
+ * The parser returns positional metadata (`startLine`, `endLine`) so
20
20
  * callers can splice the table back into the surrounding document by
21
21
  * range instead of hand-rolled line counters. Mutation operations return
22
22
  * a fresh line array rather than mutating in place, matching the rest of
@@ -25,7 +25,7 @@
25
25
  * Fallback tolerance: rows with more cells than the header get their
26
26
  * overflow merged into the last column (using a literal `|` separator
27
27
  * between the merged values). This is for the rare case where a FireForge
28
- * writer emits an unescaped pipe — the parser still produces a consistent
28
+ * writer emits an unescaped pipe. The parser still produces a consistent
29
29
  * cell count rather than desynchronising the table. On re-serialize the
30
30
  * merged cell's literal pipes are escaped, so a malformed input becomes
31
31
  * a well-formed output after one round trip.
@@ -38,8 +38,8 @@
38
38
  const SEPARATOR_ROW = /^\s*\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)+\|?\s*$/;
39
39
  /**
40
40
  * Returns `true` if the given line looks like a table row (starts with
41
- * `|`, ignoring leading whitespace). Does not validate cell contents —
42
- * that is the caller's job.
41
+ * `|`, ignoring leading whitespace). Does not validate cell contents.
42
+ * That is the caller's job.
43
43
  */
44
44
  function isPipeRow(line) {
45
45
  return /^\s*\|/.test(line);
@@ -79,11 +79,11 @@ function splitRow(row) {
79
79
  current += ch ?? '';
80
80
  }
81
81
  cells.push(current);
82
- // Leading `|` gives an empty first segment; drop it.
82
+ // Leading `|` gives an empty first segment, so drop it.
83
83
  if (cells.length > 0 && cells[0] === '') {
84
84
  cells.shift();
85
85
  }
86
- // Trailing `|` gives an empty last segment; drop it.
86
+ // Trailing `|` gives an empty last segment, so drop it.
87
87
  if (cells.length > 0 && cells[cells.length - 1] === '') {
88
88
  cells.pop();
89
89
  }
@@ -93,7 +93,7 @@ function splitRow(row) {
93
93
  * Escapes a cell value so `serializeRow`'s pipe delimiters can be told
94
94
  * apart from literal `|` inside a cell on re-parse. `\` is escaped first
95
95
  * (to `\\`) so that the subsequent `|` → `\|` substitution cannot produce
96
- * an already-escaped sequence by accident — i.e. a cell containing
96
+ * an already-escaped sequence by accident. A cell containing
97
97
  * literal `\` followed by literal `|` round-trips as `\\\|`, which
98
98
  * unescape-on-split reads back as `\` + `|`, not as `\|`.
99
99
  */
@@ -114,7 +114,7 @@ function fitRowToColumns(cells, columnCount) {
114
114
  if (cells.length < columnCount) {
115
115
  return [...cells, ...Array(columnCount - cells.length).fill('')];
116
116
  }
117
- // cells.length > columnCount — merge overflow into the last column.
117
+ // cells.length > columnCount: merge overflow into the last column.
118
118
  const kept = cells.slice(0, columnCount - 1);
119
119
  const tail = cells.slice(columnCount - 1).join(' | ');
120
120
  return [...kept, tail];
@@ -160,7 +160,7 @@ export function findNextTable(lines, fromLine) {
160
160
  const rowLine = lines[j] ?? '';
161
161
  if (!isPipeRow(rowLine))
162
162
  break;
163
- // Another separator line would signal a malformed table — bail.
163
+ // Another separator line would signal a malformed table, so bail.
164
164
  if (SEPARATOR_ROW.test(rowLine))
165
165
  break;
166
166
  rows.push(fitRowToColumns(splitRow(rowLine), headers.length));
@@ -171,7 +171,7 @@ export function findNextTable(lines, fromLine) {
171
171
  return null;
172
172
  }
173
173
  /**
174
- * Returns the first table whose header contains **all** of the provided
174
+ * Returns the first table whose header contains all of the provided
175
175
  * column names (case-sensitive, order-insensitive). Useful when several
176
176
  * pipe tables share a document and you want to select "the one with a
177
177
  * Mode column".
@@ -190,7 +190,7 @@ export function findTableByColumns(lines, requiredColumns) {
190
190
  }
191
191
  }
192
192
  /**
193
- * Returns the first table that appears **after** a heading matching the
193
+ * Returns the first table that appears after a heading matching the
194
194
  * given regex. The heading regex is applied to raw lines (no trimming)
195
195
  * so callers that want leading whitespace flexibility should include
196
196
  * `^\s*` or `^#+\s*` as appropriate.
@@ -217,7 +217,7 @@ export function serializeRow(cells) {
217
217
  }
218
218
  /**
219
219
  * Inserts a new row into `table.rows` at the given zero-based index. A
220
- * negative index counts from the end; `Infinity` appends. Mutates the
220
+ * negative index counts from the end. `Infinity` appends. Mutates the
221
221
  * table object so callers using {@link rewriteTableRows} see the update.
222
222
  */
223
223
  export function insertRow(table, cells, index) {
@@ -6,24 +6,24 @@ export declare const DEFAULT_MOCHITEST_SERVER_PORT = 8888;
6
6
  * `server.js`, launched from an objdir.
7
7
  *
8
8
  * Both halves are required. `server.js` alone is one of the most common
9
- * filenames in existence — a developer's unrelated Node service must never
10
- * be mistaken for harness debris and offered up for termination — so the
11
- * command line must ALSO show the xpcshell/objdir provenance that only the
9
+ * filenames there is, and a developer's unrelated Node service must never
10
+ * be mistaken for harness debris and offered up for termination. So the
11
+ * command line must also show the xpcshell/objdir provenance that only the
12
12
  * harness's httpd has.
13
13
  */
14
14
  export declare function isMochitestServerHolder(holder: MarionettePortHolder): boolean;
15
15
  /**
16
- * Refuses a mochitest dispatch when the harness's server port is held, and
17
- * — only for a recognized stale harness httpd, and only when the operator
18
- * opted in — terminates it first.
16
+ * Refuses a mochitest dispatch when the harness's server port is held. It
17
+ * terminates the holder first only for a recognized stale harness httpd,
18
+ * and only when the operator opted in.
19
19
  *
20
- * An UNRECOGNIZED listener is a refusal too, never a kill. Refusing is the
20
+ * An unrecognized listener is a refusal too, never a kill. Refusing is the
21
21
  * kinder outcome: mochitest cannot bind the port either way, so the choice
22
22
  * is between a one-line refusal now and a 370 s stall whose signature says
23
23
  * nothing about ports. But FireForge has no business killing a process it
24
24
  * cannot attribute to the harness.
25
25
  *
26
- * Best-effort by construction: {@link probeMarionettePort} reports an
26
+ * Best effort: {@link probeMarionettePort} reports an
27
27
  * unprobeable port as free, so a host without `lsof` runs exactly as before.
28
28
  *
29
29
  * @param port - Port to probe (default {@link DEFAULT_MOCHITEST_SERVER_PORT})
@@ -4,23 +4,23 @@
4
4
  *
5
5
  * The mochitest harness serves its test manifest from an xpcshell-hosted
6
6
  * httpd (`server.js`) on `127.0.0.1:8888`. When a previous run is killed
7
- * between browser launch and teardown, that server can survive — sometimes
8
- * wedged at 100% CPU and unkillable by the harness's own SIGKILL — and it
7
+ * between browser launch and teardown, that server can survive (sometimes
8
+ * wedged at 100% CPU and unkillable by the harness's own SIGKILL) and it
9
9
  * keeps the port.
10
10
  *
11
11
  * The next run then does something much worse than failing: its fresh
12
- * browser connects to the ZOMBIE server, which cannot serve the new
12
+ * browser connects to the zombie server, which cannot serve the new
13
13
  * manifest, so the run stalls between browser startup and `TEST_START` and
14
14
  * dies on the 370 s no-output timeout with `Ran 0 checks`. Nothing in that
15
15
  * signature names the port, so the failure survives fresh builds and reads
16
- * as a defect in the change under test — one downstream report spent a
16
+ * as a defect in the change under test. One downstream report spent a
17
17
  * multi-hour bisect on it before `lsof -nP -iTCP:8888` gave the answer in
18
18
  * one line.
19
19
  *
20
20
  * `--kill-stale-marionette` never covered this: it clears the browser and
21
21
  * the Marionette control port, and the httpd is neither. This preflight is
22
- * the missing half, and it deliberately reuses {@link probeMarionettePort},
23
- * which is port-generic, rather than growing a second probe.
22
+ * the missing half, and it reuses {@link probeMarionettePort}, which is
23
+ * port-generic, rather than growing a second probe.
24
24
  */
25
25
  import { GeneralError } from '../errors/base.js';
26
26
  import { exec } from '../utils/process.js';
@@ -32,9 +32,9 @@ export const DEFAULT_MOCHITEST_SERVER_PORT = 8888;
32
32
  * `server.js`, launched from an objdir.
33
33
  *
34
34
  * Both halves are required. `server.js` alone is one of the most common
35
- * filenames in existence — a developer's unrelated Node service must never
36
- * be mistaken for harness debris and offered up for termination — so the
37
- * command line must ALSO show the xpcshell/objdir provenance that only the
35
+ * filenames there is, and a developer's unrelated Node service must never
36
+ * be mistaken for harness debris and offered up for termination. So the
37
+ * command line must also show the xpcshell/objdir provenance that only the
38
38
  * harness's httpd has.
39
39
  */
40
40
  export function isMochitestServerHolder(holder) {
@@ -44,17 +44,17 @@ export function isMochitestServerHolder(holder) {
44
44
  return /\bxpcshell\b/.test(line) || /\/obj-[^/\s]*\//.test(line) || /\b_tests\b/.test(line);
45
45
  }
46
46
  /**
47
- * Refuses a mochitest dispatch when the harness's server port is held, and
48
- * — only for a recognized stale harness httpd, and only when the operator
49
- * opted in — terminates it first.
47
+ * Refuses a mochitest dispatch when the harness's server port is held. It
48
+ * terminates the holder first only for a recognized stale harness httpd,
49
+ * and only when the operator opted in.
50
50
  *
51
- * An UNRECOGNIZED listener is a refusal too, never a kill. Refusing is the
51
+ * An unrecognized listener is a refusal too, never a kill. Refusing is the
52
52
  * kinder outcome: mochitest cannot bind the port either way, so the choice
53
53
  * is between a one-line refusal now and a 370 s stall whose signature says
54
54
  * nothing about ports. But FireForge has no business killing a process it
55
55
  * cannot attribute to the harness.
56
56
  *
57
- * Best-effort by construction: {@link probeMarionettePort} reports an
57
+ * Best effort: {@link probeMarionettePort} reports an
58
58
  * unprobeable port as free, so a host without `lsof` runs exactly as before.
59
59
  *
60
60
  * @param port - Port to probe (default {@link DEFAULT_MOCHITEST_SERVER_PORT})
@@ -100,8 +100,8 @@ export function describeMochitestServerRefusal(port, holder, recognized) {
100
100
  const killHint = process.platform === 'win32'
101
101
  ? `Stop-Process -Id ${holder.pid} -Force`
102
102
  : `kill -9 ${holder.pid}`;
103
- const evidence = `The mochitest server port ${String(port)} is already held by ${holder.command} ` +
104
- `(PID ${String(holder.pid)}).\n` +
103
+ const evidence = `The mochitest server port ${port} is already held by ${holder.command} ` +
104
+ `(PID ${holder.pid}).\n` +
105
105
  ` command: ${holder.commandLine}\n` +
106
106
  " A browser launched now would connect to THAT server, which cannot serve this run's " +
107
107
  'manifest — the run would stall before TEST_START and die on the no-output timeout with ' +
@@ -115,5 +115,5 @@ export function describeMochitestServerRefusal(port, holder, recognized) {
115
115
  return (evidence +
116
116
  " This is NOT the mochitest harness's server.js, so FireForge will not offer to kill it. " +
117
117
  `Stop the holder yourself with "${killHint}" if it is yours, or free the port, then retry. ` +
118
- `Diagnose with "lsof -nP -iTCP:${String(port)}".`);
118
+ `Diagnose with "lsof -nP -iTCP:${port}".`);
119
119
  }
@@ -3,20 +3,20 @@
3
3
  *
4
4
  * An `.sys.mjs` that a packaged module imports but whose `EXTRA_JS_MODULES`
5
5
  * registration never landed kills every xpcshell suite with `xpcshell return
6
- * code: -11` and ZERO output — no import error, no stack, nothing. The
6
+ * code: -11` and no output at all: no import error, no stack, nothing. The
7
7
  * queue-level `unregistered-system-module` check catches one shape of this:
8
- * a module NEWLY CREATED by a patch in the projected queue. The other shape
9
- * — modules imported from an ALREADY-EXISTING module before their moz.build
10
- * lines land — slips past it entirely.
8
+ * a module newly created by a patch in the projected queue. The other shape,
9
+ * modules imported from an already-existing module before their moz.build
10
+ * lines land, slips past it entirely.
11
11
  *
12
- * This preflight closes that gap by asking the question against the ENGINE
12
+ * This preflight closes that gap by asking the question against the engine
13
13
  * rather than against a projected diff: for every `resource:///modules/…`
14
14
  * specifier imported by any queue-owned module, does the module it names
15
15
  * exist, and is it registered in a moz.build that covers it?
16
16
  *
17
17
  * Scope is the queue-owned file set on purpose. A specifier that resolves to
18
- * no owned file is an UPSTREAM Firefox module, which FireForge does not
19
- * police and cannot cheaply enumerate; policing only what the fork owns is
18
+ * no owned file is an upstream Firefox module, which FireForge does not
19
+ * police and cannot cheaply enumerate. Policing only what the fork owns is
20
20
  * both the actionable set and the one that produces real incidents.
21
21
  */
22
22
  /** Why a queue-owned module import does not resolve to a packaged module. */
@@ -38,7 +38,7 @@ export interface UnresolvedModuleImport {
38
38
  *
39
39
  * @param engineDir - Path to the engine checkout
40
40
  * @param ownedFiles - Engine-relative paths the patch queue owns
41
- * @returns Findings sorted by module path; empty when everything resolves
41
+ * @returns Findings sorted by module path. Empty when everything resolves
42
42
  */
43
43
  export declare function findUnresolvedSystemModuleImports(engineDir: string, ownedFiles: readonly string[]): Promise<UnresolvedModuleImport[]>;
44
44
  /**
@@ -4,20 +4,20 @@
4
4
  *
5
5
  * An `.sys.mjs` that a packaged module imports but whose `EXTRA_JS_MODULES`
6
6
  * registration never landed kills every xpcshell suite with `xpcshell return
7
- * code: -11` and ZERO output — no import error, no stack, nothing. The
7
+ * code: -11` and no output at all: no import error, no stack, nothing. The
8
8
  * queue-level `unregistered-system-module` check catches one shape of this:
9
- * a module NEWLY CREATED by a patch in the projected queue. The other shape
10
- * — modules imported from an ALREADY-EXISTING module before their moz.build
11
- * lines land — slips past it entirely.
9
+ * a module newly created by a patch in the projected queue. The other shape,
10
+ * modules imported from an already-existing module before their moz.build
11
+ * lines land, slips past it entirely.
12
12
  *
13
- * This preflight closes that gap by asking the question against the ENGINE
13
+ * This preflight closes that gap by asking the question against the engine
14
14
  * rather than against a projected diff: for every `resource:///modules/…`
15
15
  * specifier imported by any queue-owned module, does the module it names
16
16
  * exist, and is it registered in a moz.build that covers it?
17
17
  *
18
18
  * Scope is the queue-owned file set on purpose. A specifier that resolves to
19
- * no owned file is an UPSTREAM Firefox module, which FireForge does not
20
- * police and cannot cheaply enumerate; policing only what the fork owns is
19
+ * no owned file is an upstream Firefox module, which FireForge does not
20
+ * police and cannot cheaply enumerate. Policing only what the fork owns is
21
21
  * both the actionable set and the one that produces real incidents.
22
22
  */
23
23
  import { dirname, join } from 'node:path';
@@ -47,7 +47,7 @@ async function readIfPresent(path) {
47
47
  * True when some `moz.build` at or above `moduleRelPath`'s directory (up
48
48
  * to, and including, the engine root) mentions the module's basename.
49
49
  *
50
- * Walking ancestors — rather than checking only the sibling `moz.build` —
50
+ * Walking ancestors, rather than checking only the sibling `moz.build`,
51
51
  * matches how Mozilla's build system actually works: a module list may sit
52
52
  * in a parent directory's `moz.build` with a path-qualified entry. The
53
53
  * check is a quoted-basename match for the same reason the queue-level
@@ -59,7 +59,7 @@ async function isRegisteredInAncestorMozBuild(engineDir, moduleRelPath, mozBuild
59
59
  // The entry may be the bare basename (`"Foo.sys.mjs"`, sibling
60
60
  // moz.build) or path-qualified relative to the moz.build that declares
61
61
  // it (`"sub/Foo.sys.mjs"`, ancestor moz.build). Both are the same
62
- // registration; anchor on the closing quote and require a path boundary
62
+ // registration. Anchor on the closing quote and require a path boundary
63
63
  // so `NotFoo.sys.mjs` cannot satisfy `Foo.sys.mjs`.
64
64
  const quotedLeaf = new RegExp(`["'](?:[^"']*/)?${escapeRegex(leaf)}["']`);
65
65
  let dir = dirname(moduleRelPath);
@@ -86,7 +86,7 @@ async function isRegisteredInAncestorMozBuild(engineDir, moduleRelPath, mozBuild
86
86
  *
87
87
  * @param engineDir - Path to the engine checkout
88
88
  * @param ownedFiles - Engine-relative paths the patch queue owns
89
- * @returns Findings sorted by module path; empty when everything resolves
89
+ * @returns Findings sorted by module path. Empty when everything resolves
90
90
  */
91
91
  export async function findUnresolvedSystemModuleImports(engineDir, ownedFiles) {
92
92
  const owned = [...new Set(ownedFiles)];
@@ -110,7 +110,7 @@ export async function findUnresolvedSystemModuleImports(engineDir, ownedFiles) {
110
110
  const suffix = moduleSourceSuffix(specifier);
111
111
  if (suffix === undefined)
112
112
  continue;
113
- // Only fork-owned targets are policed; anything else is upstream.
113
+ // Only fork-owned targets are policed. Anything else is upstream.
114
114
  const target = owned.find((file) => file.endsWith(suffix));
115
115
  if (target === undefined)
116
116
  continue;
@@ -1,7 +1,7 @@
1
1
  import type { MozBuildToken } from './moz-manifest-tokenizers.js';
2
2
  /**
3
3
  * Ordering comparator matching mozbuild's `StrictOrderingOnAppendList`
4
- * (`mozbuild.util.UnsortedError`): entries are compared **case-insensitively**,
4
+ * (`mozbuild.util.UnsortedError`): entries are compared case-insensitively,
5
5
  * so `HominisAppearanceController` (`appe`) sorts before
6
6
  * `HominisAppMenuIntegration` (`appm`) even though a raw byte comparison
7
7
  * places the uppercase `M` (0x4D) before the lowercase `e` (0x65).
@@ -26,11 +26,11 @@ export declare function findAlphabeticalMozBuildPosition(tokens: MozBuildToken[]
26
26
  *
27
27
  * Shared by the two jar.mn registrars (browser content, shared CSS), which
28
28
  * differ only in the sort pattern, the sort key and the "could not find the
29
- * section" message, so the anchor-fallback semantics — silently falling back
30
- * rather than refusing, and reporting `afterFallback` so the caller can say
31
- * so — are defined once.
29
+ * section" message, so the anchor-fallback semantics are defined once:
30
+ * silently fall back rather than refuse, and report `afterFallback` so the
31
+ * caller can say so.
32
32
  *
33
- * Deliberately jar.mn-specific: the moz.build list form has no `after` anchor
33
+ * This helper is jar.mn-specific: the moz.build list form has no `after` anchor
34
34
  * and no section concept, so a single generic helper over both families
35
35
  * would carry parameters that are meaningless on one side. See
36
36
  * {@link insertMozBuildListEntry} for its twin.
@@ -58,11 +58,11 @@ export declare function insertJarMnEntry(content: string, entry: string, options
58
58
  * manifests), which differ only in the list pattern, the sort key and the
59
59
  * refusal message.
60
60
  *
61
- * `tokenizeMozBuildList` **mutates `lines` in place** when it normalizes the
61
+ * `tokenizeMozBuildList` mutates `lines` in place when it normalizes the
62
62
  * single-line `FOO += []` form into the multi-line shape, and that rewrite is
63
63
  * what makes the caller's `splice` land inside the list body. The splice
64
64
  * below therefore has to run against the same array the tokenizer was
65
- * handed; a wrapper that tokenized a copy would silently break it.
65
+ * handed. A wrapper that tokenized a copy would silently break it.
66
66
  *
67
67
  * @param content - Full moz.build text
68
68
  * @param entry - The already-formatted line to insert
@@ -4,7 +4,7 @@ import { escapeRegex } from '../utils/regex.js';
4
4
  import { tokenizeJarMn, tokenizeMozBuildList } from './moz-manifest-tokenizers.js';
5
5
  /**
6
6
  * Ordering comparator matching mozbuild's `StrictOrderingOnAppendList`
7
- * (`mozbuild.util.UnsortedError`): entries are compared **case-insensitively**,
7
+ * (`mozbuild.util.UnsortedError`): entries are compared case-insensitively,
8
8
  * so `HominisAppearanceController` (`appe`) sorts before
9
9
  * `HominisAppMenuIntegration` (`appm`) even though a raw byte comparison
10
10
  * places the uppercase `M` (0x4D) before the lowercase `e` (0x65).
@@ -91,11 +91,11 @@ export function findAlphabeticalMozBuildPosition(tokens, newKey) {
91
91
  *
92
92
  * Shared by the two jar.mn registrars (browser content, shared CSS), which
93
93
  * differ only in the sort pattern, the sort key and the "could not find the
94
- * section" message, so the anchor-fallback semantics — silently falling back
95
- * rather than refusing, and reporting `afterFallback` so the caller can say
96
- * so — are defined once.
94
+ * section" message, so the anchor-fallback semantics are defined once:
95
+ * silently fall back rather than refuse, and report `afterFallback` so the
96
+ * caller can say so.
97
97
  *
98
- * Deliberately jar.mn-specific: the moz.build list form has no `after` anchor
98
+ * This helper is jar.mn-specific: the moz.build list form has no `after` anchor
99
99
  * and no section concept, so a single generic helper over both families
100
100
  * would carry parameters that are meaningless on one side. See
101
101
  * {@link insertMozBuildListEntry} for its twin.
@@ -140,11 +140,11 @@ export function insertJarMnEntry(content, entry, options) {
140
140
  * manifests), which differ only in the list pattern, the sort key and the
141
141
  * refusal message.
142
142
  *
143
- * `tokenizeMozBuildList` **mutates `lines` in place** when it normalizes the
143
+ * `tokenizeMozBuildList` mutates `lines` in place when it normalizes the
144
144
  * single-line `FOO += []` form into the multi-line shape, and that rewrite is
145
145
  * what makes the caller's `splice` land inside the list body. The splice
146
146
  * below therefore has to run against the same array the tokenizer was
147
- * handed; a wrapper that tokenized a copy would silently break it.
147
+ * handed. A wrapper that tokenized a copy would silently break it.
148
148
  *
149
149
  * @param content - Full moz.build text
150
150
  * @param entry - The already-formatted line to insert
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Manifest registration barrel — re-exports all registration targets
2
+ * Manifest registration barrel. Re-exports all registration targets
3
3
  * and the shared RegisterResult interface (which lives in
4
4
  * `register-result.ts` so the leaf modules can import it without
5
5
  * creating a cycle through this barrel).
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * Manifest registration barrel — re-exports all registration targets
3
+ * Manifest registration barrel. Re-exports all registration targets
4
4
  * and the shared RegisterResult interface (which lives in
5
5
  * `register-result.ts` so the leaf modules can import it without
6
6
  * creating a cycle through this barrel).
@@ -15,7 +15,7 @@ export { deregisterTestManifest, registerTestManifest } from './register-browser
15
15
  export { registerFireForgeModule } from './register-module.js';
16
16
  export { registerSharedCSS } from './register-shared-css.js';
17
17
  // ---------------------------------------------------------------------------
18
- // toolkit/content/jar.mn — widget registration
18
+ // toolkit/content/jar.mn: widget registration
19
19
  // ---------------------------------------------------------------------------
20
20
  /**
21
21
  * Registers a widget file (mjs or css) in toolkit/content/jar.mn.
@@ -3,6 +3,7 @@ import { basename, join } from 'node:path';
3
3
  import { GeneralError, InvalidArgumentError } from '../errors/base.js';
4
4
  import { pathExists, readText } from '../utils/fs.js';
5
5
  import { warn } from '../utils/logger.js';
6
+ import { normalizePathSlashes } from '../utils/paths.js';
6
7
  import { escapeRegex } from '../utils/regex.js';
7
8
  import { getProjectPaths, loadConfig } from './config.js';
8
9
  import { registerBrowserContent, registerFireForgeModule, registerSharedCSS, registerTestManifest, registerToolkitWidget, } from './moz-manifest-register.js';
@@ -25,8 +26,8 @@ export function getRules(binaryName, createManifest = false) {
25
26
  supportsAfter: true,
26
27
  },
27
28
  {
28
- // `.inc.xhtml` fragments under browser/base/content/ are deliberately
29
- // excluded: they are consumed via `#include` from a registered chrome
29
+ // `.inc.xhtml` fragments under browser/base/content/ are excluded on
30
+ // purpose: they are consumed via `#include` from a registered chrome
30
31
  // document (typically browser.xhtml) and do not get their own packaged
31
32
  // chrome URI. Without the carve-out, `status` flags every wired
32
33
  // fragment as "potentially unregistered" and `register --dry-run`
@@ -45,8 +46,8 @@ export function getRules(binaryName, createManifest = false) {
45
46
  supportsAfter: true,
46
47
  },
47
48
  {
48
- // Fork-owned browser.toml manifests at ARBITRARY depth under
49
- // browser/base/content/test/ — a one-level pattern rejects nested
49
+ // Fork-owned browser.toml manifests at any depth under
50
+ // browser/base/content/test/. A one-level pattern rejects nested
50
51
  // browser-chrome manifests.
51
52
  pattern: /^browser\/base\/content\/test\/((?:[^/]+\/)*[^/]+)\/browser\.toml$/,
52
53
  isRegistered: (_engineDir, testDir) => isTestManifestRegistered(_engineDir, testDir),
@@ -72,66 +73,69 @@ export function getRules(binaryName, createManifest = false) {
72
73
  // xpcshell test files. Any `test_*.js` outside
73
74
  // browser/base/content/test/ (which stays browser-chrome territory
74
75
  // with its browser.toml guidance) registers into the directory's
75
- // xpcshell.toml; with --create-manifest a missing manifest is
76
+ // xpcshell.toml. With --create-manifest a missing manifest is
76
77
  // scaffolded and wired via XPCSHELL_TESTS_MANIFESTS.
77
78
  pattern: /^(?!browser\/base\/content\/test\/)(.+)\/(test_[^/]+\.js)$/,
78
79
  isRegistered: (engineDir, dirRel, fileName) => isXpcshellTestRegistered(engineDir, dirRel, fileName),
79
80
  register: (engineDir, _after, dryRun, dirRel, fileName) => registerXpcshellTest(engineDir, dirRel, fileName, dryRun, createManifest),
80
- // Both groups are guaranteed by the pattern; slice avoids dead
81
+ // Both groups are guaranteed by the pattern, so slice avoids dead
81
82
  // fallback branches.
82
83
  extractArgs: (m) => m.slice(1, 3),
83
84
  supportsAfter: false,
84
85
  },
85
86
  ];
86
87
  }
87
- async function isSharedCSSRegistered(engineDir, fileName) {
88
- const manifestPath = join(engineDir, 'browser/themes/shared/jar.inc.mn');
88
+ /**
89
+ * Reads an engine manifest and reports whether it contains any of `needles`.
90
+ *
91
+ * The five registration probes below share this shape: resolve the manifest
92
+ * relative to the engine, refuse with the manifest's own path when it is
93
+ * missing, then substring-match the entry each registrar writes.
94
+ *
95
+ * @param engineDir - Path to the engine directory
96
+ * @param manifestRel - Engine-relative manifest path (forward slashes, and
97
+ * also the path named in the refusal message)
98
+ * @param needles - Entry forms that count as registered
99
+ * @returns True when the manifest contains at least one needle
100
+ * @throws GeneralError when the manifest does not exist
101
+ */
102
+ async function manifestIncludes(engineDir, manifestRel, needles) {
103
+ const manifestPath = join(engineDir, manifestRel);
89
104
  if (!(await pathExists(manifestPath))) {
90
- throw new GeneralError('Manifest not found: browser/themes/shared/jar.inc.mn');
105
+ throw new GeneralError(`Manifest not found: ${manifestRel}`);
91
106
  }
92
- const name = basename(fileName, '.css');
93
107
  const content = await readText(manifestPath);
94
- // `register` writes the canonical `skin/classic/browser/<name>.css` form;
108
+ return needles.some((needle) => content.includes(needle));
109
+ }
110
+ async function isSharedCSSRegistered(engineDir, fileName) {
111
+ const name = basename(fileName, '.css');
112
+ // `register` writes the canonical `skin/classic/browser/<name>.css` form.
95
113
  // `furnace chrome-doc create` writes a `content/browser/<name>.css` entry
96
114
  // because the CSS is loaded by a chrome document via a `chrome://browser/
97
115
  // content/<name>.css` URI. Match either prefix so paths registered by the
98
116
  // chrome-doc scaffolder are not flagged as "potentially unregistered" by
99
117
  // `status` and so a re-run of `register` against the same file recognises
100
118
  // the existing entry instead of proposing a duplicate.
101
- return (content.includes(`skin/classic/browser/${name}.css`) ||
102
- content.includes(`content/browser/${name}.css`));
119
+ return manifestIncludes(engineDir, 'browser/themes/shared/jar.inc.mn', [
120
+ `skin/classic/browser/${name}.css`,
121
+ `content/browser/${name}.css`,
122
+ ]);
103
123
  }
104
124
  async function isBrowserContentRegistered(engineDir, fileName) {
105
- const manifestPath = join(engineDir, 'browser/base/jar.mn');
106
- if (!(await pathExists(manifestPath))) {
107
- throw new GeneralError('Manifest not found: browser/base/jar.mn');
108
- }
109
- const content = await readText(manifestPath);
110
- return content.includes(`content/browser/${fileName}`);
125
+ return manifestIncludes(engineDir, 'browser/base/jar.mn', [`content/browser/${fileName}`]);
111
126
  }
112
127
  async function isTestManifestRegistered(engineDir, testDir) {
113
- const manifestPath = join(engineDir, 'browser/base/moz.build');
114
- if (!(await pathExists(manifestPath))) {
115
- throw new GeneralError('Manifest not found: browser/base/moz.build');
116
- }
117
- const content = await readText(manifestPath);
118
- return content.includes(`content/test/${testDir}/browser.toml`);
128
+ return manifestIncludes(engineDir, 'browser/base/moz.build', [
129
+ `content/test/${testDir}/browser.toml`,
130
+ ]);
119
131
  }
120
132
  async function isFireForgeModuleRegistered(engineDir, fileName, moduleDir) {
121
- const manifestPath = join(engineDir, moduleDir, 'moz.build');
122
- if (!(await pathExists(manifestPath))) {
123
- throw new GeneralError(`Manifest not found: ${moduleDir}/moz.build`);
124
- }
125
- const content = await readText(manifestPath);
126
- return content.includes(`"${fileName}"`);
133
+ return manifestIncludes(engineDir, `${moduleDir}/moz.build`, [`"${fileName}"`]);
127
134
  }
128
135
  async function isToolkitWidgetRegistered(engineDir, _tagName, fileName) {
129
- const manifestPath = join(engineDir, 'toolkit/content/jar.mn');
130
- if (!(await pathExists(manifestPath))) {
131
- throw new GeneralError('Manifest not found: toolkit/content/jar.mn');
132
- }
133
- const content = await readText(manifestPath);
134
- return content.includes(`content/global/elements/${fileName}`);
136
+ return manifestIncludes(engineDir, 'toolkit/content/jar.mn', [
137
+ `content/global/elements/${fileName}`,
138
+ ]);
135
139
  }
136
140
  /**
137
141
  * Checks if a file path matches any known registrable pattern.
@@ -140,7 +144,7 @@ async function isToolkitWidgetRegistered(engineDir, _tagName, fileName) {
140
144
  * @returns True if the file matches a known registration pattern
141
145
  */
142
146
  export function matchesRegistrablePattern(filePath, binaryName) {
143
- const normalized = filePath.replace(/\\/g, '/');
147
+ const normalized = normalizePathSlashes(filePath);
144
148
  const rules = getRules(binaryName);
145
149
  return rules.some((rule) => rule.pattern.test(normalized));
146
150
  }
@@ -151,7 +155,7 @@ function getUnregistrableAdvice(filePath) {
151
155
  }
152
156
  // `.inc.xhtml` fragments live under browser/base/content/ but are
153
157
  // consumed via `#include` from a registered chrome document (browser.xhtml
154
- // by default; a fork's custom top-level doc when `wire --dom-target` is
158
+ // by default, or a fork's custom top-level doc when `wire --dom-target` is
155
159
  // set). The preprocessor resolves the include at packaging time, so the
156
160
  // fragment never needs its own chrome URI entry in jar.mn. Give the
157
161
  // operator the actionable `wire` path instead of letting the generic
@@ -165,7 +169,7 @@ function getUnregistrableAdvice(filePath) {
165
169
  // xpcshell.toml manifests scaffolded by `furnace create --test-style
166
170
  // xpcshell` or `furnace chrome-doc create --with-tests` live under
167
171
  // `browser/base/content/test/<binary-name>-xpcshell/<component>/`. The
168
- // scaffold intentionally does NOT auto-register — wiring
172
+ // scaffold does not auto-register, because wiring
169
173
  // `XPCSHELL_TESTS_MANIFESTS` requires a deliberate choice about which
170
174
  // moz.build should own the entry. `register` surfaces that same guidance
171
175
  // instead of falling through to browser.toml-centric advice for a path
@@ -197,7 +201,7 @@ export async function isFileRegistered(root, filePath) {
197
201
  const { engine: engineDir } = getProjectPaths(root);
198
202
  const config = await loadConfig(root);
199
203
  const rules = getRules(config.binaryName);
200
- const normalizedPath = filePath.replace(/\\/g, '/');
204
+ const normalizedPath = normalizePathSlashes(filePath);
201
205
  for (const rule of rules) {
202
206
  const match = normalizedPath.match(rule.pattern);
203
207
  if (match) {
@@ -237,7 +241,7 @@ export async function registerFile(root, filePath, dryRun = false, after, option
237
241
  const config = await loadConfig(root);
238
242
  const rules = getRules(config.binaryName, options.createManifest === true);
239
243
  // Normalize path separators
240
- const normalizedPath = filePath.replace(/\\/g, '/');
244
+ const normalizedPath = normalizePathSlashes(filePath);
241
245
  for (const rule of rules) {
242
246
  const match = normalizedPath.match(rule.pattern);
243
247
  if (match) {
@@ -59,7 +59,7 @@ export function tokenizeMozBuildList(lines, listPattern) {
59
59
  if (listPattern.test(raw)) {
60
60
  // Single-line empty-list handling: a fresh scaffold sometimes
61
61
  // writes `EXTRA_JS_MODULES += []` on one line, which a tokenizer
62
- // looking for a line starting with `]` never closes — leaving
62
+ // looking for a line starting with `]` never closes, leaving
63
63
  // `register` with a "Could not find module list section" error
64
64
  // against the documented browser/modules/<fork>/ scaffold.
65
65
  //