@hominis/fireforge 0.43.0 → 0.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/README.md +10 -1
  3. package/dist/bin/fireforge.d.ts +4 -9
  4. package/dist/bin/fireforge.js +42 -40
  5. package/dist/build-info.json +4 -4
  6. package/dist/src/cli.js +74 -8
  7. package/dist/src/commands/bootstrap.js +17 -20
  8. package/dist/src/commands/build.js +25 -32
  9. package/dist/src/commands/config.js +34 -41
  10. package/dist/src/commands/discard.js +8 -9
  11. package/dist/src/commands/doctor-check-core.d.ts +4 -18
  12. package/dist/src/commands/doctor-check-core.js +8 -35
  13. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  14. package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
  15. package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
  16. package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
  17. package/dist/src/commands/doctor-furnace-jar.js +7 -9
  18. package/dist/src/commands/doctor-furnace.js +21 -24
  19. package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
  20. package/dist/src/commands/doctor-orphaned-harness.js +18 -44
  21. package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
  22. package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
  23. package/dist/src/commands/doctor-working-tree.d.ts +10 -12
  24. package/dist/src/commands/doctor-working-tree.js +11 -18
  25. package/dist/src/commands/doctor.js +35 -53
  26. package/dist/src/commands/download.js +32 -48
  27. package/dist/src/commands/export-all.js +29 -33
  28. package/dist/src/commands/export-flow.js +6 -6
  29. package/dist/src/commands/export-placement-conflicts.js +10 -9
  30. package/dist/src/commands/export-placement-gate.js +5 -5
  31. package/dist/src/commands/export-shared.d.ts +30 -33
  32. package/dist/src/commands/export-shared.js +45 -43
  33. package/dist/src/commands/export.js +21 -27
  34. package/dist/src/commands/furnace/apply.js +14 -23
  35. package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
  36. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
  37. package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
  38. package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
  39. package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
  40. package/dist/src/commands/furnace/chrome-doc.js +31 -41
  41. package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
  42. package/dist/src/commands/furnace/create-browser-test.js +8 -8
  43. package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
  44. package/dist/src/commands/furnace/create-mochikit.js +8 -9
  45. package/dist/src/commands/furnace/create-readback.d.ts +12 -13
  46. package/dist/src/commands/furnace/create-readback.js +12 -13
  47. package/dist/src/commands/furnace/create-templates.d.ts +22 -28
  48. package/dist/src/commands/furnace/create-templates.js +35 -30
  49. package/dist/src/commands/furnace/create-xpcshell.js +2 -2
  50. package/dist/src/commands/furnace/create.js +33 -23
  51. package/dist/src/commands/furnace/deploy.js +16 -24
  52. package/dist/src/commands/furnace/diff.js +9 -9
  53. package/dist/src/commands/furnace/init.js +33 -36
  54. package/dist/src/commands/furnace/override.js +23 -25
  55. package/dist/src/commands/furnace/preview.js +47 -67
  56. package/dist/src/commands/furnace/refresh.js +12 -16
  57. package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
  58. package/dist/src/commands/furnace/remove-mutations.js +9 -16
  59. package/dist/src/commands/furnace/remove-state.js +1 -1
  60. package/dist/src/commands/furnace/remove.js +33 -38
  61. package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
  62. package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
  63. package/dist/src/commands/furnace/rename.js +59 -69
  64. package/dist/src/commands/furnace/scan.js +19 -33
  65. package/dist/src/commands/furnace/status.js +12 -9
  66. package/dist/src/commands/furnace/sync.js +9 -16
  67. package/dist/src/commands/furnace/validate.js +20 -20
  68. package/dist/src/commands/import.js +42 -35
  69. package/dist/src/commands/lint-per-patch.js +15 -10
  70. package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
  71. package/dist/src/commands/lint-per-run-checkjs.js +13 -13
  72. package/dist/src/commands/lint-report.js +6 -7
  73. package/dist/src/commands/lint.d.ts +15 -16
  74. package/dist/src/commands/lint.js +86 -102
  75. package/dist/src/commands/package.js +6 -11
  76. package/dist/src/commands/patch/compact.js +1 -1
  77. package/dist/src/commands/patch/delete.js +24 -33
  78. package/dist/src/commands/patch/index.d.ts +5 -6
  79. package/dist/src/commands/patch/index.js +10 -12
  80. package/dist/src/commands/patch/lint-ignore.js +14 -13
  81. package/dist/src/commands/patch/move-files-create.d.ts +6 -6
  82. package/dist/src/commands/patch/move-files-create.js +8 -8
  83. package/dist/src/commands/patch/move-files-into.d.ts +6 -6
  84. package/dist/src/commands/patch/move-files-into.js +8 -8
  85. package/dist/src/commands/patch/patch-context.d.ts +2 -3
  86. package/dist/src/commands/patch/patch-context.js +2 -3
  87. package/dist/src/commands/patch/rename.d.ts +10 -11
  88. package/dist/src/commands/patch/rename.js +11 -12
  89. package/dist/src/commands/patch/reorder.js +8 -9
  90. package/dist/src/commands/patch/split-plan.js +1 -1
  91. package/dist/src/commands/patch/split.d.ts +8 -10
  92. package/dist/src/commands/patch/split.js +9 -11
  93. package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
  94. package/dist/src/commands/patch/staged-dependency.js +7 -3
  95. package/dist/src/commands/patch/tier.d.ts +9 -9
  96. package/dist/src/commands/patch/tier.js +18 -15
  97. package/dist/src/commands/re-export-adjacent.js +9 -8
  98. package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
  99. package/dist/src/commands/re-export-bulk-scan.js +22 -21
  100. package/dist/src/commands/re-export-drift.js +10 -10
  101. package/dist/src/commands/re-export-files.d.ts +6 -7
  102. package/dist/src/commands/re-export-files.js +34 -44
  103. package/dist/src/commands/re-export-lint.d.ts +10 -13
  104. package/dist/src/commands/re-export-lint.js +16 -14
  105. package/dist/src/commands/re-export-options.d.ts +6 -6
  106. package/dist/src/commands/re-export-options.js +6 -6
  107. package/dist/src/commands/re-export-register.d.ts +4 -10
  108. package/dist/src/commands/re-export-register.js +5 -11
  109. package/dist/src/commands/re-export-scan.js +1 -1
  110. package/dist/src/commands/re-export-single.d.ts +3 -3
  111. package/dist/src/commands/re-export-single.js +33 -25
  112. package/dist/src/commands/re-export.js +13 -21
  113. package/dist/src/commands/rebase/abort.js +3 -3
  114. package/dist/src/commands/rebase/confirm.js +2 -1
  115. package/dist/src/commands/rebase/continue.d.ts +1 -1
  116. package/dist/src/commands/rebase/continue.js +14 -9
  117. package/dist/src/commands/rebase/index.js +11 -11
  118. package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
  119. package/dist/src/commands/rebase/patch-loop.js +60 -39
  120. package/dist/src/commands/rebase/summary.js +1 -1
  121. package/dist/src/commands/register.js +5 -7
  122. package/dist/src/commands/reset.js +2 -1
  123. package/dist/src/commands/resolve.d.ts +16 -13
  124. package/dist/src/commands/resolve.js +30 -33
  125. package/dist/src/commands/run.js +33 -35
  126. package/dist/src/commands/setup-support.js +15 -19
  127. package/dist/src/commands/setup.js +13 -9
  128. package/dist/src/commands/status-check.d.ts +6 -6
  129. package/dist/src/commands/status-json.d.ts +6 -6
  130. package/dist/src/commands/status-json.js +5 -0
  131. package/dist/src/commands/status-output.d.ts +5 -5
  132. package/dist/src/commands/status-output.js +6 -6
  133. package/dist/src/commands/status-ownership.d.ts +16 -14
  134. package/dist/src/commands/status-ownership.js +16 -14
  135. package/dist/src/commands/status.js +42 -34
  136. package/dist/src/commands/test-build-phase.js +26 -13
  137. package/dist/src/commands/test-diagnose.js +44 -44
  138. package/dist/src/commands/test-register.js +1 -0
  139. package/dist/src/commands/test-run.d.ts +14 -16
  140. package/dist/src/commands/test-run.js +21 -13
  141. package/dist/src/commands/test-stale-gate.d.ts +15 -16
  142. package/dist/src/commands/test-stale-gate.js +15 -16
  143. package/dist/src/commands/test-verdict.d.ts +20 -3
  144. package/dist/src/commands/test-verdict.js +30 -0
  145. package/dist/src/commands/test.js +83 -76
  146. package/dist/src/commands/token-coverage.js +3 -4
  147. package/dist/src/commands/token.js +16 -18
  148. package/dist/src/commands/tree.js +47 -31
  149. package/dist/src/commands/typecheck.d.ts +10 -12
  150. package/dist/src/commands/typecheck.js +24 -27
  151. package/dist/src/commands/verify.js +13 -15
  152. package/dist/src/commands/watch.js +21 -23
  153. package/dist/src/commands/wire.js +52 -62
  154. package/dist/src/core/ast-utils.d.ts +8 -7
  155. package/dist/src/core/ast-utils.js +8 -7
  156. package/dist/src/core/branding.d.ts +9 -14
  157. package/dist/src/core/branding.js +7 -11
  158. package/dist/src/core/browser-wire.d.ts +1 -1
  159. package/dist/src/core/browser-wire.js +14 -19
  160. package/dist/src/core/build-audit-platform.js +25 -33
  161. package/dist/src/core/build-audit-registration.js +17 -25
  162. package/dist/src/core/build-audit-resolve.d.ts +15 -17
  163. package/dist/src/core/build-audit-resolve.js +27 -33
  164. package/dist/src/core/build-audit-transforms.js +18 -19
  165. package/dist/src/core/build-audit.js +28 -42
  166. package/dist/src/core/build-baseline-types.d.ts +29 -35
  167. package/dist/src/core/build-baseline.d.ts +5 -4
  168. package/dist/src/core/build-baseline.js +14 -14
  169. package/dist/src/core/build-overwrite-guard.d.ts +7 -14
  170. package/dist/src/core/build-overwrite-guard.js +62 -19
  171. package/dist/src/core/build-prepare.d.ts +2 -2
  172. package/dist/src/core/build-prepare.js +8 -9
  173. package/dist/src/core/config-state.js +12 -4
  174. package/dist/src/core/config-validate.js +8 -5
  175. package/dist/src/core/config.d.ts +5 -8
  176. package/dist/src/core/config.js +7 -16
  177. package/dist/src/core/coverage-extend.d.ts +15 -13
  178. package/dist/src/core/coverage-extend.js +15 -13
  179. package/dist/src/core/destructive.d.ts +31 -9
  180. package/dist/src/core/destructive.js +29 -26
  181. package/dist/src/core/diff-hunks.js +10 -12
  182. package/dist/src/core/discard-baseline.d.ts +8 -8
  183. package/dist/src/core/discard-baseline.js +16 -15
  184. package/dist/src/core/display-state.d.ts +12 -14
  185. package/dist/src/core/display-state.js +12 -14
  186. package/dist/src/core/engine-changes.d.ts +2 -4
  187. package/dist/src/core/engine-changes.js +2 -4
  188. package/dist/src/core/engine-precondition.d.ts +28 -13
  189. package/dist/src/core/engine-precondition.js +25 -10
  190. package/dist/src/core/engine-session-lock.d.ts +47 -21
  191. package/dist/src/core/engine-session-lock.js +168 -33
  192. package/dist/src/core/export-moved-code-shape.d.ts +10 -10
  193. package/dist/src/core/export-moved-code-shape.js +10 -10
  194. package/dist/src/core/file-lock.d.ts +62 -5
  195. package/dist/src/core/file-lock.js +196 -59
  196. package/dist/src/core/firefox-cache.js +1 -3
  197. package/dist/src/core/firefox-extract.js +10 -14
  198. package/dist/src/core/firefox.d.ts +7 -5
  199. package/dist/src/core/firefox.js +4 -5
  200. package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
  201. package/dist/src/core/furnace-apply-dry-run.js +3 -2
  202. package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
  203. package/dist/src/core/furnace-apply-ftl.js +12 -12
  204. package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
  205. package/dist/src/core/furnace-apply-helpers.js +19 -16
  206. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
  207. package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
  208. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
  209. package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
  210. package/dist/src/core/furnace-apply.d.ts +5 -8
  211. package/dist/src/core/furnace-apply.js +19 -24
  212. package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
  213. package/dist/src/core/furnace-checksum-utils.js +16 -0
  214. package/dist/src/core/furnace-config.d.ts +21 -30
  215. package/dist/src/core/furnace-config.js +32 -54
  216. package/dist/src/core/furnace-constants.d.ts +8 -0
  217. package/dist/src/core/furnace-constants.js +10 -2
  218. package/dist/src/core/furnace-css-fragments.d.ts +5 -5
  219. package/dist/src/core/furnace-css-fragments.js +5 -5
  220. package/dist/src/core/furnace-jsconfig.d.ts +11 -12
  221. package/dist/src/core/furnace-jsconfig.js +11 -12
  222. package/dist/src/core/furnace-marker.d.ts +7 -8
  223. package/dist/src/core/furnace-marker.js +7 -8
  224. package/dist/src/core/furnace-operation.d.ts +31 -0
  225. package/dist/src/core/furnace-operation.js +54 -17
  226. package/dist/src/core/furnace-precondition.d.ts +61 -0
  227. package/dist/src/core/furnace-precondition.js +67 -0
  228. package/dist/src/core/furnace-registration-remove.d.ts +5 -6
  229. package/dist/src/core/furnace-registration-remove.js +6 -7
  230. package/dist/src/core/furnace-registration-validate.d.ts +13 -0
  231. package/dist/src/core/furnace-registration-validate.js +20 -1
  232. package/dist/src/core/furnace-registration.d.ts +5 -6
  233. package/dist/src/core/furnace-registration.js +10 -12
  234. package/dist/src/core/furnace-rollback.js +7 -7
  235. package/dist/src/core/furnace-scanner.d.ts +1 -0
  236. package/dist/src/core/furnace-scanner.js +1 -2
  237. package/dist/src/core/furnace-stale-export.d.ts +10 -10
  238. package/dist/src/core/furnace-stale-export.js +10 -10
  239. package/dist/src/core/furnace-state-persist.d.ts +6 -8
  240. package/dist/src/core/furnace-state-persist.js +6 -8
  241. package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
  242. package/dist/src/core/furnace-validate-accessibility.js +310 -1
  243. package/dist/src/core/furnace-validate-compatibility.js +141 -1
  244. package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
  245. package/dist/src/core/furnace-validate-helpers.js +0 -491
  246. package/dist/src/core/furnace-validate-registration.d.ts +7 -0
  247. package/dist/src/core/furnace-validate-registration.js +115 -41
  248. package/dist/src/core/furnace-validate.d.ts +16 -0
  249. package/dist/src/core/furnace-validate.js +188 -145
  250. package/dist/src/core/furnace-version-drift.d.ts +10 -11
  251. package/dist/src/core/furnace-version-drift.js +10 -11
  252. package/dist/src/core/git-base.d.ts +7 -9
  253. package/dist/src/core/git-base.js +7 -9
  254. package/dist/src/core/git-diff.d.ts +20 -9
  255. package/dist/src/core/git-diff.js +148 -63
  256. package/dist/src/core/git-file-ops.d.ts +19 -19
  257. package/dist/src/core/git-file-ops.js +19 -19
  258. package/dist/src/core/git-readonly-index.d.ts +53 -19
  259. package/dist/src/core/git-readonly-index.js +75 -31
  260. package/dist/src/core/git-status.d.ts +5 -6
  261. package/dist/src/core/git-status.js +5 -6
  262. package/dist/src/core/git.d.ts +9 -10
  263. package/dist/src/core/git.js +54 -70
  264. package/dist/src/core/license-headers.d.ts +17 -23
  265. package/dist/src/core/license-headers.js +17 -23
  266. package/dist/src/core/mach-build-artifacts.d.ts +9 -9
  267. package/dist/src/core/mach-build-artifacts.js +57 -19
  268. package/dist/src/core/mach-error-hints.js +42 -29
  269. package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
  270. package/dist/src/core/mach-known-noise-filter.js +18 -20
  271. package/dist/src/core/mach-mozconfig.d.ts +14 -0
  272. package/dist/src/core/mach-mozconfig.js +30 -0
  273. package/dist/src/core/mach-resource-shim.d.ts +43 -58
  274. package/dist/src/core/mach-resource-shim.js +50 -67
  275. package/dist/src/core/mach.d.ts +37 -41
  276. package/dist/src/core/mach.js +50 -51
  277. package/dist/src/core/marionette-port.d.ts +36 -1
  278. package/dist/src/core/marionette-port.js +96 -31
  279. package/dist/src/core/marionette-preflight.d.ts +8 -12
  280. package/dist/src/core/marionette-preflight.js +86 -52
  281. package/dist/src/core/mochitest-server-port.d.ts +42 -0
  282. package/dist/src/core/mochitest-server-port.js +119 -0
  283. package/dist/src/core/module-resolution-preflight.d.ts +9 -11
  284. package/dist/src/core/module-resolution-preflight.js +9 -11
  285. package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
  286. package/dist/src/core/moz-manifest-helpers.js +163 -0
  287. package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
  288. package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
  289. package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
  290. package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
  291. package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
  292. package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
  293. package/dist/src/core/ownership-table.d.ts +14 -16
  294. package/dist/src/core/ownership-table.js +14 -16
  295. package/dist/src/core/parser-fallback.d.ts +15 -1
  296. package/dist/src/core/parser-fallback.js +22 -3
  297. package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
  298. package/dist/src/core/patch-apply-fuzz.js +15 -18
  299. package/dist/src/core/patch-apply.d.ts +13 -34
  300. package/dist/src/core/patch-apply.js +16 -76
  301. package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
  302. package/dist/src/core/patch-artifact-normalize.js +13 -15
  303. package/dist/src/core/patch-export-metadata.d.ts +12 -2
  304. package/dist/src/core/patch-export-metadata.js +13 -4
  305. package/dist/src/core/patch-export-update.d.ts +13 -1
  306. package/dist/src/core/patch-export-update.js +25 -8
  307. package/dist/src/core/patch-export.d.ts +15 -8
  308. package/dist/src/core/patch-export.js +10 -11
  309. package/dist/src/core/patch-files.d.ts +5 -6
  310. package/dist/src/core/patch-files.js +5 -6
  311. package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
  312. package/dist/src/core/patch-identifier-suggest.js +14 -19
  313. package/dist/src/core/patch-lint-binary.d.ts +51 -0
  314. package/dist/src/core/patch-lint-binary.js +39 -0
  315. package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
  316. package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
  317. package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
  318. package/dist/src/core/patch-lint-checkjs.js +16 -16
  319. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
  320. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
  321. package/dist/src/core/patch-lint-creators.d.ts +8 -8
  322. package/dist/src/core/patch-lint-creators.js +8 -8
  323. package/dist/src/core/patch-lint-cross.d.ts +17 -20
  324. package/dist/src/core/patch-lint-cross.js +16 -16
  325. package/dist/src/core/patch-lint-css.d.ts +3 -5
  326. package/dist/src/core/patch-lint-css.js +17 -22
  327. package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
  328. package/dist/src/core/patch-lint-diff-tag.js +14 -16
  329. package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
  330. package/dist/src/core/patch-lint-jsdoc.js +26 -19
  331. package/dist/src/core/patch-lint-mozbuild.js +20 -20
  332. package/dist/src/core/patch-lint-observer.d.ts +7 -7
  333. package/dist/src/core/patch-lint-observer.js +7 -7
  334. package/dist/src/core/patch-lint.d.ts +38 -29
  335. package/dist/src/core/patch-lint.js +89 -121
  336. package/dist/src/core/patch-lock.d.ts +1 -1
  337. package/dist/src/core/patch-lock.js +45 -9
  338. package/dist/src/core/patch-manifest-consistency.d.ts +2 -1
  339. package/dist/src/core/patch-manifest-consistency.js +25 -27
  340. package/dist/src/core/patch-manifest-io.js +14 -18
  341. package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
  342. package/dist/src/core/patch-manifest-resolve.js +9 -12
  343. package/dist/src/core/patch-manifest-validate.d.ts +6 -1
  344. package/dist/src/core/patch-manifest-validate.js +25 -13
  345. package/dist/src/core/patch-parse.d.ts +24 -13
  346. package/dist/src/core/patch-parse.js +19 -14
  347. package/dist/src/core/patch-policy.d.ts +2 -2
  348. package/dist/src/core/patch-policy.js +2 -2
  349. package/dist/src/core/patch-registration-refs.d.ts +7 -8
  350. package/dist/src/core/patch-registration-refs.js +9 -9
  351. package/dist/src/core/process-cpu-time.d.ts +12 -0
  352. package/dist/src/core/process-cpu-time.js +52 -0
  353. package/dist/src/core/rebase-session.d.ts +38 -26
  354. package/dist/src/core/rebase-session.js +55 -28
  355. package/dist/src/core/register-browser-content.js +9 -74
  356. package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
  357. package/dist/src/core/register-module.js +10 -43
  358. package/dist/src/core/register-scaffold.d.ts +8 -8
  359. package/dist/src/core/register-scaffold.js +10 -10
  360. package/dist/src/core/register-shared-css.d.ts +9 -12
  361. package/dist/src/core/register-shared-css.js +17 -87
  362. package/dist/src/core/register-xpcshell-test.d.ts +6 -7
  363. package/dist/src/core/register-xpcshell-test.js +7 -8
  364. package/dist/src/core/shared-ftl.js +12 -4
  365. package/dist/src/core/state-file.d.ts +45 -0
  366. package/dist/src/core/state-file.js +34 -0
  367. package/dist/src/core/status-binary.d.ts +18 -11
  368. package/dist/src/core/status-binary.js +19 -12
  369. package/dist/src/core/status-classify.d.ts +30 -36
  370. package/dist/src/core/status-classify.js +21 -26
  371. package/dist/src/core/test-changed-prefs.d.ts +30 -0
  372. package/dist/src/core/test-changed-prefs.js +78 -0
  373. package/dist/src/core/test-harness-crash.d.ts +25 -63
  374. package/dist/src/core/test-harness-crash.js +121 -142
  375. package/dist/src/core/test-harness-signature.d.ts +18 -0
  376. package/dist/src/core/test-harness-signature.js +13 -0
  377. package/dist/src/core/test-path-scope.d.ts +12 -15
  378. package/dist/src/core/test-path-scope.js +15 -18
  379. package/dist/src/core/test-stale-check.d.ts +17 -17
  380. package/dist/src/core/test-stale-check.js +50 -43
  381. package/dist/src/core/test-stall-triage.d.ts +51 -0
  382. package/dist/src/core/test-stall-triage.js +126 -0
  383. package/dist/src/core/token-category.js +5 -7
  384. package/dist/src/core/token-coverage.js +9 -9
  385. package/dist/src/core/token-dark-mode.d.ts +9 -11
  386. package/dist/src/core/token-dark-mode.js +9 -11
  387. package/dist/src/core/token-docs.d.ts +2 -0
  388. package/dist/src/core/token-docs.js +2 -0
  389. package/dist/src/core/token-manager.d.ts +10 -2
  390. package/dist/src/core/token-manager.js +17 -8
  391. package/dist/src/core/token-scaffold.d.ts +7 -7
  392. package/dist/src/core/token-scaffold.js +7 -7
  393. package/dist/src/core/token-variant.d.ts +4 -4
  394. package/dist/src/core/token-variant.js +4 -4
  395. package/dist/src/core/toolchain-preflight.d.ts +20 -21
  396. package/dist/src/core/toolchain-preflight.js +28 -31
  397. package/dist/src/core/tree-guard.js +12 -2
  398. package/dist/src/core/tree-store.d.ts +41 -27
  399. package/dist/src/core/tree-store.js +63 -42
  400. package/dist/src/core/typecheck-shim.d.ts +23 -24
  401. package/dist/src/core/typecheck-shim.js +23 -24
  402. package/dist/src/core/typecheck.js +8 -8
  403. package/dist/src/core/wire-destroy.d.ts +3 -3
  404. package/dist/src/core/wire-destroy.js +7 -15
  405. package/dist/src/core/wire-dom-fragment.d.ts +9 -17
  406. package/dist/src/core/wire-dom-fragment.js +11 -44
  407. package/dist/src/core/wire-init.d.ts +2 -3
  408. package/dist/src/core/wire-init.js +8 -19
  409. package/dist/src/core/wire-subscript.d.ts +2 -3
  410. package/dist/src/core/wire-subscript.js +4 -13
  411. package/dist/src/core/wire-utils.d.ts +7 -8
  412. package/dist/src/core/wire-utils.js +7 -8
  413. package/dist/src/core/xpcshell-appdir.d.ts +38 -45
  414. package/dist/src/core/xpcshell-appdir.js +38 -45
  415. package/dist/src/errors/base.d.ts +37 -16
  416. package/dist/src/errors/base.js +37 -16
  417. package/dist/src/errors/build.d.ts +13 -1
  418. package/dist/src/errors/build.js +14 -2
  419. package/dist/src/errors/codes.d.ts +16 -0
  420. package/dist/src/errors/codes.js +16 -0
  421. package/dist/src/errors/furnace.d.ts +4 -4
  422. package/dist/src/errors/git.d.ts +6 -10
  423. package/dist/src/errors/git.js +6 -10
  424. package/dist/src/errors/patch.d.ts +7 -7
  425. package/dist/src/errors/patch.js +7 -7
  426. package/dist/src/errors/rebase.d.ts +4 -4
  427. package/dist/src/errors/rebase.js +4 -4
  428. package/dist/src/index.d.ts +7 -1
  429. package/dist/src/index.js +5 -0
  430. package/dist/src/types/commands/index.d.ts +2 -2
  431. package/dist/src/types/commands/options.d.ts +88 -70
  432. package/dist/src/types/commands/patches.d.ts +24 -34
  433. package/dist/src/types/commands/project.d.ts +5 -34
  434. package/dist/src/types/config.d.ts +25 -23
  435. package/dist/src/types/config.js +6 -1
  436. package/dist/src/types/furnace.d.ts +37 -13
  437. package/dist/src/types/furnace.js +19 -1
  438. package/dist/src/types/index.d.ts +3 -3
  439. package/dist/src/utils/build-info.d.ts +7 -8
  440. package/dist/src/utils/build-info.js +12 -11
  441. package/dist/src/utils/errors.d.ts +6 -8
  442. package/dist/src/utils/errors.js +6 -8
  443. package/dist/src/utils/logger.d.ts +27 -10
  444. package/dist/src/utils/logger.js +28 -16
  445. package/dist/src/utils/machine-output.d.ts +12 -0
  446. package/dist/src/utils/machine-output.js +33 -0
  447. package/dist/src/utils/options.d.ts +31 -14
  448. package/dist/src/utils/options.js +86 -30
  449. package/dist/src/utils/paths.d.ts +10 -8
  450. package/dist/src/utils/paths.js +10 -8
  451. package/dist/src/utils/platform.d.ts +0 -25
  452. package/dist/src/utils/platform.js +1 -42
  453. package/dist/src/utils/process-group.d.ts +9 -4
  454. package/dist/src/utils/process-group.js +19 -5
  455. package/dist/src/utils/process.d.ts +42 -7
  456. package/dist/src/utils/process.js +44 -17
  457. package/dist/src/utils/ps-duration.d.ts +31 -0
  458. package/dist/src/utils/ps-duration.js +70 -0
  459. package/dist/src/utils/regex.d.ts +9 -10
  460. package/dist/src/utils/regex.js +9 -10
  461. package/dist/src/utils/validation.d.ts +58 -28
  462. package/dist/src/utils/validation.js +60 -33
  463. package/package.json +2 -2
  464. package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
  465. package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
  466. package/dist/src/core/manifest-helpers.d.ts +0 -38
  467. package/dist/src/core/manifest-helpers.js +0 -120
  468. /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
  469. /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
  470. /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
