@hominis/fireforge 0.45.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +409 -446
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +21 -15
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +46 -0
- package/dist/src/cli-usage-error.js +81 -0
- package/dist/src/cli.d.ts +7 -2
- package/dist/src/cli.js +47 -47
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +3 -4
- package/dist/src/commands/build.js +27 -17
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +19 -0
- package/dist/src/commands/destructive-decision.js +31 -0
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -10
- package/dist/src/commands/doctor-check-core.js +0 -8
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
- package/dist/src/commands/doctor-orphaned-harness.js +14 -23
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +3 -1
- package/dist/src/commands/doctor.js +15 -16
- package/dist/src/commands/download.js +50 -37
- package/dist/src/commands/export-all.js +29 -12
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +29 -59
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +12 -12
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +7 -13
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +4 -6
- package/dist/src/commands/export-shared.d.ts +51 -32
- package/dist/src/commands/export-shared.js +17 -32
- package/dist/src/commands/export.js +14 -5
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
- package/dist/src/commands/furnace/authoring-config.js +19 -0
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +7 -12
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +6 -9
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +31 -15
- package/dist/src/commands/furnace/create-templates.js +20 -19
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +35 -29
- package/dist/src/commands/furnace/deploy.js +15 -6
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +17 -16
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +43 -34
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +15 -7
- package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
- package/dist/src/commands/furnace/remove-mutations.js +19 -19
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +4 -8
- package/dist/src/commands/furnace/rename-browser-test.js +10 -15
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +36 -36
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +19 -16
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
- package/dist/src/commands/furnace/test-file-name.js +39 -0
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/furnace/validation-output.d.ts +21 -9
- package/dist/src/commands/furnace/validation-output.js +3 -8
- package/dist/src/commands/import.js +22 -29
- package/dist/src/commands/lint-per-patch.d.ts +2 -2
- package/dist/src/commands/lint-per-patch.js +27 -12
- package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +5 -4
- package/dist/src/commands/lint.js +36 -36
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/manifest.js +1 -1
- package/dist/src/commands/package.js +4 -6
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +19 -20
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +23 -33
- package/dist/src/commands/patch/entry-projection.d.ts +13 -0
- package/dist/src/commands/patch/entry-projection.js +24 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
- package/dist/src/commands/patch/lint-ignore.js +33 -44
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +29 -15
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +41 -37
- package/dist/src/commands/patch/move-files.js +5 -14
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +35 -49
- package/dist/src/commands/patch/reorder.js +35 -48
- package/dist/src/commands/patch/split-plan.d.ts +7 -8
- package/dist/src/commands/patch/split-plan.js +10 -13
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +50 -48
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +22 -28
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +20 -30
- package/dist/src/commands/patch-rename-map.d.ts +19 -0
- package/dist/src/commands/patch-rename-map.js +36 -0
- package/dist/src/commands/pending-resolution.d.ts +15 -0
- package/dist/src/commands/pending-resolution.js +25 -0
- package/dist/src/commands/re-export-adjacent.d.ts +25 -3
- package/dist/src/commands/re-export-adjacent.js +40 -24
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +23 -27
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +33 -33
- package/dist/src/commands/re-export-files.d.ts +2 -3
- package/dist/src/commands/re-export-files.js +52 -44
- package/dist/src/commands/re-export-lint.d.ts +29 -30
- package/dist/src/commands/re-export-lint.js +36 -29
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +12 -9
- package/dist/src/commands/re-export-single.d.ts +23 -4
- package/dist/src/commands/re-export-single.js +39 -31
- package/dist/src/commands/re-export.js +35 -17
- package/dist/src/commands/rebase/abort.js +9 -14
- package/dist/src/commands/rebase/continue.js +20 -19
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +5 -5
- package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
- package/dist/src/commands/rebase/patch-loop.js +20 -24
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +21 -13
- package/dist/src/commands/run.d.ts +0 -13
- package/dist/src/commands/run.js +38 -51
- package/dist/src/commands/setup-support.d.ts +16 -4
- package/dist/src/commands/setup-support.js +20 -20
- package/dist/src/commands/setup.js +4 -10
- package/dist/src/commands/source.js +9 -2
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +6 -6
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +5 -5
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +25 -26
- package/dist/src/commands/test-build-phase.d.ts +3 -3
- package/dist/src/commands/test-build-phase.js +48 -24
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +4 -4
- package/dist/src/commands/test-modes.js +4 -5
- package/dist/src/commands/test-register.js +5 -3
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +40 -33
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +17 -17
- package/dist/src/commands/test-verdict.d.ts +19 -5
- package/dist/src/commands/test-verdict.js +26 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +73 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.d.ts +26 -0
- package/dist/src/commands/token-list.js +153 -0
- package/dist/src/commands/token.js +26 -10
- package/dist/src/commands/tree.js +26 -21
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +16 -16
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +17 -16
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -12
- package/dist/src/core/branding.js +6 -5
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +10 -7
- package/dist/src/core/build-audit-platform.d.ts +32 -3
- package/dist/src/core/build-audit-platform.js +153 -13
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +10 -9
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +57 -0
- package/dist/src/core/build-audit-skip.js +112 -0
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +21 -8
- package/dist/src/core/build-audit.js +142 -40
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +48 -31
- package/dist/src/core/build-baseline.js +20 -43
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +18 -17
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +14 -14
- package/dist/src/core/build-prepare.d.ts +4 -12
- package/dist/src/core/build-prepare.js +22 -26
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-paths.d.ts +2 -6
- package/dist/src/core/config-paths.js +4 -2
- package/dist/src/core/config-state.d.ts +0 -6
- package/dist/src/core/config-state.js +3 -21
- package/dist/src/core/config-validate-build-audit.d.ts +8 -0
- package/dist/src/core/config-validate-build-audit.js +80 -0
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +3 -3
- package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
- package/dist/src/core/config-validate-patch-policy.js +3 -3
- package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
- package/dist/src/core/config-validate-test-toolchains.js +4 -5
- package/dist/src/core/config-validate.js +22 -12
- package/dist/src/core/config.d.ts +12 -12
- package/dist/src/core/config.js +21 -25
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +20 -20
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +22 -23
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +5 -13
- package/dist/src/core/engine-precondition.js +5 -10
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +50 -54
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock-owner.d.ts +103 -0
- package/dist/src/core/file-lock-owner.js +259 -0
- package/dist/src/core/file-lock.d.ts +14 -19
- package/dist/src/core/file-lock.js +90 -128
- package/dist/src/core/firefox-cache.d.ts +13 -1
- package/dist/src/core/firefox-cache.js +61 -36
- package/dist/src/core/firefox-download.d.ts +15 -0
- package/dist/src/core/firefox-download.js +38 -22
- package/dist/src/core/firefox-extract.d.ts +8 -7
- package/dist/src/core/firefox-extract.js +45 -27
- package/dist/src/core/firefox.d.ts +34 -36
- package/dist/src/core/firefox.js +13 -44
- package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
- package/dist/src/core/furnace-apply-dry-run.js +2 -8
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
- package/dist/src/core/furnace-apply-helpers.js +28 -39
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +4 -4
- package/dist/src/core/furnace-apply.js +50 -29
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +5 -5
- package/dist/src/core/furnace-config.js +40 -53
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +9 -8
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +20 -0
- package/dist/src/core/furnace-dir-entry.js +21 -0
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +22 -19
- package/dist/src/core/furnace-operation.js +38 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.d.ts +18 -6
- package/dist/src/core/furnace-refresh.js +5 -8
- package/dist/src/core/furnace-registration-ast.d.ts +2 -3
- package/dist/src/core/furnace-registration-ast.js +9 -12
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +7 -6
- package/dist/src/core/furnace-registration.js +29 -36
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-scanner.js +3 -6
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +12 -12
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +18 -20
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +6 -4
- package/dist/src/core/git-base.js +29 -7
- package/dist/src/core/git-diff-new-file.d.ts +40 -0
- package/dist/src/core/git-diff-new-file.js +119 -0
- package/dist/src/core/git-diff.d.ts +13 -13
- package/dist/src/core/git-diff.js +121 -189
- package/dist/src/core/git-file-ops.d.ts +6 -13
- package/dist/src/core/git-file-ops.js +11 -35
- package/dist/src/core/git-readonly-index.d.ts +12 -14
- package/dist/src/core/git-readonly-index.js +12 -16
- package/dist/src/core/git-status.d.ts +9 -2
- package/dist/src/core/git-status.js +23 -11
- package/dist/src/core/git.d.ts +3 -9
- package/dist/src/core/git.js +28 -57
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +28 -27
- package/dist/src/core/history-log.d.ts +19 -0
- package/dist/src/core/history-log.js +29 -0
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -10
- package/dist/src/core/mach-error-hints.js +14 -14
- package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
- package/dist/src/core/mach-known-noise-filter.js +57 -56
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +17 -16
- package/dist/src/core/mach-python.d.ts +3 -0
- package/dist/src/core/mach-python.js +13 -7
- package/dist/src/core/mach-resource-shim.d.ts +24 -12
- package/dist/src/core/mach-resource-shim.js +124 -21
- package/dist/src/core/mach.d.ts +59 -73
- package/dist/src/core/mach.js +47 -115
- package/dist/src/core/marionette-port.d.ts +15 -30
- package/dist/src/core/marionette-port.js +46 -89
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +32 -50
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +17 -17
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +46 -42
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +13 -13
- package/dist/src/core/patch-apply.d.ts +13 -14
- package/dist/src/core/patch-apply.js +36 -42
- package/dist/src/core/patch-export-coverage.d.ts +0 -9
- package/dist/src/core/patch-export-coverage.js +1 -30
- package/dist/src/core/patch-export-update.d.ts +21 -4
- package/dist/src/core/patch-export-update.js +7 -6
- package/dist/src/core/patch-export.d.ts +20 -30
- package/dist/src/core/patch-export.js +55 -77
- package/dist/src/core/patch-files.d.ts +0 -4
- package/dist/src/core/patch-files.js +0 -11
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +12 -18
- package/dist/src/core/patch-lint-cache.d.ts +18 -2
- package/dist/src/core/patch-lint-cache.js +16 -19
- package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
- package/dist/src/core/patch-lint-checkjs.js +78 -64
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +5 -9
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +27 -19
- package/dist/src/core/patch-lint-cross.js +67 -110
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +15 -11
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +6 -6
- package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
- package/dist/src/core/patch-lint-forward-registration.js +210 -0
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +46 -46
- package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +7 -7
- package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
- package/dist/src/core/patch-lint-queue-types.js +12 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
- package/dist/src/core/patch-lint-staged-registration.js +90 -0
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +41 -35
- package/dist/src/core/patch-lint.js +52 -49
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +11 -11
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +35 -34
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +32 -21
- package/dist/src/core/patch-parse.js +40 -15
- package/dist/src/core/patch-policy.js +15 -27
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-source-metadata.d.ts +1 -3
- package/dist/src/core/patch-source-metadata.js +0 -4
- package/dist/src/core/patch-transform.d.ts +8 -16
- package/dist/src/core/patch-transform.js +13 -23
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +6 -6
- package/dist/src/core/rebase-session.d.ts +9 -15
- package/dist/src/core/rebase-session.js +13 -25
- package/dist/src/core/register-browser-content.js +3 -2
- package/dist/src/core/register-browser-test.js +2 -1
- package/dist/src/core/register-module.js +2 -1
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +8 -7
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +6 -5
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +38 -0
- package/dist/src/core/run-log-redact.js +69 -0
- package/dist/src/core/run-log.d.ts +21 -10
- package/dist/src/core/run-log.js +76 -27
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +4 -6
- package/dist/src/core/smoke-patterns.d.ts +5 -6
- package/dist/src/core/smoke-patterns.js +15 -20
- package/dist/src/core/state-file.d.ts +15 -4
- package/dist/src/core/state-file.js +14 -1
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +13 -12
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +40 -25
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +69 -69
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -23
- package/dist/src/core/test-stale-check.js +31 -30
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
- package/dist/src/core/test-xpcshell-retry.js +14 -11
- package/dist/src/core/token-category.d.ts +35 -2
- package/dist/src/core/token-category.js +67 -58
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +13 -25
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +56 -0
- package/dist/src/core/token-inventory.js +109 -0
- package/dist/src/core/token-manager.d.ts +4 -4
- package/dist/src/core/token-manager.js +22 -22
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +52 -53
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +23 -23
- package/dist/src/core/tree-cow.d.ts +3 -5
- package/dist/src/core/tree-cow.js +8 -8
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +39 -38
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +33 -33
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +12 -23
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +16 -28
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +28 -30
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +69 -16
- package/dist/src/errors/base.js +95 -26
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +26 -34
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/config.d.ts +0 -14
- package/dist/src/errors/config.js +13 -34
- package/dist/src/errors/download.d.ts +13 -0
- package/dist/src/errors/download.js +53 -24
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/furnace.js +8 -9
- package/dist/src/errors/git.d.ts +9 -9
- package/dist/src/errors/git.js +21 -31
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +11 -13
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +8 -8
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +155 -200
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +52 -19
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/index.d.ts +0 -1
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +4 -16
- package/dist/src/utils/assert.js +7 -24
- package/dist/src/utils/build-info.d.ts +6 -6
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +7 -6
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +10 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +15 -20
- package/dist/src/utils/hash.d.ts +12 -0
- package/dist/src/utils/hash.js +16 -0
- package/dist/src/utils/line-dispatch.d.ts +15 -0
- package/dist/src/utils/line-dispatch.js +48 -0
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +14 -20
- package/dist/src/utils/options.js +26 -27
- package/dist/src/utils/package-root.js +5 -14
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/platform.d.ts +0 -4
- package/dist/src/utils/process-group.d.ts +10 -9
- package/dist/src/utils/process-group.js +37 -36
- package/dist/src/utils/process.d.ts +70 -55
- package/dist/src/utils/process.js +129 -179
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +9 -9
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +26 -0
- package/dist/src/utils/sleep.js +31 -0
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +12 -49
- package/dist/src/utils/validation.js +26 -36
- package/docs/README.md +2 -2
- package/docs/configuration.md +163 -69
- package/docs/exit-codes.md +66 -49
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +414 -247
- package/docs/machine-output.md +58 -34
- package/docs/patch-workflow.md +48 -44
- package/docs/run-logs.md +72 -28
- package/docs/testing.md +105 -98
- package/docs/verification-trees.md +23 -22
- package/package.json +7 -6
- package/dist/src/commands/rebase.d.ts +0 -4
- package/dist/src/commands/rebase.js +0 -5
- package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
- package/dist/src/core/patch-artifact-normalize.js +0 -24
- package/dist/src/core/patch-lint-reexports.d.ts +0 -7
- package/dist/src/core/patch-lint-reexports.js +0 -8
- package/dist/src/core/wire-targets.d.ts +0 -7
- package/dist/src/core/wire-targets.js +0 -8
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Factored out of `patch-lint.ts` so the per-patch lint body and
|
|
7
7
|
* cross-patch lint body (in `patch-lint-cross.ts`) can both depend on
|
|
8
8
|
* the same diff walkers without inducing a circular import. Callers
|
|
9
|
-
* should keep importing these through `patch-lint.ts
|
|
9
|
+
* should keep importing these through `patch-lint.ts`. This file is
|
|
10
10
|
* an implementation detail. The actual line-walking lives in
|
|
11
11
|
* `parseDiffSections` (patch-parse.ts), the codebase's single diff walker.
|
|
12
12
|
*/
|
|
@@ -49,8 +49,8 @@ export function extractAddedLinesPerFile(diffContent) {
|
|
|
49
49
|
* Extracts 1-based post-patch line numbers of added lines per file from a
|
|
50
50
|
* unified diff. Walking each hunk with a new-file line counter (`+` and
|
|
51
51
|
* context lines advance it, `-` lines do not) lets rules that need
|
|
52
|
-
* full-file context
|
|
53
|
-
* boundary
|
|
52
|
+
* full-file context (e.g. comment masking across the context/added
|
|
53
|
+
* boundary) map the patch's additions onto the applied file.
|
|
54
54
|
*/
|
|
55
55
|
export function extractAddedLineNumbersPerFile(diffContent) {
|
|
56
56
|
const result = new Map();
|
|
@@ -84,7 +84,7 @@ export function extractAddedLineNumbersPerFile(diffContent) {
|
|
|
84
84
|
* `buildPatchQueueContext`.
|
|
85
85
|
*
|
|
86
86
|
* Matches buildPatchQueueContext's algorithm exactly: skip paths that are
|
|
87
|
-
* created by the diff
|
|
87
|
+
* created by the diff, since those are already covered by the `newFiles` map,
|
|
88
88
|
* which carries full content rather than only the added lines.
|
|
89
89
|
*
|
|
90
90
|
* @param diff - Unified diff content
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The `file-too-large` thresholds and their rendered message.
|
|
3
3
|
*
|
|
4
|
-
* Its own module for two reasons: the config validator needs the
|
|
4
|
+
* Its own module for two reasons: the config validator needs the defaults
|
|
5
5
|
* to validate an override triple against the merged result, and importing
|
|
6
6
|
* `patch-lint.ts` from `config-validate.ts` for a constant would draw an
|
|
7
7
|
* import edge (and a cycle) between the rule bodies and config parsing.
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
* On the vocabulary: the bands were `notice` / `warning` / `error` with the
|
|
10
10
|
* middle one described as a "soft limit". That description is false under
|
|
11
11
|
* the posture FireForge itself recommends for a release gate,
|
|
12
|
-
* `--max-warnings 0`, where a warning is a hard failure
|
|
12
|
+
* `--max-warnings 0`, where a warning is a hard failure, so a file at 751
|
|
13
13
|
* lines failed a gate with a message calling 750 soft. The message below
|
|
14
|
-
* says what the band
|
|
14
|
+
* says what the band is (a warning) and what a zero-warning gate does with
|
|
15
15
|
* it, and the thresholds are now tunable, so a project whose file-size
|
|
16
16
|
* policy differs has a dial instead of an argument.
|
|
17
17
|
*/
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* The `file-too-large` thresholds and their rendered message.
|
|
4
4
|
*
|
|
5
|
-
* Its own module for two reasons: the config validator needs the
|
|
5
|
+
* Its own module for two reasons: the config validator needs the defaults
|
|
6
6
|
* to validate an override triple against the merged result, and importing
|
|
7
7
|
* `patch-lint.ts` from `config-validate.ts` for a constant would draw an
|
|
8
8
|
* import edge (and a cycle) between the rule bodies and config parsing.
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
* On the vocabulary: the bands were `notice` / `warning` / `error` with the
|
|
11
11
|
* middle one described as a "soft limit". That description is false under
|
|
12
12
|
* the posture FireForge itself recommends for a release gate,
|
|
13
|
-
* `--max-warnings 0`, where a warning is a hard failure
|
|
13
|
+
* `--max-warnings 0`, where a warning is a hard failure, so a file at 751
|
|
14
14
|
* lines failed a gate with a message calling 750 soft. The message below
|
|
15
|
-
* says what the band
|
|
15
|
+
* says what the band is (a warning) and what a zero-warning gate does with
|
|
16
16
|
* it, and the thresholds are now tunable, so a project whose file-size
|
|
17
17
|
* policy differs has a dial instead of an argument.
|
|
18
18
|
*/
|
|
@@ -44,10 +44,10 @@ export function resolveFileSizeThresholds(overrides, isTest) {
|
|
|
44
44
|
export function formatFileTooLargeMessage(args) {
|
|
45
45
|
const { label, lineCount, thresholds, band, verb } = args;
|
|
46
46
|
if (band === 'error') {
|
|
47
|
-
return `${label} has ${
|
|
47
|
+
return `${label} has ${lineCount} lines (error threshold: ${thresholds.error}). Consider ${verb}.`;
|
|
48
48
|
}
|
|
49
|
-
return (`${label} has ${
|
|
50
|
-
`error threshold: ${
|
|
49
|
+
return (`${label} has ${lineCount} lines (warning threshold: ${thresholds.warning}, ` +
|
|
50
|
+
`error threshold: ${thresholds.error}). Consider ${verb}. ` +
|
|
51
51
|
`Reported as a ${band}, which a gate running --max-warnings 0 treats as a failure; ` +
|
|
52
52
|
`tune "patchLint.fileSizeThresholds" if these limits are wrong for this project.`);
|
|
53
53
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { PatchLintIssue } from '../types/commands/index.js';
|
|
2
|
+
import type { PatchQueueForwardRegistrationEntry, PatchQueueView } from './patch-lint-queue-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* One `support-files` entry, with the line the patch actually adds it on.
|
|
5
|
+
*
|
|
6
|
+
* The entry alone is not enough for the discharge command the rule prints:
|
|
7
|
+
* `--line` is compared, whitespace-trimmed, against the lines the patch
|
|
8
|
+
* adds, and a synthesised `support-files = ["<entry>"]` only ever matches a
|
|
9
|
+
* manifest whose array is single-line and single-entry. Carrying the source
|
|
10
|
+
* line keeps the remedy and the validation talking about the same text.
|
|
11
|
+
*/
|
|
12
|
+
export interface SupportFileEntry {
|
|
13
|
+
/** The entry as written inside the manifest (e.g. `fixtures/*.sqlite`). */
|
|
14
|
+
entry: string;
|
|
15
|
+
/** The first added line, whitespace-trimmed, that spells the entry out. */
|
|
16
|
+
line: string;
|
|
17
|
+
/**
|
|
18
|
+
* How many distinct added lines spell it out. Above one, the printed
|
|
19
|
+
* command quotes the first and says so: one declaration covers the file
|
|
20
|
+
* either way, because the declared check keys on file + creates.
|
|
21
|
+
*/
|
|
22
|
+
occurrences: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Extracts the `support-files` entries declared in `content`, each paired
|
|
26
|
+
* with the manifest line it is written on.
|
|
27
|
+
*
|
|
28
|
+
* Handles the TOML array on one line and spread over several, and the
|
|
29
|
+
* whitespace-separated `.ini` spelling. Anything else (a computed value, a
|
|
30
|
+
* shape this does not recognise) yields nothing, because a rule that
|
|
31
|
+
* guesses at a manifest it cannot parse refuses correct queues.
|
|
32
|
+
*
|
|
33
|
+
* Quoted tokens are matched per physical line rather than over the whole
|
|
34
|
+
* accumulated array body, so a multi-line array attributes each element to
|
|
35
|
+
* its own line. Entries are deduplicated: a manifest that lists the same
|
|
36
|
+
* file under two per-test sections needs one declaration, not two.
|
|
37
|
+
*/
|
|
38
|
+
export declare function extractSupportFileEntries(content: string): SupportFileEntry[];
|
|
39
|
+
/**
|
|
40
|
+
* Resolves one `support-files` entry, relative to its manifest's directory,
|
|
41
|
+
* into a matcher over engine-relative paths.
|
|
42
|
+
*
|
|
43
|
+
* Only a `*` inside a single path segment is expanded, the shape the
|
|
44
|
+
* downstream report uses (`fixtures/*.sqlite`). `**`, `!` exclusions and
|
|
45
|
+
* absolute `/`-rooted entries return undefined: they either cross directory
|
|
46
|
+
* boundaries or subtract, and a matcher that guessed at them would attribute
|
|
47
|
+
* a creation to the wrong manifest.
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildSupportFileMatcher(manifestPath: string, entry: string): ((candidate: string) => boolean) | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Flags every `support-files` registration a patch introduces that names a
|
|
52
|
+
* file only a later-ordered patch creates, unless the staged dependency is
|
|
53
|
+
* declared.
|
|
54
|
+
*
|
|
55
|
+
* @param ctx - Projected queue in application order
|
|
56
|
+
* @returns One issue per undeclared forward registration
|
|
57
|
+
*/
|
|
58
|
+
export declare function lintPatchQueueForwardRegistrations(ctx: PatchQueueView<PatchQueueForwardRegistrationEntry>): PatchLintIssue[];
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* Cross-patch lint rule: a test manifest that registers a file a
|
|
4
|
+
* later-ordered patch creates, without declaring the staged dependency.
|
|
5
|
+
*
|
|
6
|
+
* The import kind has had this arm since forward-import shipped. The
|
|
7
|
+
* registration kind never did. `--kind registration` metadata was only ever
|
|
8
|
+
* checked for staleness once declared, so a patch whose `xpcshell.toml`
|
|
9
|
+
* carried `support-files = ["fixtures/*.sqlite"]` for a fixture the next
|
|
10
|
+
* patch creates passed lint in both arms. Declaring the dependency and
|
|
11
|
+
* removing the declaration produced identical silence, so the gap was
|
|
12
|
+
* invisible rather than merely absent.
|
|
13
|
+
*
|
|
14
|
+
* Scope is narrow on purpose: test-manifest `support-files` only. A
|
|
15
|
+
* jar.mn packaging line or an actor/customElements registration names its
|
|
16
|
+
* target through indirection the linter cannot resolve without the build
|
|
17
|
+
* system, and a rule that guesses there would refuse correct queues on a
|
|
18
|
+
* Firefox-sized tree. The staged-registration declaration remains the
|
|
19
|
+
* documented escape hatch for a deliberate stage.
|
|
20
|
+
*/
|
|
21
|
+
import { basename, dirname, posix } from 'node:path';
|
|
22
|
+
import { normalizePathSlashes } from '../utils/paths.js';
|
|
23
|
+
import { escapeRegex } from '../utils/regex.js';
|
|
24
|
+
import { isLaterOwner, quoteRegistrationLine } from './patch-lint-staged-registration.js';
|
|
25
|
+
/**
|
|
26
|
+
* Manifest basenames whose `support-files` key registers auxiliary files
|
|
27
|
+
* for a test suite. Closed and documented on purpose: a pattern like
|
|
28
|
+
* "anything .toml" would sweep in Cargo and taskcluster manifests, whose
|
|
29
|
+
* `support-files`-shaped keys mean something else entirely.
|
|
30
|
+
*/
|
|
31
|
+
const TEST_MANIFEST_BASENAMES = new Set([
|
|
32
|
+
'xpcshell.toml',
|
|
33
|
+
'xpcshell.ini',
|
|
34
|
+
'mochitest.toml',
|
|
35
|
+
'mochitest.ini',
|
|
36
|
+
'browser.toml',
|
|
37
|
+
'browser.ini',
|
|
38
|
+
'chrome.toml',
|
|
39
|
+
'chrome.ini',
|
|
40
|
+
'a11y.toml',
|
|
41
|
+
'a11y.ini',
|
|
42
|
+
]);
|
|
43
|
+
/** True for a path whose basename is a recognised test manifest. */
|
|
44
|
+
function isTestManifestPath(path) {
|
|
45
|
+
return TEST_MANIFEST_BASENAMES.has(basename(normalizePathSlashes(path)));
|
|
46
|
+
}
|
|
47
|
+
/** Matches the start of a `support-files` assignment. */
|
|
48
|
+
const SUPPORT_FILES_PATTERN = /^\s*support-files\s*=\s*(.*)$/;
|
|
49
|
+
/**
|
|
50
|
+
* Extracts the `support-files` entries declared in `content`, each paired
|
|
51
|
+
* with the manifest line it is written on.
|
|
52
|
+
*
|
|
53
|
+
* Handles the TOML array on one line and spread over several, and the
|
|
54
|
+
* whitespace-separated `.ini` spelling. Anything else (a computed value, a
|
|
55
|
+
* shape this does not recognise) yields nothing, because a rule that
|
|
56
|
+
* guesses at a manifest it cannot parse refuses correct queues.
|
|
57
|
+
*
|
|
58
|
+
* Quoted tokens are matched per physical line rather than over the whole
|
|
59
|
+
* accumulated array body, so a multi-line array attributes each element to
|
|
60
|
+
* its own line. Entries are deduplicated: a manifest that lists the same
|
|
61
|
+
* file under two per-test sections needs one declaration, not two.
|
|
62
|
+
*/
|
|
63
|
+
export function extractSupportFileEntries(content) {
|
|
64
|
+
const lines = content.split('\n');
|
|
65
|
+
const order = [];
|
|
66
|
+
const sourceLines = new Map();
|
|
67
|
+
const record = (entry, source) => {
|
|
68
|
+
let seen = sourceLines.get(entry);
|
|
69
|
+
if (seen === undefined) {
|
|
70
|
+
seen = [];
|
|
71
|
+
sourceLines.set(entry, seen);
|
|
72
|
+
order.push(entry);
|
|
73
|
+
}
|
|
74
|
+
const trimmed = source.trim();
|
|
75
|
+
if (!seen.includes(trimmed))
|
|
76
|
+
seen.push(trimmed);
|
|
77
|
+
};
|
|
78
|
+
for (let i = 0; i < lines.length; i++) {
|
|
79
|
+
const raw = lines[i] ?? '';
|
|
80
|
+
const match = SUPPORT_FILES_PATTERN.exec(raw);
|
|
81
|
+
if (!match)
|
|
82
|
+
continue;
|
|
83
|
+
const head = match[1] ?? '';
|
|
84
|
+
if (!head.trimStart().startsWith('[')) {
|
|
85
|
+
// `.ini` spelling: whitespace-separated bare paths on one line.
|
|
86
|
+
for (const token of head.split(/\s+/).filter((t) => t.length > 0))
|
|
87
|
+
record(token, raw);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// TOML array: walk the physical lines until the closing bracket,
|
|
91
|
+
// bounded so an unterminated array in a malformed manifest cannot walk
|
|
92
|
+
// the file.
|
|
93
|
+
let body = head;
|
|
94
|
+
let scanned = 0;
|
|
95
|
+
let current = raw;
|
|
96
|
+
for (;;) {
|
|
97
|
+
for (const quoted of current.matchAll(/["']([^"']+)["']/g)) {
|
|
98
|
+
if (quoted[1] !== undefined)
|
|
99
|
+
record(quoted[1], current);
|
|
100
|
+
}
|
|
101
|
+
if (body.includes(']') || i + 1 >= lines.length || scanned >= 200)
|
|
102
|
+
break;
|
|
103
|
+
i += 1;
|
|
104
|
+
scanned += 1;
|
|
105
|
+
current = lines[i] ?? '';
|
|
106
|
+
body += `\n${current}`;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return order.map((entry) => {
|
|
110
|
+
const seen = sourceLines.get(entry) ?? [];
|
|
111
|
+
return { entry, line: seen[0] ?? '', occurrences: seen.length };
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Resolves one `support-files` entry, relative to its manifest's directory,
|
|
116
|
+
* into a matcher over engine-relative paths.
|
|
117
|
+
*
|
|
118
|
+
* Only a `*` inside a single path segment is expanded, the shape the
|
|
119
|
+
* downstream report uses (`fixtures/*.sqlite`). `**`, `!` exclusions and
|
|
120
|
+
* absolute `/`-rooted entries return undefined: they either cross directory
|
|
121
|
+
* boundaries or subtract, and a matcher that guessed at them would attribute
|
|
122
|
+
* a creation to the wrong manifest.
|
|
123
|
+
*/
|
|
124
|
+
export function buildSupportFileMatcher(manifestPath, entry) {
|
|
125
|
+
if (entry.startsWith('!') || entry.includes('**') || entry.startsWith('/'))
|
|
126
|
+
return undefined;
|
|
127
|
+
const resolved = posix.normalize(posix.join(normalizePathSlashes(dirname(manifestPath)), normalizePathSlashes(entry)));
|
|
128
|
+
if (resolved.startsWith('..'))
|
|
129
|
+
return undefined;
|
|
130
|
+
if (!resolved.includes('*')) {
|
|
131
|
+
return (candidate) => normalizePathSlashes(candidate) === resolved;
|
|
132
|
+
}
|
|
133
|
+
const pattern = new RegExp(`^${resolved
|
|
134
|
+
.split('*')
|
|
135
|
+
.map((part) => escapeRegex(part))
|
|
136
|
+
.join('[^/]*')}$`);
|
|
137
|
+
return (candidate) => pattern.test(normalizePathSlashes(candidate));
|
|
138
|
+
}
|
|
139
|
+
/** True when this patch already declares the staged registration. */
|
|
140
|
+
function isDeclared(entry, manifestPath, createdPath) {
|
|
141
|
+
return (entry.metadata?.stagedDependencies?.registrations ?? []).some((registration) => normalizePathSlashes(registration.file) === normalizePathSlashes(manifestPath) &&
|
|
142
|
+
normalizePathSlashes(registration.creates) === normalizePathSlashes(createdPath));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Flags every `support-files` registration a patch introduces that names a
|
|
146
|
+
* file only a later-ordered patch creates, unless the staged dependency is
|
|
147
|
+
* declared.
|
|
148
|
+
*
|
|
149
|
+
* @param ctx - Projected queue in application order
|
|
150
|
+
* @returns One issue per undeclared forward registration
|
|
151
|
+
*/
|
|
152
|
+
export function lintPatchQueueForwardRegistrations(ctx) {
|
|
153
|
+
const issues = [];
|
|
154
|
+
for (const entry of ctx.entries) {
|
|
155
|
+
// Both arms: a manifest this patch creates and one it modifies can each
|
|
156
|
+
// introduce a registration line.
|
|
157
|
+
const manifests = [
|
|
158
|
+
...entry.newFiles,
|
|
159
|
+
...entry.modifiedFileAdditions,
|
|
160
|
+
].filter(([path]) => isTestManifestPath(path));
|
|
161
|
+
for (const [manifestPath, content] of manifests) {
|
|
162
|
+
for (const { entry: raw, line: addedLine, occurrences } of extractSupportFileEntries(content)) {
|
|
163
|
+
const matches = buildSupportFileMatcher(manifestPath, raw);
|
|
164
|
+
if (matches === undefined)
|
|
165
|
+
continue;
|
|
166
|
+
// `--line` is the line as the patch adds it, which is what the
|
|
167
|
+
// declared arm compares and what `--remove` matches on. Synthesising
|
|
168
|
+
// `support-files = ["<entry>"]` instead only ever matched a
|
|
169
|
+
// single-line single-entry array, so the pasted command left the
|
|
170
|
+
// declaring patch red with staged-dependency-unused.
|
|
171
|
+
const declaredLine = quoteRegistrationLine(addedLine);
|
|
172
|
+
const ambiguity = occurrences > 1
|
|
173
|
+
? ` (the entry is spelled out on ${occurrences} added lines here; ` +
|
|
174
|
+
'the first is quoted, and one declaration covers the file either way ' +
|
|
175
|
+
'because the declared check keys on --file and --creates.)'
|
|
176
|
+
: '';
|
|
177
|
+
for (const later of ctx.entries) {
|
|
178
|
+
// Same predicate the declared-registration arm validates against,
|
|
179
|
+
// tiebreak included: two spellings of "later" would let one rule
|
|
180
|
+
// flag a pair the other considers already satisfied.
|
|
181
|
+
if (!isLaterOwner(later, entry))
|
|
182
|
+
continue;
|
|
183
|
+
for (const created of later.createdFiles) {
|
|
184
|
+
if (!matches(created))
|
|
185
|
+
continue;
|
|
186
|
+
if (isDeclared(entry, manifestPath, created))
|
|
187
|
+
continue;
|
|
188
|
+
issues.push({
|
|
189
|
+
file: manifestPath,
|
|
190
|
+
check: 'forward-registration',
|
|
191
|
+
patches: [entry.filename],
|
|
192
|
+
fingerprint: `forward-registration|${entry.filename}|${manifestPath}|${raw}|${created}|${later.filename}`,
|
|
193
|
+
message: `${manifestPath} in ${entry.filename} registers "${raw}" as a support file, ` +
|
|
194
|
+
`but ${created} is created by the later patch ${later.filename}. ` +
|
|
195
|
+
'Applying the queue up to this patch leaves the registration dangling. ' +
|
|
196
|
+
'Reorder the patches so the file is created first, move the registration into ' +
|
|
197
|
+
'the later patch, or declare the intentional staged dependency with: ' +
|
|
198
|
+
`fireforge patch staged-dependency ${entry.filename} --add --kind registration ` +
|
|
199
|
+
`--file ${manifestPath} --line "${declaredLine}" ` +
|
|
200
|
+
`--creates ${created} --owner ${later.filename}` +
|
|
201
|
+
ambiguity,
|
|
202
|
+
severity: 'error',
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return issues;
|
|
210
|
+
}
|
|
@@ -28,7 +28,7 @@ export interface ValidateExportJsDocOptions {
|
|
|
28
28
|
* Validates a top-level function declaration: requires an attached JSDoc
|
|
29
29
|
* comment, then checks @param name matching and @returns presence. Exported
|
|
30
30
|
* so the chrome-subscript validator (`patch-lint-chrome-jsdoc.ts`) can reuse
|
|
31
|
-
* it on `parseScript`-produced declarations
|
|
31
|
+
* it on `parseScript`-produced declarations. The rule shape is identical
|
|
32
32
|
* between ES-module exports and chrome-subscript top-level declarations.
|
|
33
33
|
*
|
|
34
34
|
* @param fn - FunctionDeclaration AST node
|
|
@@ -54,7 +54,7 @@ export declare function validateClassDecl(cls: AcornESTreeNode<ClassDeclaration>
|
|
|
54
54
|
* 3. methods whose JSDoc carries `@private` or `@internal`
|
|
55
55
|
*
|
|
56
56
|
* A pure-override skip (`super.method(...args)`-only bodies bypassing the
|
|
57
|
-
* return-tag check) is deliberately not implemented
|
|
57
|
+
* return-tag check) is deliberately not implemented. The rule stays simple.
|
|
58
58
|
*/
|
|
59
59
|
export declare function validateClassMethods(cls: AcornESTreeNode<ClassDeclaration>, comments: acorn.Comment[], source: string, severity: 'warning' | 'error'): JsDocIssue[];
|
|
60
60
|
/**
|
|
@@ -46,8 +46,8 @@ function findAttachedJsDoc(comments, declStart, source) {
|
|
|
46
46
|
* loses the param name. String literal types may contain braces too, so
|
|
47
47
|
* quoted runs are skipped verbatim.
|
|
48
48
|
*
|
|
49
|
-
* @returns Index just past the matching close brace, or
|
|
50
|
-
* expression never closes (malformed doc
|
|
49
|
+
* @returns Index just past the matching close brace, or undefined when the
|
|
50
|
+
* type expression never closes (malformed doc, caller skips the tag).
|
|
51
51
|
*/
|
|
52
52
|
function skipBalancedTypeBraces(jsDoc, start) {
|
|
53
53
|
let depth = 0;
|
|
@@ -73,7 +73,7 @@ function skipBalancedTypeBraces(jsDoc, start) {
|
|
|
73
73
|
return i + 1;
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
|
-
return
|
|
76
|
+
return undefined;
|
|
77
77
|
}
|
|
78
78
|
function extractParamNames(jsDoc) {
|
|
79
79
|
const names = [];
|
|
@@ -83,11 +83,11 @@ function extractParamNames(jsDoc) {
|
|
|
83
83
|
let i = m.index + m[0].length;
|
|
84
84
|
while (i < jsDoc.length && /\s/.test(jsDoc[i] ?? ''))
|
|
85
85
|
i++;
|
|
86
|
-
// Optional `{type}` expression
|
|
86
|
+
// Optional `{type}` expression, depth-aware so nested braces inside
|
|
87
87
|
// inline object types or Record<…> generics don't truncate the scan.
|
|
88
88
|
if (jsDoc[i] === '{') {
|
|
89
89
|
const afterType = skipBalancedTypeBraces(jsDoc, i);
|
|
90
|
-
if (afterType ===
|
|
90
|
+
if (afterType === undefined)
|
|
91
91
|
continue;
|
|
92
92
|
i = afterType;
|
|
93
93
|
while (i < jsDoc.length && /\s/.test(jsDoc[i] ?? ''))
|
|
@@ -124,6 +124,17 @@ function hasPrivateOrInternalTag(jsDoc) {
|
|
|
124
124
|
function functionReturnsValue(node) {
|
|
125
125
|
return walkForReturn(node.body);
|
|
126
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Narrows an arbitrary child value reached by walking a node's own
|
|
129
|
+
* properties to an ESTree node. Acorn's AST holds nodes, arrays of nodes,
|
|
130
|
+
* and plain scalars in the same property positions, so the discriminating
|
|
131
|
+
* `type` string is the only structural signal available.
|
|
132
|
+
*/
|
|
133
|
+
function isEstreeNode(value) {
|
|
134
|
+
if (typeof value !== 'object' || value === null || !('type' in value))
|
|
135
|
+
return false;
|
|
136
|
+
return typeof value.type === 'string';
|
|
137
|
+
}
|
|
127
138
|
function walkForReturn(node) {
|
|
128
139
|
if (node.type === 'ReturnStatement') {
|
|
129
140
|
return node.argument != null;
|
|
@@ -133,26 +144,22 @@ function walkForReturn(node) {
|
|
|
133
144
|
node.type === 'ArrowFunctionExpression') {
|
|
134
145
|
return false;
|
|
135
146
|
}
|
|
136
|
-
// `entries` erases the node's static shape without asserting a new one
|
|
137
|
-
//
|
|
147
|
+
// `entries` erases the node's static shape without asserting a new one.
|
|
148
|
+
// The `any` from `Object.entries`' fallback overload widens to `unknown`.
|
|
138
149
|
const entries = Object.entries(node);
|
|
139
150
|
for (const [key, val] of entries) {
|
|
140
151
|
if (key === 'type')
|
|
141
152
|
continue;
|
|
142
|
-
if (val
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (walkForReturn(child))
|
|
147
|
-
return true;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
else if ('type' in val) {
|
|
152
|
-
if (walkForReturn(val))
|
|
153
|
+
if (Array.isArray(val)) {
|
|
154
|
+
const children = val;
|
|
155
|
+
for (const child of children) {
|
|
156
|
+
if (isEstreeNode(child) && walkForReturn(child))
|
|
153
157
|
return true;
|
|
154
158
|
}
|
|
155
159
|
}
|
|
160
|
+
else if (isEstreeNode(val) && walkForReturn(val)) {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
156
163
|
}
|
|
157
164
|
return false;
|
|
158
165
|
}
|
|
@@ -183,12 +190,7 @@ function findLocalDeclaration(body, name) {
|
|
|
183
190
|
// Line number helpers
|
|
184
191
|
// ---------------------------------------------------------------------------
|
|
185
192
|
function lineAt(source, offset) {
|
|
186
|
-
|
|
187
|
-
for (let i = 0; i < offset && i < source.length; i++) {
|
|
188
|
-
if (source[i] === '\n')
|
|
189
|
-
line++;
|
|
190
|
-
}
|
|
191
|
-
return line;
|
|
193
|
+
return source.slice(0, offset).split('\n').length;
|
|
192
194
|
}
|
|
193
195
|
/**
|
|
194
196
|
* Validates @param name matching and @returns presence on a function-like
|
|
@@ -198,21 +200,19 @@ function lineAt(source, offset) {
|
|
|
198
200
|
*/
|
|
199
201
|
function validateParamsAndReturns(fnNode, jsDoc, issues, ctx) {
|
|
200
202
|
const docText = jsDoc.value;
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
});
|
|
215
|
-
}
|
|
203
|
+
const actualParams = fnNode.params
|
|
204
|
+
.map((p) => (p.type === 'Identifier' ? p.name : null))
|
|
205
|
+
.filter((n) => n !== null);
|
|
206
|
+
if (actualParams.length > 0) {
|
|
207
|
+
const docParams = extractParamNames(docText);
|
|
208
|
+
for (const param of actualParams) {
|
|
209
|
+
if (!docParams.includes(param)) {
|
|
210
|
+
issues.push({
|
|
211
|
+
line: ctx.line,
|
|
212
|
+
check: ctx.paramCheck,
|
|
213
|
+
message: `Exported ${ctx.label} at line ${ctx.line}: @param "${param}" is missing or misnamed in JSDoc.`,
|
|
214
|
+
...(ctx.severity ? { severity: ctx.severity } : {}),
|
|
215
|
+
});
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
218
|
}
|
|
@@ -232,7 +232,7 @@ function validateParamsAndReturns(fnNode, jsDoc, issues, ctx) {
|
|
|
232
232
|
* Validates a top-level function declaration: requires an attached JSDoc
|
|
233
233
|
* comment, then checks @param name matching and @returns presence. Exported
|
|
234
234
|
* so the chrome-subscript validator (`patch-lint-chrome-jsdoc.ts`) can reuse
|
|
235
|
-
* it on `parseScript`-produced declarations
|
|
235
|
+
* it on `parseScript`-produced declarations. The rule shape is identical
|
|
236
236
|
* between ES-module exports and chrome-subscript top-level declarations.
|
|
237
237
|
*
|
|
238
238
|
* @param fn - FunctionDeclaration AST node
|
|
@@ -290,7 +290,7 @@ function validateVariableDecl(varDecl, comments, source, lookupStart) {
|
|
|
290
290
|
const start = lookupStart !== undefined ? lookupStart : varDecl.start;
|
|
291
291
|
const jsDoc = findAttachedJsDoc(comments, start, source);
|
|
292
292
|
if (jsDoc)
|
|
293
|
-
return issues; // has a JSDoc block
|
|
293
|
+
return issues; // has a JSDoc block, sufficient for constants
|
|
294
294
|
for (const decl of varDecl.declarations) {
|
|
295
295
|
const name = decl.id.type === 'Identifier' ? decl.id.name : '<destructured>';
|
|
296
296
|
const line = lineAt(source, start);
|
|
@@ -340,7 +340,7 @@ function classMethodLabel(className, method, name) {
|
|
|
340
340
|
* 3. methods whose JSDoc carries `@private` or `@internal`
|
|
341
341
|
*
|
|
342
342
|
* A pure-override skip (`super.method(...args)`-only bodies bypassing the
|
|
343
|
-
* return-tag check) is deliberately not implemented
|
|
343
|
+
* return-tag check) is deliberately not implemented. The rule stays simple.
|
|
344
344
|
*/
|
|
345
345
|
export function validateClassMethods(cls, comments, source, severity) {
|
|
346
346
|
const issues = [];
|
|
@@ -374,7 +374,7 @@ export function validateClassMethods(cls, comments, source, severity) {
|
|
|
374
374
|
continue;
|
|
375
375
|
}
|
|
376
376
|
if (method.kind === 'get') {
|
|
377
|
-
// Presence already verified
|
|
377
|
+
// Presence already verified. The getter expression is the contract.
|
|
378
378
|
continue;
|
|
379
379
|
}
|
|
380
380
|
const skipReturns = method.kind === 'constructor' || method.kind === 'set';
|
|
@@ -407,7 +407,7 @@ export function validateExportJsDoc(source, options) {
|
|
|
407
407
|
ast = parseModule(source, comments);
|
|
408
408
|
}
|
|
409
409
|
catch (error) {
|
|
410
|
-
// An unparseable source is
|
|
410
|
+
// An unparseable source is not a clean file. Returning `[]` here was the
|
|
411
411
|
// same value as "fully documented", so a syntax error silently cleared
|
|
412
412
|
// every rule this module enforces. Report it instead.
|
|
413
413
|
return [
|
|
@@ -424,7 +424,7 @@ export function validateExportJsDoc(source, options) {
|
|
|
424
424
|
if (node.type !== 'ExportNamedDeclaration')
|
|
425
425
|
continue;
|
|
426
426
|
const exportNode = node;
|
|
427
|
-
// Case 1: inline export declaration
|
|
427
|
+
// Case 1: inline export declaration, JSDoc attaches to `export`
|
|
428
428
|
if (exportNode.declaration) {
|
|
429
429
|
const decl = exportNode.declaration;
|
|
430
430
|
const exportStart = exportNode.start;
|
|
@@ -442,7 +442,7 @@ export function validateExportJsDoc(source, options) {
|
|
|
442
442
|
}
|
|
443
443
|
continue;
|
|
444
444
|
}
|
|
445
|
-
// Case 2: `export { foo, Bar }
|
|
445
|
+
// Case 2: `export { foo, Bar }`, resolve back to local declarations
|
|
446
446
|
if (exportNode.specifiers.length > 0 && !exportNode.source) {
|
|
447
447
|
for (const spec of exportNode.specifiers) {
|
|
448
448
|
const local = spec.local;
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import type { PatchLintIssue } from '../types/commands/index.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
newFiles: ReadonlyMap<string, string>;
|
|
5
|
-
modifiedFileAdditions: ReadonlyMap<string, string>;
|
|
6
|
-
}
|
|
7
|
-
interface ModuleRegistrationQueueContext {
|
|
8
|
-
entries: readonly ModuleRegistrationQueueEntry[];
|
|
9
|
-
}
|
|
2
|
+
import type { PatchQueueRegistrationEntry, PatchQueueView } from './patch-lint-queue-types.js';
|
|
3
|
+
type ModuleRegistrationQueueContext = PatchQueueView<PatchQueueRegistrationEntry>;
|
|
10
4
|
/**
|
|
11
5
|
* Maps Firefox's common system-module resource URLs to their source
|
|
12
6
|
* suffix. Exported alongside {@link extractResourceModuleSpecifiers} so
|
|
@@ -16,7 +10,7 @@ export declare function moduleSourceSuffix(specifier: string): string | undefine
|
|
|
16
10
|
/**
|
|
17
11
|
* Resource-module strings in actual code (comments removed), de-duplicated.
|
|
18
12
|
* Exported for the engine-aware resolution preflight, which must recognise
|
|
19
|
-
* exactly the same specifier shapes this queue-level rule does
|
|
13
|
+
* exactly the same specifier shapes this queue-level rule does. Two
|
|
20
14
|
* extractors would drift.
|
|
21
15
|
*/
|
|
22
16
|
export declare function extractResourceModuleSpecifiers(content: string): string[];
|
|
@@ -21,7 +21,7 @@ export function moduleSourceSuffix(specifier) {
|
|
|
21
21
|
/**
|
|
22
22
|
* Resource-module strings in actual code (comments removed), de-duplicated.
|
|
23
23
|
* Exported for the engine-aware resolution preflight, which must recognise
|
|
24
|
-
* exactly the same specifier shapes this queue-level rule does
|
|
24
|
+
* exactly the same specifier shapes this queue-level rule does. Two
|
|
25
25
|
* extractors would drift.
|
|
26
26
|
*/
|
|
27
27
|
export function extractResourceModuleSpecifiers(content) {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* mozbuild enforces alphabetical ordering on `StrictOrderingOnAppendList`
|
|
5
5
|
* variables and raises `mozbuild.util.UnsortedError: … expected "X" but got
|
|
6
|
-
* "Y"
|
|
6
|
+
* "Y"`, but only at configure time, i.e. minutes into a `fireforge build`
|
|
7
7
|
* or `fireforge test --build` dispatch. This check reads the patched
|
|
8
8
|
* `moz.build` files from the engine tree (the working tree carries the
|
|
9
9
|
* applied patch state, same as every other per-patch rule) and reports the
|