@hominis/fireforge 0.45.0 → 0.46.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/CHANGELOG.md +409 -446
  2. package/dist/bin/fireforge.d.ts +1 -1
  3. package/dist/bin/fireforge.js +21 -15
  4. package/dist/build-info.json +4 -4
  5. package/dist/src/cli-usage-error.d.ts +46 -0
  6. package/dist/src/cli-usage-error.js +81 -0
  7. package/dist/src/cli.d.ts +7 -2
  8. package/dist/src/cli.js +47 -47
  9. package/dist/src/commands/bootstrap-checks.js +2 -1
  10. package/dist/src/commands/bootstrap.js +3 -4
  11. package/dist/src/commands/build.js +27 -17
  12. package/dist/src/commands/config.js +9 -9
  13. package/dist/src/commands/destructive-decision.d.ts +19 -0
  14. package/dist/src/commands/destructive-decision.js +31 -0
  15. package/dist/src/commands/discard.js +5 -5
  16. package/dist/src/commands/doctor-check-core.d.ts +4 -10
  17. package/dist/src/commands/doctor-check-core.js +0 -8
  18. package/dist/src/commands/doctor-external-toolchains.js +2 -2
  19. package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
  20. package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
  21. package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
  22. package/dist/src/commands/doctor-furnace-jar.js +1 -1
  23. package/dist/src/commands/doctor-furnace.js +22 -22
  24. package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
  25. package/dist/src/commands/doctor-orphaned-harness.js +14 -23
  26. package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
  27. package/dist/src/commands/doctor-patch-manifest.js +7 -6
  28. package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
  29. package/dist/src/commands/doctor-source-pin.d.ts +12 -12
  30. package/dist/src/commands/doctor-source-pin.js +14 -14
  31. package/dist/src/commands/doctor-working-tree.d.ts +3 -3
  32. package/dist/src/commands/doctor-working-tree.js +3 -3
  33. package/dist/src/commands/doctor.d.ts +3 -1
  34. package/dist/src/commands/doctor.js +15 -16
  35. package/dist/src/commands/download.js +50 -37
  36. package/dist/src/commands/export-all.js +29 -12
  37. package/dist/src/commands/export-flow.d.ts +5 -5
  38. package/dist/src/commands/export-flow.js +29 -59
  39. package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
  40. package/dist/src/commands/export-placement-conflicts.js +12 -12
  41. package/dist/src/commands/export-placement-gate.d.ts +2 -2
  42. package/dist/src/commands/export-placement-gate.js +7 -13
  43. package/dist/src/commands/export-placement-policy.d.ts +1 -1
  44. package/dist/src/commands/export-placement-policy.js +4 -6
  45. package/dist/src/commands/export-shared.d.ts +51 -32
  46. package/dist/src/commands/export-shared.js +17 -32
  47. package/dist/src/commands/export.js +14 -5
  48. package/dist/src/commands/furnace/apply.js +16 -16
  49. package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
  50. package/dist/src/commands/furnace/authoring-config.js +19 -0
  51. package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
  52. package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
  53. package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
  54. package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
  55. package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
  56. package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
  57. package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
  58. package/dist/src/commands/furnace/chrome-doc.js +18 -18
  59. package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
  60. package/dist/src/commands/furnace/create-browser-test.js +7 -12
  61. package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
  62. package/dist/src/commands/furnace/create-dry-run.js +6 -9
  63. package/dist/src/commands/furnace/create-features.d.ts +2 -2
  64. package/dist/src/commands/furnace/create-features.js +2 -2
  65. package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
  66. package/dist/src/commands/furnace/create-mochikit.js +7 -7
  67. package/dist/src/commands/furnace/create-templates.d.ts +31 -15
  68. package/dist/src/commands/furnace/create-templates.js +20 -19
  69. package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
  70. package/dist/src/commands/furnace/create-xpcshell.js +8 -8
  71. package/dist/src/commands/furnace/create.d.ts +1 -1
  72. package/dist/src/commands/furnace/create.js +35 -29
  73. package/dist/src/commands/furnace/deploy.js +15 -6
  74. package/dist/src/commands/furnace/diff.js +7 -7
  75. package/dist/src/commands/furnace/index.js +1 -1
  76. package/dist/src/commands/furnace/init.js +17 -16
  77. package/dist/src/commands/furnace/list.js +2 -2
  78. package/dist/src/commands/furnace/override.d.ts +1 -1
  79. package/dist/src/commands/furnace/override.js +43 -34
  80. package/dist/src/commands/furnace/preview.js +17 -17
  81. package/dist/src/commands/furnace/refresh.js +15 -7
  82. package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
  83. package/dist/src/commands/furnace/remove-mutations.js +19 -19
  84. package/dist/src/commands/furnace/remove-state.d.ts +1 -1
  85. package/dist/src/commands/furnace/remove-state.js +1 -1
  86. package/dist/src/commands/furnace/remove.js +4 -8
  87. package/dist/src/commands/furnace/rename-browser-test.js +10 -15
  88. package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
  89. package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
  90. package/dist/src/commands/furnace/rename.js +36 -36
  91. package/dist/src/commands/furnace/scan.js +3 -3
  92. package/dist/src/commands/furnace/status.js +19 -16
  93. package/dist/src/commands/furnace/sync.js +6 -6
  94. package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
  95. package/dist/src/commands/furnace/test-file-name.js +39 -0
  96. package/dist/src/commands/furnace/validate.js +11 -12
  97. package/dist/src/commands/furnace/validation-output.d.ts +21 -9
  98. package/dist/src/commands/furnace/validation-output.js +3 -8
  99. package/dist/src/commands/import.js +22 -29
  100. package/dist/src/commands/lint-per-patch.d.ts +2 -2
  101. package/dist/src/commands/lint-per-patch.js +27 -12
  102. package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
  103. package/dist/src/commands/lint-per-run-checkjs.js +14 -15
  104. package/dist/src/commands/lint-report.d.ts +3 -3
  105. package/dist/src/commands/lint-report.js +4 -4
  106. package/dist/src/commands/lint.d.ts +5 -4
  107. package/dist/src/commands/lint.js +36 -36
  108. package/dist/src/commands/manifest.d.ts +4 -4
  109. package/dist/src/commands/manifest.js +1 -1
  110. package/dist/src/commands/package.js +4 -6
  111. package/dist/src/commands/patch/compact.d.ts +2 -2
  112. package/dist/src/commands/patch/compact.js +19 -20
  113. package/dist/src/commands/patch/delete.d.ts +1 -1
  114. package/dist/src/commands/patch/delete.js +23 -33
  115. package/dist/src/commands/patch/entry-projection.d.ts +13 -0
  116. package/dist/src/commands/patch/entry-projection.js +24 -0
  117. package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
  118. package/dist/src/commands/patch/lint-ignore.js +33 -44
  119. package/dist/src/commands/patch/move-files-create.d.ts +2 -2
  120. package/dist/src/commands/patch/move-files-create.js +29 -15
  121. package/dist/src/commands/patch/move-files-into.d.ts +2 -2
  122. package/dist/src/commands/patch/move-files-into.js +41 -37
  123. package/dist/src/commands/patch/move-files.js +5 -14
  124. package/dist/src/commands/patch/patch-context.d.ts +1 -1
  125. package/dist/src/commands/patch/rename.d.ts +4 -4
  126. package/dist/src/commands/patch/rename.js +35 -49
  127. package/dist/src/commands/patch/reorder.js +35 -48
  128. package/dist/src/commands/patch/split-plan.d.ts +7 -8
  129. package/dist/src/commands/patch/split-plan.js +10 -13
  130. package/dist/src/commands/patch/split.d.ts +2 -2
  131. package/dist/src/commands/patch/split.js +50 -48
  132. package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
  133. package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
  134. package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
  135. package/dist/src/commands/patch/staged-dependency.js +22 -28
  136. package/dist/src/commands/patch/tier.d.ts +2 -2
  137. package/dist/src/commands/patch/tier.js +20 -30
  138. package/dist/src/commands/patch-rename-map.d.ts +19 -0
  139. package/dist/src/commands/patch-rename-map.js +36 -0
  140. package/dist/src/commands/pending-resolution.d.ts +15 -0
  141. package/dist/src/commands/pending-resolution.js +25 -0
  142. package/dist/src/commands/re-export-adjacent.d.ts +25 -3
  143. package/dist/src/commands/re-export-adjacent.js +40 -24
  144. package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
  145. package/dist/src/commands/re-export-bulk-scan.js +23 -27
  146. package/dist/src/commands/re-export-drift.d.ts +10 -10
  147. package/dist/src/commands/re-export-drift.js +33 -33
  148. package/dist/src/commands/re-export-files.d.ts +2 -3
  149. package/dist/src/commands/re-export-files.js +52 -44
  150. package/dist/src/commands/re-export-lint.d.ts +29 -30
  151. package/dist/src/commands/re-export-lint.js +36 -29
  152. package/dist/src/commands/re-export-options.d.ts +1 -1
  153. package/dist/src/commands/re-export-options.js +1 -1
  154. package/dist/src/commands/re-export-register.d.ts +1 -1
  155. package/dist/src/commands/re-export-register.js +1 -1
  156. package/dist/src/commands/re-export-scan.d.ts +1 -1
  157. package/dist/src/commands/re-export-scan.js +12 -9
  158. package/dist/src/commands/re-export-single.d.ts +23 -4
  159. package/dist/src/commands/re-export-single.js +39 -31
  160. package/dist/src/commands/re-export.js +35 -17
  161. package/dist/src/commands/rebase/abort.js +9 -14
  162. package/dist/src/commands/rebase/continue.js +20 -19
  163. package/dist/src/commands/rebase/index.d.ts +1 -1
  164. package/dist/src/commands/rebase/index.js +5 -5
  165. package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
  166. package/dist/src/commands/rebase/patch-loop.js +20 -24
  167. package/dist/src/commands/register.js +5 -5
  168. package/dist/src/commands/reset.js +1 -1
  169. package/dist/src/commands/resolve.d.ts +2 -2
  170. package/dist/src/commands/resolve.js +21 -13
  171. package/dist/src/commands/run.d.ts +0 -13
  172. package/dist/src/commands/run.js +38 -51
  173. package/dist/src/commands/setup-support.d.ts +16 -4
  174. package/dist/src/commands/setup-support.js +20 -20
  175. package/dist/src/commands/setup.js +4 -10
  176. package/dist/src/commands/source.js +9 -2
  177. package/dist/src/commands/status-check.d.ts +3 -3
  178. package/dist/src/commands/status-check.js +6 -6
  179. package/dist/src/commands/status-json.d.ts +14 -13
  180. package/dist/src/commands/status-json.js +9 -8
  181. package/dist/src/commands/status-output.d.ts +3 -3
  182. package/dist/src/commands/status-output.js +5 -5
  183. package/dist/src/commands/status-ownership.d.ts +3 -3
  184. package/dist/src/commands/status-ownership.js +3 -3
  185. package/dist/src/commands/status.js +25 -26
  186. package/dist/src/commands/test-build-phase.d.ts +3 -3
  187. package/dist/src/commands/test-build-phase.js +48 -24
  188. package/dist/src/commands/test-diagnose.d.ts +1 -1
  189. package/dist/src/commands/test-diagnose.js +20 -20
  190. package/dist/src/commands/test-modes.d.ts +4 -4
  191. package/dist/src/commands/test-modes.js +4 -5
  192. package/dist/src/commands/test-register.js +5 -3
  193. package/dist/src/commands/test-run.d.ts +11 -11
  194. package/dist/src/commands/test-run.js +40 -33
  195. package/dist/src/commands/test-stale-gate.d.ts +12 -12
  196. package/dist/src/commands/test-stale-gate.js +17 -17
  197. package/dist/src/commands/test-verdict.d.ts +19 -5
  198. package/dist/src/commands/test-verdict.js +26 -11
  199. package/dist/src/commands/test.d.ts +3 -3
  200. package/dist/src/commands/test.js +73 -36
  201. package/dist/src/commands/token-coverage.js +3 -3
  202. package/dist/src/commands/token-list.d.ts +26 -0
  203. package/dist/src/commands/token-list.js +153 -0
  204. package/dist/src/commands/token.js +26 -10
  205. package/dist/src/commands/tree.js +26 -21
  206. package/dist/src/commands/typecheck.d.ts +6 -6
  207. package/dist/src/commands/typecheck.js +16 -16
  208. package/dist/src/commands/verify.d.ts +3 -3
  209. package/dist/src/commands/verify.js +10 -10
  210. package/dist/src/commands/watch.js +11 -11
  211. package/dist/src/commands/wire.js +17 -16
  212. package/dist/src/core/ast-utils.d.ts +7 -7
  213. package/dist/src/core/ast-utils.js +8 -8
  214. package/dist/src/core/branding.d.ts +5 -12
  215. package/dist/src/core/branding.js +6 -5
  216. package/dist/src/core/browser-wire.d.ts +1 -1
  217. package/dist/src/core/browser-wire.js +10 -7
  218. package/dist/src/core/build-audit-platform.d.ts +32 -3
  219. package/dist/src/core/build-audit-platform.js +153 -13
  220. package/dist/src/core/build-audit-registration.d.ts +5 -5
  221. package/dist/src/core/build-audit-registration.js +10 -9
  222. package/dist/src/core/build-audit-resolve.d.ts +5 -5
  223. package/dist/src/core/build-audit-resolve.js +6 -6
  224. package/dist/src/core/build-audit-skip.d.ts +57 -0
  225. package/dist/src/core/build-audit-skip.js +112 -0
  226. package/dist/src/core/build-audit-transforms.d.ts +2 -2
  227. package/dist/src/core/build-audit-transforms.js +3 -3
  228. package/dist/src/core/build-audit.d.ts +21 -8
  229. package/dist/src/core/build-audit.js +142 -40
  230. package/dist/src/core/build-baseline-types.d.ts +19 -18
  231. package/dist/src/core/build-baseline-types.js +1 -1
  232. package/dist/src/core/build-baseline.d.ts +48 -31
  233. package/dist/src/core/build-baseline.js +20 -43
  234. package/dist/src/core/build-jar-escalation.d.ts +8 -8
  235. package/dist/src/core/build-jar-escalation.js +18 -17
  236. package/dist/src/core/build-overwrite-guard.d.ts +4 -4
  237. package/dist/src/core/build-overwrite-guard.js +14 -14
  238. package/dist/src/core/build-prepare.d.ts +4 -12
  239. package/dist/src/core/build-prepare.js +22 -26
  240. package/dist/src/core/config-mutate.js +4 -4
  241. package/dist/src/core/config-paths.d.ts +2 -6
  242. package/dist/src/core/config-paths.js +4 -2
  243. package/dist/src/core/config-state.d.ts +0 -6
  244. package/dist/src/core/config-state.js +3 -21
  245. package/dist/src/core/config-validate-build-audit.d.ts +8 -0
  246. package/dist/src/core/config-validate-build-audit.js +80 -0
  247. package/dist/src/core/config-validate-file-size.d.ts +1 -1
  248. package/dist/src/core/config-validate-file-size.js +3 -3
  249. package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
  250. package/dist/src/core/config-validate-patch-policy.js +3 -3
  251. package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
  252. package/dist/src/core/config-validate-test-toolchains.js +4 -5
  253. package/dist/src/core/config-validate.js +22 -12
  254. package/dist/src/core/config.d.ts +12 -12
  255. package/dist/src/core/config.js +21 -25
  256. package/dist/src/core/coverage-extend.d.ts +16 -16
  257. package/dist/src/core/coverage-extend.js +20 -20
  258. package/dist/src/core/destructive.d.ts +14 -14
  259. package/dist/src/core/destructive.js +9 -9
  260. package/dist/src/core/diff-hunks.d.ts +2 -2
  261. package/dist/src/core/diff-hunks.js +7 -7
  262. package/dist/src/core/discard-baseline.d.ts +10 -10
  263. package/dist/src/core/discard-baseline.js +22 -23
  264. package/dist/src/core/display-state.d.ts +11 -11
  265. package/dist/src/core/display-state.js +12 -12
  266. package/dist/src/core/engine-changes.d.ts +2 -2
  267. package/dist/src/core/engine-changes.js +2 -2
  268. package/dist/src/core/engine-precondition.d.ts +5 -13
  269. package/dist/src/core/engine-precondition.js +5 -10
  270. package/dist/src/core/engine-session-lock.d.ts +18 -18
  271. package/dist/src/core/engine-session-lock.js +50 -54
  272. package/dist/src/core/export-moved-code-shape.d.ts +7 -7
  273. package/dist/src/core/export-moved-code-shape.js +10 -10
  274. package/dist/src/core/file-lock-owner.d.ts +103 -0
  275. package/dist/src/core/file-lock-owner.js +259 -0
  276. package/dist/src/core/file-lock.d.ts +14 -19
  277. package/dist/src/core/file-lock.js +90 -128
  278. package/dist/src/core/firefox-cache.d.ts +13 -1
  279. package/dist/src/core/firefox-cache.js +61 -36
  280. package/dist/src/core/firefox-download.d.ts +15 -0
  281. package/dist/src/core/firefox-download.js +38 -22
  282. package/dist/src/core/firefox-extract.d.ts +8 -7
  283. package/dist/src/core/firefox-extract.js +45 -27
  284. package/dist/src/core/firefox.d.ts +34 -36
  285. package/dist/src/core/firefox.js +13 -44
  286. package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
  287. package/dist/src/core/furnace-apply-dry-run.js +2 -8
  288. package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
  289. package/dist/src/core/furnace-apply-ftl.js +8 -8
  290. package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
  291. package/dist/src/core/furnace-apply-helpers.js +28 -39
  292. package/dist/src/core/furnace-apply-output.js +1 -1
  293. package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
  294. package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
  295. package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
  296. package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
  297. package/dist/src/core/furnace-apply.d.ts +4 -4
  298. package/dist/src/core/furnace-apply.js +50 -29
  299. package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
  300. package/dist/src/core/furnace-checksum-utils.js +5 -5
  301. package/dist/src/core/furnace-config-custom.d.ts +1 -1
  302. package/dist/src/core/furnace-config-custom.js +2 -2
  303. package/dist/src/core/furnace-config-order.js +1 -1
  304. package/dist/src/core/furnace-config-tokens.d.ts +3 -3
  305. package/dist/src/core/furnace-config-tokens.js +3 -3
  306. package/dist/src/core/furnace-config-validate.js +2 -2
  307. package/dist/src/core/furnace-config.d.ts +5 -5
  308. package/dist/src/core/furnace-config.js +40 -53
  309. package/dist/src/core/furnace-constants.d.ts +6 -6
  310. package/dist/src/core/furnace-constants.js +9 -8
  311. package/dist/src/core/furnace-css-fragments.d.ts +6 -6
  312. package/dist/src/core/furnace-css-fragments.js +11 -11
  313. package/dist/src/core/furnace-dir-entry.d.ts +20 -0
  314. package/dist/src/core/furnace-dir-entry.js +21 -0
  315. package/dist/src/core/furnace-jsconfig.d.ts +7 -7
  316. package/dist/src/core/furnace-jsconfig.js +22 -20
  317. package/dist/src/core/furnace-operation.d.ts +22 -19
  318. package/dist/src/core/furnace-operation.js +38 -34
  319. package/dist/src/core/furnace-precondition.d.ts +10 -10
  320. package/dist/src/core/furnace-precondition.js +8 -8
  321. package/dist/src/core/furnace-refresh.d.ts +18 -6
  322. package/dist/src/core/furnace-refresh.js +5 -8
  323. package/dist/src/core/furnace-registration-ast.d.ts +2 -3
  324. package/dist/src/core/furnace-registration-ast.js +9 -12
  325. package/dist/src/core/furnace-registration-remove.d.ts +4 -4
  326. package/dist/src/core/furnace-registration-remove.js +6 -6
  327. package/dist/src/core/furnace-registration-validate.d.ts +2 -2
  328. package/dist/src/core/furnace-registration-validate.js +2 -2
  329. package/dist/src/core/furnace-registration.d.ts +7 -6
  330. package/dist/src/core/furnace-registration.js +29 -36
  331. package/dist/src/core/furnace-rollback.d.ts +1 -1
  332. package/dist/src/core/furnace-rollback.js +5 -5
  333. package/dist/src/core/furnace-scanner.js +3 -6
  334. package/dist/src/core/furnace-stale-export.d.ts +17 -16
  335. package/dist/src/core/furnace-stale-export.js +16 -15
  336. package/dist/src/core/furnace-staleness.d.ts +2 -2
  337. package/dist/src/core/furnace-staleness.js +2 -2
  338. package/dist/src/core/furnace-state-persist.d.ts +12 -12
  339. package/dist/src/core/furnace-state-persist.js +10 -10
  340. package/dist/src/core/furnace-step-errors.d.ts +6 -6
  341. package/dist/src/core/furnace-step-errors.js +6 -6
  342. package/dist/src/core/furnace-validate-accessibility.js +14 -14
  343. package/dist/src/core/furnace-validate-compatibility.js +9 -9
  344. package/dist/src/core/furnace-validate-registration.d.ts +2 -2
  345. package/dist/src/core/furnace-validate-registration.js +18 -20
  346. package/dist/src/core/furnace-validate-structure.d.ts +1 -1
  347. package/dist/src/core/furnace-validate-structure.js +4 -4
  348. package/dist/src/core/furnace-validate.js +9 -9
  349. package/dist/src/core/furnace-version-drift.d.ts +5 -5
  350. package/dist/src/core/furnace-version-drift.js +5 -5
  351. package/dist/src/core/git-base.d.ts +6 -4
  352. package/dist/src/core/git-base.js +29 -7
  353. package/dist/src/core/git-diff-new-file.d.ts +40 -0
  354. package/dist/src/core/git-diff-new-file.js +119 -0
  355. package/dist/src/core/git-diff.d.ts +13 -13
  356. package/dist/src/core/git-diff.js +121 -189
  357. package/dist/src/core/git-file-ops.d.ts +6 -13
  358. package/dist/src/core/git-file-ops.js +11 -35
  359. package/dist/src/core/git-readonly-index.d.ts +12 -14
  360. package/dist/src/core/git-readonly-index.js +12 -16
  361. package/dist/src/core/git-status.d.ts +9 -2
  362. package/dist/src/core/git-status.js +23 -11
  363. package/dist/src/core/git.d.ts +3 -9
  364. package/dist/src/core/git.js +28 -57
  365. package/dist/src/core/harness-orphans.d.ts +17 -17
  366. package/dist/src/core/harness-orphans.js +28 -27
  367. package/dist/src/core/history-log.d.ts +19 -0
  368. package/dist/src/core/history-log.js +29 -0
  369. package/dist/src/core/license-headers.d.ts +19 -18
  370. package/dist/src/core/license-headers.js +29 -28
  371. package/dist/src/core/mach-build-artifacts.d.ts +21 -21
  372. package/dist/src/core/mach-build-artifacts.js +23 -23
  373. package/dist/src/core/mach-error-hints.d.ts +5 -10
  374. package/dist/src/core/mach-error-hints.js +14 -14
  375. package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
  376. package/dist/src/core/mach-known-noise-filter.js +57 -56
  377. package/dist/src/core/mach-mozconfig.d.ts +6 -6
  378. package/dist/src/core/mach-mozconfig.js +17 -16
  379. package/dist/src/core/mach-python.d.ts +3 -0
  380. package/dist/src/core/mach-python.js +13 -7
  381. package/dist/src/core/mach-resource-shim.d.ts +24 -12
  382. package/dist/src/core/mach-resource-shim.js +124 -21
  383. package/dist/src/core/mach.d.ts +59 -73
  384. package/dist/src/core/mach.js +47 -115
  385. package/dist/src/core/marionette-port.d.ts +15 -30
  386. package/dist/src/core/marionette-port.js +46 -89
  387. package/dist/src/core/marionette-preflight.d.ts +6 -6
  388. package/dist/src/core/marionette-preflight.js +32 -50
  389. package/dist/src/core/markdown-table.d.ts +9 -9
  390. package/dist/src/core/markdown-table.js +14 -14
  391. package/dist/src/core/mochitest-server-port.d.ts +8 -8
  392. package/dist/src/core/mochitest-server-port.js +17 -17
  393. package/dist/src/core/module-resolution-preflight.d.ts +8 -8
  394. package/dist/src/core/module-resolution-preflight.js +11 -11
  395. package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
  396. package/dist/src/core/moz-manifest-helpers.js +7 -7
  397. package/dist/src/core/moz-manifest-register.d.ts +1 -1
  398. package/dist/src/core/moz-manifest-register.js +2 -2
  399. package/dist/src/core/moz-manifest-rules.js +46 -42
  400. package/dist/src/core/moz-manifest-tokenizers.js +1 -1
  401. package/dist/src/core/ownership-table.d.ts +5 -5
  402. package/dist/src/core/ownership-table.js +7 -7
  403. package/dist/src/core/parser-fallback.d.ts +3 -3
  404. package/dist/src/core/parser-fallback.js +3 -3
  405. package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
  406. package/dist/src/core/patch-apply-fuzz.js +13 -13
  407. package/dist/src/core/patch-apply.d.ts +13 -14
  408. package/dist/src/core/patch-apply.js +36 -42
  409. package/dist/src/core/patch-export-coverage.d.ts +0 -9
  410. package/dist/src/core/patch-export-coverage.js +1 -30
  411. package/dist/src/core/patch-export-update.d.ts +21 -4
  412. package/dist/src/core/patch-export-update.js +7 -6
  413. package/dist/src/core/patch-export.d.ts +20 -30
  414. package/dist/src/core/patch-export.js +55 -77
  415. package/dist/src/core/patch-files.d.ts +0 -4
  416. package/dist/src/core/patch-files.js +0 -11
  417. package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
  418. package/dist/src/core/patch-identifier-suggest.js +4 -4
  419. package/dist/src/core/patch-lint-binary.d.ts +12 -18
  420. package/dist/src/core/patch-lint-cache.d.ts +18 -2
  421. package/dist/src/core/patch-lint-cache.js +16 -19
  422. package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
  423. package/dist/src/core/patch-lint-checkjs.js +78 -64
  424. package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
  425. package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
  426. package/dist/src/core/patch-lint-creators.d.ts +5 -9
  427. package/dist/src/core/patch-lint-creators.js +3 -3
  428. package/dist/src/core/patch-lint-cross.d.ts +27 -19
  429. package/dist/src/core/patch-lint-cross.js +67 -110
  430. package/dist/src/core/patch-lint-css.d.ts +1 -1
  431. package/dist/src/core/patch-lint-css.js +15 -11
  432. package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
  433. package/dist/src/core/patch-lint-diff-tag.js +5 -5
  434. package/dist/src/core/patch-lint-diff.d.ts +4 -4
  435. package/dist/src/core/patch-lint-diff.js +4 -4
  436. package/dist/src/core/patch-lint-file-size.d.ts +3 -3
  437. package/dist/src/core/patch-lint-file-size.js +6 -6
  438. package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
  439. package/dist/src/core/patch-lint-forward-registration.js +210 -0
  440. package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
  441. package/dist/src/core/patch-lint-jsdoc.js +46 -46
  442. package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
  443. package/dist/src/core/patch-lint-module-registration.js +1 -1
  444. package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
  445. package/dist/src/core/patch-lint-mozbuild.js +10 -10
  446. package/dist/src/core/patch-lint-observer.d.ts +3 -3
  447. package/dist/src/core/patch-lint-observer.js +7 -7
  448. package/dist/src/core/patch-lint-ownership.d.ts +6 -6
  449. package/dist/src/core/patch-lint-ownership.js +6 -6
  450. package/dist/src/core/patch-lint-prettier.d.ts +6 -6
  451. package/dist/src/core/patch-lint-prettier.js +7 -7
  452. package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
  453. package/dist/src/core/patch-lint-queue-types.js +12 -0
  454. package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
  455. package/dist/src/core/patch-lint-staged-registration.js +90 -0
  456. package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
  457. package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
  458. package/dist/src/core/patch-lint.d.ts +41 -35
  459. package/dist/src/core/patch-lint.js +52 -49
  460. package/dist/src/core/patch-lock.d.ts +1 -1
  461. package/dist/src/core/patch-lock.js +11 -11
  462. package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
  463. package/dist/src/core/patch-manifest-consistency.js +16 -17
  464. package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
  465. package/dist/src/core/patch-manifest-files-affected.js +3 -3
  466. package/dist/src/core/patch-manifest-io.d.ts +14 -14
  467. package/dist/src/core/patch-manifest-io.js +35 -34
  468. package/dist/src/core/patch-manifest-query.d.ts +1 -1
  469. package/dist/src/core/patch-manifest-query.js +4 -4
  470. package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
  471. package/dist/src/core/patch-manifest-resolve.js +7 -7
  472. package/dist/src/core/patch-manifest-validate.js +3 -3
  473. package/dist/src/core/patch-manifest.d.ts +2 -2
  474. package/dist/src/core/patch-manifest.js +2 -2
  475. package/dist/src/core/patch-parse.d.ts +32 -21
  476. package/dist/src/core/patch-parse.js +40 -15
  477. package/dist/src/core/patch-policy.js +15 -27
  478. package/dist/src/core/patch-registration-refs.d.ts +4 -4
  479. package/dist/src/core/patch-registration-refs.js +7 -7
  480. package/dist/src/core/patch-source-metadata.d.ts +1 -3
  481. package/dist/src/core/patch-source-metadata.js +0 -4
  482. package/dist/src/core/patch-transform.d.ts +8 -16
  483. package/dist/src/core/patch-transform.js +13 -23
  484. package/dist/src/core/process-cpu-time.d.ts +1 -1
  485. package/dist/src/core/process-cpu-time.js +6 -6
  486. package/dist/src/core/rebase-session.d.ts +9 -15
  487. package/dist/src/core/rebase-session.js +13 -25
  488. package/dist/src/core/register-browser-content.js +3 -2
  489. package/dist/src/core/register-browser-test.js +2 -1
  490. package/dist/src/core/register-module.js +2 -1
  491. package/dist/src/core/register-result.d.ts +1 -1
  492. package/dist/src/core/register-result.js +1 -1
  493. package/dist/src/core/register-scaffold.d.ts +2 -2
  494. package/dist/src/core/register-scaffold.js +8 -7
  495. package/dist/src/core/register-shared-css.d.ts +3 -3
  496. package/dist/src/core/register-shared-css.js +6 -5
  497. package/dist/src/core/register-xpcshell-test.d.ts +2 -2
  498. package/dist/src/core/register-xpcshell-test.js +2 -2
  499. package/dist/src/core/run-log-redact.d.ts +38 -0
  500. package/dist/src/core/run-log-redact.js +69 -0
  501. package/dist/src/core/run-log.d.ts +21 -10
  502. package/dist/src/core/run-log.js +76 -27
  503. package/dist/src/core/shared-ftl.d.ts +2 -2
  504. package/dist/src/core/shared-ftl.js +6 -6
  505. package/dist/src/core/signal-critical.d.ts +2 -2
  506. package/dist/src/core/signal-critical.js +4 -6
  507. package/dist/src/core/smoke-patterns.d.ts +5 -6
  508. package/dist/src/core/smoke-patterns.js +15 -20
  509. package/dist/src/core/state-file.d.ts +15 -4
  510. package/dist/src/core/state-file.js +14 -1
  511. package/dist/src/core/status-binary.d.ts +8 -8
  512. package/dist/src/core/status-binary.js +12 -12
  513. package/dist/src/core/status-classify.d.ts +17 -17
  514. package/dist/src/core/status-classify.js +13 -12
  515. package/dist/src/core/test-changed-prefs.d.ts +12 -12
  516. package/dist/src/core/test-changed-prefs.js +40 -25
  517. package/dist/src/core/test-harness-crash.d.ts +39 -39
  518. package/dist/src/core/test-harness-crash.js +69 -69
  519. package/dist/src/core/test-harness-output.d.ts +7 -7
  520. package/dist/src/core/test-harness-output.js +7 -7
  521. package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
  522. package/dist/src/core/test-harness-verdict-notes.js +4 -4
  523. package/dist/src/core/test-path-scope.d.ts +8 -8
  524. package/dist/src/core/test-path-scope.js +11 -11
  525. package/dist/src/core/test-stale-check.d.ts +22 -23
  526. package/dist/src/core/test-stale-check.js +31 -30
  527. package/dist/src/core/test-stale-symlink.d.ts +1 -1
  528. package/dist/src/core/test-stale-symlink.js +1 -1
  529. package/dist/src/core/test-stall-triage.d.ts +9 -9
  530. package/dist/src/core/test-stall-triage.js +22 -22
  531. package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
  532. package/dist/src/core/test-xpcshell-retry.js +14 -11
  533. package/dist/src/core/token-category.d.ts +35 -2
  534. package/dist/src/core/token-category.js +67 -58
  535. package/dist/src/core/token-coverage.js +4 -5
  536. package/dist/src/core/token-dark-mode.d.ts +9 -9
  537. package/dist/src/core/token-dark-mode.js +13 -25
  538. package/dist/src/core/token-docs.d.ts +1 -1
  539. package/dist/src/core/token-inventory.d.ts +56 -0
  540. package/dist/src/core/token-inventory.js +109 -0
  541. package/dist/src/core/token-manager.d.ts +4 -4
  542. package/dist/src/core/token-manager.js +22 -22
  543. package/dist/src/core/token-scaffold.d.ts +4 -4
  544. package/dist/src/core/token-scaffold.js +4 -4
  545. package/dist/src/core/token-variant.d.ts +14 -14
  546. package/dist/src/core/token-variant.js +52 -53
  547. package/dist/src/core/toolchain-preflight.d.ts +15 -15
  548. package/dist/src/core/toolchain-preflight.js +23 -23
  549. package/dist/src/core/tree-cow.d.ts +3 -5
  550. package/dist/src/core/tree-cow.js +8 -8
  551. package/dist/src/core/tree-guard.d.ts +3 -3
  552. package/dist/src/core/tree-guard.js +23 -23
  553. package/dist/src/core/tree-store.d.ts +15 -15
  554. package/dist/src/core/tree-store.js +39 -38
  555. package/dist/src/core/typecheck-shim.d.ts +16 -15
  556. package/dist/src/core/typecheck-shim.js +26 -25
  557. package/dist/src/core/typecheck.d.ts +12 -12
  558. package/dist/src/core/typecheck.js +33 -33
  559. package/dist/src/core/wire-destroy.d.ts +2 -2
  560. package/dist/src/core/wire-destroy.js +5 -5
  561. package/dist/src/core/wire-dom-fragment.d.ts +3 -3
  562. package/dist/src/core/wire-dom-fragment.js +12 -23
  563. package/dist/src/core/wire-init.d.ts +2 -2
  564. package/dist/src/core/wire-init.js +7 -7
  565. package/dist/src/core/wire-subscript.d.ts +1 -1
  566. package/dist/src/core/wire-subscript.js +3 -3
  567. package/dist/src/core/wire-utils.d.ts +9 -9
  568. package/dist/src/core/wire-utils.js +16 -28
  569. package/dist/src/core/xpcshell-appdir.d.ts +20 -20
  570. package/dist/src/core/xpcshell-appdir.js +28 -30
  571. package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
  572. package/dist/src/core/xpcshell-profile-dir.js +7 -7
  573. package/dist/src/errors/base.d.ts +69 -16
  574. package/dist/src/errors/base.js +95 -26
  575. package/dist/src/errors/build.d.ts +6 -6
  576. package/dist/src/errors/build.js +26 -34
  577. package/dist/src/errors/codes.d.ts +10 -10
  578. package/dist/src/errors/codes.js +10 -10
  579. package/dist/src/errors/config.d.ts +0 -14
  580. package/dist/src/errors/config.js +13 -34
  581. package/dist/src/errors/download.d.ts +13 -0
  582. package/dist/src/errors/download.js +53 -24
  583. package/dist/src/errors/furnace.d.ts +2 -2
  584. package/dist/src/errors/furnace.js +8 -9
  585. package/dist/src/errors/git.d.ts +9 -9
  586. package/dist/src/errors/git.js +21 -31
  587. package/dist/src/errors/patch.d.ts +3 -3
  588. package/dist/src/errors/patch.js +11 -13
  589. package/dist/src/errors/rebase.d.ts +1 -1
  590. package/dist/src/errors/rebase.js +8 -8
  591. package/dist/src/errors/run.d.ts +1 -1
  592. package/dist/src/errors/run.js +1 -1
  593. package/dist/src/index.d.ts +4 -4
  594. package/dist/src/index.js +4 -4
  595. package/dist/src/types/commands/options.d.ts +155 -200
  596. package/dist/src/types/commands/patches.d.ts +19 -19
  597. package/dist/src/types/commands/project.d.ts +3 -3
  598. package/dist/src/types/config.d.ts +52 -19
  599. package/dist/src/types/furnace.d.ts +17 -17
  600. package/dist/src/types/index.d.ts +0 -1
  601. package/dist/src/types/json.d.ts +3 -3
  602. package/dist/src/types/json.js +2 -2
  603. package/dist/src/types/typecheck.d.ts +3 -3
  604. package/dist/src/utils/assert.d.ts +4 -16
  605. package/dist/src/utils/assert.js +7 -24
  606. package/dist/src/utils/build-info.d.ts +6 -6
  607. package/dist/src/utils/build-info.js +6 -6
  608. package/dist/src/utils/child-env.d.ts +7 -6
  609. package/dist/src/utils/child-env.js +5 -5
  610. package/dist/src/utils/concurrency.d.ts +2 -2
  611. package/dist/src/utils/concurrency.js +2 -2
  612. package/dist/src/utils/elapsed.js +10 -1
  613. package/dist/src/utils/errors.d.ts +8 -8
  614. package/dist/src/utils/errors.js +8 -8
  615. package/dist/src/utils/fs.d.ts +1 -1
  616. package/dist/src/utils/fs.js +15 -20
  617. package/dist/src/utils/hash.d.ts +12 -0
  618. package/dist/src/utils/hash.js +16 -0
  619. package/dist/src/utils/line-dispatch.d.ts +15 -0
  620. package/dist/src/utils/line-dispatch.js +48 -0
  621. package/dist/src/utils/logger.d.ts +4 -4
  622. package/dist/src/utils/logger.js +11 -11
  623. package/dist/src/utils/machine-output.js +2 -2
  624. package/dist/src/utils/options.d.ts +14 -20
  625. package/dist/src/utils/options.js +26 -27
  626. package/dist/src/utils/package-root.js +5 -14
  627. package/dist/src/utils/paths.d.ts +4 -4
  628. package/dist/src/utils/paths.js +4 -4
  629. package/dist/src/utils/platform.d.ts +0 -4
  630. package/dist/src/utils/process-group.d.ts +10 -9
  631. package/dist/src/utils/process-group.js +37 -36
  632. package/dist/src/utils/process.d.ts +70 -55
  633. package/dist/src/utils/process.js +129 -179
  634. package/dist/src/utils/ps-duration.d.ts +4 -4
  635. package/dist/src/utils/ps-duration.js +9 -9
  636. package/dist/src/utils/regex.d.ts +4 -4
  637. package/dist/src/utils/regex.js +7 -7
  638. package/dist/src/utils/sleep.d.ts +26 -0
  639. package/dist/src/utils/sleep.js +31 -0
  640. package/dist/src/utils/stdio-drain.d.ts +7 -7
  641. package/dist/src/utils/stdio-drain.js +8 -8
  642. package/dist/src/utils/validation.d.ts +12 -49
  643. package/dist/src/utils/validation.js +26 -36
  644. package/docs/README.md +2 -2
  645. package/docs/configuration.md +163 -69
  646. package/docs/exit-codes.md +66 -49
  647. package/docs/furnace.md +20 -19
  648. package/docs/lifecycle-invariants.md +414 -247
  649. package/docs/machine-output.md +58 -34
  650. package/docs/patch-workflow.md +48 -44
  651. package/docs/run-logs.md +72 -28
  652. package/docs/testing.md +105 -98
  653. package/docs/verification-trees.md +23 -22
  654. package/package.json +7 -6
  655. package/dist/src/commands/rebase.d.ts +0 -4
  656. package/dist/src/commands/rebase.js +0 -5
  657. package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
  658. package/dist/src/core/patch-artifact-normalize.js +0 -24
  659. package/dist/src/core/patch-lint-reexports.d.ts +0 -7
  660. package/dist/src/core/patch-lint-reexports.js +0 -8
  661. package/dist/src/core/wire-targets.d.ts +0 -7
  662. package/dist/src/core/wire-targets.js +0 -8
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * browser-init.js — init expression in onLoad().
3
+ * browser-init.js: init expression in onLoad().
4
4
  */
