@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
|
@@ -34,13 +34,24 @@ export interface PatchQueueEntry {
|
|
|
34
34
|
* are not indexed here.
|
|
35
35
|
*/
|
|
36
36
|
newFiles: Map<string, string>;
|
|
37
|
+
/**
|
|
38
|
+
* Every path this patch creates, whatever the body kind: text, a
|
|
39
|
+
* reconstructable `GIT binary patch`, or a payload-less
|
|
40
|
+
* `Binary files … differ` stub. `newFiles` is text-only by design (a
|
|
41
|
+
* binary authors no imports, so the import rules gain nothing from it and
|
|
42
|
+
* `extractNewFileContent` correctly refuses to decode one), but "does a
|
|
43
|
+
* later patch create this path" is a question about existence after apply,
|
|
44
|
+
* not about content, and answering it from `newFiles` made every binary
|
|
45
|
+
* creation invisible to the staged-registration rules.
|
|
46
|
+
*/
|
|
47
|
+
createdFiles: Set<string>;
|
|
37
48
|
/**
|
|
38
49
|
* Map from existing-file path → concatenated added lines from the patch's
|
|
39
50
|
* hunks against that file (joined with `\n`). Populated for files the
|
|
40
51
|
* patch *modifies* (i.e. paths that show up in the diff without a
|
|
41
52
|
* `new file mode` marker). The forward-import rule and `patch delete`
|
|
42
53
|
* dependency scan use this to detect imports added into pre-existing
|
|
43
|
-
* files
|
|
54
|
+
* files, a failure mode the newFiles map cannot represent because it
|
|
44
55
|
* only tracks creations.
|
|
45
56
|
*/
|
|
46
57
|
modifiedFileAdditions: Map<string, string>;
|
|
@@ -49,7 +60,7 @@ export interface PatchQueueEntry {
|
|
|
49
60
|
* Queue-wide context passed to cross-patch lint rules.
|
|
50
61
|
*
|
|
51
62
|
* "Projected" means rules receive a potentially hypothetical view of the
|
|
52
|
-
* queue
|
|
63
|
+
* queue: the caller may have already applied a planned delete, reorder, or
|
|
53
64
|
* re-export to the entries before calling the rule. This lets
|
|
54
65
|
* `patch reorder`, `patch delete`, `export --order`, and `re-export --files`
|
|
55
66
|
* run the same cross-patch checks they would hit on a real run, without
|
|
@@ -73,7 +84,7 @@ export interface PatchQueueContext {
|
|
|
73
84
|
* Reads manifest metadata best-effort: if the manifest is missing or a patch
|
|
74
85
|
* file has no metadata entry, the context still populates the entry from the
|
|
75
86
|
* filename prefix so cross-patch rules can operate on a drift state. (A
|
|
76
|
-
* separate consistency check
|
|
87
|
+
* separate consistency check, see `patches verify`, is responsible for
|
|
77
88
|
* reporting the drift as its own error.)
|
|
78
89
|
*
|
|
79
90
|
* @param patchesDir - Path to the patches directory
|
|
@@ -100,22 +111,19 @@ export declare function isForwardImportableFile(path: string): boolean;
|
|
|
100
111
|
*
|
|
101
112
|
* Intentionally conservative. Catches:
|
|
102
113
|
* - `import ... from "specifier"` (ES module static imports)
|
|
103
|
-
* - `import "specifier"` (side-effect imports
|
|
114
|
+
* - `import "specifier"` (side-effect imports, where the `from`
|
|
104
115
|
* clause is optional in the regex)
|
|
105
116
|
* - `import("specifier")` (dynamic imports)
|
|
106
117
|
* - ChromeUtils.importESModule("specifier")
|
|
107
118
|
* - ChromeUtils.defineESModuleGetters(obj, { Name: "specifier", ... })
|
|
108
119
|
*
|
|
109
|
-
* Returns the raw specifier strings
|
|
120
|
+
* Returns the raw specifier strings. Callers should take the leaf basename
|
|
110
121
|
* to match against the newFileIndex, because we do not resolve `resource://`
|
|
111
122
|
* URLs to engine file paths.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
*
|
|
116
|
-
* (0-indexed) line number where each specifier was found. Used by the
|
|
117
|
-
* forward-import rule so it can correlate specifiers against the
|
|
118
|
-
* ignore-marker line set and skip suppressed matches.
|
|
123
|
+
*
|
|
124
|
+
* Also returns the (0-indexed) line number where each specifier was found, so
|
|
125
|
+
* the forward-import rule can correlate specifiers against the ignore-marker
|
|
126
|
+
* line set and skip suppressed matches.
|
|
119
127
|
*/
|
|
120
128
|
export interface ExtractedSpecifier {
|
|
121
129
|
specifier: string;
|
|
@@ -123,7 +131,7 @@ export interface ExtractedSpecifier {
|
|
|
123
131
|
}
|
|
124
132
|
/**
|
|
125
133
|
* Returns import specifiers plus 0-indexed line numbers, preserving the
|
|
126
|
-
* same matching behavior as {@link
|
|
134
|
+
* same matching behavior as {@link extractImportSpecifiersWithLines}.
|
|
127
135
|
*/
|
|
128
136
|
export declare function extractImportSpecifiersWithLines(source: string): ExtractedSpecifier[];
|
|
129
137
|
/**
|
|
@@ -154,19 +162,19 @@ export declare function findForwardImportIgnoreLines(source: string): Set<number
|
|
|
154
162
|
* Cross-patch lint rule: a patch imports a module that a later patch is
|
|
155
163
|
* responsible for creating.
|
|
156
164
|
*
|
|
157
|
-
*
|
|
165
|
+
* Conservative by design: `resource://` URLs are not resolved to engine
|
|
158
166
|
* file paths. Instead a cross-queue index of newly-created files is built,
|
|
159
167
|
* keyed by basename, and imports whose leaf matches an entry owned by a
|
|
160
168
|
* later-ordered patch are flagged. False positives from unrelated basename
|
|
161
|
-
* collisions (two directories both creating `Helper.sys.mjs`) are possible
|
|
162
|
-
*
|
|
169
|
+
* collisions (two directories both creating `Helper.sys.mjs`) are possible.
|
|
170
|
+
* The README documents the limitation and the inline ignore marker above is
|
|
163
171
|
* the escape hatch.
|
|
164
172
|
*
|
|
165
173
|
* Rules out:
|
|
166
174
|
* - Imports whose leaf matches a newly-created file in the *same* or an
|
|
167
175
|
* *earlier* patch (legitimate use).
|
|
168
176
|
* - Imports whose leaf is not in the new-file index at all (pre-existing
|
|
169
|
-
* engine file
|
|
177
|
+
* engine file, not our concern).
|
|
170
178
|
* - Imports on a line suppressed by the ignore marker.
|
|
171
179
|
*/
|
|
172
180
|
/** One discovered forward-import edge: a site importing a later-created file. */
|
|
@@ -196,8 +204,8 @@ export declare function collectForwardImportEdges(ctx: PatchQueueContext): Forwa
|
|
|
196
204
|
* Cross-patch lint rule: flag imports of a module a later-ordered patch is
|
|
197
205
|
* responsible for creating, unless the patch declares an exact staged
|
|
198
206
|
* forward-import for it. Also warns on staged-dependency declarations that
|
|
199
|
-
* never matched (stale). Matching is conservative
|
|
200
|
-
* resolving `resource://`/`chrome://` URLs
|
|
207
|
+
* never matched (stale). Matching is conservative: by basename, not by
|
|
208
|
+
* resolving `resource://`/`chrome://` URLs, with an inline ignore marker as
|
|
201
209
|
* an escape hatch for unrelated basename collisions.
|
|
202
210
|
*/
|
|
203
211
|
export declare function lintPatchQueueForwardImports(ctx: PatchQueueContext): PatchLintIssue[];
|
|
@@ -19,7 +19,9 @@ import { discoverPatches } from './patch-files.js';
|
|
|
19
19
|
import { lintPatchQueueBinaryBodies } from './patch-lint-binary.js';
|
|
20
20
|
import { collectNewFileCreatorsByPath } from './patch-lint-creators.js';
|
|
21
21
|
import { detectNewFilesInDiff, extractAddedLinesPerFile } from './patch-lint-diff.js';
|
|
22
|
+
import { lintPatchQueueForwardRegistrations } from './patch-lint-forward-registration.js';
|
|
22
23
|
import { lintPatchQueueModuleRegistrations } from './patch-lint-module-registration.js';
|
|
24
|
+
import { describeRegistrationFailure, findStagedRegistrationFailure, isLaterOwner, quoteRegistrationLine, } from './patch-lint-staged-registration.js';
|
|
23
25
|
import { loadPatchesManifest } from './patch-manifest-io.js';
|
|
24
26
|
import { categoryRangeForOrder, categoryRangeLabel } from './patch-policy.js';
|
|
25
27
|
import { extractNewFileContent } from './patch-transform.js';
|
|
@@ -30,7 +32,7 @@ import { extractNewFileContent } from './patch-transform.js';
|
|
|
30
32
|
* Reads manifest metadata best-effort: if the manifest is missing or a patch
|
|
31
33
|
* file has no metadata entry, the context still populates the entry from the
|
|
32
34
|
* filename prefix so cross-patch rules can operate on a drift state. (A
|
|
33
|
-
* separate consistency check
|
|
35
|
+
* separate consistency check, see `patches verify`, is responsible for
|
|
34
36
|
* reporting the drift as its own error.)
|
|
35
37
|
*
|
|
36
38
|
* @param patchesDir - Path to the patches directory
|
|
@@ -61,7 +63,7 @@ export async function buildPatchQueueContext(patchesDir, config) {
|
|
|
61
63
|
// Added-line content for every file the patch modifies but does not
|
|
62
64
|
// create. Fed to the forward-import rule so imports introduced into
|
|
63
65
|
// pre-existing files are checked too, not only imports in brand-new
|
|
64
|
-
// files.
|
|
66
|
+
// files. Paths in newFilePaths are skipped on purpose: they are
|
|
65
67
|
// already covered by the newFiles map, which carries full content
|
|
66
68
|
// rather than only the added lines.
|
|
67
69
|
const addedLinesByFile = extractAddedLinesPerFile(diff);
|
|
@@ -77,6 +79,9 @@ export async function buildPatchQueueContext(patchesDir, config) {
|
|
|
77
79
|
metadata: metadataByFilename.get(patch.filename) ?? null,
|
|
78
80
|
diff,
|
|
79
81
|
newFiles,
|
|
82
|
+
// Straight from the detector, before the text-extraction filter above
|
|
83
|
+
// drops the bodies it cannot decode.
|
|
84
|
+
createdFiles: newFilePaths,
|
|
80
85
|
modifiedFileAdditions,
|
|
81
86
|
});
|
|
82
87
|
}
|
|
@@ -86,7 +91,7 @@ export async function buildPatchQueueContext(patchesDir, config) {
|
|
|
86
91
|
}
|
|
87
92
|
// The creators map (split out of `lintPatchQueueDuplicateCreations` so
|
|
88
93
|
// `status --ownership` can consume the structured data) lives in
|
|
89
|
-
// `patch-lint-creators.ts` with its per-context memoisation
|
|
94
|
+
// `patch-lint-creators.ts` with its per-context memoisation. It is
|
|
90
95
|
// re-exported here so callers keep importing from `patch-lint.ts`.
|
|
91
96
|
export { collectNewFileCreatorsByPath, invalidateNewFileCreatorsCache, } from './patch-lint-creators.js';
|
|
92
97
|
/**
|
|
@@ -125,24 +130,6 @@ const FORWARD_IMPORTABLE_EXTENSIONS = ['.mjs', '.sys.mjs', '.js', '.jsm'];
|
|
|
125
130
|
export function isForwardImportableFile(path) {
|
|
126
131
|
return FORWARD_IMPORTABLE_EXTENSIONS.some((ext) => path.endsWith(ext));
|
|
127
132
|
}
|
|
128
|
-
/**
|
|
129
|
-
* Regex-level extractor for module specifiers in ES module / subscript files.
|
|
130
|
-
*
|
|
131
|
-
* Intentionally conservative. Catches:
|
|
132
|
-
* - `import ... from "specifier"` (ES module static imports)
|
|
133
|
-
* - `import "specifier"` (side-effect imports — the `from`
|
|
134
|
-
* clause is optional in the regex)
|
|
135
|
-
* - `import("specifier")` (dynamic imports)
|
|
136
|
-
* - ChromeUtils.importESModule("specifier")
|
|
137
|
-
* - ChromeUtils.defineESModuleGetters(obj, { Name: "specifier", ... })
|
|
138
|
-
*
|
|
139
|
-
* Returns the raw specifier strings — callers should take the leaf basename
|
|
140
|
-
* to match against the newFileIndex, because we do not resolve `resource://`
|
|
141
|
-
* URLs to engine file paths.
|
|
142
|
-
*/
|
|
143
|
-
export function extractImportSpecifiers(source) {
|
|
144
|
-
return extractImportSpecifiersWithLines(source).map((item) => item.specifier);
|
|
145
|
-
}
|
|
146
133
|
function buildLineOffsets(source) {
|
|
147
134
|
const offsets = [0];
|
|
148
135
|
for (let i = 0; i < source.length; i++) {
|
|
@@ -181,7 +168,7 @@ function collectGetterSpecifiers(stripped, results, offsetToLine) {
|
|
|
181
168
|
const openParen = stripped.indexOf('(', match.index);
|
|
182
169
|
if (openParen === -1)
|
|
183
170
|
continue;
|
|
184
|
-
// Walk to the first top-level `{` inside the call
|
|
171
|
+
// Walk to the first top-level `{` inside the call, the start of
|
|
185
172
|
// the getter-map object literal. Bail if we reach the closing `)`
|
|
186
173
|
// first (no object literal argument given).
|
|
187
174
|
let depthParen = 1;
|
|
@@ -236,14 +223,14 @@ function collectGetterSpecifiers(stripped, results, offsetToLine) {
|
|
|
236
223
|
}
|
|
237
224
|
/**
|
|
238
225
|
* Returns import specifiers plus 0-indexed line numbers, preserving the
|
|
239
|
-
* same matching behavior as {@link
|
|
226
|
+
* same matching behavior as {@link extractImportSpecifiersWithLines}.
|
|
240
227
|
*/
|
|
241
228
|
export function extractImportSpecifiersWithLines(source) {
|
|
242
229
|
// stripJsComments replaces comment bodies with space runs of equal
|
|
243
230
|
// length, preserving character offsets. That lets us match against
|
|
244
231
|
// the stripped source (so we do not match `import` tokens inside
|
|
245
232
|
// block comments or string literals) while still reporting line
|
|
246
|
-
// numbers based on the
|
|
233
|
+
// numbers based on the original source, which is what the
|
|
247
234
|
// ignore-marker scan walks.
|
|
248
235
|
const stripped = stripJsComments(source);
|
|
249
236
|
const results = [];
|
|
@@ -260,7 +247,7 @@ export function extractImportSpecifiersWithLines(source) {
|
|
|
260
247
|
if (match[1])
|
|
261
248
|
results.push({ specifier: match[1], line: offsetToLine(match.index) });
|
|
262
249
|
}
|
|
263
|
-
// ChromeUtils.importESModule("resource://...")
|
|
250
|
+
// ChromeUtils.importESModule("resource://...") is a Firefox single-module import
|
|
264
251
|
const chromeUtilsPattern = /ChromeUtils\.importESModule\s*\(\s*["']([^"']+)["']/g;
|
|
265
252
|
while ((match = chromeUtilsPattern.exec(stripped)) !== null) {
|
|
266
253
|
if (match[1])
|
|
@@ -270,14 +257,14 @@ export function extractImportSpecifiersWithLines(source) {
|
|
|
270
257
|
return results;
|
|
271
258
|
}
|
|
272
259
|
/**
|
|
273
|
-
* Bare `Name: "url"` property lines added inside a
|
|
274
|
-
* `defineESModuleGetters` (or `XPCOMUtils` lazy-getter) map. Applied
|
|
260
|
+
* Bare `Name: "url"` property lines added inside a pre-existing
|
|
261
|
+
* `defineESModuleGetters` (or `XPCOMUtils` lazy-getter) map. Applied only to
|
|
275
262
|
* `modifiedFileAdditions`: a patch that inserts one property into an
|
|
276
263
|
* existing getter object never carries the `defineESModuleGetters(` opener
|
|
277
264
|
* in its added lines, so the balanced-brace walk in
|
|
278
265
|
* {@link extractImportSpecifiersWithLines} cannot see it. The
|
|
279
266
|
* URL-scheme restriction keeps ordinary object literals
|
|
280
|
-
* (`label: "Foo.sys.mjs"`) out
|
|
267
|
+
* (`label: "Foo.sys.mjs"`) out. The leaf-extension filter downstream does
|
|
281
268
|
* the rest.
|
|
282
269
|
*/
|
|
283
270
|
const BARE_GETTER_PROPERTY_LINE = /^\s*(?:["'])?[A-Za-z_$][\w$]*(?:["'])?\s*:\s*["']((?:resource|chrome|moz-src):\/\/[^"']+)["']\s*,?\s*$/;
|
|
@@ -290,8 +277,8 @@ function extractBareGetterSpecifiers(source) {
|
|
|
290
277
|
const stripped = stripJsComments(source);
|
|
291
278
|
const results = [];
|
|
292
279
|
const lines = stripped.split('\n');
|
|
293
|
-
for (
|
|
294
|
-
const match = BARE_GETTER_PROPERTY_LINE.exec(
|
|
280
|
+
for (const [i, line] of lines.entries()) {
|
|
281
|
+
const match = BARE_GETTER_PROPERTY_LINE.exec(line);
|
|
295
282
|
if (match?.[1])
|
|
296
283
|
results.push({ specifier: match[1], line: i });
|
|
297
284
|
}
|
|
@@ -323,9 +310,8 @@ export const FORWARD_IMPORT_IGNORE_MARKER = 'fireforge-ignore: forward-import';
|
|
|
323
310
|
export function findForwardImportIgnoreLines(source) {
|
|
324
311
|
const lines = source.split('\n');
|
|
325
312
|
const ignored = new Set();
|
|
326
|
-
for (
|
|
327
|
-
|
|
328
|
-
if (line && line.includes(FORWARD_IMPORT_IGNORE_MARKER)) {
|
|
313
|
+
for (const [i, line] of lines.entries()) {
|
|
314
|
+
if (line.includes(FORWARD_IMPORT_IGNORE_MARKER)) {
|
|
329
315
|
ignored.add(i);
|
|
330
316
|
ignored.add(i + 1);
|
|
331
317
|
}
|
|
@@ -348,36 +334,51 @@ function findMatchingStagedDependency(entry, sitePath, specifier, laterOwners) {
|
|
|
348
334
|
laterOwners.some((owner) => owner.fullPath === dependency.creates &&
|
|
349
335
|
(dependency.owner === undefined || dependency.owner === owner.filename)));
|
|
350
336
|
}
|
|
351
|
-
/**
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
* lexicographically later filename (the apply loop's tiebreak).
|
|
355
|
-
*/
|
|
356
|
-
function isLaterOwner(owner, entry) {
|
|
357
|
-
return (owner.order > entry.order || (owner.order === entry.order && owner.filename > entry.filename));
|
|
358
|
-
}
|
|
359
|
-
/** Builds the basename → later-creators index used by the forward-import scan. */
|
|
360
|
-
function buildNewFileIndex(ctx) {
|
|
361
|
-
const newFileIndex = new Map();
|
|
337
|
+
/** Builds a basename → creators index from one path set per entry. */
|
|
338
|
+
function buildCreatorIndex(ctx, pathsOf) {
|
|
339
|
+
const index = new Map();
|
|
362
340
|
for (const entry of ctx.entries) {
|
|
363
|
-
for (const fullPath of entry
|
|
341
|
+
for (const fullPath of pathsOf(entry)) {
|
|
364
342
|
const leaf = basename(fullPath);
|
|
365
|
-
let owners =
|
|
343
|
+
let owners = index.get(leaf);
|
|
366
344
|
if (!owners) {
|
|
367
345
|
owners = [];
|
|
368
|
-
|
|
346
|
+
index.set(leaf, owners);
|
|
369
347
|
}
|
|
370
348
|
owners.push({ filename: entry.filename, order: entry.order, fullPath });
|
|
371
349
|
}
|
|
372
350
|
}
|
|
373
|
-
return
|
|
351
|
+
return index;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Basename → later-creators index for the forward-IMPORT scan.
|
|
355
|
+
*
|
|
356
|
+
* Keyed on `newFiles`: this index answers "which patch creates
|
|
357
|
+
* the module this specifier resolves to", and a binary is not a module.
|
|
358
|
+
*/
|
|
359
|
+
function buildNewFileIndex(ctx) {
|
|
360
|
+
return buildCreatorIndex(ctx, (entry) => entry.newFiles.keys());
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Basename → creators index for the staged-REGISTRATION rules.
|
|
364
|
+
*
|
|
365
|
+
* Keyed on `createdFiles`, which includes binary creations. A registration
|
|
366
|
+
* (`support-files`, a jar.mn line, an actor entry) points at a file that
|
|
367
|
+
* must exist after apply. Whether its body was text or a `GIT binary patch`
|
|
368
|
+
* has nothing to do with it. Resolving this from `newFiles` made a declared
|
|
369
|
+
* dependency on a binary fixture report `creates-unresolved`, so the
|
|
370
|
+
* declaration read as stale on every lint run and removing it changed
|
|
371
|
+
* nothing either. The failure was symmetric and therefore invisible.
|
|
372
|
+
*/
|
|
373
|
+
function buildCreatedFileIndex(ctx) {
|
|
374
|
+
return buildCreatorIndex(ctx, (entry) => entry.createdFiles);
|
|
374
375
|
}
|
|
375
376
|
/**
|
|
376
377
|
* Visits every forward-import site (an import whose leaf is created by a
|
|
377
378
|
* later-ordered patch). Shared by {@link lintPatchQueueForwardImports} (which
|
|
378
379
|
* resolves/reports each) and {@link collectForwardImportEdges} (which returns
|
|
379
380
|
* them structurally). We scan a created file's full body and a modified
|
|
380
|
-
* file's added lines only
|
|
381
|
+
* file's added lines only, so it flags imports *this patch introduces*, not
|
|
381
382
|
* pre-existing HEAD imports that happen to collide with a later-created file.
|
|
382
383
|
*/
|
|
383
384
|
function eachForwardImportSite(ctx, newFileIndex, visit) {
|
|
@@ -388,10 +389,10 @@ function eachForwardImportSite(ctx, newFileIndex, visit) {
|
|
|
388
389
|
if (includeBareGetterLines) {
|
|
389
390
|
// Dedupe by (specifier, line): a patch that adds the whole getter
|
|
390
391
|
// call carries both the opener (found by the balanced walk) and the
|
|
391
|
-
// property line (found here)
|
|
392
|
-
const seen = new Set(sites.map((site) => `${site.specifier}|${
|
|
392
|
+
// property line (found here), so report each site once.
|
|
393
|
+
const seen = new Set(sites.map((site) => `${site.specifier}|${site.line}`));
|
|
393
394
|
for (const extra of extractBareGetterSpecifiers(content)) {
|
|
394
|
-
if (!seen.has(`${extra.specifier}|${
|
|
395
|
+
if (!seen.has(`${extra.specifier}|${extra.line}`))
|
|
395
396
|
sites.push(extra);
|
|
396
397
|
}
|
|
397
398
|
}
|
|
@@ -447,12 +448,13 @@ export function collectForwardImportEdges(ctx) {
|
|
|
447
448
|
* Cross-patch lint rule: flag imports of a module a later-ordered patch is
|
|
448
449
|
* responsible for creating, unless the patch declares an exact staged
|
|
449
450
|
* forward-import for it. Also warns on staged-dependency declarations that
|
|
450
|
-
* never matched (stale). Matching is conservative
|
|
451
|
-
* resolving `resource://`/`chrome://` URLs
|
|
451
|
+
* never matched (stale). Matching is conservative: by basename, not by
|
|
452
|
+
* resolving `resource://`/`chrome://` URLs, with an inline ignore marker as
|
|
452
453
|
* an escape hatch for unrelated basename collisions.
|
|
453
454
|
*/
|
|
454
455
|
export function lintPatchQueueForwardImports(ctx) {
|
|
455
456
|
const newFileIndex = buildNewFileIndex(ctx);
|
|
457
|
+
const createdFileIndex = buildCreatedFileIndex(ctx);
|
|
456
458
|
const issues = [];
|
|
457
459
|
const usedStagedDeclarations = new Set();
|
|
458
460
|
eachForwardImportSite(ctx, newFileIndex, (entry, sitePath, specifier, cleaned, laterOwners) => {
|
|
@@ -468,11 +470,11 @@ export function lintPatchQueueForwardImports(ctx) {
|
|
|
468
470
|
.map((o) => `${o.filename}:${o.fullPath}`)
|
|
469
471
|
.sort((a, b) => a.localeCompare(b))
|
|
470
472
|
.join(',');
|
|
471
|
-
// Lowest ordinal that lands
|
|
473
|
+
// Lowest ordinal that lands after every later-ordered creator. It
|
|
472
474
|
// turns the operator's "guess and re-run" loop into a single shot
|
|
473
475
|
// when the only fix is reordering. When patchPolicy is available and
|
|
474
476
|
// that ordinal falls outside the importing patch's category range,
|
|
475
|
-
// `patch reorder` would refuse it
|
|
477
|
+
// `patch reorder` would refuse it, so suppress the hint and point at
|
|
476
478
|
// the staged-dependency remedy instead.
|
|
477
479
|
const suggestedOrder = Math.max(...laterOwners.map((o) => o.order)) + 1;
|
|
478
480
|
const category = entry.metadata?.category ?? /^\d+-([a-z]+)-/.exec(entry.filename)?.[1];
|
|
@@ -524,14 +526,14 @@ export function lintPatchQueueForwardImports(ctx) {
|
|
|
524
526
|
}
|
|
525
527
|
// Registration-kind declarations: a jar.mn packaging line,
|
|
526
528
|
// customElements registration, or actor registration referencing a
|
|
527
|
-
// later-created file. There is no import specifier to match
|
|
529
|
+
// later-created file. There is no import specifier to match. The
|
|
528
530
|
// declaration is "used" when the declared line (whitespace-trimmed)
|
|
529
|
-
// appears among the lines this patch adds to the declaring file
|
|
531
|
+
// appears among the lines this patch adds to the declaring file and its
|
|
530
532
|
// `creates` resolves to a file a later-ordered patch actually creates
|
|
531
|
-
// (with `owner`, when set, naming that patch)
|
|
533
|
+
// (with `owner`, when set, naming that patch), mirroring
|
|
532
534
|
// findMatchingStagedDependency for the import kind.
|
|
533
535
|
for (const registration of entry.metadata?.stagedDependencies?.registrations ?? []) {
|
|
534
|
-
const failure = findStagedRegistrationFailure(entry, registration,
|
|
536
|
+
const failure = findStagedRegistrationFailure(entry, registration, createdFileIndex);
|
|
535
537
|
if (failure === undefined)
|
|
536
538
|
continue;
|
|
537
539
|
issues.push({
|
|
@@ -541,62 +543,16 @@ export function lintPatchQueueForwardImports(ctx) {
|
|
|
541
543
|
fingerprint: `staged-dependency-unused|${entry.filename}|${registration.file}|reg:${registration.line}|${registration.creates}|${registration.owner ?? ''}`,
|
|
542
544
|
message: `${entry.filename} declares a staged registration in ${registration.file} ` +
|
|
543
545
|
`("${registration.line}") for ${registration.creates}, but ${describeRegistrationFailure(failure)} ` +
|
|
544
|
-
'Remove the stale declaration with
|
|
546
|
+
'Remove the stale declaration with: ' +
|
|
547
|
+
`fireforge patch staged-dependency ${entry.filename} --remove --kind registration ` +
|
|
548
|
+
`--file ${registration.file} --line "${quoteRegistrationLine(registration.line)}" ` +
|
|
549
|
+
`--creates ${registration.creates}; or update it to match the patch and queue.`,
|
|
545
550
|
severity: 'warning',
|
|
546
551
|
});
|
|
547
552
|
}
|
|
548
553
|
}
|
|
549
554
|
return issues;
|
|
550
555
|
}
|
|
551
|
-
/**
|
|
552
|
-
* Validates one registration-kind declaration against the patch content
|
|
553
|
-
* and the queue, mirroring {@link findMatchingStagedDependency}: the
|
|
554
|
-
* declared line must be added by this patch, `creates` must exactly match
|
|
555
|
-
* a file a LATER-ordered patch creates (an earlier-only creator means the
|
|
556
|
-
* dependency is already satisfied and the declaration is stale), and
|
|
557
|
-
* `owner`, when set, must name one of those creating patches. Returns
|
|
558
|
-
* undefined when valid.
|
|
559
|
-
*/
|
|
560
|
-
function findStagedRegistrationFailure(entry, registration, newFileIndex) {
|
|
561
|
-
if (!isRegistrationLinePresent(entry, registration))
|
|
562
|
-
return { kind: 'line-absent' };
|
|
563
|
-
const creators = (newFileIndex.get(basename(registration.creates)) ?? []).filter((owner) => owner.fullPath === registration.creates && isLaterOwner(owner, entry));
|
|
564
|
-
if (creators.length === 0)
|
|
565
|
-
return { kind: 'creates-unresolved' };
|
|
566
|
-
if (registration.owner !== undefined &&
|
|
567
|
-
!creators.some((owner) => owner.filename === registration.owner)) {
|
|
568
|
-
return { kind: 'owner-mismatch', creators };
|
|
569
|
-
}
|
|
570
|
-
return undefined;
|
|
571
|
-
}
|
|
572
|
-
/** Message tail for each {@link StagedRegistrationFailure} shape. */
|
|
573
|
-
function describeRegistrationFailure(failure) {
|
|
574
|
-
switch (failure.kind) {
|
|
575
|
-
case 'line-absent':
|
|
576
|
-
return 'the patch does not add that line.';
|
|
577
|
-
case 'creates-unresolved':
|
|
578
|
-
return ('no later-ordered patch creates that file — the declaration is stale, ' +
|
|
579
|
-
'or the queue order no longer stages it.');
|
|
580
|
-
case 'owner-mismatch':
|
|
581
|
-
return `that file is created by ${failure.creators.map((o) => o.filename).join(', ')}, not the declared owner.`;
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
/**
|
|
585
|
-
* True when the declared registration/packaging line appears (trimmed)
|
|
586
|
-
* among the lines the patch introduces in the declaring file — either as a
|
|
587
|
-
* newly-created file's content or as added lines to an existing file
|
|
588
|
-
* (where jar.mn / customElements.js / actor-registration edits land).
|
|
589
|
-
*/
|
|
590
|
-
function isRegistrationLinePresent(entry, registration) {
|
|
591
|
-
const declared = registration.line.trim();
|
|
592
|
-
if (declared.length === 0)
|
|
593
|
-
return false;
|
|
594
|
-
const introduced = [
|
|
595
|
-
entry.newFiles.get(registration.file),
|
|
596
|
-
entry.modifiedFileAdditions.get(registration.file),
|
|
597
|
-
];
|
|
598
|
-
return introduced.some((content) => content !== undefined && content.split('\n').some((line) => line.trim() === declared));
|
|
599
|
-
}
|
|
600
556
|
/**
|
|
601
557
|
* Cross-patch lint orchestrator. Runs every cross-patch rule against the
|
|
602
558
|
* provided context and returns combined issues.
|
|
@@ -614,6 +570,7 @@ export function lintPatchQueue(ctx) {
|
|
|
614
570
|
...lintPatchQueueDuplicateCreations(ctx),
|
|
615
571
|
...lintPatchQueueForwardImports(ctx),
|
|
616
572
|
...lintPatchQueueModuleRegistrations(ctx),
|
|
573
|
+
...lintPatchQueueForwardRegistrations(ctx),
|
|
617
574
|
...lintPatchQueueBinaryBodies(ctx),
|
|
618
575
|
];
|
|
619
576
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* custom-property references.
|
|
4
4
|
*
|
|
5
5
|
* Split out of `patch-lint.ts` so each rule family stays within the
|
|
6
|
-
* per-file line budget
|
|
6
|
+
* per-file line budget. `patch-lint.ts` re-exports `lintPatchedCss` so
|
|
7
7
|
* existing callers keep importing from the single module.
|
|
8
8
|
*/
|
|
9
9
|
import type { PatchLintIssue } from '../types/commands/index.js';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* custom-property references.
|
|
5
5
|
*
|
|
6
6
|
* Split out of `patch-lint.ts` so each rule family stays within the
|
|
7
|
-
* per-file line budget
|
|
7
|
+
* per-file line budget. `patch-lint.ts` re-exports `lintPatchedCss` so
|
|
8
8
|
* existing callers keep importing from the single module.
|
|
9
9
|
*/
|
|
10
10
|
import { join } from 'node:path';
|
|
@@ -15,7 +15,7 @@ import { hasRawCssColors } from '../utils/regex.js';
|
|
|
15
15
|
import { loadFurnaceConfig } from './furnace-config.js';
|
|
16
16
|
import { extractAddedLineNumbersPerFile, extractAddedLinesPerFile } from './patch-lint-diff.js';
|
|
17
17
|
/**
|
|
18
|
-
* Loads the furnace token-prefix lint inputs gracefully
|
|
18
|
+
* Loads the furnace token-prefix lint inputs gracefully. Returns
|
|
19
19
|
* undefined (skipping the token-prefix check) when furnace.json cannot
|
|
20
20
|
* be loaded or no tokenPrefix is configured.
|
|
21
21
|
*/
|
|
@@ -38,7 +38,7 @@ async function loadCssTokenContext(repoDir) {
|
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
40
|
* Masks CSS block comments with spaces, preserving newlines so line
|
|
41
|
-
* numbers stay stable. An unclosed trailing `/*` is masked to EOF
|
|
41
|
+
* numbers stay stable. An unclosed trailing `/*` is masked to EOF,
|
|
42
42
|
* matching how a CSS parser treats it.
|
|
43
43
|
*/
|
|
44
44
|
function maskCssComments(source) {
|
|
@@ -60,7 +60,7 @@ const RAW_COLOR_IGNORE_MARKER = 'fireforge-ignore: raw-color-value';
|
|
|
60
60
|
* comment spanning the context/added boundary suppresses its hex, then
|
|
61
61
|
* only the patch's added line numbers are scanned. Returns undefined
|
|
62
62
|
* when any added line number falls outside the on-disk file (patch not
|
|
63
|
-
* applied / drifted)
|
|
63
|
+
* applied / drifted). The caller then falls back to the legacy
|
|
64
64
|
* joined-added-lines scan rather than misattributing lines.
|
|
65
65
|
*/
|
|
66
66
|
function buildAddedLinesScanSource(rawCss, addedNumbers) {
|
|
@@ -73,14 +73,11 @@ function buildAddedLinesScanSource(rawCss, addedNumbers) {
|
|
|
73
73
|
.map((n) => maskedLines[n - 1] ?? '')
|
|
74
74
|
.join('\n');
|
|
75
75
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
* when diff context is available. Pushes onto `issues`.
|
|
79
|
-
*/
|
|
80
|
-
function checkRawColorValues(file, rawCss, addedLinesByFile, addedLineNumbersByFile, config, issues) {
|
|
76
|
+
function checkRawColorValues(input) {
|
|
77
|
+
const { file, rawCss, addedLinesByFile, addedLineNumbersByFile, config, issues } = input;
|
|
81
78
|
// Check only introduced raw color values when diff context is available.
|
|
82
79
|
// Skip files on the raw-color allowlist (exact path or basename match) and
|
|
83
|
-
// auto-exempt files under `browser/branding
|
|
80
|
+
// auto-exempt files under `browser/branding/`: those are the fork's
|
|
84
81
|
// visual identity assets (app-about dialogs, installer pages, branded CSS
|
|
85
82
|
// copied from Firefox's `unofficial` template) and belong to the
|
|
86
83
|
// design-decision layer the design-token system does not govern. Without
|
|
@@ -207,7 +204,14 @@ export async function lintPatchedCss(repoDir, affectedFiles, diffContent, config
|
|
|
207
204
|
const rawCss = await readText(filePath);
|
|
208
205
|
// Strip block comments before scanning
|
|
209
206
|
const cssContent = rawCss.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
210
|
-
checkRawColorValues(
|
|
207
|
+
checkRawColorValues({
|
|
208
|
+
file,
|
|
209
|
+
rawCss,
|
|
210
|
+
addedLinesByFile,
|
|
211
|
+
addedLineNumbersByFile,
|
|
212
|
+
config,
|
|
213
|
+
issues,
|
|
214
|
+
});
|
|
211
215
|
checkTokenPrefixViolations(file, cssContent, addedLinesByFile, tokenContext, issues);
|
|
212
216
|
}
|
|
213
217
|
return issues;
|
|
@@ -12,7 +12,7 @@ import type { PatchLintIssue } from '../types/commands/index.js';
|
|
|
12
12
|
/**
|
|
13
13
|
* Collects engine-relative paths that changed between `rev` and `HEAD`,
|
|
14
14
|
* plus any workdir modifications and untracked files. An empty set means
|
|
15
|
-
* "no diff we can prove"
|
|
15
|
+
* "no diff we can prove". Downstream treats every issue as `cumulative`
|
|
16
16
|
* in that case (operator ran `lint --since HEAD` with no pending work).
|
|
17
17
|
* @param engineDir Path to the engine git repository.
|
|
18
18
|
* @param rev Git revision to diff against (e.g. `HEAD`, a branch, a SHA).
|
|
@@ -28,10 +28,10 @@ export declare const AGGREGATE_PATCH_FILE = "(patch)";
|
|
|
28
28
|
/**
|
|
29
29
|
* Annotates a list of lint issues with `introduced` / `cumulative` tags
|
|
30
30
|
* based on whether the issue's file is part of the supplied diff set.
|
|
31
|
-
* Mutates each issue in place
|
|
31
|
+
* Mutates each issue in place and returns the list for chaining.
|
|
32
32
|
*
|
|
33
|
-
* Issues with no file (`issue.file === ''`)
|
|
34
|
-
* describe queue-wide state
|
|
33
|
+
* Issues with no file (`issue.file === ''`), for example cross-patch rules
|
|
34
|
+
* that describe queue-wide state, are always `cumulative` under `--since`
|
|
35
35
|
* because they describe drift accumulated across many commits, not a single
|
|
36
36
|
* current-task edit.
|
|
37
37
|
*
|
|
@@ -39,7 +39,7 @@ export declare const AGGREGATE_PATCH_FILE = "(patch)";
|
|
|
39
39
|
* synthetic placeholder that can never appear in a real `diffFiles` set.
|
|
40
40
|
* Without special-casing, `large-patch-files` / `large-patch-lines` are
|
|
41
41
|
* always tagged `[cumulative]` under `--only-introduced` even when the diff
|
|
42
|
-
*
|
|
42
|
+
* is the aggregate the rules measured, which reads as "this pre-existed" to
|
|
43
43
|
* an operator asking "what did this diff introduce?". The aggregate tag is
|
|
44
44
|
* therefore promoted to `introduced` whenever the diff set has any content:
|
|
45
45
|
* a non-empty `diffFiles` means the operator asked about a specific diff
|
|
@@ -17,7 +17,7 @@ import { getUntrackedFiles } from './git-status.js';
|
|
|
17
17
|
/**
|
|
18
18
|
* Collects engine-relative paths that changed between `rev` and `HEAD`,
|
|
19
19
|
* plus any workdir modifications and untracked files. An empty set means
|
|
20
|
-
* "no diff we can prove"
|
|
20
|
+
* "no diff we can prove". Downstream treats every issue as `cumulative`
|
|
21
21
|
* in that case (operator ran `lint --since HEAD` with no pending work).
|
|
22
22
|
* @param engineDir Path to the engine git repository.
|
|
23
23
|
* @param rev Git revision to diff against (e.g. `HEAD`, a branch, a SHA).
|
|
@@ -68,10 +68,10 @@ export const AGGREGATE_PATCH_FILE = '(patch)';
|
|
|
68
68
|
/**
|
|
69
69
|
* Annotates a list of lint issues with `introduced` / `cumulative` tags
|
|
70
70
|
* based on whether the issue's file is part of the supplied diff set.
|
|
71
|
-
* Mutates each issue in place
|
|
71
|
+
* Mutates each issue in place and returns the list for chaining.
|
|
72
72
|
*
|
|
73
|
-
* Issues with no file (`issue.file === ''`)
|
|
74
|
-
* describe queue-wide state
|
|
73
|
+
* Issues with no file (`issue.file === ''`), for example cross-patch rules
|
|
74
|
+
* that describe queue-wide state, are always `cumulative` under `--since`
|
|
75
75
|
* because they describe drift accumulated across many commits, not a single
|
|
76
76
|
* current-task edit.
|
|
77
77
|
*
|
|
@@ -79,7 +79,7 @@ export const AGGREGATE_PATCH_FILE = '(patch)';
|
|
|
79
79
|
* synthetic placeholder that can never appear in a real `diffFiles` set.
|
|
80
80
|
* Without special-casing, `large-patch-files` / `large-patch-lines` are
|
|
81
81
|
* always tagged `[cumulative]` under `--only-introduced` even when the diff
|
|
82
|
-
*
|
|
82
|
+
* is the aggregate the rules measured, which reads as "this pre-existed" to
|
|
83
83
|
* an operator asking "what did this diff introduce?". The aggregate tag is
|
|
84
84
|
* therefore promoted to `introduced` whenever the diff set has any content:
|
|
85
85
|
* a non-empty `diffFiles` means the operator asked about a specific diff
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Factored out of `patch-lint.ts` so the per-patch lint body and
|
|
6
6
|
* cross-patch lint body (in `patch-lint-cross.ts`) can both depend on
|
|
7
7
|
* the same diff walkers without inducing a circular import. Callers
|
|
8
|
-
* should keep importing these through `patch-lint.ts
|
|
8
|
+
* should keep importing these through `patch-lint.ts`. This file is
|
|
9
9
|
* an implementation detail. The actual line-walking lives in
|
|
10
10
|
* `parseDiffSections` (patch-parse.ts), the codebase's single diff walker.
|
|
11
11
|
*/
|
|
@@ -22,8 +22,8 @@ export declare function extractAddedLinesPerFile(diffContent: string): Map<strin
|
|
|
22
22
|
* Extracts 1-based post-patch line numbers of added lines per file from a
|
|
23
23
|
* unified diff. Walking each hunk with a new-file line counter (`+` and
|
|
24
24
|
* context lines advance it, `-` lines do not) lets rules that need
|
|
25
|
-
* full-file context
|
|
26
|
-
* boundary
|
|
25
|
+
* full-file context (e.g. comment masking across the context/added
|
|
26
|
+
* boundary) map the patch's additions onto the applied file.
|
|
27
27
|
*/
|
|
28
28
|
export declare function extractAddedLineNumbersPerFile(diffContent: string): Map<string, number[]>;
|
|
29
29
|
/**
|
|
@@ -34,7 +34,7 @@ export declare function extractAddedLineNumbersPerFile(diffContent: string): Map
|
|
|
34
34
|
* `buildPatchQueueContext`.
|
|
35
35
|
*
|
|
36
36
|
* Matches buildPatchQueueContext's algorithm exactly: skip paths that are
|
|
37
|
-
* created by the diff
|
|
37
|
+
* created by the diff, since those are already covered by the `newFiles` map,
|
|
38
38
|
* which carries full content rather than only the added lines.
|
|
39
39
|
*
|
|
40
40
|
* @param diff - Unified diff content
|