@hominis/fireforge 0.46.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +11 -11
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -77,7 +77,7 @@ async function renameTestFiles(engineDir, projectRoot, oldName, newName, journal
|
|
|
77
77
|
* deployment. Best-effort: logs a warning but never blocks the rename.
|
|
78
78
|
*
|
|
79
79
|
* Without it, a rename registers and deploys the new name correctly but
|
|
80
|
-
* leaves `engine/toolkit/content/widgets/<old>/` in place
|
|
80
|
+
* leaves `engine/toolkit/content/widgets/<old>/` in place: subsequent
|
|
81
81
|
* `furnace sync` runs cannot clear the stale widget, and packaging pulls in
|
|
82
82
|
* both copies. The snapshot is taken before the remove so the rollback
|
|
83
83
|
* journal restores the old directory if any later step in
|
|
@@ -103,7 +103,7 @@ async function removeStaleDeployedComponentDir(engineDir, oldTargetPath, journal
|
|
|
103
103
|
* accompanying `chrome.toml` entry names the same file. Leaving both
|
|
104
104
|
* unhandled produces a `test_<old>.html` that still imports
|
|
105
105
|
* `chrome://global/content/elements/<old>.mjs` and references
|
|
106
|
-
* `customElements.whenDefined("<old>")
|
|
106
|
+
* `customElements.whenDefined("<old>")`, running against a component that
|
|
107
107
|
* no longer exists under that name, and either failing or (if the old
|
|
108
108
|
* component is still deployed) passing for the wrong reason.
|
|
109
109
|
*
|
|
@@ -139,7 +139,7 @@ async function renameMochikitTestFiles(engineDir, oldName, newName, journal) {
|
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
141
|
// Update `chrome.toml` entry if present. The file may live in the
|
|
142
|
-
// same widgets/tests directory as the test file itself
|
|
142
|
+
// same widgets/tests directory as the test file itself. Upstream
|
|
143
143
|
// convention places exactly one `chrome.toml` there for all widget
|
|
144
144
|
// scaffolds.
|
|
145
145
|
const chromeTomlPath = join(testDir, 'chrome.toml');
|
|
@@ -195,9 +195,9 @@ async function performRenameMutations(args) {
|
|
|
195
195
|
}
|
|
196
196
|
await snapshotDir(journal, oldDir);
|
|
197
197
|
await snapshotFile(journal, args.furnaceConfigPath);
|
|
198
|
-
// Journal the state file
|
|
198
|
+
// Journal the state file before step 4 re-keys its checksums, plus
|
|
199
199
|
// the new dir and every new-name destination below (a snapshot of a
|
|
200
|
-
// missing path records {existed: false}
|
|
200
|
+
// missing path records {existed: false}, so rollback deletes it).
|
|
201
201
|
// Without these, a failed or SIGINT'd rename stranded the new-name
|
|
202
202
|
// scaffold and kept re-keyed state for a nonexistent component.
|
|
203
203
|
await snapshotFile(journal, getFurnacePaths(projectRoot).furnaceState);
|
|
@@ -209,7 +209,7 @@ async function performRenameMutations(args) {
|
|
|
209
209
|
if (!entry.isFile())
|
|
210
210
|
continue;
|
|
211
211
|
const oldFileName = entry.name;
|
|
212
|
-
// Rename only when the filename starts with the component name
|
|
212
|
+
// Rename only when the filename starts with the component name. The
|
|
213
213
|
// scaffolding convention for both create and override is
|
|
214
214
|
// `${name}.ext`. A plain `replace(oldName, newName)` produces wrong
|
|
215
215
|
// results when the old name occurs more than once (`foo-foo.mjs`
|
|
@@ -276,7 +276,7 @@ async function performRenameMutations(args) {
|
|
|
276
276
|
await renameTestFiles(args.engineDir, projectRoot, oldName, newName, journal);
|
|
277
277
|
// The mochikit scaffold and widgets/chrome.toml live in a different
|
|
278
278
|
// tree than browser.toml-registered browser-chrome tests, so
|
|
279
|
-
// renameTestFiles does not reach them
|
|
279
|
+
// renameTestFiles does not reach them, leaving
|
|
280
280
|
// `engine/toolkit/content/tests/widgets/test_<old>.html` and its
|
|
281
281
|
// `chrome.toml` entry pointing at the old name, which either fails
|
|
282
282
|
// the test run outright or passes for the wrong component.
|
|
@@ -401,8 +401,8 @@ export async function furnaceRenameCommand(projectRoot, oldName, newName) {
|
|
|
401
401
|
throw new FurnaceError(`A component named "${newName}" already exists in furnace.json.`, newName);
|
|
402
402
|
}
|
|
403
403
|
// The furnace-state key is singular (`custom` / `override`, derived
|
|
404
|
-
// inside performRenameMutations)
|
|
405
|
-
//
|
|
404
|
+
// inside performRenameMutations). The on-disk directory label differs.
|
|
405
|
+
// Custom components live under `components/custom/` (singular) while
|
|
406
406
|
// overrides live under `components/overrides/` (plural). Appending an
|
|
407
407
|
// `s` to the state key produces the wrong label `components/customs/`
|
|
408
408
|
// for custom components and is correct for overrides only by
|
|
@@ -59,7 +59,7 @@ async function promptAddComponents(components, tracked, projectRoot) {
|
|
|
59
59
|
/**
|
|
60
60
|
* Persists discovered component tag names into the `stock` section of
|
|
61
61
|
* furnace.json. Shared by the interactive confirm flow and the
|
|
62
|
-
* non-interactive `--track` flag
|
|
62
|
+
* non-interactive `--track` flag. Without it, scan prints a full inventory
|
|
63
63
|
* but persists nothing and says nothing about where the inventory goes.
|
|
64
64
|
*
|
|
65
65
|
* Wraps the furnace.json mutation in the standard furnace lifecycle so the
|
|
@@ -81,7 +81,7 @@ async function persistStockComponents(projectRoot, names) {
|
|
|
81
81
|
// re-filter catches the edge case where the config on disk changed
|
|
82
82
|
// between the scan's read and the write (concurrent scan / manual
|
|
83
83
|
// edit). Without it a duplicate scan would introduce duplicate
|
|
84
|
-
// entries into stock
|
|
84
|
+
// entries into stock. writeFurnaceConfig's validator would then
|
|
85
85
|
// reject the write, but the error would be less actionable than
|
|
86
86
|
// silently de-duplicating here.
|
|
87
87
|
const toAdd = names.filter((s) => !config.stock.includes(s));
|
|
@@ -163,7 +163,7 @@ export async function furnaceScanCommand(projectRoot, options = {}) {
|
|
|
163
163
|
note(`Total: ${components.length} Tracked: ${trackedCount} Untracked: ${untrackedCount}`, 'Summary');
|
|
164
164
|
// --track: persist the discovered untracked inventory into the `stock`
|
|
165
165
|
// section without prompting (works non-interactively). Without it, scan
|
|
166
|
-
// stays report-only
|
|
166
|
+
// stays report-only. The interactive confirm flow below is the other
|
|
167
167
|
// persistence path.
|
|
168
168
|
if (options.track) {
|
|
169
169
|
if (untrackedCount === 0) {
|
|
@@ -67,7 +67,7 @@ async function showDetailedComponentStatus(options) {
|
|
|
67
67
|
outro('Status complete');
|
|
68
68
|
return;
|
|
69
69
|
}
|
|
70
|
-
// Custom component
|
|
70
|
+
// Custom component: run registration consistency check
|
|
71
71
|
const status = await checkRegistrationConsistency(projectRoot, name, customConfig, ftlDir);
|
|
72
72
|
const lines = [];
|
|
73
73
|
const check = (ok, label) => {
|
|
@@ -122,7 +122,7 @@ export async function furnaceStatusCommand(projectRoot, name) {
|
|
|
122
122
|
// Surface a pendingRepair marker before the normal summary so it cannot
|
|
123
123
|
// be missed. The marker means the last mutation could not roll back
|
|
124
124
|
// cleanly, so the engine and workspace may have drifted in ways apply
|
|
125
|
-
// cannot detect from checksums alone
|
|
125
|
+
// cannot detect from checksums alone, so doctor is the right next step.
|
|
126
126
|
if (state.pendingRepair) {
|
|
127
127
|
warn(`Furnace is in pending-repair state from ${state.pendingRepair.operation} (${state.pendingRepair.timestamp}): ${state.pendingRepair.reason}. Run \`fireforge doctor --repair-furnace\` to reconcile.`);
|
|
128
128
|
}
|
|
@@ -154,7 +154,7 @@ export async function furnaceStatusCommand(projectRoot, name) {
|
|
|
154
154
|
// Surface override baseVersion drift from the project config. This check
|
|
155
155
|
// is cheap (no I/O besides the already-loaded fireforge.json) and catches
|
|
156
156
|
// the single most common silent-drift case: Firefox bumped, overrides
|
|
157
|
-
// still point at the old version. Advisory only
|
|
157
|
+
// still point at the old version. Advisory only. Status never fails.
|
|
158
158
|
const forgeConfig = await loadConfig(projectRoot);
|
|
159
159
|
for (const entry of findOverrideBaseVersionDrift(config, forgeConfig.firefox.version)) {
|
|
160
160
|
warn(formatOverrideBaseVersionDriftWarning(entry));
|
|
@@ -166,17 +166,17 @@ export async function furnaceStatusCommand(projectRoot, name) {
|
|
|
166
166
|
if (await pathExists(paths.engine)) {
|
|
167
167
|
// Held in an object rather than two `let`s: the scanner below mutates
|
|
168
168
|
// them from inside a closure, and TS's control-flow analysis does not
|
|
169
|
-
// propagate that through the call
|
|
169
|
+
// propagate that through the call. It would narrow both to the literal
|
|
170
170
|
// `false` and flag every later read as always-falsy.
|
|
171
171
|
const drift = { workspaceChanged: false, engineDrifted: false };
|
|
172
172
|
/**
|
|
173
173
|
* Scans one component family for workspace or engine drift.
|
|
174
174
|
*
|
|
175
|
-
* The engine probe sits behind `else if`
|
|
175
|
+
* The engine probe sits behind `else if` on purpose: a component whose
|
|
176
176
|
* workspace already changed does not need an engine comparison to decide
|
|
177
177
|
* what `status` reports, and the probe is the expensive half (it
|
|
178
|
-
* re-hashes deployed files). The consequence is that engine drift
|
|
179
|
-
*
|
|
178
|
+
* re-hashes deployed files). The consequence is that engine drift goes
|
|
179
|
+
* unreported for a component that also has workspace changes. The
|
|
180
180
|
* summary says "workspace changed", not both.
|
|
181
181
|
*/
|
|
182
182
|
const scanFamily = async (entries, baseDir, kind, probeEngineDrift) => {
|
|
@@ -91,12 +91,12 @@ export async function furnaceSyncCommand(projectRoot, options = {}) {
|
|
|
91
91
|
else {
|
|
92
92
|
info('All overrides are up-to-date with the current Firefox version.');
|
|
93
93
|
}
|
|
94
|
-
// Phase 2.5: post-refresh gates. Refresh
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
// Apply and deploy both enforce a drift gate
|
|
94
|
+
// Phase 2.5: post-refresh gates. Refresh leaves conflict markers in
|
|
95
|
+
// workspace files and does not bump baseVersion on conflict, so without
|
|
96
|
+
// this gate sync warns about conflicts and then copies the marker-laden
|
|
97
|
+
// files straight into the engine via Phase 3, producing a broken build
|
|
98
|
+
// from the one command meant to make an upgrade safe.
|
|
99
|
+
// Apply and deploy both enforce a drift gate. Sync must not be the back
|
|
100
100
|
// door around it.
|
|
101
101
|
if (!options.dryRun) {
|
|
102
102
|
const refreshedConfig = await loadFurnaceConfig(projectRoot);
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
* and silently leave the old test behind:
|
|
10
10
|
*
|
|
11
11
|
* 1. drop the upstream `moz-` custom-element prefix, which never appears in a
|
|
12
|
-
* test filename
|
|
12
|
+
* test filename.
|
|
13
13
|
* 2. drop a leading `<binaryName>-`, because the test directory is already
|
|
14
|
-
* named after the binary and the prefix would be doubled
|
|
14
|
+
* named after the binary and the prefix would be doubled.
|
|
15
15
|
* 3. underscore the remaining dashes, matching mozilla-central's
|
|
16
16
|
* `browser_*.js` convention.
|
|
17
17
|
* @param componentName - Custom-element name, e.g. `moz-mybrowser-sidebar`.
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
* and silently leave the old test behind:
|
|
11
11
|
*
|
|
12
12
|
* 1. drop the upstream `moz-` custom-element prefix, which never appears in a
|
|
13
|
-
* test filename
|
|
13
|
+
* test filename.
|
|
14
14
|
* 2. drop a leading `<binaryName>-`, because the test directory is already
|
|
15
|
-
* named after the binary and the prefix would be doubled
|
|
15
|
+
* named after the binary and the prefix would be doubled.
|
|
16
16
|
* 3. underscore the remaining dashes, matching mozilla-central's
|
|
17
17
|
* `browser_*.js` convention.
|
|
18
18
|
* @param componentName - Custom-element name, e.g. `moz-mybrowser-sidebar`.
|
|
@@ -78,16 +78,15 @@ async function autoFixIssues(projectRoot, issues) {
|
|
|
78
78
|
warn(`Could not fix jar.mn for ${componentName}: ${toError(err).message}`);
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
|
-
// `wrong-registration-pattern` is
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
// repaired, below.
|
|
81
|
+
// `wrong-registration-pattern` is not auto-fixed: the component is
|
|
82
|
+
// registered but in the wrong block, and moving code between blocks is too
|
|
83
|
+
// risky to do unattended. Only missing registrations are repaired, below.
|
|
85
84
|
// Repair components missing from customElements.js entirely (reported by
|
|
86
85
|
// validate as `missing-custom-element-registration`).
|
|
87
86
|
//
|
|
88
87
|
// Scoped to the components named in `issues`: iterating every entry in
|
|
89
88
|
// `config.custom` makes `furnace validate <one-component> --fix` write
|
|
90
|
-
// customElements.js registrations for
|
|
89
|
+
// customElements.js registrations for every custom component, outside the
|
|
91
90
|
// issue list it was handed and invisibly, since `fixed` is never
|
|
92
91
|
// incremented here.
|
|
93
92
|
const componentsWithIssues = new Set(issues.map((issue) => issue.component));
|
|
@@ -109,7 +108,7 @@ async function autoFixIssues(projectRoot, issues) {
|
|
|
109
108
|
await addCustomElementRegistration(engineDir, componentName, modulePath);
|
|
110
109
|
}
|
|
111
110
|
catch {
|
|
112
|
-
// Best-effort repair
|
|
111
|
+
// Best-effort repair. The re-validation pass at the call site reports
|
|
113
112
|
// whatever is still outstanding.
|
|
114
113
|
}
|
|
115
114
|
}
|
|
@@ -194,11 +193,11 @@ export async function furnaceValidateCommand(projectRoot, name, options = {}) {
|
|
|
194
193
|
}
|
|
195
194
|
}
|
|
196
195
|
// Auto-fix fixable issues when --fix is passed. The counter returned by
|
|
197
|
-
// `autoFixIssues` only counts function calls that did not throw
|
|
198
|
-
// that succeeded but did not actually resolve the issue
|
|
199
|
-
// appending to a file mach later ignores) would still
|
|
200
|
-
// the affected components and compute the
|
|
201
|
-
// so the reported number is honest.
|
|
196
|
+
// `autoFixIssues` only counts function calls that did not throw, so a
|
|
197
|
+
// write that succeeded but did not actually resolve the issue
|
|
198
|
+
// (addJarMnEntries appending to a file mach later ignores) would still
|
|
199
|
+
// bump it. Re-validate the affected components and compute the real drop
|
|
200
|
+
// in fixable issues so the reported number is honest.
|
|
202
201
|
if (options.fix && allIssues.length > 0) {
|
|
203
202
|
const fixableIssues = allIssues.filter((issue) => FIXABLE_CHECKS.has(issue.check));
|
|
204
203
|
if (fixableIssues.length > 0) {
|
|
@@ -254,7 +253,7 @@ async function reValidateComponents(projectRoot, config, furnacePaths, component
|
|
|
254
253
|
componentDir = join(furnacePaths.customDir, componentName);
|
|
255
254
|
}
|
|
256
255
|
else {
|
|
257
|
-
// Stock or removed components are not local-validated
|
|
256
|
+
// Stock or removed components are not local-validated, so skip silently.
|
|
258
257
|
continue;
|
|
259
258
|
}
|
|
260
259
|
if (!(await pathExists(componentDir)))
|
|
@@ -20,9 +20,9 @@ import { pickDefined } from '../utils/options.js';
|
|
|
20
20
|
/**
|
|
21
21
|
* Errno codes for filesystem-level failures against the working file.
|
|
22
22
|
* These are safe to fall through as "unmanaged" because they describe the
|
|
23
|
-
*
|
|
24
|
-
* Manifest / patch-parse / PatchError failures do
|
|
25
|
-
* are re-thrown so the root cause surfaces instead of being silently
|
|
23
|
+
* state of the engine directory rather than the integrity of the patch
|
|
24
|
+
* stack. Manifest / patch-parse / PatchError failures do not match this set
|
|
25
|
+
* and are re-thrown so the root cause surfaces instead of being silently
|
|
26
26
|
* reclassified as a spurious dirty file.
|
|
27
27
|
*/
|
|
28
28
|
const SAFE_IO_FALLBACK_CODES = new Set(['ENOENT', 'EACCES', 'EPERM', 'EISDIR', 'EBUSY']);
|
|
@@ -48,7 +48,7 @@ async function getUnmanagedDirtyFiles(engineDir, patchesDir, dirtyFiles) {
|
|
|
48
48
|
}
|
|
49
49
|
catch (error) {
|
|
50
50
|
// PatchError, manifest corruption, and patch-parse failures are
|
|
51
|
-
//
|
|
51
|
+
// structural problems with the patch stack. Masking them as an
|
|
52
52
|
// "unmanaged dirty file" would let the user `--force` past a real
|
|
53
53
|
// root cause (e.g. "patch 003 missing from manifest") and compound
|
|
54
54
|
// the corruption. Only swallow the pure-IO fallback cases where
|
|
@@ -91,7 +91,7 @@ async function checkUncommittedPatchFiles(engineDir, patchesDir, forceImport) {
|
|
|
91
91
|
// already carries the patch's effects. The import below still
|
|
92
92
|
// re-applies each patch (a no-op for files whose contents already
|
|
93
93
|
// match), so phrase the line as "no resync needed" rather than
|
|
94
|
-
// "patches already applied"
|
|
94
|
+
// "patches already applied". The latter contradicts the "Applied N
|
|
95
95
|
// patch(es)" summary `applyPatchesWithContinue` prints next.
|
|
96
96
|
info('Patch-touched files already match the stored patch stack — no engine resync needed before re-applying.');
|
|
97
97
|
}
|
|
@@ -160,7 +160,7 @@ async function checkEngineDrift(engineDir, baseCommit, forceImport, acceptPrompt
|
|
|
160
160
|
const currentHead = await getHead(engineDir);
|
|
161
161
|
if (currentHead === baseCommit)
|
|
162
162
|
return true;
|
|
163
|
-
// `--yes` and `--force` both answer this prompt
|
|
163
|
+
// `--yes` and `--force` both answer this prompt. Only `--force` also
|
|
164
164
|
// waives the patch-integrity gate further down.
|
|
165
165
|
const promptAnswered = forceImport || acceptPrompts;
|
|
166
166
|
if (!stdioIsInteractive()) {
|
|
@@ -193,7 +193,7 @@ async function checkEngineDrift(engineDir, baseCommit, forceImport, acceptPrompt
|
|
|
193
193
|
* without the `.patch` suffix (matching `applyPatchesWithContinue`'s
|
|
194
194
|
* `untilFilename` resolver).
|
|
195
195
|
*
|
|
196
|
-
* Returns an empty set when no match is found
|
|
196
|
+
* Returns an empty set when no match is found. The caller treats that as
|
|
197
197
|
* "no scope filter applies" so the import behaves identically to an
|
|
198
198
|
* unrecognised `--until` target (which `applyPatchesWithContinue` will
|
|
199
199
|
* later surface as a normal error).
|
|
@@ -202,11 +202,11 @@ function buildUntilFilenameSet(patches, until) {
|
|
|
202
202
|
const set = new Set();
|
|
203
203
|
if (until === undefined)
|
|
204
204
|
return set;
|
|
205
|
-
// Resolve the identifier with the
|
|
206
|
-
// (`matchesUntilFilename` accepts filenames, extension-less names,
|
|
205
|
+
// Resolve the identifier with the same matcher the apply loop uses
|
|
206
|
+
// (`matchesUntilFilename` accepts filenames, extension-less names, and
|
|
207
207
|
// bare ordinals). A filename-only match makes `import --until 5` produce
|
|
208
|
-
// an
|
|
209
|
-
// filter every in-range issue away
|
|
208
|
+
// an empty scope set: the UI previews "0 patches", the integrity gates
|
|
209
|
+
// filter every in-range issue away, and the apply loop then applies
|
|
210
210
|
// patches 1..5 anyway.
|
|
211
211
|
const target = patches.find((p) => matchesUntilFilename(p.filename, until));
|
|
212
212
|
if (!target)
|
|
@@ -228,8 +228,8 @@ async function assertScopedManifestConsistency(patchesDir, untilFilenameSet, unt
|
|
|
228
228
|
const manifestConsistencyIssues = await validatePatchesManifestConsistency(patchesDir);
|
|
229
229
|
const scopedManifestIssues = until !== undefined
|
|
230
230
|
? manifestConsistencyIssues.filter((issue) =>
|
|
231
|
-
// Global (manifest-level) issues have no specific filename to
|
|
232
|
-
// against
|
|
231
|
+
// Global (manifest-level) issues have no specific filename to
|
|
232
|
+
// scope against: a missing or unparseable patches.json blocks any
|
|
233
233
|
// import. Per-patch issues only block when the patch is in scope.
|
|
234
234
|
issue.code === 'manifest-missing' ||
|
|
235
235
|
issue.code === 'manifest-invalid' ||
|
|
@@ -249,7 +249,7 @@ async function assertScopedManifestConsistency(patchesDir, untilFilenameSet, unt
|
|
|
249
249
|
/**
|
|
250
250
|
* Prints advisory version-compatibility warnings for every in-scope patch
|
|
251
251
|
* whose recorded source version differs meaningfully from the configured
|
|
252
|
-
* Firefox version. Advisory only
|
|
252
|
+
* Firefox version. Advisory only. Never blocks the import.
|
|
253
253
|
*/
|
|
254
254
|
async function warnVersionCompatibility(projectRoot, manifest, untilFilenameSet, until) {
|
|
255
255
|
if (!manifest)
|
|
@@ -269,7 +269,7 @@ async function warnVersionCompatibility(projectRoot, manifest, untilFilenameSet,
|
|
|
269
269
|
}
|
|
270
270
|
/**
|
|
271
271
|
* Patch-integrity gate: surfaces orphaned-modification issues scoped to
|
|
272
|
-
* the `--until` range and decides whether the import may proceed
|
|
272
|
+
* the `--until` range and decides whether the import may proceed.
|
|
273
273
|
* `--force` continues with a warning, non-TTY refuses loudly, and an
|
|
274
274
|
* interactive operator is prompted. Returns false when the import should
|
|
275
275
|
* stop (the cancel outro has been printed).
|
|
@@ -413,8 +413,8 @@ export async function importCommand(projectRoot, options = {}) {
|
|
|
413
413
|
success(` ${result.patch.filename}${suffix}`);
|
|
414
414
|
}
|
|
415
415
|
// The re-applied queue may have moved components.conf away from what
|
|
416
|
-
// the last full build compiled in
|
|
417
|
-
// next test refusal.
|
|
416
|
+
// the last full build compiled in, so surface that now instead of at
|
|
417
|
+
// the next test refusal.
|
|
418
418
|
await warnIfStaticComponentsStale(projectRoot, paths.engine);
|
|
419
419
|
outro('All patches applied successfully!');
|
|
420
420
|
}
|
|
@@ -432,10 +432,10 @@ export function registerImport(program, { getProjectRoot, withErrorHandling }) {
|
|
|
432
432
|
.description('Apply patches from the patches directory')
|
|
433
433
|
.option('--continue', 'Continue applying patches even if one fails')
|
|
434
434
|
.option('-f, --force', 'Proceed despite engine drift and overwrite unmanaged changes in patch-touched files')
|
|
435
|
-
//
|
|
436
|
-
// drift prompt
|
|
435
|
+
// Not an alias of --force. `--force` waives two orthogonal things: the
|
|
436
|
+
// drift prompt and the patch-integrity gate. `--yes` waives only the
|
|
437
437
|
// prompt, so a scripted import can run unattended while the integrity
|
|
438
|
-
// refusal stays armed
|
|
438
|
+
// refusal stays armed, which is the guard you want in CI.
|
|
439
439
|
.option('-y, --yes', 'Answer the drift prompt non-interactively. Unlike --force, this does NOT waive the patch-integrity gate.')
|
|
440
440
|
.option('--until <patch>', 'Apply patches only up to and including this patch')
|
|
441
441
|
.option('--dry-run', 'Preview which patches would be applied without modifying the engine')
|
|
@@ -28,7 +28,7 @@ function emitTierNotice(filename, files, tier) {
|
|
|
28
28
|
/**
|
|
29
29
|
* Lints one queued patch against its own isolated diff, reusing the cache entry
|
|
30
30
|
* when the cache key matches. Returns the outcome and the patch's (unprefixed)
|
|
31
|
-
* issues without touching shared state
|
|
31
|
+
* issues without touching shared state. The orchestrator applies the tier
|
|
32
32
|
* notice, issue prefixing, and cache write in patch order after the pool
|
|
33
33
|
* drains, so the bounded concurrency cannot reorder output. Returns `skipped`
|
|
34
34
|
* (no files present / empty diff), `cached`, or `linted`.
|
|
@@ -135,8 +135,8 @@ const SUPPRESSED_SIZE_CHECKS = new Set([
|
|
|
135
135
|
* Applies the per-patch results in patch order so the bounded concurrency
|
|
136
136
|
* cannot reorder output: emits each tier notice, the once-only run-level
|
|
137
137
|
* checkJs errors (before the first freshly linted patch's issues), the
|
|
138
|
-
* filename-prefixed issue rows, and the cache writes
|
|
139
|
-
* a serial run produced. Returns the run tallies.
|
|
138
|
+
* filename-prefixed issue rows, and the cache writes, all in the same
|
|
139
|
+
* sequence a serial run produced. Returns the run tallies.
|
|
140
140
|
*/
|
|
141
141
|
async function applyPerPatchResults(subset, results, issues, checkJs, cache) {
|
|
142
142
|
const totals = {
|
|
@@ -158,8 +158,8 @@ async function applyPerPatchResults(subset, results, issues, checkJs, cache) {
|
|
|
158
158
|
}
|
|
159
159
|
emitTierNotice(patch.filename, result.existingFiles, patch.tier);
|
|
160
160
|
// Run-level checkJs errors are emitted once, before the first
|
|
161
|
-
// non-skipped patch's own issues
|
|
162
|
-
//
|
|
161
|
+
// non-skipped patch's own issues, matching the serial emit point.
|
|
162
|
+
// Not gated on `result.usedCheckJs`: global findings are
|
|
163
163
|
// run-level and never cached, so gating drops them entirely on an
|
|
164
164
|
// all-cache-hit run and lets a warm run report fewer errors than a cold
|
|
165
165
|
// one. PerRunCheckJs builds its program lazily, so the cost only
|
|
@@ -183,7 +183,7 @@ async function applyPerPatchResults(subset, results, issues, checkJs, cache) {
|
|
|
183
183
|
for (const issue of result.rawIssues) {
|
|
184
184
|
issues.push({ ...issue, file: `${patch.filename} :: ${issue.file}` });
|
|
185
185
|
}
|
|
186
|
-
// A waived size finding still reports its
|
|
186
|
+
// A waived size finding still reports its measurement: the finding stays
|
|
187
187
|
// suppressed (no exit-code / --max-warnings effect) but the current count
|
|
188
188
|
// is readable from the tool that enforces it, so a waiver's cited size
|
|
189
189
|
// can be calibrated without hand-measuring.
|
|
@@ -331,7 +331,7 @@ function selectPatchSubset(manifest, requested) {
|
|
|
331
331
|
* queue-level findings are scoped to files those patches touch).
|
|
332
332
|
*/
|
|
333
333
|
export async function lintPerPatch(projectRoot, paths, options = {}) {
|
|
334
|
-
// Read-only to the operator, an index
|
|
334
|
+
// Read-only to the operator, but an index writer to git: the per-patch diffs
|
|
335
335
|
// run `git diff HEAD` (and, for untracked binaries, a real stage/unstage
|
|
336
336
|
// pair) against the primary checkout. A private index absorbs all of it
|
|
337
337
|
// so a concurrent `fireforge test` still gets an evidential verdict.
|
|
@@ -379,7 +379,7 @@ async function lintPerPatchInner(projectRoot, paths, options = {}) {
|
|
|
379
379
|
});
|
|
380
380
|
}
|
|
381
381
|
// With `--patches`, the checkJs program roots at only the subset's owned
|
|
382
|
-
// files
|
|
382
|
+
// files. The full queue stays resolvable, so a cold subset run costs the
|
|
383
383
|
// subset's import closure instead of the whole queue.
|
|
384
384
|
const checkJs = buildPerRunCheckJs(projectRoot, paths, config, ctx, isSubset ? subsetNames : undefined);
|
|
385
385
|
// Lint patches concurrently, then apply every side effect in patch order so
|
|
@@ -3,22 +3,21 @@
|
|
|
3
3
|
* `re-export`.
|
|
4
4
|
*
|
|
5
5
|
* The dominant fixed cost of patch lint is one `ts.createProgram` over the
|
|
6
|
-
* queue's patch-owned `.sys.mjs` files
|
|
7
|
-
* This controller builds that program at most
|
|
6
|
+
* queue's patch-owned `.sys.mjs` files, tens of seconds on a large queue.
|
|
7
|
+
* This controller builds that program at most once per command invocation
|
|
8
8
|
* (lazily, promise-memoised) and lets callers slice per-patch findings out of
|
|
9
9
|
* the grouped result. Three levers keep the cost paid only when it buys
|
|
10
10
|
* something:
|
|
11
11
|
*
|
|
12
|
-
* -
|
|
13
|
-
* -
|
|
14
|
-
* program's roots are only the subset's owned files
|
|
12
|
+
* - Lazy build: nothing is built until the first cache miss asks.
|
|
13
|
+
* - Root scoping (`rootScopePatches`): with `--patches <subset>` the
|
|
14
|
+
* program's roots are only the subset's owned files. The full queue stays
|
|
15
15
|
* resolvable, so cross-patch imports type-check identically while
|
|
16
16
|
* unrelated files are never parsed.
|
|
17
|
-
* -
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* anything.
|
|
17
|
+
* - Warm-run probe: run-level ("global") checkJs findings come only from a
|
|
18
|
+
* missing `typescript` package or an unreadable shim, never from the built
|
|
19
|
+
* program, so an all-cache-hit run satisfies "warm never reports less than
|
|
20
|
+
* cold" via `probeCheckJsGlobalIssues` instead of building anything.
|
|
22
21
|
*/
|
|
23
22
|
import { type GroupedCheckJsResult } from '../core/patch-lint-checkjs.js';
|
|
24
23
|
import type { PatchQueueContext } from '../core/patch-lint-cross.js';
|
|
@@ -32,7 +31,7 @@ import type { FireForgeConfig, ProjectPaths } from '../types/config.js';
|
|
|
32
31
|
export interface PerRunCheckJs {
|
|
33
32
|
/** Patch filename → the checkJs-relevant files that patch creates. */
|
|
34
33
|
ownedByPatch: Map<string, Set<string>>;
|
|
35
|
-
/** Every checkJs-relevant file in the queue (sys + test scripts)
|
|
34
|
+
/** Every checkJs-relevant file in the queue (sys + test scripts), the
|
|
36
35
|
* resolution universe the program can see. Callers use it to detect
|
|
37
36
|
* files the hoisted program has never heard of (fresh `--scan`
|
|
38
37
|
* adoptions) and fall back to a per-patch build. */
|
|
@@ -43,10 +42,10 @@ export interface PerRunCheckJs {
|
|
|
43
42
|
getGrouped: () => Promise<GroupedCheckJsResult>;
|
|
44
43
|
/** Run-level checkJs errors (e.g. TypeScript missing). When the program
|
|
45
44
|
* was never built (all-warm run) this probes the two global failure
|
|
46
|
-
*
|
|
45
|
+
* sources directly instead of building it, which is safe because the
|
|
47
46
|
* built program never contributes globals of its own. */
|
|
48
47
|
getGlobal: () => Promise<PatchLintIssue[]>;
|
|
49
|
-
/** The byFile slices for `files` (globals
|
|
48
|
+
/** The byFile slices for `files` (globals are excluded because they
|
|
50
49
|
* are run-level, never cached, and emitted once per invocation via
|
|
51
50
|
* `getGlobal`). Feed to `LintExportedPatchOptions.precomputedCheckJs`. */
|
|
52
51
|
sliceFor: (files: ReadonlySet<string>) => Promise<PatchLintIssue[]>;
|
|
@@ -4,22 +4,21 @@
|
|
|
4
4
|
* `re-export`.
|
|
5
5
|
*
|
|
6
6
|
* The dominant fixed cost of patch lint is one `ts.createProgram` over the
|
|
7
|
-
* queue's patch-owned `.sys.mjs` files
|
|
8
|
-
* This controller builds that program at most
|
|
7
|
+
* queue's patch-owned `.sys.mjs` files, tens of seconds on a large queue.
|
|
8
|
+
* This controller builds that program at most once per command invocation
|
|
9
9
|
* (lazily, promise-memoised) and lets callers slice per-patch findings out of
|
|
10
10
|
* the grouped result. Three levers keep the cost paid only when it buys
|
|
11
11
|
* something:
|
|
12
12
|
*
|
|
13
|
-
* -
|
|
14
|
-
* -
|
|
15
|
-
* program's roots are only the subset's owned files
|
|
13
|
+
* - Lazy build: nothing is built until the first cache miss asks.
|
|
14
|
+
* - Root scoping (`rootScopePatches`): with `--patches <subset>` the
|
|
15
|
+
* program's roots are only the subset's owned files. The full queue stays
|
|
16
16
|
* resolvable, so cross-patch imports type-check identically while
|
|
17
17
|
* unrelated files are never parsed.
|
|
18
|
-
* -
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* anything.
|
|
18
|
+
* - Warm-run probe: run-level ("global") checkJs findings come only from a
|
|
19
|
+
* missing `typescript` package or an unreadable shim, never from the built
|
|
20
|
+
* program, so an all-cache-hit run satisfies "warm never reports less than
|
|
21
|
+
* cold" via `probeCheckJsGlobalIssues` instead of building anything.
|
|
23
22
|
*/
|
|
24
23
|
import { invokePatchLintCheckJsGrouped, probeCheckJsGlobalIssues, runCheckJsTestFilesGrouped, } from '../core/patch-lint-checkjs.js';
|
|
25
24
|
import { isTestScriptFile, resolvePatchOwnedSysMjs, resolvePatchOwnedTestScripts, } from '../core/patch-lint-ownership.js';
|
|
@@ -52,7 +51,7 @@ export function buildPerRunCheckJs(projectRoot, paths, config, ctx, rootScopePat
|
|
|
52
51
|
for (const f of files)
|
|
53
52
|
resolutionSet.add(f);
|
|
54
53
|
}
|
|
55
|
-
// The subset's owned files, split by program kind
|
|
54
|
+
// The subset's owned files, split by program kind. Undefined = full queue.
|
|
56
55
|
let scopedRoots;
|
|
57
56
|
if (rootScopePatches !== undefined) {
|
|
58
57
|
scopedRoots = new Set();
|
|
@@ -63,9 +62,9 @@ export function buildPerRunCheckJs(projectRoot, paths, config, ctx, rootScopePat
|
|
|
63
62
|
scopedRoots.add(f);
|
|
64
63
|
}
|
|
65
64
|
}
|
|
66
|
-
// One build for the whole run: the queue-wide `.sys.mjs` program plus
|
|
67
|
-
// when `patchLint.checkJsTestFiles` is on
|
|
68
|
-
//
|
|
65
|
+
// One build for the whole run: the queue-wide `.sys.mjs` program, plus
|
|
66
|
+
// (when `patchLint.checkJsTestFiles` is on) one small script-scope
|
|
67
|
+
// program per patch-owned test file, merged by file.
|
|
69
68
|
const buildAll = async () => {
|
|
70
69
|
const sys = await invokePatchLintCheckJsGrouped(paths.engine, resolvePatchOwnedSysMjs(new Set(), ctx), patchLint, projectRoot, scopedRoots);
|
|
71
70
|
if (!testFilesEnabled)
|
|
@@ -77,7 +76,7 @@ export function buildPerRunCheckJs(projectRoot, paths, config, ctx, rootScopePat
|
|
|
77
76
|
}
|
|
78
77
|
return { byFile, global: [...sys.global, ...tests.global] };
|
|
79
78
|
};
|
|
80
|
-
// Memoise the
|
|
79
|
+
// Memoise the promise rather than the resolved value: under the bounded pool
|
|
81
80
|
// several patches can reach `getGrouped` before the first build resolves, and
|
|
82
81
|
// `??=` on the promise (a synchronous expression) guarantees a single build.
|
|
83
82
|
let groupedPromise;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { PatchLintIssue, PatchMetadata } from '../types/commands/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Structural view of one per-patch lint outcome. Mirrors the relevant
|
|
4
|
-
* fields of lint-per-patch's QueuedPatchResult without importing it
|
|
4
|
+
* fields of lint-per-patch's QueuedPatchResult without importing it:
|
|
5
5
|
* that module imports this one, and a type back-edge would trip the
|
|
6
6
|
* dpdm cycle gate.
|
|
7
7
|
*/
|
|
@@ -14,8 +14,8 @@ export interface PerPatchReportResult {
|
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Writes the per-patch lint report JSON. Called after the per-patch
|
|
17
|
-
* results are assembled in patch order
|
|
17
|
+
* results are assembled in patch order. Queue-level and policy findings
|
|
18
18
|
* are patch-attributed by their `file`/`filename` fields upstream and
|
|
19
|
-
* are
|
|
19
|
+
* are not duplicated here. The report is the per-patch view.
|
|
20
20
|
*/
|
|
21
21
|
export declare function writePerPatchLintReport(reportPath: string, subset: readonly PatchMetadata[], results: readonly PerPatchReportResult[]): Promise<void>;
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Machine-readable per-patch lint report (`lint --per-patch --report
|
|
4
4
|
* <path>`). One mechanism serves two observability gaps: consumers get each
|
|
5
|
-
* patch's size metrics against the
|
|
5
|
+
* patch's size metrics against the same thresholds the size rules fire on,
|
|
6
6
|
* instead of mirroring `countNonBinaryDiffLines`, and lintIgnore-suppressed
|
|
7
7
|
* issues stay visible with their measurements rather than vanishing.
|
|
8
8
|
*
|
|
9
|
-
* Helper module consumed by lint-per-patch.ts
|
|
9
|
+
* Helper module consumed by lint-per-patch.ts. No registrar is exported and
|
|
10
10
|
* none is wanted.
|
|
11
11
|
*/
|
|
12
12
|
import { getPatchSizeThresholds, resolvePatchSizeTier, } from '../core/patch-lint.js';
|
|
@@ -15,9 +15,9 @@ import { info } from '../utils/logger.js';
|
|
|
15
15
|
const LINT_REPORT_SCHEMA_VERSION = 1;
|
|
16
16
|
/**
|
|
17
17
|
* Writes the per-patch lint report JSON. Called after the per-patch
|
|
18
|
-
* results are assembled in patch order
|
|
18
|
+
* results are assembled in patch order. Queue-level and policy findings
|
|
19
19
|
* are patch-attributed by their `file`/`filename` fields upstream and
|
|
20
|
-
* are
|
|
20
|
+
* are not duplicated here. The report is the per-patch view.
|
|
21
21
|
*/
|
|
22
22
|
export async function writePerPatchLintReport(reportPath, subset, results) {
|
|
23
23
|
const patches = [];
|
|
@@ -27,9 +27,9 @@ export interface AggregateLintIgnoreResult {
|
|
|
27
27
|
* attribute via `issue.file`, which is the offending site and is owned by
|
|
28
28
|
* some patch.
|
|
29
29
|
*
|
|
30
|
-
* Multiple owners: an issue is dropped if
|
|
31
|
-
* rule.
|
|
32
|
-
* ones.
|
|
30
|
+
* Multiple owners: an issue is dropped if any owning patch waived the
|
|
31
|
+
* rule. This is conservative: it never adds new findings, only drops
|
|
32
|
+
* already-waived ones.
|
|
33
33
|
*
|
|
34
34
|
* @param issues - Issues collected from the aggregate lint run.
|
|
35
35
|
* @param ctx - Patch queue context used to attribute file → patch.
|