@@ -7,24 +7,23 @@ import { getPackageVersion } from '../utils/package-root.js';
7
7
  import { getFurnacePaths } from './furnace-config.js';
8
8
  import { git } from './git-base.js';
9
9
  import { collectNewFileCreatorsByPath } from './patch-lint.js';
10
- // Schema 2: entries additionally carry the lintIgnore-suppressed
11
- // issues and the measured non-binary line count, so a warm run can report
12
- // waived size measurements identically to a cold one (the F5-class hazard:
13
- // a cache hit must never surface LESS than a fresh lint).
10
+ // Schema 2: entries additionally carry the lintIgnore-suppressed issues and
11
+ // the measured non-binary line count, so a warm run can report waived size
12
+ // measurements identically to a cold one — a cache hit must never surface
13
+ // LESS than a fresh lint.
14
14
  // Schema 3: the key additionally content-hashes the
15
15
  // `patchLint.checkJsTestShim` file exactly as `checkJsExtraShim`'s already
16
- // was — before this, editing the test shim in place replayed every cached
17
- // verdict (the same warm-run-reports-less-than-cold hazard class).
18
- // Schema 4: each entry RECORDS the lint-ignore waiver set that
19
- // produced it, and a lookup whose effective waiver set differs is refused
20
- // even when the key matches. The key already hashes `patch.lintIgnore`, so
21
- // this is belt-and-braces on purpose: a waiver change is the one mutation
22
- // that makes a replayed verdict actively WRONG (an operator writes a
23
- // waiver, re-runs, and is shown the finding they just waived — or worse,
24
- // a pre-waiver verdict replayed under a post-waiver key), and the class
25
- // must not depend on every future key input staying complete. Bumping the
26
- // schema also discards every pre-4 entry, which is itself the cure for a
27
- // cache that already holds a mismatched verdict.
16
+ // was; without it, editing the test shim in place replays every cached
17
+ // verdict.
18
+ // Schema 4: each entry RECORDS the lint-ignore waiver set that produced it,
19
+ // and a lookup whose effective waiver set differs is refused even when the
20
+ // key matches. The key already hashes `patch.lintIgnore`, so this is
21
+ // belt-and-braces on purpose: a waiver change is the one mutation that makes
22
+ // a replayed verdict actively WRONG (an operator writes a waiver, re-runs,
23
+ // and is shown the finding they just waived), and the class must not depend
24
+ // on every future key input staying complete. Bumping the schema also
25
+ // discards every pre-4 entry, which is itself the cure for a cache that
26
+ // already holds a mismatched verdict.
28
27
  export const LINT_CACHE_SCHEMA_VERSION = 4;
