@hominis/fireforge 0.46.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +11 -11
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -20,7 +20,7 @@ export declare function validatePatchesManifestConsistency(patchesDir: string):
|
|
|
20
20
|
*
|
|
21
21
|
* Drift that is only in `filesAffected` is a derived value disagreeing with
|
|
22
22
|
* the diff it describes, and the narrow repair fixes exactly that. Naming the
|
|
23
|
-
* whole-manifest rebuild for it
|
|
23
|
+
* whole-manifest rebuild for it (as this hint used to, unconditionally) puts
|
|
24
24
|
* an operator one keystroke from rewriting every row in the manifest to
|
|
25
25
|
* correct one list.
|
|
26
26
|
*/
|
|
@@ -30,19 +30,19 @@ export declare function recommendManifestRepair(issues: readonly PatchManifestCo
|
|
|
30
30
|
* lists patches whose manifest entry was reconstructed from filename,
|
|
31
31
|
* mtime, and diff alone (no pre-existing manifest entry to preserve).
|
|
32
32
|
* These entries carry generic descriptions and mtime-based
|
|
33
|
-
* timestamps
|
|
33
|
+
* timestamps. Callers like `doctor --repair-patches-manifest` surface
|
|
34
34
|
* a per-patch review warning so operators know which metadata was
|
|
35
35
|
* invented vs which was restored.
|
|
36
36
|
*/
|
|
37
37
|
export interface RebuildPatchesManifestResult {
|
|
38
38
|
/**
|
|
39
39
|
* Rebuilt manifest, ready to be re-applied by callers. Persisted unless
|
|
40
|
-
* the run was a dry run
|
|
40
|
+
* the run was a dry run. See {@link RebuildPatchesManifestResult.written}.
|
|
41
41
|
*/
|
|
42
42
|
manifest: PatchesManifest;
|
|
43
43
|
/**
|
|
44
44
|
* Filenames whose manifest entry had no pre-existing metadata to
|
|
45
|
-
* preserve
|
|
45
|
+
* preserve. Every descriptive field on these entries is inferred.
|
|
46
46
|
*/
|
|
47
47
|
recoveredFilenames: string[];
|
|
48
48
|
/**
|
|
@@ -59,7 +59,7 @@ export interface RebuildPatchesManifestOptions extends PatchDirectoryLockOptions
|
|
|
59
59
|
/**
|
|
60
60
|
* Proceed even when patches.json exists but cannot be parsed, in which case
|
|
61
61
|
* there is no existing metadata to preserve and every descriptive field on
|
|
62
|
-
* every entry is invented. Refused without this flag
|
|
62
|
+
* every entry is invented. Refused without this flag. See
|
|
63
63
|
* {@link rebuildPatchesManifest}.
|
|
64
64
|
*/
|
|
65
65
|
allowMetadataLoss?: boolean;
|
|
@@ -69,7 +69,7 @@ export interface RebuildPatchesManifestOptions extends PatchDirectoryLockOptions
|
|
|
69
69
|
/**
|
|
70
70
|
* Rebuilds patches.json from the patch files currently present on disk.
|
|
71
71
|
*
|
|
72
|
-
* This is a
|
|
72
|
+
* This is a merge, not a from-scratch rebuild: only `filesAffected` and
|
|
73
73
|
* `order` are recomputed from the patch files, and every other field on an
|
|
74
74
|
* existing entry is carried forward untouched. Entries with no pre-existing
|
|
75
75
|
* metadata are recovered from filename structure, patch contents, and file
|
|
@@ -82,7 +82,7 @@ export interface RebuildPatchesManifestOptions extends PatchDirectoryLockOptions
|
|
|
82
82
|
* @param patchesDir - Path to the patches directory
|
|
83
83
|
* @param fallbackSourceEsrVersion - source version to use for recovered legacy entries
|
|
84
84
|
* @param options - Lock options plus `allowMetadataLoss` / `dryRun`
|
|
85
|
-
* @returns {@link RebuildPatchesManifestResult}
|
|
85
|
+
* @returns {@link RebuildPatchesManifestResult}: the rebuilt manifest, the
|
|
86
86
|
* filenames that were reconstructed from generic defaults, and the rows
|
|
87
87
|
* dropped because their patch file is gone.
|
|
88
88
|
*/
|
|
@@ -86,7 +86,7 @@ export async function validatePatchesManifestConsistency(patchesDir) {
|
|
|
86
86
|
*
|
|
87
87
|
* Drift that is only in `filesAffected` is a derived value disagreeing with
|
|
88
88
|
* the diff it describes, and the narrow repair fixes exactly that. Naming the
|
|
89
|
-
* whole-manifest rebuild for it
|
|
89
|
+
* whole-manifest rebuild for it (as this hint used to, unconditionally) puts
|
|
90
90
|
* an operator one keystroke from rewriting every row in the manifest to
|
|
91
91
|
* correct one list.
|
|
92
92
|
*/
|
|
@@ -103,7 +103,7 @@ export function recommendManifestRepair(issues) {
|
|
|
103
103
|
/**
|
|
104
104
|
* Rebuilds patches.json from the patch files currently present on disk.
|
|
105
105
|
*
|
|
106
|
-
* This is a
|
|
106
|
+
* This is a merge, not a from-scratch rebuild: only `filesAffected` and
|
|
107
107
|
* `order` are recomputed from the patch files, and every other field on an
|
|
108
108
|
* existing entry is carried forward untouched. Entries with no pre-existing
|
|
109
109
|
* metadata are recovered from filename structure, patch contents, and file
|
|
@@ -116,7 +116,7 @@ export function recommendManifestRepair(issues) {
|
|
|
116
116
|
* @param patchesDir - Path to the patches directory
|
|
117
117
|
* @param fallbackSourceEsrVersion - source version to use for recovered legacy entries
|
|
118
118
|
* @param options - Lock options plus `allowMetadataLoss` / `dryRun`
|
|
119
|
-
* @returns {@link RebuildPatchesManifestResult}
|
|
119
|
+
* @returns {@link RebuildPatchesManifestResult}: the rebuilt manifest, the
|
|
120
120
|
* filenames that were reconstructed from generic defaults, and the rows
|
|
121
121
|
* dropped because their patch file is gone.
|
|
122
122
|
*/
|
|
@@ -125,7 +125,7 @@ export async function rebuildPatchesManifest(patchesDir, fallbackSourceEsrVersio
|
|
|
125
125
|
// patch-directory lock (invariant 2, docs/lifecycle-invariants.md):
|
|
126
126
|
// manifest writes serialize on this lock, so without it a repair racing a
|
|
127
127
|
// concurrent export/reorder can clobber the other writer's manifest. Not
|
|
128
|
-
// reentrant
|
|
128
|
+
// reentrant: callers must not already hold it.
|
|
129
129
|
//
|
|
130
130
|
// A dry run takes the lock too: it reads the same manifest and patch bodies
|
|
131
131
|
// a real run would, and a projection computed against a queue being
|
|
@@ -136,9 +136,9 @@ async function rebuildPatchesManifestUnderLock(patchesDir, fallbackSourceEsrVers
|
|
|
136
136
|
const manifestState = await loadPatchesManifestState(patchesDir);
|
|
137
137
|
const existingEntries = new Map();
|
|
138
138
|
// An unparseable manifest yields `manifest: null`, which the merge below
|
|
139
|
-
// cannot distinguish from "no manifest at all"
|
|
139
|
+
// cannot distinguish from "no manifest at all". Every entry would be
|
|
140
140
|
// treated as new and every descriptive field reinvented. `filesAffected`
|
|
141
|
-
// is the only field a .patch body can yield
|
|
141
|
+
// is the only field a .patch body can yield. `stagedDependencies`,
|
|
142
142
|
// `lintIgnore`, `tier`, `description`, `category`, `createdAt` and the
|
|
143
143
|
// source version cannot be reconstructed from a diff at all. Refuse rather
|
|
144
144
|
// than write that, since the write is what makes it unrecoverable on a
|
|
@@ -187,21 +187,20 @@ async function rebuildPatchesManifestUnderLock(patchesDir, fallbackSourceEsrVers
|
|
|
187
187
|
// callers can warn the operator per-patch. A missing entry means every
|
|
188
188
|
// descriptive field (`description`, `createdAt`, `category`) was
|
|
189
189
|
// invented rather than preserved, and FireForge patch files carry no
|
|
190
|
-
// header metadata that could carry a human description forward
|
|
190
|
+
// header metadata that could carry a human description forward, so
|
|
191
191
|
// visibility is the best available, and silent overwrites of
|
|
192
192
|
// human-written descriptions during a recovery run are the failure to
|
|
193
193
|
// avoid.
|
|
194
194
|
recoveredFilenames.push(patch.filename);
|
|
195
195
|
}
|
|
196
|
-
// The rebuild
|
|
196
|
+
// The rebuild owns exactly two fields: `filesAffected` (recomputed from
|
|
197
197
|
// the patch body) and `order` (from the filename ordinal). Everything
|
|
198
198
|
// else on an existing entry is carried forward by the spread, so a field
|
|
199
|
-
// a .patch cannot express
|
|
200
|
-
// and whatever is added to PatchMetadata next
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
// recurring.
|
|
199
|
+
// a .patch cannot express (`stagedDependencies`, `lintIgnore`, `tier`,
|
|
200
|
+
// and whatever is added to PatchMetadata next) survives a repair without
|
|
201
|
+
// anyone remembering to list it here. It was an enumerated literal until
|
|
202
|
+
// `stagedDependencies` was dropped from every entry that had one, which
|
|
203
|
+
// is the failure this shape prevents from recurring.
|
|
205
204
|
const rebuilt = {
|
|
206
205
|
...(existing ?? {}),
|
|
207
206
|
filename: patch.filename,
|
|
@@ -228,9 +227,9 @@ async function rebuildPatchesManifestUnderLock(patchesDir, fallbackSourceEsrVers
|
|
|
228
227
|
patches: rebuiltPatches,
|
|
229
228
|
};
|
|
230
229
|
// Whatever is left in the map had a manifest row but no patch file, so the
|
|
231
|
-
// rebuild drops it. That is the correct outcome
|
|
232
|
-
// truth
|
|
233
|
-
// never having had them.
|
|
230
|
+
// rebuild drops it. That is the correct outcome, since the file is the
|
|
231
|
+
// source of truth, but dropping rows without naming them is
|
|
232
|
+
// indistinguishable from never having had them.
|
|
234
233
|
const droppedFilenames = [...existingEntries.keys()].sort((left, right) => left.localeCompare(right));
|
|
235
234
|
if (options.dryRun === true) {
|
|
236
235
|
return {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* Narrow repair for `filesAffected
|
|
3
|
+
* Narrow repair for `filesAffected`, the one manifest field a `.patch` body
|
|
4
4
|
* can actually yield.
|
|
5
5
|
*
|
|
6
6
|
* A `files-affected-mismatch` is pure derived-value drift: the manifest's list
|
|
@@ -47,7 +47,7 @@ async function repairPatchesFilesAffectedUnderLock(patchesDir, filenames, option
|
|
|
47
47
|
const row = rowByFilename.get(filename);
|
|
48
48
|
if (patchPath === undefined || !row) {
|
|
49
49
|
// A missing patch file or a missing row is a different consistency
|
|
50
|
-
// issue with a different remedy
|
|
50
|
+
// issue with a different remedy. This repair reports it rather than
|
|
51
51
|
// inventing a row or deleting one.
|
|
52
52
|
skippedFilenames.push(filename);
|
|
53
53
|
continue;
|
|
@@ -63,7 +63,7 @@ async function repairPatchesFilesAffectedUnderLock(patchesDir, filenames, option
|
|
|
63
63
|
return { repairs, skippedFilenames, written: false };
|
|
64
64
|
}
|
|
65
65
|
const correctedByFilename = new Map(repairs.map((repair) => [repair.filename, repair.after]));
|
|
66
|
-
// Row-scoped mutation, so every untouched entry keeps its exact JSON shape
|
|
66
|
+
// Row-scoped mutation, so every untouched entry keeps its exact JSON shape:
|
|
67
67
|
// no re-sorted `filesAffected` lists and no reader-only fallback fields
|
|
68
68
|
// serialized into rows this repair has no business touching.
|
|
69
69
|
await mutatePatchRowsInManifest(patchesDir, [...correctedByFilename.keys()], (existing) => {
|
|
@@ -39,10 +39,10 @@ export declare function loadPatchesManifestState(patchesDir: string): Promise<Lo
|
|
|
39
39
|
/**
|
|
40
40
|
* Loads the patches manifest if it exists.
|
|
41
41
|
*
|
|
42
|
-
*
|
|
43
|
-
* Any code path that
|
|
44
|
-
* on its content) must use {@link loadPatchesManifestForWrite} instead
|
|
45
|
-
*
|
|
42
|
+
* Read-only callers only: this collapses "absent" and "corrupt" into null.
|
|
43
|
+
* Any code path that writes the manifest (or deletes patch files based
|
|
44
|
+
* on its content) must use {@link loadPatchesManifestForWrite} instead.
|
|
45
|
+
* Treating a corrupt manifest as empty and then saving destroys every
|
|
46
46
|
* existing patch's metadata.
|
|
47
47
|
*
|
|
48
48
|
* @param patchesDir - Path to the patches directory
|
|
@@ -52,7 +52,7 @@ export declare function loadPatchesManifest(patchesDir: string): Promise<Patches
|
|
|
52
52
|
/**
|
|
53
53
|
* Loads the patches manifest for a mutating operation.
|
|
54
54
|
*
|
|
55
|
-
* Returns null only when the manifest genuinely does not exist
|
|
55
|
+
* Returns null only when the manifest genuinely does not exist. A manifest
|
|
56
56
|
* that exists but fails to parse/validate throws
|
|
57
57
|
* {@link PatchManifestCorruptError} so the caller aborts instead of
|
|
58
58
|
* rebuilding an empty queue over the top of the corrupt file.
|
|
@@ -80,11 +80,11 @@ export declare function mutatePatchRowsInManifest(patchesDir: string, filenames:
|
|
|
80
80
|
export declare function addPatchToManifest(patchesDir: string, metadata: PatchMetadata, removeFilenames?: string[]): Promise<void>;
|
|
81
81
|
/**
|
|
82
82
|
* Removes a single patch entry from the manifest by filename. Leaves the
|
|
83
|
-
* ordinal gap in place
|
|
83
|
+
* ordinal gap in place. Callers wanting to close the gap must use
|
|
84
84
|
* {@link renumberPatchesInManifest} explicitly. This matches the spec: delete
|
|
85
85
|
* is a row removal, not a resequencing.
|
|
86
86
|
*
|
|
87
|
-
* Not atomic with any on-disk patch file deletion
|
|
87
|
+
* Not atomic with any on-disk patch file deletion. Callers are expected to
|
|
88
88
|
* remove the .patch file separately under the same lock.
|
|
89
89
|
*
|
|
90
90
|
* @param patchesDir - Path to the patches directory
|
|
@@ -99,7 +99,7 @@ export declare function removePatchFromManifest(patchesDir: string, filename: st
|
|
|
99
99
|
export interface PatchRenameEntry {
|
|
100
100
|
/** New filename (e.g. `005-ui-sidebar.patch`). */
|
|
101
101
|
newFilename: string;
|
|
102
|
-
/** New numeric order
|
|
102
|
+
/** New numeric order. Must match the prefix of `newFilename`. */
|
|
103
103
|
newOrder: number;
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
@@ -129,7 +129,7 @@ export declare function rewriteStagedDependencyOwners(patch: PatchMetadata, rena
|
|
|
129
129
|
* orders. Failure semantics:
|
|
130
130
|
*
|
|
131
131
|
* - **Phase 1 (stage)**: rolls back by renaming staged files back to
|
|
132
|
-
* their originals. Manifest is untouched. Best-effort
|
|
132
|
+
* their originals. Manifest is untouched. Best-effort: a rollback
|
|
133
133
|
* rename failure is warned but not re-thrown.
|
|
134
134
|
* - **Phase 2 (stage → final)**: rolls back to the pre-operation state
|
|
135
135
|
* by reversing every partial step: files already at their final
|
|
@@ -138,13 +138,13 @@ export declare function rewriteStagedDependencyOwners(patch: PatchMetadata, rena
|
|
|
138
138
|
* the rollback itself fails midway, the thrown error is augmented
|
|
139
139
|
* with a description of the residue so the operator can inspect.
|
|
140
140
|
* - **Phase 3 (manifest write)**: by this point all files are on disk
|
|
141
|
-
* at their new names
|
|
141
|
+
* at their new names. A manifest write failure will roll the files
|
|
142
142
|
* back to their original names before re-throwing so the directory
|
|
143
143
|
* and manifest stay in agreement. A rollback failure at this stage
|
|
144
144
|
* is warned (manifest was never mutated) and the original error is
|
|
145
145
|
* re-thrown.
|
|
146
146
|
*
|
|
147
|
-
* Does not sort the rename map for the caller
|
|
147
|
+
* Does not sort the rename map for the caller. The map is the authoritative
|
|
148
148
|
* plan. Entries not present in the map keep their existing filename and
|
|
149
149
|
* order.
|
|
150
150
|
*
|
|
@@ -154,7 +154,7 @@ export declare function rewriteStagedDependencyOwners(patch: PatchMetadata, rena
|
|
|
154
154
|
export declare function renumberPatchesInManifest(patchesDir: string, renameMap: Map<string, PatchRenameEntry>): Promise<void>;
|
|
155
155
|
/**
|
|
156
156
|
* Thrown when {@link removePatchFileAndManifest} cannot complete the file
|
|
157
|
-
* delete
|
|
157
|
+
* delete and cannot restore the manifest row afterward, so the on-disk
|
|
158
158
|
* state and manifest state are known to disagree. Carries both the
|
|
159
159
|
* primary delete error and the rollback error so the caller (and the
|
|
160
160
|
* operator) can see the full failure chain instead of only the original
|
|
@@ -162,7 +162,7 @@ export declare function renumberPatchesInManifest(patchesDir: string, renameMap:
|
|
|
162
162
|
*
|
|
163
163
|
* Extends {@link FireForgeError} so the CLI top-level handler routes it
|
|
164
164
|
* through the rich-error formatter rather than the generic unexpected-error
|
|
165
|
-
* path
|
|
165
|
+
* path. The dedicated `.name` is kept so programmatic callers and tests
|
|
166
166
|
* can still distinguish it with `instanceof PatchDeleteRollbackError`.
|
|
167
167
|
*/
|
|
168
168
|
export declare class PatchDeleteRollbackError extends FireForgeError {
|
|
@@ -174,7 +174,7 @@ export declare class PatchDeleteRollbackError extends FireForgeError {
|
|
|
174
174
|
}
|
|
175
175
|
/**
|
|
176
176
|
* Deletes both a patch file on disk and its manifest row under the caller's
|
|
177
|
-
* lock. This is a convenience for the `patch delete` command
|
|
177
|
+
* lock. This is a convenience for the `patch delete` command. Callers that
|
|
178
178
|
* need different ordering (e.g. deleting the file first without touching the
|
|
179
179
|
* manifest) should call the primitives separately.
|
|
180
180
|
*
|
|
@@ -50,10 +50,10 @@ export async function loadPatchesManifestState(patchesDir) {
|
|
|
50
50
|
/**
|
|
51
51
|
* Loads the patches manifest if it exists.
|
|
52
52
|
*
|
|
53
|
-
*
|
|
54
|
-
* Any code path that
|
|
55
|
-
* on its content) must use {@link loadPatchesManifestForWrite} instead
|
|
56
|
-
*
|
|
53
|
+
* Read-only callers only: this collapses "absent" and "corrupt" into null.
|
|
54
|
+
* Any code path that writes the manifest (or deletes patch files based
|
|
55
|
+
* on its content) must use {@link loadPatchesManifestForWrite} instead.
|
|
56
|
+
* Treating a corrupt manifest as empty and then saving destroys every
|
|
57
57
|
* existing patch's metadata.
|
|
58
58
|
*
|
|
59
59
|
* @param patchesDir - Path to the patches directory
|
|
@@ -66,7 +66,7 @@ export async function loadPatchesManifest(patchesDir) {
|
|
|
66
66
|
/**
|
|
67
67
|
* Loads the patches manifest for a mutating operation.
|
|
68
68
|
*
|
|
69
|
-
* Returns null only when the manifest genuinely does not exist
|
|
69
|
+
* Returns null only when the manifest genuinely does not exist. A manifest
|
|
70
70
|
* that exists but fails to parse/validate throws
|
|
71
71
|
* {@link PatchManifestCorruptError} so the caller aborts instead of
|
|
72
72
|
* rebuilding an empty queue over the top of the corrupt file.
|
|
@@ -175,11 +175,11 @@ export async function addPatchToManifest(patchesDir, metadata, removeFilenames)
|
|
|
175
175
|
}
|
|
176
176
|
/**
|
|
177
177
|
* Removes a single patch entry from the manifest by filename. Leaves the
|
|
178
|
-
* ordinal gap in place
|
|
178
|
+
* ordinal gap in place. Callers wanting to close the gap must use
|
|
179
179
|
* {@link renumberPatchesInManifest} explicitly. This matches the spec: delete
|
|
180
180
|
* is a row removal, not a resequencing.
|
|
181
181
|
*
|
|
182
|
-
* Not atomic with any on-disk patch file deletion
|
|
182
|
+
* Not atomic with any on-disk patch file deletion. Callers are expected to
|
|
183
183
|
* remove the .patch file separately under the same lock.
|
|
184
184
|
*
|
|
185
185
|
* @param patchesDir - Path to the patches directory
|
|
@@ -210,7 +210,7 @@ export async function removePatchFromManifest(patchesDir, filename) {
|
|
|
210
210
|
* sorted ascending (readers take manifest order as apply order without
|
|
211
211
|
* re-sorting).
|
|
212
212
|
*
|
|
213
|
-
* Contiguity itself is
|
|
213
|
+
* Contiguity itself is not checked, on purpose: `patchPolicy.ranges`
|
|
214
214
|
* reserves gaps on purpose, so a hole is a legitimate queue shape.
|
|
215
215
|
*
|
|
216
216
|
* @param patches - The manifest rows about to be written
|
|
@@ -288,7 +288,7 @@ export function rewriteStagedDependencyOwners(patch, renameLookup) {
|
|
|
288
288
|
* orders. Failure semantics:
|
|
289
289
|
*
|
|
290
290
|
* - **Phase 1 (stage)**: rolls back by renaming staged files back to
|
|
291
|
-
* their originals. Manifest is untouched. Best-effort
|
|
291
|
+
* their originals. Manifest is untouched. Best-effort: a rollback
|
|
292
292
|
* rename failure is warned but not re-thrown.
|
|
293
293
|
* - **Phase 2 (stage → final)**: rolls back to the pre-operation state
|
|
294
294
|
* by reversing every partial step: files already at their final
|
|
@@ -297,13 +297,13 @@ export function rewriteStagedDependencyOwners(patch, renameLookup) {
|
|
|
297
297
|
* the rollback itself fails midway, the thrown error is augmented
|
|
298
298
|
* with a description of the residue so the operator can inspect.
|
|
299
299
|
* - **Phase 3 (manifest write)**: by this point all files are on disk
|
|
300
|
-
* at their new names
|
|
300
|
+
* at their new names. A manifest write failure will roll the files
|
|
301
301
|
* back to their original names before re-throwing so the directory
|
|
302
302
|
* and manifest stay in agreement. A rollback failure at this stage
|
|
303
303
|
* is warned (manifest was never mutated) and the original error is
|
|
304
304
|
* re-thrown.
|
|
305
305
|
*
|
|
306
|
-
* Does not sort the rename map for the caller
|
|
306
|
+
* Does not sort the rename map for the caller. The map is the authoritative
|
|
307
307
|
* plan. Entries not present in the map keep their existing filename and
|
|
308
308
|
* order.
|
|
309
309
|
*
|
|
@@ -360,7 +360,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
|
|
|
360
360
|
await rename(join(patchesDir, staged), targetPath);
|
|
361
361
|
// Postcondition assert: confirm the target actually exists on disk
|
|
362
362
|
// before marking the rename complete. A silent rename failure leaves
|
|
363
|
-
// the manifest and the filesystem disagreeing
|
|
363
|
+
// the manifest and the filesystem disagreeing: manifest rewritten to
|
|
364
364
|
// new filenames while the old files stay on disk. If the assert fires,
|
|
365
365
|
// the Phase 2 rollback undoes prior moves before re-throwing.
|
|
366
366
|
if (!(await pathExistsStrict(targetPath))) {
|
|
@@ -370,7 +370,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
|
|
|
370
370
|
}
|
|
371
371
|
}
|
|
372
372
|
catch (error) {
|
|
373
|
-
// Phase 2 rollback
|
|
373
|
+
// Phase 2 rollback: reverse both the partial final-name moves and
|
|
374
374
|
// the phase-1 staging. This collapses the directory back to its
|
|
375
375
|
// pre-operation filenames so the manifest (which was never
|
|
376
376
|
// touched) remains consistent with what is on disk. If any
|
|
@@ -404,7 +404,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
|
|
|
404
404
|
throw error;
|
|
405
405
|
}
|
|
406
406
|
// Phase 3: rewrite the manifest rows. Any entry without a rename keeps its
|
|
407
|
-
// existing metadata
|
|
407
|
+
// existing metadata. Entries in the map get their filename + order
|
|
408
408
|
// updated. Sort by the new order so the manifest remains ordered.
|
|
409
409
|
const filenameUpdates = new Map();
|
|
410
410
|
for (const [oldFilename, entry] of renameMap) {
|
|
@@ -428,13 +428,13 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
|
|
|
428
428
|
try {
|
|
429
429
|
// Phase 3 is the one write that makes the renumber visible. Every file
|
|
430
430
|
// has already moved on disk, so a manifest that disagrees with the new
|
|
431
|
-
// filenames is the worst outcome available here
|
|
432
|
-
// in an order nothing on disk reflects. The callers compute
|
|
433
|
-
// map (compact, reorder, export placement) and each maintains
|
|
434
|
-
// on its own
|
|
435
|
-
// at the single point where it becomes durable. Inside the
|
|
436
|
-
// violation unwinds through the Phase 3 rollback that puts the
|
|
437
|
-
// back.
|
|
431
|
+
// filenames is the worst outcome available here, because the queue
|
|
432
|
+
// would apply in an order nothing on disk reflects. The callers compute
|
|
433
|
+
// the rename map (compact, reorder, export placement) and each maintains
|
|
434
|
+
// contiguity on its own. This checks the property they are all supposed
|
|
435
|
+
// to produce, at the single point where it becomes durable. Inside the
|
|
436
|
+
// try, so a violation unwinds through the Phase 3 rollback that puts the
|
|
437
|
+
// filenames back.
|
|
438
438
|
assertRenumberedOrderIsWellFormed(updatedPatches);
|
|
439
439
|
await savePatchesManifest(patchesDir, {
|
|
440
440
|
...manifest,
|
|
@@ -445,7 +445,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
|
|
|
445
445
|
// Phase 3 rollback: reverse every completed rename. The manifest
|
|
446
446
|
// save failed before it could be persisted, so the on-disk state
|
|
447
447
|
// must match what the manifest still records. Best-effort: any
|
|
448
|
-
// individual step that fails gets warned
|
|
448
|
+
// individual step that fails gets warned. The original save
|
|
449
449
|
// error is always re-thrown so the caller sees the real cause.
|
|
450
450
|
for (const completed of completedFinalRenames) {
|
|
451
451
|
try {
|
|
@@ -460,7 +460,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
|
|
|
460
460
|
}
|
|
461
461
|
/**
|
|
462
462
|
* Thrown when {@link removePatchFileAndManifest} cannot complete the file
|
|
463
|
-
* delete
|
|
463
|
+
* delete and cannot restore the manifest row afterward, so the on-disk
|
|
464
464
|
* state and manifest state are known to disagree. Carries both the
|
|
465
465
|
* primary delete error and the rollback error so the caller (and the
|
|
466
466
|
* operator) can see the full failure chain instead of only the original
|
|
@@ -468,7 +468,7 @@ export async function renumberPatchesInManifest(patchesDir, renameMap) {
|
|
|
468
468
|
*
|
|
469
469
|
* Extends {@link FireForgeError} so the CLI top-level handler routes it
|
|
470
470
|
* through the rich-error formatter rather than the generic unexpected-error
|
|
471
|
-
* path
|
|
471
|
+
* path. The dedicated `.name` is kept so programmatic callers and tests
|
|
472
472
|
* can still distinguish it with `instanceof PatchDeleteRollbackError`.
|
|
473
473
|
*/
|
|
474
474
|
export class PatchDeleteRollbackError extends FireForgeError {
|
|
@@ -490,7 +490,7 @@ export class PatchDeleteRollbackError extends FireForgeError {
|
|
|
490
490
|
}
|
|
491
491
|
/**
|
|
492
492
|
* Deletes both a patch file on disk and its manifest row under the caller's
|
|
493
|
-
* lock. This is a convenience for the `patch delete` command
|
|
493
|
+
* lock. This is a convenience for the `patch delete` command. Callers that
|
|
494
494
|
* need different ordering (e.g. deleting the file first without touching the
|
|
495
495
|
* manifest) should call the primitives separately.
|
|
496
496
|
*
|
|
@@ -508,8 +508,8 @@ export class PatchDeleteRollbackError extends FireForgeError {
|
|
|
508
508
|
export async function removePatchFileAndManifest(patchesDir, filename) {
|
|
509
509
|
await assertPatchDirectoryLockHeld(patchesDir, 'deleting a patch and its manifest row');
|
|
510
510
|
const patchPath = join(patchesDir, filename);
|
|
511
|
-
// ForWrite: deleting the patch
|
|
512
|
-
// references it would strand the queue
|
|
511
|
+
// ForWrite: deleting the patch file while a corrupt manifest still
|
|
512
|
+
// references it would strand the queue. Abort on corruption instead.
|
|
513
513
|
const originalManifest = await loadPatchesManifestForWrite(patchesDir);
|
|
514
514
|
const removedFromManifest = await removePatchFromManifest(patchesDir, filename);
|
|
515
515
|
try {
|
|
@@ -45,7 +45,7 @@ export declare function validatePatchIntegrity(patchesDir: string, engineDir: st
|
|
|
45
45
|
*
|
|
46
46
|
* Acquires the shared patch-directory lock for the read-modify-write, so a
|
|
47
47
|
* concurrent export/reorder/metadata update cannot interleave with the stamp.
|
|
48
|
-
* The lock is not reentrant
|
|
48
|
+
* The lock is not reentrant: callers must not invoke this while already
|
|
49
49
|
* holding {@link withPatchDirectoryLock} on the same patches directory.
|
|
50
50
|
*
|
|
51
51
|
* @param patchesDir - Path to the patches directory
|
|
@@ -80,9 +80,9 @@ export async function validatePatchIntegrity(patchesDir, engineDir) {
|
|
|
80
80
|
const issues = [];
|
|
81
81
|
const patches = await discoverPatches(patchesDir);
|
|
82
82
|
// Collect every modification target first, then resolve HEAD existence in
|
|
83
|
-
//
|
|
83
|
+
// one batched ls-tree pass (chunked for ARG_MAX). The per-file
|
|
84
84
|
// fileExistsInHead fan-out spawned one git process per (patch × target) on
|
|
85
|
-
// every import
|
|
85
|
+
// every import: a 56-file branding patch alone cost ~56 spawns before a
|
|
86
86
|
// single patch was applied.
|
|
87
87
|
const modificationTargets = [];
|
|
88
88
|
for (const patch of patches) {
|
|
@@ -90,7 +90,7 @@ export async function validatePatchIntegrity(patchesDir, engineDir) {
|
|
|
90
90
|
const patchContent = await readText(patch.path);
|
|
91
91
|
const targetFiles = await getAllTargetFilesFromPatch(patch.path);
|
|
92
92
|
for (const targetFile of targetFiles) {
|
|
93
|
-
// Skip new-file sections
|
|
93
|
+
// Skip new-file sections. They don't need to exist in HEAD
|
|
94
94
|
if (isNewFileInPatch(patchContent, targetFile))
|
|
95
95
|
continue;
|
|
96
96
|
modificationTargets.push({ filename: patch.filename, targetFile });
|
|
@@ -114,7 +114,7 @@ export async function validatePatchIntegrity(patchesDir, engineDir) {
|
|
|
114
114
|
*
|
|
115
115
|
* Acquires the shared patch-directory lock for the read-modify-write, so a
|
|
116
116
|
* concurrent export/reorder/metadata update cannot interleave with the stamp.
|
|
117
|
-
* The lock is not reentrant
|
|
117
|
+
* The lock is not reentrant: callers must not invoke this while already
|
|
118
118
|
* holding {@link withPatchDirectoryLock} on the same patches directory.
|
|
119
119
|
*
|
|
120
120
|
* @param patchesDir - Path to the patches directory
|
|
@@ -2,12 +2,12 @@ import type { PatchMetadata } from '../types/commands/index.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Resolves a patch identifier to its manifest entry. Accepts:
|
|
4
4
|
*
|
|
5
|
-
* 1. An ordinal number (e.g. `2`)
|
|
6
|
-
* 2. A full filename with `.patch` suffix (e.g. `002-ui-foo.patch`)
|
|
7
|
-
*
|
|
8
|
-
* 3. A filename without the `.patch` suffix
|
|
5
|
+
* 1. An ordinal number (e.g. `2`), matching `PatchMetadata.order`.
|
|
6
|
+
* 2. A full filename with `.patch` suffix (e.g. `002-ui-foo.patch`),
|
|
7
|
+
* matching `PatchMetadata.filename`.
|
|
8
|
+
* 3. A filename without the `.patch` suffix. The command appends it
|
|
9
9
|
* before matching (e.g. `002-ui-foo`).
|
|
10
|
-
* 4. The manifest `name` field (e.g. `furnace-token-override`)
|
|
10
|
+
* 4. The manifest `name` field (e.g. `furnace-token-override`), the short
|
|
11
11
|
* logical handle the export workflow stamps onto the patch and the
|
|
12
12
|
* natural identifier an operator keeps in their notes. The CLI help
|
|
13
13
|
* says `<name>`, so rejecting it forces the operator to copy the full
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolves a patch identifier to its manifest entry. Accepts:
|
|
3
3
|
*
|
|
4
|
-
* 1. An ordinal number (e.g. `2`)
|
|
5
|
-
* 2. A full filename with `.patch` suffix (e.g. `002-ui-foo.patch`)
|
|
6
|
-
*
|
|
7
|
-
* 3. A filename without the `.patch` suffix
|
|
4
|
+
* 1. An ordinal number (e.g. `2`), matching `PatchMetadata.order`.
|
|
5
|
+
* 2. A full filename with `.patch` suffix (e.g. `002-ui-foo.patch`),
|
|
6
|
+
* matching `PatchMetadata.filename`.
|
|
7
|
+
* 3. A filename without the `.patch` suffix. The command appends it
|
|
8
8
|
* before matching (e.g. `002-ui-foo`).
|
|
9
|
-
* 4. The manifest `name` field (e.g. `furnace-token-override`)
|
|
9
|
+
* 4. The manifest `name` field (e.g. `furnace-token-override`), the short
|
|
10
10
|
* logical handle the export workflow stamps onto the patch and the
|
|
11
11
|
* natural identifier an operator keeps in their notes. The CLI help
|
|
12
12
|
* says `<name>`, so rejecting it forces the operator to copy the full
|
|
@@ -22,14 +22,14 @@ export function resolvePatchIdentifier(identifier, patches) {
|
|
|
22
22
|
const order = parseInt(identifier, 10);
|
|
23
23
|
return patches.find((p) => p.order === order) ?? null;
|
|
24
24
|
}
|
|
25
|
-
// Filename lookup
|
|
25
|
+
// Filename lookup: try the input as-is first (covers both the
|
|
26
26
|
// full `.patch` form and a bare name, because `endsWith` treats the
|
|
27
27
|
// bare form as a miss and falls through to the appended variant).
|
|
28
28
|
const normalized = identifier.endsWith('.patch') ? identifier : `${identifier}.patch`;
|
|
29
29
|
const byFilename = patches.find((p) => p.filename === normalized || p.filename === identifier);
|
|
30
30
|
if (byFilename)
|
|
31
31
|
return byFilename;
|
|
32
|
-
// Name-field lookup
|
|
32
|
+
// Name-field lookup: the short logical handle stamped into the
|
|
33
33
|
// manifest at export time. See function docstring.
|
|
34
34
|
return patches.find((p) => p.name === identifier) ?? null;
|
|
35
35
|
}
|
|
@@ -92,12 +92,12 @@ function validatePatchMetadata(data, index) {
|
|
|
92
92
|
throw new Error(`patches[${index}].sourceEsrVersion must be a valid Firefox version string`);
|
|
93
93
|
}
|
|
94
94
|
const filesAffected = rec.stringArray('filesAffected');
|
|
95
|
-
// Optional fields. These are easy to strip silently
|
|
95
|
+
// Optional fields. These are easy to strip silently: an escape hatch
|
|
96
96
|
// that round-trips only through test fixtures mocking
|
|
97
97
|
// `loadPatchesManifest` looks fine while real operator edits to
|
|
98
98
|
// `patches.json` are dropped on every load, so a patch relying on
|
|
99
99
|
// `lintIgnore` to suppress a rule is quietly re-tripped the next time the
|
|
100
|
-
// manifest validates. Preserve both `lintIgnore` and `tier` here
|
|
100
|
+
// manifest validates. Preserve both `lintIgnore` and `tier` here. Future
|
|
101
101
|
// optional fields follow the same template.
|
|
102
102
|
const lintIgnore = rec.optionalStringArray('lintIgnore');
|
|
103
103
|
const rawTier = rec.raw('tier');
|
|
@@ -143,7 +143,7 @@ export function validatePatchesManifest(data) {
|
|
|
143
143
|
if (!isObject(data)) {
|
|
144
144
|
throw new Error('patches.json must be a JSON object');
|
|
145
145
|
}
|
|
146
|
-
// A manifest from a
|
|
146
|
+
// A manifest from a newer FireForge is not corrupt. The bare "version must
|
|
147
147
|
// be 1" this replaced sent the operator looking for damage in a file that
|
|
148
148
|
// only needed a newer build to read it.
|
|
149
149
|
const version = checkDocumentVersion(data, 'version', PATCHES_MANIFEST_VERSION);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Patches manifest
|
|
2
|
+
* Patches manifest: re-exports from focused sub-modules.
|
|
3
3
|
*
|
|
4
|
-
* Callers should continue to import from this module
|
|
4
|
+
* Callers should continue to import from this module. The internal split
|
|
5
5
|
* is an implementation detail.
|
|
6
6
|
*/
|
|
7
7
|
export { type PatchManifestConsistencyIssue, rebuildPatchesManifest, recommendManifestRepair, validatePatchesManifestConsistency, } from './patch-manifest-consistency.js';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* Patches manifest
|
|
3
|
+
* Patches manifest: re-exports from focused sub-modules.
|
|
4
4
|
*
|
|
5
|
-
* Callers should continue to import from this module
|
|
5
|
+
* Callers should continue to import from this module. The internal split
|
|
6
6
|
* is an implementation detail.
|
|
7
7
|
*/
|
|
8
8
|
export { rebuildPatchesManifest, recommendManifestRepair, validatePatchesManifestConsistency, } from './patch-manifest-consistency.js';
|