@hominis/fireforge 0.43.1 → 0.44.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 (478) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/README.md +3 -3
  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 +13 -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-patch-manifest.d.ts +8 -0
  22. package/dist/src/commands/doctor-patch-manifest.js +155 -0
  23. package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
  24. package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
  25. package/dist/src/commands/doctor-working-tree.d.ts +10 -12
  26. package/dist/src/commands/doctor-working-tree.js +11 -18
  27. package/dist/src/commands/doctor.d.ts +1 -1
  28. package/dist/src/commands/doctor.js +64 -96
  29. package/dist/src/commands/download.js +32 -48
  30. package/dist/src/commands/export-all.js +29 -33
  31. package/dist/src/commands/export-flow.js +6 -6
  32. package/dist/src/commands/export-placement-conflicts.js +10 -9
  33. package/dist/src/commands/export-placement-gate.js +5 -5
  34. package/dist/src/commands/export-shared.d.ts +30 -33
  35. package/dist/src/commands/export-shared.js +45 -43
  36. package/dist/src/commands/export.js +21 -27
  37. package/dist/src/commands/furnace/apply.js +14 -23
  38. package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
  39. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
  40. package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
  41. package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
  42. package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
  43. package/dist/src/commands/furnace/chrome-doc.js +31 -41
  44. package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
  45. package/dist/src/commands/furnace/create-browser-test.js +8 -8
  46. package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
  47. package/dist/src/commands/furnace/create-mochikit.js +8 -9
  48. package/dist/src/commands/furnace/create-readback.d.ts +12 -13
  49. package/dist/src/commands/furnace/create-readback.js +12 -13
  50. package/dist/src/commands/furnace/create-templates.d.ts +22 -28
  51. package/dist/src/commands/furnace/create-templates.js +35 -30
  52. package/dist/src/commands/furnace/create-xpcshell.js +2 -2
  53. package/dist/src/commands/furnace/create.js +33 -23
  54. package/dist/src/commands/furnace/deploy.js +16 -24
  55. package/dist/src/commands/furnace/diff.js +15 -10
  56. package/dist/src/commands/furnace/init.js +33 -36
  57. package/dist/src/commands/furnace/override.js +23 -25
  58. package/dist/src/commands/furnace/preview.js +47 -67
  59. package/dist/src/commands/furnace/refresh.js +12 -16
  60. package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
  61. package/dist/src/commands/furnace/remove-mutations.js +14 -17
  62. package/dist/src/commands/furnace/remove-state.js +1 -1
  63. package/dist/src/commands/furnace/remove.js +33 -38
  64. package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
  65. package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
  66. package/dist/src/commands/furnace/rename.js +59 -69
  67. package/dist/src/commands/furnace/scan.js +19 -33
  68. package/dist/src/commands/furnace/status.js +12 -9
  69. package/dist/src/commands/furnace/sync.js +9 -16
  70. package/dist/src/commands/furnace/validate.js +20 -20
  71. package/dist/src/commands/import.js +48 -37
  72. package/dist/src/commands/lint-per-patch.js +15 -10
  73. package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
  74. package/dist/src/commands/lint-per-run-checkjs.js +13 -13
  75. package/dist/src/commands/lint-report.js +6 -7
  76. package/dist/src/commands/lint.d.ts +15 -16
  77. package/dist/src/commands/lint.js +86 -102
  78. package/dist/src/commands/package.js +6 -11
  79. package/dist/src/commands/patch/compact.js +1 -1
  80. package/dist/src/commands/patch/delete.js +24 -33
  81. package/dist/src/commands/patch/index.d.ts +5 -6
  82. package/dist/src/commands/patch/index.js +10 -12
  83. package/dist/src/commands/patch/lint-ignore.js +14 -13
  84. package/dist/src/commands/patch/move-files-create.d.ts +6 -6
  85. package/dist/src/commands/patch/move-files-create.js +8 -8
  86. package/dist/src/commands/patch/move-files-into.d.ts +6 -6
  87. package/dist/src/commands/patch/move-files-into.js +8 -8
  88. package/dist/src/commands/patch/patch-context.d.ts +2 -3
  89. package/dist/src/commands/patch/patch-context.js +2 -3
  90. package/dist/src/commands/patch/rename.d.ts +10 -11
  91. package/dist/src/commands/patch/rename.js +11 -12
  92. package/dist/src/commands/patch/reorder.js +8 -9
  93. package/dist/src/commands/patch/split-plan.js +1 -1
  94. package/dist/src/commands/patch/split.d.ts +8 -10
  95. package/dist/src/commands/patch/split.js +9 -11
  96. package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
  97. package/dist/src/commands/patch/staged-dependency.js +7 -3
  98. package/dist/src/commands/patch/tier.d.ts +9 -9
  99. package/dist/src/commands/patch/tier.js +18 -15
  100. package/dist/src/commands/re-export-adjacent.js +9 -8
  101. package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
  102. package/dist/src/commands/re-export-bulk-scan.js +22 -21
  103. package/dist/src/commands/re-export-drift.js +10 -10
  104. package/dist/src/commands/re-export-files.d.ts +6 -7
  105. package/dist/src/commands/re-export-files.js +34 -44
  106. package/dist/src/commands/re-export-lint.d.ts +10 -13
  107. package/dist/src/commands/re-export-lint.js +16 -14
  108. package/dist/src/commands/re-export-options.d.ts +6 -6
  109. package/dist/src/commands/re-export-options.js +6 -6
  110. package/dist/src/commands/re-export-register.d.ts +4 -10
  111. package/dist/src/commands/re-export-register.js +5 -11
  112. package/dist/src/commands/re-export-scan.js +1 -1
  113. package/dist/src/commands/re-export-single.d.ts +3 -3
  114. package/dist/src/commands/re-export-single.js +33 -25
  115. package/dist/src/commands/re-export.js +13 -21
  116. package/dist/src/commands/rebase/abort.js +3 -3
  117. package/dist/src/commands/rebase/confirm.js +2 -1
  118. package/dist/src/commands/rebase/continue.d.ts +1 -1
  119. package/dist/src/commands/rebase/continue.js +14 -9
  120. package/dist/src/commands/rebase/index.js +11 -11
  121. package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
  122. package/dist/src/commands/rebase/patch-loop.js +60 -39
  123. package/dist/src/commands/rebase/summary.js +1 -1
  124. package/dist/src/commands/register.js +5 -7
  125. package/dist/src/commands/reset.js +2 -1
  126. package/dist/src/commands/resolve.d.ts +16 -13
  127. package/dist/src/commands/resolve.js +30 -33
  128. package/dist/src/commands/run.js +33 -35
  129. package/dist/src/commands/setup-support.js +15 -19
  130. package/dist/src/commands/setup.js +13 -9
  131. package/dist/src/commands/status-check.d.ts +6 -6
  132. package/dist/src/commands/status-json.d.ts +6 -6
  133. package/dist/src/commands/status-json.js +5 -0
  134. package/dist/src/commands/status-output.d.ts +5 -5
  135. package/dist/src/commands/status-output.js +6 -6
  136. package/dist/src/commands/status-ownership.d.ts +16 -14
  137. package/dist/src/commands/status-ownership.js +16 -14
  138. package/dist/src/commands/status.js +42 -34
  139. package/dist/src/commands/test-build-phase.js +26 -13
  140. package/dist/src/commands/test-diagnose.js +44 -44
  141. package/dist/src/commands/test-register.js +1 -0
  142. package/dist/src/commands/test-run.d.ts +14 -16
  143. package/dist/src/commands/test-run.js +21 -13
  144. package/dist/src/commands/test-stale-gate.d.ts +15 -16
  145. package/dist/src/commands/test-stale-gate.js +15 -16
  146. package/dist/src/commands/test-verdict.d.ts +20 -3
  147. package/dist/src/commands/test-verdict.js +30 -0
  148. package/dist/src/commands/test.js +83 -76
  149. package/dist/src/commands/token-coverage.js +3 -4
  150. package/dist/src/commands/token.js +16 -18
  151. package/dist/src/commands/tree.js +47 -31
  152. package/dist/src/commands/typecheck.d.ts +10 -12
  153. package/dist/src/commands/typecheck.js +24 -27
  154. package/dist/src/commands/verify.js +13 -15
  155. package/dist/src/commands/watch.js +21 -23
  156. package/dist/src/commands/wire.js +52 -62
  157. package/dist/src/core/ast-utils.d.ts +8 -7
  158. package/dist/src/core/ast-utils.js +8 -7
  159. package/dist/src/core/branding.d.ts +9 -14
  160. package/dist/src/core/branding.js +7 -11
  161. package/dist/src/core/browser-wire.d.ts +1 -1
  162. package/dist/src/core/browser-wire.js +14 -19
  163. package/dist/src/core/build-audit-platform.js +25 -33
  164. package/dist/src/core/build-audit-registration.js +17 -25
  165. package/dist/src/core/build-audit-resolve.d.ts +15 -17
  166. package/dist/src/core/build-audit-resolve.js +39 -36
  167. package/dist/src/core/build-audit-transforms.js +18 -19
  168. package/dist/src/core/build-audit.js +28 -42
  169. package/dist/src/core/build-baseline-types.d.ts +29 -35
  170. package/dist/src/core/build-baseline.d.ts +5 -4
  171. package/dist/src/core/build-baseline.js +14 -14
  172. package/dist/src/core/build-overwrite-guard.d.ts +7 -14
  173. package/dist/src/core/build-overwrite-guard.js +17 -27
  174. package/dist/src/core/build-prepare.d.ts +2 -2
  175. package/dist/src/core/build-prepare.js +8 -9
  176. package/dist/src/core/config-mutate.js +20 -19
  177. package/dist/src/core/config-state.js +12 -4
  178. package/dist/src/core/config-validate.js +8 -5
  179. package/dist/src/core/config.d.ts +5 -8
  180. package/dist/src/core/config.js +7 -16
  181. package/dist/src/core/coverage-extend.d.ts +15 -13
  182. package/dist/src/core/coverage-extend.js +15 -13
  183. package/dist/src/core/destructive.d.ts +31 -9
  184. package/dist/src/core/destructive.js +29 -26
  185. package/dist/src/core/diff-hunks.js +10 -12
  186. package/dist/src/core/discard-baseline.d.ts +8 -8
  187. package/dist/src/core/discard-baseline.js +16 -15
  188. package/dist/src/core/display-state.d.ts +12 -14
  189. package/dist/src/core/display-state.js +12 -14
  190. package/dist/src/core/engine-changes.d.ts +2 -4
  191. package/dist/src/core/engine-changes.js +2 -4
  192. package/dist/src/core/engine-precondition.d.ts +28 -13
  193. package/dist/src/core/engine-precondition.js +25 -10
  194. package/dist/src/core/engine-session-lock.d.ts +47 -21
  195. package/dist/src/core/engine-session-lock.js +168 -33
  196. package/dist/src/core/export-moved-code-shape.d.ts +10 -10
  197. package/dist/src/core/export-moved-code-shape.js +10 -10
  198. package/dist/src/core/file-lock.d.ts +62 -5
  199. package/dist/src/core/file-lock.js +196 -59
  200. package/dist/src/core/firefox-cache.js +1 -3
  201. package/dist/src/core/firefox-extract.js +10 -14
  202. package/dist/src/core/firefox.d.ts +7 -5
  203. package/dist/src/core/firefox.js +4 -5
  204. package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
  205. package/dist/src/core/furnace-apply-dry-run.js +3 -2
  206. package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
  207. package/dist/src/core/furnace-apply-ftl.js +16 -13
  208. package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
  209. package/dist/src/core/furnace-apply-helpers.js +30 -21
  210. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
  211. package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
  212. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
  213. package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
  214. package/dist/src/core/furnace-apply.d.ts +5 -8
  215. package/dist/src/core/furnace-apply.js +19 -24
  216. package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
  217. package/dist/src/core/furnace-checksum-utils.js +16 -0
  218. package/dist/src/core/furnace-config.d.ts +21 -30
  219. package/dist/src/core/furnace-config.js +32 -54
  220. package/dist/src/core/furnace-constants.d.ts +8 -0
  221. package/dist/src/core/furnace-constants.js +10 -2
  222. package/dist/src/core/furnace-css-fragments.d.ts +5 -5
  223. package/dist/src/core/furnace-css-fragments.js +5 -5
  224. package/dist/src/core/furnace-jsconfig.d.ts +11 -12
  225. package/dist/src/core/furnace-jsconfig.js +11 -12
  226. package/dist/src/core/furnace-marker.d.ts +7 -8
  227. package/dist/src/core/furnace-marker.js +7 -8
  228. package/dist/src/core/furnace-operation.d.ts +31 -0
  229. package/dist/src/core/furnace-operation.js +54 -17
  230. package/dist/src/core/furnace-precondition.d.ts +61 -0
  231. package/dist/src/core/furnace-precondition.js +67 -0
  232. package/dist/src/core/furnace-registration-remove.d.ts +5 -6
  233. package/dist/src/core/furnace-registration-remove.js +6 -7
  234. package/dist/src/core/furnace-registration-validate.d.ts +13 -0
  235. package/dist/src/core/furnace-registration-validate.js +20 -1
  236. package/dist/src/core/furnace-registration.d.ts +5 -6
  237. package/dist/src/core/furnace-registration.js +10 -12
  238. package/dist/src/core/furnace-rollback.js +7 -7
  239. package/dist/src/core/furnace-scanner.d.ts +1 -0
  240. package/dist/src/core/furnace-scanner.js +1 -2
  241. package/dist/src/core/furnace-stale-export.d.ts +10 -10
  242. package/dist/src/core/furnace-stale-export.js +10 -10
  243. package/dist/src/core/furnace-state-persist.d.ts +6 -8
  244. package/dist/src/core/furnace-state-persist.js +6 -8
  245. package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
  246. package/dist/src/core/furnace-validate-accessibility.js +310 -1
  247. package/dist/src/core/furnace-validate-compatibility.js +141 -1
  248. package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
  249. package/dist/src/core/furnace-validate-helpers.js +0 -491
  250. package/dist/src/core/furnace-validate-registration.d.ts +7 -0
  251. package/dist/src/core/furnace-validate-registration.js +115 -41
  252. package/dist/src/core/furnace-validate.d.ts +16 -0
  253. package/dist/src/core/furnace-validate.js +188 -145
  254. package/dist/src/core/furnace-version-drift.d.ts +10 -11
  255. package/dist/src/core/furnace-version-drift.js +10 -11
  256. package/dist/src/core/git-base.d.ts +21 -9
  257. package/dist/src/core/git-base.js +24 -9
  258. package/dist/src/core/git-diff.d.ts +20 -9
  259. package/dist/src/core/git-diff.js +148 -63
  260. package/dist/src/core/git-file-ops.d.ts +19 -19
  261. package/dist/src/core/git-file-ops.js +19 -19
  262. package/dist/src/core/git-readonly-index.d.ts +53 -19
  263. package/dist/src/core/git-readonly-index.js +75 -31
  264. package/dist/src/core/git-status.d.ts +5 -6
  265. package/dist/src/core/git-status.js +5 -6
  266. package/dist/src/core/git.d.ts +9 -10
  267. package/dist/src/core/git.js +57 -71
  268. package/dist/src/core/license-headers.d.ts +17 -23
  269. package/dist/src/core/license-headers.js +17 -23
  270. package/dist/src/core/mach-build-artifacts.d.ts +9 -9
  271. package/dist/src/core/mach-build-artifacts.js +57 -19
  272. package/dist/src/core/mach-error-hints.js +42 -29
  273. package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
  274. package/dist/src/core/mach-known-noise-filter.js +18 -20
  275. package/dist/src/core/mach-mozconfig.d.ts +14 -0
  276. package/dist/src/core/mach-mozconfig.js +30 -0
  277. package/dist/src/core/mach-resource-shim.d.ts +43 -58
  278. package/dist/src/core/mach-resource-shim.js +50 -67
  279. package/dist/src/core/mach.d.ts +37 -41
  280. package/dist/src/core/mach.js +50 -51
  281. package/dist/src/core/marionette-port.d.ts +36 -1
  282. package/dist/src/core/marionette-port.js +96 -31
  283. package/dist/src/core/marionette-preflight.d.ts +8 -12
  284. package/dist/src/core/marionette-preflight.js +86 -52
  285. package/dist/src/core/mochitest-server-port.d.ts +42 -0
  286. package/dist/src/core/mochitest-server-port.js +119 -0
  287. package/dist/src/core/module-resolution-preflight.d.ts +9 -11
  288. package/dist/src/core/module-resolution-preflight.js +9 -11
  289. package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
  290. package/dist/src/core/moz-manifest-helpers.js +163 -0
  291. package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
  292. package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
  293. package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
  294. package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
  295. package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
  296. package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
  297. package/dist/src/core/ownership-table.d.ts +14 -16
  298. package/dist/src/core/ownership-table.js +14 -16
  299. package/dist/src/core/parser-fallback.d.ts +15 -1
  300. package/dist/src/core/parser-fallback.js +22 -3
  301. package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
  302. package/dist/src/core/patch-apply-fuzz.js +15 -18
  303. package/dist/src/core/patch-apply.d.ts +13 -34
  304. package/dist/src/core/patch-apply.js +16 -76
  305. package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
  306. package/dist/src/core/patch-artifact-normalize.js +13 -15
  307. package/dist/src/core/patch-export-metadata.d.ts +12 -2
  308. package/dist/src/core/patch-export-metadata.js +13 -4
  309. package/dist/src/core/patch-export-update.d.ts +13 -1
  310. package/dist/src/core/patch-export-update.js +25 -8
  311. package/dist/src/core/patch-export.d.ts +15 -8
  312. package/dist/src/core/patch-export.js +10 -11
  313. package/dist/src/core/patch-files.d.ts +5 -6
  314. package/dist/src/core/patch-files.js +5 -6
  315. package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
  316. package/dist/src/core/patch-identifier-suggest.js +14 -19
  317. package/dist/src/core/patch-lint-binary.d.ts +51 -0
  318. package/dist/src/core/patch-lint-binary.js +39 -0
  319. package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
  320. package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
  321. package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
  322. package/dist/src/core/patch-lint-checkjs.js +41 -20
  323. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
  324. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
  325. package/dist/src/core/patch-lint-creators.d.ts +8 -8
  326. package/dist/src/core/patch-lint-creators.js +8 -8
  327. package/dist/src/core/patch-lint-cross.d.ts +17 -20
  328. package/dist/src/core/patch-lint-cross.js +16 -16
  329. package/dist/src/core/patch-lint-css.d.ts +3 -5
  330. package/dist/src/core/patch-lint-css.js +17 -22
  331. package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
  332. package/dist/src/core/patch-lint-diff-tag.js +14 -16
  333. package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
  334. package/dist/src/core/patch-lint-jsdoc.js +26 -19
  335. package/dist/src/core/patch-lint-mozbuild.js +20 -20
  336. package/dist/src/core/patch-lint-observer.d.ts +7 -7
  337. package/dist/src/core/patch-lint-observer.js +7 -7
  338. package/dist/src/core/patch-lint.d.ts +38 -29
  339. package/dist/src/core/patch-lint.js +89 -121
  340. package/dist/src/core/patch-lock.d.ts +1 -1
  341. package/dist/src/core/patch-lock.js +45 -9
  342. package/dist/src/core/patch-manifest-consistency.d.ts +57 -6
  343. package/dist/src/core/patch-manifest-consistency.js +111 -40
  344. package/dist/src/core/patch-manifest-files-affected.d.ts +43 -0
  345. package/dist/src/core/patch-manifest-files-affected.js +77 -0
  346. package/dist/src/core/patch-manifest-io.js +14 -18
  347. package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
  348. package/dist/src/core/patch-manifest-resolve.js +9 -12
  349. package/dist/src/core/patch-manifest-validate.d.ts +6 -1
  350. package/dist/src/core/patch-manifest-validate.js +25 -13
  351. package/dist/src/core/patch-manifest.d.ts +2 -1
  352. package/dist/src/core/patch-manifest.js +2 -1
  353. package/dist/src/core/patch-parse.d.ts +24 -13
  354. package/dist/src/core/patch-parse.js +19 -14
  355. package/dist/src/core/patch-policy.d.ts +2 -2
  356. package/dist/src/core/patch-policy.js +2 -2
  357. package/dist/src/core/patch-registration-refs.d.ts +7 -8
  358. package/dist/src/core/patch-registration-refs.js +9 -9
  359. package/dist/src/core/process-cpu-time.d.ts +12 -0
  360. package/dist/src/core/process-cpu-time.js +52 -0
  361. package/dist/src/core/rebase-session.d.ts +38 -26
  362. package/dist/src/core/rebase-session.js +55 -28
  363. package/dist/src/core/register-browser-content.js +9 -74
  364. package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
  365. package/dist/src/core/register-module.js +10 -43
  366. package/dist/src/core/register-scaffold.d.ts +8 -8
  367. package/dist/src/core/register-scaffold.js +10 -10
  368. package/dist/src/core/register-shared-css.d.ts +9 -12
  369. package/dist/src/core/register-shared-css.js +17 -87
  370. package/dist/src/core/register-xpcshell-test.d.ts +6 -7
  371. package/dist/src/core/register-xpcshell-test.js +7 -8
  372. package/dist/src/core/shared-ftl.js +12 -4
  373. package/dist/src/core/state-file.d.ts +45 -0
  374. package/dist/src/core/state-file.js +34 -0
  375. package/dist/src/core/status-binary.d.ts +18 -11
  376. package/dist/src/core/status-binary.js +19 -12
  377. package/dist/src/core/status-classify.d.ts +30 -36
  378. package/dist/src/core/status-classify.js +21 -26
  379. package/dist/src/core/test-changed-prefs.d.ts +30 -0
  380. package/dist/src/core/test-changed-prefs.js +78 -0
  381. package/dist/src/core/test-harness-crash.d.ts +25 -63
  382. package/dist/src/core/test-harness-crash.js +121 -142
  383. package/dist/src/core/test-harness-signature.d.ts +18 -0
  384. package/dist/src/core/test-harness-signature.js +13 -0
  385. package/dist/src/core/test-path-scope.d.ts +12 -15
  386. package/dist/src/core/test-path-scope.js +15 -18
  387. package/dist/src/core/test-stale-check.d.ts +17 -17
  388. package/dist/src/core/test-stale-check.js +50 -43
  389. package/dist/src/core/test-stall-triage.d.ts +51 -0
  390. package/dist/src/core/test-stall-triage.js +126 -0
  391. package/dist/src/core/token-category.js +66 -14
  392. package/dist/src/core/token-coverage.js +9 -9
  393. package/dist/src/core/token-dark-mode.d.ts +9 -11
  394. package/dist/src/core/token-dark-mode.js +29 -13
  395. package/dist/src/core/token-docs.d.ts +2 -0
  396. package/dist/src/core/token-docs.js +3 -1
  397. package/dist/src/core/token-manager.d.ts +10 -2
  398. package/dist/src/core/token-manager.js +17 -8
  399. package/dist/src/core/token-scaffold.d.ts +7 -7
  400. package/dist/src/core/token-scaffold.js +7 -7
  401. package/dist/src/core/token-variant.d.ts +4 -4
  402. package/dist/src/core/token-variant.js +28 -6
  403. package/dist/src/core/toolchain-preflight.d.ts +20 -21
  404. package/dist/src/core/toolchain-preflight.js +28 -31
  405. package/dist/src/core/tree-guard.js +12 -2
  406. package/dist/src/core/tree-store.d.ts +41 -27
  407. package/dist/src/core/tree-store.js +68 -43
  408. package/dist/src/core/typecheck-shim.d.ts +23 -24
  409. package/dist/src/core/typecheck-shim.js +23 -24
  410. package/dist/src/core/typecheck.js +15 -9
  411. package/dist/src/core/wire-destroy.d.ts +3 -3
  412. package/dist/src/core/wire-destroy.js +7 -15
  413. package/dist/src/core/wire-dom-fragment.d.ts +9 -17
  414. package/dist/src/core/wire-dom-fragment.js +11 -44
  415. package/dist/src/core/wire-init.d.ts +2 -3
  416. package/dist/src/core/wire-init.js +8 -19
  417. package/dist/src/core/wire-subscript.d.ts +2 -3
  418. package/dist/src/core/wire-subscript.js +4 -13
  419. package/dist/src/core/wire-utils.d.ts +7 -8
  420. package/dist/src/core/wire-utils.js +7 -8
  421. package/dist/src/core/xpcshell-appdir.d.ts +38 -45
  422. package/dist/src/core/xpcshell-appdir.js +38 -45
  423. package/dist/src/errors/base.d.ts +37 -16
  424. package/dist/src/errors/base.js +37 -16
  425. package/dist/src/errors/build.d.ts +13 -1
  426. package/dist/src/errors/build.js +14 -2
  427. package/dist/src/errors/codes.d.ts +16 -0
  428. package/dist/src/errors/codes.js +16 -0
  429. package/dist/src/errors/furnace.d.ts +4 -4
  430. package/dist/src/errors/git.d.ts +6 -10
  431. package/dist/src/errors/git.js +6 -10
  432. package/dist/src/errors/patch.d.ts +7 -7
  433. package/dist/src/errors/patch.js +7 -7
  434. package/dist/src/errors/rebase.d.ts +4 -4
  435. package/dist/src/errors/rebase.js +4 -4
  436. package/dist/src/index.d.ts +7 -1
  437. package/dist/src/index.js +5 -0
  438. package/dist/src/types/commands/index.d.ts +2 -2
  439. package/dist/src/types/commands/options.d.ts +111 -70
  440. package/dist/src/types/commands/patches.d.ts +24 -34
  441. package/dist/src/types/commands/project.d.ts +5 -34
  442. package/dist/src/types/config.d.ts +25 -23
  443. package/dist/src/types/config.js +6 -1
  444. package/dist/src/types/furnace.d.ts +37 -13
  445. package/dist/src/types/furnace.js +19 -1
  446. package/dist/src/types/index.d.ts +3 -3
  447. package/dist/src/utils/build-info.d.ts +7 -8
  448. package/dist/src/utils/build-info.js +12 -11
  449. package/dist/src/utils/errors.d.ts +6 -8
  450. package/dist/src/utils/errors.js +6 -8
  451. package/dist/src/utils/logger.d.ts +27 -10
  452. package/dist/src/utils/logger.js +28 -16
  453. package/dist/src/utils/machine-output.d.ts +12 -0
  454. package/dist/src/utils/machine-output.js +33 -0
  455. package/dist/src/utils/options.d.ts +31 -14
  456. package/dist/src/utils/options.js +86 -30
  457. package/dist/src/utils/paths.d.ts +10 -8
  458. package/dist/src/utils/paths.js +10 -8
  459. package/dist/src/utils/platform.d.ts +0 -25
  460. package/dist/src/utils/platform.js +1 -42
  461. package/dist/src/utils/process-group.d.ts +9 -4
  462. package/dist/src/utils/process-group.js +19 -5
  463. package/dist/src/utils/process.d.ts +42 -7
  464. package/dist/src/utils/process.js +44 -17
  465. package/dist/src/utils/ps-duration.d.ts +31 -0
  466. package/dist/src/utils/ps-duration.js +70 -0
  467. package/dist/src/utils/regex.d.ts +9 -10
  468. package/dist/src/utils/regex.js +9 -10
  469. package/dist/src/utils/validation.d.ts +58 -28
  470. package/dist/src/utils/validation.js +60 -33
  471. package/package.json +3 -3
  472. package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
  473. package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
  474. package/dist/src/core/manifest-helpers.d.ts +0 -38
  475. package/dist/src/core/manifest-helpers.js +0 -120
  476. /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
  477. /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
  478. /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[]>;
