@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
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* per-file LOC budget.
|
|
6
6
|
*
|
|
7
7
|
* Every helper here degrades gracefully: if the locale jar.mn is missing or
|
|
8
|
-
* the FTL tree is non-standard, apply logs an
|
|
8
|
+
* the FTL tree is non-standard, apply logs an advisory `stepError`
|
|
9
9
|
* (`advisory: true`) rather than aborting the whole command. Advisory step
|
|
10
|
-
* errors are reported as warnings and never trigger rollback
|
|
10
|
+
* errors are reported as warnings and never trigger rollback: a missing
|
|
11
11
|
* jar.mn on a fork without a locale package must not block a working
|
|
12
12
|
* `.mjs`/`.css` from shipping.
|
|
13
13
|
*/
|
|
@@ -44,12 +44,12 @@ function resolveSharedFtlPruneTarget(name, ftlDir) {
|
|
|
44
44
|
*
|
|
45
45
|
* A `localized: true` widget that opts into a feature-scoped `sharedFtl`
|
|
46
46
|
* bundle (its strings live under `browser/...` and load via
|
|
47
|
-
* `insertFTLIfNeeded`) must
|
|
47
|
+
* `insertFTLIfNeeded`) must not carry a per-widget
|
|
48
48
|
* `locale/@AB_CD@/<chromeSubPath>/<name>.ftl` line. Such a line points at a
|
|
49
49
|
* `.ftl` that does not exist, so `mach build` fails hard (`Cannot find
|
|
50
50
|
* <chromeSubPath>/<name>.ftl`) and blocks every build.
|
|
51
51
|
*
|
|
52
|
-
* The pruned line is the per-widget toolkit entry only
|
|
52
|
+
* The pruned line is the per-widget toolkit entry only. The shared bundle's
|
|
53
53
|
* own line (a different chrome sub-path / base name) is never matched, so
|
|
54
54
|
* pruning one widget cannot orphan the shared bundle. Idempotent: when no
|
|
55
55
|
* dangling entry exists the file is left untouched (no journal churn).
|
|
@@ -120,8 +120,8 @@ export async function describeSharedFtlPrune(ctx, config) {
|
|
|
120
120
|
* in the locale jar.mn.
|
|
121
121
|
*
|
|
122
122
|
* Failure modes (missing jar.mn, regex write error) are captured as
|
|
123
|
-
* stepErrors rather than thrown
|
|
124
|
-
* blocked by a broken locale path.
|
|
123
|
+
* stepErrors rather than thrown, since a well-formed `.mjs`/`.css` must
|
|
124
|
+
* never be blocked by a broken locale path.
|
|
125
125
|
*/
|
|
126
126
|
export async function applyCustomFtlFile(ctx, affectedPaths, stepErrors, rollbackJournal) {
|
|
127
127
|
const { engineDir, name, componentDir, ftlDir } = ctx;
|
|
@@ -134,7 +134,7 @@ export async function applyCustomFtlFile(ctx, affectedPaths, stepErrors, rollbac
|
|
|
134
134
|
await snapshotFile(rollbackJournal, ftlDest);
|
|
135
135
|
}
|
|
136
136
|
await copyFile(ftlSrc, ftlDest);
|
|
137
|
-
// Sibling pushes on this list are POSIX literals (`localeJarRel`)
|
|
137
|
+
// Sibling pushes on this list are POSIX literals (`localeJarRel`). Keep
|
|
138
138
|
// the computed one in the same spelling.
|
|
139
139
|
affectedPaths.push(normalizePathSlashes(relative(engineDir, ftlDest)));
|
|
140
140
|
const chromeSubPath = resolveFtlChromeSubPath(ftlDir);
|
|
@@ -185,7 +185,7 @@ export function describeLocaleFtlJarMnRegistration(name, ftlDir, ftlFile) {
|
|
|
185
185
|
}
|
|
186
186
|
/**
|
|
187
187
|
* Drops the locale jar.mn entry for `fileName` when it's a `.ftl` whose
|
|
188
|
-
* source workspace file has been deleted. Idempotent
|
|
188
|
+
* source workspace file has been deleted. Idempotent: absent entries are a
|
|
189
189
|
* no-op. Early-returns for `sharedFtl` components: the shared bundle is
|
|
190
190
|
* owned elsewhere, and dropping its jar.mn line on our component's delete
|
|
191
191
|
* would orphan every other participant.
|
|
@@ -3,7 +3,7 @@ import { type RollbackJournal } from './furnace-rollback.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* Filter deciding which files in an override workspace directory are candidates
|
|
5
5
|
* for copying into the engine. Exported so `furnace remove` can invert apply
|
|
6
|
-
* using the
|
|
6
|
+
* using the same file set: the "files to restore" set is defined as the
|
|
7
7
|
* inverse of the "files apply would have written" set.
|
|
8
8
|
*/
|
|
9
9
|
export declare function isOverrideCopyCandidate(entryName: string, type: OverrideComponentConfig['type']): boolean;
|
|
@@ -16,14 +16,14 @@ export declare function getOverrideEngineTargetPath(engineDir: string, config: O
|
|
|
16
16
|
* Behaviour matches the per-file branch of `restoreOverrideEngineFiles` in
|
|
17
17
|
* `furnace remove`: snapshot first, then either `git restore` (if the file
|
|
18
18
|
* exists in HEAD) or hard-delete (if the override introduced the file). The
|
|
19
|
-
* caller
|
|
19
|
+
* caller must guarantee `engineDir` is a git repository. This helper does
|
|
20
20
|
* not re-check, because both `furnace remove` and `furnace apply` already
|
|
21
21
|
* own the precondition check at their entry points and re-checking on every
|
|
22
22
|
* file would balloon git invocations.
|
|
23
23
|
*
|
|
24
24
|
* Returns the action taken so the caller can produce accurate user-facing
|
|
25
25
|
* counts (`restored` vs `removed`). `noop` means the file was neither in HEAD
|
|
26
|
-
* nor on disk, which can happen when the engine was reset out-of-band
|
|
26
|
+
* nor on disk, which can happen when the engine was reset out-of-band. The
|
|
27
27
|
* caller should treat that as a successful no-op rather than an error.
|
|
28
28
|
*/
|
|
29
29
|
export declare function restoreOverrideFileToBaseline(engineDir: string, enginePath: string, journal: RollbackJournal): Promise<'restored' | 'removed' | 'noop'>;
|
|
@@ -32,14 +32,14 @@ export declare function computeComponentChecksums(componentDir: string): Promise
|
|
|
32
32
|
/**
|
|
33
33
|
* Removes engine copies of files that the developer has deleted from a custom
|
|
34
34
|
* component's workspace since the last apply. `.ftl` files live under the
|
|
35
|
-
* shared Fluent tree (`engine/${FTL_DIR}`)
|
|
35
|
+
* shared Fluent tree (`engine/${FTL_DIR}`). Everything else lives under
|
|
36
36
|
* `engine/${config.targetPath}`. Snapshots each removal into the journal so a
|
|
37
37
|
* mid-apply failure can roll the engine back to its pre-undeploy state. Files
|
|
38
38
|
* that are already missing from the engine are silently no-op (the engine
|
|
39
|
-
* may have been reset out-of-band
|
|
40
|
-
* error in a recovery path).
|
|
39
|
+
* may have been reset out-of-band, and refusing here would surface a
|
|
40
|
+
* confusing error in a recovery path).
|
|
41
41
|
*
|
|
42
|
-
* Does
|
|
42
|
+
* Does not touch jar.mn or customElements.js: registration churn is the
|
|
43
43
|
* caller's responsibility, since it must coordinate with the new file list
|
|
44
44
|
* computed by the regular apply step that follows.
|
|
45
45
|
*/
|
|
@@ -51,9 +51,9 @@ export declare function undeployCustomFiles(engineDir: string, config: CustomCom
|
|
|
51
51
|
* HEAD if it was a Firefox baseline file or hard-deletes it if the override
|
|
52
52
|
* had introduced it.
|
|
53
53
|
*
|
|
54
|
-
* Requires `engineDir` to be a git repository
|
|
54
|
+
* Requires `engineDir` to be a git repository: overrides cannot be inverted
|
|
55
55
|
* without git HEAD as the source of truth. The caller is expected to have
|
|
56
|
-
* already validated this precondition for the apply path
|
|
56
|
+
* already validated this precondition for the apply path. We re-check here
|
|
57
57
|
* so unit tests that exercise this helper directly cannot accidentally
|
|
58
58
|
* silent-fail on a non-git fixture.
|
|
59
59
|
*/
|
|
@@ -21,7 +21,7 @@ import { fileExistsInHead, restoreTrackedPath } from './git-file-ops.js';
|
|
|
21
21
|
/**
|
|
22
22
|
* Filter deciding which files in an override workspace directory are candidates
|
|
23
23
|
* for copying into the engine. Exported so `furnace remove` can invert apply
|
|
24
|
-
* using the
|
|
24
|
+
* using the same file set: the "files to restore" set is defined as the
|
|
25
25
|
* inverse of the "files apply would have written" set.
|
|
26
26
|
*/
|
|
27
27
|
export function isOverrideCopyCandidate(entryName, type) {
|
|
@@ -46,18 +46,18 @@ export function getOverrideEngineTargetPath(engineDir, config, fileName, ftlDir)
|
|
|
46
46
|
* Behaviour matches the per-file branch of `restoreOverrideEngineFiles` in
|
|
47
47
|
* `furnace remove`: snapshot first, then either `git restore` (if the file
|
|
48
48
|
* exists in HEAD) or hard-delete (if the override introduced the file). The
|
|
49
|
-
* caller
|
|
49
|
+
* caller must guarantee `engineDir` is a git repository. This helper does
|
|
50
50
|
* not re-check, because both `furnace remove` and `furnace apply` already
|
|
51
51
|
* own the precondition check at their entry points and re-checking on every
|
|
52
52
|
* file would balloon git invocations.
|
|
53
53
|
*
|
|
54
54
|
* Returns the action taken so the caller can produce accurate user-facing
|
|
55
55
|
* counts (`restored` vs `removed`). `noop` means the file was neither in HEAD
|
|
56
|
-
* nor on disk, which can happen when the engine was reset out-of-band
|
|
56
|
+
* nor on disk, which can happen when the engine was reset out-of-band. The
|
|
57
57
|
* caller should treat that as a successful no-op rather than an error.
|
|
58
58
|
*/
|
|
59
59
|
export async function restoreOverrideFileToBaseline(engineDir, enginePath, journal) {
|
|
60
|
-
// Engine-relative paths are
|
|
60
|
+
// Engine-relative paths are identifiers here, not filesystem arguments:
|
|
61
61
|
// they are handed to git, recorded in furnace state, and compared against
|
|
62
62
|
// the POSIX paths furnace.json and jar.mn already carry. `relative()`
|
|
63
63
|
// returns backslashes on Windows, so without this the same file has two
|
|
@@ -66,8 +66,8 @@ export async function restoreOverrideFileToBaseline(engineDir, enginePath, journ
|
|
|
66
66
|
// Snapshot before mutation so a later rollback can undo both restoration
|
|
67
67
|
// (writes whatever content we removed back) and deletion (recreates the
|
|
68
68
|
// file). Snapshotting a missing path records `{ existed: false }`, which
|
|
69
|
-
// restoreFile turns into a delete
|
|
70
|
-
//
|
|
69
|
+
// restoreFile turns into a delete, the inverse of "we just wrote a file
|
|
70
|
+
// here", which is correct for the noop case too.
|
|
71
71
|
await snapshotFile(journal, enginePath);
|
|
72
72
|
if (await fileExistsInHead(engineDir, relPath)) {
|
|
73
73
|
await restoreTrackedPath(engineDir, relPath);
|
|
@@ -88,7 +88,7 @@ export async function computeComponentChecksums(componentDir) {
|
|
|
88
88
|
continue;
|
|
89
89
|
if (entry.name === 'override.json')
|
|
90
90
|
continue;
|
|
91
|
-
// The three extensions a component can deploy
|
|
91
|
+
// The three extensions a component can deploy. Anything else in the
|
|
92
92
|
// workspace directory is not part of the component's checksum identity.
|
|
93
93
|
const { name: entryName } = entry;
|
|
94
94
|
if (!entryName.endsWith('.mjs') && !entryName.endsWith('.css') && !entryName.endsWith('.ftl'))
|
|
@@ -102,14 +102,14 @@ export async function computeComponentChecksums(componentDir) {
|
|
|
102
102
|
/**
|
|
103
103
|
* Removes engine copies of files that the developer has deleted from a custom
|
|
104
104
|
* component's workspace since the last apply. `.ftl` files live under the
|
|
105
|
-
* shared Fluent tree (`engine/${FTL_DIR}`)
|
|
105
|
+
* shared Fluent tree (`engine/${FTL_DIR}`). Everything else lives under
|
|
106
106
|
* `engine/${config.targetPath}`. Snapshots each removal into the journal so a
|
|
107
107
|
* mid-apply failure can roll the engine back to its pre-undeploy state. Files
|
|
108
108
|
* that are already missing from the engine are silently no-op (the engine
|
|
109
|
-
* may have been reset out-of-band
|
|
110
|
-
* error in a recovery path).
|
|
109
|
+
* may have been reset out-of-band, and refusing here would surface a
|
|
110
|
+
* confusing error in a recovery path).
|
|
111
111
|
*
|
|
112
|
-
* Does
|
|
112
|
+
* Does not touch jar.mn or customElements.js: registration churn is the
|
|
113
113
|
* caller's responsibility, since it must coordinate with the new file list
|
|
114
114
|
* computed by the regular apply step that follows.
|
|
115
115
|
*/
|
|
@@ -127,7 +127,7 @@ export async function undeployCustomFiles(engineDir, config, deletedFiles, ftlDi
|
|
|
127
127
|
removed.push(normalizePathSlashes(relative(engineDir, enginePath)));
|
|
128
128
|
}
|
|
129
129
|
// When an `.ftl` is deleted from the workspace the corresponding locale
|
|
130
|
-
// jar.mn entry must also be dropped
|
|
130
|
+
// jar.mn entry must also be dropped. Otherwise the chrome URI points at
|
|
131
131
|
// a missing file and runtime Fluent resolution breaks silently.
|
|
132
132
|
// `removeCustomFtlJarMnEntry` early-returns for `sharedFtl` components
|
|
133
133
|
// (the shared bundle is owned elsewhere).
|
|
@@ -142,9 +142,9 @@ export async function undeployCustomFiles(engineDir, config, deletedFiles, ftlDi
|
|
|
142
142
|
* HEAD if it was a Firefox baseline file or hard-deletes it if the override
|
|
143
143
|
* had introduced it.
|
|
144
144
|
*
|
|
145
|
-
* Requires `engineDir` to be a git repository
|
|
145
|
+
* Requires `engineDir` to be a git repository: overrides cannot be inverted
|
|
146
146
|
* without git HEAD as the source of truth. The caller is expected to have
|
|
147
|
-
* already validated this precondition for the apply path
|
|
147
|
+
* already validated this precondition for the apply path. We re-check here
|
|
148
148
|
* so unit tests that exercise this helper directly cannot accidentally
|
|
149
149
|
* silent-fail on a non-git fixture.
|
|
150
150
|
*/
|
|
@@ -158,11 +158,11 @@ export async function undeployOverrideFiles(engineDir, config, deletedFiles, ftl
|
|
|
158
158
|
if (!(await isGitRepository(engineDir))) {
|
|
159
159
|
throw new FurnaceError('Cannot undeploy override files: engine is not a git repository. Run "fireforge download" to initialise it.');
|
|
160
160
|
}
|
|
161
|
-
// Note: we
|
|
161
|
+
// Note: we do not re-filter `deletedFiles` through
|
|
162
162
|
// `isOverrideCopyCandidate(fileName, config.type)`. A file recorded in
|
|
163
163
|
// `previous` was already a valid copy candidate when it was deployed, and
|
|
164
164
|
// re-filtering would block cleanup if the override type later flipped
|
|
165
|
-
// from `full` to `css-only
|
|
165
|
+
// from `full` to `css-only`, which is the case we need cleanup for.
|
|
166
166
|
const restored = [];
|
|
167
167
|
const removed = [];
|
|
168
168
|
for (const fileName of deletedFiles) {
|
|
@@ -228,7 +228,7 @@ export async function hasOverrideEngineDrift(ctx, config, cachedEngineChecksums)
|
|
|
228
228
|
return true;
|
|
229
229
|
}
|
|
230
230
|
if (cachedHash)
|
|
231
|
-
continue; // Hash match
|
|
231
|
+
continue; // Hash match, skip full source comparison
|
|
232
232
|
}
|
|
233
233
|
// Slow path: byte-compare engine content against workspace source
|
|
234
234
|
const srcContent = normalizeForChecksum(await readText(join(componentDir, entry.name)));
|
|
@@ -259,7 +259,7 @@ export async function hasCustomEngineDrift(ctx, config) {
|
|
|
259
259
|
// Registration drift: only check jar.mn entries for the file types that
|
|
260
260
|
// actually exist in source. jarMn{Mjs,Css} are substring checks, so a
|
|
261
261
|
// component with only .mjs (no .css) should not be flagged when jarMnCss
|
|
262
|
-
// is false
|
|
262
|
+
// is false. That is the expected post-apply state, not drift.
|
|
263
263
|
const entries = await readdir(componentDir, { withFileTypes: true, encoding: 'utf8' });
|
|
264
264
|
let hasMjs = false;
|
|
265
265
|
let hasCss = false;
|
|
@@ -311,16 +311,16 @@ export async function applyCustomComponent(ctx, config, dryRun = false, rollback
|
|
|
311
311
|
// must complete before any copy (they read the original content), but
|
|
312
312
|
// independent files can be processed concurrently.
|
|
313
313
|
const filesToCopy = entries.filter((entry) => isRegularFile(entry) && (entry.name.endsWith('.mjs') || entry.name.endsWith('.css')));
|
|
314
|
-
// Snapshot phase (serial
|
|
314
|
+
// Snapshot phase (serial: journal is not concurrent-safe for the same path)
|
|
315
315
|
for (const entry of filesToCopy) {
|
|
316
316
|
const dest = join(targetDir, entry.name);
|
|
317
317
|
if (rollbackJournal) {
|
|
318
318
|
await snapshotFile(rollbackJournal, dest);
|
|
319
319
|
}
|
|
320
320
|
}
|
|
321
|
-
// Copy phase (parallel
|
|
321
|
+
// Copy phase (parallel: independent file writes to different paths).
|
|
322
322
|
// CSS files carrying @fireforge-include directives are written as their
|
|
323
|
-
// fragment-expanded form
|
|
323
|
+
// fragment-expanded form. The workspace source keeps only the directive,
|
|
324
324
|
// so shared CSS stays single-sourced.
|
|
325
325
|
const sharedDir = join(componentDir, '..', '..', SHARED_FRAGMENTS_DIR);
|
|
326
326
|
await Promise.all(filesToCopy.map(async (entry) => {
|
|
@@ -52,7 +52,7 @@ export function logApplyResult(result, isDryRun) {
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
// Patch-owned overwrite warnings print on every non-dry-run
|
|
55
|
-
// outcome
|
|
55
|
+
// outcome, including the rolled-back branch, where the overwrite
|
|
56
56
|
// happened before the rollback restored it and the operator still needs
|
|
57
57
|
// to know the deployed copy was momentarily replaced.
|
|
58
58
|
if (!isDryRun && result.warnings !== undefined) {
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Patch-owned overwrite warnings for `furnace apply`.
|
|
3
3
|
*
|
|
4
|
-
* For Furnace-managed components, apply
|
|
4
|
+
* For Furnace-managed components, apply overwrites the deployed engine
|
|
5
5
|
* copies with the `components/` sources. A fix made directly in `engine/` and
|
|
6
|
-
* exported into a patch
|
|
6
|
+
* exported into a patch (but never back-ported to the component source) is
|
|
7
7
|
* silently undone by the next apply, and a plain drift line reads like
|
|
8
|
-
* "someone's uncommitted work". This module detects that
|
|
9
|
-
* the copy (deployed bytes differ from the component source
|
|
8
|
+
* "someone's uncommitted work". This module detects that case before
|
|
9
|
+
* the copy (deployed bytes differ from the component source and the file is
|
|
10
10
|
* patch-owned) and produces a per-file warning naming the file, the owning
|
|
11
11
|
* patch, and the consequence.
|
|
12
12
|
*
|
|
13
|
-
* The per-file byte comparison already exists
|
|
13
|
+
* The per-file byte comparison already exists:
|
|
14
14
|
* `checkRegistrationConsistency` for custom components (fragment- and
|
|
15
|
-
* ftl-aware) and the copy-candidate walk for overrides
|
|
15
|
+
* ftl-aware) and the copy-candidate walk for overrides. This module only
|
|
16
16
|
* surfaces what was previously computed and thrown away.
|
|
17
17
|
*/
|
|
18
18
|
import type { CustomComponentConfig, OverrideComponentConfig } from '../types/furnace.js';
|
|
@@ -26,7 +26,7 @@ export interface PatchOwnedOverwriteWarning {
|
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
28
|
* Loads the file → owning-patch map for the overwrite warning.
|
|
29
|
-
* A missing or unreadable patches manifest degrades to an empty map
|
|
29
|
+
* A missing or unreadable patches manifest degrades to an empty map. The
|
|
30
30
|
* warning is advisory and must never block an apply.
|
|
31
31
|
*/
|
|
32
32
|
export declare function loadPatchClaimsForApply(root: string): Promise<ReadonlyMap<string, readonly string[]>>;
|
|
@@ -55,8 +55,8 @@ export type PatchOwnedOverwriteProbe = {
|
|
|
55
55
|
};
|
|
56
56
|
/**
|
|
57
57
|
* Finds deployed files this component's apply is about to overwrite whose
|
|
58
|
-
* engine bytes differ from the component source
|
|
59
|
-
* Probe failures degrade to a verbose line and an empty list
|
|
58
|
+
* engine bytes differ from the component source and that are patch-owned.
|
|
59
|
+
* Probe failures degrade to a verbose line and an empty list. The apply
|
|
60
60
|
* itself must not fail because the warning probe could not run.
|
|
61
61
|
*/
|
|
62
62
|
export declare function findPatchOwnedOverwrites(args: PatchOwnedOverwriteProbe): Promise<PatchOwnedOverwriteWarning[]>;
|
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Patch-owned overwrite warnings for `furnace apply`.
|
|
4
4
|
*
|
|
5
|
-
* For Furnace-managed components, apply
|
|
5
|
+
* For Furnace-managed components, apply overwrites the deployed engine
|
|
6
6
|
* copies with the `components/` sources. A fix made directly in `engine/` and
|
|
7
|
-
* exported into a patch
|
|
7
|
+
* exported into a patch (but never back-ported to the component source) is
|
|
8
8
|
* silently undone by the next apply, and a plain drift line reads like
|
|
9
|
-
* "someone's uncommitted work". This module detects that
|
|
10
|
-
* the copy (deployed bytes differ from the component source
|
|
9
|
+
* "someone's uncommitted work". This module detects that case before
|
|
10
|
+
* the copy (deployed bytes differ from the component source and the file is
|
|
11
11
|
* patch-owned) and produces a per-file warning naming the file, the owning
|
|
12
12
|
* patch, and the consequence.
|
|
13
13
|
*
|
|
14
|
-
* The per-file byte comparison already exists
|
|
14
|
+
* The per-file byte comparison already exists:
|
|
15
15
|
* `checkRegistrationConsistency` for custom components (fragment- and
|
|
16
|
-
* ftl-aware) and the copy-candidate walk for overrides
|
|
16
|
+
* ftl-aware) and the copy-candidate walk for overrides. This module only
|
|
17
17
|
* surfaces what was previously computed and thrown away.
|
|
18
18
|
*/
|
|
19
19
|
import { readdir } from 'node:fs/promises';
|
|
@@ -31,7 +31,7 @@ import { loadPatchesManifest } from './patch-manifest.js';
|
|
|
31
31
|
import { buildPatchClaims } from './status-classify.js';
|
|
32
32
|
/**
|
|
33
33
|
* Loads the file → owning-patch map for the overwrite warning.
|
|
34
|
-
* A missing or unreadable patches manifest degrades to an empty map
|
|
34
|
+
* A missing or unreadable patches manifest degrades to an empty map. The
|
|
35
35
|
* warning is advisory and must never block an apply.
|
|
36
36
|
*/
|
|
37
37
|
export async function loadPatchClaimsForApply(root) {
|
|
@@ -104,8 +104,8 @@ async function findOverrideOverwrites(args) {
|
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
106
106
|
* Finds deployed files this component's apply is about to overwrite whose
|
|
107
|
-
* engine bytes differ from the component source
|
|
108
|
-
* Probe failures degrade to a verbose line and an empty list
|
|
107
|
+
* engine bytes differ from the component source and that are patch-owned.
|
|
108
|
+
* Probe failures degrade to a verbose line and an empty list. The apply
|
|
109
109
|
* itself must not fail because the warning probe could not run.
|
|
110
110
|
*/
|
|
111
111
|
export async function findPatchOwnedOverwrites(args) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dry-run action builders for files deleted from a component workspace since
|
|
3
3
|
* the last apply. Split out of `furnace-apply.ts` to stay under the per-file
|
|
4
|
-
* line budget
|
|
4
|
+
* line budget. The real undeploy paths stay in `furnace-apply-helpers.ts`.
|
|
5
5
|
*/
|
|
6
6
|
import type { CustomComponentConfig, DryRunAction, OverrideComponentConfig } from '../types/furnace.js';
|
|
7
7
|
/** Plans the engine-restore actions for deleted override workspace files. */
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Dry-run action builders for files deleted from a component workspace since
|
|
4
4
|
* the last apply. Split out of `furnace-apply.ts` to stay under the per-file
|
|
5
|
-
* line budget
|
|
5
|
+
* line budget. The real undeploy paths stay in `furnace-apply-helpers.ts`.
|
|
6
6
|
*/
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
import { getOverrideEngineTargetPath } from './furnace-apply-helpers.js';
|
|
@@ -8,8 +8,8 @@ export { computeComponentChecksums, prefixChecksums } from './furnace-apply-help
|
|
|
8
8
|
* Named so consumers can refer to the shape directly instead of going
|
|
9
9
|
* through `Awaited<ReturnType<typeof applyAllComponents>>`.
|
|
10
10
|
*
|
|
11
|
-
* `actions` is populated only on a dry run
|
|
12
|
-
* `persistState: false` hands journal ownership back to the caller.
|
|
11
|
+
* `actions` is populated only on a dry run. `rollbackJournal` is set only
|
|
12
|
+
* when `persistState: false` hands journal ownership back to the caller.
|
|
13
13
|
*/
|
|
14
14
|
export type ApplyAllComponentsResult = ApplyResult & {
|
|
15
15
|
actions?: DryRunAction[];
|
|
@@ -44,6 +44,6 @@ export declare function applyAllComponents(root: string, dryRun?: boolean, optio
|
|
|
44
44
|
}): Promise<ApplyAllComponentsResult>; /**
|
|
45
45
|
* Shared context threaded through the batch apply loops. Bundles the state
|
|
46
46
|
* both loops mutate (result/actions/checksums) with the immutable run
|
|
47
|
-
* parameters
|
|
47
|
+
* parameters. The 12-13 positional parameters this replaced let call sites
|
|
48
48
|
* drift and made every new parameter a two-signature change.
|
|
49
49
|
*/
|
|
@@ -23,8 +23,8 @@ export { computeComponentChecksums, prefixChecksums } from './furnace-apply-help
|
|
|
23
23
|
/**
|
|
24
24
|
* Records one component's checksums into the run-wide accumulator, under the
|
|
25
25
|
* flattened `type/name/file` keys the state file stores. A Map keeps the
|
|
26
|
-
* accumulation explicit
|
|
27
|
-
* replaced the accumulator rather than adding to it.
|
|
26
|
+
* accumulation explicit. The previous `Object.assign` merges read as if
|
|
27
|
+
* they replaced the accumulator rather than adding to it.
|
|
28
28
|
*/
|
|
29
29
|
function recordComponentChecksums(accumulator, checksums, type, name) {
|
|
30
30
|
for (const [key, value] of Object.entries(prefixChecksums(checksums, type, name))) {
|
|
@@ -59,8 +59,8 @@ async function applyOverrideBatch(ctx) {
|
|
|
59
59
|
const changed = await hasComponentChanged(componentDir, previous, currentChecksums);
|
|
60
60
|
if (!changed) {
|
|
61
61
|
// Fast path holds only if the engine still reflects what we deployed.
|
|
62
|
-
// reset/download/manual edits can silently erase engine files
|
|
63
|
-
// checksum record alone cannot detect that.
|
|
62
|
+
// reset/download/manual edits can silently erase engine files, and
|
|
63
|
+
// the checksum record alone cannot detect that.
|
|
64
64
|
const cachedEngine = extractComponentChecksums(state.engineChecksums, 'override', name);
|
|
65
65
|
const drifted = await hasOverrideEngineDrift({ engineDir, componentDir, ftlDir }, overrideConfig, cachedEngine);
|
|
66
66
|
if (!drifted) {
|
|
@@ -86,9 +86,9 @@ async function applyOverrideBatch(ctx) {
|
|
|
86
86
|
filesAffectedTotal.push(...restored, ...removed);
|
|
87
87
|
}
|
|
88
88
|
if (!dryRun) {
|
|
89
|
-
// Runs unconditionally
|
|
90
|
-
// changed
|
|
91
|
-
//
|
|
89
|
+
// Runs unconditionally, including when the component source
|
|
90
|
+
// changed, because the lost-work case is a deployed engine edit
|
|
91
|
+
// that the incoming copy is about to replace.
|
|
92
92
|
recordOverwriteWarnings(result, await findPatchOwnedOverwrites({
|
|
93
93
|
type: 'override',
|
|
94
94
|
engineDir,
|
|
@@ -121,7 +121,7 @@ async function applyOverrideBatch(ctx) {
|
|
|
121
121
|
* After undeploying deleted files, the in-engine jar.mn and
|
|
122
122
|
* customElements.js still carry entries for the removed files. Re-sync them
|
|
123
123
|
* by removing all of `name`'s jar.mn entries and re-adding only those that
|
|
124
|
-
* still exist in the workspace
|
|
124
|
+
* still exist in the workspace. If the .mjs itself was deleted, also drop
|
|
125
125
|
* the customElements.js registration. Snapshots are taken under the same
|
|
126
126
|
* journal so the undo path is symmetric with apply.
|
|
127
127
|
*/
|
|
@@ -141,13 +141,14 @@ async function reconcileCustomRegistrationAfterUndeploy(args) {
|
|
|
141
141
|
await removeJarMnEntries(engineDir, name);
|
|
142
142
|
const liveJarFiles = Object.keys(currentChecksums).filter((f) => f.endsWith('.mjs') || f.endsWith('.css'));
|
|
143
143
|
if (liveJarFiles.length > 0) {
|
|
144
|
-
// applyCustomComponent has already added live entries
|
|
145
|
-
// dropped them too, so re-add now to leave jar.mn in the correct
|
|
144
|
+
// applyCustomComponent has already added live entries, and the remove
|
|
145
|
+
// above dropped them too, so re-add now to leave jar.mn in the correct
|
|
146
|
+
// state.
|
|
146
147
|
await addJarMnEntries(engineDir, name, liveJarFiles);
|
|
147
148
|
}
|
|
148
149
|
filesAffected.push(JAR_MN);
|
|
149
150
|
// If the .mjs file itself was deleted, the customElements registration
|
|
150
|
-
// must go too
|
|
151
|
+
// must go too. Otherwise we leave a dangling import in the Pattern B
|
|
151
152
|
// block that fails at runtime.
|
|
152
153
|
if (deletedFiles.includes(`${name}.mjs`)) {
|
|
153
154
|
if (rollbackJournal) {
|
|
@@ -245,9 +246,9 @@ async function applyCustomBatch(ctx, root, markerComment) {
|
|
|
245
246
|
filesAffectedTotal.push(...removed);
|
|
246
247
|
}
|
|
247
248
|
if (!dryRun) {
|
|
248
|
-
// Runs unconditionally
|
|
249
|
-
// drift detection entirely, which is
|
|
250
|
-
//
|
|
249
|
+
// Runs unconditionally. The `changed === true` path used to skip
|
|
250
|
+
// drift detection entirely, which is when a deployed engine-only
|
|
251
|
+
// fix gets silently replaced (J6).
|
|
251
252
|
recordOverwriteWarnings(result, await findPatchOwnedOverwrites({
|
|
252
253
|
type: 'custom',
|
|
253
254
|
root,
|
|
@@ -279,9 +280,9 @@ async function applyCustomBatch(ctx, root, markerComment) {
|
|
|
279
280
|
filesAffected: filesAffectedTotal,
|
|
280
281
|
...(stepErrors.length > 0 ? { stepErrors } : {}),
|
|
281
282
|
});
|
|
282
|
-
// Only store checksums when the component applied without
|
|
283
|
+
// Only store checksums when the component applied without blocking
|
|
283
284
|
// step errors, so that partially failed components are re-applied on
|
|
284
|
-
// the next run. Advisory errors (FTL degradation) still persist
|
|
285
|
+
// the next run. Advisory errors (FTL degradation) still persist, since
|
|
285
286
|
// re-applying cannot fix a fork that has no locale jar.mn.
|
|
286
287
|
if (!dryRun && blockingStepErrors(stepErrors).length === 0) {
|
|
287
288
|
recordComponentChecksums(newChecksums, currentChecksums, 'custom', name);
|
|
@@ -328,7 +329,7 @@ export async function applyAllComponents(root, dryRun = false, options) {
|
|
|
328
329
|
// When `markerComment` is unset in fireforge.json, default it to
|
|
329
330
|
// `binaryName.toUpperCase()` so the furnace-emitted edits to upstream
|
|
330
331
|
// files (e.g. customElements.js) carry a marker that satisfies
|
|
331
|
-
// `lintModificationComments
|
|
332
|
+
// `lintModificationComments`. That rule keys on
|
|
332
333
|
// `${binaryName.toUpperCase()}:`. An explicit `markerComment` still wins.
|
|
333
334
|
const forgeConfig = await loadConfig(root).catch(() => undefined);
|
|
334
335
|
const markerComment = resolveFurnaceMarkerComment(forgeConfig);
|
|
@@ -338,7 +339,7 @@ export async function applyAllComponents(root, dryRun = false, options) {
|
|
|
338
339
|
operationContext.registerJournal(rollbackJournal);
|
|
339
340
|
}
|
|
340
341
|
// Everything below this line can write to the engine. A real apply that
|
|
341
|
-
// reached it without a journal would have no way back
|
|
342
|
+
// reached it without a journal would have no way back: neither the
|
|
342
343
|
// lifecycle wrapper's throw path nor the signal handler can restore what
|
|
343
344
|
// was never captured. `operationContext` is legitimately absent for the
|
|
344
345
|
// few callers that drive apply outside the wrapper, so the invariant is on
|
|
@@ -361,7 +362,7 @@ export async function applyAllComponents(root, dryRun = false, options) {
|
|
|
361
362
|
}
|
|
362
363
|
}
|
|
363
364
|
// Patch-claim map for the overwrite warning: loaded once per
|
|
364
|
-
// apply. A missing/unreadable manifest degrades to an empty map
|
|
365
|
+
// apply. A missing/unreadable manifest degrades to an empty map. The
|
|
365
366
|
// warning is advisory and must never block the apply.
|
|
366
367
|
const patchClaims = await loadPatchClaimsForApply(root);
|
|
367
368
|
const batchContext = {
|
|
@@ -390,7 +391,7 @@ export async function applyAllComponents(root, dryRun = false, options) {
|
|
|
390
391
|
if (!dryRun && !hasApplyStepErrors && result.errors.length === 0) {
|
|
391
392
|
await runPostApplyConsistencyChecks(root, config, result, ftlDir);
|
|
392
393
|
}
|
|
393
|
-
// Recompute
|
|
394
|
+
// Recompute after the consistency checks: they mutate entry.stepErrors
|
|
394
395
|
// when the applied output is inconsistent (e.g. a jar.mn entry that
|
|
395
396
|
// silently mis-landed). Reading the pre-check snapshot lets those failures
|
|
396
397
|
// skip rollback and persist checksums for a component known to be
|
|
@@ -442,6 +443,6 @@ export async function applyAllComponents(root, dryRun = false, options) {
|
|
|
442
443
|
} /**
|
|
443
444
|
* Shared context threaded through the batch apply loops. Bundles the state
|
|
444
445
|
* both loops mutate (result/actions/checksums) with the immutable run
|
|
445
|
-
* parameters
|
|
446
|
+
* parameters. The 12-13 positional parameters this replaced let call sites
|
|
446
447
|
* drift and made every new parameter a two-signature change.
|
|
447
448
|
*/
|
|
@@ -3,10 +3,10 @@ export declare function extractComponentChecksums(allChecksums: Record<string, s
|
|
|
3
3
|
/** Prefixes component checksums so they can be stored in the flattened state format. */
|
|
4
4
|
export declare function prefixChecksums(checksums: Record<string, string>, type: string, name: string): Record<string, string>;
|
|
5
5
|
/**
|
|
6
|
-
* Returns the filenames present in `previous` that are absent from
|
|
7
|
-
*
|
|
8
|
-
* deleted. The order of returned names is
|
|
9
|
-
*
|
|
6
|
+
* Returns the filenames present in `previous` that are absent from
|
|
7
|
+
* `current`, i.e. files we know we deployed last time but the workspace has
|
|
8
|
+
* since deleted. The order of returned names is stable (sorted
|
|
9
|
+
* alphabetically) so test snapshots and CLI output are deterministic.
|
|
10
10
|
*/
|
|
11
11
|
export declare function diffDeletedFiles(previous: Record<string, string>, current: Record<string, string>): string[];
|
|
12
12
|
/**
|
|
@@ -15,7 +15,7 @@ export declare function diffDeletedFiles(previous: Record<string, string>, curre
|
|
|
15
15
|
* Strips a leading BOM and folds CRLF to LF, so a file that differs from its
|
|
16
16
|
* deployed copy only by line endings or a byte-order mark is not reported as
|
|
17
17
|
* drift. Every comparison that decides "has this component changed?" must
|
|
18
|
-
* use it
|
|
18
|
+
* use it. Otherwise `furnace status` and `furnace validate` can disagree
|
|
19
19
|
* with `apply`'s skip fast-path about the same pair of files on a CRLF
|
|
20
20
|
* checkout.
|
|
21
21
|
*
|
|
@@ -22,10 +22,10 @@ export function prefixChecksums(checksums, type, name) {
|
|
|
22
22
|
return result;
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
* Returns the filenames present in `previous` that are absent from
|
|
26
|
-
*
|
|
27
|
-
* deleted. The order of returned names is
|
|
28
|
-
*
|
|
25
|
+
* Returns the filenames present in `previous` that are absent from
|
|
26
|
+
* `current`, i.e. files we know we deployed last time but the workspace has
|
|
27
|
+
* since deleted. The order of returned names is stable (sorted
|
|
28
|
+
* alphabetically) so test snapshots and CLI output are deterministic.
|
|
29
29
|
*/
|
|
30
30
|
export function diffDeletedFiles(previous, current) {
|
|
31
31
|
const deleted = [];
|
|
@@ -42,7 +42,7 @@ export function diffDeletedFiles(previous, current) {
|
|
|
42
42
|
* Strips a leading BOM and folds CRLF to LF, so a file that differs from its
|
|
43
43
|
* deployed copy only by line endings or a byte-order mark is not reported as
|
|
44
44
|
* drift. Every comparison that decides "has this component changed?" must
|
|
45
|
-
* use it
|
|
45
|
+
* use it. Otherwise `furnace status` and `furnace validate` can disagree
|
|
46
46
|
* with `apply`'s skip fast-path about the same pair of files on a CRLF
|
|
47
47
|
* checkout.
|
|
48
48
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Parser for the `custom` entries in furnace.json. Extracted from
|
|
3
3
|
* `furnace-config.ts` so the main config module stays under the
|
|
4
|
-
* per-file LOC budget
|
|
4
|
+
* per-file LOC budget. The custom-component schema has grown to
|
|
5
5
|
* carry opt-in fields (`composes`, `keyboardCovered`, `sharedFtl`) that
|
|
6
6
|
* each add their own validation branch.
|
|
7
7
|
*/
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Parser for the `custom` entries in furnace.json. Extracted from
|
|
4
4
|
* `furnace-config.ts` so the main config module stays under the
|
|
5
|
-
* per-file LOC budget
|
|
5
|
+
* per-file LOC budget. The custom-component schema has grown to
|
|
6
6
|
* carry opt-in fields (`composes`, `keyboardCovered`, `sharedFtl`) that
|
|
7
7
|
* each add their own validation branch.
|
|
8
8
|
*/
|
|
@@ -65,7 +65,7 @@ export function parseCustomConfig(data, name) {
|
|
|
65
65
|
? { composes: parseStringArray(data['composes'], `${name}.composes`) }
|
|
66
66
|
: {}),
|
|
67
67
|
...(data['keyboardCovered'] === true ? { keyboardCovered: true } : {}),
|
|
68
|
-
// Explicit `kind: "element"` is the default
|
|
68
|
+
// Explicit `kind: "element"` is the default. Normalize it away so the
|
|
69
69
|
// stored config carries the field only when it changes behavior.
|
|
70
70
|
...(data['kind'] === 'library' ? { kind: 'library' } : {}),
|
|
71
71
|
...(sharedFtl !== undefined ? { sharedFtl } : {}),
|
|
@@ -60,7 +60,7 @@ function orderComponentMapLikeExisting(existing, next) {
|
|
|
60
60
|
export function orderFurnaceConfigForWrite(existing, config) {
|
|
61
61
|
// FurnaceConfig is plain parsed-JSON data, but as an interface it carries
|
|
62
62
|
// no index signature, so the compiler cannot verify the JsonObject
|
|
63
|
-
// contract structurally
|
|
63
|
+
// contract structurally, hence the double assertion. This is the one
|
|
64
64
|
// place a typed furnace config re-enters the raw-document world.
|
|
65
65
|
// eslint-disable-next-line no-restricted-syntax -- see above
|
|
66
66
|
const next = config;
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
/**
|
|
7
7
|
* Validates a `tokenHostDocuments` raw value. Each entry must be a non-empty
|
|
8
8
|
* relative path contained in the engine tree. Throws `FurnaceError` on
|
|
9
|
-
* violation
|
|
9
|
+
* violation. Does nothing for `undefined` (field is optional).
|
|
10
10
|
*/
|
|
11
11
|
export declare function validateTokenHostDocuments(raw: unknown): void;
|
|
12
12
|
/**
|
|
13
13
|
* Validates a `runtimeVariables` raw value. Each entry must start with `--`
|
|
14
|
-
* (it is a CSS custom property name). Throws `FurnaceError` on violation
|
|
15
|
-
*
|
|
14
|
+
* (it is a CSS custom property name). Throws `FurnaceError` on violation.
|
|
15
|
+
* Does nothing for `undefined` (field is optional).
|
|
16
16
|
*/
|
|
17
17
|
export declare function validateRuntimeVariables(raw: unknown): void;
|