@hominis/fireforge 0.46.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.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +11 -11
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -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
|
|
7
|
-
* `@media (prefers-color-scheme: dark)` block
|
|
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
|
|
42
|
-
* insertion index as a line number in the original array
|
|
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,12 +77,12 @@ 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
|
|
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
|
|
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) {
|
|
@@ -93,7 +93,7 @@ export function findDarkRootInsertionIndex(lines) {
|
|
|
93
93
|
// Walk the comment-stripped lines after the @media header and find
|
|
94
94
|
// the first `:root {` opener inside the block. The opening brace of
|
|
95
95
|
// the selector may live on the same line as the selector name or on
|
|
96
|
-
// the following line
|
|
96
|
+
// the following line. Either shape is tolerated.
|
|
97
97
|
let rootOpenLine = -1;
|
|
98
98
|
for (let i = darkMediaLine; i < stripped.length; i++) {
|
|
99
99
|
const line = stripped[i] ?? '';
|
|
@@ -121,14 +121,14 @@ export function findDarkRootInsertionIndex(lines) {
|
|
|
121
121
|
}
|
|
122
122
|
if (rootOpenLine === -1)
|
|
123
123
|
return -1;
|
|
124
|
-
// Depth-count starting from the `:root` opener
|
|
124
|
+
// Depth-count starting from the `:root` opener. See findBlockCloseIndex.
|
|
125
125
|
return findBlockCloseIndex(stripped, rootOpenLine);
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
128
|
* Depth-counts braces from `startLine` (whose lines must already have
|
|
129
129
|
* block comments stripped), returning the index of the line on which the
|
|
130
|
-
* block opened there returns to its entry depth
|
|
131
|
-
* the block's closing `}
|
|
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
|
|
132
132
|
* `{` encountered sets the entry depth, so the scan may start on the
|
|
133
133
|
* selector/at-rule line itself rather than on the opener.
|
|
134
134
|
*/
|
|
@@ -159,7 +159,7 @@ export function findBlockCloseIndex(stripped, startLine) {
|
|
|
159
159
|
/**
|
|
160
160
|
* Finds the closing `}` of the outermost
|
|
161
161
|
* `@media (prefers-color-scheme: dark)` block. Used as the fallback
|
|
162
|
-
* landing site when the scaffold has no nested `:root { }
|
|
162
|
+
* landing site when the scaffold has no nested `:root { }`. The
|
|
163
163
|
* insertion helper uses this index to splice a brand-new `:root`
|
|
164
164
|
* wrapper containing the dark declaration, rather than dropping the
|
|
165
165
|
* value.
|
|
@@ -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
|
|
9
|
+
* `token-manager.ts`. `AddTokenOptions` is structurally compatible.
|
|
10
10
|
*/
|
|
11
11
|
export interface TokenDocInput {
|
|
12
12
|
tokenName: string;
|
|
@@ -9,9 +9,9 @@ export interface TokenInventoryEntry {
|
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
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
|
-
* a real state in a hand-edited file, and one the report must show
|
|
14
|
-
* than silently drop.
|
|
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
15
|
*/
|
|
16
16
|
export interface TokenCategoryInventory {
|
|
17
17
|
category: string | null;
|
|
@@ -21,7 +21,7 @@ export interface TokenCategoryInventory {
|
|
|
21
21
|
export interface TokenBlockValue {
|
|
22
22
|
/**
|
|
23
23
|
* Selector trail of the declaring block, outermost first, joined with
|
|
24
|
-
* ` >
|
|
24
|
+
* ` > `. For example `:root` or
|
|
25
25
|
* `@media (prefers-color-scheme: dark) > :root`.
|
|
26
26
|
*/
|
|
27
27
|
block: string;
|
|
@@ -45,9 +45,9 @@ export declare function collectTokenInventory(lines: string[]): TokenCategoryInv
|
|
|
45
45
|
* Every declaration of `tokenName`, in every block of the file, labelled by
|
|
46
46
|
* the selector trail of the block that declares it.
|
|
47
47
|
*
|
|
48
|
-
*
|
|
48
|
+
* Not restricted to the base `:root`: the question `token show`
|
|
49
49
|
* answers is "what does this token resolve to", and a token whose dark
|
|
50
|
-
* override differs from its base value is
|
|
50
|
+
* override differs from its base value is the case worth seeing.
|
|
51
51
|
*
|
|
52
52
|
* @param lines - Tokens CSS split into lines
|
|
53
53
|
* @param tokenName - Custom-property name including the leading `--`
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* block that mentions it.
|
|
6
6
|
*
|
|
7
7
|
* `token add` requires `--category` and, until now, nothing reported the
|
|
8
|
-
* categories a project actually has
|
|
8
|
+
* categories a project actually has, so the only way to name one correctly
|
|
9
9
|
* was to hand-parse a neighbouring `= Category =` banner out of the file.
|
|
10
|
-
* This module is that report. It
|
|
10
|
+
* This module is that report. It reuses the banner and
|
|
11
11
|
* `:root`-bounds primitives from `token-category.ts` rather than parsing
|
|
12
12
|
* tokens CSS a second way: two readers that disagree on what a banner is
|
|
13
13
|
* would put `token list` and `token add` in different sections of the same
|
|
@@ -35,7 +35,7 @@ export function collectTokenInventory(lines) {
|
|
|
35
35
|
const groups = [];
|
|
36
36
|
let current;
|
|
37
37
|
for (let i = bounds.open + 1; i < bounds.close; i++) {
|
|
38
|
-
// Banners are read from the
|
|
38
|
+
// Banners are read from the raw lines: `maskCommentLines` blanks comment
|
|
39
39
|
// bodies, which is exactly what a banner is.
|
|
40
40
|
const banner = categoryBannerNameAt(lines, i);
|
|
41
41
|
if (banner !== undefined) {
|
|
@@ -60,9 +60,9 @@ export function collectTokenInventory(lines) {
|
|
|
60
60
|
* Every declaration of `tokenName`, in every block of the file, labelled by
|
|
61
61
|
* the selector trail of the block that declares it.
|
|
62
62
|
*
|
|
63
|
-
*
|
|
63
|
+
* Not restricted to the base `:root`: the question `token show`
|
|
64
64
|
* answers is "what does this token resolve to", and a token whose dark
|
|
65
|
-
* override differs from its base value is
|
|
65
|
+
* override differs from its base value is the case worth seeing.
|
|
66
66
|
*
|
|
67
67
|
* @param lines - Tokens CSS split into lines
|
|
68
68
|
* @param tokenName - Custom-property name including the leading `--`
|
|
@@ -84,8 +84,8 @@ export function collectTokenBlockValues(lines, tokenName) {
|
|
|
84
84
|
}
|
|
85
85
|
// Brace tracking after the declaration test, so a one-line block cannot
|
|
86
86
|
// swallow the declaration it opens on. Selector text is whatever
|
|
87
|
-
// precedes the `{
|
|
88
|
-
// a stack entry or the closing `}` pops the wrong one.
|
|
87
|
+
// precedes the `{`. An empty selector (a continuation line) still
|
|
88
|
+
// needs a stack entry or the closing `}` pops the wrong one.
|
|
89
89
|
for (const char of line) {
|
|
90
90
|
if (char === '{') {
|
|
91
91
|
trail.push(selectorBefore(line, trail.length));
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
165
|
-
* block refuses loud. A whole-file substring check instead skips silently
|
|
166
|
-
* discarding `--create-category
|
|
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);
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
321
|
-
// the one that shipped
|
|
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 { }
|
|
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
|
|
365
|
-
// category skips
|
|
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
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
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}
|
|
31
|
-
* parse
|
|
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
|
|
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
|
|
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
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
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
|
|
76
|
-
* line
|
|
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
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { findBlockCloseIndex, stripBlockCommentsInLines } from './token-dark-mode.js';
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* One attribute selector fragment: `[data-private]` (boolean attribute) or
|
|
16
16
|
* `[data-skin=precision]` / `[data-skin="precision"]` (attribute with
|
|
17
17
|
* value). The name and value halves are restricted to identifier-safe
|
|
18
18
|
* characters so the fragment can be spliced into CSS verbatim without
|
|
@@ -26,15 +26,15 @@ import { findBlockCloseIndex, stripBlockCommentsInLines } from './token-dark-mod
|
|
|
26
26
|
const ATTRIBUTE_FRAGMENT_PATTERN = /^\[[a-zA-Z][a-zA-Z0-9_-]*(?:=(?:"[a-zA-Z0-9_-]+"|'[a-zA-Z0-9_-]+'|[a-zA-Z0-9_-]+))?\]$/;
|
|
27
27
|
/**
|
|
28
28
|
* A pseudo-class tail: `:not(…)`, `:hover`, and friends. The parenthesised
|
|
29
|
-
* argument is captured rather than validated here
|
|
29
|
+
* argument is captured rather than validated here. It is a fragment run of
|
|
30
30
|
* its own and goes through the same per-group check.
|
|
31
31
|
*/
|
|
32
32
|
const QUALIFIER_PATTERN = /^:[a-zA-Z][a-zA-Z0-9-]*(?:\(([^()]*)\))?$/;
|
|
33
33
|
/**
|
|
34
34
|
* Splits a run of consecutive attribute fragments into its groups, or
|
|
35
|
-
* returns `undefined` when the run is not exactly that
|
|
36
|
-
* open with `[`, an unclosed group, an empty run, or a group whose name
|
|
37
|
-
* value is not identifier-safe.
|
|
35
|
+
* returns `undefined` when the run is not exactly that: a group that does
|
|
36
|
+
* not open with `[`, an unclosed group, an empty run, or a group whose name
|
|
37
|
+
* or value is not identifier-safe.
|
|
38
38
|
*
|
|
39
39
|
* @param run - The `[…][…]` text with no `:root` prefix
|
|
40
40
|
* @returns The individual fragments, or undefined when the run is not valid
|
|
@@ -67,12 +67,12 @@ function normalizeAttributeFragment(group) {
|
|
|
67
67
|
* form to the double-quoted `="value"` shape (Mozilla convention).
|
|
68
68
|
* Boolean-attribute fragments are returned unchanged.
|
|
69
69
|
*
|
|
70
|
-
* Structure is decided by {@link rootAttributeSelector}
|
|
71
|
-
* parse
|
|
70
|
+
* Structure is decided by {@link rootAttributeSelector}, the matcher's own
|
|
71
|
+
* parse, rather than by a second regex. 0.44.2 widened
|
|
72
72
|
* the matcher to consume consecutive `[…]` groups and stop at a pseudo-class
|
|
73
73
|
* tail, and the validator did not move with it, so
|
|
74
74
|
* `:root[data-skin="humanist"]:not([data-private])` was a block the tool
|
|
75
|
-
* could
|
|
75
|
+
* could find but would not let you name. Running both halves off one parse
|
|
76
76
|
* is what stops them drifting apart again. Character-level safety stays a
|
|
77
77
|
* separate, per-group check, because the matcher finds bracket boundaries
|
|
78
78
|
* and validates no characters at all.
|
|
@@ -93,7 +93,7 @@ export function validateVariantSelector(raw) {
|
|
|
93
93
|
if (value === '')
|
|
94
94
|
return reject;
|
|
95
95
|
const parts = rootAttributeSelector(`:root${value} {`);
|
|
96
|
-
// The parse must have consumed the
|
|
96
|
+
// The parse must have consumed the whole fragment: anything it declined to
|
|
97
97
|
// read (a stray space, a trailing combinator) is text the matcher would
|
|
98
98
|
// not see either, so accepting it would author a block nothing can find.
|
|
99
99
|
if (parts === undefined || `${parts.attributes}${parts.qualifier}` !== `:root${value}`)
|
|
@@ -138,19 +138,19 @@ function canonicalSelector(selector) {
|
|
|
138
138
|
* (CodeQL `js/polynomial-redos`). This walk is linear and allocation-free
|
|
139
139
|
* per group.
|
|
140
140
|
*
|
|
141
|
-
* It consumes
|
|
142
|
-
* is not `[`. The previous implementation instead sliced to the
|
|
141
|
+
* It consumes consecutive `[…]` groups and stops at the first character that
|
|
142
|
+
* is not `[`. The previous implementation instead sliced to the last `]`
|
|
143
143
|
* before the brace, which kept multi-attribute selectors comparing as a
|
|
144
|
-
* whole
|
|
145
|
-
* consumed
|
|
144
|
+
* whole (that property is preserved here, since consecutive groups are all
|
|
145
|
+
* consumed) but it also swallowed a pseudo-class tail. On
|
|
146
146
|
* `:root[data-theme="light"]:not([data-private]) {` the last `]` is the one
|
|
147
147
|
* inside `:not(…)`, so the computed fragment was
|
|
148
148
|
* `:root[data-theme="light"]:not([data-private]` and the canonical
|
|
149
149
|
* comparison could never match. The unqualified
|
|
150
150
|
* `:root[data-theme="dark"] { }` beside it matched fine, and that asymmetry
|
|
151
|
-
*
|
|
152
|
-
* silently skipped the light one,
|
|
153
|
-
*
|
|
151
|
+
* was the bug: an override add mirrored itself into the dark block and
|
|
152
|
+
* silently skipped the light one, the half-finished themed edit
|
|
153
|
+
* `THEME_ATTRIBUTE_VARIANTS` exists to prevent.
|
|
154
154
|
*/
|
|
155
155
|
function rootAttributeSelector(line) {
|
|
156
156
|
const start = line.indexOf(':root[');
|
|
@@ -177,14 +177,14 @@ function rootAttributeSelector(line) {
|
|
|
177
177
|
* closing-brace line indices, or `undefined` when no such block exists.
|
|
178
178
|
*
|
|
179
179
|
* Scans a comment-stripped mirror of `lines` so braces inside comments do
|
|
180
|
-
* not offset the depth counter
|
|
180
|
+
* not offset the depth counter. The returned indices line up with the
|
|
181
181
|
* original array.
|
|
182
182
|
*/
|
|
183
183
|
function findVariantBlock(lines, variant) {
|
|
184
184
|
const stripped = stripBlockCommentsInLines(lines);
|
|
185
185
|
// The request goes through the same parse as the candidate lines, so a
|
|
186
186
|
// variant carrying its own `:not(…)` tail is compared tail-to-tail rather
|
|
187
|
-
// than being folded into the attribute run
|
|
187
|
+
// than being folded into the attribute run, where it would match nothing
|
|
188
188
|
// and every add would splice a fresh duplicate block.
|
|
189
189
|
const requested = rootAttributeSelector(`:root${variant} {`);
|
|
190
190
|
const want = canonicalSelector(requested?.attributes ?? `:root${variant}`);
|
|
@@ -193,10 +193,10 @@ function findVariantBlock(lines, variant) {
|
|
|
193
193
|
const selector = rootAttributeSelector(line);
|
|
194
194
|
if (selector === undefined || canonicalSelector(selector.attributes) !== want)
|
|
195
195
|
continue;
|
|
196
|
-
// An
|
|
196
|
+
// An unqualified request still matches a qualified block: that is the
|
|
197
197
|
// 0.44.2 behaviour `variantBlockQualifier` exists to report, since
|
|
198
198
|
// silently skipping the block is the worse failure. A request that names
|
|
199
|
-
// a qualifier, though, means it
|
|
199
|
+
// a qualifier, though, means it, so it must match.
|
|
200
200
|
if (wantQualifier !== '' && canonicalSelector(selector.qualifier) !== wantQualifier)
|
|
201
201
|
continue;
|
|
202
202
|
let openLine = /\{/.test(line) ? i : -1;
|
|
@@ -240,7 +240,7 @@ function findVariantBlockInsertionPoint(lines) {
|
|
|
240
240
|
/**
|
|
241
241
|
* True when a top-level `:root<variant>` block exists in `lines`. Used by
|
|
242
242
|
* the override path to write theme-attribute blocks only when the scaffold
|
|
243
|
-
* already declares them
|
|
243
|
+
* already declares them. `insertVariantDeclaration` would otherwise create
|
|
244
244
|
* the block, which is only wanted for the explicit `--variant` flow.
|
|
245
245
|
*/
|
|
246
246
|
export function variantBlockExists(lines, variant) {
|
|
@@ -250,13 +250,13 @@ export function variantBlockExists(lines, variant) {
|
|
|
250
250
|
* The pseudo-class qualifier on the matched `:root<variant>` block, or
|
|
251
251
|
* `undefined` when no block matched. `''` for an unqualified block.
|
|
252
252
|
*
|
|
253
|
-
* A qualifier such as `:not([data-private])` is
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
253
|
+
* A qualifier such as `:not([data-private])` is load-bearing: writing into
|
|
254
|
+
* that block scopes the declaration to the qualified case, and that may not
|
|
255
|
+
* be what the operator meant. Matching it is still the right call, since
|
|
256
|
+
* silently skipping it is the worse failure and the one that shipped, but
|
|
257
|
+
* the override path uses this to say out loud which selector it wrote
|
|
258
|
+
* through, so the narrowing is a visible decision rather than a theme bug
|
|
259
|
+
* discovered later.
|
|
260
260
|
*
|
|
261
261
|
* @param lines - Tokens CSS split into lines
|
|
262
262
|
* @param variant - Attribute selector fragment, e.g. `[data-theme="light"]`
|
|
@@ -275,8 +275,8 @@ export function variantBlockHasToken(lines, variant, tokenName) {
|
|
|
275
275
|
* not exist).
|
|
276
276
|
*
|
|
277
277
|
* The located form of {@link variantBlockHasToken}: the variant add path
|
|
278
|
-
* reports a skip the way the base path does
|
|
279
|
-
* line
|
|
278
|
+
* reports a skip the way the base path does, naming the block and the
|
|
279
|
+
* line, instead of returning a bare boolean that leaves a no-op re-run
|
|
280
280
|
* indistinguishable from a write.
|
|
281
281
|
*
|
|
282
282
|
* @param lines - Tokens CSS split into lines
|
|
@@ -288,11 +288,11 @@ export function findVariantBlockDeclaration(lines, variant, tokenName) {
|
|
|
288
288
|
const block = findVariantBlock(lines, variant);
|
|
289
289
|
if (!block)
|
|
290
290
|
return undefined;
|
|
291
|
-
// Comments are stripped across the
|
|
291
|
+
// Comments are stripped across the whole block before scanning, matching
|
|
292
292
|
// what the boolean form always did: a `/* … */` spanning several lines
|
|
293
293
|
// must not leave its tail looking like a declaration.
|
|
294
294
|
const blockLines = lines.slice(block.open, block.close + 1);
|
|
295
|
-
// Blank the comment's
|
|
295
|
+
// Blank the comment's characters rather than deleting it: removing a
|
|
296
296
|
// multi-line comment outright collapses its lines and shifts every line
|
|
297
297
|
// number after it, which is the one thing this function exists to report.
|
|
298
298
|
const stripped = blockLines
|