@hominis/fireforge 0.46.0 → 0.46.2
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 +17 -9
- package/dist/src/core/token-dark-mode.js +41 -28
- 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
|
@@ -39,16 +39,16 @@ function hasFtlFileExtension(value) {
|
|
|
39
39
|
/**
|
|
40
40
|
* Validates an FTL base path before writing it to furnace.json.
|
|
41
41
|
* Rejects:
|
|
42
|
-
* - empty values and null bytes
|
|
43
|
-
* - absolute paths (POSIX or Windows-drive) that escape the engine
|
|
44
|
-
* - `..` segments that escape the engine
|
|
42
|
+
* - empty values and null bytes
|
|
43
|
+
* - absolute paths (POSIX or Windows-drive) that escape the engine
|
|
44
|
+
* - `..` segments that escape the engine
|
|
45
45
|
* - file-shaped values ending in `.ftl` / `.properties` / `.dtd`
|
|
46
|
-
* (these are locale resources, not directories
|
|
47
|
-
* almost certainly meant to name the parent directory)
|
|
46
|
+
* (these are locale resources, not directories, so the operator
|
|
47
|
+
* almost certainly meant to name the parent directory)
|
|
48
48
|
*
|
|
49
49
|
* When {@link engineDir} is provided and exists on disk, the resolved
|
|
50
|
-
* `engine/${value}` path is probed
|
|
51
|
-
* directory, the same file-shape error fires
|
|
50
|
+
* `engine/${value}` path is probed. If it exists but is not a
|
|
51
|
+
* directory, the same file-shape error fires. If it does not exist yet,
|
|
52
52
|
* a non-blocking warning is logged (a fresh project that has not
|
|
53
53
|
* `fireforge download`-ed yet is the legitimate pre-existence case).
|
|
54
54
|
*/
|
|
@@ -87,16 +87,16 @@ async function validateFtlBasePath(value, engineDir) {
|
|
|
87
87
|
}
|
|
88
88
|
catch (error) {
|
|
89
89
|
// FurnaceError (from the `isDirectory()` branch above) is a real
|
|
90
|
-
// shape failure
|
|
90
|
+
// shape failure, so re-throw and let the operator see it.
|
|
91
91
|
if (error instanceof FurnaceError)
|
|
92
92
|
throw error;
|
|
93
93
|
// ENOENT is expected on a fresh project before `fireforge
|
|
94
|
-
// download` has populated engine
|
|
94
|
+
// download` has populated engine/. Only warn.
|
|
95
95
|
const code = getNodeErrorCode(error);
|
|
96
96
|
if (code === 'ENOENT') {
|
|
97
97
|
warn(`ftlBasePath "${value}" does not yet exist at ${resolved}. This is fine if you have not run "fireforge download" yet; rerun "fireforge furnace init --force" after the engine is extracted to re-validate.`);
|
|
98
98
|
}
|
|
99
|
-
// Any other stat error is also
|
|
99
|
+
// Any other stat error is also ignored here as best-effort: a
|
|
100
100
|
// permission issue or malformed engine checkout will surface on
|
|
101
101
|
// the next command that actually reads the FTL tree.
|
|
102
102
|
}
|
|
@@ -116,7 +116,7 @@ export async function furnaceInitCommand(projectRoot, options = {}) {
|
|
|
116
116
|
const paths = getProjectPaths(projectRoot);
|
|
117
117
|
// Seed the default furnace config with a tokenPrefix derived from
|
|
118
118
|
// fireforge.json's binaryName so `token coverage` sees real tokens on the
|
|
119
|
-
// very first run
|
|
119
|
+
// very first run. Without the prefix default, a fresh init → token add →
|
|
120
120
|
// coverage sequence reports `0 tokens / N unknown` because the scan has
|
|
121
121
|
// nothing to key off. Loading fireforge.json here is best-effort: a
|
|
122
122
|
// project without one (mid-setup) falls through to the prefix-less
|
|
@@ -197,8 +197,8 @@ export async function furnaceInitCommand(projectRoot, options = {}) {
|
|
|
197
197
|
* Scaffolds the default tokens CSS file under the engine and registers
|
|
198
198
|
* its path in `fireforge.json`'s `patchLint.rawColorAllowlist`. Both
|
|
199
199
|
* operations are skipped silently when the engine directory does not
|
|
200
|
-
* yet exist (a fresh project that hasn't `fireforge download`ed yet)
|
|
201
|
-
*
|
|
200
|
+
* yet exist (a fresh project that hasn't `fireforge download`ed yet).
|
|
201
|
+
* The scaffold is re-driven on the next `furnace init --force`.
|
|
202
202
|
*
|
|
203
203
|
* Returns the scaffolded path when the file was actually created, so
|
|
204
204
|
* the init command can surface it in the summary note.
|
|
@@ -258,12 +258,12 @@ async function scaffoldTokensCss(projectRoot) {
|
|
|
258
258
|
// is owned end-to-end by tooling. Scaffolding and allowlisting it without
|
|
259
259
|
// registering leaves the very next `fireforge status` correctly flagging
|
|
260
260
|
// it as unmanaged + unregistered while `furnace deploy --dry-run` reports
|
|
261
|
-
// nothing to deploy
|
|
261
|
+
// nothing to deploy, a documented init command turning a clean project
|
|
262
262
|
// unclean. The CSS lives at the canonical
|
|
263
263
|
// `browser/themes/shared/<binaryName>-tokens.css` path the shared-CSS rule
|
|
264
264
|
// already targets, so it gets the same
|
|
265
265
|
// `skin/classic/browser/<name>.css (../shared/<name>.css)` entry as any
|
|
266
|
-
// other shared CSS.
|
|
266
|
+
// other shared CSS. It is idempotent: `furnace init --force` against a
|
|
267
267
|
// registered tree is a no-op.
|
|
268
268
|
try {
|
|
269
269
|
const fileBase = `${forgeConfig.binaryName}-tokens.css`;
|
|
@@ -22,8 +22,8 @@ async function getHealthIndicator(componentDir, type, name, appliedChecksums) {
|
|
|
22
22
|
}
|
|
23
23
|
catch {
|
|
24
24
|
// A race with `furnace remove`, filesystem permission change, or a
|
|
25
|
-
// transient IO failure must not crash the entire `list -v` output
|
|
26
|
-
// render a degraded state
|
|
25
|
+
// transient IO failure must not crash the entire `list -v` output, so
|
|
26
|
+
// render a degraded state and the rest of the table still shows.
|
|
27
27
|
return formatErrorText('unavailable');
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -8,7 +8,7 @@ import type { FurnaceOverrideOptions } from '../../types/commands/index.js';
|
|
|
8
8
|
export declare function furnaceOverrideCommand(projectRoot: string, name?: string, options?: FurnaceOverrideOptions): Promise<void>;
|
|
9
9
|
/**
|
|
10
10
|
* Creates multiple overrides in a single invocation. Each component is validated
|
|
11
|
-
* and created sequentially
|
|
11
|
+
* and created sequentially. Failures on one component do not block the rest.
|
|
12
12
|
* @param projectRoot - Root directory of the project
|
|
13
13
|
* @param names - Component tag names to override
|
|
14
14
|
* @param options - CLI options applied to all overrides
|
|
@@ -79,7 +79,7 @@ async function copyOverrideFiles(options) {
|
|
|
79
79
|
* override entry. Re-reads the current on-disk furnace.json inside the
|
|
80
80
|
* operation lock and splices the new entry onto the fresh state, so two
|
|
81
81
|
* concurrent `furnace override` commands cannot race their read-modify-write
|
|
82
|
-
* cycles into a single surviving entry
|
|
82
|
+
* cycles into a single surviving entry. Otherwise both report success and
|
|
83
83
|
* furnace.json keeps only the second writer's.
|
|
84
84
|
*/
|
|
85
85
|
async function saveOverrideConfig(options) {
|
|
@@ -96,8 +96,8 @@ async function saveOverrideConfig(options) {
|
|
|
96
96
|
await writeJson(overrideJsonPath, overrideJson);
|
|
97
97
|
// Re-read the current furnace.json inside the lock. The outer caller
|
|
98
98
|
// loaded a snapshot before entering `runFurnaceMutation`, but another
|
|
99
|
-
// furnace mutation (override / init / sync) may have landed in between
|
|
100
|
-
//
|
|
99
|
+
// furnace mutation (override / init / sync) may have landed in between,
|
|
100
|
+
// and writing back the stale snapshot would drop that concurrent write.
|
|
101
101
|
const freshConfig = await loadAuthoringFurnaceConfig(projectRoot);
|
|
102
102
|
freshConfig.overrides[componentName] = {
|
|
103
103
|
type: overrideType,
|
|
@@ -164,11 +164,11 @@ async function performOverrideMutations(args) {
|
|
|
164
164
|
}
|
|
165
165
|
/**
|
|
166
166
|
* Throws if `componentName` is already classified as something `override`
|
|
167
|
-
* cannot coexist with. A stock-bucket entry is
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
* transition in-memory
|
|
167
|
+
* cannot coexist with. A stock-bucket entry is not a hard conflict:
|
|
168
|
+
* `override` exists to fork a component out of the stock bucket into the
|
|
169
|
+
* overrides bucket, and requiring manual `furnace.json` surgery first was
|
|
170
|
+
* a footgun. `promoteStockToOverrideIfNeeded` handles the
|
|
171
|
+
* transition in-memory. This guard only rejects the other two cases where
|
|
172
172
|
* a rename actually contradicts existing state.
|
|
173
173
|
*/
|
|
174
174
|
function assertNoComponentCollision(config, componentName) {
|
|
@@ -185,7 +185,7 @@ function assertNoComponentCollision(config, componentName) {
|
|
|
185
185
|
* the subsequent `writeFurnaceConfig` inside the mutation phase persists
|
|
186
186
|
* the stock → override promotion atomically alongside the new override
|
|
187
187
|
* entry. Returns true when a promotion happened so the caller can emit a
|
|
188
|
-
* one-line note
|
|
188
|
+
* one-line note. Returns false when the component was not stock.
|
|
189
189
|
*/
|
|
190
190
|
function promoteStockToOverrideIfNeeded(config, componentName) {
|
|
191
191
|
const index = config.stock.indexOf(componentName);
|
|
@@ -203,9 +203,9 @@ function promoteStockToOverrideIfNeeded(config, componentName) {
|
|
|
203
203
|
export async function furnaceOverrideCommand(projectRoot, name, options = {}) {
|
|
204
204
|
const isInteractive = stdioIsInteractive();
|
|
205
205
|
intro('Furnace Override');
|
|
206
|
-
// --- Validate config-independent inputs
|
|
206
|
+
// --- Validate config-independent inputs before auto-creating furnace.json
|
|
207
207
|
// so a failed authoring command never strands a fresh config in the
|
|
208
|
-
// project root. CLI-supplied name is checked here
|
|
208
|
+
// project root. CLI-supplied name is checked here. The engine directory
|
|
209
209
|
// and component-resolution checks below also have no config dependency.
|
|
210
210
|
const paths = getProjectPaths(projectRoot);
|
|
211
211
|
if (name !== undefined && !CUSTOM_ELEMENT_TAG_PATTERN.test(name)) {
|
|
@@ -226,7 +226,7 @@ export async function furnaceOverrideCommand(projectRoot, name, options = {}) {
|
|
|
226
226
|
// --- Resolve component name ---
|
|
227
227
|
let componentName = name;
|
|
228
228
|
if (!componentName) {
|
|
229
|
-
// Interactive prompt path
|
|
229
|
+
// Interactive prompt path. Non-interactive missing-name was rejected above.
|
|
230
230
|
const allComponents = await scanWidgetsDirectory(paths.engine, ftlDir);
|
|
231
231
|
const available = allComponents.filter((c) => !(c.tagName in config.overrides));
|
|
232
232
|
if (available.length === 0) {
|
|
@@ -336,7 +336,7 @@ export async function furnaceOverrideCommand(projectRoot, name, options = {}) {
|
|
|
336
336
|
}
|
|
337
337
|
/**
|
|
338
338
|
* Creates multiple overrides in a single invocation. Each component is validated
|
|
339
|
-
* and created sequentially
|
|
339
|
+
* and created sequentially. Failures on one component do not block the rest.
|
|
340
340
|
* @param projectRoot - Root directory of the project
|
|
341
341
|
* @param names - Component tag names to override
|
|
342
342
|
* @param options - CLI options applied to all overrides
|
|
@@ -362,8 +362,8 @@ export async function furnaceBatchOverrideCommand(projectRoot, names, options =
|
|
|
362
362
|
const state = await loadState(projectRoot);
|
|
363
363
|
// Check for duplicates and pre-existing classifications across every
|
|
364
364
|
// bucket in furnace.json. A stock-bucket entry is promoted in-memory
|
|
365
|
-
// here (see `promoteStockToOverrideIfNeeded`) rather than rejected
|
|
366
|
-
// the operator's intent is to fork that specific stock component. The
|
|
365
|
+
// here (see `promoteStockToOverrideIfNeeded`) rather than rejected,
|
|
366
|
+
// since the operator's intent is to fork that specific stock component. The
|
|
367
367
|
// collision guard still rejects name conflicts that would double-
|
|
368
368
|
// classify a tag in a way `writeFurnaceConfig` cannot safely produce
|
|
369
369
|
// (two overrides, or an override + custom).
|
|
@@ -13,8 +13,8 @@ import { toError } from '../../utils/errors.js';
|
|
|
13
13
|
import { pathExists } from '../../utils/fs.js';
|
|
14
14
|
import { info, intro, outro, spinner, warn } from '../../utils/logger.js';
|
|
15
15
|
/**
|
|
16
|
-
* Runs the two teardown steps
|
|
17
|
-
* restore
|
|
16
|
+
* Runs the two teardown steps (`cleanStories` and the rollback-journal
|
|
17
|
+
* restore) independently, collecting whatever errors either step throws.
|
|
18
18
|
* Both steps must run regardless of the other's outcome, because each
|
|
19
19
|
* operates on a different part of engine state and skipping one leaves
|
|
20
20
|
* the engine in a worse position than a single-step failure.
|
|
@@ -72,10 +72,10 @@ function reportPreviewStagingFailures(stageResult) {
|
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
74
|
* Filenames emitted by the Firefox build backend (not by Storybook's npm
|
|
75
|
-
* package set)
|
|
75
|
+
* package set). Their absence means `mach build` has not produced its
|
|
76
76
|
* post-configure artifacts, which is a different failure mode from a missing
|
|
77
77
|
* Storybook workspace dependency tree. A
|
|
78
|
-
* `FileNotFoundError: [...] chrome-map.json`
|
|
78
|
+
* `FileNotFoundError: [...] chrome-map.json` after a successful Storybook
|
|
79
79
|
* `npm install` is the case a dep-focused heuristic misdiagnoses, sending
|
|
80
80
|
* the operator back to `--install`. The pattern list is narrow on purpose so
|
|
81
81
|
* the backend-rebuild hint only fires when it is confident.
|
|
@@ -101,7 +101,7 @@ export function buildStorybookFailureMessage(output, installRequested) {
|
|
|
101
101
|
? 'Try running "python3 ./mach storybook upgrade" manually in the engine directory.'
|
|
102
102
|
: 'Run "fireforge furnace preview --install" to bootstrap Storybook dependencies, or run "python3 ./mach storybook upgrade" manually in engine/.';
|
|
103
103
|
const hasFileNotFoundSignal = /(ENOENT|No such file or directory|FileNotFoundError)/i.test(output);
|
|
104
|
-
// Check backend-artifact signal first
|
|
104
|
+
// Check the backend-artifact signal first: a missing chrome-map.json looks
|
|
105
105
|
// like any other "No such file" error to a naïve regex, but the fix is
|
|
106
106
|
// to rerun `fireforge build`, not to reinstall Storybook dependencies.
|
|
107
107
|
if (hasFileNotFoundSignal && BACKEND_ARTIFACT_PATTERNS.some((p) => p.test(output))) {
|
|
@@ -122,7 +122,7 @@ export function buildStorybookFailureMessage(output, installRequested) {
|
|
|
122
122
|
* Preflights the Firefox build + toolchain prerequisites `mach storybook`
|
|
123
123
|
* quietly assumes. Without it, preview stages components and launches a
|
|
124
124
|
* ~1000-package `mach storybook upgrade` npm install before the backend
|
|
125
|
-
* surfaces a "missing chrome-map.json" / Cargo-config failure
|
|
125
|
+
* surfaces a "missing chrome-map.json" / Cargo-config failure. This refuses
|
|
126
126
|
* fast and leaves the workspace untouched.
|
|
127
127
|
*
|
|
128
128
|
* @param engineDir - Resolved engine directory
|
|
@@ -143,7 +143,7 @@ async function assertPreviewPrerequisites(engineDir) {
|
|
|
143
143
|
// follow the remediation instruction ("run bootstrap then rerun preview")
|
|
144
144
|
// hit the same refusal on the retry, because `fireforge bootstrap` alone
|
|
145
145
|
// produces only `.in`. Either name is sufficient to prove the Rust
|
|
146
|
-
// toolchain is registered
|
|
146
|
+
// toolchain is registered. The stronger `hasBuildArtifacts` check above
|
|
147
147
|
// already guards against a completely un-configured tree.
|
|
148
148
|
const cargoConfigPath = join(engineDir, '.cargo', 'config.toml');
|
|
149
149
|
const cargoConfigInPath = join(engineDir, '.cargo', 'config.toml.in');
|
|
@@ -158,10 +158,10 @@ async function assertPreviewPrerequisites(engineDir) {
|
|
|
158
158
|
/**
|
|
159
159
|
* Emits a framing banner when the Storybook workspace has not yet had its npm
|
|
160
160
|
* dependencies installed. `mach storybook` drives the install internally and
|
|
161
|
-
* prints ELSPROBLEMS / UNMET DEPENDENCY lines verbatim
|
|
161
|
+
* prints ELSPROBLEMS / UNMET DEPENDENCY lines verbatim. Without this banner
|
|
162
162
|
* operators reliably read the npm output as a failure.
|
|
163
163
|
*
|
|
164
|
-
* Skipped when `--install` was explicitly requested
|
|
164
|
+
* Skipped when `--install` was explicitly requested, since that path runs
|
|
165
165
|
* `mach storybook upgrade` before the preview launches, so the npm output
|
|
166
166
|
* for the subsequent `mach storybook` invocation is a no-op.
|
|
167
167
|
*/
|
|
@@ -177,9 +177,9 @@ async function announceStorybookFirstRunIfNeeded(engineDir, installRequested) {
|
|
|
177
177
|
/**
|
|
178
178
|
* Surfaces an explicit success banner after a clean mach-storybook
|
|
179
179
|
* exit so the operator's scrollback visually terminates the npm noise
|
|
180
|
-
* from the first-run install. Only fires on expected exit codes
|
|
181
|
-
*
|
|
182
|
-
*
|
|
180
|
+
* from the first-run install. Only fires on expected exit codes. Non-zero
|
|
181
|
+
* cases fall through to the existing `buildStorybookFailureMessage`
|
|
182
|
+
* classification.
|
|
183
183
|
*/
|
|
184
184
|
function announceStorybookCleanExitIfApplicable(exitCode) {
|
|
185
185
|
if (exitCode === 0 || exitCode === 130 || exitCode === 143) {
|
|
@@ -212,9 +212,9 @@ export async function furnacePreviewCommand(projectRoot, options = {}) {
|
|
|
212
212
|
await assertPreviewPrerequisites(paths.engine);
|
|
213
213
|
let previewResult;
|
|
214
214
|
// True once we are about to (or have) written to engine/.../stories/furnace.
|
|
215
|
-
//
|
|
216
|
-
//
|
|
217
|
-
// full-directory wipe, so it is correct to run against partial state
|
|
215
|
+
// Set before `syncStories` is awaited so a mid-sync failure still
|
|
216
|
+
// triggers `cleanStories` during teardown. `cleanStories` is a
|
|
217
|
+
// full-directory wipe, so it is correct to run against partial state,
|
|
218
218
|
// including state with zero files, where it is a cheap no-op.
|
|
219
219
|
let storiesCleanupRequired = false;
|
|
220
220
|
let previewJournal;
|
|
@@ -264,7 +264,7 @@ export async function furnacePreviewCommand(projectRoot, options = {}) {
|
|
|
264
264
|
stageSpinner.stop(`Staged ${stageResult.applied.length} component${stageResult.applied.length === 1 ? '' : 's'} for preview`);
|
|
265
265
|
}
|
|
266
266
|
// Sync story files. Set the cleanup flag before the await so a partial
|
|
267
|
-
// write failure still triggers the teardown wipe
|
|
267
|
+
// write failure still triggers the teardown wipe. `syncStories` writes
|
|
268
268
|
// files incrementally with no internal cleanup of its own.
|
|
269
269
|
const syncSpinner = spinner('Syncing component stories...');
|
|
270
270
|
storiesCleanupRequired = true;
|
|
@@ -299,7 +299,7 @@ export async function furnacePreviewCommand(projectRoot, options = {}) {
|
|
|
299
299
|
// cleanStories must not prevent the journal restore, and vice versa.
|
|
300
300
|
// Running teardown in a `finally` that calls
|
|
301
301
|
// `restoreRollbackJournalOrThrow` throws synchronously, bypassing the
|
|
302
|
-
// primary error and skipping downstream handling
|
|
302
|
+
// primary error and skipping downstream handling, so the engine is left
|
|
303
303
|
// with staged files and the user gets a teardown message with no
|
|
304
304
|
// guidance. Both failures are collected instead and, if anything went
|
|
305
305
|
// wrong, a `pendingRepair` marker is persisted for `fireforge doctor` to
|
|
@@ -90,8 +90,8 @@ async function refreshSingleOverride(projectRoot, name, options = {}) {
|
|
|
90
90
|
}
|
|
91
91
|
return { results: [], currentVersion };
|
|
92
92
|
}
|
|
93
|
-
// Prefer the per-override baseCommit (survives download --force)
|
|
94
|
-
// to the project-wide value for overrides created before this field existed.
|
|
93
|
+
// Prefer the per-override baseCommit (survives download --force). Fall
|
|
94
|
+
// back to the project-wide value for overrides created before this field existed.
|
|
95
95
|
const baseCommit = overrideConfig.baseCommit ?? state.baseCommit;
|
|
96
96
|
if (!baseCommit) {
|
|
97
97
|
throw new FurnaceError('Cannot refresh: baseCommit not found. Re-run "fireforge download" to establish a baseline, ' +
|
|
@@ -153,7 +153,7 @@ async function refreshSingleOverride(projectRoot, name, options = {}) {
|
|
|
153
153
|
return fileResults;
|
|
154
154
|
}
|
|
155
155
|
catch (error) {
|
|
156
|
-
// A dry run wrote nothing, so there is no journal to restore
|
|
156
|
+
// A dry run wrote nothing, so there is no journal to restore. It
|
|
157
157
|
// rethrows without touching the lifecycle wrapper.
|
|
158
158
|
if (!dryRun) {
|
|
159
159
|
return await completeJournalRollback(ctx, journal, error, {
|
|
@@ -171,7 +171,7 @@ async function refreshSingleOverride(projectRoot, name, options = {}) {
|
|
|
171
171
|
/**
|
|
172
172
|
* Refreshes every override sequentially, tallying merged/conflict/
|
|
173
173
|
* unchanged file counts. Per-override errors are expected (warned and
|
|
174
|
-
* recorded as failures) and do not abort the batch
|
|
174
|
+
* recorded as failures) and do not abort the batch. Only an error that
|
|
175
175
|
* escapes this function entirely warrants the caller's journal rollback.
|
|
176
176
|
*/
|
|
177
177
|
async function runBatchRefresh(projectRoot, overrideNames, options) {
|
|
@@ -232,7 +232,7 @@ export async function furnaceRefreshCommand(projectRoot, name, options = {}) {
|
|
|
232
232
|
if (name && refreshAll) {
|
|
233
233
|
throw new FurnaceError('Cannot specify both a component name and --all. Use one or the other.');
|
|
234
234
|
}
|
|
235
|
-
// Verify engine exists
|
|
235
|
+
// Verify engine exists: refresh reads engine files for three-way merge
|
|
236
236
|
// and --reset-base reads engine HEAD. Without this check, the user gets
|
|
237
237
|
// an obscure git error instead of a clear precondition message.
|
|
238
238
|
await assertFurnaceEngineReady(projectRoot);
|
|
@@ -265,7 +265,7 @@ export async function furnaceRefreshCommand(projectRoot, name, options = {}) {
|
|
|
265
265
|
}
|
|
266
266
|
// Snapshot furnace.json before the batch loop so an unexpected failure
|
|
267
267
|
// (process crash, unhandled error) can be recovered from. Per-component
|
|
268
|
-
// errors caught below are expected and do not trigger a restore
|
|
268
|
+
// errors caught below are expected and do not trigger a restore. Only
|
|
269
269
|
// an error that escapes the loop entirely warrants rolling back.
|
|
270
270
|
const batchJournal = dryRun ? undefined : createRollbackJournal();
|
|
271
271
|
if (batchJournal) {
|
|
@@ -2,7 +2,7 @@ import type { FurnacePaths } from '../../core/furnace-config.js';
|
|
|
2
2
|
import type { RollbackJournal } from '../../core/furnace-rollback.js';
|
|
3
3
|
import type { FurnaceConfig, FurnaceState } from '../../types/furnace.js';
|
|
4
4
|
/**
|
|
5
|
-
* Engine-side and workspace-side removal for an
|
|
5
|
+
* Engine-side and workspace-side removal for an override component.
|
|
6
6
|
*
|
|
7
7
|
* Runs inside the caller's rollback journal rather than opening its own, so
|
|
8
8
|
* a failure anywhere in the remove still restores the whole operation as a
|
|
@@ -20,8 +20,8 @@ export declare function performOverrideRemovalMutations(args: {
|
|
|
20
20
|
journal: RollbackJournal;
|
|
21
21
|
}): Promise<void>;
|
|
22
22
|
/**
|
|
23
|
-
* Engine-side and workspace-side removal for a
|
|
24
|
-
* Sibling of {@link performOverrideRemovalMutations}
|
|
23
|
+
* Engine-side and workspace-side removal for a custom component.
|
|
24
|
+
* Sibling of {@link performOverrideRemovalMutations}. See its note.
|
|
25
25
|
*/
|
|
26
26
|
export declare function performCustomRemovalMutations(args: {
|
|
27
27
|
projectRoot: string;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* `furnaceRemoveCommand` at the per-function cap. Extracting them inside the
|
|
8
8
|
* same file would trade a function-length problem for a file-length one.
|
|
9
9
|
*
|
|
10
|
-
* Both run inside the
|
|
10
|
+
* Both run inside the caller's rollback journal rather than opening their
|
|
11
11
|
* own, so a failure anywhere in the remove still restores the whole
|
|
12
12
|
* operation as a single unit.
|
|
13
13
|
*/
|
|
@@ -27,12 +27,12 @@ import { removeDeployedCustomFiles } from './remove-state.js';
|
|
|
27
27
|
/**
|
|
28
28
|
* Restores every override-deployed file in `engine/` to its pristine HEAD
|
|
29
29
|
* state, inverting what `applyOverrideComponent` would have written. Files that
|
|
30
|
-
* existed in HEAD are restored via `git restore
|
|
30
|
+
* existed in HEAD are restored via `git restore`. Files the override
|
|
31
31
|
* introduced (not in HEAD) are deleted outright.
|
|
32
32
|
*
|
|
33
|
-
* The restore set is the
|
|
34
|
-
* workspace directory and (b) filenames recorded in `previousChecksumKeys
|
|
35
|
-
*
|
|
33
|
+
* The restore set is the union of (a) files currently in the override
|
|
34
|
+
* workspace directory and (b) filenames recorded in `previousChecksumKeys`,
|
|
35
|
+
* i.e. files we know we deployed last time, even if the developer has
|
|
36
36
|
* since deleted them from the workspace. Without (b), a workspace deletion
|
|
37
37
|
* leaves an orphaned engine copy that `furnace remove` would never see.
|
|
38
38
|
*
|
|
@@ -43,14 +43,15 @@ import { removeDeployedCustomFiles } from './remove-state.js';
|
|
|
43
43
|
async function restoreOverrideEngineFiles(engineDir, overrideDir, overrideConfig, previousChecksumKeys, ftlDir, journal) {
|
|
44
44
|
// Engine-as-git is a hard precondition for restoration: git HEAD is the only
|
|
45
45
|
// honest oracle for "what was there before the override". If the engine is
|
|
46
|
-
// not a git repo we refuse rather than silently leaving files behind
|
|
47
|
-
// previous warn
|
|
46
|
+
// not a git repo we refuse rather than silently leaving files behind. The
|
|
47
|
+
// previous behaviour was to warn and continue, which is what this fix
|
|
48
|
+
// removes.
|
|
48
49
|
if (!(await isGitRepository(engineDir))) {
|
|
49
50
|
throw new FurnaceError('Cannot restore override files: engine is not a git repository. Run "fireforge download" to initialise it.');
|
|
50
51
|
}
|
|
51
52
|
// Build the union of "files we still see on disk" and "files state.json
|
|
52
53
|
// claims we deployed". The state set is the only authority for files that
|
|
53
|
-
// were deployed and later deleted from the workspace
|
|
54
|
+
// were deployed and later deleted from the workspace. The workspace set is
|
|
54
55
|
// the only authority for files added since last apply that have not yet
|
|
55
56
|
// been recorded in state. We need both.
|
|
56
57
|
const fileSet = new Set();
|
|
@@ -80,7 +81,7 @@ async function restoreOverrideEngineFiles(engineDir, overrideDir, overrideConfig
|
|
|
80
81
|
return { restored, removed };
|
|
81
82
|
}
|
|
82
83
|
/**
|
|
83
|
-
* Engine-side and workspace-side removal for an
|
|
84
|
+
* Engine-side and workspace-side removal for an override component.
|
|
84
85
|
*
|
|
85
86
|
* Runs inside the caller's rollback journal rather than opening its own, so
|
|
86
87
|
* a failure anywhere in the remove still restores the whole operation as a
|
|
@@ -90,10 +91,10 @@ export async function performOverrideRemovalMutations(args) {
|
|
|
90
91
|
const { name, paths, furnacePaths, freshConfig, freshState, ftlDir, journal } = args;
|
|
91
92
|
const overrideConfig = freshConfig.overrides[name];
|
|
92
93
|
const dir = join(furnacePaths.overridesDir, name);
|
|
93
|
-
// Restore deployed engine files
|
|
94
|
+
// Restore deployed engine files before removing the workspace
|
|
94
95
|
// directory. The restore set is the union of (a) files currently in
|
|
95
|
-
// the workspace and (b) files state.json says we deployed last time
|
|
96
|
-
//
|
|
96
|
+
// the workspace and (b) files state.json says we deployed last time.
|
|
97
|
+
// Without (b), source-side deletions would orphan engine copies
|
|
97
98
|
// that this command can never see again.
|
|
98
99
|
if (overrideConfig?.basePath) {
|
|
99
100
|
const previousKeys = Object.keys(extractComponentChecksums(freshState.appliedChecksums, 'override', name));
|
|
@@ -112,8 +113,8 @@ export async function performOverrideRemovalMutations(args) {
|
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
115
|
/**
|
|
115
|
-
* Engine-side and workspace-side removal for a
|
|
116
|
-
* Sibling of {@link performOverrideRemovalMutations}
|
|
116
|
+
* Engine-side and workspace-side removal for a custom component.
|
|
117
|
+
* Sibling of {@link performOverrideRemovalMutations}. See its note.
|
|
117
118
|
*/
|
|
118
119
|
export async function performCustomRemovalMutations(args) {
|
|
119
120
|
const { projectRoot, name, paths, furnacePaths, freshConfig, ftlDir, journal } = args;
|
|
@@ -140,12 +141,12 @@ export async function performCustomRemovalMutations(args) {
|
|
|
140
141
|
await removeDir(dir);
|
|
141
142
|
info(`Deleted components/custom/${name}/`);
|
|
142
143
|
}
|
|
143
|
-
// Clean up deployed files in engine (per-file
|
|
144
|
+
// Clean up deployed files in engine (per-file, see helper doc).
|
|
144
145
|
if (customConfig?.targetPath) {
|
|
145
146
|
await removeDeployedCustomFiles(projectRoot, paths.engine, name, customConfig.targetPath, journal);
|
|
146
147
|
}
|
|
147
148
|
// Localized components deploy a .ftl outside targetPath into the
|
|
148
|
-
// shared Fluent tree
|
|
149
|
+
// shared Fluent tree. Apply writes it, so remove must delete it too
|
|
149
150
|
// or the locale payload is orphaned.
|
|
150
151
|
if (customConfig?.localized) {
|
|
151
152
|
const ftlRel = join(ftlDir, `${name}.ftl`);
|
|
@@ -154,12 +155,12 @@ export async function performCustomRemovalMutations(args) {
|
|
|
154
155
|
await snapshotFile(journal, ftlPath);
|
|
155
156
|
await removeFile(ftlPath);
|
|
156
157
|
// `ftlRel` is a native join, so on Windows an interpolated
|
|
157
|
-
// `engine/${ftlRel}` renders as `engine/toolkit\locales
|
|
158
|
+
// `engine/${ftlRel}` renders as `engine/toolkit\locales\...`, one
|
|
158
159
|
// message with both separators. Print the engine-relative form.
|
|
159
160
|
info(`Deleted localized file engine/${normalizePathSlashes(ftlRel)}`);
|
|
160
161
|
}
|
|
161
162
|
// Drop the locale jar.mn chrome registration that `applyCustomFtlFile`
|
|
162
|
-
// wrote during deploy
|
|
163
|
+
// wrote during deploy. Otherwise the engine is left with a
|
|
163
164
|
// `locale/.../${name}.ftl` entry pointing at a file just deleted, which
|
|
164
165
|
// breaks the next package-manifest validation.
|
|
165
166
|
await removeCustomFtlJarMnEntry(paths.engine, `${name}.ftl`, ftlDir, customConfig, journal);
|
|
@@ -10,7 +10,7 @@ export declare function dropChecksumsByPrefix(state: FurnaceState, prefix: strin
|
|
|
10
10
|
* Per-file, never a recursive `removeDir` of the whole directory: nothing
|
|
11
11
|
* stops two components from sharing a targetPath (or a hand-edited config
|
|
12
12
|
* from pointing at an upstream-shared directory), and the recursive delete
|
|
13
|
-
* permanently destroyed the co-located files on success
|
|
13
|
+
* permanently destroyed the co-located files on success. The rollback
|
|
14
14
|
* journal only protects the failure path. Deployed files come from the
|
|
15
15
|
* component's state checksums, falling back to the conventional
|
|
16
16
|
* `<name>.{mjs,css,ftl}` set when state carries no record (cleared by a
|
|
@@ -24,7 +24,7 @@ export function dropChecksumsByPrefix(state, prefix) {
|
|
|
24
24
|
* Per-file, never a recursive `removeDir` of the whole directory: nothing
|
|
25
25
|
* stops two components from sharing a targetPath (or a hand-edited config
|
|
26
26
|
* from pointing at an upstream-shared directory), and the recursive delete
|
|
27
|
-
* permanently destroyed the co-located files on success
|
|
27
|
+
* permanently destroyed the co-located files on success. The rollback
|
|
28
28
|
* journal only protects the failure path. Deployed files come from the
|
|
29
29
|
* component's state checksums, falling back to the conventional
|
|
30
30
|
* `<name>.{mjs,css,ftl}` set when state carries no record (cleared by a
|
|
@@ -218,7 +218,7 @@ async function cleanupCustomMochikitTestFiles(name, projectRoot, journal) {
|
|
|
218
218
|
* leaves an operator who ran `furnace create --with-tests --xpcshell`
|
|
219
219
|
* followed by `furnace remove` with orphan `xpcshell.toml` +
|
|
220
220
|
* `test_<name>_packaged.js` files still referencing the removed component.
|
|
221
|
-
* This pass mirrors the mochitest one
|
|
221
|
+
* This pass mirrors the mochitest one: snapshot before removal,
|
|
222
222
|
* warn-and-continue semantics, explicit summary on partial failures.
|
|
223
223
|
*/
|
|
224
224
|
async function cleanupCustomXpcshellTestFiles(name, projectRoot, journal) {
|
|
@@ -307,7 +307,7 @@ async function confirmFurnaceRemove(name, type, options, isInteractive) {
|
|
|
307
307
|
}
|
|
308
308
|
/**
|
|
309
309
|
* Enforces the engine-as-git precondition for both override and custom
|
|
310
|
-
* removals. Runs
|
|
310
|
+
* removals. Runs before the lock is acquired or a journal is registered so
|
|
311
311
|
* the failure path does not involve any rollback infrastructure.
|
|
312
312
|
*/
|
|
313
313
|
async function requireGitEngineForRemove(type, name, engineDir) {
|
|
@@ -10,7 +10,7 @@ export function updateBrowserChromeTestContent(content, oldName, newName, binary
|
|
|
10
10
|
const newUnderscored = newName.replace(/-/g, '_');
|
|
11
11
|
const oldTestStem = deriveTestStem(oldName, binaryName);
|
|
12
12
|
const newTestStem = deriveTestStem(newName, binaryName);
|
|
13
|
-
//
|
|
13
|
+
// One pass over the content, instead of four chained `.replace()` calls.
|
|
14
14
|
//
|
|
15
15
|
// Chaining let each rule see the previous rule's output. Renaming
|
|
16
16
|
// `acme-widget` to `acme-widget-v2` rewrote `test_acme_widget_defined` to
|
|
@@ -23,12 +23,12 @@ export function updateBrowserChromeTestContent(content, oldName, newName, binary
|
|
|
23
23
|
// alternative that matches at a given position.
|
|
24
24
|
const alternatives = [
|
|
25
25
|
// The stem is a short bare fragment (`moz-` and binary prefixes stripped,
|
|
26
|
-
// hyphens underscored)
|
|
26
|
+
// hyphens underscored), so `panel` for `moz-panel`. Matching it loose, even
|
|
27
27
|
// with hyphen guards, rewrote unrelated underscore-delimited identifiers
|
|
28
28
|
// such as `test_panel_group_integration`, because `_` must stay a legal
|
|
29
29
|
// neighbour for the generated name to match at all. The scaffold emits the
|
|
30
30
|
// stem in exactly one shape, so anchor to that shape instead of guessing
|
|
31
|
-
// from boundaries
|
|
31
|
+
// from boundaries. The anchored shape carries its own guards so it cannot
|
|
32
32
|
// match inside a longer identifier (`mytest_panel_defined_extra`).
|
|
33
33
|
{
|
|
34
34
|
pattern: `(?<![\\w-])test_${escapeRegex(oldTestStem)}_defined(?![\\w-])`,
|
|
@@ -37,10 +37,10 @@ export function updateBrowserChromeTestContent(content, oldName, newName, binary
|
|
|
37
37
|
// Word-boundary-aware, matching `furnace/rename.ts` and
|
|
38
38
|
// `rename-xpcshell.ts`: without the guards a rename of `moz-panel` rewrote
|
|
39
39
|
// `moz-panel-group`. `_` stays a legal neighbour for the underscored form
|
|
40
|
-
// because it is
|
|
40
|
+
// because it is embedded in generated identifiers on purpose. `-` is
|
|
41
41
|
// not.
|
|
42
42
|
//
|
|
43
|
-
// Skipped when the underscored form
|
|
43
|
+
// Skipped when the underscored form is the tag name (a hyphen-less
|
|
44
44
|
// component): both rules then match the same text and this one would win
|
|
45
45
|
// on order, substituting `newUnderscored` where the tag `newName` was
|
|
46
46
|
// meant. The stem rule still covers the one generated identifier shape.
|
|
@@ -55,9 +55,10 @@ export function updateBrowserChromeTestContent(content, oldName, newName, binary
|
|
|
55
55
|
{ pattern: `(?<![\\w-])${escapeRegex(oldName)}(?![\\w-])`, to: newName },
|
|
56
56
|
{ pattern: `\\b${escapeRegex(oldClassName)}\\b`, to: newClassName },
|
|
57
57
|
];
|
|
58
|
-
// Each alternative is its own capture group and the replacement is picked
|
|
59
|
-
// the group that matched
|
|
60
|
-
// two rules can produce the same match with different
|
|
58
|
+
// Each alternative is its own capture group and the replacement is picked
|
|
59
|
+
// by the group that matched, rather than by the matched text, which is
|
|
60
|
+
// ambiguous whenever two rules can produce the same match with different
|
|
61
|
+
// substitutions.
|
|
61
62
|
const combined = new RegExp(alternatives.map(({ pattern }) => `(${pattern})`).join('|'), 'g');
|
|
62
63
|
return content.replace(combined, (matched, ...args) => {
|
|
63
64
|
const groups = args.slice(0, alternatives.length);
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* so word-boundary occurrences of the old tag / underscored name map to the
|
|
9
9
|
* new ones.
|
|
10
10
|
*
|
|
11
|
-
* Extracted to keep `rename.ts` under the per-file LOC budget
|
|
11
|
+
* Extracted to keep `rename.ts` under the per-file LOC budget. It already
|
|
12
12
|
* carries mochikit + browser-mochitest + FTL handling.
|
|
13
13
|
*/
|
|
14
14
|
import { type RollbackJournal } from '../../core/furnace-rollback.js';
|
|
@@ -19,7 +19,7 @@ import { type RollbackJournal } from '../../core/furnace-rollback.js';
|
|
|
19
19
|
* old tag / old underscored name inside the test body.
|
|
20
20
|
*
|
|
21
21
|
* Best-effort: any failure logs a warning through the shared logger
|
|
22
|
-
* but never throws
|
|
22
|
+
* but never throws. The component rename itself has already succeeded
|
|
23
23
|
* at this point, and blocking on a test rewrite would leave the
|
|
24
24
|
* operator with a half-renamed component.
|
|
25
25
|
*
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* so word-boundary occurrences of the old tag / underscored name map to the
|
|
10
10
|
* new ones.
|
|
11
11
|
*
|
|
12
|
-
* Extracted to keep `rename.ts` under the per-file LOC budget
|
|
12
|
+
* Extracted to keep `rename.ts` under the per-file LOC budget. It already
|
|
13
13
|
* carries mochikit + browser-mochitest + FTL handling.
|
|
14
14
|
*/
|
|
15
15
|
import { readdir } from 'node:fs/promises';
|
|
@@ -28,7 +28,7 @@ import { escapeRegex } from '../../utils/regex.js';
|
|
|
28
28
|
* old tag / old underscored name inside the test body.
|
|
29
29
|
*
|
|
30
30
|
* Best-effort: any failure logs a warning through the shared logger
|
|
31
|
-
* but never throws
|
|
31
|
+
* but never throws. The component rename itself has already succeeded
|
|
32
32
|
* at this point, and blocking on a test rewrite would leave the
|
|
33
33
|
* operator with a half-renamed component.
|
|
34
34
|
*
|
|
@@ -59,7 +59,7 @@ export async function renameXpcshellTestFiles(engineDir, projectRoot, oldName, n
|
|
|
59
59
|
const newTestFileName = `test_${newUnderscored}_packaged.js`;
|
|
60
60
|
try {
|
|
61
61
|
// Journal the new scaffold dir + files so rollback (including the
|
|
62
|
-
// SIGINT path) removes them
|
|
62
|
+
// SIGINT path) removes them. Only the old-name files were journaled
|
|
63
63
|
// before, so a failed rename stranded the new-name scaffold.
|
|
64
64
|
recordCreatedDir(journal, newScaffoldDir);
|
|
65
65
|
await ensureDir(newScaffoldDir);
|