@hominis/fireforge 0.43.1 → 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 +126 -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 +17 -27
  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
@@ -10,6 +10,13 @@ export interface BuildArtifactCheck {
10
10
  ambiguous?: boolean;
11
11
  /** All candidate obj-* directories with build artifacts */
12
12
  objDirs?: string[];
13
+ /**
14
+ * Objdir name the active mozconfig declares via `MOZ_OBJDIR`, when the
15
+ * candidates were ambiguous and the declaration did not resolve to exactly
16
+ * one of them. Carried so the refusal can say the declaration was seen and
17
+ * did not help — that is itself the diagnosis.
18
+ */
19
+ declaredObjDir?: string;
13
20
  /** Build metadata points at a different source or objdir */
14
21
  metadataMismatch?: {
15
22
  objDir: string;
@@ -139,15 +146,8 @@ export interface BuildArtifactPreflightOptions {
139
146
  *
140
147
  * Takes an already-probed {@link BuildArtifactCheck} rather than probing
141
148
  * itself, so it stays a pure validator: callers keep their own
142
- * `hasBuildArtifacts` call (which their suites already stub) and this function
143
- * needs no test double of its own.
144
- *
145
- * Five commands carried a character-identical copy of this ladder, including
146
- * the same `ambiguous && objDirs && objDirs.length > 0` expression that
147
- * `BuildArtifactCheck`'s boolean-plus-optionals shape forces at every reader.
148
- * The shape itself is unchanged — it has several producers and a documented
149
- * refusal contract (see the containment predicates below) — but it is now
150
- * destructured in exactly one place.
149
+ * `hasBuildArtifacts` call (which their suites already stub) and this
150
+ * function needs no test double of its own.
151
151
  */
152
152
  export declare function assertBuildArtifacts(engineDir: string, buildCheck: BuildArtifactCheck, options: BuildArtifactPreflightOptions): void;
153
153
  /**
@@ -8,6 +8,7 @@ import { pathExists, readJson, readText, writeJson } from '../utils/fs.js';
8
8
  import { verbose } from '../utils/logger.js';
9
9
  import { getPlatform } from '../utils/platform.js';
10
10
  import { isObject, isString } from '../utils/validation.js';
11
+ import { extractMozObjdirName } from './mach-mozconfig.js';
11
12
  function validateBuildMozinfo(data) {
12
13
  if (!isObject(data)) {
13
14
  throw new Error('mozinfo metadata must be an object');
@@ -33,6 +34,26 @@ function validateBuildMozinfo(data) {
33
34
  }
34
35
  return mozinfo;
35
36
  }
37
+ /**
38
+ * Reads the objdir name the engine's mozconfig declares, or undefined when
39
+ * there is no mozconfig, it cannot be read, or it declares nothing.
40
+ *
41
+ * Fail-open by construction: this only ever narrows an ambiguity that would
42
+ * otherwise refuse, so an unreadable mozconfig costs nothing beyond the
43
+ * refusal the caller was already going to raise.
44
+ */
45
+ async function readDeclaredObjDirName(engineDir) {
46
+ try {
47
+ const mozconfigPath = join(engineDir, 'mozconfig');
48
+ if (!(await pathExists(mozconfigPath)))
49
+ return undefined;
50
+ return extractMozObjdirName(await readText(mozconfigPath));
51
+ }
52
+ catch (error) {
53
+ verbose(`Could not read mozconfig for MOZ_OBJDIR: ${toError(error).message}`);
54
+ return undefined;
55
+ }
56
+ }
36
57
  /**
37
58
  * Checks if build artifacts exist in the engine directory.
38
59
  * Looks for obj-* directories with a dist subdirectory. Detection is
@@ -61,10 +82,33 @@ export async function hasBuildArtifacts(engineDir) {
61
82
  const firstObjDir = objDirs[0];
62
83
  return firstObjDir ? { exists: false, objDir: firstObjDir } : { exists: false };
63
84
  }
85
+ let resolvedObjDirs = validObjDirs;
86
+ let declaredObjDir;
64
87
  if (validObjDirs.length > 1) {
65
- return { exists: true, ambiguous: true, objDirs: validObjDirs };
88
+ // An ambiguous glob is a question the mozconfig may already answer.
89
+ // Refusing when the active configuration NAMES the objdir sends the
90
+ // operator to rename a directory to satisfy a scan, when the thing
91
+ // that decides the build has said which one it is. The refusal is
92
+ // kept for the genuinely ambiguous case: a declaration that does not
93
+ // resolve to exactly one candidate selects nothing.
94
+ declaredObjDir = await readDeclaredObjDirName(engineDir);
95
+ const declaredMatches = declaredObjDir === undefined
96
+ ? []
97
+ : validObjDirs.filter((candidate) => candidate === declaredObjDir);
98
+ if (declaredMatches.length === 1) {
99
+ verbose(`Objdir ambiguity resolved by mozconfig MOZ_OBJDIR: ${declaredMatches[0] ?? ''}.`);
100
+ resolvedObjDirs = declaredMatches;
101
+ }
102
+ else {
103
+ return {
104
+ exists: true,
105
+ ambiguous: true,
106
+ objDirs: validObjDirs,
107
+ ...(declaredObjDir !== undefined ? { declaredObjDir } : {}),
108
+ };
109
+ }
66
110
  }
67
- const selectedObjDir = validObjDirs[0];
111
+ const selectedObjDir = resolvedObjDirs[0];
68
112
  if (!selectedObjDir) {
69
113
  return { exists: false };
70
114
  }
@@ -301,19 +345,12 @@ export async function attemptMozinfoRewrite(engineDir, objDir) {
301
345
  *
302
346
  * Takes an already-probed {@link BuildArtifactCheck} rather than probing
303
347
  * itself, so it stays a pure validator: callers keep their own
304
- * `hasBuildArtifacts` call (which their suites already stub) and this function
305
- * needs no test double of its own.
306
- *
307
- * Five commands carried a character-identical copy of this ladder, including
308
- * the same `ambiguous && objDirs && objDirs.length > 0` expression that
309
- * `BuildArtifactCheck`'s boolean-plus-optionals shape forces at every reader.
310
- * The shape itself is unchanged — it has several producers and a documented
311
- * refusal contract (see the containment predicates below) — but it is now
312
- * destructured in exactly one place.
348
+ * `hasBuildArtifacts` call (which their suites already stub) and this
349
+ * function needs no test double of its own.
313
350
  */
314
351
  export function assertBuildArtifacts(engineDir, buildCheck, options) {
315
352
  if (buildCheck.ambiguous && buildCheck.objDirs && buildCheck.objDirs.length > 0) {
316
- throw new AmbiguousBuildArtifactsError(buildCheck.objDirs);
353
+ throw new AmbiguousBuildArtifactsError(buildCheck.objDirs, buildCheck.declaredObjDir);
317
354
  }
318
355
  const mismatchMessage = buildArtifactMismatchMessage(engineDir, buildCheck, options.label);
319
356
  if (mismatchMessage) {
@@ -366,13 +403,14 @@ export async function findObjdirRelocationViolation(args) {
366
403
  if (actualObjDir !== expectedObjDir) {
367
404
  return `${objDir}/mozinfo.json topobjdir resolves to ${actualObjDir ?? '(absent)'}, expected ${expectedObjDir}`;
368
405
  }
369
- // The canonical no-primary-paths assertion (mirrors the opt-in real-mach
370
- // proof in scripts/run-full-firefox-integration.mjs): substring search on
371
- // the resolved primary engine dir is collision-safe against the tree's own
372
- // paths — `<primary>/.fireforge/trees/<name>/engine` never contains the
373
- // substring `<primary>/engine`. Scans exactly the configure-generated
374
- // root files; `config.status` is mandatory (checked above), the rest are
375
- // optional-if-absent because not every configure backend writes them.
406
+ // The canonical no-primary-paths assertion (mirrored by the opt-in
407
+ // real-mach proof in scripts/run-full-firefox-integration.mjs): substring
408
+ // search on the resolved primary engine dir is collision-safe against the
409
+ // tree's own paths — `<primary>/.fireforge/trees/<name>/engine` never
410
+ // contains the substring `<primary>/engine`. Scans exactly the
411
+ // configure-generated root files; `config.status` is mandatory (checked
412
+ // above), the rest are optional-if-absent because not every configure
413
+ // backend writes them.
376
414
  const forbidden = resolve(forbiddenDir);
377
415
  for (const name of ['config.status', 'backend.mk', 'Makefile', 'config/autoconf.mk']) {
378
416
  const filePath = join(objDirPath, ...name.split('/'));
@@ -19,14 +19,33 @@ export const MACH_ERROR_HINTS = [
19
19
  hint: 'A file registered under JS_PREFERENCE_PP_FILES contains no preprocessor directives. ' +
20
20
  'Use JS_PREFERENCE_FILES instead, or add at least one #filter / #expand directive to the file.',
21
21
  },
22
+ {
23
+ // mozbuild raises `UnsortedError` while READING a moz.build whose
24
+ // StrictOrderingOnAppendList entries are out of order, so `mach
25
+ // configure` dies before anything compiles. The ordering rule is the
26
+ // part operators get wrong: mozbuild sorts by `.lower()`
27
+ // (`StrictOrderingOnAppendList.ensure_sorted`), so an uppercase letter
28
+ // does NOT sort ahead of a lowercase one, and an entry that looks
29
+ // correctly placed by byte order can be rejected. mozbuild's own
30
+ // message names both entries ("We expected X but got Y") and survives
31
+ // to the operator through `extractMachConfigureError`, so the hint
32
+ // supplies only the rule and the remedy.
33
+ pattern: /mozbuild\.util\.UnsortedError|\bUnsortedError\b/,
34
+ hint: 'A moz.build list is out of order — mozbuild rejects the file while reading it, so ' +
35
+ 'configure dies before any compile. The entries are compared CASE-INSENSITIVELY ' +
36
+ '(mozbuild lowercases before comparing), so uppercase does not sort before lowercase: ' +
37
+ '"HominisEditorFilePaths.sys.mjs" belongs BEFORE "HominisEditorFiles.sys.mjs" ' +
38
+ '("filep" < "files"). The mozbuild error above names the file and both entries — move ' +
39
+ 'the entry to the position it names. "fireforge lint --per-patch" checks this ' +
40
+ '(mozbuild-unsorted-list) before a build, which is the cheaper place to catch it.',
41
+ },
22
42
  {
23
43
  // `mach package` inside `packager.py` dereferences a `None` sink when
24
- // the packaging input set cannot resolve an entry it expected — the
25
- // most common real-world cause is running `fireforge package` before
26
- // a full `fireforge build` has finished, so `obj-*/dist/` is missing
27
- // pieces the packager assumes exist. The hint points at that root
28
- // cause specifically; the broader "build failed" path has already
29
- // surfaced the raw traceback above this hint.
44
+ // the packaging input set cannot resolve an entry it expected — most
45
+ // commonly running `fireforge package` before a full `fireforge build`
46
+ // has finished, so `obj-*/dist/` is missing pieces the packager assumes
47
+ // exist. The broader "build failed" path has already surfaced the raw
48
+ // traceback above this hint.
30
49
  pattern: /packager\.py[\s\S]*?AttributeError: 'NoneType' object has no attribute 'open'|AttributeError: 'NoneType' object has no attribute 'open'[\s\S]*?packager\.py/,
31
50
  hint: '`mach package` tripped a `NoneType.open` inside `packager.py`. This is almost always a ' +
32
51
  'symptom of the packager being handed an incomplete `obj-*/dist/` tree — e.g. running ' +
@@ -37,14 +56,12 @@ export const MACH_ERROR_HINTS = [
37
56
  {
38
57
  // Upstream bindgen on some macOS libc++ SDK versions emits
39
58
  // `pub type basic_string___self_view = root::std::__1::basic_string_view<_CharT>;`
40
- // inside gecko-profiler's generated `bindings.rs`, but `_CharT` is
41
- // not in scope where the alias lands — so the Rust compile fails
42
- // with "cannot find type `_CharT`". The symptom is obscure and the
43
- // fix is external: a downstream consumer's patch queue may ship
44
- // `990-infra-bindgen-basic-string-workaround.patch`, which strips
45
- // the offending alias line post-generation. This hint surfaces the
46
- // workaround pointer alongside the raw bindgen output so operators
47
- // don't have to reverse-engineer the failure.
59
+ // inside gecko-profiler's generated `bindings.rs`, but `_CharT` is not
60
+ // in scope where the alias lands, so the Rust compile fails with
61
+ // "cannot find type `_CharT`". The fix is external: a consumer's patch
62
+ // queue may ship a workaround patch that strips the offending alias line
63
+ // post-generation. This hint surfaces that pointer alongside the raw
64
+ // bindgen output.
48
65
  pattern: /cannot find type `_CharT` in this scope[\s\S]*?gecko-profiler-|gecko-profiler-[\s\S]*?cannot find type `_CharT` in this scope/,
49
66
  hint: 'The Rust compile failed on a bindgen-generated `basic_string___self_view` alias in ' +
50
67
  'gecko-profiler/bindings.rs. This is an upstream bindgen output bug against some ' +
@@ -59,13 +76,12 @@ export const MACH_ERROR_HINTS = [
59
76
  {
60
77
  // Firefox declares per-release toolchain minimums in-tree
61
78
  // (`build/moz.configure/bindgen.configure` for cbindgen; mozboot's
62
- // MINIMUM_RUST_VERSION for rustc/cargo), and a source hop can move
63
- // them. The 152.0b7 → 153.0b8 source-refresh drill hit exactly this:
64
- // the first post-hop build died ~8s into `mach configure` with
65
- // "ERROR: cbindgen version 0.29.1 is too old. At least version
66
- // 0.29.4 is required." — and mach's own remediation text names
67
- // "./mach bootstrap", the wrong entry point for a FireForge-managed
68
- // repo. Pattern matches configure's cbindgen die() shape.
79
+ // MINIMUM_RUST_VERSION for rustc/cargo), and a source hop can move them.
80
+ // The failure lands ~8s into `mach configure` — e.g. "ERROR: cbindgen
81
+ // version 0.29.1 is too old. At least version 0.29.4 is required." —
82
+ // and mach's own remediation text names "./mach bootstrap", the wrong
83
+ // entry point for a FireForge-managed repo. Pattern matches configure's
84
+ // cbindgen die() shape.
69
85
  pattern: /\bversion [\d.]+ is too old\.?\s+At least version [\d.]+ is required/i,
70
86
  hint: 'A toolchain component is older than the minimum this Firefox source declares — typical ' +
71
87
  'after "fireforge download --force" moved the engine to a new Firefox major version. ' +
@@ -84,16 +100,13 @@ export const MACH_ERROR_HINTS = [
84
100
  'the build.',
85
101
  },
86
102
  {
87
- // When `mach build` fails mid-compile, mach's own shutdown pipeline still
88
- // runs its trailing "Config object not found by mach. / Configure
103
+ // When `mach build` fails mid-compile, mach's own shutdown pipeline
104
+ // still runs its trailing "Config object not found by mach. / Configure
89
105
  // complete! / Be sure to run |mach build|..." summary on the way out.
90
106
  // Those three lines are plain upstream mach output, printed AFTER the
91
- // non-zero exit code has already been established, and they look
92
- // deceptively like a success banner — the eval's Darwin 25 log had
93
- // operators double-checking whether `make` had actually failed. We do
94
- // not own those lines, but we can give the operator a specific nudge
95
- // that they are cosmetic post-failure output rather than a mixed
96
- // success/failure signal.
107
+ // non-zero exit code is established, and they read deceptively like a
108
+ // success banner. Nudge the operator that they are cosmetic
109
+ // post-failure output, not a mixed success/failure signal.
97
110
  pattern: /Config object not found by mach\.[\s\S]*?Configure complete!/,
98
111
  hint: 'Ignore the trailing "Config object not found by mach. / Configure complete!" block — ' +
99
112
  "that is mach's post-failure configure summary printed after the build already failed, " +
@@ -1,29 +1,28 @@
1
1
  /**
2
- * Terminal-echo filter for the KNOWN upstream mozsystemmonitor teardown
3
- * traceback (0.37.0 item 8).
2
+ * Terminal-echo filter for the known upstream mozsystemmonitor teardown
3
+ * traceback.
4
4
  *
5
- * Every headless test run against the 153-beta engine ends with an
5
+ * Headless test runs against recent engines can end with an
6
6
  * `AttributeError: 'SystemResourceMonitor' object has no attribute
7
7
  * 'stop_time'` traceback at harness teardown — upstream noise that sits
8
- * exactly where a reader looks for the failure summary. 0.36.0 already made
9
- * real failure lines beat this traceback in CLASSIFICATION; this filter
10
- * closes the PRESENTATION gap by collapsing the echoed traceback to one
11
- * labeled line.
8
+ * exactly where a reader looks for the failure summary. Real failure lines
9
+ * already beat this traceback in CLASSIFICATION; this filter closes the
10
+ * PRESENTATION gap by collapsing the echoed traceback to one labeled line.
12
11
  *
13
12
  * Scope is deliberately narrow:
14
13
  * - Only the terminal ECHO is filtered. The captured stdout/stderr strings
15
- * stay raw — the classifier (`test-harness-crash.ts`) depends on the
16
- * raw traceback for its green-summary override and secondary-noise
14
+ * stay raw — the classifier (`test-harness-crash.ts`) depends on the raw
15
+ * traceback for its green-summary override and secondary-noise
17
16
  * detection.
18
17
  * - Only the exact documented incident is collapsed, and every condition
19
18
  * must hold: an `AttributeError` on `SystemResourceMonitor` naming one
20
- * of the two known attributes (`stop_time`, `poll_interval` — the
21
- * 0.34.0 guard family), AND a `mozsystemmonitor/resourcemonitor.py`
22
- * stack frame, AND a previously-seen SUITE_END shutdown marker (shared
23
- * across the run's stdout/stderr filter instances — the marker usually
24
- * lands on stdout while the traceback lands on stderr). A novel
25
- * attribute, a novel exception type in resourcemonitor.py, or a
26
- * pre-shutdown occurrence is echoed verbatim, always.
19
+ * of the two known attributes (`stop_time`, `poll_interval`), AND a
20
+ * `mozsystemmonitor/resourcemonitor.py` stack frame, AND a
21
+ * previously-seen SUITE_END shutdown marker (shared across the run's
22
+ * stdout/stderr filter instances — the marker usually lands on stdout
23
+ * while the traceback lands on stderr). A novel attribute, a novel
24
+ * exception type in resourcemonitor.py, or a pre-shutdown occurrence is
25
+ * echoed verbatim, always.
27
26
  * - The hold buffer is bounded; on overflow the block is flushed verbatim
28
27
  * and the filter returns to pass-through, so output is never lost.
29
28
  */
@@ -1,30 +1,29 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * Terminal-echo filter for the KNOWN upstream mozsystemmonitor teardown
4
- * traceback (0.37.0 item 8).
3
+ * Terminal-echo filter for the known upstream mozsystemmonitor teardown
4
+ * traceback.
5
5
  *
6
- * Every headless test run against the 153-beta engine ends with an
6
+ * Headless test runs against recent engines can end with an
7
7
  * `AttributeError: 'SystemResourceMonitor' object has no attribute
8
8
  * 'stop_time'` traceback at harness teardown — upstream noise that sits
9
- * exactly where a reader looks for the failure summary. 0.36.0 already made
10
- * real failure lines beat this traceback in CLASSIFICATION; this filter
11
- * closes the PRESENTATION gap by collapsing the echoed traceback to one
12
- * labeled line.
9
+ * exactly where a reader looks for the failure summary. Real failure lines
10
+ * already beat this traceback in CLASSIFICATION; this filter closes the
11
+ * PRESENTATION gap by collapsing the echoed traceback to one labeled line.
13
12
  *
14
13
  * Scope is deliberately narrow:
15
14
  * - Only the terminal ECHO is filtered. The captured stdout/stderr strings
16
- * stay raw — the classifier (`test-harness-crash.ts`) depends on the
17
- * raw traceback for its green-summary override and secondary-noise
15
+ * stay raw — the classifier (`test-harness-crash.ts`) depends on the raw
16
+ * traceback for its green-summary override and secondary-noise
18
17
  * detection.
19
18
  * - Only the exact documented incident is collapsed, and every condition
20
19
  * must hold: an `AttributeError` on `SystemResourceMonitor` naming one
21
- * of the two known attributes (`stop_time`, `poll_interval` — the
22
- * 0.34.0 guard family), AND a `mozsystemmonitor/resourcemonitor.py`
23
- * stack frame, AND a previously-seen SUITE_END shutdown marker (shared
24
- * across the run's stdout/stderr filter instances — the marker usually
25
- * lands on stdout while the traceback lands on stderr). A novel
26
- * attribute, a novel exception type in resourcemonitor.py, or a
27
- * pre-shutdown occurrence is echoed verbatim, always.
20
+ * of the two known attributes (`stop_time`, `poll_interval`), AND a
21
+ * `mozsystemmonitor/resourcemonitor.py` stack frame, AND a
22
+ * previously-seen SUITE_END shutdown marker (shared across the run's
23
+ * stdout/stderr filter instances — the marker usually lands on stdout
24
+ * while the traceback lands on stderr). A novel attribute, a novel
25
+ * exception type in resourcemonitor.py, or a pre-shutdown occurrence is
26
+ * echoed verbatim, always.
28
27
  * - The hold buffer is bounded; on overflow the block is flushed verbatim
29
28
  * and the filter returns to pass-through, so output is never lost.
30
29
  */
@@ -32,10 +31,9 @@ const TRACEBACK_HEADER_PATTERN = /^Traceback \(most recent call last\)/;
32
31
  const CHAINED_EXCEPTION_CONNECTOR_PATTERN = /^(?:During handling of the above exception, another exception occurred:|The above exception was the direct cause of the following exception:)\s*$/;
33
32
  /**
34
33
  * Closed allowlist of the documented teardown family's attributes:
35
- * `stop_time` (the 0.37.0 item-8 incident) and `poll_interval` (the same
36
- * mozsystemmonitor init failure the 0.34.0 resource-guard family covers —
37
- * `test-harness-crash.ts` already classifies it as recognized noise). Any
38
- * other missing attribute is a NEW upstream defect and must print verbatim.
34
+ * `stop_time` and `poll_interval` (the same mozsystemmonitor init failure
35
+ * `test-harness-crash.ts` already classifies as recognized noise). Any other
36
+ * missing attribute is a NEW upstream defect and must print verbatim.
39
37
  */
40
38
  const KNOWN_TEARDOWN_ATTRIBUTE_ERROR_PATTERN = /AttributeError: 'SystemResourceMonitor' object has no attribute '(?:stop_time|poll_interval)'/;
41
39
  const RESOURCEMONITOR_FRAME_PATTERN = /mozsystemmonitor[/\\]resourcemonitor\.py/;
@@ -17,6 +17,20 @@ export interface MozconfigVariables {
17
17
  * Exported for testing.
18
18
  */
19
19
  export declare function extractWithBrandingPath(mozconfigContent: string): string | undefined;
20
+ /**
21
+ * Extracts the objdir NAME a mozconfig declares — the single trailing path
22
+ * segment, which is what the `obj-*` scan enumerates.
23
+ *
24
+ * `@TOPSRCDIR@` and a leading `./` are both spellings of "beside the
25
+ * source", which is the only arrangement FireForge's scan can see anyway;
26
+ * an absolute path outside the engine directory reduces to its basename and
27
+ * simply will not match a candidate, which is the correct outcome — a
28
+ * declaration that names something the scan cannot see must not select
29
+ * anything.
30
+ *
31
+ * Returns undefined when nothing is declared. Exported for testing.
32
+ */
33
+ export declare function extractMozObjdirName(mozconfigContent: string): string | undefined;
20
34
  /**
21
35
  * Preflights the just-written mozconfig against the branding tree FireForge
22
36
  * set up. A drift between the two is silent-corruption territory — the
@@ -41,6 +41,36 @@ export function extractWithBrandingPath(mozconfigContent) {
41
41
  const last = matches.at(-1);
42
42
  return last?.[1];
43
43
  }
44
+ /**
45
+ * Matches a `MOZ_OBJDIR=<path>` declaration in a mozconfig. Both spellings
46
+ * mach honours are accepted (`mk_add_options MOZ_OBJDIR=…`, the documented
47
+ * one, and a bare `export MOZ_OBJDIR=…`), and the value may be quoted.
48
+ * Last-write-wins for the same reason as {@link WITH_BRANDING_PATTERN}: a
49
+ * mozconfig is shell.
50
+ */
51
+ const MOZ_OBJDIR_PATTERN = /^\s*(?:mk_add_options\s+|export\s+)?MOZ_OBJDIR\s*=\s*["']?([^"'\s#]+)/gm;
52
+ /**
53
+ * Extracts the objdir NAME a mozconfig declares — the single trailing path
54
+ * segment, which is what the `obj-*` scan enumerates.
55
+ *
56
+ * `@TOPSRCDIR@` and a leading `./` are both spellings of "beside the
57
+ * source", which is the only arrangement FireForge's scan can see anyway;
58
+ * an absolute path outside the engine directory reduces to its basename and
59
+ * simply will not match a candidate, which is the correct outcome — a
60
+ * declaration that names something the scan cannot see must not select
61
+ * anything.
62
+ *
63
+ * Returns undefined when nothing is declared. Exported for testing.
64
+ */
65
+ export function extractMozObjdirName(mozconfigContent) {
66
+ const matches = [...mozconfigContent.matchAll(MOZ_OBJDIR_PATTERN)];
67
+ const raw = matches.at(-1)?.[1];
68
+ if (raw === undefined)
69
+ return undefined;
70
+ const trimmed = raw.replace(/\/+$/, '');
71
+ const segment = trimmed.split('/').at(-1);
72
+ return segment !== undefined && segment.length > 0 ? segment : undefined;
73
+ }
44
74
  /**
45
75
  * Preflights the just-written mozconfig against the branding tree FireForge
46
76
  * set up. A drift between the two is silent-corruption territory — the