@hominis/fireforge 0.43.1 → 0.44.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 +153 -0
- package/README.md +3 -3
- 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 +13 -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-patch-manifest.d.ts +8 -0
- package/dist/src/commands/doctor-patch-manifest.js +155 -0
- 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.d.ts +1 -1
- package/dist/src/commands/doctor.js +64 -96
- 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 +15 -10
- 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 +14 -17
- 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 +48 -37
- 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 +39 -36
- 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 +17 -27
- package/dist/src/core/build-prepare.d.ts +2 -2
- package/dist/src/core/build-prepare.js +8 -9
- package/dist/src/core/config-mutate.js +20 -19
- 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 +16 -13
- package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
- package/dist/src/core/furnace-apply-helpers.js +30 -21
- 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 +21 -9
- package/dist/src/core/git-base.js +24 -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 +57 -71
- 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 +41 -20
- 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 +57 -6
- package/dist/src/core/patch-manifest-consistency.js +111 -40
- package/dist/src/core/patch-manifest-files-affected.d.ts +43 -0
- package/dist/src/core/patch-manifest-files-affected.js +77 -0
- 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-manifest.d.ts +2 -1
- package/dist/src/core/patch-manifest.js +2 -1
- 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 +66 -14
- 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 +29 -13
- package/dist/src/core/token-docs.d.ts +2 -0
- package/dist/src/core/token-docs.js +3 -1
- 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 +28 -6
- 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 +68 -43
- 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 +15 -9
- 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 +111 -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 +3 -3
- 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
|
@@ -7,24 +7,23 @@ import { getPackageVersion } from '../utils/package-root.js';
|
|
|
7
7
|
import { getFurnacePaths } from './furnace-config.js';
|
|
8
8
|
import { git } from './git-base.js';
|
|
9
9
|
import { collectNewFileCreatorsByPath } from './patch-lint.js';
|
|
10
|
-
// Schema 2: entries additionally carry the lintIgnore-suppressed
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
10
|
+
// Schema 2: entries additionally carry the lintIgnore-suppressed issues and
|
|
11
|
+
// the measured non-binary line count, so a warm run can report waived size
|
|
12
|
+
// measurements identically to a cold one — a cache hit must never surface
|
|
13
|
+
// LESS than a fresh lint.
|
|
14
14
|
// Schema 3: the key additionally content-hashes the
|
|
15
15
|
// `patchLint.checkJsTestShim` file exactly as `checkJsExtraShim`'s already
|
|
16
|
-
// was
|
|
17
|
-
// verdict
|
|
18
|
-
// Schema 4: each entry RECORDS the lint-ignore waiver set that
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
// cache that already holds a mismatched verdict.
|
|
16
|
+
// was; without it, editing the test shim in place replays every cached
|
|
17
|
+
// verdict.
|
|
18
|
+
// Schema 4: each entry RECORDS the lint-ignore waiver set that produced it,
|
|
19
|
+
// and a lookup whose effective waiver set differs is refused even when the
|
|
20
|
+
// key matches. The key already hashes `patch.lintIgnore`, so this is
|
|
21
|
+
// belt-and-braces on purpose: a waiver change is the one mutation that makes
|
|
22
|
+
// a replayed verdict actively WRONG (an operator writes a waiver, re-runs,
|
|
23
|
+
// and is shown the finding they just waived), and the class must not depend
|
|
24
|
+
// on every future key input staying complete. Bumping the schema also
|
|
25
|
+
// discards every pre-4 entry, which is itself the cure for a cache that
|
|
26
|
+
// already holds a mismatched verdict.
|
|
28
27
|
export const LINT_CACHE_SCHEMA_VERSION = 4;
|
|
29
28
|
const LINT_IMPLEMENTATION_VERSION = 1;
|
|
30
29
|
const LINT_CACHE_DIRNAME = 'lint-cache';
|
|
@@ -102,8 +101,7 @@ export async function buildPerPatchLintCacheKey(input) {
|
|
|
102
101
|
// Hash in parallel, then insert in sorted order. The sort is load-bearing:
|
|
103
102
|
// `stableHash` below serialises this record, so insertion order is part of
|
|
104
103
|
// the cache key — assigning as results land would make the key
|
|
105
|
-
// nondeterministic.
|
|
106
|
-
// path of the cache whose entire purpose is making lint faster.
|
|
104
|
+
// nondeterministic.
|
|
107
105
|
const sortedFiles = [...input.existingFiles].sort((a, b) => a.localeCompare(b));
|
|
108
106
|
const hashes = await Promise.all(sortedFiles.map((file) => fileHash(join(input.engineDir, file))));
|
|
109
107
|
const engineFiles = {};
|
|
@@ -127,8 +125,8 @@ export async function buildPerPatchLintCacheKey(input) {
|
|
|
127
125
|
cacheSchemaVersion: LINT_CACHE_SCHEMA_VERSION,
|
|
128
126
|
engineHeadSha: input.engineHeadSha ?? null,
|
|
129
127
|
lintImplementationVersion: LINT_IMPLEMENTATION_VERSION,
|
|
130
|
-
// Deliberately the PLAIN semver, not the +g<sha> build identity
|
|
131
|
-
|
|
128
|
+
// Deliberately the PLAIN semver, not the +g<sha> build identity:
|
|
129
|
+
// identity churns every commit at the same version and
|
|
132
130
|
// would invalidate the cache for no correctness gain.
|
|
133
131
|
packageVersion: input.packageVersion ?? getPackageVersion(),
|
|
134
132
|
patchFile: await fileHash(join(input.patchesDir, input.patch.filename)),
|
|
@@ -205,9 +203,9 @@ function normalizeLintIgnoreSet(lintIgnore) {
|
|
|
205
203
|
}
|
|
206
204
|
/**
|
|
207
205
|
* Returns the cached lint payload for a patch when the stored key still
|
|
208
|
-
* matches AND the entry was computed under the same lint-ignore waiver set
|
|
209
|
-
|
|
210
|
-
*
|
|
206
|
+
* matches AND the entry was computed under the same lint-ignore waiver set.
|
|
207
|
+
* A waiver change makes a replayed verdict actively wrong, so the waiver set
|
|
208
|
+
* is compared explicitly rather than trusted to the key.
|
|
211
209
|
*/
|
|
212
210
|
export function getCachedPerPatchLintIssues(cache, patchFilename, key, lintIgnore) {
|
|
213
211
|
const entry = cache.entries[patchFilename];
|
|
@@ -49,10 +49,10 @@ export interface GroupedCheckJsResult {
|
|
|
49
49
|
/**
|
|
50
50
|
* Builds the checkJs program **once** over `resolutionOwned` and returns its
|
|
51
51
|
* diagnostics grouped by originating file. Callers slice the result by their
|
|
52
|
-
* own report scope — per-patch lint attributes each file to its owning
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
52
|
+
* own report scope — per-patch lint attributes each file to its owning patch,
|
|
53
|
+
* export/re-export keeps only the patch under export. Resolution always spans
|
|
54
|
+
* every file in `resolutionOwned`, so cross-patch `resource:///`/`chrome://`
|
|
55
|
+
* imports resolve to real sources.
|
|
56
56
|
*
|
|
57
57
|
* @param repoDir - Absolute engine (repository) directory
|
|
58
58
|
* @param resolutionOwned - Patch-owned `.sys.mjs` paths (relative to repoDir)
|
|
@@ -61,14 +61,14 @@ export interface GroupedCheckJsResult {
|
|
|
61
61
|
* the built-in Firefox-globals shim (from `patchLint.checkJsExtraShim`)
|
|
62
62
|
* @param projectRoot - Absolute project root for resolving `extraShimPath`
|
|
63
63
|
* @param mode - Strictness preset plus allowlisted compiler-option overrides
|
|
64
|
-
* @param builtinShimSuffix - Optional shim text appended AFTER the consumer
|
|
64
|
+
* @param builtinShimSuffix - Optional shim text appended AFTER the consumer
|
|
65
|
+
* shim
|
|
65
66
|
* @param rootScope - When set, only these repo-relative files become program
|
|
66
67
|
* ROOTS; resolution (and the host allowlist) still spans all of
|
|
67
68
|
* `resolutionOwned`, so a subset root's cross-patch imports type-check
|
|
68
69
|
* against the real owning sources while unrelated owned files are never
|
|
69
70
|
* parsed. `.mjs` files are module-scoped, so a root's diagnostics are
|
|
70
|
-
* identical whether other owned files are roots or mere resolution
|
|
71
|
-
* targets (pinned by the rootScope parity test).
|
|
71
|
+
* identical whether other owned files are roots or mere resolution targets.
|
|
72
72
|
* @returns Diagnostics grouped per owning file plus run-level errors
|
|
73
73
|
*/
|
|
74
74
|
export declare function runCheckJsGrouped(repoDir: string, resolutionOwned: Set<string>, extraShimPath?: string, projectRoot?: string, mode?: CheckJsMode, builtinShimSuffix?: string, rootScope?: ReadonlySet<string>): Promise<GroupedCheckJsResult>;
|
|
@@ -135,14 +135,14 @@ export declare function runCheckJsTestFilesGrouped(repoDir: string, testFiles: S
|
|
|
135
135
|
*/
|
|
136
136
|
export declare function invokePatchLintCheckJsGrouped(repoDir: string, patchOwnedFiles: Set<string>, patchLint: PatchLintConfig, projectRoot: string, rootScope?: ReadonlySet<string>): Promise<GroupedCheckJsResult>;
|
|
137
137
|
/**
|
|
138
|
-
* Cheap probe reproducing the only run-level ("global") checkJs findings
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
138
|
+
* Cheap probe reproducing the only run-level ("global") checkJs findings the
|
|
139
|
+
* build path can produce — a missing `typescript` package and an unreadable
|
|
140
|
+
* consumer shim (`checkJsExtraShim`, and `checkJsTestShim` when
|
|
141
|
+
* `checkJsTestFiles` is on). The built program itself never contributes
|
|
142
|
+
* globals (see {@link runCheckJsGrouped}), so a warm all-cache-hit run can
|
|
143
|
+
* satisfy the "warm never reports less than cold" invariant with this probe
|
|
144
|
+
* instead of building the whole TypeScript program. Issue objects are
|
|
145
|
+
* byte-identical to the build path's, deduplicated by message like
|
|
146
|
+
* {@link runCheckJsTestFilesGrouped}.
|
|
147
147
|
*/
|
|
148
148
|
export declare function probeCheckJsGlobalIssues(patchLint: PatchLintConfig, projectRoot: string): Promise<PatchLintIssue[]>;
|
|
@@ -29,10 +29,25 @@ import { basename, resolve } from 'node:path';
|
|
|
29
29
|
import { toError } from '../utils/errors.js';
|
|
30
30
|
import { pathExists } from '../utils/fs.js';
|
|
31
31
|
import { verbose } from '../utils/logger.js';
|
|
32
|
+
import { normalizePathSlashes } from '../utils/paths.js';
|
|
32
33
|
import { composeShimSource, SHIM_FILENAME, SUPPRESSED_DIAGNOSTIC_CODES, TEST_HARNESS_SHIM, UNDEFINED_IDENTIFIER_CODES, UNDEFINED_IDENTIFIER_HINT, } from './typecheck-shim.js';
|
|
33
34
|
// ---------------------------------------------------------------------------
|
|
34
35
|
// Public API
|
|
35
36
|
// ---------------------------------------------------------------------------
|
|
37
|
+
/**
|
|
38
|
+
* Converts a native path into the form TypeScript uses for `fileName`.
|
|
39
|
+
*
|
|
40
|
+
* TypeScript normalizes every path it hands a `CompilerHost` to forward
|
|
41
|
+
* slashes on ALL platforms, while `resolve()` here yields the platform
|
|
42
|
+
* separator. On Windows that mismatch made every `ownedAbsolute.has(fileName)`
|
|
43
|
+
* and `relByAbsolute.get(fileName)` lookup miss, so the host served an empty
|
|
44
|
+
* source file for each owned file and the whole pass reported zero findings —
|
|
45
|
+
* silently, because "no diagnostics" is indistinguishable from "clean code".
|
|
46
|
+
* Every path that crosses the TS boundary goes through here.
|
|
47
|
+
*/
|
|
48
|
+
function toTsPath(path) {
|
|
49
|
+
return normalizePathSlashes(path);
|
|
50
|
+
}
|
|
36
51
|
/**
|
|
37
52
|
* Builds the host-side module resolver for the checkJs pass: maps an import
|
|
38
53
|
* specifier to a patch-owned absolute path when the specifier's final
|
|
@@ -117,8 +132,14 @@ function createPathsResolver(ts, paths, baseDir, fileExists, onResolved) {
|
|
|
117
132
|
captured = specifier.slice(prefix.length, specifier.length - suffix.length);
|
|
118
133
|
}
|
|
119
134
|
for (const target of targets) {
|
|
120
|
-
|
|
121
|
-
|
|
135
|
+
// A `paths` target carries at most one `*`, and TypeScript substitutes
|
|
136
|
+
// that one wildcard — spelled as index arithmetic (mirroring the
|
|
137
|
+
// prefix/suffix split on the pattern side above) rather than
|
|
138
|
+
// `replace('*', …)`, whose first-occurrence-only behaviour reads as an
|
|
139
|
+
// incomplete rewrite (CodeQL `js/incomplete-sanitization`).
|
|
140
|
+
const star = target.indexOf('*');
|
|
141
|
+
const rel = star === -1 ? target : target.slice(0, star) + captured + target.slice(star + 1);
|
|
142
|
+
const abs = toTsPath(resolve(baseDir, rel));
|
|
122
143
|
if (!fileExists(abs))
|
|
123
144
|
continue;
|
|
124
145
|
onResolved(abs);
|
|
@@ -135,10 +156,10 @@ function createPathsResolver(ts, paths, baseDir, fileExists, onResolved) {
|
|
|
135
156
|
/**
|
|
136
157
|
* Builds the checkJs program **once** over `resolutionOwned` and returns its
|
|
137
158
|
* diagnostics grouped by originating file. Callers slice the result by their
|
|
138
|
-
* own report scope — per-patch lint attributes each file to its owning
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
159
|
+
* own report scope — per-patch lint attributes each file to its owning patch,
|
|
160
|
+
* export/re-export keeps only the patch under export. Resolution always spans
|
|
161
|
+
* every file in `resolutionOwned`, so cross-patch `resource:///`/`chrome://`
|
|
162
|
+
* imports resolve to real sources.
|
|
142
163
|
*
|
|
143
164
|
* @param repoDir - Absolute engine (repository) directory
|
|
144
165
|
* @param resolutionOwned - Patch-owned `.sys.mjs` paths (relative to repoDir)
|
|
@@ -147,14 +168,14 @@ function createPathsResolver(ts, paths, baseDir, fileExists, onResolved) {
|
|
|
147
168
|
* the built-in Firefox-globals shim (from `patchLint.checkJsExtraShim`)
|
|
148
169
|
* @param projectRoot - Absolute project root for resolving `extraShimPath`
|
|
149
170
|
* @param mode - Strictness preset plus allowlisted compiler-option overrides
|
|
150
|
-
* @param builtinShimSuffix - Optional shim text appended AFTER the consumer
|
|
171
|
+
* @param builtinShimSuffix - Optional shim text appended AFTER the consumer
|
|
172
|
+
* shim
|
|
151
173
|
* @param rootScope - When set, only these repo-relative files become program
|
|
152
174
|
* ROOTS; resolution (and the host allowlist) still spans all of
|
|
153
175
|
* `resolutionOwned`, so a subset root's cross-patch imports type-check
|
|
154
176
|
* against the real owning sources while unrelated owned files are never
|
|
155
177
|
* parsed. `.mjs` files are module-scoped, so a root's diagnostics are
|
|
156
|
-
* identical whether other owned files are roots or mere resolution
|
|
157
|
-
* targets (pinned by the rootScope parity test).
|
|
178
|
+
* identical whether other owned files are roots or mere resolution targets.
|
|
158
179
|
* @returns Diagnostics grouped per owning file plus run-level errors
|
|
159
180
|
*/
|
|
160
181
|
export async function runCheckJsGrouped(repoDir, resolutionOwned, extraShimPath, projectRoot, mode, builtinShimSuffix, rootScope) {
|
|
@@ -188,7 +209,7 @@ export async function runCheckJsGrouped(repoDir, resolutionOwned, extraShimPath,
|
|
|
188
209
|
const ownedAbsolute = new Set();
|
|
189
210
|
const relByAbsolute = new Map();
|
|
190
211
|
for (const rel of resolutionOwned) {
|
|
191
|
-
const abs = resolve(repoDir, rel);
|
|
212
|
+
const abs = toTsPath(resolve(repoDir, rel));
|
|
192
213
|
if (await pathExists(abs)) {
|
|
193
214
|
if (rootScope === undefined || rootScope.has(rel))
|
|
194
215
|
rootFiles.push(abs);
|
|
@@ -228,7 +249,7 @@ export async function runCheckJsGrouped(repoDir, resolutionOwned, extraShimPath,
|
|
|
228
249
|
],
|
|
229
250
|
};
|
|
230
251
|
}
|
|
231
|
-
const shimPath = resolve(repoDir, SHIM_FILENAME);
|
|
252
|
+
const shimPath = toTsPath(resolve(repoDir, SHIM_FILENAME));
|
|
232
253
|
rootFiles.push(shimPath);
|
|
233
254
|
const strict = mode?.strict === true;
|
|
234
255
|
const strictness = strict
|
|
@@ -504,15 +525,15 @@ export async function invokePatchLintCheckJsGrouped(repoDir, patchOwnedFiles, pa
|
|
|
504
525
|
return runCheckJsGrouped(repoDir, patchOwnedFiles, patchLint.checkJsExtraShim, projectRoot, modeFromPatchLintConfig(patchLint), undefined, rootScope);
|
|
505
526
|
}
|
|
506
527
|
/**
|
|
507
|
-
* Cheap probe reproducing the only run-level ("global") checkJs findings
|
|
508
|
-
*
|
|
509
|
-
*
|
|
510
|
-
*
|
|
511
|
-
*
|
|
512
|
-
*
|
|
513
|
-
*
|
|
514
|
-
*
|
|
515
|
-
*
|
|
528
|
+
* Cheap probe reproducing the only run-level ("global") checkJs findings the
|
|
529
|
+
* build path can produce — a missing `typescript` package and an unreadable
|
|
530
|
+
* consumer shim (`checkJsExtraShim`, and `checkJsTestShim` when
|
|
531
|
+
* `checkJsTestFiles` is on). The built program itself never contributes
|
|
532
|
+
* globals (see {@link runCheckJsGrouped}), so a warm all-cache-hit run can
|
|
533
|
+
* satisfy the "warm never reports less than cold" invariant with this probe
|
|
534
|
+
* instead of building the whole TypeScript program. Issue objects are
|
|
535
|
+
* byte-identical to the build path's, deduplicated by message like
|
|
536
|
+
* {@link runCheckJsTestFilesGrouped}.
|
|
516
537
|
*/
|
|
517
538
|
export async function probeCheckJsGlobalIssues(patchLint, projectRoot) {
|
|
518
539
|
try {
|
|
@@ -34,14 +34,11 @@ import type { JsDocIssue, ValidateExportJsDocOptions } from './patch-lint-jsdoc.
|
|
|
34
34
|
*/
|
|
35
35
|
export declare function validateChromeScriptJsDoc(source: string, options?: ValidateExportJsDocOptions): JsDocIssue[];
|
|
36
36
|
/**
|
|
37
|
-
* Per-file dispatch: applies the chrome-subscript JSDoc rule to one file
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* mode is `'off'` / unset). The orchestrator pre-computes `isChromeOwned`
|
|
44
|
-
* (true iff the file is a patch-owned `.js` non-`.sys.mjs`) so the call
|
|
45
|
-
* site fits on a single line.
|
|
37
|
+
* Per-file dispatch: applies the chrome-subscript JSDoc rule to one file if
|
|
38
|
+
* it qualifies, mapping {@link JsDocIssue} into {@link PatchLintIssue}.
|
|
39
|
+
* Returns an empty array when the file does not qualify (not a chrome
|
|
40
|
+
* subscript, not patch-owned, or the mode is `'off'` / unset). The
|
|
41
|
+
* orchestrator pre-computes `isChromeOwned` (true iff the file is a
|
|
42
|
+
* patch-owned `.js` non-`.sys.mjs`) so the call site fits on a single line.
|
|
46
43
|
*/
|
|
47
44
|
export declare function lintChromeScriptJsDocForFile(file: string, content: string, isChromeOwned: boolean, mode: PatchLintSeverityGate | undefined): PatchLintIssue[];
|
|
@@ -47,20 +47,19 @@ export function validateChromeScriptJsDoc(source, options) {
|
|
|
47
47
|
// would emit a pseudo-issue for every rule here. The orchestrator already
|
|
48
48
|
// runs the export walker on `.sys.mjs` separately, so silently declining
|
|
49
49
|
// to lint an unparseable script is the correct degradation for this file
|
|
50
|
-
// and only this file.
|
|
51
|
-
// module-only syntax" in patch-lint-chrome-jsdoc.test.ts.
|
|
50
|
+
// and only this file.
|
|
52
51
|
return [];
|
|
53
52
|
}
|
|
54
53
|
const issues = [];
|
|
55
54
|
const body = ast.body;
|
|
56
55
|
for (const node of body) {
|
|
57
56
|
if (node.type === 'FunctionDeclaration') {
|
|
58
|
-
validateFunctionDecl(node, comments, source
|
|
57
|
+
issues.push(...validateFunctionDecl(node, comments, source));
|
|
59
58
|
}
|
|
60
59
|
else if (node.type === 'ClassDeclaration') {
|
|
61
|
-
validateClassDecl(node, comments, source
|
|
60
|
+
issues.push(...validateClassDecl(node, comments, source));
|
|
62
61
|
if (classMethodMode !== 'off') {
|
|
63
|
-
validateClassMethods(node, comments, source,
|
|
62
|
+
issues.push(...validateClassMethods(node, comments, source, classMethodMode));
|
|
64
63
|
}
|
|
65
64
|
}
|
|
66
65
|
// Top-level `var Foo = class {...}` / `let Foo = function() {...}`
|
|
@@ -72,15 +71,12 @@ export function validateChromeScriptJsDoc(source, options) {
|
|
|
72
71
|
return issues;
|
|
73
72
|
}
|
|
74
73
|
/**
|
|
75
|
-
* Per-file dispatch: applies the chrome-subscript JSDoc rule to one file
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* mode is `'off'` / unset). The orchestrator pre-computes `isChromeOwned`
|
|
82
|
-
* (true iff the file is a patch-owned `.js` non-`.sys.mjs`) so the call
|
|
83
|
-
* site fits on a single line.
|
|
74
|
+
* Per-file dispatch: applies the chrome-subscript JSDoc rule to one file if
|
|
75
|
+
* it qualifies, mapping {@link JsDocIssue} into {@link PatchLintIssue}.
|
|
76
|
+
* Returns an empty array when the file does not qualify (not a chrome
|
|
77
|
+
* subscript, not patch-owned, or the mode is `'off'` / unset). The
|
|
78
|
+
* orchestrator pre-computes `isChromeOwned` (true iff the file is a
|
|
79
|
+
* patch-owned `.js` non-`.sys.mjs`) so the call site fits on a single line.
|
|
84
80
|
*/
|
|
85
81
|
export function lintChromeScriptJsDocForFile(file, content, isChromeOwned, mode) {
|
|
86
82
|
if (!isChromeOwned || !mode || mode === 'off')
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* New-file creators map for the patch queue, split out of
|
|
3
|
-
* `patch-lint-cross.ts`
|
|
4
|
-
* there so callers keep importing from `patch-lint.ts`
|
|
3
|
+
* `patch-lint-cross.ts` to stay under the per-file line budget.
|
|
4
|
+
* Re-exported from there so callers keep importing from `patch-lint.ts`
|
|
5
|
+
* unchanged.
|
|
5
6
|
*
|
|
6
|
-
* Memoised per context object: ownership resolution and
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* {@link invalidateNewFileCreatorsCache}.
|
|
7
|
+
* Memoised per context object: ownership resolution and cache-key
|
|
8
|
+
* fingerprints call this 2-3× per linted patch, and each call otherwise
|
|
9
|
+
* re-runs `detectNewFilesInDiff` over EVERY queue entry's diff. Keyed weakly
|
|
10
|
+
* so a discarded context frees its map; a caller that mutates a context
|
|
11
|
+
* entry in place must call {@link invalidateNewFileCreatorsCache}.
|
|
12
12
|
*/
|
|
13
13
|
/** The slice of a queue context the creators map is derived from. */
|
|
14
14
|
interface CreatorsContext {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
3
|
* New-file creators map for the patch queue, split out of
|
|
4
|
-
* `patch-lint-cross.ts`
|
|
5
|
-
* there so callers keep importing from `patch-lint.ts`
|
|
4
|
+
* `patch-lint-cross.ts` to stay under the per-file line budget.
|
|
5
|
+
* Re-exported from there so callers keep importing from `patch-lint.ts`
|
|
6
|
+
* unchanged.
|
|
6
7
|
*
|
|
7
|
-
* Memoised per context object: ownership resolution and
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* {@link invalidateNewFileCreatorsCache}.
|
|
8
|
+
* Memoised per context object: ownership resolution and cache-key
|
|
9
|
+
* fingerprints call this 2-3× per linted patch, and each call otherwise
|
|
10
|
+
* re-runs `detectNewFilesInDiff` over EVERY queue entry's diff. Keyed weakly
|
|
11
|
+
* so a discarded context frees its map; a caller that mutates a context
|
|
12
|
+
* entry in place must call {@link invalidateNewFileCreatorsCache}.
|
|
13
13
|
*/
|
|
14
14
|
import { detectNewFilesInDiff } from './patch-lint-diff.js';
|
|
15
15
|
const newFileCreatorsMemo = new WeakMap();
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Cross-patch lint infrastructure: the queue context builder, the
|
|
3
|
-
* duplicate-new-file-creation and forward-import rules, the
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* duplicate-new-file-creation and forward-import rules, the forward-import
|
|
4
|
+
* ignore-marker, and the per-specifier extractor that powers the
|
|
5
|
+
* forward-import rule.
|
|
6
6
|
*
|
|
7
7
|
* Separated from `patch-lint.ts` so the per-patch and cross-patch rule
|
|
8
|
-
* bodies stay within the
|
|
9
|
-
* re-exports the public surface so callers continue to import from a
|
|
10
|
-
*
|
|
8
|
+
* bodies each stay within the per-file line budget. `patch-lint.ts`
|
|
9
|
+
* re-exports the public surface so callers continue to import from a single
|
|
10
|
+
* module.
|
|
11
11
|
*/
|
|
12
12
|
import type { PatchLintIssue, PatchMetadata } from '../types/commands/index.js';
|
|
13
13
|
import type { FireForgeConfig, PatchPolicyConfig } from '../types/config.js';
|
|
@@ -61,8 +61,8 @@ export interface PatchQueueContext {
|
|
|
61
61
|
/**
|
|
62
62
|
* Optional patchPolicy config. When present, the forward-import rule
|
|
63
63
|
* validates its "Closest legal ordinal" suggestion against the importing
|
|
64
|
-
* patch's category range and suppresses it when no legal ordinal exists
|
|
65
|
-
|
|
64
|
+
* patch's category range and suppresses it when no legal ordinal exists.
|
|
65
|
+
* Absent = current behavior (hint always printed).
|
|
66
66
|
*/
|
|
67
67
|
patchPolicy?: PatchPolicyConfig;
|
|
68
68
|
}
|
|
@@ -82,10 +82,8 @@ export declare function buildPatchQueueContext(patchesDir: string, config?: Fire
|
|
|
82
82
|
export { collectNewFileCreatorsByPath, invalidateNewFileCreatorsCache, } from './patch-lint-creators.js';
|
|
83
83
|
/**
|
|
84
84
|
* Cross-patch lint rule: the same path is newly created (`--- /dev/null →
|
|
85
|
-
* +++ b/path`) by more than one patch.
|
|
86
|
-
*
|
|
87
|
-
* the same file, and the error surfaced only when import rolled back
|
|
88
|
-
* mid-apply.
|
|
85
|
+
* +++ b/path`) by more than one patch. Without it the collision surfaces
|
|
86
|
+
* only when import rolls back mid-apply.
|
|
89
87
|
*
|
|
90
88
|
* Reports one error per conflicting path, naming every patch that creates
|
|
91
89
|
* the path so the operator can pick the correct fix (`patch delete` or
|
|
@@ -156,14 +154,13 @@ export declare function findForwardImportIgnoreLines(source: string): Set<number
|
|
|
156
154
|
* Cross-patch lint rule: a patch imports a module that a later patch is
|
|
157
155
|
* responsible for creating.
|
|
158
156
|
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* the
|
|
166
|
-
* hatch.
|
|
157
|
+
* Deliberately conservative — `resource://` URLs are not resolved to engine
|
|
158
|
+
* file paths. Instead a cross-queue index of newly-created files is built,
|
|
159
|
+
* keyed by basename, and imports whose leaf matches an entry owned by a
|
|
160
|
+
* later-ordered patch are flagged. False positives from unrelated basename
|
|
161
|
+
* collisions (two directories both creating `Helper.sys.mjs`) are possible;
|
|
162
|
+
* the README documents the limitation and the inline ignore marker above is
|
|
163
|
+
* the escape hatch.
|
|
167
164
|
*
|
|
168
165
|
* Rules out:
|
|
169
166
|
* - Imports whose leaf matches a newly-created file in the *same* or an
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
3
|
* Cross-patch lint infrastructure: the queue context builder, the
|
|
4
|
-
* duplicate-new-file-creation and forward-import rules, the
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* duplicate-new-file-creation and forward-import rules, the forward-import
|
|
5
|
+
* ignore-marker, and the per-specifier extractor that powers the
|
|
6
|
+
* forward-import rule.
|
|
7
7
|
*
|
|
8
8
|
* Separated from `patch-lint.ts` so the per-patch and cross-patch rule
|
|
9
|
-
* bodies stay within the
|
|
10
|
-
* re-exports the public surface so callers continue to import from a
|
|
11
|
-
*
|
|
9
|
+
* bodies each stay within the per-file line budget. `patch-lint.ts`
|
|
10
|
+
* re-exports the public surface so callers continue to import from a single
|
|
11
|
+
* module.
|
|
12
12
|
*/
|
|
13
13
|
import { basename } from 'node:path';
|
|
14
14
|
import { toError } from '../utils/errors.js';
|
|
@@ -16,6 +16,7 @@ import { readText } from '../utils/fs.js';
|
|
|
16
16
|
import { verbose } from '../utils/logger.js';
|
|
17
17
|
import { stripJsComments } from '../utils/regex.js';
|
|
18
18
|
import { discoverPatches } from './patch-files.js';
|
|
19
|
+
import { lintPatchQueueBinaryBodies } from './patch-lint-binary.js';
|
|
19
20
|
import { collectNewFileCreatorsByPath } from './patch-lint-creators.js';
|
|
20
21
|
import { detectNewFilesInDiff, extractAddedLinesPerFile } from './patch-lint-diff.js';
|
|
21
22
|
import { lintPatchQueueModuleRegistrations } from './patch-lint-module-registration.js';
|
|
@@ -90,10 +91,8 @@ export async function buildPatchQueueContext(patchesDir, config) {
|
|
|
90
91
|
export { collectNewFileCreatorsByPath, invalidateNewFileCreatorsCache, } from './patch-lint-creators.js';
|
|
91
92
|
/**
|
|
92
93
|
* Cross-patch lint rule: the same path is newly created (`--- /dev/null →
|
|
93
|
-
* +++ b/path`) by more than one patch.
|
|
94
|
-
*
|
|
95
|
-
* the same file, and the error surfaced only when import rolled back
|
|
96
|
-
* mid-apply.
|
|
94
|
+
* +++ b/path`) by more than one patch. Without it the collision surfaces
|
|
95
|
+
* only when import rolls back mid-apply.
|
|
97
96
|
*
|
|
98
97
|
* Reports one error per conflicting path, naming every patch that creates
|
|
99
98
|
* the path so the operator can pick the correct fix (`patch delete` or
|
|
@@ -523,13 +522,13 @@ export function lintPatchQueueForwardImports(ctx) {
|
|
|
523
522
|
severity: 'warning',
|
|
524
523
|
});
|
|
525
524
|
}
|
|
526
|
-
// Registration-kind declarations
|
|
527
|
-
//
|
|
528
|
-
//
|
|
525
|
+
// Registration-kind declarations: a jar.mn packaging line,
|
|
526
|
+
// customElements registration, or actor registration referencing a
|
|
527
|
+
// later-created file. There is no import specifier to match — the
|
|
529
528
|
// declaration is "used" when the declared line (whitespace-trimmed)
|
|
530
|
-
// appears among the lines this patch adds to the declaring file AND
|
|
531
|
-
//
|
|
532
|
-
//
|
|
529
|
+
// appears among the lines this patch adds to the declaring file AND its
|
|
530
|
+
// `creates` resolves to a file a later-ordered patch actually creates
|
|
531
|
+
// (with `owner`, when set, naming that patch) — mirroring
|
|
533
532
|
// findMatchingStagedDependency for the import kind.
|
|
534
533
|
for (const registration of entry.metadata?.stagedDependencies?.registrations ?? []) {
|
|
535
534
|
const failure = findStagedRegistrationFailure(entry, registration, newFileIndex);
|
|
@@ -615,5 +614,6 @@ export function lintPatchQueue(ctx) {
|
|
|
615
614
|
...lintPatchQueueDuplicateCreations(ctx),
|
|
616
615
|
...lintPatchQueueForwardImports(ctx),
|
|
617
616
|
...lintPatchQueueModuleRegistrations(ctx),
|
|
617
|
+
...lintPatchQueueBinaryBodies(ctx),
|
|
618
618
|
];
|
|
619
619
|
}
|
|
@@ -2,11 +2,9 @@
|
|
|
2
2
|
* CSS patch-lint rules: introduced raw color values and non-tokenized
|
|
3
3
|
* custom-property references.
|
|
4
4
|
*
|
|
5
|
-
* Split out of `patch-lint.ts` so
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* cross-patch rule families. `patch-lint.ts` re-exports `lintPatchedCss`
|
|
9
|
-
* so existing callers keep importing from the single module.
|
|
5
|
+
* Split out of `patch-lint.ts` so each rule family stays within the
|
|
6
|
+
* per-file line budget; `patch-lint.ts` re-exports `lintPatchedCss` so
|
|
7
|
+
* existing callers keep importing from the single module.
|
|
10
8
|
*/
|
|
11
9
|
import type { PatchLintIssue } from '../types/commands/index.js';
|
|
12
10
|
import type { FireForgeConfig } from '../types/config.js';
|
|
@@ -3,11 +3,9 @@
|
|
|
3
3
|
* CSS patch-lint rules: introduced raw color values and non-tokenized
|
|
4
4
|
* custom-property references.
|
|
5
5
|
*
|
|
6
|
-
* Split out of `patch-lint.ts` so
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* cross-patch rule families. `patch-lint.ts` re-exports `lintPatchedCss`
|
|
10
|
-
* so existing callers keep importing from the single module.
|
|
6
|
+
* Split out of `patch-lint.ts` so each rule family stays within the
|
|
7
|
+
* per-file line budget; `patch-lint.ts` re-exports `lintPatchedCss` so
|
|
8
|
+
* existing callers keep importing from the single module.
|
|
11
9
|
*/
|
|
12
10
|
import { join } from 'node:path';
|
|
13
11
|
import { toError } from '../utils/errors.js';
|
|
@@ -83,12 +81,12 @@ function checkRawColorValues(file, rawCss, addedLinesByFile, addedLineNumbersByF
|
|
|
83
81
|
// Check only introduced raw color values when diff context is available.
|
|
84
82
|
// Skip files on the raw-color allowlist (exact path or basename match) and
|
|
85
83
|
// auto-exempt files under `browser/branding/` — those are the fork's
|
|
86
|
-
// visual identity assets (app-about dialogs, installer pages, branded
|
|
87
|
-
//
|
|
88
|
-
// design-decision layer the design-token system does not govern.
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
//
|
|
84
|
+
// visual identity assets (app-about dialogs, installer pages, branded CSS
|
|
85
|
+
// copied from Firefox's `unofficial` template) and belong to the
|
|
86
|
+
// design-decision layer the design-token system does not govern. Without
|
|
87
|
+
// the auto-exemption, every first-time setup's copied CSS fails
|
|
88
|
+
// `raw-color-value` with no actionable fix short of listing each path in
|
|
89
|
+
// `rawColorAllowlist`.
|
|
92
90
|
const allowlist = config?.patchLint?.rawColorAllowlist;
|
|
93
91
|
const isAllowlisted = allowlist?.some((entry) => file === entry || file.endsWith('/' + entry));
|
|
94
92
|
const isBranding = file.startsWith('browser/branding/');
|
|
@@ -128,19 +126,16 @@ function checkRawColorValues(file, rawCss, addedLinesByFile, addedLineNumbersByF
|
|
|
128
126
|
*/
|
|
129
127
|
function checkTokenPrefixViolations(file, cssContent, addedLinesByFile, tokenContext, issues) {
|
|
130
128
|
// Check for non-tokenized custom properties. A variable that is both
|
|
131
|
-
// declared and consumed inside the same file is auto-exempted as a
|
|
132
|
-
//
|
|
129
|
+
// declared and consumed inside the same file is auto-exempted as a runtime
|
|
130
|
+
// state channel (see furnace.json → runtimeVariables).
|
|
133
131
|
//
|
|
134
132
|
// When diff context is available, scope the `var(...)` scan to
|
|
135
|
-
// added/modified lines only. `cssContent` (full-file) is still the
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
// upstream file already carried, because the scanner saw the full
|
|
142
|
-
// applied file and flagged each inherited reference as if the fork
|
|
143
|
-
// had introduced it.
|
|
133
|
+
// added/modified lines only. `cssContent` (full-file) is still the source
|
|
134
|
+
// of `localDeclarations` so vars declared anywhere in the file are
|
|
135
|
+
// recognised as same-file refs regardless of where the consuming `var(...)`
|
|
136
|
+
// appears. Without the scoping, a small edit to a Furnace override of a
|
|
137
|
+
// stock component (e.g. moz-card) produces a `token-prefix-violation` for
|
|
138
|
+
// every stock `var(--moz-card-*)` the upstream file already carried.
|
|
144
139
|
if (tokenContext) {
|
|
145
140
|
const declarationPattern = /(?:^|[{;,\s])(--[\w-]+)\s*:/g;
|
|
146
141
|
const localDeclarations = new Set();
|