@@ -29,10 +29,25 @@ import { basename, resolve } from 'node:path';
29
29
  import { toError } from '../utils/errors.js';
30
30
  import { pathExists } from '../utils/fs.js';
31
31
  import { verbose } from '../utils/logger.js';
32
+ import { normalizePathSlashes } from '../utils/paths.js';
32
33
  import { composeShimSource, SHIM_FILENAME, SUPPRESSED_DIAGNOSTIC_CODES, TEST_HARNESS_SHIM, UNDEFINED_IDENTIFIER_CODES, UNDEFINED_IDENTIFIER_HINT, } from './typecheck-shim.js';
33
34
  // ---------------------------------------------------------------------------
34
35
  // Public API
35
36
  // ---------------------------------------------------------------------------
37
+ /**
38
+ * Converts a native path into the form TypeScript uses for `fileName`.
39
+ *
40
+ * TypeScript normalizes every path it hands a `CompilerHost` to forward
41
+ * slashes on ALL platforms, while `resolve()` here yields the platform
42
+ * separator. On Windows that mismatch made every `ownedAbsolute.has(fileName)`
43
+ * and `relByAbsolute.get(fileName)` lookup miss, so the host served an empty
44
+ * source file for each owned file and the whole pass reported zero findings —
45
+ * silently, because "no diagnostics" is indistinguishable from "clean code".
46
+ * Every path that crosses the TS boundary goes through here.
47
+ */
48
+ function toTsPath(path) {
49
+ return normalizePathSlashes(path);
50
+ }
36
51
  /**
37
52
  * Builds the host-side module resolver for the checkJs pass: maps an import
38
53
  * specifier to a patch-owned absolute path when the specifier's final
@@ -117,8 +132,14 @@ function createPathsResolver(ts, paths, baseDir, fileExists, onResolved) {
117
132
  captured = specifier.slice(prefix.length, specifier.length - suffix.length);
118
133
  }
119
134
  for (const target of targets) {
120
- const rel = target.includes('*') ? target.replace('*', captured) : target;
121
- const abs = resolve(baseDir, rel);
135
+ // A `paths` target carries at most one `*`, and TypeScript substitutes
136
+ // that one wildcard — spelled as index arithmetic (mirroring the
137
+ // prefix/suffix split on the pattern side above) rather than
138
+ // `replace('*', …)`, whose first-occurrence-only behaviour reads as an
139
+ // incomplete rewrite (CodeQL `js/incomplete-sanitization`).
140
+ const star = target.indexOf('*');
141
+ const rel = star === -1 ? target : target.slice(0, star) + captured + target.slice(star + 1);
142
+ const abs = toTsPath(resolve(baseDir, rel));
122
143
  if (!fileExists(abs))
123
144
  continue;
124
145
  onResolved(abs);
@@ -135,10 +156,10 @@ function createPathsResolver(ts, paths, baseDir, fileExists, onResolved) {
135
156
  /**
136
157
  * Builds the checkJs program **once** over `resolutionOwned` and returns its
137
158
  * 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.
159
+ * own report scope — per-patch lint attributes each file to its owning patch,
160
+ * export/re-export keeps only the patch under export. Resolution always spans
161
+ * every file in `resolutionOwned`, so cross-patch `resource:///`/`chrome://`
162
+ * imports resolve to real sources.
142
163
  *
143
164
  * @param repoDir - Absolute engine (repository) directory
144
165
  * @param resolutionOwned - Patch-owned `.sys.mjs` paths (relative to repoDir)
@@ -147,14 +168,14 @@ function createPathsResolver(ts, paths, baseDir, fileExists, onResolved) {
147
168
  * the built-in Firefox-globals shim (from `patchLint.checkJsExtraShim`)
148
169
  * @param projectRoot - Absolute project root for resolving `extraShimPath`
149
170
  * @param mode - Strictness preset plus allowlisted compiler-option overrides
150
- * @param builtinShimSuffix - Optional shim text appended AFTER the consumer shim
171
+ * @param builtinShimSuffix - Optional shim text appended AFTER the consumer
172
+ * shim
151
173
  * @param rootScope - When set, only these repo-relative files become program
152
174
  * ROOTS; resolution (and the host allowlist) still spans all of
153
175
  * `resolutionOwned`, so a subset root's cross-patch imports type-check
154
176
  * against the real owning sources while unrelated owned files are never
155
177
  * 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).
178
+ * identical whether other owned files are roots or mere resolution targets.
158
179
  * @returns Diagnostics grouped per owning file plus run-level errors
159
180
  */
