@hominis/fireforge 0.43.0 → 0.44.0
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 +127 -0
- package/README.md +10 -1
- package/dist/bin/fireforge.d.ts +4 -9
- package/dist/bin/fireforge.js +42 -40
- package/dist/build-info.json +4 -4
- package/dist/src/cli.js +74 -8
- package/dist/src/commands/bootstrap.js +17 -20
- package/dist/src/commands/build.js +25 -32
- package/dist/src/commands/config.js +34 -41
- package/dist/src/commands/discard.js +8 -9
- package/dist/src/commands/doctor-check-core.d.ts +4 -18
- package/dist/src/commands/doctor-check-core.js +8 -35
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
- package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
- package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
- package/dist/src/commands/doctor-furnace-jar.js +7 -9
- package/dist/src/commands/doctor-furnace.js +21 -24
- package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
- package/dist/src/commands/doctor-orphaned-harness.js +18 -44
- package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
- package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
- package/dist/src/commands/doctor-working-tree.d.ts +10 -12
- package/dist/src/commands/doctor-working-tree.js +11 -18
- package/dist/src/commands/doctor.js +35 -53
- package/dist/src/commands/download.js +32 -48
- package/dist/src/commands/export-all.js +29 -33
- package/dist/src/commands/export-flow.js +6 -6
- package/dist/src/commands/export-placement-conflicts.js +10 -9
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-shared.d.ts +30 -33
- package/dist/src/commands/export-shared.js +45 -43
- package/dist/src/commands/export.js +21 -27
- package/dist/src/commands/furnace/apply.js +14 -23
- package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
- package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
- package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
- package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
- package/dist/src/commands/furnace/chrome-doc.js +31 -41
- package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
- package/dist/src/commands/furnace/create-browser-test.js +8 -8
- package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
- package/dist/src/commands/furnace/create-mochikit.js +8 -9
- package/dist/src/commands/furnace/create-readback.d.ts +12 -13
- package/dist/src/commands/furnace/create-readback.js +12 -13
- package/dist/src/commands/furnace/create-templates.d.ts +22 -28
- package/dist/src/commands/furnace/create-templates.js +35 -30
- package/dist/src/commands/furnace/create-xpcshell.js +2 -2
- package/dist/src/commands/furnace/create.js +33 -23
- package/dist/src/commands/furnace/deploy.js +16 -24
- package/dist/src/commands/furnace/diff.js +9 -9
- package/dist/src/commands/furnace/init.js +33 -36
- package/dist/src/commands/furnace/override.js +23 -25
- package/dist/src/commands/furnace/preview.js +47 -67
- package/dist/src/commands/furnace/refresh.js +12 -16
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
- package/dist/src/commands/furnace/remove-mutations.js +9 -16
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +33 -38
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
- package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
- package/dist/src/commands/furnace/rename.js +59 -69
- package/dist/src/commands/furnace/scan.js +19 -33
- package/dist/src/commands/furnace/status.js +12 -9
- package/dist/src/commands/furnace/sync.js +9 -16
- package/dist/src/commands/furnace/validate.js +20 -20
- package/dist/src/commands/import.js +42 -35
- package/dist/src/commands/lint-per-patch.js +15 -10
- package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
- package/dist/src/commands/lint-per-run-checkjs.js +13 -13
- package/dist/src/commands/lint-report.js +6 -7
- package/dist/src/commands/lint.d.ts +15 -16
- package/dist/src/commands/lint.js +86 -102
- package/dist/src/commands/package.js +6 -11
- package/dist/src/commands/patch/compact.js +1 -1
- package/dist/src/commands/patch/delete.js +24 -33
- package/dist/src/commands/patch/index.d.ts +5 -6
- package/dist/src/commands/patch/index.js +10 -12
- package/dist/src/commands/patch/lint-ignore.js +14 -13
- package/dist/src/commands/patch/move-files-create.d.ts +6 -6
- package/dist/src/commands/patch/move-files-create.js +8 -8
- package/dist/src/commands/patch/move-files-into.d.ts +6 -6
- package/dist/src/commands/patch/move-files-into.js +8 -8
- package/dist/src/commands/patch/patch-context.d.ts +2 -3
- package/dist/src/commands/patch/patch-context.js +2 -3
- package/dist/src/commands/patch/rename.d.ts +10 -11
- package/dist/src/commands/patch/rename.js +11 -12
- package/dist/src/commands/patch/reorder.js +8 -9
- package/dist/src/commands/patch/split-plan.js +1 -1
- package/dist/src/commands/patch/split.d.ts +8 -10
- package/dist/src/commands/patch/split.js +9 -11
- package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
- package/dist/src/commands/patch/staged-dependency.js +7 -3
- package/dist/src/commands/patch/tier.d.ts +9 -9
- package/dist/src/commands/patch/tier.js +18 -15
- package/dist/src/commands/re-export-adjacent.js +9 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
- package/dist/src/commands/re-export-bulk-scan.js +22 -21
- package/dist/src/commands/re-export-drift.js +10 -10
- package/dist/src/commands/re-export-files.d.ts +6 -7
- package/dist/src/commands/re-export-files.js +34 -44
- package/dist/src/commands/re-export-lint.d.ts +10 -13
- package/dist/src/commands/re-export-lint.js +16 -14
- package/dist/src/commands/re-export-options.d.ts +6 -6
- package/dist/src/commands/re-export-options.js +6 -6
- package/dist/src/commands/re-export-register.d.ts +4 -10
- package/dist/src/commands/re-export-register.js +5 -11
- package/dist/src/commands/re-export-scan.js +1 -1
- package/dist/src/commands/re-export-single.d.ts +3 -3
- package/dist/src/commands/re-export-single.js +33 -25
- package/dist/src/commands/re-export.js +13 -21
- package/dist/src/commands/rebase/abort.js +3 -3
- package/dist/src/commands/rebase/confirm.js +2 -1
- package/dist/src/commands/rebase/continue.d.ts +1 -1
- package/dist/src/commands/rebase/continue.js +14 -9
- package/dist/src/commands/rebase/index.js +11 -11
- package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
- package/dist/src/commands/rebase/patch-loop.js +60 -39
- package/dist/src/commands/rebase/summary.js +1 -1
- package/dist/src/commands/register.js +5 -7
- package/dist/src/commands/reset.js +2 -1
- package/dist/src/commands/resolve.d.ts +16 -13
- package/dist/src/commands/resolve.js +30 -33
- package/dist/src/commands/run.js +33 -35
- package/dist/src/commands/setup-support.js +15 -19
- package/dist/src/commands/setup.js +13 -9
- package/dist/src/commands/status-check.d.ts +6 -6
- package/dist/src/commands/status-json.d.ts +6 -6
- package/dist/src/commands/status-json.js +5 -0
- package/dist/src/commands/status-output.d.ts +5 -5
- package/dist/src/commands/status-output.js +6 -6
- package/dist/src/commands/status-ownership.d.ts +16 -14
- package/dist/src/commands/status-ownership.js +16 -14
- package/dist/src/commands/status.js +42 -34
- package/dist/src/commands/test-build-phase.js +26 -13
- package/dist/src/commands/test-diagnose.js +44 -44
- package/dist/src/commands/test-register.js +1 -0
- package/dist/src/commands/test-run.d.ts +14 -16
- package/dist/src/commands/test-run.js +21 -13
- package/dist/src/commands/test-stale-gate.d.ts +15 -16
- package/dist/src/commands/test-stale-gate.js +15 -16
- package/dist/src/commands/test-verdict.d.ts +20 -3
- package/dist/src/commands/test-verdict.js +30 -0
- package/dist/src/commands/test.js +83 -76
- package/dist/src/commands/token-coverage.js +3 -4
- package/dist/src/commands/token.js +16 -18
- package/dist/src/commands/tree.js +47 -31
- package/dist/src/commands/typecheck.d.ts +10 -12
- package/dist/src/commands/typecheck.js +24 -27
- package/dist/src/commands/verify.js +13 -15
- package/dist/src/commands/watch.js +21 -23
- package/dist/src/commands/wire.js +52 -62
- package/dist/src/core/ast-utils.d.ts +8 -7
- package/dist/src/core/ast-utils.js +8 -7
- package/dist/src/core/branding.d.ts +9 -14
- package/dist/src/core/branding.js +7 -11
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +14 -19
- package/dist/src/core/build-audit-platform.js +25 -33
- package/dist/src/core/build-audit-registration.js +17 -25
- package/dist/src/core/build-audit-resolve.d.ts +15 -17
- package/dist/src/core/build-audit-resolve.js +27 -33
- package/dist/src/core/build-audit-transforms.js +18 -19
- package/dist/src/core/build-audit.js +28 -42
- package/dist/src/core/build-baseline-types.d.ts +29 -35
- package/dist/src/core/build-baseline.d.ts +5 -4
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-overwrite-guard.d.ts +7 -14
- package/dist/src/core/build-overwrite-guard.js +62 -19
- package/dist/src/core/build-prepare.d.ts +2 -2
- package/dist/src/core/build-prepare.js +8 -9
- package/dist/src/core/config-state.js +12 -4
- package/dist/src/core/config-validate.js +8 -5
- package/dist/src/core/config.d.ts +5 -8
- package/dist/src/core/config.js +7 -16
- package/dist/src/core/coverage-extend.d.ts +15 -13
- package/dist/src/core/coverage-extend.js +15 -13
- package/dist/src/core/destructive.d.ts +31 -9
- package/dist/src/core/destructive.js +29 -26
- package/dist/src/core/diff-hunks.js +10 -12
- package/dist/src/core/discard-baseline.d.ts +8 -8
- package/dist/src/core/discard-baseline.js +16 -15
- package/dist/src/core/display-state.d.ts +12 -14
- package/dist/src/core/display-state.js +12 -14
- package/dist/src/core/engine-changes.d.ts +2 -4
- package/dist/src/core/engine-changes.js +2 -4
- package/dist/src/core/engine-precondition.d.ts +28 -13
- package/dist/src/core/engine-precondition.js +25 -10
- package/dist/src/core/engine-session-lock.d.ts +47 -21
- package/dist/src/core/engine-session-lock.js +168 -33
- package/dist/src/core/export-moved-code-shape.d.ts +10 -10
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock.d.ts +62 -5
- package/dist/src/core/file-lock.js +196 -59
- package/dist/src/core/firefox-cache.js +1 -3
- package/dist/src/core/firefox-extract.js +10 -14
- package/dist/src/core/firefox.d.ts +7 -5
- package/dist/src/core/firefox.js +4 -5
- package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
- package/dist/src/core/furnace-apply-dry-run.js +3 -2
- package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
- package/dist/src/core/furnace-apply-ftl.js +12 -12
- package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
- package/dist/src/core/furnace-apply-helpers.js +19 -16
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
- package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
- package/dist/src/core/furnace-apply.d.ts +5 -8
- package/dist/src/core/furnace-apply.js +19 -24
- package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
- package/dist/src/core/furnace-checksum-utils.js +16 -0
- package/dist/src/core/furnace-config.d.ts +21 -30
- package/dist/src/core/furnace-config.js +32 -54
- package/dist/src/core/furnace-constants.d.ts +8 -0
- package/dist/src/core/furnace-constants.js +10 -2
- package/dist/src/core/furnace-css-fragments.d.ts +5 -5
- package/dist/src/core/furnace-css-fragments.js +5 -5
- package/dist/src/core/furnace-jsconfig.d.ts +11 -12
- package/dist/src/core/furnace-jsconfig.js +11 -12
- package/dist/src/core/furnace-marker.d.ts +7 -8
- package/dist/src/core/furnace-marker.js +7 -8
- package/dist/src/core/furnace-operation.d.ts +31 -0
- package/dist/src/core/furnace-operation.js +54 -17
- package/dist/src/core/furnace-precondition.d.ts +61 -0
- package/dist/src/core/furnace-precondition.js +67 -0
- package/dist/src/core/furnace-registration-remove.d.ts +5 -6
- package/dist/src/core/furnace-registration-remove.js +6 -7
- package/dist/src/core/furnace-registration-validate.d.ts +13 -0
- package/dist/src/core/furnace-registration-validate.js +20 -1
- package/dist/src/core/furnace-registration.d.ts +5 -6
- package/dist/src/core/furnace-registration.js +10 -12
- package/dist/src/core/furnace-rollback.js +7 -7
- package/dist/src/core/furnace-scanner.d.ts +1 -0
- package/dist/src/core/furnace-scanner.js +1 -2
- package/dist/src/core/furnace-stale-export.d.ts +10 -10
- package/dist/src/core/furnace-stale-export.js +10 -10
- package/dist/src/core/furnace-state-persist.d.ts +6 -8
- package/dist/src/core/furnace-state-persist.js +6 -8
- package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
- package/dist/src/core/furnace-validate-accessibility.js +310 -1
- package/dist/src/core/furnace-validate-compatibility.js +141 -1
- package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
- package/dist/src/core/furnace-validate-helpers.js +0 -491
- package/dist/src/core/furnace-validate-registration.d.ts +7 -0
- package/dist/src/core/furnace-validate-registration.js +115 -41
- package/dist/src/core/furnace-validate.d.ts +16 -0
- package/dist/src/core/furnace-validate.js +188 -145
- package/dist/src/core/furnace-version-drift.d.ts +10 -11
- package/dist/src/core/furnace-version-drift.js +10 -11
- package/dist/src/core/git-base.d.ts +7 -9
- package/dist/src/core/git-base.js +7 -9
- package/dist/src/core/git-diff.d.ts +20 -9
- package/dist/src/core/git-diff.js +148 -63
- package/dist/src/core/git-file-ops.d.ts +19 -19
- package/dist/src/core/git-file-ops.js +19 -19
- package/dist/src/core/git-readonly-index.d.ts +53 -19
- package/dist/src/core/git-readonly-index.js +75 -31
- package/dist/src/core/git-status.d.ts +5 -6
- package/dist/src/core/git-status.js +5 -6
- package/dist/src/core/git.d.ts +9 -10
- package/dist/src/core/git.js +54 -70
- package/dist/src/core/license-headers.d.ts +17 -23
- package/dist/src/core/license-headers.js +17 -23
- package/dist/src/core/mach-build-artifacts.d.ts +9 -9
- package/dist/src/core/mach-build-artifacts.js +57 -19
- package/dist/src/core/mach-error-hints.js +42 -29
- package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
- package/dist/src/core/mach-known-noise-filter.js +18 -20
- package/dist/src/core/mach-mozconfig.d.ts +14 -0
- package/dist/src/core/mach-mozconfig.js +30 -0
- package/dist/src/core/mach-resource-shim.d.ts +43 -58
- package/dist/src/core/mach-resource-shim.js +50 -67
- package/dist/src/core/mach.d.ts +37 -41
- package/dist/src/core/mach.js +50 -51
- package/dist/src/core/marionette-port.d.ts +36 -1
- package/dist/src/core/marionette-port.js +96 -31
- package/dist/src/core/marionette-preflight.d.ts +8 -12
- package/dist/src/core/marionette-preflight.js +86 -52
- package/dist/src/core/mochitest-server-port.d.ts +42 -0
- package/dist/src/core/mochitest-server-port.js +119 -0
- package/dist/src/core/module-resolution-preflight.d.ts +9 -11
- package/dist/src/core/module-resolution-preflight.js +9 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
- package/dist/src/core/moz-manifest-helpers.js +163 -0
- package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
- package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
- package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
- package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
- package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
- package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
- package/dist/src/core/ownership-table.d.ts +14 -16
- package/dist/src/core/ownership-table.js +14 -16
- package/dist/src/core/parser-fallback.d.ts +15 -1
- package/dist/src/core/parser-fallback.js +22 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
- package/dist/src/core/patch-apply-fuzz.js +15 -18
- package/dist/src/core/patch-apply.d.ts +13 -34
- package/dist/src/core/patch-apply.js +16 -76
- package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
- package/dist/src/core/patch-artifact-normalize.js +13 -15
- package/dist/src/core/patch-export-metadata.d.ts +12 -2
- package/dist/src/core/patch-export-metadata.js +13 -4
- package/dist/src/core/patch-export-update.d.ts +13 -1
- package/dist/src/core/patch-export-update.js +25 -8
- package/dist/src/core/patch-export.d.ts +15 -8
- package/dist/src/core/patch-export.js +10 -11
- package/dist/src/core/patch-files.d.ts +5 -6
- package/dist/src/core/patch-files.js +5 -6
- package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
- package/dist/src/core/patch-identifier-suggest.js +14 -19
- package/dist/src/core/patch-lint-binary.d.ts +51 -0
- package/dist/src/core/patch-lint-binary.js +39 -0
- package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
- package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
- package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
- package/dist/src/core/patch-lint-checkjs.js +16 -16
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
- package/dist/src/core/patch-lint-creators.d.ts +8 -8
- package/dist/src/core/patch-lint-creators.js +8 -8
- package/dist/src/core/patch-lint-cross.d.ts +17 -20
- package/dist/src/core/patch-lint-cross.js +16 -16
- package/dist/src/core/patch-lint-css.d.ts +3 -5
- package/dist/src/core/patch-lint-css.js +17 -22
- package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
- package/dist/src/core/patch-lint-diff-tag.js +14 -16
- package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
- package/dist/src/core/patch-lint-jsdoc.js +26 -19
- package/dist/src/core/patch-lint-mozbuild.js +20 -20
- package/dist/src/core/patch-lint-observer.d.ts +7 -7
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint.d.ts +38 -29
- package/dist/src/core/patch-lint.js +89 -121
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +45 -9
- package/dist/src/core/patch-manifest-consistency.d.ts +2 -1
- package/dist/src/core/patch-manifest-consistency.js +25 -27
- package/dist/src/core/patch-manifest-io.js +14 -18
- package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
- package/dist/src/core/patch-manifest-resolve.js +9 -12
- package/dist/src/core/patch-manifest-validate.d.ts +6 -1
- package/dist/src/core/patch-manifest-validate.js +25 -13
- package/dist/src/core/patch-parse.d.ts +24 -13
- package/dist/src/core/patch-parse.js +19 -14
- package/dist/src/core/patch-policy.d.ts +2 -2
- package/dist/src/core/patch-policy.js +2 -2
- package/dist/src/core/patch-registration-refs.d.ts +7 -8
- package/dist/src/core/patch-registration-refs.js +9 -9
- package/dist/src/core/process-cpu-time.d.ts +12 -0
- package/dist/src/core/process-cpu-time.js +52 -0
- package/dist/src/core/rebase-session.d.ts +38 -26
- package/dist/src/core/rebase-session.js +55 -28
- package/dist/src/core/register-browser-content.js +9 -74
- package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
- package/dist/src/core/register-module.js +10 -43
- package/dist/src/core/register-scaffold.d.ts +8 -8
- package/dist/src/core/register-scaffold.js +10 -10
- package/dist/src/core/register-shared-css.d.ts +9 -12
- package/dist/src/core/register-shared-css.js +17 -87
- package/dist/src/core/register-xpcshell-test.d.ts +6 -7
- package/dist/src/core/register-xpcshell-test.js +7 -8
- package/dist/src/core/shared-ftl.js +12 -4
- package/dist/src/core/state-file.d.ts +45 -0
- package/dist/src/core/state-file.js +34 -0
- package/dist/src/core/status-binary.d.ts +18 -11
- package/dist/src/core/status-binary.js +19 -12
- package/dist/src/core/status-classify.d.ts +30 -36
- package/dist/src/core/status-classify.js +21 -26
- package/dist/src/core/test-changed-prefs.d.ts +30 -0
- package/dist/src/core/test-changed-prefs.js +78 -0
- package/dist/src/core/test-harness-crash.d.ts +25 -63
- package/dist/src/core/test-harness-crash.js +121 -142
- package/dist/src/core/test-harness-signature.d.ts +18 -0
- package/dist/src/core/test-harness-signature.js +13 -0
- package/dist/src/core/test-path-scope.d.ts +12 -15
- package/dist/src/core/test-path-scope.js +15 -18
- package/dist/src/core/test-stale-check.d.ts +17 -17
- package/dist/src/core/test-stale-check.js +50 -43
- package/dist/src/core/test-stall-triage.d.ts +51 -0
- package/dist/src/core/test-stall-triage.js +126 -0
- package/dist/src/core/token-category.js +5 -7
- package/dist/src/core/token-coverage.js +9 -9
- package/dist/src/core/token-dark-mode.d.ts +9 -11
- package/dist/src/core/token-dark-mode.js +9 -11
- package/dist/src/core/token-docs.d.ts +2 -0
- package/dist/src/core/token-docs.js +2 -0
- package/dist/src/core/token-manager.d.ts +10 -2
- package/dist/src/core/token-manager.js +17 -8
- package/dist/src/core/token-scaffold.d.ts +7 -7
- package/dist/src/core/token-scaffold.js +7 -7
- package/dist/src/core/token-variant.d.ts +4 -4
- package/dist/src/core/token-variant.js +4 -4
- package/dist/src/core/toolchain-preflight.d.ts +20 -21
- package/dist/src/core/toolchain-preflight.js +28 -31
- package/dist/src/core/tree-guard.js +12 -2
- package/dist/src/core/tree-store.d.ts +41 -27
- package/dist/src/core/tree-store.js +63 -42
- package/dist/src/core/typecheck-shim.d.ts +23 -24
- package/dist/src/core/typecheck-shim.js +23 -24
- package/dist/src/core/typecheck.js +8 -8
- package/dist/src/core/wire-destroy.d.ts +3 -3
- package/dist/src/core/wire-destroy.js +7 -15
- package/dist/src/core/wire-dom-fragment.d.ts +9 -17
- package/dist/src/core/wire-dom-fragment.js +11 -44
- package/dist/src/core/wire-init.d.ts +2 -3
- package/dist/src/core/wire-init.js +8 -19
- package/dist/src/core/wire-subscript.d.ts +2 -3
- package/dist/src/core/wire-subscript.js +4 -13
- package/dist/src/core/wire-utils.d.ts +7 -8
- package/dist/src/core/wire-utils.js +7 -8
- package/dist/src/core/xpcshell-appdir.d.ts +38 -45
- package/dist/src/core/xpcshell-appdir.js +38 -45
- package/dist/src/errors/base.d.ts +37 -16
- package/dist/src/errors/base.js +37 -16
- package/dist/src/errors/build.d.ts +13 -1
- package/dist/src/errors/build.js +14 -2
- package/dist/src/errors/codes.d.ts +16 -0
- package/dist/src/errors/codes.js +16 -0
- package/dist/src/errors/furnace.d.ts +4 -4
- package/dist/src/errors/git.d.ts +6 -10
- package/dist/src/errors/git.js +6 -10
- package/dist/src/errors/patch.d.ts +7 -7
- package/dist/src/errors/patch.js +7 -7
- package/dist/src/errors/rebase.d.ts +4 -4
- package/dist/src/errors/rebase.js +4 -4
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.js +5 -0
- package/dist/src/types/commands/index.d.ts +2 -2
- package/dist/src/types/commands/options.d.ts +88 -70
- package/dist/src/types/commands/patches.d.ts +24 -34
- package/dist/src/types/commands/project.d.ts +5 -34
- package/dist/src/types/config.d.ts +25 -23
- package/dist/src/types/config.js +6 -1
- package/dist/src/types/furnace.d.ts +37 -13
- package/dist/src/types/furnace.js +19 -1
- package/dist/src/types/index.d.ts +3 -3
- package/dist/src/utils/build-info.d.ts +7 -8
- package/dist/src/utils/build-info.js +12 -11
- package/dist/src/utils/errors.d.ts +6 -8
- package/dist/src/utils/errors.js +6 -8
- package/dist/src/utils/logger.d.ts +27 -10
- package/dist/src/utils/logger.js +28 -16
- package/dist/src/utils/machine-output.d.ts +12 -0
- package/dist/src/utils/machine-output.js +33 -0
- package/dist/src/utils/options.d.ts +31 -14
- package/dist/src/utils/options.js +86 -30
- package/dist/src/utils/paths.d.ts +10 -8
- package/dist/src/utils/paths.js +10 -8
- package/dist/src/utils/platform.d.ts +0 -25
- package/dist/src/utils/platform.js +1 -42
- package/dist/src/utils/process-group.d.ts +9 -4
- package/dist/src/utils/process-group.js +19 -5
- package/dist/src/utils/process.d.ts +42 -7
- package/dist/src/utils/process.js +44 -17
- package/dist/src/utils/ps-duration.d.ts +31 -0
- package/dist/src/utils/ps-duration.js +70 -0
- package/dist/src/utils/regex.d.ts +9 -10
- package/dist/src/utils/regex.js +9 -10
- package/dist/src/utils/validation.d.ts +58 -28
- package/dist/src/utils/validation.js +60 -33
- package/package.json +2 -2
- package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
- package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
- package/dist/src/core/manifest-helpers.d.ts +0 -38
- package/dist/src/core/manifest-helpers.js +0 -120
- /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
- /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
- /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import { readdir } from 'node:fs/promises';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { getProjectPaths } from '../../core/config.js';
|
|
5
|
-
import {
|
|
5
|
+
import { getFurnacePaths, loadFurnaceConfig } from '../../core/furnace-config.js';
|
|
6
|
+
import { assertFurnaceReady } from '../../core/furnace-precondition.js';
|
|
6
7
|
import { addCustomElementRegistration, addJarMnEntries, pruneStaleJarMnEntries, } from '../../core/furnace-registration.js';
|
|
7
8
|
import { validateAllComponents, validateComponent } from '../../core/furnace-validate.js';
|
|
8
9
|
import { FurnaceError } from '../../errors/furnace.js';
|
|
@@ -43,9 +44,9 @@ async function autoFixIssues(projectRoot, issues) {
|
|
|
43
44
|
jarMnFixesByComponent.set(issue.component, existing);
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
|
-
// Prune stale jar.mn registrations (lines pointing at removed
|
|
47
|
-
// component files
|
|
48
|
-
//
|
|
47
|
+
// Prune stale jar.mn registrations (lines pointing at removed or renamed
|
|
48
|
+
// component files). These break packaging, and validate --fix must not
|
|
49
|
+
// report success without touching them.
|
|
49
50
|
if (issues.some((issue) => issue.check === 'stale-jar-registration')) {
|
|
50
51
|
try {
|
|
51
52
|
const pruned = await pruneStaleJarMnEntries(engineDir, furnacePaths.customDir, Object.keys(config.custom));
|
|
@@ -84,12 +85,11 @@ async function autoFixIssues(projectRoot, issues) {
|
|
|
84
85
|
// Repair components missing from customElements.js entirely (reported by
|
|
85
86
|
// validate as `missing-custom-element-registration`).
|
|
86
87
|
//
|
|
87
|
-
// Scoped to the components named in `issues
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
// incremented here.
|
|
92
|
-
// the code did not implement it.
|
|
88
|
+
// Scoped to the components named in `issues`: iterating every entry in
|
|
89
|
+
// `config.custom` makes `furnace validate <one-component> --fix` write
|
|
90
|
+
// customElements.js registrations for EVERY custom component, outside the
|
|
91
|
+
// issue list it was handed and invisibly, since `fixed` is never
|
|
92
|
+
// incremented here.
|
|
93
93
|
const componentsWithIssues = new Set(issues.map((issue) => issue.component));
|
|
94
94
|
for (const componentName of componentsWithIssues) {
|
|
95
95
|
const customConfig = config.custom[componentName];
|
|
@@ -123,10 +123,10 @@ async function autoFixIssues(projectRoot, issues) {
|
|
|
123
123
|
*/
|
|
124
124
|
export async function furnaceValidateCommand(projectRoot, name, options = {}) {
|
|
125
125
|
intro('Furnace Validate');
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const config = await
|
|
126
|
+
// Gains the engine rung here: this was the one site in the family that
|
|
127
|
+
// checked furnace.json alone, so a validate against a missing engine
|
|
128
|
+
// produced downstream noise instead of the shared precondition refusal.
|
|
129
|
+
const { config } = await assertFurnaceReady(projectRoot);
|
|
130
130
|
const furnacePaths = getFurnacePaths(projectRoot);
|
|
131
131
|
let totalErrors = 0;
|
|
132
132
|
let totalWarnings = 0;
|
|
@@ -193,12 +193,12 @@ export async function furnaceValidateCommand(projectRoot, name, options = {}) {
|
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
|
-
// Auto-fix fixable issues when --fix is passed. The
|
|
197
|
-
//
|
|
198
|
-
//
|
|
199
|
-
//
|
|
200
|
-
//
|
|
201
|
-
//
|
|
196
|
+
// Auto-fix fixable issues when --fix is passed. The counter returned by
|
|
197
|
+
// `autoFixIssues` only counts function calls that did not throw — a write
|
|
198
|
+
// that succeeded but did not actually resolve the issue (addJarMnEntries
|
|
199
|
+
// appending to a file mach later ignores) would still bump it. Re-validate
|
|
200
|
+
// the affected components and compute the *actual* drop in fixable issues
|
|
201
|
+
// so the reported number is honest.
|
|
202
202
|
if (options.fix && allIssues.length > 0) {
|
|
203
203
|
const fixableIssues = allIssues.filter((issue) => FIXABLE_CHECKS.has(issue.check));
|
|
204
204
|
if (fixableIssues.length > 0) {
|
|
@@ -3,6 +3,8 @@ import { join } from 'node:path';
|
|
|
3
3
|
import { confirm } from '@clack/prompts';
|
|
4
4
|
import { Command } from 'commander';
|
|
5
5
|
import { getProjectPaths, loadConfig, loadState, updateState } from '../core/config.js';
|
|
6
|
+
import { stdioIsInteractive } from '../core/destructive.js';
|
|
7
|
+
import { assertEngineExists } from '../core/engine-precondition.js';
|
|
6
8
|
import { getHead } from '../core/git.js';
|
|
7
9
|
import { getDirtyFiles } from '../core/git-status.js';
|
|
8
10
|
import { applyPatchesWithContinue, countPatches, createPatchedContentContext, discoverPatches, extractAffectedFiles, matchesUntilFilename, PatchError, } from '../core/patch-apply.js';
|
|
@@ -84,14 +86,13 @@ async function checkUncommittedPatchFiles(engineDir, patchesDir, forceImport) {
|
|
|
84
86
|
if (dirtyFiles.length > 0) {
|
|
85
87
|
const unmanagedDirtyFiles = await getUnmanagedDirtyFiles(engineDir, patchesDir, dirtyFiles);
|
|
86
88
|
if (unmanagedDirtyFiles.length === 0) {
|
|
87
|
-
// Common path here: operator just ran `fireforge resolve` to
|
|
89
|
+
// Common path here: the operator just ran `fireforge resolve` to
|
|
88
90
|
// regenerate a patch from manual conflict edits, so the engine
|
|
89
|
-
// already carries the patch's effects. The import below
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
// prints next, which the 2026-04-25 eval flagged as ambiguous.
|
|
91
|
+
// already carries the patch's effects. The import below still
|
|
92
|
+
// re-applies each patch (a no-op for files whose contents already
|
|
93
|
+
// match), so phrase the line as "no resync needed" rather than
|
|
94
|
+
// "patches already applied" — the latter contradicts the "Applied N
|
|
95
|
+
// patch(es)" summary `applyPatchesWithContinue` prints next.
|
|
95
96
|
info('Patch-touched files already match the stored patch stack — no engine resync needed before re-applying.');
|
|
96
97
|
}
|
|
97
98
|
else if (!forceImport) {
|
|
@@ -110,12 +111,12 @@ async function checkUncommittedPatchFiles(engineDir, patchesDir, forceImport) {
|
|
|
110
111
|
async function handlePatchFailures(summary, projectRoot) {
|
|
111
112
|
const firstFailed = summary.failed[0];
|
|
112
113
|
if (firstFailed) {
|
|
113
|
-
// Transactional update rather than `loadState` + mutate + `saveState`.
|
|
114
|
-
// caller captures `state` at the start of the import run, and the run
|
|
115
|
-
// span a long window (drift-check prompt, patch apply loop). A
|
|
116
|
-
// command (`fireforge download`, `rebase`, another state
|
|
117
|
-
// unrelated fields during that window would be silently
|
|
118
|
-
// stale state object was written back.
|
|
114
|
+
// Transactional update rather than `loadState` + mutate + `saveState`.
|
|
115
|
+
// The caller captures `state` at the start of the import run, and the run
|
|
116
|
+
// can span a long window (drift-check prompt, patch apply loop). A
|
|
117
|
+
// concurrent command (`fireforge download`, `rebase`, another state
|
|
118
|
+
// mutation) writing unrelated fields during that window would be silently
|
|
119
|
+
// clobbered when the stale state object was written back.
|
|
119
120
|
await updateState(projectRoot, (current) => ({
|
|
120
121
|
...current,
|
|
121
122
|
pendingResolution: {
|
|
@@ -155,19 +156,22 @@ async function handlePatchFailures(summary, projectRoot) {
|
|
|
155
156
|
info(' 2. Run "fireforge resolve" to update the patch file with your manual fixes and continue.');
|
|
156
157
|
throw new PatchError(`Failed to apply ${summary.failed.length} patch(es)`, firstFailed?.patch.filename);
|
|
157
158
|
}
|
|
158
|
-
async function checkEngineDrift(engineDir, baseCommit, forceImport) {
|
|
159
|
+
async function checkEngineDrift(engineDir, baseCommit, forceImport, acceptPrompts) {
|
|
159
160
|
const currentHead = await getHead(engineDir);
|
|
160
161
|
if (currentHead === baseCommit)
|
|
161
162
|
return true;
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
// `--yes` and `--force` both answer this prompt; only `--force` also
|
|
164
|
+
// waives the patch-integrity gate further down.
|
|
165
|
+
const promptAnswered = forceImport || acceptPrompts;
|
|
166
|
+
if (!stdioIsInteractive()) {
|
|
167
|
+
if (!promptAnswered) {
|
|
168
|
+
throw new GeneralError('Engine HEAD has drifted from base commit. Re-run with --yes to accept the drift, or --force to also bypass the patch-integrity gate.');
|
|
165
169
|
}
|
|
166
|
-
warn(
|
|
170
|
+
warn(`Engine HEAD has drifted from base commit. Continuing because ${forceImport ? '--force' : '--yes'} was provided in non-interactive mode.`);
|
|
167
171
|
}
|
|
168
172
|
else {
|
|
169
|
-
if (
|
|
170
|
-
warn(
|
|
173
|
+
if (promptAnswered) {
|
|
174
|
+
warn(`Engine HEAD has drifted from base commit. Continuing because ${forceImport ? '--force' : '--yes'} was provided.`);
|
|
171
175
|
}
|
|
172
176
|
else {
|
|
173
177
|
warn('Warning: Engine is not at the baseline commit.');
|
|
@@ -200,10 +204,10 @@ function buildUntilFilenameSet(patches, until) {
|
|
|
200
204
|
return set;
|
|
201
205
|
// Resolve the identifier with the SAME matcher the apply loop uses
|
|
202
206
|
// (`matchesUntilFilename` accepts filenames, extension-less names, AND
|
|
203
|
-
// bare ordinals).
|
|
204
|
-
//
|
|
205
|
-
//
|
|
206
|
-
//
|
|
207
|
+
// bare ordinals). A filename-only match makes `import --until 5` produce
|
|
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
|
+
// patches 1..5 anyway.
|
|
207
211
|
const target = patches.find((p) => matchesUntilFilename(p.filename, until));
|
|
208
212
|
if (!target)
|
|
209
213
|
return set;
|
|
@@ -280,7 +284,7 @@ async function gateImportIntegrity(paths, untilFilenameSet, until, forceImport)
|
|
|
280
284
|
if (forceImport) {
|
|
281
285
|
warn('Continuing because --force was provided. Integrity issues were not resolved.\n');
|
|
282
286
|
}
|
|
283
|
-
else if (!(
|
|
287
|
+
else if (!stdioIsInteractive()) {
|
|
284
288
|
throw new GeneralError(`Refusing to import while ${integrityIssues.length} patch integrity issue(s) are unresolved. ` +
|
|
285
289
|
`Fix the issues reported above (see "fireforge doctor") or re-run with --force to continue anyway.`);
|
|
286
290
|
}
|
|
@@ -326,15 +330,14 @@ export async function importCommand(projectRoot, options = {}) {
|
|
|
326
330
|
intro(isDryRun ? 'FireForge Import (dry run)' : 'FireForge Import');
|
|
327
331
|
const continueOnFailure = options.continue ?? false;
|
|
328
332
|
const forceImport = options.force ?? false;
|
|
333
|
+
const acceptPrompts = options.yes ?? false;
|
|
329
334
|
const paths = getProjectPaths(projectRoot);
|
|
330
335
|
// Check if engine exists
|
|
331
|
-
|
|
332
|
-
throw new GeneralError('Firefox source not found. Run "fireforge download" first.');
|
|
333
|
-
}
|
|
336
|
+
await assertEngineExists(paths.engine);
|
|
334
337
|
// Engine consistency check before applying patches
|
|
335
338
|
const state = await loadState(projectRoot);
|
|
336
339
|
if (state.baseCommit && !isDryRun) {
|
|
337
|
-
const shouldContinue = await checkEngineDrift(paths.engine, state.baseCommit, forceImport);
|
|
340
|
+
const shouldContinue = await checkEngineDrift(paths.engine, state.baseCommit, forceImport, acceptPrompts);
|
|
338
341
|
if (!shouldContinue)
|
|
339
342
|
return;
|
|
340
343
|
}
|
|
@@ -364,15 +367,14 @@ export async function importCommand(projectRoot, options = {}) {
|
|
|
364
367
|
await assertScopedManifestConsistency(paths.patches, untilFilenameSet, options.until);
|
|
365
368
|
await warnVersionCompatibility(projectRoot, manifest, untilFilenameSet, options.until);
|
|
366
369
|
// Validate patch integrity (detect orphaned modification patches). Warn
|
|
367
|
-
// and prompt the operator to confirm before proceeding
|
|
368
|
-
//
|
|
369
|
-
//
|
|
370
|
-
// error that made diagnosis harder.
|
|
370
|
+
// and prompt the operator to confirm before proceeding: warn-and-continue
|
|
371
|
+
// hides the real root cause, because import then fails during patch
|
|
372
|
+
// application with a secondary, unrelated error.
|
|
371
373
|
//
|
|
372
374
|
// Scope the surfaced issues to the `--until` range: a later patch with
|
|
373
375
|
// integrity problems should not block importing an earlier good subset,
|
|
374
|
-
// which is exactly what operators reach for when the tail of the queue
|
|
375
|
-
//
|
|
376
|
+
// which is exactly what operators reach for when the tail of the queue is
|
|
377
|
+
// broken and they want to keep working against an earlier checkpoint.
|
|
376
378
|
const integrityOk = await gateImportIntegrity(paths, untilFilenameSet, options.until, forceImport);
|
|
377
379
|
if (!integrityOk)
|
|
378
380
|
return;
|
|
@@ -426,6 +428,11 @@ export function registerImport(program, { getProjectRoot, withErrorHandling }) {
|
|
|
426
428
|
.description('Apply patches from the patches directory')
|
|
427
429
|
.option('--continue', 'Continue applying patches even if one fails')
|
|
428
430
|
.option('-f, --force', 'Proceed despite engine drift and overwrite unmanaged changes in patch-touched files')
|
|
431
|
+
// NOT an alias of --force. `--force` waives two orthogonal things: the
|
|
432
|
+
// drift prompt AND the patch-integrity gate. `--yes` waives only the
|
|
433
|
+
// prompt, so a scripted import can run unattended while the integrity
|
|
434
|
+
// refusal stays armed — which is the guard you actually want in CI.
|
|
435
|
+
.option('-y, --yes', 'Answer the drift prompt non-interactively. Unlike --force, this does NOT waive the patch-integrity gate.')
|
|
429
436
|
.option('--until <patch>', 'Apply patches only up to and including this patch (alias: --stop-at)')
|
|
430
437
|
.option('--stop-at <patch>', 'Alias for --until')
|
|
431
438
|
.option('--dry-run', 'Preview which patches would be applied without modifying the engine')
|
|
@@ -3,8 +3,8 @@ import { join } from 'node:path';
|
|
|
3
3
|
import { getProjectPaths, loadConfig } from '../core/config.js';
|
|
4
4
|
import { getDiffForFilesAgainstHead } from '../core/git-diff.js';
|
|
5
5
|
import { withPrivateGitIndex } from '../core/git-readonly-index.js';
|
|
6
|
-
import { buildPerPatchLintCacheKey, getCachedPerPatchLintIssues, getPerPatchLintCacheHeadSha, loadPerPatchLintCache, savePerPatchLintCache, setCachedPerPatchLintIssues, } from '../core/lint-cache.js';
|
|
7
6
|
import { buildPatchQueueContext, countNonBinaryDiffLines, formatPatchLintIssue, lintExportedPatch, lintPatchQueue, resolvePatchSizeTier, } from '../core/patch-lint.js';
|
|
7
|
+
import { buildPerPatchLintCacheKey, getCachedPerPatchLintIssues, getPerPatchLintCacheHeadSha, loadPerPatchLintCache, savePerPatchLintCache, setCachedPerPatchLintIssues, } from '../core/patch-lint-cache.js';
|
|
8
8
|
import { loadPatchesManifest } from '../core/patch-manifest.js';
|
|
9
9
|
import { evaluatePatchPolicy } from '../core/patch-policy.js';
|
|
10
10
|
import { GeneralError } from '../errors/base.js';
|
|
@@ -106,7 +106,12 @@ async function lintQueuedPatch(patch, lintCtx) {
|
|
|
106
106
|
}
|
|
107
107
|
lintOptions.precomputedCheckJs = precomputedCheckJs;
|
|
108
108
|
}
|
|
109
|
-
const patchIssues = await lintExportedPatch(paths.engine, existing, diff, config,
|
|
109
|
+
const patchIssues = await lintExportedPatch(paths.engine, existing, diff, config, {
|
|
110
|
+
...lintOptions,
|
|
111
|
+
patchQueueCtx: ctx,
|
|
112
|
+
...(ignore ? { ignoreChecks: ignore } : {}),
|
|
113
|
+
...(patch.tier ? { patchTier: patch.tier } : {}),
|
|
114
|
+
});
|
|
110
115
|
const result = {
|
|
111
116
|
status: 'linted',
|
|
112
117
|
existingFiles: existing,
|
|
@@ -155,10 +160,10 @@ async function applyPerPatchResults(subset, results, issues, checkJs, cache) {
|
|
|
155
160
|
// Run-level checkJs errors are emitted once, before the first
|
|
156
161
|
// non-skipped patch's own issues — matching the serial emit point.
|
|
157
162
|
// Deliberately NOT gated on `result.usedCheckJs`: global findings are
|
|
158
|
-
// run-level
|
|
159
|
-
//
|
|
160
|
-
// one
|
|
161
|
-
//
|
|
163
|
+
// run-level and never cached, so gating drops them entirely on an
|
|
164
|
+
// all-cache-hit run and lets a warm run report fewer errors than a cold
|
|
165
|
+
// one. PerRunCheckJs builds its program lazily, so the cost only
|
|
166
|
+
// materialises when checkJs is configured.
|
|
162
167
|
if (checkJs && !globalCheckJsEmitted) {
|
|
163
168
|
globalCheckJsEmitted = true;
|
|
164
169
|
issues.push(...(await checkJs.getGlobal()));
|
|
@@ -170,10 +175,10 @@ async function applyPerPatchResults(subset, results, issues, checkJs, cache) {
|
|
|
170
175
|
for (const issue of result.rawIssues) {
|
|
171
176
|
issues.push({ ...issue, file: `${patch.filename} :: ${issue.file}` });
|
|
172
177
|
}
|
|
173
|
-
// A waived size finding still reports its MEASUREMENT:
|
|
174
|
-
//
|
|
175
|
-
//
|
|
176
|
-
//
|
|
178
|
+
// A waived size finding still reports its MEASUREMENT: the finding stays
|
|
179
|
+
// suppressed (no exit-code / --max-warnings effect) but the current count
|
|
180
|
+
// is readable from the tool that enforces it, so a waiver's cited size
|
|
181
|
+
// can be calibrated without hand-measuring.
|
|
177
182
|
for (const suppressedIssue of result.suppressedIssues) {
|
|
178
183
|
if (!SUPPRESSED_SIZE_CHECKS.has(suppressedIssue.check))
|
|
179
184
|
continue;
|
|
@@ -3,22 +3,22 @@
|
|
|
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
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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
|
+
* (lazily, promise-memoised) and lets callers slice per-patch findings out of
|
|
9
|
+
* the grouped result. Three levers keep the cost paid only when it buys
|
|
10
|
+
* something:
|
|
11
11
|
*
|
|
12
12
|
* - **Lazy build**: nothing is built until the first cache miss asks.
|
|
13
13
|
* - **Root scoping** (`rootScopePatches`): with `--patches <subset>` the
|
|
14
|
-
* program's roots are only the subset's owned files; the full queue
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* - **Warm-run probe**: run-level ("global") checkJs findings come only
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
14
|
+
* program's roots are only the subset's owned files; the full queue stays
|
|
15
|
+
* resolvable, so cross-patch imports type-check identically while
|
|
16
|
+
* unrelated files are never parsed.
|
|
17
|
+
* - **Warm-run probe**: run-level ("global") checkJs findings come only from
|
|
18
|
+
* a missing `typescript` package or an unreadable shim — never from the
|
|
19
|
+
* built program — so an all-cache-hit run satisfies "warm never reports
|
|
20
|
+
* less than cold" via `probeCheckJsGlobalIssues` instead of building
|
|
21
|
+
* anything.
|
|
22
22
|
*/
|
|
23
23
|
import type { getProjectPaths, loadConfig } from '../core/config.js';
|
|
24
24
|
import { type GroupedCheckJsResult } from '../core/patch-lint-checkjs.js';
|
|
@@ -4,22 +4,22 @@
|
|
|
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
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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
|
+
* (lazily, promise-memoised) and lets callers slice per-patch findings out of
|
|
10
|
+
* the grouped result. Three levers keep the cost paid only when it buys
|
|
11
|
+
* something:
|
|
12
12
|
*
|
|
13
13
|
* - **Lazy build**: nothing is built until the first cache miss asks.
|
|
14
14
|
* - **Root scoping** (`rootScopePatches`): with `--patches <subset>` the
|
|
15
|
-
* program's roots are only the subset's owned files; the full queue
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* - **Warm-run probe**: run-level ("global") checkJs findings come only
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
15
|
+
* program's roots are only the subset's owned files; the full queue stays
|
|
16
|
+
* resolvable, so cross-patch imports type-check identically while
|
|
17
|
+
* unrelated files are never parsed.
|
|
18
|
+
* - **Warm-run probe**: run-level ("global") checkJs findings come only from
|
|
19
|
+
* a missing `typescript` package or an unreadable shim — never from the
|
|
20
|
+
* built program — so an all-cache-hit run satisfies "warm never reports
|
|
21
|
+
* less than cold" via `probeCheckJsGlobalIssues` instead of building
|
|
22
|
+
* anything.
|
|
23
23
|
*/
|
|
24
24
|
import { invokePatchLintCheckJsGrouped, probeCheckJsGlobalIssues, runCheckJsTestFilesGrouped, } from '../core/patch-lint-checkjs.js';
|
|
25
25
|
import { isTestScriptFile, resolvePatchOwnedSysMjs, resolvePatchOwnedTestScripts, } from '../core/patch-lint-ownership.js';
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
3
|
* Machine-readable per-patch lint report (`lint --per-patch --report
|
|
4
|
-
* <path
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* visible with their measurements instead of vanishing.
|
|
4
|
+
* <path>`). One mechanism serves two observability gaps: consumers get each
|
|
5
|
+
* patch's size metrics against the SAME thresholds the size rules fire on,
|
|
6
|
+
* instead of mirroring `countNonBinaryDiffLines`, and lintIgnore-suppressed
|
|
7
|
+
* issues stay visible with their measurements rather than vanishing.
|
|
9
8
|
*
|
|
10
|
-
* Helper module consumed by lint-per-patch.ts; no registrar is exported
|
|
11
|
-
*
|
|
9
|
+
* Helper module consumed by lint-per-patch.ts; no registrar is exported and
|
|
10
|
+
* none is wanted.
|
|
12
11
|
*/
|
|
13
12
|
import { getPatchSizeThresholds, resolvePatchSizeTier, } from '../core/patch-lint.js';
|
|
14
13
|
import { writeJson } from '../utils/fs.js';
|
|
@@ -11,25 +11,24 @@ export interface AggregateLintIgnoreResult {
|
|
|
11
11
|
dropped: number;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* Filters aggregate-mode lint issues against per-patch `lintIgnore`
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* Filters aggregate-mode lint issues against per-patch `lintIgnore` lists
|
|
15
|
+
* drawn from the manifest. An issue is dropped when at least one patch whose
|
|
16
|
+
* `filesAffected` covers `issue.file` lists `issue.check` in its
|
|
17
|
+
* `lintIgnore`.
|
|
18
18
|
*
|
|
19
|
-
* Mirrors the per-patch contract: `--per-patch` mode threads each
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* warning every CI run
|
|
24
|
-
* with no patch-level scope. Attributing each issue's file to its
|
|
19
|
+
* Mirrors the per-patch contract: `--per-patch` mode threads each patch's
|
|
20
|
+
* `lintIgnore` directly into `lintExportedPatch`, so a check the operator
|
|
21
|
+
* explicitly waived in `patches.json` does not surface. Aggregate `--since`
|
|
22
|
+
* mode has no patch-level scope of its own and would otherwise rediscover
|
|
23
|
+
* the suppressed warning every CI run. Attributing each issue's file to its
|
|
25
24
|
* owning patch via `filesAffected` re-establishes the same suppression
|
|
26
|
-
* semantics. Cross-patch findings (forward-import, duplicate-creation)
|
|
27
|
-
*
|
|
28
|
-
*
|
|
25
|
+
* semantics. Cross-patch findings (forward-import, duplicate-creation) also
|
|
26
|
+
* attribute via `issue.file`, which is the offending site and is owned by
|
|
27
|
+
* some patch.
|
|
29
28
|
*
|
|
30
|
-
* Multiple owners: an issue is dropped if **any** owning patch waived
|
|
31
|
-
*
|
|
32
|
-
*
|
|
29
|
+
* Multiple owners: an issue is dropped if **any** owning patch waived the
|
|
30
|
+
* rule. Conservative — never adds new findings, only drops already-waived
|
|
31
|
+
* ones.
|
|
33
32
|
*
|
|
34
33
|
* @param issues - Issues collected from the aggregate lint run.
|
|
35
34
|
* @param ctx - Patch queue context used to attribute file → patch.
|