@hominis/fireforge 0.45.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 +409 -446
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +21 -15
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +46 -0
- package/dist/src/cli-usage-error.js +81 -0
- package/dist/src/cli.d.ts +7 -2
- package/dist/src/cli.js +47 -47
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +3 -4
- package/dist/src/commands/build.js +27 -17
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +19 -0
- package/dist/src/commands/destructive-decision.js +31 -0
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -10
- package/dist/src/commands/doctor-check-core.js +0 -8
- 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 -17
- package/dist/src/commands/doctor-orphaned-harness.js +14 -23
- 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 +3 -3
- 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 +3 -1
- package/dist/src/commands/doctor.js +15 -16
- package/dist/src/commands/download.js +50 -37
- package/dist/src/commands/export-all.js +29 -12
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +29 -59
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +12 -12
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +7 -13
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +4 -6
- package/dist/src/commands/export-shared.d.ts +51 -32
- package/dist/src/commands/export-shared.js +17 -32
- package/dist/src/commands/export.js +14 -5
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
- package/dist/src/commands/furnace/authoring-config.js +19 -0
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
- 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 +7 -12
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +6 -9
- 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 +31 -15
- package/dist/src/commands/furnace/create-templates.js +20 -19
- 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 +35 -29
- package/dist/src/commands/furnace/deploy.js +15 -6
- 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 +17 -16
- 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 +43 -34
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +15 -7
- package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
- package/dist/src/commands/furnace/remove-mutations.js +19 -19
- 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 +4 -8
- package/dist/src/commands/furnace/rename-browser-test.js +10 -15
- 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 +36 -36
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +19 -16
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
- package/dist/src/commands/furnace/test-file-name.js +39 -0
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/furnace/validation-output.d.ts +21 -9
- package/dist/src/commands/furnace/validation-output.js +3 -8
- package/dist/src/commands/import.js +22 -29
- package/dist/src/commands/lint-per-patch.d.ts +2 -2
- package/dist/src/commands/lint-per-patch.js +27 -12
- package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
- 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 +5 -4
- package/dist/src/commands/lint.js +36 -36
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/manifest.js +1 -1
- package/dist/src/commands/package.js +4 -6
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +19 -20
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +23 -33
- package/dist/src/commands/patch/entry-projection.d.ts +13 -0
- package/dist/src/commands/patch/entry-projection.js +24 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
- package/dist/src/commands/patch/lint-ignore.js +33 -44
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +29 -15
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +41 -37
- package/dist/src/commands/patch/move-files.js +5 -14
- 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 +35 -49
- package/dist/src/commands/patch/reorder.js +35 -48
- package/dist/src/commands/patch/split-plan.d.ts +7 -8
- package/dist/src/commands/patch/split-plan.js +10 -13
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +50 -48
- 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 +22 -28
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +20 -30
- package/dist/src/commands/patch-rename-map.d.ts +19 -0
- package/dist/src/commands/patch-rename-map.js +36 -0
- package/dist/src/commands/pending-resolution.d.ts +15 -0
- package/dist/src/commands/pending-resolution.js +25 -0
- package/dist/src/commands/re-export-adjacent.d.ts +25 -3
- package/dist/src/commands/re-export-adjacent.js +40 -24
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +23 -27
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +33 -33
- package/dist/src/commands/re-export-files.d.ts +2 -3
- package/dist/src/commands/re-export-files.js +52 -44
- package/dist/src/commands/re-export-lint.d.ts +29 -30
- package/dist/src/commands/re-export-lint.js +36 -29
- 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 +12 -9
- package/dist/src/commands/re-export-single.d.ts +23 -4
- package/dist/src/commands/re-export-single.js +39 -31
- package/dist/src/commands/re-export.js +35 -17
- package/dist/src/commands/rebase/abort.js +9 -14
- package/dist/src/commands/rebase/continue.js +20 -19
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +5 -5
- package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
- package/dist/src/commands/rebase/patch-loop.js +20 -24
- 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 +21 -13
- package/dist/src/commands/run.d.ts +0 -13
- package/dist/src/commands/run.js +38 -51
- package/dist/src/commands/setup-support.d.ts +16 -4
- package/dist/src/commands/setup-support.js +20 -20
- package/dist/src/commands/setup.js +4 -10
- package/dist/src/commands/source.js +9 -2
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +6 -6
- 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 +5 -5
- 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 +25 -26
- package/dist/src/commands/test-build-phase.d.ts +3 -3
- package/dist/src/commands/test-build-phase.js +48 -24
- 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 +4 -4
- package/dist/src/commands/test-modes.js +4 -5
- package/dist/src/commands/test-register.js +5 -3
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +40 -33
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +17 -17
- package/dist/src/commands/test-verdict.d.ts +19 -5
- package/dist/src/commands/test-verdict.js +26 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +73 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.d.ts +26 -0
- package/dist/src/commands/token-list.js +153 -0
- package/dist/src/commands/token.js +26 -10
- package/dist/src/commands/tree.js +26 -21
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +16 -16
- 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 +17 -16
- 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 -12
- package/dist/src/core/branding.js +6 -5
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +10 -7
- package/dist/src/core/build-audit-platform.d.ts +32 -3
- package/dist/src/core/build-audit-platform.js +153 -13
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +10 -9
- 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 +57 -0
- package/dist/src/core/build-audit-skip.js +112 -0
- 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 +21 -8
- package/dist/src/core/build-audit.js +142 -40
- 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 +48 -31
- package/dist/src/core/build-baseline.js +20 -43
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +18 -17
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +14 -14
- package/dist/src/core/build-prepare.d.ts +4 -12
- package/dist/src/core/build-prepare.js +22 -26
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-paths.d.ts +2 -6
- package/dist/src/core/config-paths.js +4 -2
- package/dist/src/core/config-state.d.ts +0 -6
- package/dist/src/core/config-state.js +3 -21
- package/dist/src/core/config-validate-build-audit.d.ts +8 -0
- package/dist/src/core/config-validate-build-audit.js +80 -0
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +3 -3
- package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
- package/dist/src/core/config-validate-patch-policy.js +3 -3
- package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
- package/dist/src/core/config-validate-test-toolchains.js +4 -5
- package/dist/src/core/config-validate.js +22 -12
- package/dist/src/core/config.d.ts +12 -12
- package/dist/src/core/config.js +21 -25
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +20 -20
- 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 +22 -23
- 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 +5 -13
- package/dist/src/core/engine-precondition.js +5 -10
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +50 -54
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock-owner.d.ts +103 -0
- package/dist/src/core/file-lock-owner.js +259 -0
- package/dist/src/core/file-lock.d.ts +14 -19
- package/dist/src/core/file-lock.js +90 -128
- package/dist/src/core/firefox-cache.d.ts +13 -1
- package/dist/src/core/firefox-cache.js +61 -36
- package/dist/src/core/firefox-download.d.ts +15 -0
- package/dist/src/core/firefox-download.js +38 -22
- package/dist/src/core/firefox-extract.d.ts +8 -7
- package/dist/src/core/firefox-extract.js +45 -27
- package/dist/src/core/firefox.d.ts +34 -36
- package/dist/src/core/firefox.js +13 -44
- package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
- package/dist/src/core/furnace-apply-dry-run.js +2 -8
- 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 -20
- package/dist/src/core/furnace-apply-helpers.js +28 -39
- 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 +13 -11
- 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 +4 -4
- package/dist/src/core/furnace-apply.js +50 -29
- 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 +5 -5
- package/dist/src/core/furnace-config.js +40 -53
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +9 -8
- 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 +20 -0
- package/dist/src/core/furnace-dir-entry.js +21 -0
- 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 +22 -19
- package/dist/src/core/furnace-operation.js +38 -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.d.ts +18 -6
- package/dist/src/core/furnace-refresh.js +5 -8
- package/dist/src/core/furnace-registration-ast.d.ts +2 -3
- package/dist/src/core/furnace-registration-ast.js +9 -12
- 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 +7 -6
- package/dist/src/core/furnace-registration.js +29 -36
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-scanner.js +3 -6
- 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 +12 -12
- 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 +18 -20
- 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 +6 -4
- package/dist/src/core/git-base.js +29 -7
- package/dist/src/core/git-diff-new-file.d.ts +40 -0
- package/dist/src/core/git-diff-new-file.js +119 -0
- package/dist/src/core/git-diff.d.ts +13 -13
- package/dist/src/core/git-diff.js +121 -189
- package/dist/src/core/git-file-ops.d.ts +6 -13
- package/dist/src/core/git-file-ops.js +11 -35
- package/dist/src/core/git-readonly-index.d.ts +12 -14
- package/dist/src/core/git-readonly-index.js +12 -16
- package/dist/src/core/git-status.d.ts +9 -2
- package/dist/src/core/git-status.js +23 -11
- package/dist/src/core/git.d.ts +3 -9
- package/dist/src/core/git.js +28 -57
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +28 -27
- package/dist/src/core/history-log.d.ts +19 -0
- package/dist/src/core/history-log.js +29 -0
- 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 -10
- package/dist/src/core/mach-error-hints.js +14 -14
- package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
- package/dist/src/core/mach-known-noise-filter.js +57 -56
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +17 -16
- package/dist/src/core/mach-python.d.ts +3 -0
- package/dist/src/core/mach-python.js +13 -7
- package/dist/src/core/mach-resource-shim.d.ts +24 -12
- package/dist/src/core/mach-resource-shim.js +124 -21
- package/dist/src/core/mach.d.ts +59 -73
- package/dist/src/core/mach.js +47 -115
- package/dist/src/core/marionette-port.d.ts +15 -30
- package/dist/src/core/marionette-port.js +46 -89
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +32 -50
- 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 +17 -17
- 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 +46 -42
- 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 +13 -13
- package/dist/src/core/patch-apply.d.ts +13 -14
- package/dist/src/core/patch-apply.js +36 -42
- package/dist/src/core/patch-export-coverage.d.ts +0 -9
- package/dist/src/core/patch-export-coverage.js +1 -30
- package/dist/src/core/patch-export-update.d.ts +21 -4
- package/dist/src/core/patch-export-update.js +7 -6
- package/dist/src/core/patch-export.d.ts +20 -30
- package/dist/src/core/patch-export.js +55 -77
- package/dist/src/core/patch-files.d.ts +0 -4
- package/dist/src/core/patch-files.js +0 -11
- 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 +12 -18
- package/dist/src/core/patch-lint-cache.d.ts +18 -2
- package/dist/src/core/patch-lint-cache.js +16 -19
- package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
- package/dist/src/core/patch-lint-checkjs.js +78 -64
- 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 +5 -9
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +27 -19
- package/dist/src/core/patch-lint-cross.js +67 -110
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +15 -11
- 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 +6 -6
- package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
- package/dist/src/core/patch-lint-forward-registration.js +210 -0
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +46 -46
- package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
- 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 +7 -7
- package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
- package/dist/src/core/patch-lint-queue-types.js +12 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
- package/dist/src/core/patch-lint-staged-registration.js +90 -0
- 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 +41 -35
- package/dist/src/core/patch-lint.js +52 -49
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +11 -11
- 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 +35 -34
- 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 +32 -21
- package/dist/src/core/patch-parse.js +40 -15
- package/dist/src/core/patch-policy.js +15 -27
- 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-source-metadata.d.ts +1 -3
- package/dist/src/core/patch-source-metadata.js +0 -4
- package/dist/src/core/patch-transform.d.ts +8 -16
- package/dist/src/core/patch-transform.js +13 -23
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +6 -6
- package/dist/src/core/rebase-session.d.ts +9 -15
- package/dist/src/core/rebase-session.js +13 -25
- package/dist/src/core/register-browser-content.js +3 -2
- package/dist/src/core/register-browser-test.js +2 -1
- package/dist/src/core/register-module.js +2 -1
- 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 +8 -7
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +6 -5
- 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 +38 -0
- package/dist/src/core/run-log-redact.js +69 -0
- package/dist/src/core/run-log.d.ts +21 -10
- package/dist/src/core/run-log.js +76 -27
- 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 +4 -6
- package/dist/src/core/smoke-patterns.d.ts +5 -6
- package/dist/src/core/smoke-patterns.js +15 -20
- package/dist/src/core/state-file.d.ts +15 -4
- package/dist/src/core/state-file.js +14 -1
- 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 +13 -12
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +40 -25
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +69 -69
- 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 -23
- package/dist/src/core/test-stale-check.js +31 -30
- 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/test-xpcshell-retry.d.ts +26 -7
- package/dist/src/core/test-xpcshell-retry.js +14 -11
- package/dist/src/core/token-category.d.ts +35 -2
- package/dist/src/core/token-category.js +67 -58
- 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 +13 -25
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +56 -0
- package/dist/src/core/token-inventory.js +109 -0
- package/dist/src/core/token-manager.d.ts +4 -4
- package/dist/src/core/token-manager.js +22 -22
- 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 +52 -53
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +23 -23
- package/dist/src/core/tree-cow.d.ts +3 -5
- package/dist/src/core/tree-cow.js +8 -8
- 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 +39 -38
- 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 +33 -33
- 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 +12 -23
- 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 +16 -28
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +28 -30
- 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 +69 -16
- package/dist/src/errors/base.js +95 -26
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +26 -34
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/config.d.ts +0 -14
- package/dist/src/errors/config.js +13 -34
- package/dist/src/errors/download.d.ts +13 -0
- package/dist/src/errors/download.js +53 -24
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/furnace.js +8 -9
- package/dist/src/errors/git.d.ts +9 -9
- package/dist/src/errors/git.js +21 -31
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +11 -13
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +8 -8
- 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 +155 -200
- 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 +52 -19
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/index.d.ts +0 -1
- 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 +4 -16
- package/dist/src/utils/assert.js +7 -24
- package/dist/src/utils/build-info.d.ts +6 -6
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +7 -6
- 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 +10 -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 +15 -20
- package/dist/src/utils/hash.d.ts +12 -0
- package/dist/src/utils/hash.js +16 -0
- package/dist/src/utils/line-dispatch.d.ts +15 -0
- package/dist/src/utils/line-dispatch.js +48 -0
- 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 +14 -20
- package/dist/src/utils/options.js +26 -27
- package/dist/src/utils/package-root.js +5 -14
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/platform.d.ts +0 -4
- package/dist/src/utils/process-group.d.ts +10 -9
- package/dist/src/utils/process-group.js +37 -36
- package/dist/src/utils/process.d.ts +70 -55
- package/dist/src/utils/process.js +129 -179
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +9 -9
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +26 -0
- package/dist/src/utils/sleep.js +31 -0
- 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 +12 -49
- package/dist/src/utils/validation.js +26 -36
- package/docs/README.md +2 -2
- package/docs/configuration.md +163 -69
- package/docs/exit-codes.md +66 -49
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +414 -247
- package/docs/machine-output.md +58 -34
- package/docs/patch-workflow.md +48 -44
- package/docs/run-logs.md +72 -28
- package/docs/testing.md +105 -98
- package/docs/verification-trees.md +23 -22
- package/package.json +7 -6
- package/dist/src/commands/rebase.d.ts +0 -4
- package/dist/src/commands/rebase.js +0 -5
- package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
- package/dist/src/core/patch-artifact-normalize.js +0 -24
- package/dist/src/core/patch-lint-reexports.d.ts +0 -7
- package/dist/src/core/patch-lint-reexports.js +0 -8
- package/dist/src/core/wire-targets.d.ts +0 -7
- package/dist/src/core/wire-targets.js +0 -8
|
@@ -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';
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Renders a patch order as the zero-padded prefix used in filenames and in
|
|
3
|
+
* every message that names an order.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* `
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
5
|
+
* Eleven call sites across `patch-policy`, `patch-export`, `export-flow`,
|
|
6
|
+
* `export-placement-policy` and `patch move-files` spelled this as
|
|
7
|
+
* `String(order).padStart(3, '0')`, so the padding width lived in eleven
|
|
8
|
+
* places while the filenames it has to agree with are produced in one.
|
|
9
|
+
* @param order - Numeric patch order.
|
|
10
|
+
* @param width - Prefix width. Defaults to the on-disk convention.
|
|
11
|
+
* @returns The zero-padded order, e.g. `007`.
|
|
11
12
|
*/
|
|
13
|
+
export declare function formatPatchOrder(order: number, width?: number): string;
|
|
14
|
+
/**
|
|
15
|
+
* Renders an inclusive order range the way `patchPolicy` diagnostics name it.
|
|
16
|
+
* @param range - Inclusive `from`/`to` order bounds.
|
|
17
|
+
* @returns The range label, e.g. `100-199`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatOrderRange(range: {
|
|
20
|
+
from: number;
|
|
21
|
+
to: number;
|
|
22
|
+
}): string;
|
|
12
23
|
/**
|
|
13
24
|
* Extracts the order number from a patch filename.
|
|
14
25
|
* Expects format like "001-description.patch"
|
|
@@ -24,7 +35,7 @@ export declare function extractOrder(filename: string): number;
|
|
|
24
35
|
* `Infinity` for a prefix-less filename, which sorts such a patch last and
|
|
25
36
|
* is the right answer for a read: an unparseable name should not crash a
|
|
26
37
|
* status listing. Persisting `Infinity` (or the `0` some call sites used to
|
|
27
|
-
* fall back to) is a different matter
|
|
38
|
+
* fall back to) is a different matter: it puts an order in the manifest
|
|
28
39
|
* that no filename on disk agrees with, and the queue then applies in an
|
|
29
40
|
* order the operator cannot see. Callers here have always just built or
|
|
30
41
|
* looked up a real prefixed filename, so absence is a bug, not input.
|
|
@@ -41,7 +52,7 @@ export declare function requirePatchOrder(filename: string): number;
|
|
|
41
52
|
export interface DiffGitHeader {
|
|
42
53
|
/** Old-side (`a/`) path. */
|
|
43
54
|
sourcePath: string;
|
|
44
|
-
/** New-side (`b/`) path
|
|
55
|
+
/** New-side (`b/`) path: the file the patch produces. */
|
|
45
56
|
targetPath: string;
|
|
46
57
|
}
|
|
47
58
|
/**
|
|
@@ -51,8 +62,8 @@ export interface DiffGitHeader {
|
|
|
51
62
|
* (`diff --git "a/x y" "b/x y"`), and disambiguates the unquoted form for
|
|
52
63
|
* paths that themselves contain ` b/`: for the overwhelmingly common
|
|
53
64
|
* non-rename case the two paths are identical, so a symmetric split
|
|
54
|
-
* (`a/<p> b/<p>`) is tried first
|
|
55
|
-
* lines at the
|
|
65
|
+
* (`a/<p> b/<p>`) is tried first: a greedy `a\/.+ b\/(.+)$` splits such
|
|
66
|
+
* lines at the last ` b/` and returns a truncated path. Falls back to a
|
|
56
67
|
* non-greedy split for renames.
|
|
57
68
|
*
|
|
58
69
|
* @returns null when the line is not a diff --git header.
|
|
@@ -62,7 +73,7 @@ export declare function parseDiffGitHeader(line: string): DiffGitHeader | null;
|
|
|
62
73
|
* One `diff --git` section of a unified diff, fully structured.
|
|
63
74
|
*/
|
|
64
75
|
export interface DiffSection {
|
|
65
|
-
/** New-side (`b/`) path
|
|
76
|
+
/** New-side (`b/`) path: the file this section produces. */
|
|
66
77
|
targetPath: string;
|
|
67
78
|
/** Old-side (`a/`) path. */
|
|
68
79
|
sourcePath: string;
|
|
@@ -72,21 +83,21 @@ export interface DiffSection {
|
|
|
72
83
|
isDeletedFile: boolean;
|
|
73
84
|
/**
|
|
74
85
|
* True for binary sections (`GIT binary patch` or `Binary files … differ`).
|
|
75
|
-
* Binary sections have no parseable hunks
|
|
86
|
+
* Binary sections have no parseable hunks. Text-oriented consumers must
|
|
76
87
|
* refuse them rather than treat base85 lines starting with `+` as content.
|
|
77
88
|
*/
|
|
78
89
|
isBinary: boolean;
|
|
79
90
|
/**
|
|
80
|
-
* True
|
|
91
|
+
* True only for `GIT binary patch` sections, whose body carries a
|
|
81
92
|
* reconstructable literal/delta payload. False for `Binary files … differ`,
|
|
82
|
-
* which records
|
|
93
|
+
* which records that the bytes changed but carries none of them and cannot
|
|
83
94
|
* be replayed by `git apply`.
|
|
84
95
|
*
|
|
85
96
|
* The distinction is not cosmetic: the stub form still carries a correct
|
|
86
97
|
* `index <old>..<new>` line, so identity checks keyed on {@link indexNewHash}
|
|
87
98
|
* alone happily conclude "the recorded bytes match the live file" for a body
|
|
88
99
|
* that can no longer produce those bytes. Consumers deciding whether a patch
|
|
89
|
-
* can
|
|
100
|
+
* can recreate a file must read this flag, never `isBinary` plus a hash.
|
|
90
101
|
*/
|
|
91
102
|
hasBinaryDelta: boolean;
|
|
92
103
|
/**
|
|
@@ -95,14 +106,14 @@ export interface DiffSection {
|
|
|
95
106
|
* parseable index line (hand-written diffs, `Binary files … differ`).
|
|
96
107
|
*/
|
|
97
108
|
indexOldHash?: string;
|
|
98
|
-
/** New-side blob hash from the `index` line
|
|
109
|
+
/** New-side blob hash from the `index` line. See {@link indexOldHash}. */
|
|
99
110
|
indexNewHash?: string;
|
|
100
111
|
/** Parsed hunks, in file order. Empty for binary or metadata-only sections. */
|
|
101
112
|
hunks: ParsedHunk[];
|
|
102
113
|
}
|
|
103
114
|
/**
|
|
104
|
-
* Parses a unified diff into structured per-file sections
|
|
105
|
-
* shared walker every diff consumer builds on.
|
|
115
|
+
* Parses a unified diff into structured per-file sections. This is the
|
|
116
|
+
* single shared walker every diff consumer builds on.
|
|
106
117
|
*/
|
|
107
118
|
export declare function parseDiffSections(diffContent: string): DiffSection[];
|
|
108
119
|
/**
|
|
@@ -121,7 +132,7 @@ export declare function isNewFileInPatch(patchContent: string, targetFile: strin
|
|
|
121
132
|
export declare function extractAffectedFiles(diffContent: string): string[];
|
|
122
133
|
/**
|
|
123
134
|
* A single parsed hunk. `noNewlineAtEndOld` / `noNewlineAtEndNew` track the
|
|
124
|
-
* `` marker per side
|
|
135
|
+
* `` marker per side. The marker is a trailing
|
|
125
136
|
* annotation on the immediately preceding body line, and a `-` precedent
|
|
126
137
|
* sets only the old-side flag, a `+` sets only the new-side flag, and a
|
|
127
138
|
* context ` ` line sets both. Collapsing the two into one boolean makes the
|
|
@@ -4,13 +4,38 @@ import { assert } from '../utils/assert.js';
|
|
|
4
4
|
* Pure parsing functions for extracting information from patch files. All
|
|
5
5
|
* functions are synchronous and operate on string content.
|
|
6
6
|
*
|
|
7
|
-
* This module is the
|
|
7
|
+
* This module is the one unified-diff walker in the codebase. Hand-rolled
|
|
8
8
|
* `diff --git` walkers diverge in ways that matter: CRLF handling (a
|
|
9
9
|
* CRLF-saved patch file silently fails target-file matching and
|
|
10
10
|
* `\ No newline` detection on Windows), quoted-path support, and greedy path
|
|
11
11
|
* captures that mis-split any path containing ` b/`. New diff-shaped parsing
|
|
12
12
|
* must build on {@link parseDiffSections} rather than re-walking lines.
|
|
13
13
|
*/
|
|
14
|
+
/** Width of the zero-padded numeric prefix on a patch filename ("001-…"). */
|
|
15
|
+
const PATCH_ORDER_WIDTH = 3;
|
|
16
|
+
/**
|
|
17
|
+
* Renders a patch order as the zero-padded prefix used in filenames and in
|
|
18
|
+
* every message that names an order.
|
|
19
|
+
*
|
|
20
|
+
* Eleven call sites across `patch-policy`, `patch-export`, `export-flow`,
|
|
21
|
+
* `export-placement-policy` and `patch move-files` spelled this as
|
|
22
|
+
* `String(order).padStart(3, '0')`, so the padding width lived in eleven
|
|
23
|
+
* places while the filenames it has to agree with are produced in one.
|
|
24
|
+
* @param order - Numeric patch order.
|
|
25
|
+
* @param width - Prefix width. Defaults to the on-disk convention.
|
|
26
|
+
* @returns The zero-padded order, e.g. `007`.
|
|
27
|
+
*/
|
|
28
|
+
export function formatPatchOrder(order, width = PATCH_ORDER_WIDTH) {
|
|
29
|
+
return String(order).padStart(width, '0');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Renders an inclusive order range the way `patchPolicy` diagnostics name it.
|
|
33
|
+
* @param range - Inclusive `from`/`to` order bounds.
|
|
34
|
+
* @returns The range label, e.g. `100-199`.
|
|
35
|
+
*/
|
|
36
|
+
export function formatOrderRange(range) {
|
|
37
|
+
return `${formatPatchOrder(range.from)}-${formatPatchOrder(range.to)}`;
|
|
38
|
+
}
|
|
14
39
|
/**
|
|
15
40
|
* Extracts the order number from a patch filename.
|
|
16
41
|
* Expects format like "001-description.patch"
|
|
@@ -32,7 +57,7 @@ export function extractOrder(filename) {
|
|
|
32
57
|
* `Infinity` for a prefix-less filename, which sorts such a patch last and
|
|
33
58
|
* is the right answer for a read: an unparseable name should not crash a
|
|
34
59
|
* status listing. Persisting `Infinity` (or the `0` some call sites used to
|
|
35
|
-
* fall back to) is a different matter
|
|
60
|
+
* fall back to) is a different matter: it puts an order in the manifest
|
|
36
61
|
* that no filename on disk agrees with, and the queue then applies in an
|
|
37
62
|
* order the operator cannot see. Callers here have always just built or
|
|
38
63
|
* looked up a real prefixed filename, so absence is a bug, not input.
|
|
@@ -58,8 +83,8 @@ function unquoteGitPath(quoted) {
|
|
|
58
83
|
for (let i = 0; i < quoted.length; i++) {
|
|
59
84
|
const ch = quoted[i];
|
|
60
85
|
if (ch !== '\\') {
|
|
61
|
-
// Plain character
|
|
62
|
-
// contains raw UTF-8
|
|
86
|
+
// Plain character, which may itself be multi-byte when the diff already
|
|
87
|
+
// contains raw UTF-8. Push its bytes.
|
|
63
88
|
const encoded = Buffer.from(quoted[i] ?? '', 'utf-8');
|
|
64
89
|
for (const b of encoded)
|
|
65
90
|
bytes.push(b);
|
|
@@ -87,8 +112,8 @@ function unquoteGitPath(quoted) {
|
|
|
87
112
|
* (`diff --git "a/x y" "b/x y"`), and disambiguates the unquoted form for
|
|
88
113
|
* paths that themselves contain ` b/`: for the overwhelmingly common
|
|
89
114
|
* non-rename case the two paths are identical, so a symmetric split
|
|
90
|
-
* (`a/<p> b/<p>`) is tried first
|
|
91
|
-
* lines at the
|
|
115
|
+
* (`a/<p> b/<p>`) is tried first: a greedy `a\/.+ b\/(.+)$` splits such
|
|
116
|
+
* lines at the last ` b/` and returns a truncated path. Falls back to a
|
|
92
117
|
* non-greedy split for renames.
|
|
93
118
|
*
|
|
94
119
|
* @returns null when the line is not a diff --git header.
|
|
@@ -128,10 +153,10 @@ export function parseDiffGitHeader(line) {
|
|
|
128
153
|
* Splits raw diff content into lines, tolerating CRLF-saved patch files.
|
|
129
154
|
*
|
|
130
155
|
* The distinction matters: a patch file saved with CRLF endings (Windows
|
|
131
|
-
* editor, `core.autocrlf` checkout) has `\r` on
|
|
132
|
-
* structural ones
|
|
156
|
+
* editor, `core.autocrlf` checkout) has `\r` on every line including
|
|
157
|
+
* structural ones. Strip it, or headers, `@@` lines and the
|
|
133
158
|
* `` marker all fail to match. But an LF patch
|
|
134
|
-
* of a file whose
|
|
159
|
+
* of a file whose content is CRLF has `\r` only on payload lines, where it
|
|
135
160
|
* is significant and must be preserved. Detect the former by checking the
|
|
136
161
|
* structural lines themselves for a trailing `\r`.
|
|
137
162
|
*/
|
|
@@ -145,8 +170,8 @@ function splitDiffLines(diffContent) {
|
|
|
145
170
|
return lines.map((line) => (line.endsWith('\r') ? line.slice(0, -1) : line));
|
|
146
171
|
}
|
|
147
172
|
/**
|
|
148
|
-
* Parses a unified diff into structured per-file sections
|
|
149
|
-
* shared walker every diff consumer builds on.
|
|
173
|
+
* Parses a unified diff into structured per-file sections. This is the
|
|
174
|
+
* single shared walker every diff consumer builds on.
|
|
150
175
|
*/
|
|
151
176
|
export function parseDiffSections(diffContent) {
|
|
152
177
|
const sections = [];
|
|
@@ -198,7 +223,7 @@ export function parseDiffSections(diffContent) {
|
|
|
198
223
|
continue;
|
|
199
224
|
}
|
|
200
225
|
// `git diff --binary` always records full blob hashes here (git
|
|
201
|
-
// apply requires them)
|
|
226
|
+
// apply requires them). Text sections carry abbreviated ones. The
|
|
202
227
|
// hashes let binary sections be compared by identity when their
|
|
203
228
|
// payload cannot be applied as text.
|
|
204
229
|
const indexMatch = /^index ([0-9a-f]{7,64})\.\.([0-9a-f]{7,64})(?: \d{6})?$/.exec(line);
|
|
@@ -229,7 +254,7 @@ export function parseDiffSections(diffContent) {
|
|
|
229
254
|
if (line === '\') {
|
|
230
255
|
// The marker is an annotation on the immediately preceding body
|
|
231
256
|
// line. Peek the last collected line to decide which side(s) the
|
|
232
|
-
// annotation applies to
|
|
257
|
+
// annotation applies to. A single boolean cannot represent the
|
|
233
258
|
// asymmetric case where only one side lacks the trailing newline.
|
|
234
259
|
const previous = currentHunk.lines[currentHunk.lines.length - 1] ?? '';
|
|
235
260
|
if (previous.startsWith('-')) {
|
|
@@ -242,12 +267,12 @@ export function parseDiffSections(diffContent) {
|
|
|
242
267
|
// Context line: present in both sides, so the trailing-newline
|
|
243
268
|
// absence applies to both. This is rare (it only happens when
|
|
244
269
|
// the hunk ends on an unchanged line that itself is the last
|
|
245
|
-
// line of the file) but real
|
|
270
|
+
// line of the file) but real: git emits it.
|
|
246
271
|
currentHunk.noNewlineAtEndOld = true;
|
|
247
272
|
currentHunk.noNewlineAtEndNew = true;
|
|
248
273
|
}
|
|
249
274
|
// If the marker appears with no preceding body line (malformed
|
|
250
|
-
// diff), leave both flags false
|
|
275
|
+
// diff), leave both flags false. The downstream apply logic
|
|
251
276
|
// will still produce a defined result.
|
|
252
277
|
continue;
|
|
253
278
|
}
|
|
@@ -11,6 +11,7 @@ import { InvalidArgumentError } from '../errors/base.js';
|
|
|
11
11
|
import { warn } from '../utils/logger.js';
|
|
12
12
|
import { PATCH_CATEGORIES } from '../utils/validation.js';
|
|
13
13
|
import { rewriteStagedDependencyOwners } from './patch-manifest-io.js';
|
|
14
|
+
import { formatOrderRange, formatPatchOrder } from './patch-parse.js';
|
|
14
15
|
/** Default patch filename contract used when a policy omits `filenamePattern`. */
|
|
15
16
|
const DEFAULT_PATCH_POLICY_FILENAME_PATTERN = '^(?<order>\\d{3})-(?<category>[a-z][a-z0-9-]*)-(?<slug>[a-z0-9-]+)\\.patch$';
|
|
16
17
|
function policy(config) {
|
|
@@ -19,13 +20,6 @@ function policy(config) {
|
|
|
19
20
|
function mutationMode(config) {
|
|
20
21
|
return policy(config)?.mutationMode ?? 'error';
|
|
21
22
|
}
|
|
22
|
-
function issueSeverity(config) {
|
|
23
|
-
return mutationMode(config) === 'warn' ? 'warning' : 'error';
|
|
24
|
-
}
|
|
25
|
-
/** Returns true when the loaded config includes an opt-in patch policy. */
|
|
26
|
-
function hasPatchPolicy(config) {
|
|
27
|
-
return policy(config) !== undefined;
|
|
28
|
-
}
|
|
29
23
|
/** Returns valid categories for prompts and CLI validation under the config. */
|
|
30
24
|
export function getPatchPolicyCategories(config) {
|
|
31
25
|
const cfg = policy(config);
|
|
@@ -42,9 +36,6 @@ export function isCategoryAllowedByConfig(config, category) {
|
|
|
42
36
|
return PATCH_CATEGORIES.includes(category);
|
|
43
37
|
return cfg.ranges.some((range) => range.category === category);
|
|
44
38
|
}
|
|
45
|
-
function rangeLabel(range) {
|
|
46
|
-
return `${String(range.from).padStart(3, '0')}-${String(range.to).padStart(3, '0')}`;
|
|
47
|
-
}
|
|
48
39
|
/**
|
|
49
40
|
* Human-readable label for a category's configured ranges, e.g. `300-399`.
|
|
50
41
|
* Exported for the forward-import hint, which must render the
|
|
@@ -54,7 +45,7 @@ export function categoryRangeLabel(ranges, category) {
|
|
|
54
45
|
const matches = ranges.filter((range) => range.category === category);
|
|
55
46
|
if (matches.length === 0)
|
|
56
47
|
return '(no configured range)';
|
|
57
|
-
return matches.map(
|
|
48
|
+
return matches.map(formatOrderRange).join(', ');
|
|
58
49
|
}
|
|
59
50
|
function reservedRangeForOrder(cfg, order) {
|
|
60
51
|
return cfg.reservedRanges?.find((range) => order >= range.from && order <= range.to) ?? null;
|
|
@@ -73,9 +64,6 @@ export function categoryRangeForOrder(cfg, category, order) {
|
|
|
73
64
|
function anyRangeForOrder(cfg, order) {
|
|
74
65
|
return cfg.ranges.find((range) => order >= range.from && order <= range.to) ?? null;
|
|
75
66
|
}
|
|
76
|
-
function compileFilenamePattern(cfg) {
|
|
77
|
-
return new RegExp(cfg.filenamePattern ?? DEFAULT_PATCH_POLICY_FILENAME_PATTERN);
|
|
78
|
-
}
|
|
79
67
|
function parseFilenameWithPolicy(cfg, patch, severity) {
|
|
80
68
|
if (cfg.filenamePattern === undefined) {
|
|
81
69
|
const defaultMatch = /^(?<order>\d{3})-(?<rest>[a-z0-9-]+)\.patch$/.exec(patch.filename);
|
|
@@ -117,7 +105,7 @@ function parseFilenameWithPolicy(cfg, patch, severity) {
|
|
|
117
105
|
}
|
|
118
106
|
return { order: Number.parseInt(orderRaw, 10), category };
|
|
119
107
|
}
|
|
120
|
-
const pattern =
|
|
108
|
+
const pattern = new RegExp(cfg.filenamePattern ?? DEFAULT_PATCH_POLICY_FILENAME_PATTERN);
|
|
121
109
|
const match = pattern.exec(patch.filename);
|
|
122
110
|
if (!match) {
|
|
123
111
|
return [
|
|
@@ -188,7 +176,7 @@ function evaluatePatchMetadata(cfg, patch, severity) {
|
|
|
188
176
|
code: 'reserved-range',
|
|
189
177
|
filename: patch.filename,
|
|
190
178
|
severity,
|
|
191
|
-
message: `${patch.filename} is in reserved range ${
|
|
179
|
+
message: `${patch.filename} is in reserved range ${formatOrderRange(reserved)}. ` +
|
|
192
180
|
'Reserved ranges require an exact patchPolicy.reservedRanges[].allowed filename exception.',
|
|
193
181
|
});
|
|
194
182
|
return issues;
|
|
@@ -198,7 +186,7 @@ function evaluatePatchMetadata(cfg, patch, severity) {
|
|
|
198
186
|
code: 'reserved-documentation',
|
|
199
187
|
filename: patch.filename,
|
|
200
188
|
severity,
|
|
201
|
-
message: `${patch.filename} is allowlisted for reserved range ${
|
|
189
|
+
message: `${patch.filename} is allowlisted for reserved range ${formatOrderRange(reserved)}, ` +
|
|
202
190
|
'but the allowlist entry must include either "adr" or "documentation".',
|
|
203
191
|
});
|
|
204
192
|
}
|
|
@@ -210,7 +198,7 @@ function evaluatePatchMetadata(cfg, patch, severity) {
|
|
|
210
198
|
code: 'reserved-files',
|
|
211
199
|
filename: patch.filename,
|
|
212
200
|
severity,
|
|
213
|
-
message: `${patch.filename} is allowlisted for reserved range ${
|
|
201
|
+
message: `${patch.filename} is allowlisted for reserved range ${formatOrderRange(reserved)}, ` +
|
|
214
202
|
`but touches file(s) outside its reserved allowlist: ${extraFiles.join(', ')}.`,
|
|
215
203
|
});
|
|
216
204
|
}
|
|
@@ -222,8 +210,8 @@ function evaluatePatchMetadata(cfg, patch, severity) {
|
|
|
222
210
|
const owner = anyRangeForOrder(cfg, patch.order);
|
|
223
211
|
const expected = categoryRangeLabel(cfg.ranges, patch.category);
|
|
224
212
|
const actual = owner !== null
|
|
225
|
-
? `${
|
|
226
|
-
: `${
|
|
213
|
+
? `${formatPatchOrder(patch.order)} is configured for ${owner.category} (${formatOrderRange(owner)})`
|
|
214
|
+
: `${formatPatchOrder(patch.order)} is outside all configured ranges`;
|
|
227
215
|
issues.push({
|
|
228
216
|
code: 'category-range',
|
|
229
217
|
filename: patch.filename,
|
|
@@ -262,10 +250,10 @@ function evaluateGaps(cfg, patches, severity) {
|
|
|
262
250
|
if (missing.length > 0) {
|
|
263
251
|
issues.push({
|
|
264
252
|
code: 'numeric-gap',
|
|
265
|
-
filename: `${range.category}:${
|
|
253
|
+
filename: `${range.category}:${formatOrderRange(range)}`,
|
|
266
254
|
severity,
|
|
267
|
-
message: `${range.category} range ${
|
|
268
|
-
missing.map((order) =>
|
|
255
|
+
message: `${range.category} range ${formatOrderRange(range)} has numeric gap(s): ` +
|
|
256
|
+
missing.map((order) => formatPatchOrder(order)).join(', ') +
|
|
269
257
|
'. patchPolicy.allowGaps is false.',
|
|
270
258
|
});
|
|
271
259
|
}
|
|
@@ -286,9 +274,9 @@ function evaluateOrderCollisions(patches, severity) {
|
|
|
286
274
|
const filenames = matches.map((patch) => patch.filename).sort((a, b) => a.localeCompare(b));
|
|
287
275
|
issues.push({
|
|
288
276
|
code: 'order-collision',
|
|
289
|
-
filename:
|
|
277
|
+
filename: formatPatchOrder(order),
|
|
290
278
|
severity,
|
|
291
|
-
message: `patchPolicy requires unique numeric orders; order ${
|
|
279
|
+
message: `patchPolicy requires unique numeric orders; order ${formatPatchOrder(order)} ` +
|
|
292
280
|
`is used by: ${filenames.join(', ')}.`,
|
|
293
281
|
});
|
|
294
282
|
}
|
|
@@ -299,7 +287,7 @@ export function evaluatePatchPolicy(config, manifest) {
|
|
|
299
287
|
const cfg = policy(config);
|
|
300
288
|
if (!cfg)
|
|
301
289
|
return [];
|
|
302
|
-
const severity =
|
|
290
|
+
const severity = mutationMode(config) === 'warn' ? 'warning' : 'error';
|
|
303
291
|
const issues = manifest.patches.flatMap((patch) => evaluatePatchMetadata(cfg, patch, severity));
|
|
304
292
|
issues.push(...evaluateOrderCollisions(manifest.patches, severity));
|
|
305
293
|
issues.push(...evaluateGaps(cfg, manifest.patches, severity));
|
|
@@ -335,7 +323,7 @@ export function applyRenameMapToManifest(manifest, renameMap) {
|
|
|
335
323
|
}
|
|
336
324
|
/** Enforces patch policy according to the configured mutation mode. */
|
|
337
325
|
export function enforcePatchPolicy(input) {
|
|
338
|
-
if (
|
|
326
|
+
if (policy(input.config) === undefined)
|
|
339
327
|
return;
|
|
340
328
|
const issues = evaluatePatchPolicy(input.config, input.manifest);
|
|
341
329
|
if (issues.length === 0)
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* clean" for the broken queue. This module provides a pattern-scoped scan so
|
|
9
9
|
* `verify` can cross-check registrations against available file bodies.
|
|
10
10
|
*
|
|
11
|
-
* The scan is
|
|
11
|
+
* The scan is narrow on purpose: it only matches component-shaped
|
|
12
12
|
* references (widget tag names, locale fluent names). Unrelated jar.mn or
|
|
13
13
|
* customElements.js edits pass through without spurious warnings.
|
|
14
14
|
*/
|
|
@@ -28,11 +28,11 @@ export interface PatchRegistrationReference {
|
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Walks a unified-diff patch body and returns the set of
|
|
31
|
-
* component-shaped engine paths that the patch
|
|
31
|
+
* component-shaped engine paths that the patch adds a registration for.
|
|
32
32
|
*
|
|
33
|
-
* Returns the empty array when no registration hunks are present
|
|
33
|
+
* Returns the empty array when no registration hunks are present, or
|
|
34
34
|
* when the registration hunks do not mention any component-shaped
|
|
35
|
-
* paths
|
|
35
|
+
* paths. That leaves the scan silent on the vast majority of patches
|
|
36
36
|
* (branding tweaks, behavioural fixes, module additions) so it only
|
|
37
37
|
* fires when a furnace-managed component is being newly registered.
|
|
38
38
|
*
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* clean" for the broken queue. This module provides a pattern-scoped scan so
|
|
10
10
|
* `verify` can cross-check registrations against available file bodies.
|
|
11
11
|
*
|
|
12
|
-
* The scan is
|
|
12
|
+
* The scan is narrow on purpose: it only matches component-shaped
|
|
13
13
|
* references (widget tag names, locale fluent names). Unrelated jar.mn or
|
|
14
14
|
* customElements.js edits pass through without spurious warnings.
|
|
15
15
|
*/
|
|
@@ -23,11 +23,11 @@ const REGISTRATION_FILE_PATHS = new Set([
|
|
|
23
23
|
]);
|
|
24
24
|
/**
|
|
25
25
|
* Walks a unified-diff patch body and returns the set of
|
|
26
|
-
* component-shaped engine paths that the patch
|
|
26
|
+
* component-shaped engine paths that the patch adds a registration for.
|
|
27
27
|
*
|
|
28
|
-
* Returns the empty array when no registration hunks are present
|
|
28
|
+
* Returns the empty array when no registration hunks are present, or
|
|
29
29
|
* when the registration hunks do not mention any component-shaped
|
|
30
|
-
* paths
|
|
30
|
+
* paths. That leaves the scan silent on the vast majority of patches
|
|
31
31
|
* (branding tweaks, behavioural fixes, module additions) so it only
|
|
32
32
|
* fires when a furnace-managed component is being newly registered.
|
|
33
33
|
*
|
|
@@ -38,7 +38,7 @@ export function collectPatchRegistrationReferences(patchBody) {
|
|
|
38
38
|
return [];
|
|
39
39
|
const refs = [];
|
|
40
40
|
// Key the file state off the `b/` path because that names the target
|
|
41
|
-
// side and is stable against renames. Only real hunk adds count
|
|
41
|
+
// side and is stable against renames. Only real hunk adds count.
|
|
42
42
|
// parseDiffSections has already filtered out header/metadata lines.
|
|
43
43
|
for (const section of parseDiffSections(patchBody)) {
|
|
44
44
|
if (!REGISTRATION_FILE_PATHS.has(section.targetPath))
|
|
@@ -59,7 +59,7 @@ export function collectPatchRegistrationReferences(patchBody) {
|
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Per-source extractor. Each registration file has a distinct syntactic
|
|
62
|
-
* shape
|
|
62
|
+
* shape. We scope the match to that file so a jar.mn regex does not
|
|
63
63
|
* accidentally match a customElements.js line.
|
|
64
64
|
*/
|
|
65
65
|
function extractTargetPathsFromRegistrationLine(sourceFile, added) {
|
|
@@ -68,7 +68,7 @@ function extractTargetPathsFromRegistrationLine(sourceFile, added) {
|
|
|
68
68
|
// ` content/global/elements/moz-qa-panel.mjs (widgets/moz-qa-panel/moz-qa-panel.mjs)`
|
|
69
69
|
// The parenthesised second half is the repo-relative path Firefox's
|
|
70
70
|
// packaging system reads. Widget registrations always live under
|
|
71
|
-
// `widgets/<tag>/<file
|
|
71
|
+
// `widgets/<tag>/<file>`, and the enclosing tree is
|
|
72
72
|
// `toolkit/content/widgets/`. Reconstruct the engine-relative
|
|
73
73
|
// target path so callers can check it against patch bodies.
|
|
74
74
|
const widgetMatch = /\(\s*(widgets\/[^\s)]+)\s*\)/.exec(added);
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import type { PatchMetadata } from '../types/commands/index.js';
|
|
2
|
-
import type { FirefoxConfig
|
|
2
|
+
import type { FirefoxConfig } from '../types/config.js';
|
|
3
3
|
/** Metadata fields stamped on new or refreshed patch entries. */
|
|
4
4
|
export declare function buildPatchSourceMetadata(firefox: Pick<FirefoxConfig, 'product' | 'version'>): Pick<PatchMetadata, 'sourceEsrVersion' | 'sourceProduct' | 'sourceVersion'>;
|
|
5
5
|
/** Backward-compatible source version reader for legacy manifests. */
|
|
6
6
|
export declare function getPatchSourceVersion(patch: Pick<PatchMetadata, 'sourceEsrVersion' | 'sourceVersion'>): string;
|
|
7
|
-
/** Backward-compatible source product reader for legacy manifests. */
|
|
8
|
-
export declare function getPatchSourceProduct(patch: Pick<PatchMetadata, 'sourceProduct'>): FirefoxProduct | undefined;
|
|
@@ -10,7 +10,3 @@ export function buildPatchSourceMetadata(firefox) {
|
|
|
10
10
|
export function getPatchSourceVersion(patch) {
|
|
11
11
|
return patch.sourceVersion ?? patch.sourceEsrVersion;
|
|
12
12
|
}
|
|
13
|
-
/** Backward-compatible source product reader for legacy manifests. */
|
|
14
|
-
export function getPatchSourceProduct(patch) {
|
|
15
|
-
return patch.sourceProduct;
|
|
16
|
-
}
|
|
@@ -5,29 +5,29 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* Extracts the complete file content from a "new file" patch given a raw
|
|
7
7
|
* diff string already in memory. Callers with a patch file path should
|
|
8
|
-
* prefer {@link extractNewFileContent}
|
|
8
|
+
* prefer {@link extractNewFileContent}. This helper exists for code paths
|
|
9
9
|
* that already hold the diff (e.g. the in-flight export planner) and do
|
|
10
10
|
* not want to round-trip through the filesystem.
|
|
11
11
|
*
|
|
12
12
|
* @param diff - Raw unified-diff content
|
|
13
13
|
* @param targetFile - Optional target file to scope extraction to
|
|
14
14
|
* @returns The file content that the patch would create
|
|
15
|
-
* @throws PatchError for binary sections
|
|
15
|
+
* @throws PatchError for binary sections. A `GIT binary patch` payload is
|
|
16
16
|
* base85 (whose alphabet includes `+`), so "extract the + lines" would
|
|
17
17
|
* silently write garbage text over a binary target. Callers must treat
|
|
18
18
|
* binary new-file conflicts as unresolvable rather than auto-resolving.
|
|
19
19
|
*/
|
|
20
20
|
export declare function extractNewFileContentFromDiff(diff: string, targetFile?: string): string;
|
|
21
21
|
/**
|
|
22
|
-
* Projects every
|
|
22
|
+
* Projects every text new file a diff creates into a path → content map, for
|
|
23
23
|
* the cross-patch lint projections that build a synthetic patch-queue entry.
|
|
24
24
|
*
|
|
25
|
-
* Binary new files are
|
|
26
|
-
* forward-import rule, which scans content for import statements
|
|
27
|
-
* blob authors none, so omitting it contributes exactly what
|
|
28
|
-
* would. Refusing instead (which is what
|
|
25
|
+
* Binary new files are skipped rather than refused. The map feeds only the
|
|
26
|
+
* forward-import rule, which scans content for import statements, and a
|
|
27
|
+
* binary blob authors none, so omitting it contributes exactly what
|
|
28
|
+
* including it would. Refusing instead (which is what
|
|
29
29
|
* {@link extractNewFileContentFromDiff} correctly does for a caller that
|
|
30
|
-
* named
|
|
30
|
+
* named one file) made vendoring a new binary impossible: every projection
|
|
31
31
|
* site fed it every detected new file, so `export --order`, `re-export
|
|
32
32
|
* --scan --scan-file`, `patch move-files-into` and `patch split` all died on
|
|
33
33
|
* a file the export half had just written a valid `GIT binary patch` for.
|
|
@@ -48,14 +48,6 @@ export declare function buildNewFileTextProjection(diff: string): Map<string, st
|
|
|
48
48
|
* @returns The file content that the patch would create
|
|
49
49
|
*/
|
|
50
50
|
export declare function extractNewFileContent(patchPath: string, targetFile?: string): Promise<string>;
|
|
51
|
-
/**
|
|
52
|
-
* Applies a patch's changes to content.
|
|
53
|
-
* @param content - Original content (null for new files)
|
|
54
|
-
* @param patchPath - Path to the patch file
|
|
55
|
-
* @param targetFile - The file path within the patch
|
|
56
|
-
* @returns Modified content
|
|
57
|
-
*/
|
|
58
|
-
export declare function applyPatchToContent(content: string | null, patchPath: string, targetFile: string): Promise<string>;
|
|
59
51
|
/**
|
|
60
52
|
* Applies an already-read patch body to content. Batched callers that hold
|
|
61
53
|
* many (patch, file) pairs use this to read each patch body once instead of
|