160
181
  export async function runCheckJsGrouped(repoDir, resolutionOwned, extraShimPath, projectRoot, mode, builtinShimSuffix, rootScope) {
@@ -188,7 +209,7 @@ export async function runCheckJsGrouped(repoDir, resolutionOwned, extraShimPath,
188
209
  const ownedAbsolute = new Set();
189
210
  const relByAbsolute = new Map();
190
211
  for (const rel of resolutionOwned) {
191
- const abs = resolve(repoDir, rel);
212
+ const abs = toTsPath(resolve(repoDir, rel));
192
213
  if (await pathExists(abs)) {
193
214
  if (rootScope === undefined || rootScope.has(rel))
194
215
  rootFiles.push(abs);
@@ -228,7 +249,7 @@ export async function runCheckJsGrouped(repoDir, resolutionOwned, extraShimPath,
228
249
  ],
229
250
  };
230
251
  }
231
- const shimPath = resolve(repoDir, SHIM_FILENAME);
252
+ const shimPath = toTsPath(resolve(repoDir, SHIM_FILENAME));
232
253
  rootFiles.push(shimPath);
233
254
  const strict = mode?.strict === true;
234
255
  const strictness = strict
@@ -504,15 +525,15 @@ export async function invokePatchLintCheckJsGrouped(repoDir, patchOwnedFiles, pa
504
525
  return runCheckJsGrouped(repoDir, patchOwnedFiles, patchLint.checkJsExtraShim, projectRoot, modeFromPatchLintConfig(patchLint), undefined, rootScope);
505
526
  }
506
527
  /**
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}.
528
+ * Cheap probe reproducing the only run-level ("global") checkJs findings the
529
+ * build path can produce — a missing `typescript` package and an unreadable
530
+ * consumer shim (`checkJsExtraShim`, and `checkJsTestShim` when
531
+ * `checkJsTestFiles` is on). The built program itself never contributes
532
+ * globals (see {@link runCheckJsGrouped}), so a warm all-cache-hit run can
533
+ * satisfy the "warm never reports less than cold" invariant with this probe
534
+ * instead of building the whole TypeScript program. Issue objects are
535
+ * byte-identical to the build path's, deduplicated by message like
536
+ * {@link runCheckJsTestFilesGrouped}.
516
537
  */
517
538
  export async function probeCheckJsGlobalIssues(patchLint, projectRoot) {
518
539
  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();