@hominis/fireforge 0.46.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +11 -11
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
3
|
* Recognizes the one shape where the undefined-identifier hint sends the
|
|
4
|
-
* operator at the wrong remedy
|
|
4
|
+
* operator at the wrong remedy, and where taking that remedy would mask a
|
|
5
5
|
* real bug.
|
|
6
6
|
*
|
|
7
7
|
* The shape: helpers are hoisted out of duplicated test files into a new
|
|
8
8
|
* `head_settings.js` that a managed `head.js` pulls in with
|
|
9
9
|
* `loadSubScript`. Until that companion is exported it belongs to no patch,
|
|
10
|
-
* so the per-patch checkJs program
|
|
11
|
-
* roots
|
|
10
|
+
* so the per-patch checkJs program, which only ever loads patch-owned
|
|
11
|
+
* roots, cannot see any of its declarations. Every use of every hoisted
|
|
12
12
|
* helper is then reported as `Cannot find name`, and the generic hint
|
|
13
13
|
* offers three remedies of which the shim is the easiest: adding the
|
|
14
|
-
* globals to `extraShim` makes all of the warnings disappear
|
|
14
|
+
* globals to `extraShim` makes all of the warnings disappear and makes a
|
|
15
15
|
* genuinely missing helper undetectable forever after.
|
|
16
16
|
*
|
|
17
|
-
* The warnings themselves are correct
|
|
18
|
-
* of a file that is in no patch. Only the advice is wrong.
|
|
19
|
-
* already knows ownership, so when every undefined name in a file
|
|
20
|
-
* declared at the top level of an
|
|
21
|
-
* it can name that file and the adoption command instead.
|
|
17
|
+
* The warnings themselves are correct: they are the per-patch program's
|
|
18
|
+
* honest view of a file that is in no patch. Only the advice is wrong.
|
|
19
|
+
* FireForge already knows ownership, so when every undefined name in a file
|
|
20
|
+
* is declared at the top level of an unmanaged file that a managed head
|
|
21
|
+
* loads, it can name that file and the adoption command instead.
|
|
22
22
|
*
|
|
23
|
-
* Detection is
|
|
24
|
-
* be reachable from an actual `loadSubScript` call, and
|
|
23
|
+
* Detection is conservative on both halves: a companion must
|
|
24
|
+
* be reachable from an actual `loadSubScript` call, and every undefined
|
|
25
25
|
* name must resolve inside it. One unresolved name means the file may
|
|
26
26
|
* genuinely be missing a helper, and the generic hint stays.
|
|
27
27
|
*/
|
|
@@ -34,13 +34,13 @@ import { UNDEFINED_IDENTIFIER_HINT } from './typecheck-shim.js';
|
|
|
34
34
|
* The mochitest idiom is
|
|
35
35
|
* `Services.scriptloader.loadSubScript(getRootDirectory(gTestPath) + "head_settings.js", this)`,
|
|
36
36
|
* so the useful signal is the `.js` literal inside the call, not a
|
|
37
|
-
* resolvable URL
|
|
37
|
+
* resolvable URL. The path half is computed at runtime.
|
|
38
38
|
*/
|
|
39
39
|
export function findLoadSubScriptTargets(source) {
|
|
40
40
|
const targets = [];
|
|
41
41
|
// Scanned to the statement terminator rather than to a closing paren:
|
|
42
42
|
// the idiomatic argument is itself a call (`getRootDirectory(gTestPath) +
|
|
43
|
-
// "head_settings.js"`), so a non-greedy `\)` stops on the
|
|
43
|
+
// "head_settings.js"`), so a non-greedy `\)` stops on the inner paren and
|
|
44
44
|
// never reaches the literal.
|
|
45
45
|
for (const call of source.matchAll(/loadSubScript\s*\(/g)) {
|
|
46
46
|
const from = call.index + call[0].length;
|
|
@@ -60,7 +60,7 @@ const CALL_SCAN_LIMIT = 400;
|
|
|
60
60
|
* Top-level declaration names in a script-scope file.
|
|
61
61
|
*
|
|
62
62
|
* Regex rather than a TS program on purpose: this runs only to decide the
|
|
63
|
-
*
|
|
63
|
+
* wording of a hint, the file is outside every program the
|
|
64
64
|
* pass built, and a missed declaration degrades to the generic hint rather
|
|
65
65
|
* than to a wrong answer. Matching is anchored at column zero so a nested
|
|
66
66
|
* declaration inside a function body is not mistaken for a global.
|
|
@@ -93,8 +93,8 @@ function extractUndefinedIdentifier(message) {
|
|
|
93
93
|
* Resolves the unmanaged companions reachable from a set of managed head
|
|
94
94
|
* files, given a reader for repo-relative file content.
|
|
95
95
|
*
|
|
96
|
-
* A candidate qualifies only when it is
|
|
97
|
-
* can be read
|
|
96
|
+
* A candidate qualifies only when it is not in `ownedFiles` and its content
|
|
97
|
+
* can be read. An unreadable or absent target is simply not a companion,
|
|
98
98
|
* and the generic hint applies.
|
|
99
99
|
*
|
|
100
100
|
* @param heads - Repo-relative managed head files, with their sources
|
|
@@ -129,10 +129,10 @@ export async function resolveUnmanagedCompanions(heads, ownedFiles, readFile) {
|
|
|
129
129
|
* The replacement hint, when every undefined name resolves in one
|
|
130
130
|
* unmanaged companion.
|
|
131
131
|
*
|
|
132
|
-
* States the ownership fact first (
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
132
|
+
* States the ownership fact first (the diagnosis), then the adoption
|
|
133
|
+
* command, and explicitly rules the shim out. The shim is what an operator
|
|
134
|
+
* reaches for by default here, and it is the one remedy that permanently
|
|
135
|
+
* hides a genuinely missing helper.
|
|
136
136
|
*/
|
|
137
137
|
export function formatUnmanagedCompanionHint(companion) {
|
|
138
138
|
return (`(undefined identifier — every one of them is declared in ${companion.file}, which ` +
|
|
@@ -143,7 +143,7 @@ export function formatUnmanagedCompanionHint(companion) {
|
|
|
143
143
|
`missing helper with them.)`);
|
|
144
144
|
}
|
|
145
145
|
/**
|
|
146
|
-
* Picks the companion that explains
|
|
146
|
+
* Picks the companion that explains every undefined identifier in
|
|
147
147
|
* `messages`, or undefined when none does.
|
|
148
148
|
*
|
|
149
149
|
* @param messages - Diagnostic messages reported for one file
|
|
@@ -155,16 +155,16 @@ export function explainUndefinedIdentifiers(messages, companions) {
|
|
|
155
155
|
.filter((name) => name !== undefined);
|
|
156
156
|
if (names.length === 0)
|
|
157
157
|
return undefined;
|
|
158
|
-
// Only the undefined-identifier diagnostics are explained here
|
|
159
|
-
// carrying
|
|
158
|
+
// Only the undefined-identifier diagnostics are explained here. A file
|
|
159
|
+
// carrying other type errors still gets those reported untouched.
|
|
160
160
|
return companions.find((companion) => names.every((name) => companion.declarations.has(name)));
|
|
161
161
|
}
|
|
162
162
|
/**
|
|
163
|
-
* Reads the head files in the owned test set and resolves the
|
|
163
|
+
* Reads the head files in the owned test set and resolves the unmanaged
|
|
164
164
|
* companions they pull in with `loadSubScript`. Hoisting shared helpers
|
|
165
165
|
* into such a companion leaves it unowned until export, and every use of
|
|
166
166
|
* every helper then reports `Cannot find name` from an honest per-patch
|
|
167
|
-
* program
|
|
167
|
+
* program. See `patch-lint-unmanaged-companion.ts` for why the generic
|
|
168
168
|
* hint is actively harmful there.
|
|
169
169
|
*
|
|
170
170
|
* Best-effort: an unreadable head simply contributes no companions.
|
|
@@ -195,7 +195,7 @@ export async function collectUnmanagedCompanions(repoDir, files, ownedFiles) {
|
|
|
195
195
|
}
|
|
196
196
|
/**
|
|
197
197
|
* Swaps the generic undefined-identifier hint for the ownership hint when
|
|
198
|
-
* one unmanaged companion explains
|
|
198
|
+
* one unmanaged companion explains every undefined name in the file. Any
|
|
199
199
|
* other issue in the list is returned untouched.
|
|
200
200
|
*/
|
|
201
201
|
export function retargetUnmanagedCompanionHints(issues, companions) {
|
|
@@ -6,8 +6,8 @@ export * from './patch-lint-cross.js';
|
|
|
6
6
|
export { buildModifiedFileAdditionsFromDiff, detectNewFilesInDiff } from './patch-lint-diff.js';
|
|
7
7
|
export { lintPatchedCss };
|
|
8
8
|
/**
|
|
9
|
-
* Canonical `[check] file: message` rendering of a patch-lint issue
|
|
10
|
-
* one string shape every reporter and refusal message uses, so operators
|
|
9
|
+
* Canonical `[check] file: message` rendering of a patch-lint issue. It is
|
|
10
|
+
* the one string shape every reporter and refusal message uses, so operators
|
|
11
11
|
* can grep one format across lint output and refusal details.
|
|
12
12
|
*/
|
|
13
13
|
export declare function formatPatchLintIssue(issue: Pick<PatchLintIssue, 'check' | 'file' | 'message'>): string;
|
|
@@ -38,27 +38,28 @@ export declare function hasBrowserChromeAssertion(strippedContent: string): bool
|
|
|
38
38
|
*/
|
|
39
39
|
export declare function commentStyleForFile(file: string): CommentStyle | null;
|
|
40
40
|
/**
|
|
41
|
-
* Decides whether a
|
|
42
|
-
* `missing-license-header` rule.
|
|
43
|
-
* `lintNewFileHeaders` (the rule) and `autoFixLicenseHeaders` (the
|
|
41
|
+
* Decides whether a new file's leading header satisfies the
|
|
42
|
+
* `missing-license-header` rule. It is the single owner of the acceptance
|
|
43
|
+
* policy: `lintNewFileHeaders` (the rule) and `autoFixLicenseHeaders` (the
|
|
44
44
|
* interactive export fixer) must agree, or the fixer offers to stack a
|
|
45
45
|
* second header onto a file the lint already accepts.
|
|
46
46
|
*
|
|
47
47
|
* Accepted shapes, in order:
|
|
48
|
-
* - the project's own header for the file's comment style
|
|
49
|
-
* - under `browser/branding/`,
|
|
48
|
+
* - the project's own header for the file's comment style.
|
|
49
|
+
* - under `browser/branding/`, any recognised license header in the
|
|
50
50
|
* matching style: the setup-generated branding directory is copied from
|
|
51
51
|
* Firefox's `unofficial` template and arrives with Mozilla MPL-2.0
|
|
52
|
-
* headers
|
|
53
|
-
* even when the fork's own code is 0BSD / EUPL-1.2 / GPL-2.0-or-later
|
|
54
|
-
* - on an MPL-2.0 project, any recognised header in the matching style
|
|
52
|
+
* headers, legitimate for copyright purposes (the assets are Mozilla's)
|
|
53
|
+
* even when the fork's own code is 0BSD / EUPL-1.2 / GPL-2.0-or-later.
|
|
54
|
+
* - on an MPL-2.0 project, any recognised header in the matching style.
|
|
55
55
|
* - the verbatim upstream MPL-2.0 block header (`/* … *\/`, optionally
|
|
56
|
-
* behind a leading editor-directive comment)
|
|
56
|
+
* behind a leading editor-directive comment) regardless of the project
|
|
57
57
|
* license, on any file whose comment syntax is the block form (JS and
|
|
58
58
|
* CSS): a file copied from the Firefox tree legitimately keeps Mozilla's
|
|
59
59
|
* header for provenance in an EUPL/GPL/0BSD project too. Only the block
|
|
60
|
-
* form is accepted
|
|
61
|
-
*
|
|
60
|
+
* form is accepted, because the `// `-style MPL header is
|
|
61
|
+
* FireForge-generated rather than upstream provenance, and `hash`-style
|
|
62
|
+
* files (FTL) stay excluded
|
|
62
63
|
* because `/* … *\/` is not a comment there.
|
|
63
64
|
*
|
|
64
65
|
* @param file - Engine-relative path of the new file
|
|
@@ -88,7 +89,7 @@ export declare function lintNewFileHeaders(repoDir: string, newFiles: string[],
|
|
|
88
89
|
* @param patchOwnedFiles - Optional set of patch-owned `.sys.mjs` paths for scoped JSDoc enforcement
|
|
89
90
|
* @param patchOwnedChromeScripts - Optional set of patch-owned chrome
|
|
90
91
|
* subscripts (`.js` non-`.sys.mjs`) for scoped chrome-script JSDoc
|
|
91
|
-
* enforcement. Built by {@link resolvePatchOwnedChromeScripts}
|
|
92
|
+
* enforcement. Built by {@link resolvePatchOwnedChromeScripts}. Passed
|
|
92
93
|
* separately from `patchOwnedFiles` so the `runCheckJs` consumer (which
|
|
93
94
|
* only accepts `.sys.mjs`) is not silently broadened.
|
|
94
95
|
* @returns Array of lint issues
|
|
@@ -121,7 +122,7 @@ export type PatchSizeTierDecision = {
|
|
|
121
122
|
* Decides which `large-patch-lines` threshold tier applies to a patch.
|
|
122
123
|
* Exported so `runPatchLint` and the per-patch `lint` command can
|
|
123
124
|
* surface the tier choice to the operator *without* depending on
|
|
124
|
-
* `lintPatchSize`'s internal return shape
|
|
125
|
+
* `lintPatchSize`'s internal return shape. The rule itself stays a
|
|
125
126
|
* pure issues-array API, and the decision is computed separately for
|
|
126
127
|
* the sole purpose of reporting.
|
|
127
128
|
*
|
|
@@ -129,7 +130,7 @@ export type PatchSizeTierDecision = {
|
|
|
129
130
|
* The test tier beats branding because a table-driven regression test
|
|
130
131
|
* is legitimately large independent of whether the patch also claims
|
|
131
132
|
* branding shape, and the test-tier thresholds are already more
|
|
132
|
-
* permissive than branding
|
|
133
|
+
* permissive than branding, so "tests beat branding" is the
|
|
133
134
|
* defensive-for-tests choice.
|
|
134
135
|
*/
|
|
135
136
|
export declare function resolvePatchSizeTier(filesAffected: ReadonlyArray<string>, patchTier?: 'branding'): PatchSizeTierDecision;
|
|
@@ -148,7 +149,7 @@ export interface PatchSizeThresholds {
|
|
|
148
149
|
* Read-only view of the size thresholds a tier enforces.
|
|
149
150
|
* Public-API companion to {@link resolvePatchSizeTier} /
|
|
150
151
|
* {@link countNonBinaryDiffLines} so consumers can build waiver-freshness
|
|
151
|
-
* checks against the
|
|
152
|
+
* checks against the same numbers `large-patch-lines` /
|
|
152
153
|
* `large-patch-files` fire on instead of mirroring them.
|
|
153
154
|
*/
|
|
154
155
|
export declare function getPatchSizeThresholds(tier: 'general' | 'test' | 'branding'): PatchSizeThresholds;
|
|
@@ -181,7 +182,7 @@ export declare function lintModifiedFileHeaders(repoDir: string, affectedFiles:
|
|
|
181
182
|
export interface LintExportedPatchOptions {
|
|
182
183
|
/**
|
|
183
184
|
* Cross-patch context for ownership resolution. Present whenever the
|
|
184
|
-
* caller has a loaded patch queue
|
|
185
|
+
* caller has a loaded patch queue. Absent for the ad-hoc single-diff
|
|
185
186
|
* paths that have no queue to resolve against.
|
|
186
187
|
*/
|
|
187
188
|
patchQueueCtx?: import('./patch-lint-cross.js').PatchQueueContext;
|
|
@@ -197,7 +198,7 @@ export interface LintExportedPatchOptions {
|
|
|
197
198
|
* Explicit tier override, threaded from `PatchMetadata.tier`. When
|
|
198
199
|
* `"branding"` forces the branding thresholds on the
|
|
199
200
|
* `large-patch-lines` rule. Callers with a per-patch manifest context
|
|
200
|
-
* (re-export, per-patch lint) should pass this
|
|
201
|
+
* (re-export, per-patch lint) should pass this. Aggregate-mode callers
|
|
201
202
|
* without a specific patch context omit it and fall through to
|
|
202
203
|
* auto-detection.
|
|
203
204
|
*/
|
|
@@ -207,12 +208,12 @@ export interface LintExportedPatchOptions {
|
|
|
207
208
|
* The ad-hoc `fireforge lint <files>` path passes a cross-patch file
|
|
208
209
|
* list that does not correspond to a single patch, so it suppresses the
|
|
209
210
|
* synthetic combined-list size check here and re-evaluates the size
|
|
210
|
-
* rules per owning patch instead
|
|
211
|
+
* rules per owning patch instead, never synthesising a phantom
|
|
211
212
|
* oversized patch from the operator's file selection.
|
|
212
213
|
*/
|
|
213
214
|
skipPatchSize?: boolean;
|
|
214
215
|
/**
|
|
215
|
-
* Restrict checkJs diagnostics to these repo-relative files
|
|
216
|
+
* Restrict checkJs diagnostics to these repo-relative files. Module
|
|
216
217
|
* resolution still spans every owned file in `patchQueueCtx`. Export and
|
|
217
218
|
* re-export pass the patch under export so cross-patch `resource:///`
|
|
218
219
|
* imports resolve against the whole queue while only that patch's
|
|
@@ -221,15 +222,15 @@ export interface LintExportedPatchOptions {
|
|
|
221
222
|
checkJsReportScope?: ReadonlySet<string>;
|
|
222
223
|
/**
|
|
223
224
|
* Pre-computed checkJs issues for this patch. When provided, the internal
|
|
224
|
-
* checkJs invocation is skipped and these are appended verbatim
|
|
225
|
+
* checkJs invocation is skipped and these are appended verbatim: the
|
|
225
226
|
* per-patch lint path builds one queue-wide checkJs program and
|
|
226
227
|
* attributes findings per patch instead of rebuilding per patch.
|
|
227
228
|
*/
|
|
228
229
|
precomputedCheckJs?: readonly PatchLintIssue[];
|
|
229
230
|
/**
|
|
230
|
-
* Invoked with the issues
|
|
231
|
-
* when any were. Suppression semantics are unchanged
|
|
232
|
-
*
|
|
231
|
+
* Invoked with the issues dropped by the `ignoreChecks` waiver filter,
|
|
232
|
+
* when any were. Suppression semantics are unchanged (the returned issue
|
|
233
|
+
* list still excludes them), but the caller can report
|
|
233
234
|
* the measurement a waived size finding carried (per-patch NOTICE lines
|
|
234
235
|
* and the `--report` JSON) instead of losing it entirely.
|
|
235
236
|
*/
|
|
@@ -242,7 +243,7 @@ export interface LintExportedPatchOptions {
|
|
|
242
243
|
* @param affectedFiles - File paths (relative to repoDir) affected by the patch
|
|
243
244
|
* @param diffContent - Raw unified diff string
|
|
244
245
|
* @param config - Project configuration
|
|
245
|
-
* @param options - Optional context and behaviour switches
|
|
246
|
+
* @param options - Optional context and behaviour switches. See
|
|
246
247
|
* {@link LintExportedPatchOptions}. Every optional input lives here
|
|
247
248
|
* rather than in a positional tail: four of the five call sites had to
|
|
248
249
|
* pass `undefined` placeholders to reach the one member they wanted.
|
|
@@ -27,7 +27,7 @@ import { invokePatchLintPrettier } from './patch-lint-prettier.js';
|
|
|
27
27
|
export * from './patch-lint-cross.js';
|
|
28
28
|
export { buildModifiedFileAdditionsFromDiff, detectNewFilesInDiff } from './patch-lint-diff.js';
|
|
29
29
|
// The CSS rule bodies live in `patch-lint-css.ts` (same per-file-budget
|
|
30
|
-
// split as the other rule families)
|
|
30
|
+
// split as the other rule families). Re-export the imported binding so
|
|
31
31
|
// callers and tests keep importing `lintPatchedCss` from this module.
|
|
32
32
|
export { lintPatchedCss };
|
|
33
33
|
// ---------------------------------------------------------------------------
|
|
@@ -48,8 +48,8 @@ function countContentLines(content) {
|
|
|
48
48
|
return lines.length;
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
|
-
* Canonical `[check] file: message` rendering of a patch-lint issue
|
|
52
|
-
* one string shape every reporter and refusal message uses, so operators
|
|
51
|
+
* Canonical `[check] file: message` rendering of a patch-lint issue. It is
|
|
52
|
+
* the one string shape every reporter and refusal message uses, so operators
|
|
53
53
|
* can grep one format across lint output and refusal details.
|
|
54
54
|
*/
|
|
55
55
|
export function formatPatchLintIssue(issue) {
|
|
@@ -95,8 +95,8 @@ const PATCH_LINE_THRESHOLDS = {
|
|
|
95
95
|
* `browser/branding/<name>/` subtree.
|
|
96
96
|
*
|
|
97
97
|
* Calibrated against a fresh-fork branding export, which lands around
|
|
98
|
-
* 15
|
|
99
|
-
* copied upstream CSS). That is the
|
|
98
|
+
* 15-16k lines (localized brand.ftl across many locales + SVG path data +
|
|
99
|
+
* copied upstream CSS). That is the minimum branding diff, so it must
|
|
100
100
|
* surface as a soft `notice` rather than a `warning`: the warning band
|
|
101
101
|
* sits above it with ~13% headroom, and the error band at roughly 2× the
|
|
102
102
|
* baseline, where non-branding work is probably bundled in.
|
|
@@ -111,7 +111,7 @@ const PATCH_LINE_THRESHOLDS = {
|
|
|
111
111
|
/**
|
|
112
112
|
* File-count thresholds for the `large-patch-files` rule, mirroring the tier
|
|
113
113
|
* shape of {@link PATCH_LINE_THRESHOLDS}. A single warning-only threshold
|
|
114
|
-
* per tier is intentional
|
|
114
|
+
* per tier is intentional: file count expresses scope, not blast radius,
|
|
115
115
|
* and there is no error band that would block export.
|
|
116
116
|
*
|
|
117
117
|
* The branding tier sits well above the typical floor because branding
|
|
@@ -122,7 +122,7 @@ const PATCH_LINE_THRESHOLDS = {
|
|
|
122
122
|
* genuinely bloated patch.
|
|
123
123
|
*
|
|
124
124
|
* Test tier matches general because a test-only patch rarely touches many
|
|
125
|
-
* files (a single regression test usually adds 1
|
|
125
|
+
* files (a single regression test usually adds 1-3 fixtures). The elevation
|
|
126
126
|
* in {@link PATCH_LINE_THRESHOLDS.test} addresses big table-driven test
|
|
127
127
|
* bodies, not file fan-out.
|
|
128
128
|
*/
|
|
@@ -145,10 +145,10 @@ const SPLIT_HINT = 'Consider splitting into smaller, focused patches — ' +
|
|
|
145
145
|
* branding patches legitimately need to touch to register the new branding
|
|
146
146
|
* flavor with the top-level configure. A predicate requiring every file to
|
|
147
147
|
* live under `browser/branding/` drops a branding patch that also touches
|
|
148
|
-
* `browser/moz.configure`
|
|
148
|
+
* `browser/moz.configure` (the canonical registration point) into the
|
|
149
149
|
* general lint tier.
|
|
150
150
|
*
|
|
151
|
-
*
|
|
151
|
+
* Narrow on purpose: add entries only when a genuine branding patch
|
|
152
152
|
* cannot be expressed without a specific registration sibling. Pinned
|
|
153
153
|
* against ESR 140.x conventions at time of writing.
|
|
154
154
|
*/
|
|
@@ -159,7 +159,7 @@ const BRANDING_REGISTRATION_FILES = new Set([
|
|
|
159
159
|
/**
|
|
160
160
|
* Returns true when a patch qualifies for the branding threshold tier:
|
|
161
161
|
* every file lives either under `browser/branding/` or in the narrow
|
|
162
|
-
* registration allowlist,
|
|
162
|
+
* registration allowlist, and the patch contains at least one file
|
|
163
163
|
* under `browser/branding/` (guard against a config-only patch
|
|
164
164
|
* accidentally qualifying as branding).
|
|
165
165
|
*
|
|
@@ -201,7 +201,7 @@ export function isTestFile(file) {
|
|
|
201
201
|
return /^(?:browser_|test_|xpcshell_).*\.js$/.test(basename);
|
|
202
202
|
}
|
|
203
203
|
/**
|
|
204
|
-
* Narrower scope than `isTestFile
|
|
204
|
+
* Narrower scope than `isTestFile`: only browser-chrome test files
|
|
205
205
|
* (`browser_*.js` under a `/test/` or `/tests/` directory). Excludes
|
|
206
206
|
* `head.js` and `head_*.js` test helpers.
|
|
207
207
|
*/
|
|
@@ -221,28 +221,29 @@ function isBrowserChromeTestFile(file) {
|
|
|
221
221
|
* Each alternative must sit at a call boundary: preceded by something that
|
|
222
222
|
* is not an identifier character, `.`, `#`, or `-`. A plain
|
|
223
223
|
* `strippedContent.includes(tok)` over `Assert.`, `ok(`, `is(`, `isnot(`,
|
|
224
|
-
* `isDeeply(` lets any identifier merely *ending* in one satisfy the gate
|
|
225
|
-
* `this.axis(3)` contains `is(`, `book(` contains `ok(`,
|
|
226
|
-
* `promiseIsDeeply(` contains `isDeeply(
|
|
224
|
+
* `isDeeply(` lets any identifier merely *ending* in one satisfy the gate:
|
|
225
|
+
* `this.axis(3)` contains `is(`, `book(` contains `ok(`, and
|
|
226
|
+
* `promiseIsDeeply(` contains `isDeeply(`, so an assertion-free smoke test
|
|
227
227
|
* using any such call clears the floor.
|
|
228
228
|
*
|
|
229
|
-
* The namespaced arm must name a member
|
|
229
|
+
* The namespaced arm must name a member and a call. Matching the namespace
|
|
230
230
|
* and its dot alone re-opens the same hole from the other side:
|
|
231
231
|
* `SimpleTest` is mostly *harness* API, so `SimpleTest.finish()`,
|
|
232
232
|
* `SimpleTest.waitForExplicitFinish()` and `SimpleTest.requestCompleteLog()`
|
|
233
|
-
* would each clear the floor on their own
|
|
233
|
+
* would each clear the floor on their own, which are the exact calls an
|
|
234
234
|
* assertion-free smoke test contains. The enumeration below is the
|
|
235
235
|
* mochitest/xpcshell assertion surface both namespaces share, and it is what
|
|
236
236
|
* the user-facing message names.
|
|
237
237
|
*
|
|
238
238
|
* Two qualified spellings of the bare four also count: `window.ok(...)` (the
|
|
239
|
-
* globals
|
|
240
|
-
*
|
|
241
|
-
* assertion-free. `SpecialPowers.ok(` stays excluded
|
|
239
|
+
* globals are window properties) and an optional-chained `win?.ok(...)`.
|
|
240
|
+
* Blocking those flags tests whose only assertions are real as
|
|
241
|
+
* assertion-free. `SpecialPowers.ok(` stays excluded: that is API surface,
|
|
242
242
|
* not an assertion.
|
|
243
243
|
*
|
|
244
|
-
*
|
|
245
|
-
* than resolvable sources, and the surrounding rule is a floor, not
|
|
244
|
+
* Textual rather than AST-based, on purpose: this runs over patch bodies
|
|
245
|
+
* rather than resolvable sources, and the surrounding rule is a floor, not
|
|
246
|
+
* a proof.
|
|
246
247
|
*/
|
|
247
248
|
const ASSERTION_MEMBERS = [
|
|
248
249
|
'ok',
|
|
@@ -263,7 +264,7 @@ const ASSERTION_MEMBERS = [
|
|
|
263
264
|
'stringContains',
|
|
264
265
|
'throws',
|
|
265
266
|
'rejects',
|
|
266
|
-
// `todo`, `todo_is`, `todo_isnot`, `info`-free
|
|
267
|
+
// `todo`, `todo_is`, `todo_isnot`, `info`-free: todo* record an expected
|
|
267
268
|
// failure, which is still a recorded assertion outcome.
|
|
268
269
|
'todo',
|
|
269
270
|
'todo_is',
|
|
@@ -290,27 +291,28 @@ export function commentStyleForFile(file) {
|
|
|
290
291
|
// License header lint
|
|
291
292
|
// ---------------------------------------------------------------------------
|
|
292
293
|
/**
|
|
293
|
-
* Decides whether a
|
|
294
|
-
* `missing-license-header` rule.
|
|
295
|
-
* `lintNewFileHeaders` (the rule) and `autoFixLicenseHeaders` (the
|
|
294
|
+
* Decides whether a new file's leading header satisfies the
|
|
295
|
+
* `missing-license-header` rule. It is the single owner of the acceptance
|
|
296
|
+
* policy: `lintNewFileHeaders` (the rule) and `autoFixLicenseHeaders` (the
|
|
296
297
|
* interactive export fixer) must agree, or the fixer offers to stack a
|
|
297
298
|
* second header onto a file the lint already accepts.
|
|
298
299
|
*
|
|
299
300
|
* Accepted shapes, in order:
|
|
300
|
-
* - the project's own header for the file's comment style
|
|
301
|
-
* - under `browser/branding/`,
|
|
301
|
+
* - the project's own header for the file's comment style.
|
|
302
|
+
* - under `browser/branding/`, any recognised license header in the
|
|
302
303
|
* matching style: the setup-generated branding directory is copied from
|
|
303
304
|
* Firefox's `unofficial` template and arrives with Mozilla MPL-2.0
|
|
304
|
-
* headers
|
|
305
|
-
* even when the fork's own code is 0BSD / EUPL-1.2 / GPL-2.0-or-later
|
|
306
|
-
* - on an MPL-2.0 project, any recognised header in the matching style
|
|
305
|
+
* headers, legitimate for copyright purposes (the assets are Mozilla's)
|
|
306
|
+
* even when the fork's own code is 0BSD / EUPL-1.2 / GPL-2.0-or-later.
|
|
307
|
+
* - on an MPL-2.0 project, any recognised header in the matching style.
|
|
307
308
|
* - the verbatim upstream MPL-2.0 block header (`/* … *\/`, optionally
|
|
308
|
-
* behind a leading editor-directive comment)
|
|
309
|
+
* behind a leading editor-directive comment) regardless of the project
|
|
309
310
|
* license, on any file whose comment syntax is the block form (JS and
|
|
310
311
|
* CSS): a file copied from the Firefox tree legitimately keeps Mozilla's
|
|
311
312
|
* header for provenance in an EUPL/GPL/0BSD project too. Only the block
|
|
312
|
-
* form is accepted
|
|
313
|
-
*
|
|
313
|
+
* form is accepted, because the `// `-style MPL header is
|
|
314
|
+
* FireForge-generated rather than upstream provenance, and `hash`-style
|
|
315
|
+
* files (FTL) stay excluded
|
|
314
316
|
* because `/* … *\/` is not a comment there.
|
|
315
317
|
*
|
|
316
318
|
* @param file - Engine-relative path of the new file
|
|
@@ -374,7 +376,7 @@ export async function lintNewFileHeaders(repoDir, newFiles, config) {
|
|
|
374
376
|
* @param patchOwnedFiles - Optional set of patch-owned `.sys.mjs` paths for scoped JSDoc enforcement
|
|
375
377
|
* @param patchOwnedChromeScripts - Optional set of patch-owned chrome
|
|
376
378
|
* subscripts (`.js` non-`.sys.mjs`) for scoped chrome-script JSDoc
|
|
377
|
-
* enforcement. Built by {@link resolvePatchOwnedChromeScripts}
|
|
379
|
+
* enforcement. Built by {@link resolvePatchOwnedChromeScripts}. Passed
|
|
378
380
|
* separately from `patchOwnedFiles` so the `runCheckJs` consumer (which
|
|
379
381
|
* only accepts `.sys.mjs`) is not silently broadened.
|
|
380
382
|
* @returns Array of lint issues
|
|
@@ -448,7 +450,7 @@ export async function lintPatchedJs(repoDir, affectedFiles, newFiles, config, pa
|
|
|
448
450
|
const chromeMode = config.patchLint?.chromeScriptJsDoc;
|
|
449
451
|
issues.push(...lintChromeScriptJsDocForFile(file, content, isChromeOwned, chromeMode));
|
|
450
452
|
// 3b. Assertion floor for browser-chrome tests touched by this patch
|
|
451
|
-
// (covers both newly introduced files and modified upstream tests
|
|
453
|
+
// (covers both newly introduced files and modified upstream tests:
|
|
452
454
|
// a patch that strips the last `Assert.equal` from an existing
|
|
453
455
|
// browser_*.js silently passed under the old `isNew` gate).
|
|
454
456
|
const assertionFloor = config.patchLint?.testAssertionFloor;
|
|
@@ -506,7 +508,7 @@ export function lintModificationComments(diffContent, config) {
|
|
|
506
508
|
* Decides which `large-patch-lines` threshold tier applies to a patch.
|
|
507
509
|
* Exported so `runPatchLint` and the per-patch `lint` command can
|
|
508
510
|
* surface the tier choice to the operator *without* depending on
|
|
509
|
-
* `lintPatchSize`'s internal return shape
|
|
511
|
+
* `lintPatchSize`'s internal return shape. The rule itself stays a
|
|
510
512
|
* pure issues-array API, and the decision is computed separately for
|
|
511
513
|
* the sole purpose of reporting.
|
|
512
514
|
*
|
|
@@ -514,7 +516,7 @@ export function lintModificationComments(diffContent, config) {
|
|
|
514
516
|
* The test tier beats branding because a table-driven regression test
|
|
515
517
|
* is legitimately large independent of whether the patch also claims
|
|
516
518
|
* branding shape, and the test-tier thresholds are already more
|
|
517
|
-
* permissive than branding
|
|
519
|
+
* permissive than branding, so "tests beat branding" is the
|
|
518
520
|
* defensive-for-tests choice.
|
|
519
521
|
*/
|
|
520
522
|
export function resolvePatchSizeTier(filesAffected, patchTier) {
|
|
@@ -531,7 +533,7 @@ export function resolvePatchSizeTier(filesAffected, patchTier) {
|
|
|
531
533
|
* Read-only view of the size thresholds a tier enforces.
|
|
532
534
|
* Public-API companion to {@link resolvePatchSizeTier} /
|
|
533
535
|
* {@link countNonBinaryDiffLines} so consumers can build waiver-freshness
|
|
534
|
-
* checks against the
|
|
536
|
+
* checks against the same numbers `large-patch-lines` /
|
|
535
537
|
* `large-patch-files` fire on instead of mirroring them.
|
|
536
538
|
*/
|
|
537
539
|
export function getPatchSizeThresholds(tier) {
|
|
@@ -558,7 +560,7 @@ export function lintPatchSize(filesAffected, lineCount, patchTier) {
|
|
|
558
560
|
// thresholds because a big regression test is legitimate (table-driven
|
|
559
561
|
// harnesses run into the thousands of lines). Branding patches get their
|
|
560
562
|
// own tier so a first export of setup-generated branding does not fire the
|
|
561
|
-
// general hard limit
|
|
563
|
+
// general hard limit. See `PATCH_LINE_THRESHOLDS.branding` and
|
|
562
564
|
// `PATCH_FILES_THRESHOLDS.branding` above. An explicit `patchTier` opt-in
|
|
563
565
|
// forces branding even when `isBrandingOnlyPatch` cannot reach the patch's
|
|
564
566
|
// actual shape (a branding patch that also touches a non-allowlisted
|
|
@@ -654,7 +656,7 @@ export async function lintModifiedFileHeaders(repoDir, affectedFiles, newFiles)
|
|
|
654
656
|
* @param affectedFiles - File paths (relative to repoDir) affected by the patch
|
|
655
657
|
* @param diffContent - Raw unified diff string
|
|
656
658
|
* @param config - Project configuration
|
|
657
|
-
* @param options - Optional context and behaviour switches
|
|
659
|
+
* @param options - Optional context and behaviour switches. See
|
|
658
660
|
* {@link LintExportedPatchOptions}. Every optional input lives here
|
|
659
661
|
* rather than in a positional tail: four of the five call sites had to
|
|
660
662
|
* pass `undefined` placeholders to reach the one member they wanted.
|
|
@@ -688,7 +690,7 @@ export async function lintExportedPatch(repoDir, affectedFiles, diffContent, con
|
|
|
688
690
|
];
|
|
689
691
|
if (options?.precomputedCheckJs) {
|
|
690
692
|
// Per-patch lint built one queue-wide program and already attributed
|
|
691
|
-
// this patch's findings
|
|
693
|
+
// this patch's findings, so append them instead of rebuilding the program.
|
|
692
694
|
issues.push(...options.precomputedCheckJs);
|
|
693
695
|
}
|
|
694
696
|
else if (config.patchLint?.checkJs) {
|
|
@@ -705,10 +707,10 @@ export async function lintExportedPatch(repoDir, affectedFiles, diffContent, con
|
|
|
705
707
|
}
|
|
706
708
|
}
|
|
707
709
|
}
|
|
708
|
-
// Prettier over patch-owned .sys.mjs.
|
|
709
|
-
// precomputedCheckJs short-circuit: it is a separate tool with
|
|
710
|
-
// gate, and a queue-wide program has no equivalent to share.
|
|
711
|
-
// the files
|
|
710
|
+
// Prettier over patch-owned .sys.mjs. Kept out of the
|
|
711
|
+
// precomputedCheckJs short-circuit on purpose: it is a separate tool with
|
|
712
|
+
// its own gate, and a queue-wide program has no equivalent to share.
|
|
713
|
+
// Scoped to the files this patch owns, run from engine/ so its own config
|
|
712
714
|
// and ignore file decide (see `patch-lint-prettier.ts`).
|
|
713
715
|
const prettierGate = config.patchLint?.prettier ?? 'off';
|
|
714
716
|
if (prettierGate !== 'off' && patchOwnedFiles.size > 0) {
|
|
@@ -717,7 +719,7 @@ export async function lintExportedPatch(repoDir, affectedFiles, diffContent, con
|
|
|
717
719
|
}
|
|
718
720
|
// Filter out ignored checks last so every rule still runs (keeps the
|
|
719
721
|
// implementation uniform) but suppressed rules do not surface. We do not
|
|
720
|
-
// reclassify severities
|
|
722
|
+
// reclassify severities: an ignored error simply drops, mirroring how
|
|
721
723
|
// inline `fireforge-ignore: <check>` markers work in the CSS and
|
|
722
724
|
// forward-import rules.
|
|
723
725
|
if (ignoreChecks && ignoreChecks.size > 0) {
|
|
@@ -23,7 +23,7 @@ export interface PatchDirectoryLockOptions {
|
|
|
23
23
|
* is held, so an unlocked caller silently reintroduces the interleaving the
|
|
24
24
|
* lock exists to prevent.
|
|
25
25
|
*
|
|
26
|
-
* Fail-open on an unreadable owner record,
|
|
26
|
+
* Fail-open on an unreadable owner record, on purpose: `withFileLock`
|
|
27
27
|
* treats writing that record as non-fatal, so a live holder can legitimately
|
|
28
28
|
* have no readable PID and asserting on its presence would fire on a lock we
|
|
29
29
|
* really do hold.
|
|
@@ -34,7 +34,7 @@ function formatWaitProgressLine(waitedMs, timeoutMs, holder) {
|
|
|
34
34
|
* is held, so an unlocked caller silently reintroduces the interleaving the
|
|
35
35
|
* lock exists to prevent.
|
|
36
36
|
*
|
|
37
|
-
* Fail-open on an unreadable owner record,
|
|
37
|
+
* Fail-open on an unreadable owner record, on purpose: `withFileLock`
|
|
38
38
|
* treats writing that record as non-fatal, so a live holder can legitimately
|
|
39
39
|
* have no readable PID and asserting on its presence would fire on a lock we
|
|
40
40
|
* really do hold.
|
|
@@ -56,7 +56,7 @@ export async function assertPatchDirectoryLockHeld(patchesDir, context) {
|
|
|
56
56
|
export async function withPatchDirectoryLock(patchesDir, operation, options = {}) {
|
|
57
57
|
const lockDir = join(patchesDir, PATCH_DIRECTORY_LOCK);
|
|
58
58
|
const { waitLockSeconds, command } = options;
|
|
59
|
-
// Tag whatever the
|
|
59
|
+
// Tag whatever the body throws so the catch below can tell it apart from a
|
|
60
60
|
// lock-acquire/release failure. Narrowing by origin rather than by error
|
|
61
61
|
// shape is what "the rewrap is for lock I/O" actually means: an errno test
|
|
62
62
|
// would still reclassify an EACCES raised while the body writes a .patch
|
|
@@ -90,10 +90,10 @@ export async function withPatchDirectoryLock(patchesDir, operation, options = {}
|
|
|
90
90
|
: {}),
|
|
91
91
|
// Reason first, remedy second. The remedy is waiting, not deleting: bulk
|
|
92
92
|
// exports/re-exports legitimately hold this lock for minutes, and
|
|
93
|
-
// FireForge reaps genuinely stale locks on its own
|
|
94
|
-
// while a holder is alive destroys a live lock. The leading
|
|
95
|
-
// a message contract
|
|
96
|
-
// holder identification.
|
|
93
|
+
// FireForge reaps genuinely stale locks on its own, and advice to
|
|
94
|
+
// `rm -rf` while a holder is alive destroys a live lock. The leading
|
|
95
|
+
// sentence is a message contract. Extend, do not reword. withFileLock
|
|
96
|
+
// appends the holder identification.
|
|
97
97
|
onTimeoutMessage: `Timed out waiting for another FireForge command mutating ${patchesDir}.\n` +
|
|
98
98
|
`Pass --wait-lock [seconds] to wait longer (bare --wait-lock waits up to 60 seconds). ` +
|
|
99
99
|
`FireForge removes genuinely stale locks automatically; only if no other fireforge ` +
|
|
@@ -105,7 +105,7 @@ export async function withPatchDirectoryLock(patchesDir, operation, options = {}
|
|
|
105
105
|
// reports an EACCES writing patches.json, a postcondition failure from
|
|
106
106
|
// renumberPatchesInManifest, or a plain TypeError from a FireForge bug
|
|
107
107
|
// as a "Patch Error" carrying three fixed remedies about Firefox-version
|
|
108
|
-
// compatibility and `fireforge reset
|
|
108
|
+
// compatibility and `fireforge reset`, none of which apply. Worse,
|
|
109
109
|
// src/cli.ts prints a stack only for non-FireForgeError throwables, so
|
|
110
110
|
// the rewrap moves real bugs into the branch that discards their stack.
|
|
111
111
|
if (bodyThrew && error === bodyFailure) {
|
|
@@ -114,7 +114,7 @@ export async function withPatchDirectoryLock(patchesDir, operation, options = {}
|
|
|
114
114
|
if (error instanceof FireForgeError) {
|
|
115
115
|
throw error;
|
|
116
116
|
}
|
|
117
|
-
// CommandError is the one class in src/errors/ that does
|
|
117
|
+
// CommandError is the one class in src/errors/ that does not extend
|
|
118
118
|
// FireForgeError: it is the sentinel carrying an already-rendered exit
|
|
119
119
|
// code to the entrypoint. The `instanceof FireForgeError` guard above
|
|
120
120
|
// misses it, so without this the exit code was replaced by PATCH_ERROR.
|