@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
@@ -3,8 +3,8 @@
3
3
  * Dark-mode insertion helpers for the tokens CSS scaffold.
4
4
  *
5
5
  * `fireforge token add --mode override --dark-value ...` must land the dark
6
- * declaration INSIDE the nested `:root { }` of the
7
- * `@media (prefers-color-scheme: dark)` block; landing after that block has
6
+ * declaration inside the nested `:root { }` of the
7
+ * `@media (prefers-color-scheme: dark)` block. Landing after that block has
8
8
  * closed produces a declaration outside any rule. The helpers here scan the
9
9
  * comment-stripped source lines to find the *inner* `:root` block's closing
10
10
  * `}` and return a line index the caller can splice into. When the inner
@@ -38,8 +38,8 @@ function rootOpensBraceOnLine(line) {
38
38
  * into the original array at the same index.
39
39
  *
40
40
  * We blank the comment body with spaces (rather than removing it) so
41
- * any downstream consumer that indexes by column — or derives an
42
- * insertion index as a line number in the original array — still
41
+ * any downstream consumer that indexes by column (or derives an
42
+ * insertion index as a line number in the original array) still
43
43
  * agrees on line numbers.
44
44
  */
45
45
  export function stripBlockCommentsInLines(lines) {
@@ -77,29 +77,23 @@ export function stripBlockCommentsInLines(lines) {
77
77
  /**
78
78
  * Finds the closing `}` line of the nested `:root { ... }` block inside
79
79
  * a `@media (prefers-color-scheme: dark)` block. Returns `-1` when the
80
- * media block exists but the nested `:root` block is missing; returns
80
+ * media block exists but the nested `:root` block is missing. Returns
81
81
  * `null` when the `@media` block itself is absent.
82
82
  *
83
83
  * Runs the scan over a comment-stripped mirror of the source lines so
84
84
  * braces inside CSS comments (`/* before { after *\/`) do not offset
85
- * the depth counter. The scan is deliberately line-indexed so callers
85
+ * the depth counter. The scan is line-indexed so callers
86
86
  * can splice into the original `lines` array at the returned index.
87
87
  */
88
88
  export function findDarkRootInsertionIndex(lines) {
89
89
  const stripped = stripBlockCommentsInLines(lines);
90
- let darkMediaLine = -1;
91
- for (let i = 0; i < stripped.length; i++) {
92
- if (/prefers-color-scheme:\s*dark/.test(stripped[i] ?? '')) {
93
- darkMediaLine = i;
94
- break;
95
- }
96
- }
90
+ const darkMediaLine = stripped.findIndex((line) => /prefers-color-scheme:\s*dark/.test(line));
97
91
  if (darkMediaLine === -1)
98
92
  return null;
99
93
  // Walk the comment-stripped lines after the @media header and find
100
94
  // the first `:root {` opener inside the block. The opening brace of
101
95
  // the selector may live on the same line as the selector name or on
102
- // the following line; either shape is tolerated.
96
+ // the following line. Either shape is tolerated.
103
97
  let rootOpenLine = -1;
104
98
  for (let i = darkMediaLine; i < stripped.length; i++) {
105
99
  const line = stripped[i] ?? '';
@@ -127,14 +121,14 @@ export function findDarkRootInsertionIndex(lines) {
127
121
  }
128
122
  if (rootOpenLine === -1)
129
123
  return -1;
130
- // Depth-count starting from the `:root` opener; see findBlockCloseIndex.
124
+ // Depth-count starting from the `:root` opener. See findBlockCloseIndex.
131
125
  return findBlockCloseIndex(stripped, rootOpenLine);
132
126
  }
133
127
  /**
134
128
  * Depth-counts braces from `startLine` (whose lines must already have
135
129
  * block comments stripped), returning the index of the line on which the
136
- * block opened there returns to its entry depth — i.e. the line carrying
137
- * the block's closing `}` — or -1 when the block never closes. The first
130
+ * block opened there returns to its entry depth, i.e. the line carrying
131
+ * the block's closing `}`, or -1 when the block never closes. The first
138
132
  * `{` encountered sets the entry depth, so the scan may start on the
139
133
  * selector/at-rule line itself rather than on the opener.
140
134
  */
@@ -165,20 +159,14 @@ export function findBlockCloseIndex(stripped, startLine) {
165
159
  /**
166
160
  * Finds the closing `}` of the outermost
167
161
  * `@media (prefers-color-scheme: dark)` block. Used as the fallback
168
- * landing site when the scaffold has no nested `:root { }` — the
162
+ * landing site when the scaffold has no nested `:root { }`. The
169
163
  * insertion helper uses this index to splice a brand-new `:root`
170
164
  * wrapper containing the dark declaration, rather than dropping the
171
165
  * value.
172
166
  */
173
167
  export function findDarkMediaCloseIndex(lines) {
174
168
  const stripped = stripBlockCommentsInLines(lines);
175
- let darkMediaLine = -1;
176
- for (let i = 0; i < stripped.length; i++) {
177
- if (/prefers-color-scheme:\s*dark/.test(stripped[i] ?? '')) {
178
- darkMediaLine = i;
179
- break;
180
- }
181
- }
169
+ const darkMediaLine = stripped.findIndex((line) => /prefers-color-scheme:\s*dark/.test(line));
182
170
  if (darkMediaLine === -1)
183
171
  return -1;
184
172
  return findBlockCloseIndex(stripped, darkMediaLine);
@@ -6,7 +6,7 @@
6
6
  /**
7
7
  * Minimal token shape the docs updater needs. Declared locally (rather than
8
8
  * importing `AddTokenOptions`) so this module has no edge back to
9
- * `token-manager.ts` — `AddTokenOptions` is structurally compatible.
9
+ * `token-manager.ts`. `AddTokenOptions` is structurally compatible.
10
10
  */
11
11
  export interface TokenDocInput {
12
12
  tokenName: string;
@@ -0,0 +1,56 @@
1
+ /** One token declaration inside the base `:root` block. */
2
+ export interface TokenInventoryEntry {
3
+ /** Custom-property name, including the leading `--`. */
4
+ name: string;
5
+ /** 1-based line number in the tokens CSS file. */
6
+ line: number;
7
+ /** Declared value, trimmed, without the trailing `;`. */
8
+ value: string;
9
+ }
10
+ /**
11
+ * Tokens grouped under the banner that precedes them, in file order.
12
+ * `category` is null for declarations that sit above the first banner.
13
+ * That is a real state in a hand-edited file, and one the report must show
14
+ * rather than silently drop.
15
+ */
16
+ export interface TokenCategoryInventory {
17
+ category: string | null;
18
+ tokens: TokenInventoryEntry[];
19
+ }
20
+ /** One block that declares a given token, with the value it declares. */
21
+ export interface TokenBlockValue {
22
+ /**
23
+ * Selector trail of the declaring block, outermost first, joined with
24
+ * ` > `. For example `:root` or
25
+ * `@media (prefers-color-scheme: dark) > :root`.
26
+ */
27
+ block: string;
28
+ value: string;
29
+ /** 1-based line number of the declaration. */
30
+ line: number;
31
+ }
32
+ /**
33
+ * Collects every base-`:root` token declaration grouped by the category
34
+ * banner above it, in document order.
35
+ *
36
+ * Only the base block is walked: the dark `@media` and `:root[variant]`
37
+ * companions mirror declarations rather than owning them, so listing them
38
+ * would report the same token two or three times under no category at all.
39
+ *
40
+ * @param lines - Tokens CSS split into lines
41
+ * @returns Categories in file order, each with its tokens in file order
42
+ */
43
+ export declare function collectTokenInventory(lines: string[]): TokenCategoryInventory[];
44
+ /**
45
+ * Every declaration of `tokenName`, in every block of the file, labelled by
46
+ * the selector trail of the block that declares it.
47
+ *
48
+ * Not restricted to the base `:root`: the question `token show`
49
+ * answers is "what does this token resolve to", and a token whose dark
50
+ * override differs from its base value is the case worth seeing.
51
+ *
52
+ * @param lines - Tokens CSS split into lines
53
+ * @param tokenName - Custom-property name including the leading `--`
54
+ * @returns Declarations in file order
55
+ */
56
+ export declare function collectTokenBlockValues(lines: string[], tokenName: string): TokenBlockValue[];
@@ -0,0 +1,109 @@
1
+ // SPDX-License-Identifier: EUPL-1.2
2
+ /**
3
+ * Read-only inventory of the tokens CSS file: which categories exist, which
4
+ * tokens each declares, and what a single token resolves to in every theme
5
+ * block that mentions it.
6
+ *
7
+ * `token add` requires `--category` and, until now, nothing reported the
8
+ * categories a project actually has, so the only way to name one correctly
9
+ * was to hand-parse a neighbouring `= Category =` banner out of the file.
10
+ * This module is that report. It reuses the banner and
11
+ * `:root`-bounds primitives from `token-category.ts` rather than parsing
12
+ * tokens CSS a second way: two readers that disagree on what a banner is
13
+ * would put `token list` and `token add` in different sections of the same
14
+ * file.
15
+ */
16
+ import { categoryBannerNameAt, findBaseRootBounds, maskCommentLines } from './token-category.js';
17
+ /** Matches a custom-property declaration and captures its name and value. */
18
+ const DECLARATION_PATTERN = /^\s*(--[A-Za-z0-9_-]+)\s*:\s*([^;]*);?/;
19
+ /**
20
+ * Collects every base-`:root` token declaration grouped by the category
21
+ * banner above it, in document order.
22
+ *
23
+ * Only the base block is walked: the dark `@media` and `:root[variant]`
24
+ * companions mirror declarations rather than owning them, so listing them
25
+ * would report the same token two or three times under no category at all.
26
+ *
27
+ * @param lines - Tokens CSS split into lines
28
+ * @returns Categories in file order, each with its tokens in file order
29
+ */
30
+ export function collectTokenInventory(lines) {
31
+ const bounds = findBaseRootBounds(lines);
32
+ if (bounds === undefined || bounds.close === -1)
33
+ return [];
34
+ const masked = maskCommentLines(lines);
35
+ const groups = [];
36
+ let current;
37
+ for (let i = bounds.open + 1; i < bounds.close; i++) {
38
+ // Banners are read from the raw lines: `maskCommentLines` blanks comment
39
+ // bodies, which is exactly what a banner is.
40
+ const banner = categoryBannerNameAt(lines, i);
41
+ if (banner !== undefined) {
42
+ current = { category: banner, tokens: [] };
43
+ groups.push(current);
44
+ continue;
45
+ }
46
+ const match = DECLARATION_PATTERN.exec(masked[i] ?? '');
47
+ if (!match?.[1])
48
+ continue;
49
+ if (current === undefined) {
50
+ current = { category: null, tokens: [] };
51
+ groups.push(current);
52
+ }
53
+ current.tokens.push({ name: match[1], line: i + 1, value: (match[2] ?? '').trim() });
54
+ }
55
+ // A banner with no declarations under it is still a category `token add
56
+ // --category` accepts, so empty groups are kept.
57
+ return groups;
58
+ }
59
+ /**
60
+ * Every declaration of `tokenName`, in every block of the file, labelled by
61
+ * the selector trail of the block that declares it.
62
+ *
63
+ * Not restricted to the base `:root`: the question `token show`
64
+ * answers is "what does this token resolve to", and a token whose dark
65
+ * override differs from its base value is the case worth seeing.
66
+ *
67
+ * @param lines - Tokens CSS split into lines
68
+ * @param tokenName - Custom-property name including the leading `--`
69
+ * @returns Declarations in file order
70
+ */
71
+ export function collectTokenBlockValues(lines, tokenName) {
72
+ const masked = maskCommentLines(lines);
73
+ const trail = [];
74
+ const found = [];
75
+ for (let i = 0; i < masked.length; i++) {
76
+ const line = masked[i] ?? '';
77
+ const match = DECLARATION_PATTERN.exec(line);
78
+ if (match?.[1] === tokenName) {
79
+ found.push({
80
+ block: trail.length > 0 ? trail.join(' > ') : '(file scope)',
81
+ value: (match[2] ?? '').trim(),
82
+ line: i + 1,
83
+ });
84
+ }
85
+ // Brace tracking after the declaration test, so a one-line block cannot
86
+ // swallow the declaration it opens on. Selector text is whatever
87
+ // precedes the `{`. An empty selector (a continuation line) still
88
+ // needs a stack entry or the closing `}` pops the wrong one.
89
+ for (const char of line) {
90
+ if (char === '{') {
91
+ trail.push(selectorBefore(line, trail.length));
92
+ }
93
+ else if (char === '}') {
94
+ trail.pop();
95
+ }
96
+ }
97
+ }
98
+ return found;
99
+ }
100
+ /**
101
+ * Selector text introducing the `depth`-th open brace on `line`. Falls back
102
+ * to a positional label so the trail stays well-formed on a minified or
103
+ * continuation line that opens a block with no visible selector.
104
+ */
105
+ function selectorBefore(line, depth) {
106
+ const open = line.indexOf('{');
107
+ const text = open === -1 ? '' : line.slice(0, open).trim();
108
+ return text.length > 0 ? text : `(block ${String(depth + 1)})`;
109
+ }
@@ -10,7 +10,7 @@ export declare const TOKEN_MODES: readonly ["auto", "static", "override"];
10
10
  /** Dark mode behaviour for a token. */
11
11
  export type TokenMode = (typeof TOKEN_MODES)[number];
12
12
  /** Narrows an arbitrary string to a {@link TokenMode}. */
13
- export declare const isTokenMode: (value: string) => value is "override" | "auto" | "static";
13
+ export declare const isTokenMode: (value: string) => value is "auto" | "override" | "static";
14
14
  /**
15
15
  * Options for adding a token.
16
16
  */
@@ -21,7 +21,7 @@ export interface AddTokenOptions {
21
21
  value: string;
22
22
  /**
23
23
  * Token category matching section headers in the CSS file. Required for a
24
- * base declaration; ignored — and no longer required — under
24
+ * base declaration. Ignored, and no longer required, under
25
25
  * {@link AddTokenOptions.variant}, which routes into a `:root<selector>`
26
26
  * block and never touches a category section.
27
27
  */
@@ -41,7 +41,7 @@ export interface AddTokenOptions {
41
41
  * `[data-private]`) that routes the declaration into a top-level
42
42
  * `:root<variant>` block instead of the base `:root` / category section.
43
43
  * The block is created if absent and appended to if present. Variant
44
- * overrides are CSS-only — the base token already owns its docs row.
44
+ * overrides are CSS-only. The base token already owns its docs row.
45
45
  */
46
46
  variant?: string | undefined;
47
47
  }
@@ -62,7 +62,7 @@ export interface AddTokenResult {
62
62
  /** Whether a new category banner was declared by this add. */
63
63
  categoryCreated?: boolean;
64
64
  /**
65
- * When the add skipped because the token already lives in the TARGET
65
+ * When the add skipped because the token already lives in the target
66
66
  * category, names where the existing base-`:root` declaration sits so
67
67
  * the skip message can point at it.
68
68
  */
@@ -60,7 +60,7 @@ async function validateTokenPrefix(root, options) {
60
60
  catch (error) {
61
61
  if (error instanceof InvalidArgumentError)
62
62
  throw error;
63
- // FurnaceError means furnace.json doesn't exist yet — skip silently.
63
+ // FurnaceError means furnace.json doesn't exist yet, so skip silently.
64
64
  // Other errors (parse errors, permission errors) deserve a warning.
65
65
  if (!(error instanceof FurnaceError)) {
66
66
  const message = toError(error).message;
@@ -109,12 +109,12 @@ function normalizeVariantOption(options) {
109
109
  * Narrows {@link AddTokenOptions.category} for the base-declaration path,
110
110
  * which cannot proceed without one.
111
111
  *
112
- * `--category` used to be unconditionally required, INCLUDING under
112
+ * `--category` used to be unconditionally required, including under
113
113
  * `--variant`, where the declaration is routed into a `:root<selector>`
114
114
  * block and the category names nothing about where the token lands. The
115
- * requirement existed so the argument would not be silently discarded —
115
+ * requirement existed so the argument would not be silently discarded,
116
116
  * a fair goal that produced a mandatory argument describing nothing. Under
117
- * a variant it is now optional; everywhere else this states the reason
117
+ * a variant it is now optional. Everywhere else this states the reason
118
118
  * rather than leaving commander to print a bare "required option not
119
119
  * specified".
120
120
  *
@@ -136,14 +136,14 @@ async function assertTokensCssExists(engineDir, tokensCssPath) {
136
136
  }
137
137
  }
138
138
  /**
139
- * Routes a declaration into the top-level `:root<variant>` block — creating
139
+ * Routes a declaration into the top-level `:root<variant>` block, creating
140
140
  * the block after the base `:root` block if absent, or appending to it if
141
141
  * present. Idempotent within the block.
142
142
  *
143
- * A skip carries the LOCATION of the existing declaration, mirroring
143
+ * A skip carries the location of the existing declaration, mirroring
144
144
  * {@link evaluateBaseTokenIdempotency}. The bare `{ added: false }` it used
145
- * to return told the caller nothing, so a re-run intending to CHANGE a
146
- * value exited 0 having changed nothing and said only "already exists" —
145
+ * to return told the caller nothing, so a re-run intending to change a
146
+ * value exited 0 having changed nothing and said only "already exists",
147
147
  * while the base path had reported the category and line for the same
148
148
  * situation all along.
149
149
  */
@@ -161,9 +161,9 @@ async function addVariantTokenToCSS(engineDir, options, tokensCssPath, variant)
161
161
  }
162
162
  /**
163
163
  * Evaluates base-`:root` idempotency for one add: a token already declared
164
- * in the TARGET category skips; a token declared anywhere else in the base
165
- * block refuses loud. A whole-file substring check instead skips silently —
166
- * discarding `--create-category` — and exits 0.
164
+ * in the target category skips. A token declared anywhere else in the base
165
+ * block refuses loud. A whole-file substring check instead skips silently,
166
+ * discarding `--create-category`, and exits 0.
167
167
  */
168
168
  function evaluateBaseTokenIdempotency(lines, options, tokensCssPath) {
169
169
  const existing = findTokenDeclarationInRoot(lines, options.tokenName);
@@ -177,7 +177,7 @@ function evaluateBaseTokenIdempotency(lines, options, tokensCssPath) {
177
177
  ? 'remove the stray declaration first'
178
178
  : `pass --category "${existing.category}" to target the existing declaration, or remove it first`;
179
179
  throw new GeneralError(`Token "${options.tokenName}" is already declared outside category "${options.category}" ` +
180
- `(${tokensCssPath}:${String(existing.line)}${sectionSuffix}). ` +
180
+ `(${tokensCssPath}:${existing.line}${sectionSuffix}). ` +
181
181
  `A token belongs to exactly one category — ${remedy}.`);
182
182
  }
183
183
  /**
@@ -192,7 +192,7 @@ export async function validateTokenAdd(root, options) {
192
192
  await validateTokenPrefix(root, options);
193
193
  validateDarkValue(options);
194
194
  // Variant mode targets a `:root<attr>` block, not a category section, so
195
- // no category is consulted — and none is required. When one IS passed it
195
+ // no category is consulted, and none is required. When one is passed it
196
196
  // is still checked, so a typo'd category is not silently accepted just
197
197
  // because the flag happens to be inert here.
198
198
  if (normalizeVariantOption(options) !== undefined) {
@@ -274,7 +274,7 @@ export async function addToken(root, options) {
274
274
  }
275
275
  // --- Documentation ---
276
276
  // Only the base path reaches here (variant declarations returned above),
277
- // so a category is guaranteed — `requireCategory` already ran inside
277
+ // so a category is guaranteed. `requireCategory` already ran inside
278
278
  // `addTokenToCSS`. Re-narrowing rather than asserting keeps the docs
279
279
  // input's required `category` honest.
280
280
  const docsResult = await addTokenToDocs(engineDir, { ...options, category: requireCategory(options) }, getModeAnnotation(options.mode, options.value));
@@ -302,8 +302,8 @@ const THEME_ATTRIBUTE_VARIANTS = [
302
302
  /**
303
303
  * Mirrors an override's light/dark values into existing top-level
304
304
  * `:root[data-theme="dark"]` / `:root[data-theme="light"]` blocks. Blocks
305
- * that do not exist are left alone (scaffolded files have none; behavior is
306
- * unchanged there). Idempotent per block. Returns the selectors written.
305
+ * that do not exist are left alone (scaffolded files have none, so behavior
306
+ * is unchanged there). Idempotent per block. Returns the selectors written.
307
307
  */
308
308
  function insertThemeAttributeOverrides(lines, options) {
309
309
  if (options.mode !== 'override' || !options.darkValue)
@@ -317,8 +317,8 @@ function insertThemeAttributeOverrides(lines, options) {
317
317
  const value = pick === 'dark' ? options.darkValue : options.value;
318
318
  insertVariantDeclaration(lines, variant, ` ${options.tokenName}: ${value};`);
319
319
  written.push(`:root${variant}`);
320
- // A qualified block is matched — skipping it is the worse failure, and
321
- // the one that shipped — but the qualifier narrows where the token
320
+ // A qualified block is matched. Skipping it is the worse failure, and
321
+ // the one that shipped, but the qualifier narrows where the token
322
322
  // applies, so say which selector was written through rather than
323
323
  // letting the operator meet the narrowing as a theme bug later.
324
324
  const qualifier = variantBlockQualifier(lines, variant);
@@ -338,7 +338,7 @@ function insertDarkModeOverride(lines, options) {
338
338
  return; // No @media block at all.
339
339
  const darkEntry = ` ${options.tokenName}: ${options.darkValue};`;
340
340
  if (insertionIndex === -1) {
341
- // @media block exists but has no nested :root { } — the scaffold
341
+ // @media block exists but has no nested :root { }, so the scaffold
342
342
  // drifted. Warn and fall back to appending a fresh nested :root
343
343
  // block right before the @media block's closing brace so the
344
344
  // generated CSS still parses, rather than dropping the dark value
@@ -361,8 +361,8 @@ async function addTokenToCSS(engineDir, options, tokensCssPath) {
361
361
  await assertTokenCategoryExists(engineDir, tokensCssPath, category, options.createCategory === true);
362
362
  const content = await readText(filePath);
363
363
  const lines = content.split('\n');
364
- // Per-category idempotency: a declaration in the TARGET
365
- // category skips; a declaration elsewhere in the base :root block
364
+ // Per-category idempotency: a declaration in the target
365
+ // category skips. A declaration elsewhere in the base :root block
366
366
  // throws instead of silently skipping (and silently discarding
367
367
  // --create-category).
368
368
  const idempotency = evaluateBaseTokenIdempotency(lines, options, tokensCssPath);
@@ -375,7 +375,7 @@ async function addTokenToCSS(engineDir, options, tokensCssPath) {
375
375
  }
376
376
  const annotation = getModeAnnotation(options.mode, options.value);
377
377
  // Declare a missing category banner in the same in-memory edit as the
378
- // token insertion — the file is written exactly once, so a failure
378
+ // token insertion. The file is written exactly once, so a failure
379
379
  // between "banner declared" and "token inserted" cannot occur.
380
380
  let categoryCreated = false;
381
381
  if (options.createCategory === true && !categoryHeaderExists(lines, category)) {
@@ -13,13 +13,13 @@
13
13
  import type { ProjectLicense } from '../types/config.js';
14
14
  /**
15
15
  * The set of categories seeded by the default scaffold. `token add
16
- * --category <name>` accepts any of these without further setup; an
16
+ * --category <name>` accepts any of these without further setup. An
17
17
  * operator who needs another category only has to add a matching
18
18
  * `/* = My Category = *\/` header inside the `:root` block by hand.
19
19
  *
20
20
  * The names intentionally mirror the vocabulary used in Firefox's own
21
- * token files (Colors — Canvas, Spacing, …) so operators coming from
22
- * upstream don't have to relearn a fork-specific taxonomy.
21
+ * token files (the color and spacing categories listed below) so operators
22
+ * coming from upstream don't have to relearn a fork-specific taxonomy.
23
23
  */
24
24
  export declare const DEFAULT_TOKEN_CATEGORIES: readonly string[];
25
25
  /**
@@ -29,7 +29,7 @@ export declare const DEFAULT_TOKEN_CATEGORIES: readonly string[];
29
29
  *
30
30
  * @param binaryName - `fireforge.json` `binaryName` used in the
31
31
  * rendered file banner so operators can identify the fork on-sight.
32
- * @param license - Project license; piped through `getLicenseHeader`
32
+ * @param license - Project license, piped through `getLicenseHeader`
33
33
  * so the scaffold is SPDX-marked and survives `fireforge lint`'s
34
34
  * license-header checks without operator intervention.
35
35
  */
@@ -14,13 +14,13 @@
14
14
  import { getLicenseHeader } from './license-headers.js';
15
15
  /**
16
16
  * The set of categories seeded by the default scaffold. `token add
17
- * --category <name>` accepts any of these without further setup; an
17
+ * --category <name>` accepts any of these without further setup. An
18
18
  * operator who needs another category only has to add a matching
19
19
  * `/* = My Category = *\/` header inside the `:root` block by hand.
20
20
  *
21
21
  * The names intentionally mirror the vocabulary used in Firefox's own
22
- * token files (Colors — Canvas, Spacing, …) so operators coming from
23
- * upstream don't have to relearn a fork-specific taxonomy.
22
+ * token files (the color and spacing categories listed below) so operators
23
+ * coming from upstream don't have to relearn a fork-specific taxonomy.
24
24
  */
25
25
  export const DEFAULT_TOKEN_CATEGORIES = [
26
26
  'Colors — General',
@@ -35,7 +35,7 @@ export const DEFAULT_TOKEN_CATEGORIES = [
35
35
  *
36
36
  * @param binaryName - `fireforge.json` `binaryName` used in the
37
37
  * rendered file banner so operators can identify the fork on-sight.
38
- * @param license - Project license; piped through `getLicenseHeader`
38
+ * @param license - Project license, piped through `getLicenseHeader`
39
39
  * so the scaffold is SPDX-marked and survives `fireforge lint`'s
40
40
  * license-header checks without operator intervention.
41
41
  */
@@ -12,7 +12,7 @@
12
12
  import type { TokenDeclarationLocation } from './token-category.js';
13
13
  /**
14
14
  * Outcome of {@link validateVariantSelector}. `ok: true` carries the
15
- * normalized (quoted) selector fragment; `ok: false` carries a
15
+ * normalized (quoted) selector fragment. `ok: false` carries a
16
16
  * human-readable reason suitable for throwing as an `InvalidArgumentError`.
17
17
  */
18
18
  export type VariantValidation = {
@@ -27,12 +27,12 @@ export type VariantValidation = {
27
27
  * form to the double-quoted `="value"` shape (Mozilla convention).
28
28
  * Boolean-attribute fragments are returned unchanged.
29
29
  *
30
- * Structure is decided by {@link rootAttributeSelector} — the matcher's own
31
- * parse — rather than by a second regex. That is the point: 0.44.2 widened
30
+ * Structure is decided by {@link rootAttributeSelector}, the matcher's own
31
+ * parse, rather than by a second regex. 0.44.2 widened
32
32
  * the matcher to consume consecutive `[…]` groups and stop at a pseudo-class
33
33
  * tail, and the validator did not move with it, so
34
34
  * `:root[data-skin="humanist"]:not([data-private])` was a block the tool
35
- * could FIND but would not let you NAME. Running both halves off one parse
35
+ * could find but would not let you name. Running both halves off one parse
36
36
  * is what stops them drifting apart again. Character-level safety stays a
37
37
  * separate, per-group check, because the matcher finds bracket boundaries
38
38
  * and validates no characters at all.
@@ -43,7 +43,7 @@ export declare function validateVariantSelector(raw: unknown): VariantValidation
43
43
  /**
44
44
  * True when a top-level `:root<variant>` block exists in `lines`. Used by
45
45
  * the override path to write theme-attribute blocks only when the scaffold
46
- * already declares them — `insertVariantDeclaration` would otherwise create
46
+ * already declares them. `insertVariantDeclaration` would otherwise create
47
47
  * the block, which is only wanted for the explicit `--variant` flow.
48
48
  */
49
49
  export declare function variantBlockExists(lines: string[], variant: string): boolean;
@@ -51,13 +51,13 @@ export declare function variantBlockExists(lines: string[], variant: string): bo
51
51
  * The pseudo-class qualifier on the matched `:root<variant>` block, or
52
52
  * `undefined` when no block matched. `''` for an unqualified block.
53
53
  *
54
- * A qualifier such as `:not([data-private])` is semantically LOAD-BEARING:
55
- * writing into that block scopes the declaration to the qualified case, and
56
- * that may not be what the operator meant. Matching it is still the right
57
- * call — silently skipping it is the worse failure, and the one that
58
- * shipped — but the override path uses this to say out loud which selector
59
- * it wrote through, so the narrowing is a visible decision rather than a
60
- * theme bug discovered later.
54
+ * A qualifier such as `:not([data-private])` is load-bearing: writing into
55
+ * that block scopes the declaration to the qualified case, and that may not
56
+ * be what the operator meant. Matching it is still the right call, since
57
+ * silently skipping it is the worse failure and the one that shipped, but
58
+ * the override path uses this to say out loud which selector it wrote
59
+ * through, so the narrowing is a visible decision rather than a theme bug
60
+ * discovered later.
61
61
  *
62
62
  * @param lines - Tokens CSS split into lines
63
63
  * @param variant - Attribute selector fragment, e.g. `[data-theme="light"]`
@@ -72,8 +72,8 @@ export declare function variantBlockHasToken(lines: string[], variant: string, t
72
72
  * not exist).
73
73
  *
74
74
  * The located form of {@link variantBlockHasToken}: the variant add path
75
- * reports a skip the way the base path does — naming the block and the
76
- * line — instead of returning a bare boolean that leaves a no-op re-run
75
+ * reports a skip the way the base path does, naming the block and the
76
+ * line, instead of returning a bare boolean that leaves a no-op re-run
77
77
  * indistinguishable from a write.
78
78
  *
79
79
  * @param lines - Tokens CSS split into lines