@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
|
@@ -3,7 +3,7 @@ import { type RollbackJournal } from './furnace-rollback.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* The signal names the lifecycle wrapper knows how to react to. Spelled out
|
|
5
5
|
* as a literal union (rather than `NodeJS.Signals`) so the public type
|
|
6
|
-
* surface does not depend on the NodeJS global namespace
|
|
6
|
+
* surface does not depend on the NodeJS global namespace. Consumers of
|
|
7
7
|
* FireForge's published scoped npm package may compile against tsconfigs
|
|
8
8
|
* that omit `@types/node`.
|
|
9
9
|
*/
|
|
@@ -36,9 +36,9 @@ export interface FurnaceOperationContext {
|
|
|
36
36
|
* Bodies that catch-and-restore on their own (the `furnace/*` command
|
|
37
37
|
* bodies, `furnace-apply`) call this from their catch block after the
|
|
38
38
|
* restore, then re-throw. Without it the wrapper would restore the same
|
|
39
|
-
* journal again on the way out
|
|
40
|
-
* rename-based and converge, but it would race a second
|
|
41
|
-
* write against the state-file lock.
|
|
39
|
+
* journal again on the way out. That is harmless for the file writes,
|
|
40
|
+
* which are rename-based and converge, but it would race a second
|
|
41
|
+
* `pendingRepair` write against the state-file lock.
|
|
42
42
|
*/
|
|
43
43
|
markRolledBack(): void;
|
|
44
44
|
}
|
|
@@ -49,7 +49,7 @@ export interface RunFurnaceMutationOptions {
|
|
|
49
49
|
* Used by dry-run paths where no engine mutation occurs.
|
|
50
50
|
*
|
|
51
51
|
* Note: a dry-run can overlap with a real mutation because it does not
|
|
52
|
-
* acquire the lock. This is safe because dry-runs only read
|
|
52
|
+
* acquire the lock. This is safe because dry-runs only read. However, a
|
|
53
53
|
* dry-run that starts before a real mutation and finishes after it may
|
|
54
54
|
* observe partially-written engine state. Accept this trade-off so that
|
|
55
55
|
* concurrent dry-runs never block each other or a real apply.
|
|
@@ -58,11 +58,11 @@ export interface RunFurnaceMutationOptions {
|
|
|
58
58
|
/**
|
|
59
59
|
* Override the default 30 s furnace-lock timeout.
|
|
60
60
|
*
|
|
61
|
-
* Set from the caller's resolved `--wait-lock` budget, so
|
|
61
|
+
* Set from the caller's resolved `--wait-lock` budget, so one flag governs
|
|
62
62
|
* both locks a furnace mutation takes. Before that it was declared and
|
|
63
63
|
* never passed: `furnace deploy --wait-lock 1800` waited 1800 s for the
|
|
64
64
|
* engine session lock and then met `.fireforge/furnace.lock` with a fixed
|
|
65
|
-
* 30 s, which is the worst shape a budget can have
|
|
65
|
+
* 30 s, which is the worst shape a budget can have: it pays the whole
|
|
66
66
|
* wait and still refuses. When absent, {@link sessionWaitLockMs} supplies
|
|
67
67
|
* the session-wide budget so the twelve furnace mutators that declare no
|
|
68
68
|
* flag are covered too.
|
|
@@ -78,7 +78,7 @@ export interface RunFurnaceMutationOptions {
|
|
|
78
78
|
/**
|
|
79
79
|
* Converts a resolved `--wait-lock` budget in seconds into the
|
|
80
80
|
* {@link RunFurnaceMutationOptions} slice that applies it to the furnace
|
|
81
|
-
* lock. Undefined in, empty out
|
|
81
|
+
* lock. Undefined in, empty out, so the caller can spread it
|
|
82
82
|
* unconditionally without assigning `undefined` under
|
|
83
83
|
* `exactOptionalPropertyTypes`.
|
|
84
84
|
*
|
|
@@ -94,7 +94,7 @@ export declare function waitLockMutationOptions(waitLockSeconds: number | undefi
|
|
|
94
94
|
* Returns true while a signal-driven rollback is in progress. The bin entry
|
|
95
95
|
* point uses this as a re-entrancy guard so a user mashing Ctrl+C cannot
|
|
96
96
|
* trigger a second rollback that races the first. Exposed for the bin shim
|
|
97
|
-
* (and the test suite)
|
|
97
|
+
* (and the test suite). Production callers should not need it.
|
|
98
98
|
*/
|
|
99
99
|
export declare function isSignalRollbackInFlight(): boolean;
|
|
100
100
|
/**
|
|
@@ -105,7 +105,7 @@ export declare function isSignalRollbackInFlight(): boolean;
|
|
|
105
105
|
export declare function rollbackActiveOperationsForSignal(signal: FurnaceShutdownSignal): Promise<void>;
|
|
106
106
|
/**
|
|
107
107
|
* Resolves the path of the lock directory used to serialize furnace mutations
|
|
108
|
-
* for a given project root. Exposed for tests
|
|
108
|
+
* for a given project root. Exposed for tests. Production callers should not
|
|
109
109
|
* touch this directly.
|
|
110
110
|
*/
|
|
111
111
|
export declare function getFurnaceLockPath(root: string): string;
|
|
@@ -119,10 +119,10 @@ export declare function getFurnaceLockPath(root: string): string;
|
|
|
119
119
|
* restructure control flow through the engine's rollback path for a
|
|
120
120
|
* cosmetic gain.
|
|
121
121
|
*
|
|
122
|
-
* The ordering is the part worth centralising: `markRolledBack()`
|
|
122
|
+
* The ordering is the part worth centralising: `markRolledBack()` must run
|
|
123
123
|
* before the restore, so a restore that itself fails does not leave the
|
|
124
|
-
* lifecycle wrapper replaying the same journal on the way out.
|
|
125
|
-
*
|
|
124
|
+
* lifecycle wrapper replaying the same journal on the way out. The
|
|
125
|
+
* original error is rethrown unless the rollback is what failed: the
|
|
126
126
|
* operator needs to know what went wrong, and separately whether the engine
|
|
127
127
|
* could be put back.
|
|
128
128
|
*
|
|
@@ -130,7 +130,7 @@ export declare function getFurnaceLockPath(root: string): string;
|
|
|
130
130
|
* @param journal - Rollback journal this body populated
|
|
131
131
|
* @param error - The error the body threw
|
|
132
132
|
* @param options - Project root, pending-repair tag, and message fragments
|
|
133
|
-
* @returns Never
|
|
133
|
+
* @returns Never, because it always throws
|
|
134
134
|
*/
|
|
135
135
|
export declare function completeJournalRollback(ctx: FurnaceOperationContext, journal: RollbackJournal, error: unknown, options: {
|
|
136
136
|
projectRoot: string;
|
|
@@ -144,11 +144,11 @@ export declare function completeJournalRollback(ctx: FurnaceOperationContext, jo
|
|
|
144
144
|
* Forcibly removes the furnace lock directory for every active operation.
|
|
145
145
|
*
|
|
146
146
|
* The bin-layer signal handler calls `process.exit` after rollback, which
|
|
147
|
-
* short-circuits Node's normal unwinding
|
|
148
|
-
* }` never runs
|
|
147
|
+
* short-circuits Node's normal unwinding, so `withFileLock`'s `finally { rm
|
|
148
|
+
* }` never runs and the lock directory survives the process. The next
|
|
149
149
|
* FireForge command then has to either wait out the staleness window or
|
|
150
150
|
* have the operator remove the lock manually. This sweeper runs inside
|
|
151
|
-
* the signal-handler pipeline
|
|
151
|
+
* the signal-handler pipeline before `process.exit`, so the lock is gone
|
|
152
152
|
* by the time the next command starts.
|
|
153
153
|
*
|
|
154
154
|
* Errors are logged and swallowed: we do not want a slow I/O failure at
|
|
@@ -161,7 +161,7 @@ export declare function forceReleaseFurnaceLocksForActiveOperations(): Promise<v
|
|
|
161
161
|
* Runs a furnace-mutating body under the apply-wide lock and registers it
|
|
162
162
|
* with the process-wide SIGINT/SIGTERM rollback pathway. The lock prevents
|
|
163
163
|
* two `furnace apply`/`deploy`/`create`/etc. runs from racing on the engine
|
|
164
|
-
* working copy
|
|
164
|
+
* working copy. The CLI entrypoint's global signal handlers consult this
|
|
165
165
|
* registry and invoke rollback (writing a `pendingRepair` marker when needed)
|
|
166
166
|
* if the user hits Ctrl+C mid-run.
|
|
167
167
|
*
|
|
@@ -169,7 +169,7 @@ export declare function forceReleaseFurnaceLocksForActiveOperations(): Promise<v
|
|
|
169
169
|
* the lock entirely (concurrent dry-runs are safe and shouldn't block each
|
|
170
170
|
* other).
|
|
171
171
|
*
|
|
172
|
-
* The body receives a {@link FurnaceOperationContext}
|
|
172
|
+
* The body receives a {@link FurnaceOperationContext}. It must call
|
|
173
173
|
* `ctx.registerJournal(journal)` once it has constructed its rollback journal.
|
|
174
174
|
* Bodies that don't manage a journal directly (e.g. apply, which delegates to
|
|
175
175
|
* `applyAllComponents`) can pass an internal callback through.
|
|
@@ -189,6 +189,7 @@ export declare function recordFurnaceRollbackFailure(root: string, operation: Fu
|
|
|
189
189
|
* cases that exercise the signal pathway. Not exported from the package
|
|
190
190
|
* entry point.
|
|
191
191
|
*
|
|
192
|
-
* @internal Exported only so tests can reach it
|
|
192
|
+
* @internal Exported only so tests can reach it. Not part of the public
|
|
193
|
+
* surface.
|
|
193
194
|
*/
|
|
194
195
|
export declare function __resetFurnaceOperationStateForTests(): void;
|
|
@@ -14,7 +14,7 @@ const FURNACE_LOCK_FILENAME = 'furnace.lock';
|
|
|
14
14
|
/**
|
|
15
15
|
* Converts a resolved `--wait-lock` budget in seconds into the
|
|
16
16
|
* {@link RunFurnaceMutationOptions} slice that applies it to the furnace
|
|
17
|
-
* lock. Undefined in, empty out
|
|
17
|
+
* lock. Undefined in, empty out, so the caller can spread it
|
|
18
18
|
* unconditionally without assigning `undefined` under
|
|
19
19
|
* `exactOptionalPropertyTypes`.
|
|
20
20
|
*
|
|
@@ -33,7 +33,7 @@ export function waitLockMutationOptions(waitLockSeconds) {
|
|
|
33
33
|
* already has it.
|
|
34
34
|
*
|
|
35
35
|
* Must stay synchronous and must be called before the caller's first
|
|
36
|
-
* await
|
|
36
|
+
* await. That is what makes the claim atomic against the signal handler.
|
|
37
37
|
*
|
|
38
38
|
* @param operation - The in-flight operation to claim
|
|
39
39
|
* @returns True when the caller now owns the rollback
|
|
@@ -52,7 +52,7 @@ let signalRollbackInFlight = false;
|
|
|
52
52
|
* Returns true while a signal-driven rollback is in progress. The bin entry
|
|
53
53
|
* point uses this as a re-entrancy guard so a user mashing Ctrl+C cannot
|
|
54
54
|
* trigger a second rollback that races the first. Exposed for the bin shim
|
|
55
|
-
* (and the test suite)
|
|
55
|
+
* (and the test suite). Production callers should not need it.
|
|
56
56
|
*/
|
|
57
57
|
export function isSignalRollbackInFlight() {
|
|
58
58
|
return signalRollbackInFlight;
|
|
@@ -60,7 +60,7 @@ export function isSignalRollbackInFlight() {
|
|
|
60
60
|
/**
|
|
61
61
|
* Rolls back every in-flight furnace operation and writes a pendingRepair
|
|
62
62
|
* marker for each. The bin entry point installs SIGINT/SIGTERM handlers that
|
|
63
|
-
* call this and then exit
|
|
63
|
+
* call this and then exit. Calling it directly from inside the library would
|
|
64
64
|
* violate the "process.exit only in bin" invariant. The function is also
|
|
65
65
|
* exposed under this name so the test suite can exercise the teardown path
|
|
66
66
|
* without going through `process.emit` / `process.exit`.
|
|
@@ -91,8 +91,9 @@ export async function rollbackActiveOperationsForSignal(signal) {
|
|
|
91
91
|
// Snapshot the active operations so we don't race with `runFurnaceMutation`
|
|
92
92
|
// clearing slots during normal completion. Filter completed bodies so a
|
|
93
93
|
// body sitting in its finally-block cleanup window is not counted as live
|
|
94
|
-
// work
|
|
95
|
-
// run` (which never registers a mutation but can receive
|
|
94
|
+
// work. Counting it would mis-trigger the rollback banner for plain
|
|
95
|
+
// `fireforge run` (which never registers a mutation but can receive
|
|
96
|
+
// SIGTERM).
|
|
96
97
|
const snapshot = [...activeOperations.values()].filter((op) => !op.completed);
|
|
97
98
|
if (snapshot.length === 0) {
|
|
98
99
|
// Nothing to roll back. Stay silent so commands that never mutated (run,
|
|
@@ -124,9 +125,9 @@ export async function rollbackActiveOperationsForSignal(signal) {
|
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
if (!op.journal) {
|
|
127
|
-
// The body had not yet handed us a journal
|
|
128
|
-
// still write a marker because the body may have started
|
|
129
|
-
// engine before reaching the registerJournal call.
|
|
128
|
+
// The body had not yet handed us a journal, so there is nothing to
|
|
129
|
+
// roll back. We still write a marker because the body may have started
|
|
130
|
+
// mutating the engine before reaching the registerJournal call.
|
|
130
131
|
const cleanupSuffix = cleanupErrors.length > 0 ? `; cleanup errors: ${cleanupErrors.join('; ')}` : '';
|
|
131
132
|
await persistPendingRepair(op.root, op.kind, `interrupted by ${signal} before any state was captured${cleanupSuffix}`).catch((error) => {
|
|
132
133
|
warn(`Could not persist pending-repair marker: ${toError(error).message}`);
|
|
@@ -190,7 +191,7 @@ async function rollbackOperationForThrow(operation) {
|
|
|
190
191
|
}
|
|
191
192
|
if (!operation.journal) {
|
|
192
193
|
// Nothing was captured, so there is nothing to restore. Unlike the signal
|
|
193
|
-
// path we do
|
|
194
|
+
// path we do not write a pendingRepair marker here: a body that threw
|
|
194
195
|
// before registering a journal is overwhelmingly a refusal raised during
|
|
195
196
|
// pre-flight (a validation failure, a missing file), and marking the root
|
|
196
197
|
// as needing repair would block every later furnace mutation behind a
|
|
@@ -243,7 +244,7 @@ async function persistPendingRepair(root, operation, reason) {
|
|
|
243
244
|
}
|
|
244
245
|
/**
|
|
245
246
|
* Resolves the path of the lock directory used to serialize furnace mutations
|
|
246
|
-
* for a given project root. Exposed for tests
|
|
247
|
+
* for a given project root. Exposed for tests. Production callers should not
|
|
247
248
|
* touch this directly.
|
|
248
249
|
*/
|
|
249
250
|
export function getFurnaceLockPath(root) {
|
|
@@ -259,10 +260,10 @@ export function getFurnaceLockPath(root) {
|
|
|
259
260
|
* restructure control flow through the engine's rollback path for a
|
|
260
261
|
* cosmetic gain.
|
|
261
262
|
*
|
|
262
|
-
* The ordering is the part worth centralising: `markRolledBack()`
|
|
263
|
+
* The ordering is the part worth centralising: `markRolledBack()` must run
|
|
263
264
|
* before the restore, so a restore that itself fails does not leave the
|
|
264
|
-
* lifecycle wrapper replaying the same journal on the way out.
|
|
265
|
-
*
|
|
265
|
+
* lifecycle wrapper replaying the same journal on the way out. The
|
|
266
|
+
* original error is rethrown unless the rollback is what failed: the
|
|
266
267
|
* operator needs to know what went wrong, and separately whether the engine
|
|
267
268
|
* could be put back.
|
|
268
269
|
*
|
|
@@ -270,7 +271,7 @@ export function getFurnaceLockPath(root) {
|
|
|
270
271
|
* @param journal - Rollback journal this body populated
|
|
271
272
|
* @param error - The error the body threw
|
|
272
273
|
* @param options - Project root, pending-repair tag, and message fragments
|
|
273
|
-
* @returns Never
|
|
274
|
+
* @returns Never, because it always throws
|
|
274
275
|
*/
|
|
275
276
|
export async function completeJournalRollback(ctx, journal, error, options) {
|
|
276
277
|
// This body owns its rollback end to end, so tell the lifecycle wrapper
|
|
@@ -289,11 +290,11 @@ export async function completeJournalRollback(ctx, journal, error, options) {
|
|
|
289
290
|
* Forcibly removes the furnace lock directory for every active operation.
|
|
290
291
|
*
|
|
291
292
|
* The bin-layer signal handler calls `process.exit` after rollback, which
|
|
292
|
-
* short-circuits Node's normal unwinding
|
|
293
|
-
* }` never runs
|
|
293
|
+
* short-circuits Node's normal unwinding, so `withFileLock`'s `finally { rm
|
|
294
|
+
* }` never runs and the lock directory survives the process. The next
|
|
294
295
|
* FireForge command then has to either wait out the staleness window or
|
|
295
296
|
* have the operator remove the lock manually. This sweeper runs inside
|
|
296
|
-
* the signal-handler pipeline
|
|
297
|
+
* the signal-handler pipeline before `process.exit`, so the lock is gone
|
|
297
298
|
* by the time the next command starts.
|
|
298
299
|
*
|
|
299
300
|
* Errors are logged and swallowed: we do not want a slow I/O failure at
|
|
@@ -305,9 +306,9 @@ export async function forceReleaseFurnaceLocksForActiveOperations() {
|
|
|
305
306
|
const paths = new Set([...activeOperations.values()].map((op) => getFurnaceLockPath(op.root)));
|
|
306
307
|
for (const lockPath of paths) {
|
|
307
308
|
// Ownership-checked, like every other release path. The bare `rm` this
|
|
308
|
-
// replaced would delete a lock a
|
|
309
|
-
// window between our operation dying and this sweep running
|
|
310
|
-
// race `releaseLock`'s PID verification was added to close, reopened
|
|
309
|
+
// replaced would delete a lock a different process had acquired in the
|
|
310
|
+
// window between our operation dying and this sweep running. That is the
|
|
311
|
+
// exact race `releaseLock`'s PID verification was added to close, reopened
|
|
311
312
|
// here because the sweeper has no acquisition token to check.
|
|
312
313
|
const removed = await releaseLockIfOwned(lockPath);
|
|
313
314
|
verbose(removed
|
|
@@ -319,7 +320,7 @@ export async function forceReleaseFurnaceLocksForActiveOperations() {
|
|
|
319
320
|
* Runs a furnace-mutating body under the apply-wide lock and registers it
|
|
320
321
|
* with the process-wide SIGINT/SIGTERM rollback pathway. The lock prevents
|
|
321
322
|
* two `furnace apply`/`deploy`/`create`/etc. runs from racing on the engine
|
|
322
|
-
* working copy
|
|
323
|
+
* working copy. The CLI entrypoint's global signal handlers consult this
|
|
323
324
|
* registry and invoke rollback (writing a `pendingRepair` marker when needed)
|
|
324
325
|
* if the user hits Ctrl+C mid-run.
|
|
325
326
|
*
|
|
@@ -327,7 +328,7 @@ export async function forceReleaseFurnaceLocksForActiveOperations() {
|
|
|
327
328
|
* the lock entirely (concurrent dry-runs are safe and shouldn't block each
|
|
328
329
|
* other).
|
|
329
330
|
*
|
|
330
|
-
* The body receives a {@link FurnaceOperationContext}
|
|
331
|
+
* The body receives a {@link FurnaceOperationContext}. It must call
|
|
331
332
|
* `ctx.registerJournal(journal)` once it has constructed its rollback journal.
|
|
332
333
|
* Bodies that don't manage a journal directly (e.g. apply, which delegates to
|
|
333
334
|
* `applyAllComponents`) can pass an internal callback through.
|
|
@@ -356,10 +357,10 @@ export async function runFurnaceMutation(root, kind, body, options = {}) {
|
|
|
356
357
|
const token = nextOperationToken++;
|
|
357
358
|
const operation = { root, kind, cleanups: [] };
|
|
358
359
|
const lockPath = getFurnaceLockPath(root);
|
|
359
|
-
// An explicit budget wins
|
|
360
|
-
// the lock in the refusal
|
|
361
|
-
//
|
|
362
|
-
//
|
|
360
|
+
// An explicit budget wins. Otherwise the session-wide one applies. Naming
|
|
361
|
+
// the lock in the refusal matters: a mutation takes two, and a message
|
|
362
|
+
// that says only "timed out" sends the operator to raise a budget that
|
|
363
|
+
// was already large enough for the other lock.
|
|
363
364
|
const timeoutMs = options.lockTimeoutMs ?? sessionWaitLockMs();
|
|
364
365
|
const lockOptions = {
|
|
365
366
|
...(timeoutMs !== undefined ? { timeoutMs } : {}),
|
|
@@ -374,10 +375,10 @@ export async function runFurnaceMutation(root, kind, body, options = {}) {
|
|
|
374
375
|
return withFileLock(lockPath, async () => {
|
|
375
376
|
// Everything the body does from here is serialized only by the furnace
|
|
376
377
|
// lock, so confirm we are actually inside it before registering as a
|
|
377
|
-
// live mutation. The owner record is
|
|
378
|
-
//
|
|
379
|
-
//
|
|
380
|
-
//
|
|
378
|
+
// live mutation. The owner record is best-effort in `withFileLock`
|
|
379
|
+
// (a live holder can legitimately have no readable PID), so the PID
|
|
380
|
+
// half only tightens the check when a record is present. Asserting on
|
|
381
|
+
// its existence would fire on a lock we really do hold.
|
|
381
382
|
const lockStatus = await readLockStatus(lockPath);
|
|
382
383
|
assert(lockStatus.held, 'furnace lock held before the mutation body runs');
|
|
383
384
|
assert(lockStatus.holder === undefined || lockStatus.holder.pid === process.pid, () => `furnace lock is owned by this process ` +
|
|
@@ -401,8 +402,8 @@ export async function runFurnaceMutation(root, kind, body, options = {}) {
|
|
|
401
402
|
// so it gets the same treatment. A bare finally here would
|
|
402
403
|
// deregister the operation and mark it completed, removing it from
|
|
403
404
|
// the signal handler's view too, so a body that threw outside its
|
|
404
|
-
// own catch
|
|
405
|
-
// two per-component try blocks
|
|
405
|
+
// own catch (notably anywhere in `applyAllComponents` outside its
|
|
406
|
+
// two per-component try blocks) would leave the checkout torn with
|
|
406
407
|
// no marker.
|
|
407
408
|
//
|
|
408
409
|
// This runs inside the withFileLock callback, so the furnace lock is
|
|
@@ -433,7 +434,8 @@ export async function recordFurnaceRollbackFailure(root, operation, reason) {
|
|
|
433
434
|
* cases that exercise the signal pathway. Not exported from the package
|
|
434
435
|
* entry point.
|
|
435
436
|
*
|
|
436
|
-
* @internal Exported only so tests can reach it
|
|
437
|
+
* @internal Exported only so tests can reach it. Not part of the public
|
|
438
|
+
* surface.
|
|
437
439
|
*/
|
|
438
440
|
export function __resetFurnaceOperationStateForTests() {
|
|
439
441
|
activeOperations.clear();
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
* `furnace.json` exists.
|
|
4
4
|
*
|
|
5
5
|
* Kept separate from the `GeneralError` ladder in `engine-precondition.ts`
|
|
6
|
-
* because the error
|
|
7
|
-
* carries its own `userMessage` and exit code 9, so a helper
|
|
8
|
-
* `GeneralError` would silently change both.
|
|
6
|
+
* because the error class matters here and is not merely cosmetic:
|
|
7
|
+
* `FurnaceError` carries its own `userMessage` and exit code 9, so a helper
|
|
8
|
+
* raising `GeneralError` would silently change both.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* Four sites are not routed through this helper: `furnace list`,
|
|
11
|
+
* `furnace status`, `furnace init`, and `verify`. Each informs rather than
|
|
12
|
+
* refuses, and each says so at its own site. `furnace validate` refusing is
|
|
13
|
+
* the intended line between inspecting and validating.
|
|
14
14
|
*/
|
|
15
15
|
import type { FurnaceConfig } from '../types/furnace.js';
|
|
16
16
|
import type { ProjectPaths } from '../types/index.js';
|
|
@@ -18,8 +18,8 @@ import type { ProjectPaths } from '../types/index.js';
|
|
|
18
18
|
export interface FurnacePreconditionOptions {
|
|
19
19
|
/**
|
|
20
20
|
* Appended to the engine-missing refusal, e.g.
|
|
21
|
-
* `' to scaffold a chrome-doc.'`. The base message ends
|
|
22
|
-
* punctuation so the suffix reads as one sentence
|
|
21
|
+
* `' to scaffold a chrome-doc.'`. The base message ends without
|
|
22
|
+
* punctuation so the suffix reads as one sentence. Callers passing nothing
|
|
23
23
|
* get a plain full stop.
|
|
24
24
|
*/
|
|
25
25
|
engineMissingSuffix?: string;
|
|
@@ -48,7 +48,7 @@ export declare function assertFurnaceEngineReady(projectRoot: string, options?:
|
|
|
48
48
|
paths: ProjectPaths;
|
|
49
49
|
}>;
|
|
50
50
|
/**
|
|
51
|
-
* Asserts the full Furnace ladder
|
|
51
|
+
* Asserts the full Furnace ladder (engine checkout, then `furnace.json`)
|
|
52
52
|
* and returns the loaded config so callers do not read it a second time.
|
|
53
53
|
*
|
|
54
54
|
* @param projectRoot - Project root directory
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
* `furnace.json` exists.
|
|
5
5
|
*
|
|
6
6
|
* Kept separate from the `GeneralError` ladder in `engine-precondition.ts`
|
|
7
|
-
* because the error
|
|
8
|
-
* carries its own `userMessage` and exit code 9, so a helper
|
|
9
|
-
* `GeneralError` would silently change both.
|
|
7
|
+
* because the error class matters here and is not merely cosmetic:
|
|
8
|
+
* `FurnaceError` carries its own `userMessage` and exit code 9, so a helper
|
|
9
|
+
* raising `GeneralError` would silently change both.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* Four sites are not routed through this helper: `furnace list`,
|
|
12
|
+
* `furnace status`, `furnace init`, and `verify`. Each informs rather than
|
|
13
|
+
* refuses, and each says so at its own site. `furnace validate` refusing is
|
|
14
|
+
* the intended line between inspecting and validating.
|
|
15
15
|
*/
|
|
16
16
|
import { FurnaceError } from '../errors/furnace.js';
|
|
17
17
|
import { pathExists } from '../utils/fs.js';
|
|
@@ -47,7 +47,7 @@ export async function assertFurnaceEngineReady(projectRoot, options = {}) {
|
|
|
47
47
|
return { paths };
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
|
-
* Asserts the full Furnace ladder
|
|
50
|
+
* Asserts the full Furnace ladder (engine checkout, then `furnace.json`)
|
|
51
51
|
* and returns the loaded config so callers do not read it a second time.
|
|
52
52
|
*
|
|
53
53
|
* @param projectRoot - Project root directory
|
|
@@ -90,12 +90,12 @@ export async function refreshOverrideFile(options) {
|
|
|
90
90
|
const oursContent = await readText(overridePath);
|
|
91
91
|
const baseContent = await getFileContentAtRef(engineDir, engineRelPath, baseCommit);
|
|
92
92
|
if (baseContent === null) {
|
|
93
|
-
// File didn't exist at baseCommit
|
|
93
|
+
// File didn't exist at baseCommit: this is a new file introduced by the override
|
|
94
94
|
return { fileName, status: 'new-file' };
|
|
95
95
|
}
|
|
96
96
|
const theirsContent = await getFileContentAtRef(engineDir, engineRelPath, 'HEAD');
|
|
97
97
|
if (theirsContent === null) {
|
|
98
|
-
// File was removed upstream
|
|
98
|
+
// File was removed upstream, so no merge is needed. Keep the override as-is
|
|
99
99
|
return { fileName, status: 'unchanged' };
|
|
100
100
|
}
|
|
101
101
|
// If upstream hasn't changed, nothing to merge
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Matches any of:
|
|
14
14
|
* 1. `setElementCreationCallback("tag"` / `setElementCreationCallback('tag'`
|
|
15
|
-
* 2. Single-line array entry: `["tag", "..."]`
|
|
15
|
+
* 2. Single-line array entry: `["tag", "..."]` (column 0 only, comments allowed after)
|
|
16
16
|
* 3. Multi-line array entry: `"tag",` on its own line, optional trailing `//` comment
|
|
17
17
|
*/
|
|
18
18
|
export declare function isTagAlreadyRegistered(content: string, tagName: string): boolean;
|
|
@@ -38,7 +38,7 @@ export interface RegistrationWriteOptions {
|
|
|
38
38
|
* ```
|
|
39
39
|
*
|
|
40
40
|
* New entries are inserted in alphabetical order relative to existing entries.
|
|
41
|
-
* This operation is idempotent
|
|
41
|
+
* This operation is idempotent: if the tag is already registered the file is
|
|
42
42
|
* left unchanged.
|
|
43
43
|
*
|
|
44
44
|
* @param engineDir - Path to the Firefox engine source root
|
|
@@ -23,7 +23,7 @@ import { validateRegistrationPlacement, validateTagName } from './furnace-regist
|
|
|
23
23
|
*
|
|
24
24
|
* Matches any of:
|
|
25
25
|
* 1. `setElementCreationCallback("tag"` / `setElementCreationCallback('tag'`
|
|
26
|
-
* 2. Single-line array entry: `["tag", "..."]`
|
|
26
|
+
* 2. Single-line array entry: `["tag", "..."]` (column 0 only, comments allowed after)
|
|
27
27
|
* 3. Multi-line array entry: `"tag",` on its own line, optional trailing `//` comment
|
|
28
28
|
*/
|
|
29
29
|
export function isTagAlreadyRegistered(content, tagName) {
|
|
@@ -234,8 +234,8 @@ function addRegistrationAST(content, tagName, modulePath, isESModule, markerComm
|
|
|
234
234
|
* fails. Finds the last existing `["tag", "path"],` line in the appropriate
|
|
235
235
|
* block and inserts the new entry after it in alphabetical order.
|
|
236
236
|
*
|
|
237
|
-
* This is intentionally less precise than the AST approach
|
|
238
|
-
* validate indentation or multi-line format
|
|
237
|
+
* This is intentionally less precise than the AST approach (it does not
|
|
238
|
+
* validate indentation or multi-line format), but it is robust against
|
|
239
239
|
* upstream syntax changes that break the parser.
|
|
240
240
|
*/
|
|
241
241
|
function addRegistrationRegexFallback(content, tagName, modulePath, isESModule, markerComment) {
|
|
@@ -297,7 +297,7 @@ function hasRecognizableRegistrationLoop(content) {
|
|
|
297
297
|
* ```
|
|
298
298
|
*
|
|
299
299
|
* New entries are inserted in alphabetical order relative to existing entries.
|
|
300
|
-
* This operation is idempotent
|
|
300
|
+
* This operation is idempotent: if the tag is already registered the file is
|
|
301
301
|
* left unchanged.
|
|
302
302
|
*
|
|
303
303
|
* @param engineDir - Path to the Firefox engine source root
|
|
@@ -312,13 +312,13 @@ export async function addCustomElementRegistration(engineDir, tagName, modulePat
|
|
|
312
312
|
const content = await readText(filePath);
|
|
313
313
|
// Idempotency: check column-0 of each array entry rather than a literal
|
|
314
314
|
// substring match. A previous apply may have written this entry with
|
|
315
|
-
// trailing marker comments (see `options.markerComment`)
|
|
315
|
+
// trailing marker comments (see `options.markerComment`). Matching on the
|
|
316
316
|
// full line would then miss it and insert a duplicate on re-apply, which
|
|
317
317
|
// throws NotSupportedError at every window-load.
|
|
318
318
|
if (isTagAlreadyRegistered(content, tagName)) {
|
|
319
319
|
return;
|
|
320
320
|
}
|
|
321
|
-
// Validate upfront
|
|
321
|
+
// Validate upfront. Tag name errors must not fall through to the regex fallback.
|
|
322
322
|
validateTagName(tagName);
|
|
323
323
|
const isESModule = modulePath.endsWith('.mjs');
|
|
324
324
|
// Cheap pre-flight: the AST walker assumes the file contains at least one
|
|
@@ -326,7 +326,7 @@ export async function addCustomElementRegistration(engineDir, tagName, modulePat
|
|
|
326
326
|
// right-hand side, and (for ESM tags) at least one such loop inside a
|
|
327
327
|
// `document.addEventListener("DOMContentLoaded", ...)` block. If either
|
|
328
328
|
// assumption is violated the AST path errors with a confusing
|
|
329
|
-
// "Could not find DOMContentLoaded block" message
|
|
329
|
+
// "Could not find DOMContentLoaded block" message, so fail fast here with
|
|
330
330
|
// actionable guidance instead.
|
|
331
331
|
if (!hasRecognizableRegistrationLoop(content)) {
|
|
332
332
|
throw new FurnaceError(`${CUSTOM_ELEMENTS_JS} does not contain a recognizable registration loop; refusing to mutate. ` +
|
|
@@ -342,7 +342,7 @@ export async function addCustomElementRegistration(engineDir, tagName, modulePat
|
|
|
342
342
|
}
|
|
343
343
|
catch (error) {
|
|
344
344
|
if (error instanceof FurnaceError) {
|
|
345
|
-
// AST structural errors (missing DOMContentLoaded block, etc.)
|
|
345
|
+
// AST structural errors (missing DOMContentLoaded block, etc.): try regex fallback
|
|
346
346
|
warn(`AST-based registration failed for ${tagName}: ${error.message}. ` +
|
|
347
347
|
'Falling back to regex-based insertion. Please report this so the AST parser can be updated.');
|
|
348
348
|
try {
|
|
@@ -396,7 +396,7 @@ export async function validateCustomElementRegistration(engineDir, tagName, modu
|
|
|
396
396
|
addRegistrationAST(content, tagName, modulePath, isESModule);
|
|
397
397
|
}
|
|
398
398
|
catch {
|
|
399
|
-
// Validation only
|
|
399
|
+
// Validation only: if AST fails, try regex to see if the entry could be placed
|
|
400
400
|
addRegistrationRegexFallback(content, tagName, modulePath, isESModule);
|
|
401
401
|
}
|
|
402
402
|
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Uses the same AST parser as the add path (`furnace-registration-ast.ts`) to
|
|
5
5
|
* locate and delete registration entries. A line-by-line scan with a bounded
|
|
6
6
|
* bracket match only works against Firefox's stock formatting and fails
|
|
7
|
-
* silently on a hand-reformatted customElements.js
|
|
8
|
-
* matching
|
|
7
|
+
* silently on a hand-reformatted customElements.js. AST-based bracket
|
|
8
|
+
* matching does not depend on the file's formatting.
|
|
9
9
|
*
|
|
10
10
|
* Contract:
|
|
11
11
|
* - Idempotent: if the tag is not registered, the file is left unchanged.
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
/**
|
|
24
24
|
* Removes a custom element registration from customElements.js.
|
|
25
25
|
*
|
|
26
|
-
* This operation is idempotent
|
|
26
|
+
* This operation is idempotent: if the tag is not registered or the file
|
|
27
27
|
* does not exist, nothing happens. If the file exists but cannot be parsed,
|
|
28
28
|
* the file is left unchanged rather than fall back to a line-based
|
|
29
|
-
* heuristic
|
|
29
|
+
* heuristic. A corrupted customElements.js is a doctor problem, not
|
|
30
30
|
* something `furnace remove` should "helpfully" edit around.
|
|
31
31
|
*
|
|
32
32
|
* @param engineDir - Path to the Firefox engine source root
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Uses the same AST parser as the add path (`furnace-registration-ast.ts`) to
|
|
6
6
|
* locate and delete registration entries. A line-by-line scan with a bounded
|
|
7
7
|
* bracket match only works against Firefox's stock formatting and fails
|
|
8
|
-
* silently on a hand-reformatted customElements.js
|
|
9
|
-
* matching
|
|
8
|
+
* silently on a hand-reformatted customElements.js. AST-based bracket
|
|
9
|
+
* matching does not depend on the file's formatting.
|
|
10
10
|
*
|
|
11
11
|
* Contract:
|
|
12
12
|
* - Idempotent: if the tag is not registered, the file is left unchanged.
|
|
@@ -49,7 +49,7 @@ function expandRemovalRange(content, start, end) {
|
|
|
49
49
|
}
|
|
50
50
|
// Consume a trailing inline comment up to end-of-line so we do not leave
|
|
51
51
|
// the comment marooned on its own line. A leading inline comment is left
|
|
52
|
-
// alone
|
|
52
|
+
// alone, because it may belong to the next entry.
|
|
53
53
|
while (expandedEnd < content.length &&
|
|
54
54
|
(content[expandedEnd] === ' ' || content[expandedEnd] === '\t')) {
|
|
55
55
|
expandedEnd++;
|
|
@@ -88,7 +88,7 @@ function expandRemovalRange(content, start, end) {
|
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
90
90
|
* Returns true if `node` represents a `[tag, module]` entry inside a
|
|
91
|
-
* registration array
|
|
91
|
+
* registration array, i.e. an `ArrayExpression` whose first element is a
|
|
92
92
|
* string literal equal to `tagName`. Callers still have to verify the
|
|
93
93
|
* parent is the outer registration array so we do not accidentally delete
|
|
94
94
|
* an arbitrary user-owned `["moz-card", ...]` literal elsewhere in the file.
|
|
@@ -176,10 +176,10 @@ function collectRemovalRanges(ast, content, tagName) {
|
|
|
176
176
|
/**
|
|
177
177
|
* Removes a custom element registration from customElements.js.
|
|
178
178
|
*
|
|
179
|
-
* This operation is idempotent
|
|
179
|
+
* This operation is idempotent: if the tag is not registered or the file
|
|
180
180
|
* does not exist, nothing happens. If the file exists but cannot be parsed,
|
|
181
181
|
* the file is left unchanged rather than fall back to a line-based
|
|
182
|
-
* heuristic
|
|
182
|
+
* heuristic. A corrupted customElements.js is a doctor problem, not
|
|
183
183
|
* something `furnace remove` should "helpfully" edit around.
|
|
184
184
|
*
|
|
185
185
|
* @param engineDir - Path to the Firefox engine source root
|
|
@@ -25,8 +25,8 @@ export declare function validateTagName(tagName: string): void;
|
|
|
25
25
|
* Returns why `tagName` is invalid, or `undefined` when it is fine.
|
|
26
26
|
*
|
|
27
27
|
* The message-returning half of {@link validateTagName}, for callers that
|
|
28
|
-
* must not throw
|
|
29
|
-
* returned string and re-prompt on it. Passing the
|
|
28
|
+
* must not throw, specifically clack `validate` callbacks, which expect a
|
|
29
|
+
* returned string and re-prompt on it. Passing the throwing form to one
|
|
30
30
|
* makes an invalid tag name escape clack's validation loop as a
|
|
31
31
|
* `FurnaceError`, killing the prompt instead of showing the rule inline.
|
|
32
32
|
*
|
|
@@ -33,8 +33,8 @@ export function validateTagName(tagName) {
|
|
|
33
33
|
* Returns why `tagName` is invalid, or `undefined` when it is fine.
|
|
34
34
|
*
|
|
35
35
|
* The message-returning half of {@link validateTagName}, for callers that
|
|
36
|
-
* must not throw
|
|
37
|
-
* returned string and re-prompt on it. Passing the
|
|
36
|
+
* must not throw, specifically clack `validate` callbacks, which expect a
|
|
37
|
+
* returned string and re-prompt on it. Passing the throwing form to one
|
|
38
38
|
* makes an invalid tag name escape clack's validation loop as a
|
|
39
39
|
* `FurnaceError`, killing the prompt instead of showing the rule inline.
|
|
40
40
|
*
|