@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
@@ -6,7 +6,7 @@
6
6
  * Factored out of `patch-lint.ts` so the per-patch lint body and
7
7
  * cross-patch lint body (in `patch-lint-cross.ts`) can both depend on
8
8
  * the same diff walkers without inducing a circular import. Callers
9
- * should keep importing these through `patch-lint.ts` — this file is
9
+ * should keep importing these through `patch-lint.ts`. This file is
10
10
  * an implementation detail. The actual line-walking lives in
11
11
  * `parseDiffSections` (patch-parse.ts), the codebase's single diff walker.
12
12
  */
@@ -49,8 +49,8 @@ export function extractAddedLinesPerFile(diffContent) {
49
49
  * Extracts 1-based post-patch line numbers of added lines per file from a
50
50
  * unified diff. Walking each hunk with a new-file line counter (`+` and
51
51
  * context lines advance it, `-` lines do not) lets rules that need
52
- * full-file context — e.g. comment masking across the context/added
53
- * boundary — map the patch's additions onto the applied file.
52
+ * full-file context (e.g. comment masking across the context/added
53
+ * boundary) map the patch's additions onto the applied file.
54
54
  */
55
55
  export function extractAddedLineNumbersPerFile(diffContent) {
56
56
  const result = new Map();
@@ -84,7 +84,7 @@ export function extractAddedLineNumbersPerFile(diffContent) {
84
84
  * `buildPatchQueueContext`.
85
85
  *
86
86
  * Matches buildPatchQueueContext's algorithm exactly: skip paths that are
87
- * created by the diff — those are already covered by the `newFiles` map,
87
+ * created by the diff, since those are already covered by the `newFiles` map,
88
88
  * which carries full content rather than only the added lines.
89
89
  *
90
90
  * @param diff - Unified diff content
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The `file-too-large` thresholds and their rendered message.
3
3
  *
4
- * Its own module for two reasons: the config validator needs the DEFAULTS
4
+ * Its own module for two reasons: the config validator needs the defaults
5
5
  * to validate an override triple against the merged result, and importing
6
6
  * `patch-lint.ts` from `config-validate.ts` for a constant would draw an
7
7
  * import edge (and a cycle) between the rule bodies and config parsing.
@@ -9,9 +9,9 @@
9
9
  * On the vocabulary: the bands were `notice` / `warning` / `error` with the
10
10
  * middle one described as a "soft limit". That description is false under
11
11
  * the posture FireForge itself recommends for a release gate,
12
- * `--max-warnings 0`, where a warning is a hard failure — so a file at 751
12
+ * `--max-warnings 0`, where a warning is a hard failure, so a file at 751
13
13
  * lines failed a gate with a message calling 750 soft. The message below
14
- * says what the band IS (a warning) and what a zero-warning gate does with
14
+ * says what the band is (a warning) and what a zero-warning gate does with
15
15
  * it, and the thresholds are now tunable, so a project whose file-size
16
16
  * policy differs has a dial instead of an argument.
17
17
  */
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * The `file-too-large` thresholds and their rendered message.
4
4
  *
5
- * Its own module for two reasons: the config validator needs the DEFAULTS
5
+ * Its own module for two reasons: the config validator needs the defaults
6
6
  * to validate an override triple against the merged result, and importing
7
7
  * `patch-lint.ts` from `config-validate.ts` for a constant would draw an
8
8
  * import edge (and a cycle) between the rule bodies and config parsing.
@@ -10,9 +10,9 @@
10
10
  * On the vocabulary: the bands were `notice` / `warning` / `error` with the
11
11
  * middle one described as a "soft limit". That description is false under
12
12
  * the posture FireForge itself recommends for a release gate,
13
- * `--max-warnings 0`, where a warning is a hard failure — so a file at 751
13
+ * `--max-warnings 0`, where a warning is a hard failure, so a file at 751
14
14
  * lines failed a gate with a message calling 750 soft. The message below
15
- * says what the band IS (a warning) and what a zero-warning gate does with
15
+ * says what the band is (a warning) and what a zero-warning gate does with
16
16
  * it, and the thresholds are now tunable, so a project whose file-size
17
17
  * policy differs has a dial instead of an argument.
18
18
  */
@@ -44,10 +44,10 @@ export function resolveFileSizeThresholds(overrides, isTest) {
44
44
  export function formatFileTooLargeMessage(args) {
45
45
  const { label, lineCount, thresholds, band, verb } = args;
46
46
  if (band === 'error') {
47
- return `${label} has ${String(lineCount)} lines (error threshold: ${String(thresholds.error)}). Consider ${verb}.`;
47
+ return `${label} has ${lineCount} lines (error threshold: ${thresholds.error}). Consider ${verb}.`;
48
48
  }
49
- return (`${label} has ${String(lineCount)} lines (warning threshold: ${String(thresholds.warning)}, ` +
50
- `error threshold: ${String(thresholds.error)}). Consider ${verb}. ` +
49
+ return (`${label} has ${lineCount} lines (warning threshold: ${thresholds.warning}, ` +
50
+ `error threshold: ${thresholds.error}). Consider ${verb}. ` +
51
51
  `Reported as a ${band}, which a gate running --max-warnings 0 treats as a failure; ` +
52
52
  `tune "patchLint.fileSizeThresholds" if these limits are wrong for this project.`);
53
53
  }
@@ -0,0 +1,58 @@
1
+ import type { PatchLintIssue } from '../types/commands/index.js';
2
+ import type { PatchQueueForwardRegistrationEntry, PatchQueueView } from './patch-lint-queue-types.js';
3
+ /**
4
+ * One `support-files` entry, with the line the patch actually adds it on.
5
+ *
6
+ * The entry alone is not enough for the discharge command the rule prints:
7
+ * `--line` is compared, whitespace-trimmed, against the lines the patch
8
+ * adds, and a synthesised `support-files = ["<entry>"]` only ever matches a
9
+ * manifest whose array is single-line and single-entry. Carrying the source
10
+ * line keeps the remedy and the validation talking about the same text.
11
+ */
12
+ export interface SupportFileEntry {
13
+ /** The entry as written inside the manifest (e.g. `fixtures/*.sqlite`). */
14
+ entry: string;
15
+ /** The first added line, whitespace-trimmed, that spells the entry out. */
16
+ line: string;
17
+ /**
18
+ * How many distinct added lines spell it out. Above one, the printed
19
+ * command quotes the first and says so: one declaration covers the file
20
+ * either way, because the declared check keys on file + creates.
21
+ */
22
+ occurrences: number;
23
+ }
24
+ /**
25
+ * Extracts the `support-files` entries declared in `content`, each paired
26
+ * with the manifest line it is written on.
27
+ *
28
+ * Handles the TOML array on one line and spread over several, and the
29
+ * whitespace-separated `.ini` spelling. Anything else (a computed value, a
30
+ * shape this does not recognise) yields nothing, because a rule that
31
+ * guesses at a manifest it cannot parse refuses correct queues.
32
+ *
33
+ * Quoted tokens are matched per physical line rather than over the whole
34
+ * accumulated array body, so a multi-line array attributes each element to
35
+ * its own line. Entries are deduplicated: a manifest that lists the same
36
+ * file under two per-test sections needs one declaration, not two.
37
+ */
38
+ export declare function extractSupportFileEntries(content: string): SupportFileEntry[];
39
+ /**
40
+ * Resolves one `support-files` entry, relative to its manifest's directory,
41
+ * into a matcher over engine-relative paths.
42
+ *
43
+ * Only a `*` inside a single path segment is expanded, the shape the
44
+ * downstream report uses (`fixtures/*.sqlite`). `**`, `!` exclusions and
45
+ * absolute `/`-rooted entries return undefined: they either cross directory
46
+ * boundaries or subtract, and a matcher that guessed at them would attribute
47
+ * a creation to the wrong manifest.
48
+ */
49
+ export declare function buildSupportFileMatcher(manifestPath: string, entry: string): ((candidate: string) => boolean) | undefined;
50
+ /**
51
+ * Flags every `support-files` registration a patch introduces that names a
52
+ * file only a later-ordered patch creates, unless the staged dependency is
53
+ * declared.
54
+ *
55
+ * @param ctx - Projected queue in application order
56
+ * @returns One issue per undeclared forward registration
57
+ */
58
+ export declare function lintPatchQueueForwardRegistrations(ctx: PatchQueueView<PatchQueueForwardRegistrationEntry>): PatchLintIssue[];
@@ -0,0 +1,210 @@
1
+ // SPDX-License-Identifier: EUPL-1.2
2
+ /**
3
+ * Cross-patch lint rule: a test manifest that registers a file a
4
+ * later-ordered patch creates, without declaring the staged dependency.
5
+ *
6
+ * The import kind has had this arm since forward-import shipped. The
7
+ * registration kind never did. `--kind registration` metadata was only ever
8
+ * checked for staleness once declared, so a patch whose `xpcshell.toml`
9
+ * carried `support-files = ["fixtures/*.sqlite"]` for a fixture the next
10
+ * patch creates passed lint in both arms. Declaring the dependency and
11
+ * removing the declaration produced identical silence, so the gap was
12
+ * invisible rather than merely absent.
13
+ *
14
+ * Scope is narrow on purpose: test-manifest `support-files` only. A
15
+ * jar.mn packaging line or an actor/customElements registration names its
16
+ * target through indirection the linter cannot resolve without the build
17
+ * system, and a rule that guesses there would refuse correct queues on a
18
+ * Firefox-sized tree. The staged-registration declaration remains the
19
+ * documented escape hatch for a deliberate stage.
20
+ */
21
+ import { basename, dirname, posix } from 'node:path';
22
+ import { normalizePathSlashes } from '../utils/paths.js';
23
+ import { escapeRegex } from '../utils/regex.js';
24
+ import { isLaterOwner, quoteRegistrationLine } from './patch-lint-staged-registration.js';
25
+ /**
26
+ * Manifest basenames whose `support-files` key registers auxiliary files
27
+ * for a test suite. Closed and documented on purpose: a pattern like
28
+ * "anything .toml" would sweep in Cargo and taskcluster manifests, whose
29
+ * `support-files`-shaped keys mean something else entirely.
30
+ */
31
+ const TEST_MANIFEST_BASENAMES = new Set([
32
+ 'xpcshell.toml',
33
+ 'xpcshell.ini',
34
+ 'mochitest.toml',
35
+ 'mochitest.ini',
36
+ 'browser.toml',
37
+ 'browser.ini',
38
+ 'chrome.toml',
39
+ 'chrome.ini',
40
+ 'a11y.toml',
41
+ 'a11y.ini',
42
+ ]);
43
+ /** True for a path whose basename is a recognised test manifest. */
44
+ function isTestManifestPath(path) {
45
+ return TEST_MANIFEST_BASENAMES.has(basename(normalizePathSlashes(path)));
46
+ }
47
+ /** Matches the start of a `support-files` assignment. */
48
+ const SUPPORT_FILES_PATTERN = /^\s*support-files\s*=\s*(.*)$/;
49
+ /**
50
+ * Extracts the `support-files` entries declared in `content`, each paired
51
+ * with the manifest line it is written on.
52
+ *
53
+ * Handles the TOML array on one line and spread over several, and the
54
+ * whitespace-separated `.ini` spelling. Anything else (a computed value, a
55
+ * shape this does not recognise) yields nothing, because a rule that
56
+ * guesses at a manifest it cannot parse refuses correct queues.
57
+ *
58
+ * Quoted tokens are matched per physical line rather than over the whole
59
+ * accumulated array body, so a multi-line array attributes each element to
60
+ * its own line. Entries are deduplicated: a manifest that lists the same
61
+ * file under two per-test sections needs one declaration, not two.
62
+ */
63
+ export function extractSupportFileEntries(content) {
64
+ const lines = content.split('\n');
65
+ const order = [];
66
+ const sourceLines = new Map();
67
+ const record = (entry, source) => {
68
+ let seen = sourceLines.get(entry);
69
+ if (seen === undefined) {
70
+ seen = [];
71
+ sourceLines.set(entry, seen);
72
+ order.push(entry);
73
+ }
74
+ const trimmed = source.trim();
75
+ if (!seen.includes(trimmed))
76
+ seen.push(trimmed);
77
+ };
78
+ for (let i = 0; i < lines.length; i++) {
79
+ const raw = lines[i] ?? '';
80
+ const match = SUPPORT_FILES_PATTERN.exec(raw);
81
+ if (!match)
82
+ continue;
83
+ const head = match[1] ?? '';
84
+ if (!head.trimStart().startsWith('[')) {
85
+ // `.ini` spelling: whitespace-separated bare paths on one line.
86
+ for (const token of head.split(/\s+/).filter((t) => t.length > 0))
87
+ record(token, raw);
88
+ continue;
89
+ }
90
+ // TOML array: walk the physical lines until the closing bracket,
91
+ // bounded so an unterminated array in a malformed manifest cannot walk
92
+ // the file.
93
+ let body = head;
94
+ let scanned = 0;
95
+ let current = raw;
96
+ for (;;) {
97
+ for (const quoted of current.matchAll(/["']([^"']+)["']/g)) {
98
+ if (quoted[1] !== undefined)
99
+ record(quoted[1], current);
100
+ }
101
+ if (body.includes(']') || i + 1 >= lines.length || scanned >= 200)
102
+ break;
103
+ i += 1;
104
+ scanned += 1;
105
+ current = lines[i] ?? '';
106
+ body += `\n${current}`;
107
+ }
108
+ }
109
+ return order.map((entry) => {
110
+ const seen = sourceLines.get(entry) ?? [];
111
+ return { entry, line: seen[0] ?? '', occurrences: seen.length };
112
+ });
113
+ }
114
+ /**
115
+ * Resolves one `support-files` entry, relative to its manifest's directory,
116
+ * into a matcher over engine-relative paths.
117
+ *
118
+ * Only a `*` inside a single path segment is expanded, the shape the
119
+ * downstream report uses (`fixtures/*.sqlite`). `**`, `!` exclusions and
120
+ * absolute `/`-rooted entries return undefined: they either cross directory
121
+ * boundaries or subtract, and a matcher that guessed at them would attribute
122
+ * a creation to the wrong manifest.
123
+ */
124
+ export function buildSupportFileMatcher(manifestPath, entry) {
125
+ if (entry.startsWith('!') || entry.includes('**') || entry.startsWith('/'))
126
+ return undefined;
127
+ const resolved = posix.normalize(posix.join(normalizePathSlashes(dirname(manifestPath)), normalizePathSlashes(entry)));
128
+ if (resolved.startsWith('..'))
129
+ return undefined;
130
+ if (!resolved.includes('*')) {
131
+ return (candidate) => normalizePathSlashes(candidate) === resolved;
132
+ }
133
+ const pattern = new RegExp(`^${resolved
134
+ .split('*')
135
+ .map((part) => escapeRegex(part))
136
+ .join('[^/]*')}$`);
137
+ return (candidate) => pattern.test(normalizePathSlashes(candidate));
138
+ }
139
+ /** True when this patch already declares the staged registration. */
140
+ function isDeclared(entry, manifestPath, createdPath) {
141
+ return (entry.metadata?.stagedDependencies?.registrations ?? []).some((registration) => normalizePathSlashes(registration.file) === normalizePathSlashes(manifestPath) &&
142
+ normalizePathSlashes(registration.creates) === normalizePathSlashes(createdPath));
143
+ }
144
+ /**
145
+ * Flags every `support-files` registration a patch introduces that names a
146
+ * file only a later-ordered patch creates, unless the staged dependency is
147
+ * declared.
148
+ *
149
+ * @param ctx - Projected queue in application order
150
+ * @returns One issue per undeclared forward registration
151
+ */
152
+ export function lintPatchQueueForwardRegistrations(ctx) {
153
+ const issues = [];
154
+ for (const entry of ctx.entries) {
155
+ // Both arms: a manifest this patch creates and one it modifies can each
156
+ // introduce a registration line.
157
+ const manifests = [
158
+ ...entry.newFiles,
159
+ ...entry.modifiedFileAdditions,
160
+ ].filter(([path]) => isTestManifestPath(path));
161
+ for (const [manifestPath, content] of manifests) {
162
+ for (const { entry: raw, line: addedLine, occurrences } of extractSupportFileEntries(content)) {
163
+ const matches = buildSupportFileMatcher(manifestPath, raw);
164
+ if (matches === undefined)
165
+ continue;
166
+ // `--line` is the line as the patch adds it, which is what the
167
+ // declared arm compares and what `--remove` matches on. Synthesising
168
+ // `support-files = ["<entry>"]` instead only ever matched a
169
+ // single-line single-entry array, so the pasted command left the
170
+ // declaring patch red with staged-dependency-unused.
171
+ const declaredLine = quoteRegistrationLine(addedLine);
172
+ const ambiguity = occurrences > 1
173
+ ? ` (the entry is spelled out on ${occurrences} added lines here; ` +
174
+ 'the first is quoted, and one declaration covers the file either way ' +
175
+ 'because the declared check keys on --file and --creates.)'
176
+ : '';
177
+ for (const later of ctx.entries) {
178
+ // Same predicate the declared-registration arm validates against,
179
+ // tiebreak included: two spellings of "later" would let one rule
180
+ // flag a pair the other considers already satisfied.
181
+ if (!isLaterOwner(later, entry))
182
+ continue;
183
+ for (const created of later.createdFiles) {
184
+ if (!matches(created))
185
+ continue;
186
+ if (isDeclared(entry, manifestPath, created))
187
+ continue;
188
+ issues.push({
189
+ file: manifestPath,
190
+ check: 'forward-registration',
191
+ patches: [entry.filename],
192
+ fingerprint: `forward-registration|${entry.filename}|${manifestPath}|${raw}|${created}|${later.filename}`,
193
+ message: `${manifestPath} in ${entry.filename} registers "${raw}" as a support file, ` +
194
+ `but ${created} is created by the later patch ${later.filename}. ` +
195
+ 'Applying the queue up to this patch leaves the registration dangling. ' +
196
+ 'Reorder the patches so the file is created first, move the registration into ' +
197
+ 'the later patch, or declare the intentional staged dependency with: ' +
198
+ `fireforge patch staged-dependency ${entry.filename} --add --kind registration ` +
199
+ `--file ${manifestPath} --line "${declaredLine}" ` +
200
+ `--creates ${created} --owner ${later.filename}` +
201
+ ambiguity,
202
+ severity: 'error',
203
+ });
204
+ }
205
+ }
206
+ }
207
+ }
208
+ }
209
+ return issues;
210
+ }
@@ -28,7 +28,7 @@ export interface ValidateExportJsDocOptions {
28
28
  * Validates a top-level function declaration: requires an attached JSDoc
29
29
  * comment, then checks @param name matching and @returns presence. Exported
30
30
  * so the chrome-subscript validator (`patch-lint-chrome-jsdoc.ts`) can reuse
31
- * it on `parseScript`-produced declarations — the rule shape is identical
31
+ * it on `parseScript`-produced declarations. The rule shape is identical
32
32
  * between ES-module exports and chrome-subscript top-level declarations.
33
33
  *
34
34
  * @param fn - FunctionDeclaration AST node
@@ -54,7 +54,7 @@ export declare function validateClassDecl(cls: AcornESTreeNode<ClassDeclaration>
54
54
  * 3. methods whose JSDoc carries `@private` or `@internal`
55
55
  *
56
56
  * A pure-override skip (`super.method(...args)`-only bodies bypassing the
57
- * return-tag check) is deliberately not implemented; the rule stays simple.
57
+ * return-tag check) is deliberately not implemented. The rule stays simple.
58
58
  */
59
59
  export declare function validateClassMethods(cls: AcornESTreeNode<ClassDeclaration>, comments: acorn.Comment[], source: string, severity: 'warning' | 'error'): JsDocIssue[];
60
60
  /**
@@ -46,8 +46,8 @@ function findAttachedJsDoc(comments, declStart, source) {
46
46
  * loses the param name. String literal types may contain braces too, so
47
47
  * quoted runs are skipped verbatim.
48
48
  *
49
- * @returns Index just past the matching close brace, or -1 when the type
50
- * expression never closes (malformed doc — caller skips the tag).
49
+ * @returns Index just past the matching close brace, or undefined when the
50
+ * type expression never closes (malformed doc, caller skips the tag).
51
51
  */
52
52
  function skipBalancedTypeBraces(jsDoc, start) {
53
53
  let depth = 0;
@@ -73,7 +73,7 @@ function skipBalancedTypeBraces(jsDoc, start) {
73
73
  return i + 1;
74
74
  }
75
75
  }
76
- return -1;
76
+ return undefined;
77
77
  }
78
78
  function extractParamNames(jsDoc) {
79
79
  const names = [];
@@ -83,11 +83,11 @@ function extractParamNames(jsDoc) {
83
83
  let i = m.index + m[0].length;
84
84
  while (i < jsDoc.length && /\s/.test(jsDoc[i] ?? ''))
85
85
  i++;
86
- // Optional `{type}` expression — depth-aware so nested braces inside
86
+ // Optional `{type}` expression, depth-aware so nested braces inside
87
87
  // inline object types or Record<…> generics don't truncate the scan.
88
88
  if (jsDoc[i] === '{') {
89
89
  const afterType = skipBalancedTypeBraces(jsDoc, i);
90
- if (afterType === -1)
90
+ if (afterType === undefined)
91
91
  continue;
92
92
  i = afterType;
93
93
  while (i < jsDoc.length && /\s/.test(jsDoc[i] ?? ''))
@@ -124,6 +124,17 @@ function hasPrivateOrInternalTag(jsDoc) {
124
124
  function functionReturnsValue(node) {
125
125
  return walkForReturn(node.body);
126
126
  }
127
+ /**
128
+ * Narrows an arbitrary child value reached by walking a node's own
129
+ * properties to an ESTree node. Acorn's AST holds nodes, arrays of nodes,
130
+ * and plain scalars in the same property positions, so the discriminating
131
+ * `type` string is the only structural signal available.
132
+ */
133
+ function isEstreeNode(value) {
134
+ if (typeof value !== 'object' || value === null || !('type' in value))
135
+ return false;
136
+ return typeof value.type === 'string';
137
+ }
127
138
  function walkForReturn(node) {
128
139
  if (node.type === 'ReturnStatement') {
129
140
  return node.argument != null;
@@ -133,26 +144,22 @@ function walkForReturn(node) {
133
144
  node.type === 'ArrowFunctionExpression') {
134
145
  return false;
135
146
  }
136
- // `entries` erases the node's static shape without asserting a new one;
137
- // the `any` from `Object.entries`' fallback overload widens to `unknown`.
147
+ // `entries` erases the node's static shape without asserting a new one.
148
+ // The `any` from `Object.entries`' fallback overload widens to `unknown`.
138
149
  const entries = Object.entries(node);
139
150
  for (const [key, val] of entries) {
140
151
  if (key === 'type')
141
152
  continue;
142
- if (val && typeof val === 'object') {
143
- if (Array.isArray(val)) {
144
- for (const child of val) {
145
- if (child && typeof child === 'object' && 'type' in child) {
146
- if (walkForReturn(child))
147
- return true;
148
- }
149
- }
150
- }
151
- else if ('type' in val) {
152
- if (walkForReturn(val))
153
+ if (Array.isArray(val)) {
154
+ const children = val;
155
+ for (const child of children) {
156
+ if (isEstreeNode(child) && walkForReturn(child))
153
157
  return true;
154
158
  }
155
159
  }
160
+ else if (isEstreeNode(val) && walkForReturn(val)) {
161
+ return true;
162
+ }
156
163
  }
157
164
  return false;
158
165
  }
@@ -183,12 +190,7 @@ function findLocalDeclaration(body, name) {
183
190
  // Line number helpers
184
191
  // ---------------------------------------------------------------------------
185
192
  function lineAt(source, offset) {
186
- let line = 1;
187
- for (let i = 0; i < offset && i < source.length; i++) {
188
- if (source[i] === '\n')
189
- line++;
190
- }
191
- return line;
193
+ return source.slice(0, offset).split('\n').length;
192
194
  }
193
195
  /**
194
196
  * Validates @param name matching and @returns presence on a function-like
@@ -198,21 +200,19 @@ function lineAt(source, offset) {
198
200
  */
199
201
  function validateParamsAndReturns(fnNode, jsDoc, issues, ctx) {
200
202
  const docText = jsDoc.value;
201
- if (!ctx.skipParams) {
202
- const actualParams = fnNode.params
203
- .map((p) => (p.type === 'Identifier' ? p.name : null))
204
- .filter((n) => n !== null);
205
- if (actualParams.length > 0) {
206
- const docParams = extractParamNames(docText);
207
- for (const param of actualParams) {
208
- if (!docParams.includes(param)) {
209
- issues.push({
210
- line: ctx.line,
211
- check: ctx.paramCheck,
212
- message: `Exported ${ctx.label} at line ${ctx.line}: @param "${param}" is missing or misnamed in JSDoc.`,
213
- ...(ctx.severity ? { severity: ctx.severity } : {}),
214
- });
215
- }
203
+ const actualParams = fnNode.params
204
+ .map((p) => (p.type === 'Identifier' ? p.name : null))
205
+ .filter((n) => n !== null);
206
+ if (actualParams.length > 0) {
207
+ const docParams = extractParamNames(docText);
208
+ for (const param of actualParams) {
209
+ if (!docParams.includes(param)) {
210
+ issues.push({
211
+ line: ctx.line,
212
+ check: ctx.paramCheck,
213
+ message: `Exported ${ctx.label} at line ${ctx.line}: @param "${param}" is missing or misnamed in JSDoc.`,
214
+ ...(ctx.severity ? { severity: ctx.severity } : {}),
215
+ });
216
216
  }
217
217
  }
218
218
  }
@@ -232,7 +232,7 @@ function validateParamsAndReturns(fnNode, jsDoc, issues, ctx) {
232
232
  * Validates a top-level function declaration: requires an attached JSDoc
233
233
  * comment, then checks @param name matching and @returns presence. Exported
234
234
  * so the chrome-subscript validator (`patch-lint-chrome-jsdoc.ts`) can reuse
235
- * it on `parseScript`-produced declarations — the rule shape is identical
235
+ * it on `parseScript`-produced declarations. The rule shape is identical
236
236
  * between ES-module exports and chrome-subscript top-level declarations.
237
237
  *
238
238
  * @param fn - FunctionDeclaration AST node
@@ -290,7 +290,7 @@ function validateVariableDecl(varDecl, comments, source, lookupStart) {
290
290
  const start = lookupStart !== undefined ? lookupStart : varDecl.start;
291
291
  const jsDoc = findAttachedJsDoc(comments, start, source);
292
292
  if (jsDoc)
293
- return issues; // has a JSDoc block — sufficient for constants
293
+ return issues; // has a JSDoc block, sufficient for constants
294
294
  for (const decl of varDecl.declarations) {
295
295
  const name = decl.id.type === 'Identifier' ? decl.id.name : '<destructured>';
296
296
  const line = lineAt(source, start);
@@ -340,7 +340,7 @@ function classMethodLabel(className, method, name) {
340
340
  * 3. methods whose JSDoc carries `@private` or `@internal`
341
341
  *
342
342
  * A pure-override skip (`super.method(...args)`-only bodies bypassing the
343
- * return-tag check) is deliberately not implemented; the rule stays simple.
343
+ * return-tag check) is deliberately not implemented. The rule stays simple.
344
344
  */
345
345
  export function validateClassMethods(cls, comments, source, severity) {
346
346
  const issues = [];
@@ -374,7 +374,7 @@ export function validateClassMethods(cls, comments, source, severity) {
374
374
  continue;
375
375
  }
376
376
  if (method.kind === 'get') {
377
- // Presence already verified; getter expression is the contract.
377
+ // Presence already verified. The getter expression is the contract.
378
378
  continue;
379
379
  }
380
380
  const skipReturns = method.kind === 'constructor' || method.kind === 'set';
@@ -407,7 +407,7 @@ export function validateExportJsDoc(source, options) {
407
407
  ast = parseModule(source, comments);
408
408
  }
409
409
  catch (error) {
410
- // An unparseable source is NOT a clean file. Returning `[]` here was the
410
+ // An unparseable source is not a clean file. Returning `[]` here was the
411
411
  // same value as "fully documented", so a syntax error silently cleared
412
412
  // every rule this module enforces. Report it instead.
413
413
  return [
@@ -424,7 +424,7 @@ export function validateExportJsDoc(source, options) {
424
424
  if (node.type !== 'ExportNamedDeclaration')
425
425
  continue;
426
426
  const exportNode = node;
427
- // Case 1: inline export declaration — JSDoc attaches to `export`
427
+ // Case 1: inline export declaration, JSDoc attaches to `export`
428
428
  if (exportNode.declaration) {
429
429
  const decl = exportNode.declaration;
430
430
  const exportStart = exportNode.start;
@@ -442,7 +442,7 @@ export function validateExportJsDoc(source, options) {
442
442
  }
443
443
  continue;
444
444
  }
445
- // Case 2: `export { foo, Bar }` — resolve back to local declarations
445
+ // Case 2: `export { foo, Bar }`, resolve back to local declarations
446
446
  if (exportNode.specifiers.length > 0 && !exportNode.source) {
447
447
  for (const spec of exportNode.specifiers) {
448
448
  const local = spec.local;
@@ -1,12 +1,6 @@
1
1
  import type { PatchLintIssue } from '../types/commands/index.js';
2
- interface ModuleRegistrationQueueEntry {
3
- filename: string;
4
- newFiles: ReadonlyMap<string, string>;
5
- modifiedFileAdditions: ReadonlyMap<string, string>;
6
- }
7
- interface ModuleRegistrationQueueContext {
8
- entries: readonly ModuleRegistrationQueueEntry[];
9
- }
2
+ import type { PatchQueueRegistrationEntry, PatchQueueView } from './patch-lint-queue-types.js';
3
+ type ModuleRegistrationQueueContext = PatchQueueView<PatchQueueRegistrationEntry>;
10
4
  /**
11
5
  * Maps Firefox's common system-module resource URLs to their source
12
6
  * suffix. Exported alongside {@link extractResourceModuleSpecifiers} so
@@ -16,7 +10,7 @@ export declare function moduleSourceSuffix(specifier: string): string | undefine
16
10
  /**
17
11
  * Resource-module strings in actual code (comments removed), de-duplicated.
18
12
  * Exported for the engine-aware resolution preflight, which must recognise
19
- * exactly the same specifier shapes this queue-level rule does — two
13
+ * exactly the same specifier shapes this queue-level rule does. Two
20
14
  * extractors would drift.
21
15
  */
22
16
  export declare function extractResourceModuleSpecifiers(content: string): string[];
@@ -21,7 +21,7 @@ export function moduleSourceSuffix(specifier) {
21
21
  /**
22
22
  * Resource-module strings in actual code (comments removed), de-duplicated.
23
23
  * Exported for the engine-aware resolution preflight, which must recognise
24
- * exactly the same specifier shapes this queue-level rule does — two
24
+ * exactly the same specifier shapes this queue-level rule does. Two
25
25
  * extractors would drift.
26
26
  */
27
27
  export function extractResourceModuleSpecifiers(content) {
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * mozbuild enforces alphabetical ordering on `StrictOrderingOnAppendList`
5
5
  * variables and raises `mozbuild.util.UnsortedError: … expected "X" but got
6
- * "Y"` — but only at CONFIGURE time, i.e. minutes into a `fireforge build`
6
+ * "Y"`, but only at configure time, i.e. minutes into a `fireforge build`
7
7
  * or `fireforge test --build` dispatch. This check reads the patched
8
8
  * `moz.build` files from the engine tree (the working tree carries the
9
9
  * applied patch state, same as every other per-patch rule) and reports the