29
28
  const LINT_IMPLEMENTATION_VERSION = 1;
30
29
  const LINT_CACHE_DIRNAME = 'lint-cache';
@@ -102,8 +101,7 @@ export async function buildPerPatchLintCacheKey(input) {
102
101
  // Hash in parallel, then insert in sorted order. The sort is load-bearing:
103
102
  // `stableHash` below serialises this record, so insertion order is part of
104
103
  // the cache key — assigning as results land would make the key
105
- // nondeterministic. Hashing was strictly sequential until 0.41.0, in the hot
106
- // path of the cache whose entire purpose is making lint faster.
104
+ // nondeterministic.
107
105
  const sortedFiles = [...input.existingFiles].sort((a, b) => a.localeCompare(b));
108
106
  const hashes = await Promise.all(sortedFiles.map((file) => fileHash(join(input.engineDir, file))));
109
107
  const engineFiles = {};
@@ -127,8 +125,8 @@ export async function buildPerPatchLintCacheKey(input) {
127
125
  cacheSchemaVersion: LINT_CACHE_SCHEMA_VERSION,
128
126
  engineHeadSha: input.engineHeadSha ?? null,
129
127
  lintImplementationVersion: LINT_IMPLEMENTATION_VERSION,
130
- // Deliberately the PLAIN semver, not the +g<sha> build identity
131
- //: identity churns every commit at the same version and
128
+ // Deliberately the PLAIN semver, not the +g<sha> build identity:
129
+ // identity churns every commit at the same version and
132
130
  // would invalidate the cache for no correctness gain.
133
131
  packageVersion: input.packageVersion ?? getPackageVersion(),
134
132
  patchFile: await fileHash(join(input.patchesDir, input.patch.filename)),
@@ -205,9 +203,9 @@ function normalizeLintIgnoreSet(lintIgnore) {
205
203
  }
206
204
  /**
207
205
  * Returns the cached lint payload for a patch when the stored key still
208
- * matches AND the entry was computed under the same lint-ignore waiver set
209
- *. A waiver change makes a replayed verdict actively wrong, so
210
- * the waiver set is compared explicitly rather than trusted to the key.
206
+ * matches AND the entry was computed under the same lint-ignore waiver set.
207
+ * A waiver change makes a replayed verdict actively wrong, so the waiver set
208
+ * is compared explicitly rather than trusted to the key.
211
209
  */
212
210
  export function getCachedPerPatchLintIssues(cache, patchFilename, key, lintIgnore) {
213
211
  const entry = cache.entries[patchFilename];
@@ -49,10 +49,10 @@ export interface GroupedCheckJsResult {
49
49
  /**
50
50
  * Builds the checkJs program **once** over `resolutionOwned` and returns its
51
51
  * diagnostics grouped by originating file. Callers slice the result by their
52
- * own report scope — per-patch lint attributes each file to its owning
53
- * patch, export/re-export keeps only the patch under export. Resolution
54
- * always spans every file in `resolutionOwned`, so cross-patch
55
- * `resource:///`/`chrome://` imports resolve to real sources.
52
+ * own report scope — per-patch lint attributes each file to its owning patch,
53
+ * export/re-export keeps only the patch under export. Resolution always spans
54
+ * every file in `resolutionOwned`, so cross-patch `resource:///`/`chrome://`
55
+ * imports resolve to real sources.
56
56
  *
57
57
  * @param repoDir - Absolute engine (repository) directory
58
58
  * @param resolutionOwned - Patch-owned `.sys.mjs` paths (relative to repoDir)
@@ -61,14 +61,14 @@ export interface GroupedCheckJsResult {
61
61
  * the built-in Firefox-globals shim (from `patchLint.checkJsExtraShim`)
62
62
  * @param projectRoot - Absolute project root for resolving `extraShimPath`
63
63
  * @param mode - Strictness preset plus allowlisted compiler-option overrides
64
- * @param builtinShimSuffix - Optional shim text appended AFTER the consumer shim
64
+ * @param builtinShimSuffix - Optional shim text appended AFTER the consumer
65
+ * shim
65
66
  * @param rootScope - When set, only these repo-relative files become program
66
67
  * ROOTS; resolution (and the host allowlist) still spans all of
67
68
  * `resolutionOwned`, so a subset root's cross-patch imports type-check
68
69
  * against the real owning sources while unrelated owned files are never
69
70
  * parsed. `.mjs` files are module-scoped, so a root's diagnostics are
70
- * identical whether other owned files are roots or mere resolution
71
- * targets (pinned by the rootScope parity test).
71
+ * identical whether other owned files are roots or mere resolution targets.
72
72
  * @returns Diagnostics grouped per owning file plus run-level errors
73
73
  */
74
74
  export declare function runCheckJsGrouped(repoDir: string, resolutionOwned: Set<string>, extraShimPath?: string, projectRoot?: string, mode?: CheckJsMode, builtinShimSuffix?: string, rootScope?: ReadonlySet<string>): Promise<GroupedCheckJsResult>;
@@ -135,14 +135,14 @@ export declare function runCheckJsTestFilesGrouped(repoDir: string, testFiles: S
135
135
  */
136
136
  export declare function invokePatchLintCheckJsGrouped(repoDir: string, patchOwnedFiles: Set<string>, patchLint: PatchLintConfig, projectRoot: string, rootScope?: ReadonlySet<string>): Promise<GroupedCheckJsResult>;
137
137
  /**
138
- * Cheap probe reproducing the only run-level ("global") checkJs findings
139
- * the build path can produce — a missing `typescript` package and an
140
- * unreadable consumer shim (`checkJsExtraShim`, and `checkJsTestShim`
141
- * when `checkJsTestFiles` is on). The built program itself never
142
- * contributes globals (see {@link runCheckJsGrouped}), so a warm
143
- * all-cache-hit run can satisfy the "warm never reports less than cold"
144
- * invariant with this probe instead of building the whole
145
- * TypeScript program. Issue objects are byte-identical to the build
146
- * path's, deduplicated by message like {@link runCheckJsTestFilesGrouped}.
138
+ * Cheap probe reproducing the only run-level ("global") checkJs findings the
139
+ * build path can produce — a missing `typescript` package and an unreadable
140
+ * consumer shim (`checkJsExtraShim`, and `checkJsTestShim` when
141
+ * `checkJsTestFiles` is on). The built program itself never contributes
142
+ * globals (see {@link runCheckJsGrouped}), so a warm all-cache-hit run can
143
+ * satisfy the "warm never reports less than cold" invariant with this probe
144
+ * instead of building the whole TypeScript program. Issue objects are
145
+ * byte-identical to the build path's, deduplicated by message like
146
+ * {@link runCheckJsTestFilesGrouped}.
147
147
  */
148
148
  export declare function probeCheckJsGlobalIssues(patchLint: PatchLintConfig, projectRoot: string): Promise<PatchLintIssue[]>;
@@ -135,10 +135,10 @@ function createPathsResolver(ts, paths, baseDir, fileExists, onResolved) {
135
135
  /**
136
136
  * Builds the checkJs program **once** over `resolutionOwned` and returns its
137
137
  * diagnostics grouped by originating file. Callers slice the result by their
138
- * own report scope — per-patch lint attributes each file to its owning
139
- * patch, export/re-export keeps only the patch under export. Resolution
140
- * always spans every file in `resolutionOwned`, so cross-patch
141
- * `resource:///`/`chrome://` imports resolve to real sources.
138
+ * own report scope — per-patch lint attributes each file to its owning patch,
139
+ * export/re-export keeps only the patch under export. Resolution always spans
140
+ * every file in `resolutionOwned`, so cross-patch `resource:///`/`chrome://`
141
+ * imports resolve to real sources.
142
142
  *
143
143
  * @param repoDir - Absolute engine (repository) directory
144
144
  * @param resolutionOwned - Patch-owned `.sys.mjs` paths (relative to repoDir)
@@ -147,14 +147,14 @@ function createPathsResolver(ts, paths, baseDir, fileExists, onResolved) {
147
147
  * the built-in Firefox-globals shim (from `patchLint.checkJsExtraShim`)
148
148
  * @param projectRoot - Absolute project root for resolving `extraShimPath`
149
149
  * @param mode - Strictness preset plus allowlisted compiler-option overrides
150
- * @param builtinShimSuffix - Optional shim text appended AFTER the consumer shim
150
+ * @param builtinShimSuffix - Optional shim text appended AFTER the consumer
151
+ * shim
151
152
  * @param rootScope - When set, only these repo-relative files become program
152
153
  * ROOTS; resolution (and the host allowlist) still spans all of
153
154
  * `resolutionOwned`, so a subset root's cross-patch imports type-check
154
155
  * against the real owning sources while unrelated owned files are never
155
156
  * parsed. `.mjs` files are module-scoped, so a root's diagnostics are
156
- * identical whether other owned files are roots or mere resolution
157
- * targets (pinned by the rootScope parity test).
157
+ * identical whether other owned files are roots or mere resolution targets.
158
158
  * @returns Diagnostics grouped per owning file plus run-level errors
159
159
  */
160
160
  export async function runCheckJsGrouped(repoDir, resolutionOwned, extraShimPath, projectRoot, mode, builtinShimSuffix, rootScope) {
@@ -504,15 +504,15 @@ export async function invokePatchLintCheckJsGrouped(repoDir, patchOwnedFiles, pa
504
504
  return runCheckJsGrouped(repoDir, patchOwnedFiles, patchLint.checkJsExtraShim, projectRoot, modeFromPatchLintConfig(patchLint), undefined, rootScope);
505
505
  }
506
506
  /**
507
- * Cheap probe reproducing the only run-level ("global") checkJs findings
508
- * the build path can produce — a missing `typescript` package and an
509
- * unreadable consumer shim (`checkJsExtraShim`, and `checkJsTestShim`
510
- * when `checkJsTestFiles` is on). The built program itself never
511
- * contributes globals (see {@link runCheckJsGrouped}), so a warm
512
- * all-cache-hit run can satisfy the "warm never reports less than cold"
513
- * invariant with this probe instead of building the whole
514
- * TypeScript program. Issue objects are byte-identical to the build
515
- * path's, deduplicated by message like {@link runCheckJsTestFilesGrouped}.
507
+ * Cheap probe reproducing the only run-level ("global") checkJs findings the
508
+ * build path can produce — a missing `typescript` package and an unreadable
509
+ * consumer shim (`checkJsExtraShim`, and `checkJsTestShim` when
510
+ * `checkJsTestFiles` is on). The built program itself never contributes
511
+ * globals (see {@link runCheckJsGrouped}), so a warm all-cache-hit run can
512
+ * satisfy the "warm never reports less than cold" invariant with this probe
513
+ * instead of building the whole TypeScript program. Issue objects are
514
+ * byte-identical to the build path's, deduplicated by message like
515
+ * {@link runCheckJsTestFilesGrouped}.
516
516
  */
517
517
  export async function probeCheckJsGlobalIssues(patchLint, projectRoot) {
518
518
  try {
@@ -34,14 +34,11 @@ import type { JsDocIssue, ValidateExportJsDocOptions } from './patch-lint-jsdoc.
34
34
  */
35
35
  export declare function validateChromeScriptJsDoc(source: string, options?: ValidateExportJsDocOptions): JsDocIssue[];
36
36
  /**
37
- * Per-file dispatch: applies the chrome-subscript JSDoc rule to one file
38
- * if it qualifies, mapping {@link JsDocIssue} into {@link PatchLintIssue}.
39
- * Extracted so the orchestrator in `patch-lint.ts` stays under the
40
- * project's per-file line budget — `patch-lint.ts` invokes this helper
41
- * inline once per affected JS/MJS file. Returns an empty array when the
42
- * file does not qualify (not a chrome subscript, not patch-owned, or the
43
- * mode is `'off'` / unset). The orchestrator pre-computes `isChromeOwned`
44
- * (true iff the file is a patch-owned `.js` non-`.sys.mjs`) so the call
45
- * site fits on a single line.
37
+ * Per-file dispatch: applies the chrome-subscript JSDoc rule to one file if
38
+ * it qualifies, mapping {@link JsDocIssue} into {@link PatchLintIssue}.
39
+ * Returns an empty array when the file does not qualify (not a chrome
40
+ * subscript, not patch-owned, or the mode is `'off'` / unset). The
41
+ * orchestrator pre-computes `isChromeOwned` (true iff the file is a
42
+ * patch-owned `.js` non-`.sys.mjs`) so the call site fits on a single line.
46
43
  */
47
44
  export declare function lintChromeScriptJsDocForFile(file: string, content: string, isChromeOwned: boolean, mode: PatchLintSeverityGate | undefined): PatchLintIssue[];
@@ -47,20 +47,19 @@ export function validateChromeScriptJsDoc(source, options) {
47
47
  // would emit a pseudo-issue for every rule here. The orchestrator already
48
48
  // runs the export walker on `.sys.mjs` separately, so silently declining
49
49
  // to lint an unparseable script is the correct degradation for this file
50
- // and only this file. Pinned by "returns no issues when the source uses
51
- // module-only syntax" in patch-lint-chrome-jsdoc.test.ts.
50
+ // and only this file.
52
51
  return [];
53
52
  }
54
53
  const issues = [];
55
54
  const body = ast.body;
56
55
  for (const node of body) {
57
56
  if (node.type === 'FunctionDeclaration') {
58
- validateFunctionDecl(node, comments, source, issues);
57
+ issues.push(...validateFunctionDecl(node, comments, source));
59
58
  }
60
59
  else if (node.type === 'ClassDeclaration') {
61
- validateClassDecl(node, comments, source, issues);
60
+ issues.push(...validateClassDecl(node, comments, source));
62
61
  if (classMethodMode !== 'off') {
63
- validateClassMethods(node, comments, source, issues, classMethodMode);
62
+ issues.push(...validateClassMethods(node, comments, source, classMethodMode));
64
63
  }
65
64
  }
66
65
  // Top-level `var Foo = class {...}` / `let Foo = function() {...}`
@@ -72,15 +71,12 @@ export function validateChromeScriptJsDoc(source, options) {
72
71
  return issues;
73
72
  }
74
73
  /**
75
- * Per-file dispatch: applies the chrome-subscript JSDoc rule to one file
76
- * if it qualifies, mapping {@link JsDocIssue} into {@link PatchLintIssue}.
77
- * Extracted so the orchestrator in `patch-lint.ts` stays under the
78
- * project's per-file line budget — `patch-lint.ts` invokes this helper
79
- * inline once per affected JS/MJS file. Returns an empty array when the
80
- * file does not qualify (not a chrome subscript, not patch-owned, or the
81
- * mode is `'off'` / unset). The orchestrator pre-computes `isChromeOwned`
82
- * (true iff the file is a patch-owned `.js` non-`.sys.mjs`) so the call
83
- * site fits on a single line.
74
+ * Per-file dispatch: applies the chrome-subscript JSDoc rule to one file if
75
+ * it qualifies, mapping {@link JsDocIssue} into {@link PatchLintIssue}.
76
+ * Returns an empty array when the file does not qualify (not a chrome
77
+ * subscript, not patch-owned, or the mode is `'off'` / unset). The
78
+ * orchestrator pre-computes `isChromeOwned` (true iff the file is a
79
+ * patch-owned `.js` non-`.sys.mjs`) so the call site fits on a single line.
84
80
  */
85
81
  export function lintChromeScriptJsDocForFile(file, content, isChromeOwned, mode) {
86
82
  if (!isChromeOwned || !mode || mode === 'off')
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * New-file creators map for the patch queue, split out of
3
- * `patch-lint-cross.ts` (at the per-file line budget). Re-exported from
4
- * there so callers keep importing from `patch-lint.ts` unchanged.
3
+ * `patch-lint-cross.ts` to stay under the per-file line budget.
4
+ * Re-exported from there so callers keep importing from `patch-lint.ts`
5
+ * unchanged.
5
6
  *
6
- * Memoised per context object: ownership resolution and
7
- * cache-key fingerprints call this 2-3× per linted patch, and each call
8
- * used to re-run `detectNewFilesInDiff` over EVERY queue entry's diff.
9
- * Keyed weakly so a discarded context frees its map; a caller that
10
- * mutates a context entry in place must call
11
- * {@link invalidateNewFileCreatorsCache}.
7
+ * Memoised per context object: ownership resolution and cache-key
8
+ * fingerprints call this 2-3× per linted patch, and each call otherwise
9
+ * re-runs `detectNewFilesInDiff` over EVERY queue entry's diff. Keyed weakly
10
+ * so a discarded context frees its map; a caller that mutates a context
11
+ * entry in place must call {@link invalidateNewFileCreatorsCache}.
12
12
  */
13
13
  /** The slice of a queue context the creators map is derived from. */
14
14
  interface CreatorsContext {
@@ -1,15 +1,15 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
3
  * New-file creators map for the patch queue, split out of
4
- * `patch-lint-cross.ts` (at the per-file line budget). Re-exported from
5
- * there so callers keep importing from `patch-lint.ts` unchanged.
4
+ * `patch-lint-cross.ts` to stay under the per-file line budget.
5
+ * Re-exported from there so callers keep importing from `patch-lint.ts`
6
+ * unchanged.
6
7
  *
7
- * Memoised per context object: ownership resolution and
8
- * cache-key fingerprints call this 2-3× per linted patch, and each call
9
- * used to re-run `detectNewFilesInDiff` over EVERY queue entry's diff.
10
- * Keyed weakly so a discarded context frees its map; a caller that
11
- * mutates a context entry in place must call
12
- * {@link invalidateNewFileCreatorsCache}.
8
+ * Memoised per context object: ownership resolution and cache-key
9
+ * fingerprints call this 2-3× per linted patch, and each call otherwise
10
+ * re-runs `detectNewFilesInDiff` over EVERY queue entry's diff. Keyed weakly
11
+ * so a discarded context frees its map; a caller that mutates a context
12
+ * entry in place must call {@link invalidateNewFileCreatorsCache}.
13
13
  */
14
14
  import { detectNewFilesInDiff } from './patch-lint-diff.js';
15
15
  const newFileCreatorsMemo = new WeakMap();
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Cross-patch lint infrastructure: the queue context builder, the
3
- * duplicate-new-file-creation and forward-import rules, the
4
- * forward-import ignore-marker, and the per-specifier extractor that
5
- * powers the forward-import rule.
3
+ * duplicate-new-file-creation and forward-import rules, the forward-import
4
+ * ignore-marker, and the per-specifier extractor that powers the
5
+ * forward-import rule.
6
6
  *
7
7
  * Separated from `patch-lint.ts` so the per-patch and cross-patch rule
8
- * bodies stay within the project's per-file line budget. `patch-lint.ts`
9
- * re-exports the public surface so callers continue to import from a
10
- * single module.
8
+ * bodies each stay within the per-file line budget. `patch-lint.ts`
9
+ * re-exports the public surface so callers continue to import from a single
10
+ * module.
11
11
  */
12
12
  import type { PatchLintIssue, PatchMetadata } from '../types/commands/index.js';
13
13
  import type { FireForgeConfig, PatchPolicyConfig } from '../types/config.js';
@@ -61,8 +61,8 @@ export interface PatchQueueContext {
61
61
  /**
62
62
  * Optional patchPolicy config. When present, the forward-import rule
63
63
  * validates its "Closest legal ordinal" suggestion against the importing
64
- * patch's category range and suppresses it when no legal ordinal exists
65
- *. Absent = current behavior (hint always printed).
64
+ * patch's category range and suppresses it when no legal ordinal exists.
65
+ * Absent = current behavior (hint always printed).
66
66
  */
67
67
  patchPolicy?: PatchPolicyConfig;
68
68
  }
@@ -82,10 +82,8 @@ export declare function buildPatchQueueContext(patchesDir: string, config?: Fire
82
82
  export { collectNewFileCreatorsByPath, invalidateNewFileCreatorsCache, } from './patch-lint-creators.js';
83
83
  /**
84
84
  * Cross-patch lint rule: the same path is newly created (`--- /dev/null →
85
- * +++ b/path`) by more than one patch. This is the failure mode that
86
- * motivated the rule — a fork landed three patches each trying to create
87
- * the same file, and the error surfaced only when import rolled back
88
- * mid-apply.
85
+ * +++ b/path`) by more than one patch. Without it the collision surfaces
86
+ * only when import rolls back mid-apply.
89
87
  *
90
88
  * Reports one error per conflicting path, naming every patch that creates
91
89
  * the path so the operator can pick the correct fix (`patch delete` or
@@ -156,14 +154,13 @@ export declare function findForwardImportIgnoreLines(source: string): Set<number
156
154
  * Cross-patch lint rule: a patch imports a module that a later patch is
157
155
  * responsible for creating.
158
156
  *
159
- * Approach is deliberately conservative — we do not resolve `resource://`
160
- * URLs to engine file paths. Instead we build a cross-queue index of
161
- * newly-created files keyed by their basename, and flag imports whose leaf
162
- * matches an entry owned by a later-ordered patch. False positives from
163
- * unrelated basename collisions (two different directories happening to
164
- * create files named `Helper.sys.mjs`) are possible; the README documents
165
- * the limitation and the inline ignore marker above provides an escape
166
- * hatch.
157
+ * Deliberately conservative — `resource://` URLs are not resolved to engine
158
+ * file paths. Instead a cross-queue index of newly-created files is built,
159
+ * keyed by basename, and imports whose leaf matches an entry owned by a
160
+ * later-ordered patch are flagged. False positives from unrelated basename
161
+ * collisions (two directories both creating `Helper.sys.mjs`) are possible;
162
+ * the README documents the limitation and the inline ignore marker above is
163
+ * the escape hatch.
167
164
  *
168
165
  * Rules out:
169
166
  * - Imports whose leaf matches a newly-created file in the *same* or an
@@ -1,14 +1,14 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
3
  * Cross-patch lint infrastructure: the queue context builder, the
4
- * duplicate-new-file-creation and forward-import rules, the
5
- * forward-import ignore-marker, and the per-specifier extractor that
6
- * powers the forward-import rule.
4
+ * duplicate-new-file-creation and forward-import rules, the forward-import
5
+ * ignore-marker, and the per-specifier extractor that powers the
6
+ * forward-import rule.
7
7
  *
8
8
  * Separated from `patch-lint.ts` so the per-patch and cross-patch rule
9
- * bodies stay within the project's per-file line budget. `patch-lint.ts`
10
- * re-exports the public surface so callers continue to import from a
11
- * single module.
9
+ * bodies each stay within the per-file line budget. `patch-lint.ts`
10
+ * re-exports the public surface so callers continue to import from a single
11
+ * module.
12
12
  */
13
13
  import { basename } from 'node:path';
14
14
  import { toError } from '../utils/errors.js';
@@ -16,6 +16,7 @@ import { readText } from '../utils/fs.js';
16
16
  import { verbose } from '../utils/logger.js';
17
17
  import { stripJsComments } from '../utils/regex.js';
18
18
  import { discoverPatches } from './patch-files.js';
19
+ import { lintPatchQueueBinaryBodies } from './patch-lint-binary.js';
19
20
  import { collectNewFileCreatorsByPath } from './patch-lint-creators.js';
20
21
  import { detectNewFilesInDiff, extractAddedLinesPerFile } from './patch-lint-diff.js';
21
22
  import { lintPatchQueueModuleRegistrations } from './patch-lint-module-registration.js';
@@ -90,10 +91,8 @@ export async function buildPatchQueueContext(patchesDir, config) {
90
91
  export { collectNewFileCreatorsByPath, invalidateNewFileCreatorsCache, } from './patch-lint-creators.js';
91
92
  /**
92
93
  * Cross-patch lint rule: the same path is newly created (`--- /dev/null →
93
- * +++ b/path`) by more than one patch. This is the failure mode that
94
- * motivated the rule — a fork landed three patches each trying to create
95
- * the same file, and the error surfaced only when import rolled back
96
- * mid-apply.
94
+ * +++ b/path`) by more than one patch. Without it the collision surfaces
95
+ * only when import rolls back mid-apply.
97
96
  *
98
97
  * Reports one error per conflicting path, naming every patch that creates
99
98
  * the path so the operator can pick the correct fix (`patch delete` or
@@ -523,13 +522,13 @@ export function lintPatchQueueForwardImports(ctx) {
523
522
  severity: 'warning',
524
523
  });
525
524
  }
526
- // Registration-kind declarations (0.37.0 item 5): a jar.mn packaging
527
- // line, customElements registration, or actor registration referencing
528
- // a later-created file. There is no import specifier to match — the
525
+ // Registration-kind declarations: a jar.mn packaging line,
526
+ // customElements registration, or actor registration referencing a
527
+ // later-created file. There is no import specifier to match — the
529
528
  // declaration is "used" when the declared line (whitespace-trimmed)
530
- // appears among the lines this patch adds to the declaring file AND
531
- // its `creates` resolves to a file a later-ordered patch actually
532
- // creates (with `owner`, when set, naming that patch) — mirroring
529
+ // appears among the lines this patch adds to the declaring file AND its
530
+ // `creates` resolves to a file a later-ordered patch actually creates
531
+ // (with `owner`, when set, naming that patch) — mirroring
533
532
  // findMatchingStagedDependency for the import kind.
534
533
  for (const registration of entry.metadata?.stagedDependencies?.registrations ?? []) {
535
534
  const failure = findStagedRegistrationFailure(entry, registration, newFileIndex);
@@ -615,5 +614,6 @@ export function lintPatchQueue(ctx) {
615
614
  ...lintPatchQueueDuplicateCreations(ctx),
616
615
  ...lintPatchQueueForwardImports(ctx),
617
616
  ...lintPatchQueueModuleRegistrations(ctx),
617
+ ...lintPatchQueueBinaryBodies(ctx),
618
618
  ];
619
619
  }
@@ -2,11 +2,9 @@
2
2
  * CSS patch-lint rules: introduced raw color values and non-tokenized
3
3
  * custom-property references.
4
4
  *
5
- * Split out of `patch-lint.ts` so the per-patch and CSS rule bodies each
6
- * stay within the project's per-file line budget — the same separation
7
- * already applied to the JSDoc, observer, import, ownership, checkJs, and
8
- * cross-patch rule families. `patch-lint.ts` re-exports `lintPatchedCss`
9
- * so existing callers keep importing from the single module.
5
+ * Split out of `patch-lint.ts` so each rule family stays within the
6
+ * per-file line budget; `patch-lint.ts` re-exports `lintPatchedCss` so
7
+ * existing callers keep importing from the single module.
10
8
  */
11
9
  import type { PatchLintIssue } from '../types/commands/index.js';
12
10
  import type { FireForgeConfig } from '../types/config.js';
@@ -3,11 +3,9 @@
3
3
  * CSS patch-lint rules: introduced raw color values and non-tokenized
4
4
  * custom-property references.
5
5
  *
6
- * Split out of `patch-lint.ts` so the per-patch and CSS rule bodies each
7
- * stay within the project's per-file line budget — the same separation
8
- * already applied to the JSDoc, observer, import, ownership, checkJs, and
9
- * cross-patch rule families. `patch-lint.ts` re-exports `lintPatchedCss`
10
- * so existing callers keep importing from the single module.
6
+ * Split out of `patch-lint.ts` so each rule family stays within the
7
+ * per-file line budget; `patch-lint.ts` re-exports `lintPatchedCss` so
8
+ * existing callers keep importing from the single module.
11
9
  */
12
10
  import { join } from 'node:path';
13
11
  import { toError } from '../utils/errors.js';
@@ -83,12 +81,12 @@ function checkRawColorValues(file, rawCss, addedLinesByFile, addedLineNumbersByF
83
81
  // Check only introduced raw color values when diff context is available.
84
82
  // Skip files on the raw-color allowlist (exact path or basename match) and
85
83
  // auto-exempt files under `browser/branding/` — those are the fork's
86
- // visual identity assets (app-about dialogs, installer pages, branded
87
- // CSS copied from Firefox's `unofficial` template) and belong to the
88
- // design-decision layer the design-token system does not govern.
89
- // Without this auto-exemption, every first-time setup's copied CSS
90
- // failed `raw-color-value` with no actionable fix other than manually
91
- // listing each path in `rawColorAllowlist`.
84
+ // visual identity assets (app-about dialogs, installer pages, branded CSS
85
+ // copied from Firefox's `unofficial` template) and belong to the
86
+ // design-decision layer the design-token system does not govern. Without
87
+ // the auto-exemption, every first-time setup's copied CSS fails
88
+ // `raw-color-value` with no actionable fix short of listing each path in
89
+ // `rawColorAllowlist`.
92
90
  const allowlist = config?.patchLint?.rawColorAllowlist;
93
91
  const isAllowlisted = allowlist?.some((entry) => file === entry || file.endsWith('/' + entry));
94
92
  const isBranding = file.startsWith('browser/branding/');
@@ -128,19 +126,16 @@ function checkRawColorValues(file, rawCss, addedLinesByFile, addedLineNumbersByF
128
126
  */
129
127
  function checkTokenPrefixViolations(file, cssContent, addedLinesByFile, tokenContext, issues) {
130
128
  // Check for non-tokenized custom properties. A variable that is both
131
- // declared and consumed inside the same file is auto-exempted as a
132
- // runtime state channel (see furnace.json → runtimeVariables).
129
+ // declared and consumed inside the same file is auto-exempted as a runtime
130
+ // state channel (see furnace.json → runtimeVariables).
133
131
  //
134
132
  // When diff context is available, scope the `var(...)` scan to
135
- // added/modified lines only. `cssContent` (full-file) is still the
136
- // source of `localDeclarations` so vars declared anywhere in the file
137
- // are recognised as same-file refs regardless of where the consuming
138
- // `var(...)` appears. Before this scoping change, a small edit to a
139
- // Furnace override of a stock component (e.g. moz-card) produced a
140
- // `token-prefix-violation` for every stock `var(--moz-card-*)` the
141
- // upstream file already carried, because the scanner saw the full
142
- // applied file and flagged each inherited reference as if the fork
143
- // had introduced it.
133
+ // added/modified lines only. `cssContent` (full-file) is still the source
134
+ // of `localDeclarations` so vars declared anywhere in the file are
135
+ // recognised as same-file refs regardless of where the consuming `var(...)`
136
+ // appears. Without the scoping, a small edit to a Furnace override of a
137
+ // stock component (e.g. moz-card) produces a `token-prefix-violation` for
138
+ // every stock `var(--moz-card-*)` the upstream file already carried.
144
139
  if (tokenContext) {
145
140
  const declarationPattern = /(?:^|[{;,\s])(--[\w-]+)\s*:/g;
146
141
  const localDeclarations = new Set();
@@ -2,8 +2,8 @@
2
2
  * Diff-scoping for `fireforge lint`.
3
3
  *
4
4
  * Pre-existing patch-state errors and errors introduced by the current task
5
- * print identically today, so triaging "is the diff I just produced clean?"
6
- * requires mentally subtracting the pre-existing noise. This module
5
+ * print identically, so triaging "is the diff I just produced clean?"
6
+ * otherwise means mentally subtracting the pre-existing noise. This module
7
7
  * classifies each lint issue as either `introduced` (the file was touched
8
8
  * since the user-supplied git revision) or `cumulative` (pre-existing
9
9
  * drift), without changing what the underlying rules emit.
@@ -32,21 +32,19 @@ export declare const AGGREGATE_PATCH_FILE = "(patch)";
32
32
  *
33
33
  * Issues with no file (`issue.file === ''`) — e.g. cross-patch rules that
34
34
  * describe queue-wide state — are always `cumulative` under `--since`
35
- * because they describe drift accumulated across many commits, not a
36
- * single current-task edit.
35
+ * because they describe drift accumulated across many commits, not a single
36
+ * current-task edit.
37
+ *
38
+ * Aggregate patch-size rules emit `issue.file === AGGREGATE_PATCH_FILE`, a
39
+ * synthetic placeholder that can never appear in a real `diffFiles` set.
40
+ * Without special-casing, `large-patch-files` / `large-patch-lines` are
41
+ * always tagged `[cumulative]` under `--only-introduced` even when the diff
42
+ * IS the aggregate the rules measured, which reads as "this pre-existed" to
43
+ * an operator asking "what did this diff introduce?". The aggregate tag is
44
+ * therefore promoted to `introduced` whenever the diff set has any content:
45
+ * a non-empty `diffFiles` means the operator asked about a specific diff
46
+ * scope, and the aggregate finding describes exactly that scope.
37
47
  *
38
- * Aggregate patch-size rules emit `issue.file === AGGREGATE_PATCH_FILE`,
39
- * which is a synthetic placeholder that will never appear in a real
40
- * `diffFiles` set. Without special-casing, `large-patch-files` /
41
- * `large-patch-lines` were always tagged `[cumulative]` under
42
- * `--only-introduced` even when the diff WAS the aggregate the rules
43
- * measured — the eval (Finding #4) reported a stack of 20+ imported
44
- * patches whose aggregate-size warnings printed as `[cumulative]` under
45
- * `lint --since HEAD --only-introduced`, which reads as "this pre-existed"
46
- * to an operator asking "what did this diff introduce?" We promote the
47
- * aggregate tag to `introduced` whenever the diff set has any content —
48
- * non-empty `diffFiles` means the operator asked about a specific diff
49
- * scope and the aggregate-rule finding describes exactly that scope.
50
48
  * @param issues Issues returned by the lint orchestrator.
51
49
  * @param diffFiles File paths touched since the user's revision.
52
50
  */
@@ -3,8 +3,8 @@
3
3
  * Diff-scoping for `fireforge lint`.
4
4
  *
5
5
  * Pre-existing patch-state errors and errors introduced by the current task
6
- * print identically today, so triaging "is the diff I just produced clean?"
7
- * requires mentally subtracting the pre-existing noise. This module
6
+ * print identically, so triaging "is the diff I just produced clean?"
7
+ * otherwise means mentally subtracting the pre-existing noise. This module
8
8
  * classifies each lint issue as either `introduced` (the file was touched
9
9
  * since the user-supplied git revision) or `cumulative` (pre-existing
10
10
  * drift), without changing what the underlying rules emit.
@@ -72,21 +72,19 @@ export const AGGREGATE_PATCH_FILE = '(patch)';
72
72
  *
73
73
  * Issues with no file (`issue.file === ''`) — e.g. cross-patch rules that
74
74
  * describe queue-wide state — are always `cumulative` under `--since`
75
- * because they describe drift accumulated across many commits, not a
76
- * single current-task edit.
75
+ * because they describe drift accumulated across many commits, not a single
76
+ * current-task edit.
77
+ *
78
+ * Aggregate patch-size rules emit `issue.file === AGGREGATE_PATCH_FILE`, a
79
+ * synthetic placeholder that can never appear in a real `diffFiles` set.
80
+ * Without special-casing, `large-patch-files` / `large-patch-lines` are
81
+ * always tagged `[cumulative]` under `--only-introduced` even when the diff
82
+ * IS the aggregate the rules measured, which reads as "this pre-existed" to
83
+ * an operator asking "what did this diff introduce?". The aggregate tag is
84
+ * therefore promoted to `introduced` whenever the diff set has any content:
85
+ * a non-empty `diffFiles` means the operator asked about a specific diff
86
+ * scope, and the aggregate finding describes exactly that scope.
77
87
  *
78
- * Aggregate patch-size rules emit `issue.file === AGGREGATE_PATCH_FILE`,
79
- * which is a synthetic placeholder that will never appear in a real
80
- * `diffFiles` set. Without special-casing, `large-patch-files` /
81
- * `large-patch-lines` were always tagged `[cumulative]` under
82
- * `--only-introduced` even when the diff WAS the aggregate the rules
83
- * measured — the eval (Finding #4) reported a stack of 20+ imported
84
- * patches whose aggregate-size warnings printed as `[cumulative]` under
85
- * `lint --since HEAD --only-introduced`, which reads as "this pre-existed"
86
- * to an operator asking "what did this diff introduce?" We promote the
87
- * aggregate tag to `introduced` whenever the diff set has any content —
88
- * non-empty `diffFiles` means the operator asked about a specific diff
89
- * scope and the aggregate-rule finding describes exactly that scope.
90
88
  * @param issues Issues returned by the lint orchestrator.
91
89
  * @param diffFiles File paths touched since the user's revision.
92
90
  */