5
5
  import { join } from 'node:path';
6
6
  import MagicString from 'magic-string';
@@ -22,8 +22,8 @@ const DEFAULT_MARKER = 'FIREFORGE:';
22
22
  * Default insertion point: after the last consecutive fireforge block, or at
23
23
  * the top of the method body when there is none.
24
24
  *
25
- * Both callers below — the `--after`-target-not-found fallthrough and the
26
- * no-`--after` default — must emit identical blocks, since `browser-init.js`
25
+ * Both callers below (the `--after`-target-not-found fallthrough and the
26
+ * no-`--after` default) must emit identical blocks, since `browser-init.js`
27
27
  * is written through both paths. One implementation enforces that invariant
28
28
  * rather than merely tidying.
29
29
  */
@@ -48,14 +48,14 @@ function resolveDefaultInsertion(content, body, fireforgeBlocks) {
48
48
  *
49
49
  * `marker` is prepended (uppercased) to the generated comment line so the
50
50
  * emitted block carries the patch-lint `// <MARKER>:` signature that
51
- * `lintModificationComments` looks for; otherwise the first export after
51
+ * `lintModificationComments` looks for. Otherwise the first export after
52
52
  * `wire` trips `missing-modification-comment` on wire-generated edits.
53
53
  */
54
54
  export function addInitAST(content, expression, after, marker = DEFAULT_MARKER) {
55
55
  const name = extractNameFromExpression(expression);
56
56
  // `validateWireName` accepts both `Foo.bar` and `Foo.bar()` shapes. The
57
57
  // template below interpolates the value verbatim, so a bare property
58
- // path compiles to `Foo.bar;` — a silent no-op, not a lifecycle
58
+ // path compiles to `Foo.bar;`, a silent no-op rather than a lifecycle
59
59
  // invocation. `coerceToCall` normalises to the function-call form so
60
60
  // the emitted block always invokes the hook the operator asked for.
61
61
  const callExpression = coerceToCall(expression);
@@ -116,7 +116,7 @@ export function addInitAST(content, expression, after, marker = DEFAULT_MARKER)
116
116
  */
117
117
  export function legacyAddInit(content, expression, after, marker = DEFAULT_MARKER) {
118
118
  const name = extractNameFromExpression(expression);
119
- // See `addInitAST` for the rationale — the AST and fallback paths must
119
+ // See `addInitAST` for the rationale: the AST and fallback paths must
120
120
  // agree on whether the emitted block is a function call, otherwise
121
121
  // operators would see different behaviour depending on which parser
122
122
  // happened to handle their browser-init.js layout.
@@ -202,7 +202,7 @@ export async function addInitToBrowserInit(engineDir, expression, after, marker
202
202
  throw new GeneralError(`${BROWSER_INIT_JS} not found in engine`);
203
203
  }
204
204
  const content = await readText(filePath);
205
- // Idempotency check — look for the coerced (call) form because that is
205
+ // Idempotency check: look for the coerced (call) form because that is
206
206
  // what the emitter writes. Matching against the raw input would miss a
207
207
  // bare `X.init` invocation that coercion already persisted as `X.init()`.
208
208
  const callExpression = coerceToCall(expression);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * browser-main.js — loadSubScript registration.
2
+ * browser-main.js: loadSubScript registration.
3
3
  */
4
4
  /**
5
5
  * AST-based implementation: finds the last try/catch containing
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: EUPL-1.2
2
2
  /**
3
- * browser-main.js — loadSubScript registration.
3
+ * browser-main.js: loadSubScript registration.
4
4
  */
5
5
  import { join } from 'node:path';
6
6
  import MagicString from 'magic-string';
@@ -45,7 +45,7 @@ export function addSubscriptAST(content, name, marker = DEFAULT_MARKER) {
45
45
  indent = detectIndent(content, lastTry.start);
46
46
  }
47
47
  else {
48
- // No existing loadSubScript — insert before last standalone closing brace
48
+ // No existing loadSubScript: insert before last standalone closing brace
49
49
  // Use line-based search to avoid matching braces inside strings/comments
50
50
  const allLines = content.split('\n');
51
51
  let lastBrace = -1;
@@ -132,7 +132,7 @@ export async function addSubscriptToBrowserMain(engineDir, name, marker = DEFAUL
132
132
  throw new GeneralError(`${BROWSER_MAIN_JS} not found in engine`);
133
133
  }
134
134
  const content = await readText(filePath);
135
- // Idempotency check — include closing quote to avoid substring false positives
135
+ // Idempotency check. Include the closing quote to avoid substring false positives
136
136
  if (content.includes(`content/${name}.js"`)) {
137
137
  return false;
138
138
  }
@@ -12,7 +12,7 @@ export declare function validateWireName(value: string, label: string): void;
12
12
  * `Startup.init` or `Startup.init()` and get the same wired output.
13
13
  *
14
14
  * `validateWireName` accepts both shapes, but the generated block
15
- * interpolates the expression verbatim inside `${expression};` — so a bare
15
+ * interpolates the expression verbatim inside `${expression};`, so a bare
16
16
  * `Startup.init` emits `Startup.init;`, a plain property reference that
17
17
  * never invokes the lifecycle hook. The symptom is silent: `wire` reports
18
18
  * success and the browser-init block looks plausible, but the hook never
@@ -27,7 +27,7 @@ export declare function coerceToCall(expression: string): string;
27
27
  * Tracks multi-line block comment state across calls via the `inBlockComment`
28
28
  * parameter, allowing callers to iterate over lines while preserving context.
29
29
  *
30
- * **Regex literal heuristic:** When a `/` follows an operator or keyword-boundary
30
+ * Regex literal heuristic: when a `/` follows an operator or keyword-boundary
31
31
  * character (one of `= ( : , ! | & ? ; ~ ^ { [ \n + - * % < >`), it is treated
32
32
  * as a regex literal opener and characters are skipped until the closing `/`.
33
33
  * This heuristic can misfire on:
@@ -36,7 +36,7 @@ export declare function coerceToCall(expression: string): string;
36
36
  * - Tagged template literals or unusual formatting.
37
37
  *
38
38
  * For Firefox source files this heuristic is sufficient because the AST-based
39
- * parser (via `withParserFallback`) is tried first; this function is only
39
+ * parser (via `withParserFallback`) is tried first. This function is only
40
40
  * used in the regex-based fallback path.
41
41
  *
42
42
  * @param line - A single line of source text
@@ -66,10 +66,10 @@ export declare function tokenizeXhtml(lines: string[]): XhtmlToken[];
66
66
  * advances to the line containing the opening brace.
67
67
  *
68
68
  * By default this helper is tolerant: when no `{` is found anywhere after
69
- * the signature, it still returns `braceIndex: methodLine` — which is the
69
+ * the signature, it still returns `braceIndex: methodLine`, which is the
70
70
  * correct answer when the signature and body brace live on the same line,
71
71
  * but is ambiguous when the method is abstract or truncated. Opt into
72
- * stricter behaviour by passing `requireBrace: true`; the function will
72
+ * stricter behaviour by passing `requireBrace: true`. The function will
73
73
  * return `null` instead of guessing, letting the caller surface a clean
74
74
  * {@link ParserFallbackError} rather than inserting into a wrong offset.
75
75
  *
@@ -86,10 +86,10 @@ export declare function findMethodBraceIndex(lines: string[], pattern: RegExp, o
86
86
  * Starting from `startLine`, walks lines using {@link countBraceDepth}
87
87
  * until the brace depth returns to zero (i.e., the enclosing block closes).
88
88
  *
89
- * Default behaviour is defensive — if the block never closes, the helper
89
+ * Default behaviour is defensive: if the block never closes, the helper
90
90
  * returns `startLine + 1` so a single malformed file does not stop the
91
91
  * entire fallback path. Pass `{ strict: true }` to opt into failing loudly
92
- * with a {@link ParserFallbackError} instead; new callers should prefer
92
+ * with a {@link ParserFallbackError} instead. New callers should prefer
93
93
  * strict mode so silent mis-insertions surface as the fallback refusing
94
94
  * to touch the file.
95
95
  *
@@ -120,7 +120,7 @@ export declare function computeFileBraceBalance(content: string): {
120
120
  * Round-trip guard used after a legacy fallback mutation: if the file's
121
121
  * net brace balance drifts between `before` and `after`, something went
122
122
  * wrong and the fallback is refusing to write a corrupted file. Expects
123
- * the delta to be exactly zero — wire fallbacks only insert whole
123
+ * the delta to be exactly zero, since wire fallbacks only insert whole
124
124
  * try/catch blocks, which always contribute equal opens and closes.
125
125
  *
126
126
  * @throws {@link ParserFallbackError} when the balance delta is non-zero.
@@ -136,7 +136,7 @@ export declare function findNearestTryLine(lines: string[], fromLine: number, lo
136
136
  /**
137
137
  * Scans lines starting from `startLine` for consecutive fireforge try-catch
138
138
  * blocks (identified by init comments or typeof guards) and returns the
139
- * line index just after the last such block — i.e., where a new block should
139
+ * line index just after the last such block, i.e. where a new block should
140
140
  * be inserted.
141
141
  *
142
142
  * Non-fireforge, non-blank, non-comment lines terminate the scan.
@@ -24,7 +24,7 @@ export function validateWireName(value, label) {
24
24
  * `Startup.init` or `Startup.init()` and get the same wired output.
25
25
  *
26
26
  * `validateWireName` accepts both shapes, but the generated block
27
- * interpolates the expression verbatim inside `${expression};` — so a bare
27
+ * interpolates the expression verbatim inside `${expression};`, so a bare
28
28
  * `Startup.init` emits `Startup.init;`, a plain property reference that
29
29
  * never invokes the lifecycle hook. The symptom is silent: `wire` reports
30
30
  * success and the browser-init block looks plausible, but the hook never
@@ -41,7 +41,7 @@ export function coerceToCall(expression) {
41
41
  * Tracks multi-line block comment state across calls via the `inBlockComment`
42
42
  * parameter, allowing callers to iterate over lines while preserving context.
43
43
  *
44
- * **Regex literal heuristic:** When a `/` follows an operator or keyword-boundary
44
+ * Regex literal heuristic: when a `/` follows an operator or keyword-boundary
45
45
  * character (one of `= ( : , ! | & ? ; ~ ^ { [ \n + - * % < >`), it is treated
46
46
  * as a regex literal opener and characters are skipped until the closing `/`.
47
47
  * This heuristic can misfire on:
@@ -50,7 +50,7 @@ export function coerceToCall(expression) {
50
50
  * - Tagged template literals or unusual formatting.
51
51
  *
52
52
  * For Firefox source files this heuristic is sufficient because the AST-based
53
- * parser (via `withParserFallback`) is tried first; this function is only
53
+ * parser (via `withParserFallback`) is tried first. This function is only
54
54
  * used in the regex-based fallback path.
55
55
  *
56
56
  * @param line - A single line of source text
@@ -119,7 +119,7 @@ function isRegexLiteralStart(line, i) {
119
119
  }
120
120
  /**
121
121
  * Scans from the opening `/` of a regex literal to its closing `/`
122
- * (honouring escapes), returning the index of the closing slash — or the
122
+ * (honouring escapes), returning the index of the closing slash, or the
123
123
  * end of the line when the literal never closes.
124
124
  */
125
125
  function scanToRegexLiteralEnd(line, start) {
@@ -159,8 +159,8 @@ export function tokenizeXhtml(lines) {
159
159
  });
160
160
  }
161
161
  // ---------------------------------------------------------------------------
162
- // Legacy (line-based) helpers — shared by fallback implementations in
163
- // wire-targets.ts. Extracted to reduce duplication and make the brace-
162
+ // Legacy (line-based) helpers, shared by fallback implementations in
163
+ // the wire target modules. Extracted to reduce duplication and make the brace-
164
164
  // walking logic independently testable.
165
165
  // ---------------------------------------------------------------------------
166
166
  /**
@@ -168,10 +168,10 @@ export function tokenizeXhtml(lines) {
168
168
  * advances to the line containing the opening brace.
169
169
  *
170
170
  * By default this helper is tolerant: when no `{` is found anywhere after
171
- * the signature, it still returns `braceIndex: methodLine` — which is the
171
+ * the signature, it still returns `braceIndex: methodLine`, which is the
172
172
  * correct answer when the signature and body brace live on the same line,
173
173
  * but is ambiguous when the method is abstract or truncated. Opt into
174
- * stricter behaviour by passing `requireBrace: true`; the function will
174
+ * stricter behaviour by passing `requireBrace: true`. The function will
175
175
  * return `null` instead of guessing, letting the caller surface a clean
176
176
  * {@link ParserFallbackError} rather than inserting into a wrong offset.
177
177
  *
@@ -179,24 +179,12 @@ export function tokenizeXhtml(lines) {
179
179
  * found (or, under `requireBrace`, no brace follows the signature).
180
180
  */
181
181
  export function findMethodBraceIndex(lines, pattern, options) {
182
- let methodLine = -1;
183
- for (let i = 0; i < lines.length; i++) {
184
- if (pattern.test(lines[i] ?? '')) {
185
- methodLine = i;
186
- break;
187
- }
188
- }
182
+ const methodLine = lines.findIndex((line) => pattern.test(line));
189
183
  if (methodLine === -1)
190
184
  return null;
191
- let braceIndex = methodLine;
192
- let braceFound = false;
193
- for (let i = methodLine; i < lines.length; i++) {
194
- if (lines[i]?.includes('{')) {
195
- braceIndex = i;
196
- braceFound = true;
197
- break;
198
- }
199
- }
185
+ const braceOffset = lines.slice(methodLine).findIndex((line) => line.includes('{'));
186
+ const braceFound = braceOffset !== -1;
187
+ const braceIndex = braceFound ? methodLine + braceOffset : methodLine;
200
188
  if (!braceFound && options?.requireBrace) {
201
189
  return null;
202
190
  }
@@ -206,10 +194,10 @@ export function findMethodBraceIndex(lines, pattern, options) {
206
194
  * Starting from `startLine`, walks lines using {@link countBraceDepth}
207
195
  * until the brace depth returns to zero (i.e., the enclosing block closes).
208
196
  *
209
- * Default behaviour is defensive — if the block never closes, the helper
197
+ * Default behaviour is defensive: if the block never closes, the helper
210
198
  * returns `startLine + 1` so a single malformed file does not stop the
211
199
  * entire fallback path. Pass `{ strict: true }` to opt into failing loudly
212
- * with a {@link ParserFallbackError} instead; new callers should prefer
200
+ * with a {@link ParserFallbackError} instead. New callers should prefer
213
201
  * strict mode so silent mis-insertions surface as the fallback refusing
214
202
  * to touch the file.
215
203
  *
@@ -259,7 +247,7 @@ export function computeFileBraceBalance(content) {
259
247
  * Round-trip guard used after a legacy fallback mutation: if the file's
260
248
  * net brace balance drifts between `before` and `after`, something went
261
249
  * wrong and the fallback is refusing to write a corrupted file. Expects
262
- * the delta to be exactly zero — wire fallbacks only insert whole
250
+ * the delta to be exactly zero, since wire fallbacks only insert whole
263
251
  * try/catch blocks, which always contribute equal opens and closes.
264
252
  *
265
253
  * @throws {@link ParserFallbackError} when the balance delta is non-zero.
@@ -295,7 +283,7 @@ const FIREFORGE_BLOCK_PATTERN = /\/\/\s*.*init\s*—|typeof\s+\w+\s*!==\s*"undef
295
283
  /**
296
284
  * Scans lines starting from `startLine` for consecutive fireforge try-catch
297
285
  * blocks (identified by init comments or typeof guards) and returns the
298
- * line index just after the last such block — i.e., where a new block should
286
+ * line index just after the last such block, i.e. where a new block should
299
287
  * be inserted.
300
288
  *
301
289
  * Non-fireforge, non-blank, non-comment lines terminate the scan.
@@ -9,7 +9,7 @@
9
9
  * override as `mozInfo["appname"] + "-appdir"`. On a stock Firefox build the
10
10
  * key is `firefox-appdir`, so the very common `firefox-appdir = "browser"`
11
11
  * directive is honoured. On a rebranded fork (appname=`mybrowser`) the
12
- * harness looks for `mybrowser-appdir` — the literal `firefox-appdir` line
12
+ * harness looks for `mybrowser-appdir`, so the literal `firefox-appdir` line
13
13
  * is silently ignored, `appPath` falls back to `xrePath`, and every
14
14
  * `resource:///modules/…` import throws `Failed to load
15
15
  * resource:///modules/<name>.sys.mjs` because xpcshell resolves the
@@ -21,7 +21,7 @@
21
21
  * `xpcshell.toml`. If none exists, the test is not an xpcshell test and
22
22
  * there is nothing to inject.
23
23
  * 2. Read the manifest's `[DEFAULT]` section. Look for `<appname>-appdir`
24
- * first — if present, the harness already finds it. Fall back to
24
+ * first. If present, the harness already finds it. Fall back to
25
25
  * `firefox-appdir`. This ordering matches upstream precedence and avoids
26
26
  * overriding an operator who already migrated.
27
27
  * 3. If only `firefox-appdir` is present and `appname != "firefox"`, compute
@@ -30,7 +30,7 @@
30
30
  * `dist/<bundle>.app/Contents/Resources/<value>` for the macOS packaged
31
31
  * layout) and return it as the value to pass to `--app-path`.
32
32
  * 4. If multiple test paths disagree on the resolved value, refuse injection
33
- * and return null — the operator can drop down to `--mach-arg`.
33
+ * and return null. The operator can drop down to `--mach-arg`.
34
34
  *
35
35
  * Operator escape hatch: `--mach-arg=--app-path=…` always wins (handled in
36
36
  * test.ts, which skips injection when `--app-path=` already appears in the
@@ -60,7 +60,7 @@ export interface AppdirResolveResult {
60
60
  * - Single- or double-quoted values
61
61
  * - Whitespace either side of `=`
62
62
  * - Continuation comments (`#` or `;`) at the end of the line
63
- * - Bare unquoted bareword values (e.g. `firefox-appdir = browser`) — some
63
+ * - Bare unquoted bareword values (e.g. `firefox-appdir = browser`). Some
64
64
  * operators omit the quotes and the harness honours either form.
65
65
  *
66
66
  * Returns `undefined` when the key is absent or sits outside `[DEFAULT]`.
@@ -74,10 +74,10 @@ export declare function parseAppdirFromToml(tomlText: string, key: string): {
74
74
  * returns the absolute path of the first sibling `xpcshell.toml` found.
75
75
  * Stops at `engineDir` (inclusive) and returns null on miss.
76
76
  *
77
- * Special-cases `startPath` itself when it already ends with `xpcshell.toml`
78
- * — operators sometimes pass a manifest path directly.
77
+ * Special-cases `startPath` itself when it already ends with
78
+ * `xpcshell.toml`, since operators sometimes pass a manifest path directly.
79
79
  *
80
- * When `startPath` is a DIRECTORY, the walk starts at the directory itself
80
+ * When `startPath` is a directory, the walk starts at the directory itself
81
81
  * (checking `<dir>/xpcshell.toml` first) rather than at its parent.
82
82
  * Starting at the parent misses a directory's own manifest, so
83
83
  * `fireforge test <dir>` classifies it non-xpcshell and dispatches to the
@@ -86,31 +86,31 @@ export declare function parseAppdirFromToml(tomlText: string, key: string): {
86
86
  export declare function findNearestXpcshellManifest(engineDir: string, startPath: string): Promise<string | null>;
87
87
  /**
88
88
  * Reads `<objDir>/mozinfo.json` for the active app name. Returns
89
- * `"firefox"` when mozinfo cannot be read or the field is missing — that
89
+ * `"firefox"` when mozinfo cannot be read or the field is missing. That
90
90
  * is the safe default because it matches stock Firefox behaviour and
91
91
  * means the resolver will not inject anything (the manifest's
92
- * `firefox-appdir` value WILL be honoured by the upstream harness when
92
+ * `firefox-appdir` value is honoured by the upstream harness when
93
93
  * appname is firefox).
94
94
  */
95
95
  export declare function readMozinfoAppname(objDirPath: string): Promise<string>;
96
96
  /**
97
97
  * Probes the obj-dir's `dist/` subtree for the absolute path the harness
98
98
  * would have computed if the manifest key had been honoured. Returns null
99
- * when no candidate exists — better to skip injection silently than to point
99
+ * when no candidate exists: better to skip injection silently than to point
100
100
  * the harness at a path that does not exist, which fails with a different
101
101
  * error than the original symptom and confuses triage.
102
102
  *
103
103
  * Probe order differs by host platform:
104
104
  *
105
- * - **macOS (`darwin`)**: prefer
106
- * `<objDir>/dist/<App>.app/Contents/Resources/<value>` FIRST, then fall
105
+ * - macOS (`darwin`): prefer
106
+ * `<objDir>/dist/<App>.app/Contents/Resources/<value>` first, then fall
107
107
  * back to `<objDir>/dist/bin/<value>`. On macOS `dist/bin` is symlinked to
108
- * `dist/<App>.app/Contents/MacOS/` (the *binaries* directory), so
109
- * `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser/` —
110
- * NOT where `resource:///modules/` is rooted. Injecting that path looks
111
- * successful in the log but points at a directory with no modules tree, so
112
- * every `resource:///modules/…` import still throws.
113
- * - **non-macOS**: `dist/bin/<value>` first,
108
+ * `dist/<App>.app/Contents/MacOS/` (the binaries directory), so
109
+ * `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser/`,
110
+ * which is not where `resource:///modules/` is rooted. Injecting that path
111
+ * looks successful in the log but points at a directory with no modules
112
+ * tree, so every `resource:///modules/…` import still throws.
113
+ * - non-macOS: `dist/bin/<value>` first,
114
114
  * `.app/Contents/Resources/<value>` as fallback.
115
115
  *
116
116
  * On both platforms the final `.app` fallback iterates every `*.app` entry
@@ -121,7 +121,7 @@ export declare function resolveAbsoluteAppPath(objDirAbs: string, relativeAppdir
121
121
  * Outcome carrier for {@link resolveXpcshellAppdirArg}. Distinguishes the
122
122
  * three "did nothing" cases so callers can shape diagnostics:
123
123
  * - `none`: no manifest under any test path needs injection.
124
- * - `mismatch`: at least two manifests resolved to different values; we
124
+ * - `mismatch`: at least two manifests resolved to different values. We
125
125
  * refuse to guess which one the operator meant.
126
126
  * - `unresolved`: the manifest asks for `firefox-appdir = "<value>"` but
127
127
  * no `dist/` candidate exists for that value.
@@ -143,7 +143,7 @@ export type XpcshellAppdirOutcome = {
143
143
  /**
144
144
  * Top-level resolver. Walks every test path, reads the nearest
145
145
  * xpcshell.toml, and returns the single absolute path to inject (or a
146
- * structured "no injection" outcome). Never throws — every fs / parse
146
+ * structured "no injection" outcome). Never throws: every fs / parse
147
147
  * error is folded into a `none` outcome so the test command always falls
148
148
  * through to the diagnostic hint instead of dying inside a helper.
149
149
  */
@@ -10,7 +10,7 @@
10
10
  * override as `mozInfo["appname"] + "-appdir"`. On a stock Firefox build the
11
11
  * key is `firefox-appdir`, so the very common `firefox-appdir = "browser"`
12
12
  * directive is honoured. On a rebranded fork (appname=`mybrowser`) the
13
- * harness looks for `mybrowser-appdir` — the literal `firefox-appdir` line
13
+ * harness looks for `mybrowser-appdir`, so the literal `firefox-appdir` line
14
14
  * is silently ignored, `appPath` falls back to `xrePath`, and every
15
15
  * `resource:///modules/…` import throws `Failed to load
16
16
  * resource:///modules/<name>.sys.mjs` because xpcshell resolves the
@@ -22,7 +22,7 @@
22
22
  * `xpcshell.toml`. If none exists, the test is not an xpcshell test and
23
23
  * there is nothing to inject.
24
24
  * 2. Read the manifest's `[DEFAULT]` section. Look for `<appname>-appdir`
25
- * first — if present, the harness already finds it. Fall back to
25
+ * first. If present, the harness already finds it. Fall back to
26
26
  * `firefox-appdir`. This ordering matches upstream precedence and avoids
27
27
  * overriding an operator who already migrated.
28
28
  * 3. If only `firefox-appdir` is present and `appname != "firefox"`, compute
@@ -31,7 +31,7 @@
31
31
  * `dist/<bundle>.app/Contents/Resources/<value>` for the macOS packaged
32
32
  * layout) and return it as the value to pass to `--app-path`.
33
33
  * 4. If multiple test paths disagree on the resolved value, refuse injection
34
- * and return null — the operator can drop down to `--mach-arg`.
34
+ * and return null. The operator can drop down to `--mach-arg`.
35
35
  *
36
36
  * Operator escape hatch: `--mach-arg=--app-path=…` always wins (handled in
37
37
  * test.ts, which skips injection when `--app-path=` already appears in the
@@ -51,7 +51,7 @@ import { isObject, isString } from '../utils/validation.js';
51
51
  * - Single- or double-quoted values
52
52
  * - Whitespace either side of `=`
53
53
  * - Continuation comments (`#` or `;`) at the end of the line
54
- * - Bare unquoted bareword values (e.g. `firefox-appdir = browser`) — some
54
+ * - Bare unquoted bareword values (e.g. `firefox-appdir = browser`). Some
55
55
  * operators omit the quotes and the harness honours either form.
56
56
  *
57
57
  * Returns `undefined` when the key is absent or sits outside `[DEFAULT]`.
@@ -64,8 +64,7 @@ export function parseAppdirFromToml(tomlText, key) {
64
64
  // comment further along the file is not mistaken for the directive.
65
65
  const escapedKey = escapeRegex(key);
66
66
  const keyPattern = new RegExp('^\\s*' + escapedKey + '\\s*=\\s*(.+?)\\s*(?:[#;].*)?$');
67
- for (let i = 0; i < lines.length; i += 1) {
68
- const line = lines[i] ?? '';
67
+ for (const [i, line] of lines.entries()) {
69
68
  const sectionMatch = /^\s*\[([^\]]+)\]\s*$/.exec(line);
70
69
  if (sectionMatch) {
71
70
  sectionSeen = true;
@@ -94,7 +93,7 @@ function stripQuotes(raw) {
94
93
  if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
95
94
  return raw.slice(1, -1);
96
95
  }
97
- // Bareword: must not contain whitespace; otherwise we are looking at
96
+ // Bareword: must not contain whitespace. Otherwise we are looking at
98
97
  // commentary that the regex's optional comment tail did not strip.
99
98
  if (/\s/.test(raw))
100
99
  return undefined;
@@ -105,10 +104,10 @@ function stripQuotes(raw) {
105
104
  * returns the absolute path of the first sibling `xpcshell.toml` found.
106
105
  * Stops at `engineDir` (inclusive) and returns null on miss.
107
106
  *
108
- * Special-cases `startPath` itself when it already ends with `xpcshell.toml`
109
- * — operators sometimes pass a manifest path directly.
107
+ * Special-cases `startPath` itself when it already ends with
108
+ * `xpcshell.toml`, since operators sometimes pass a manifest path directly.
110
109
  *
111
- * When `startPath` is a DIRECTORY, the walk starts at the directory itself
110
+ * When `startPath` is a directory, the walk starts at the directory itself
112
111
  * (checking `<dir>/xpcshell.toml` first) rather than at its parent.
113
112
  * Starting at the parent misses a directory's own manifest, so
114
113
  * `fireforge test <dir>` classifies it non-xpcshell and dispatches to the
@@ -123,8 +122,8 @@ export async function findNearestXpcshellManifest(engineDir, startPath) {
123
122
  const engineAbs = resolve(engineDir);
124
123
  let current = absStart;
125
124
  // First iteration resolves the starting directory (the path itself for a
126
- // directory argument, its parent for a file); subsequent ones walk up.
127
- // Cap iterations defensively — a pathological symlink loop would
125
+ // directory argument, its parent for a file). Subsequent ones walk up.
126
+ // Cap iterations defensively: a pathological symlink loop would
128
127
  // otherwise spin until the call stack overflows.
129
128
  for (let i = 0; i < 64; i += 1) {
130
129
  const dir = i === 0 ? (startIsDirectory ? absStart : dirname(absStart)) : dirname(current);
@@ -139,10 +138,10 @@ export async function findNearestXpcshellManifest(engineDir, startPath) {
139
138
  }
140
139
  /**
141
140
  * Reads `<objDir>/mozinfo.json` for the active app name. Returns
142
- * `"firefox"` when mozinfo cannot be read or the field is missing — that
141
+ * `"firefox"` when mozinfo cannot be read or the field is missing. That
143
142
  * is the safe default because it matches stock Firefox behaviour and
144
143
  * means the resolver will not inject anything (the manifest's
145
- * `firefox-appdir` value WILL be honoured by the upstream harness when
144
+ * `firefox-appdir` value is honoured by the upstream harness when
146
145
  * appname is firefox).
147
146
  */
148
147
  export async function readMozinfoAppname(objDirPath) {
@@ -157,28 +156,28 @@ export async function readMozinfoAppname(objDirPath) {
157
156
  }
158
157
  catch {
159
158
  // Malformed mozinfo is a build-system problem out of scope for the
160
- // appdir resolver; treat as if appname were missing.
159
+ // appdir resolver. Treat as if appname were missing.
161
160
  }
162
161
  return 'firefox';
163
162
  }
164
163
  /**
165
164
  * Probes the obj-dir's `dist/` subtree for the absolute path the harness
166
165
  * would have computed if the manifest key had been honoured. Returns null
167
- * when no candidate exists — better to skip injection silently than to point
166
+ * when no candidate exists: better to skip injection silently than to point
168
167
  * the harness at a path that does not exist, which fails with a different
169
168
  * error than the original symptom and confuses triage.
170
169
  *
171
170
  * Probe order differs by host platform:
172
171
  *
173
- * - **macOS (`darwin`)**: prefer
174
- * `<objDir>/dist/<App>.app/Contents/Resources/<value>` FIRST, then fall
172
+ * - macOS (`darwin`): prefer
173
+ * `<objDir>/dist/<App>.app/Contents/Resources/<value>` first, then fall
175
174
  * back to `<objDir>/dist/bin/<value>`. On macOS `dist/bin` is symlinked to
176
- * `dist/<App>.app/Contents/MacOS/` (the *binaries* directory), so
177
- * `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser/` —
178
- * NOT where `resource:///modules/` is rooted. Injecting that path looks
179
- * successful in the log but points at a directory with no modules tree, so
180
- * every `resource:///modules/…` import still throws.
181
- * - **non-macOS**: `dist/bin/<value>` first,
175
+ * `dist/<App>.app/Contents/MacOS/` (the binaries directory), so
176
+ * `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser/`,
177
+ * which is not where `resource:///modules/` is rooted. Injecting that path
178
+ * looks successful in the log but points at a directory with no modules
179
+ * tree, so every `resource:///modules/…` import still throws.
180
+ * - non-macOS: `dist/bin/<value>` first,
182
181
  * `.app/Contents/Resources/<value>` as fallback.
183
182
  *
184
183
  * On both platforms the final `.app` fallback iterates every `*.app` entry
@@ -223,7 +222,7 @@ export async function resolveAbsoluteAppPath(objDirAbs, relativeAppdir) {
223
222
  /**
224
223
  * Top-level resolver. Walks every test path, reads the nearest
225
224
  * xpcshell.toml, and returns the single absolute path to inject (or a
226
- * structured "no injection" outcome). Never throws — every fs / parse
225
+ * structured "no injection" outcome). Never throws: every fs / parse
227
226
  * error is folded into a `none` outcome so the test command always falls
228
227
  * through to the diagnostic hint instead of dying inside a helper.
229
228
  */
@@ -232,7 +231,7 @@ export async function resolveXpcshellAppdirArg(engineDir, testPaths, objDirName)
232
231
  return { kind: 'none' };
233
232
  const objDirAbs = resolve(engineDir, objDirName);
234
233
  const appname = await readMozinfoAppname(objDirAbs);
235
- // When appname IS "firefox" the upstream harness reads `firefox-appdir`
234
+ // When appname is "firefox" the upstream harness reads `firefox-appdir`
236
235
  // natively. Injecting in that case would be a no-op at best and an
237
236
  // override at worst, so bail out before doing any IO per-path.
238
237
  if (appname === 'firefox')
@@ -248,11 +247,11 @@ export async function resolveXpcshellAppdirArg(engineDir, testPaths, objDirName)
248
247
  body = await readText(manifestPath);
249
248
  }
250
249
  catch {
251
- // An unreadable manifest cannot declare an appdir; skip it and keep
250
+ // An unreadable manifest cannot declare an appdir. Skip it and keep
252
251
  // walking the remaining candidates.
253
252
  continue;
254
253
  }
255
- // Operator already migrated — harness will read the appname-keyed
254
+ // Operator already migrated. The harness will read the appname-keyed
256
255
  // value directly. Nothing to do.
257
256
  if (parseAppdirFromToml(body, appnameKey) !== undefined)
258
257
  continue;
@@ -290,8 +289,7 @@ export async function resolveXpcshellAppdirArg(engineDir, testPaths, objDirName)
290
289
  * wins.
291
290
  */
292
291
  export function operatorAlreadySetAppPath(extraArgs) {
293
- for (let i = 0; i < extraArgs.length; i += 1) {
294
- const arg = extraArgs[i] ?? '';
292
+ for (const [i, arg] of extraArgs.entries()) {
295
293
  if (arg === '--app-path' && i + 1 < extraArgs.length)
296
294
  return true;
297
295
  if (arg.startsWith('--app-path='))
@@ -2,11 +2,11 @@ export declare const XPCSHELL_PROFILE_ENV_VAR = "XPCSHELL_TEST_PROFILE_DIR";
2
2
  /**
3
3
  * Runs `fn` with a fresh per-invocation xpcshell profile directory
4
4
  * injected into the environment, removing the directory afterwards
5
- * (best-effort — a failure to clean up warns and leaves the mkdtemp dir
6
- * for the OS tmp reaper; the harness may still hold files briefly).
5
+ * (best-effort: a failure to clean up warns and leaves the mkdtemp dir
6
+ * for the OS tmp reaper, and the harness may still hold files briefly).
7
7
  *
8
8
  * An operator-provided `XPCSHELL_TEST_PROFILE_DIR` (in `baseEnv` or the
9
9
  * process environment) is respected verbatim: no directory is minted and
10
- * NOTHING is deleted — we never remove a directory we did not create.
10
+ * nothing is deleted, because we never remove a directory we did not create.
11
11
  */
12
12
  export declare function withXpcshellProfileDir<T>(baseEnv: Record<string, string> | undefined, fn: (env: Record<string, string>) => Promise<T>): Promise<T>;
@@ -3,10 +3,10 @@
3
3
  * Per-invocation xpcshell profile directory.
4
4
  *
5
5
  * Firefox's xpcshell harness defaults `XPCSHELL_TEST_PROFILE_DIR` to a
6
- * FIXED path (`$TMPDIR/firefox/xpcshellprofile`), so two overlapping
7
- * harness invocations — concurrent `fireforge test` processes, or future
8
- * verification-tree shards — corrupt each other's profiles. FireForge
9
- * never set the variable; this helper mints a fresh `mkdtemp` directory
6
+ * fixed path (`$TMPDIR/firefox/xpcshellprofile`), so two overlapping
7
+ * harness invocations (concurrent `fireforge test` processes, or future
8
+ * verification-tree shards) corrupt each other's profiles. FireForge
9
+ * never set the variable. This helper mints a fresh `mkdtemp` directory
10
10
  * per harness invocation and exports it through the mach env channel.
11
11
  */
12
12
  import { mkdtemp, rm } from 'node:fs/promises';
@@ -18,12 +18,12 @@ export const XPCSHELL_PROFILE_ENV_VAR = 'XPCSHELL_TEST_PROFILE_DIR';
18
18
  /**
19
19
  * Runs `fn` with a fresh per-invocation xpcshell profile directory
20
20
  * injected into the environment, removing the directory afterwards
21
- * (best-effort — a failure to clean up warns and leaves the mkdtemp dir
22
- * for the OS tmp reaper; the harness may still hold files briefly).
21
+ * (best-effort: a failure to clean up warns and leaves the mkdtemp dir
22
+ * for the OS tmp reaper, and the harness may still hold files briefly).
23
23
  *
24
24
  * An operator-provided `XPCSHELL_TEST_PROFILE_DIR` (in `baseEnv` or the
25
25
  * process environment) is respected verbatim: no directory is minted and
26
- * NOTHING is deleted — we never remove a directory we did not create.
26
+ * nothing is deleted, because we never remove a directory we did not create.
27
27
  */
28
28
  export async function withXpcshellProfileDir(baseEnv, fn) {
29
29
  const operatorProvided = baseEnv?.[XPCSHELL_PROFILE_ENV_VAR] ?? process.env[XPCSHELL_PROFILE_ENV_VAR];