@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
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*
|
|
5
5
|
* A tree is a snapshot: its `patches/` and `components/` are copies with
|
|
6
6
|
* no merge-back model, so any command that mutates project or engine
|
|
7
|
-
* state must run in the primary tree. Enforcement is
|
|
8
|
-
* explicit verdict table over every top-level command
|
|
7
|
+
* state must run in the primary tree. Enforcement is default-deny via an
|
|
8
|
+
* explicit verdict table over every top-level command, so a newly added
|
|
9
9
|
* command is refused inside trees until its author classifies it (the
|
|
10
|
-
* drift test in `tree-guard.test.ts` fails otherwise)
|
|
10
|
+
* drift test in `tree-guard.test.ts` fails otherwise). It lives in one
|
|
11
11
|
* commander `preAction` hook installed by `createProgram()`, so the
|
|
12
12
|
* guard fires no matter how the cwd ended up inside a tree (`tree exec`
|
|
13
13
|
* or a plain `cd`).
|
|
@@ -17,8 +17,8 @@ import { dirname, join, resolve } from 'node:path';
|
|
|
17
17
|
import { GeneralError } from '../errors/base.js';
|
|
18
18
|
import { getTreeMarkerPath, readTreeMarker, } from './tree-store.js';
|
|
19
19
|
/**
|
|
20
|
-
* Per-command verdicts. `allowed` runs unconditionally
|
|
21
|
-
* runs in a tree
|
|
20
|
+
* Per-command verdicts. `allowed` runs unconditionally. `refused` never
|
|
21
|
+
* runs in a tree. `conditional` consults `TREE_CONDITIONAL_CHECKS` with
|
|
22
22
|
* the invoked subcommand chain, parsed options, and the tree marker.
|
|
23
23
|
*/
|
|
24
24
|
export const TREE_COMMAND_VERDICTS = {
|
|
@@ -41,7 +41,7 @@ export const TREE_COMMAND_VERDICTS = {
|
|
|
41
41
|
package: 'refused',
|
|
42
42
|
watch: 'refused',
|
|
43
43
|
// Build-less runs only, and only in trees whose marker records a cloned
|
|
44
|
-
// (mozinfo-rewritten) objdir
|
|
44
|
+
// (mozinfo-rewritten) objdir. See the conditional check below.
|
|
45
45
|
test: 'conditional',
|
|
46
46
|
config: 'conditional',
|
|
47
47
|
doctor: 'conditional',
|
|
@@ -52,8 +52,8 @@ export const TREE_COMMAND_VERDICTS = {
|
|
|
52
52
|
typecheck: 'allowed',
|
|
53
53
|
verify: 'allowed',
|
|
54
54
|
furnace: 'refused',
|
|
55
|
-
// No nesting
|
|
56
|
-
// subcommand check below allows only `list`.
|
|
55
|
+
// No nesting. `tree list` inside a tree is pointless but harmless, and
|
|
56
|
+
// the subcommand check below allows only `list`.
|
|
57
57
|
tree: 'conditional',
|
|
58
58
|
};
|
|
59
59
|
/** The command set named in refusal messages. */
|
|
@@ -61,29 +61,29 @@ const ALLOWED_SUMMARY = 'Verification trees support: status, lint, typecheck, ve
|
|
|
61
61
|
'config (read), export --dry-run, export-all --dry-run, re-export --dry-run, and — ' +
|
|
62
62
|
'in trees created with --with-objdir — build-less test.';
|
|
63
63
|
const TREE_CONDITIONAL_CHECKS = {
|
|
64
|
-
// Exports write patches/ + patches.json
|
|
64
|
+
// Exports write patches/ + patches.json. Only the dry-run preview is a read.
|
|
65
65
|
export: ({ options }) => options['dryRun'] === true,
|
|
66
66
|
'export-all': ({ options }) => options['dryRun'] === true,
|
|
67
67
|
// Same rule for refreshing existing patches: the dry-run projection is a
|
|
68
68
|
// read (proven side-effect free and runtime-enforced by
|
|
69
|
-
// withDryRunPurityGuard)
|
|
69
|
+
// withDryRunPurityGuard). A real re-export writes patches/.
|
|
70
70
|
're-export': ({ options }) => options['dryRun'] === true,
|
|
71
|
-
// `config` with no positional value prints
|
|
71
|
+
// `config` with no positional value prints. With a value it writes.
|
|
72
72
|
config: ({ args }) => args.filter((a) => typeof a === 'string').length <= 1,
|
|
73
73
|
// Doctor reads unless a repair flag is set.
|
|
74
74
|
doctor: ({ options }) => options['repairFurnace'] !== true && options['fix'] !== true,
|
|
75
75
|
// Build-less test needs the objdir the marker records as cloned,
|
|
76
|
-
// mozinfo-rewritten
|
|
76
|
+
// mozinfo-rewritten and reconfigured in-tree. `test --build` rebuilds
|
|
77
77
|
// the engine and stays primary-only (a tree is a snapshot with no
|
|
78
78
|
// merge-back model, so build outputs mutated in-tree go nowhere).
|
|
79
79
|
test: ({ options }, marker) => marker.clonedObjdir !== undefined && options['build'] !== true,
|
|
80
|
-
// No tree lifecycle inside a tree
|
|
80
|
+
// No tree lifecycle inside a tree. `tree list` is the only read.
|
|
81
81
|
tree: ({ subcommands }) => subcommands[0] === 'list',
|
|
82
82
|
};
|
|
83
83
|
/**
|
|
84
|
-
* Command-specific refusal hints appended after the generic sentence
|
|
85
|
-
*
|
|
86
|
-
*
|
|
84
|
+
* Command-specific refusal hints appended after the generic sentence, for
|
|
85
|
+
* verdicts where "mutates project or engine state" alone would misdiagnose
|
|
86
|
+
* the actual reason.
|
|
87
87
|
*/
|
|
88
88
|
const TREE_REFUSAL_HINTS = {
|
|
89
89
|
test: ({ options }, marker) => {
|
|
@@ -149,13 +149,13 @@ export async function runTreeGuardHook(rootCommandName, actionCommand) {
|
|
|
149
149
|
const state = located.state;
|
|
150
150
|
if (state.kind === 'absent')
|
|
151
151
|
return;
|
|
152
|
-
// A marker we cannot read is not evidence that this is not a tree
|
|
152
|
+
// A marker we cannot read is not evidence that this is not a tree. It is
|
|
153
153
|
// evidence that we cannot tell. Treating it as "not a tree" would grant the
|
|
154
154
|
// full mutating command set to a snapshot on the strength of a file that
|
|
155
|
-
// failed to parse, which is
|
|
156
|
-
// A marker from a
|
|
157
|
-
// remedies
|
|
158
|
-
// wrong for it. Refuse with the upgrade instruction instead, and do
|
|
155
|
+
// failed to parse, which is backwards for a default-deny guard.
|
|
156
|
+
// A marker from a newer FireForge is not damaged, so the corrupt branch's
|
|
157
|
+
// remedies (recreate the tree, delete the stray marker) are actively
|
|
158
|
+
// wrong for it. Refuse with the upgrade instruction instead, and do not
|
|
159
159
|
// offer --ignore-corrupt-tree-marker: proceeding would mean acting on a
|
|
160
160
|
// marker whose fields this build does not understand.
|
|
161
161
|
if (state.kind === 'unsupported') {
|
|
@@ -166,8 +166,8 @@ export async function runTreeGuardHook(rootCommandName, actionCommand) {
|
|
|
166
166
|
if (state.kind === 'corrupt') {
|
|
167
167
|
if (options['ignoreCorruptTreeMarker'] === true)
|
|
168
168
|
return;
|
|
169
|
-
// Unconditionally-allowed commands never consult marker fields
|
|
170
|
-
// verdict is the same in every tree
|
|
169
|
+
// Unconditionally-allowed commands never consult marker fields, and
|
|
170
|
+
// their verdict is the same in every tree, so an unreadable marker cannot
|
|
171
171
|
// change their answer. Letting them through keeps read-only diagnostics
|
|
172
172
|
// (status, lint) usable on the very tree the operator needs to inspect.
|
|
173
173
|
// 'conditional' verdicts stay refused: their predicates can write.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CowCapability } from './tree-cow.js';
|
|
2
|
-
/** `.fireforge/tree.json
|
|
2
|
+
/** `.fireforge/tree.json`, which identifies a directory as a verification tree. */
|
|
3
3
|
export interface TreeMarker {
|
|
4
4
|
schemaVersion: 1;
|
|
5
5
|
name: string;
|
|
@@ -11,10 +11,10 @@ export interface TreeMarker {
|
|
|
11
11
|
patchesFingerprint: string | null;
|
|
12
12
|
/**
|
|
13
13
|
* Name of the obj-* directory cloned into this tree, written only after
|
|
14
|
-
* its mozinfo.json was successfully rewritten to the tree's paths
|
|
14
|
+
* its mozinfo.json was successfully rewritten to the tree's paths and the
|
|
15
15
|
* caller's in-tree reconfigure regenerated the remaining configure output.
|
|
16
16
|
* Its presence is what lets the guard admit build-less `test` in-tree
|
|
17
|
-
* (`tree-guard.ts`)
|
|
17
|
+
* (`tree-guard.ts`). Absent on trees created without `--with-objdir`.
|
|
18
18
|
*/
|
|
19
19
|
clonedObjdir?: string;
|
|
20
20
|
}
|
|
@@ -35,7 +35,7 @@ export declare function withTreeLifecycleLock<T>(primaryRoot: string, operation:
|
|
|
35
35
|
* The three states must stay distinct because they carry opposite safety
|
|
36
36
|
* meanings. `absent` means "this directory is not a tree", which is what
|
|
37
37
|
* lets every mutating command run. `corrupt` means "this directory claims to
|
|
38
|
-
* be a tree but we cannot read the claim"
|
|
38
|
+
* be a tree but we cannot read the claim". Collapsing it into `absent` (as
|
|
39
39
|
* a bare `undefined` return does) hands a snapshot the full mutating command
|
|
40
40
|
* set on the strength of a file we failed to parse, inverting
|
|
41
41
|
* `tree-guard.ts`'s default-deny design. Deleting one field from a marker is
|
|
@@ -51,7 +51,7 @@ export type TreeMarkerRead = {
|
|
|
51
51
|
reason: string;
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
|
-
* Written by a
|
|
54
|
+
* Written by a newer FireForge. Distinct from `corrupt` because the remedy
|
|
55
55
|
* is the opposite: upgrade, do not delete.
|
|
56
56
|
*/
|
|
57
57
|
| {
|
|
@@ -68,20 +68,20 @@ export declare function getTreeMarkerPath(root: string): string;
|
|
|
68
68
|
*
|
|
69
69
|
* Only ENOENT/ENOTDIR mean `absent`: any other probe failure (EACCES on the
|
|
70
70
|
* `.fireforge` directory, EIO, …) reports `corrupt`, because "we cannot read
|
|
71
|
-
* the marker" is not evidence that there is no marker
|
|
71
|
+
* the marker" is not evidence that there is no marker: a `pathExists`
|
|
72
72
|
* pre-check classifies a tree with an unreadable `.fireforge` as `absent`
|
|
73
73
|
* and hands it the full mutating command set.
|
|
74
74
|
*/
|
|
75
75
|
/**
|
|
76
76
|
* Naming convention for state-file readers:
|
|
77
|
-
* - `readX(): Promise<XRead>`
|
|
77
|
+
* - `readX(): Promise<XRead>` is the tri-state read: absent, corrupt, or
|
|
78
78
|
* valid.
|
|
79
|
-
* - `tryReadX(): Promise<X | undefined>`
|
|
79
|
+
* - `tryReadX(): Promise<X | undefined>` collapses absent and corrupt.
|
|
80
80
|
*/
|
|
81
81
|
export declare function readTreeMarker(root: string): Promise<TreeMarkerRead>;
|
|
82
82
|
/**
|
|
83
83
|
* Reads the tree marker for a project root, or undefined when it is absent
|
|
84
|
-
*
|
|
84
|
+
* or unreadable.
|
|
85
85
|
*
|
|
86
86
|
* For display and best-effort paths only (`tree list` renders an unreadable
|
|
87
87
|
* marker as staleness 'unknown'). Anything that decides whether a mutation may
|
|
@@ -93,8 +93,8 @@ export declare function tryReadTreeMarker(root: string): Promise<TreeMarker | un
|
|
|
93
93
|
* the one this tree's marker vouched for as rewritten-and-reconfigured. A
|
|
94
94
|
* mismatch means an objdir appeared in the tree through some path other than
|
|
95
95
|
* `tree create --with-objdir` (manual copy, partial restore), so nothing
|
|
96
|
-
* proves it was relocated
|
|
97
|
-
* No-op outside a tree
|
|
96
|
+
* proves it was relocated, and running against it could consult primary paths.
|
|
97
|
+
* No-op outside a tree. A corrupt marker is already refused by the guard.
|
|
98
98
|
*/
|
|
99
99
|
export declare function assertObjdirMatchesTreeMarker(projectRoot: string, objDir: string | undefined): Promise<void>;
|
|
100
100
|
/** Current primary-side snapshot identity, including dirty source and patch bodies. */
|
|
@@ -109,8 +109,8 @@ export declare function assertValidTreeName(name: string): void;
|
|
|
109
109
|
* Materialises the tree at `treeRoot` from `primaryRoot` using `capability`
|
|
110
110
|
* ('none' = plain copy, already gated on --force-copy by the caller).
|
|
111
111
|
*
|
|
112
|
-
* The engine is cloned one
|
|
113
|
-
* directories are never traversed or materialised
|
|
112
|
+
* The engine is cloned one top-level entry at a time so unwanted `obj-*`
|
|
113
|
+
* directories are never traversed or materialised. On a Firefox tree, even
|
|
114
114
|
* CoW-cloning and then deleting an objdir touches metadata for millions of
|
|
115
115
|
* build outputs. With `withObjdir` exactly that objdir is included (after
|
|
116
116
|
* {@link assertCloneSafeObjdir} refuses symlinked or engine-escaping objdirs
|
|
@@ -134,8 +134,8 @@ export declare function cloneTree(args: {
|
|
|
134
134
|
export declare function listTrees(primaryRoot: string): Promise<TreeListEntry[]>;
|
|
135
135
|
/**
|
|
136
136
|
* Removes one tree. Refuses when a live process holds the tree's build
|
|
137
|
-
* or engine-session lock
|
|
138
|
-
* cannot be established
|
|
137
|
+
* or engine-session lock, or when a lock directory exists whose ownership
|
|
138
|
+
* cannot be established (which `--force` overrides). Never deletes a path
|
|
139
139
|
* outside the trees directory (containment check before `rm -rf`).
|
|
140
140
|
*/
|
|
141
141
|
export declare function removeTree(primaryRoot: string, name: string, options?: {
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Verification-tree storage and lifecycle for `fireforge tree`.
|
|
4
4
|
*
|
|
5
|
-
* A tree is a
|
|
6
|
-
* `.fireforge/trees/<name
|
|
5
|
+
* A tree is a full project-root CoW snapshot under
|
|
6
|
+
* `.fireforge/trees/<name>`. `getProjectRoot()` walks up from cwd, so
|
|
7
7
|
* every read command (status, lint, typecheck, verify, doctor,
|
|
8
8
|
* `export --dry-run`) runs inside the tree unmodified and its build /
|
|
9
9
|
* engine-session locks key on the tree root automatically. Trees are
|
|
@@ -19,6 +19,7 @@ import { GeneralError } from '../errors/base.js';
|
|
|
19
19
|
import { mapWithConcurrency } from '../utils/concurrency.js';
|
|
20
20
|
import { getNodeErrorCode, isProcessAlive, toError } from '../utils/errors.js';
|
|
21
21
|
import { pathExists, readJson, writeJson } from '../utils/fs.js';
|
|
22
|
+
import { sha256Hex } from '../utils/hash.js';
|
|
22
23
|
import { verbose, warn } from '../utils/logger.js';
|
|
23
24
|
import { isObject } from '../utils/validation.js';
|
|
24
25
|
import { getBuildBaselinePath } from './build-baseline.js';
|
|
@@ -91,23 +92,23 @@ export function getTreeMarkerPath(root) {
|
|
|
91
92
|
*
|
|
92
93
|
* Only ENOENT/ENOTDIR mean `absent`: any other probe failure (EACCES on the
|
|
93
94
|
* `.fireforge` directory, EIO, …) reports `corrupt`, because "we cannot read
|
|
94
|
-
* the marker" is not evidence that there is no marker
|
|
95
|
+
* the marker" is not evidence that there is no marker: a `pathExists`
|
|
95
96
|
* pre-check classifies a tree with an unreadable `.fireforge` as `absent`
|
|
96
97
|
* and hands it the full mutating command set.
|
|
97
98
|
*/
|
|
98
99
|
/**
|
|
99
100
|
* Naming convention for state-file readers:
|
|
100
|
-
* - `readX(): Promise<XRead>`
|
|
101
|
+
* - `readX(): Promise<XRead>` is the tri-state read: absent, corrupt, or
|
|
101
102
|
* valid.
|
|
102
|
-
* - `tryReadX(): Promise<X | undefined>`
|
|
103
|
+
* - `tryReadX(): Promise<X | undefined>` collapses absent and corrupt.
|
|
103
104
|
*/
|
|
104
105
|
export async function readTreeMarker(root) {
|
|
105
106
|
const markerPath = getTreeMarkerPath(root);
|
|
106
107
|
try {
|
|
107
108
|
const raw = await readJson(markerPath);
|
|
108
|
-
// Version
|
|
109
|
-
// check into `isTreeMarker` makes a marker from a
|
|
110
|
-
// as "missing or mistypes a required field"
|
|
109
|
+
// Version first, and reported distinctly. Folding the schemaVersion
|
|
110
|
+
// check into `isTreeMarker` makes a marker from a newer FireForge read
|
|
111
|
+
// as "missing or mistypes a required field", and `tree-guard.ts` is
|
|
111
112
|
// default-deny on corrupt, so the operator is locked out of every
|
|
112
113
|
// mutating command inside the tree by a message claiming the file is
|
|
113
114
|
// malformed when it is merely newer.
|
|
@@ -128,13 +129,13 @@ export async function readTreeMarker(root) {
|
|
|
128
129
|
const code = getNodeErrorCode(error);
|
|
129
130
|
if (code === 'ENOENT' || code === 'ENOTDIR')
|
|
130
131
|
return { kind: 'absent' };
|
|
131
|
-
verbose(`Unreadable tree marker at ${markerPath}: ${
|
|
132
|
+
verbose(`Unreadable tree marker at ${markerPath}: ${toError(error).message}`);
|
|
132
133
|
return { kind: 'corrupt', reason: `the marker could not be read (${toError(error).message})` };
|
|
133
134
|
}
|
|
134
135
|
}
|
|
135
136
|
/**
|
|
136
137
|
* Reads the tree marker for a project root, or undefined when it is absent
|
|
137
|
-
*
|
|
138
|
+
* or unreadable.
|
|
138
139
|
*
|
|
139
140
|
* For display and best-effort paths only (`tree list` renders an unreadable
|
|
140
141
|
* marker as staleness 'unknown'). Anything that decides whether a mutation may
|
|
@@ -149,8 +150,8 @@ export async function tryReadTreeMarker(root) {
|
|
|
149
150
|
* the one this tree's marker vouched for as rewritten-and-reconfigured. A
|
|
150
151
|
* mismatch means an objdir appeared in the tree through some path other than
|
|
151
152
|
* `tree create --with-objdir` (manual copy, partial restore), so nothing
|
|
152
|
-
* proves it was relocated
|
|
153
|
-
* No-op outside a tree
|
|
153
|
+
* proves it was relocated, and running against it could consult primary paths.
|
|
154
|
+
* No-op outside a tree. A corrupt marker is already refused by the guard.
|
|
154
155
|
*/
|
|
155
156
|
export async function assertObjdirMatchesTreeMarker(projectRoot, objDir) {
|
|
156
157
|
const state = await readTreeMarker(projectRoot);
|
|
@@ -178,9 +179,7 @@ export async function computePrimaryFingerprint(primaryRoot) {
|
|
|
178
179
|
}
|
|
179
180
|
let engineFingerprint;
|
|
180
181
|
try {
|
|
181
|
-
engineFingerprint =
|
|
182
|
-
.update(await getAllDiff(engineDir))
|
|
183
|
-
.digest('hex');
|
|
182
|
+
engineFingerprint = sha256Hex(await getAllDiff(engineDir));
|
|
184
183
|
}
|
|
185
184
|
catch {
|
|
186
185
|
engineFingerprint = null;
|
|
@@ -215,17 +214,17 @@ export function assertValidTreeName(name) {
|
|
|
215
214
|
}
|
|
216
215
|
/**
|
|
217
216
|
* Refuses an objdir that is not a plain directory physically inside
|
|
218
|
-
* `engineDir
|
|
217
|
+
* `engineDir`. Every `cp` mode `cloneEntry` uses preserves symlinks, so
|
|
219
218
|
* a symlinked `engine/obj-*` would be cloned as a symlink pointing back
|
|
220
219
|
* at the original (primary or fully external) build, and the clone's
|
|
221
220
|
* mozinfo rewrite and `_virtualenvs` removal would then mutate that
|
|
222
221
|
* original through the link. Checks lstat (the entry itself must be a
|
|
223
|
-
* real directory)
|
|
224
|
-
* through a symlinked parent resolves elsewhere)
|
|
222
|
+
* real directory) and realpath containment (a real directory reached
|
|
223
|
+
* through a symlinked parent resolves elsewhere). The rewriter's
|
|
225
224
|
* lexical `resolve()` paths cannot detect either. Also validates the
|
|
226
225
|
* name as a single `obj-*` path segment. Role `'primary'` guards before
|
|
227
|
-
* any copying starts
|
|
228
|
-
* write goes through it (defense in depth).
|
|
226
|
+
* any copying starts. Role `'cloned'` re-checks the tree's copy before
|
|
227
|
+
* any write goes through it (defense in depth).
|
|
229
228
|
*/
|
|
230
229
|
async function assertCloneSafeObjdir(engineDir, objDir, role) {
|
|
231
230
|
const where = role === 'primary' ? 'engine/' : "the tree's engine/";
|
|
@@ -260,8 +259,8 @@ async function assertCloneSafeObjdir(engineDir, objDir, role) {
|
|
|
260
259
|
* Materialises the tree at `treeRoot` from `primaryRoot` using `capability`
|
|
261
260
|
* ('none' = plain copy, already gated on --force-copy by the caller).
|
|
262
261
|
*
|
|
263
|
-
* The engine is cloned one
|
|
264
|
-
* directories are never traversed or materialised
|
|
262
|
+
* The engine is cloned one top-level entry at a time so unwanted `obj-*`
|
|
263
|
+
* directories are never traversed or materialised. On a Firefox tree, even
|
|
265
264
|
* CoW-cloning and then deleting an objdir touches metadata for millions of
|
|
266
265
|
* build outputs. With `withObjdir` exactly that objdir is included (after
|
|
267
266
|
* {@link assertCloneSafeObjdir} refuses symlinked or engine-escaping objdirs
|
|
@@ -273,7 +272,7 @@ async function assertCloneSafeObjdir(engineDir, objDir, role) {
|
|
|
273
272
|
export async function cloneTree(args) {
|
|
274
273
|
const { primaryRoot, treeRoot, name, capability, createdAt, withObjdir } = args;
|
|
275
274
|
if (withObjdir) {
|
|
276
|
-
// Refuse a symlinked/escaping primary objdir
|
|
275
|
+
// Refuse a symlinked/escaping primary objdir before any copying: the
|
|
277
276
|
// clone would carry the symlink and every later write would land in
|
|
278
277
|
// the original build (see assertCloneSafeObjdir).
|
|
279
278
|
await assertCloneSafeObjdir(join(primaryRoot, 'engine'), withObjdir.objDir, 'primary');
|
|
@@ -294,8 +293,8 @@ export async function cloneTree(args) {
|
|
|
294
293
|
});
|
|
295
294
|
});
|
|
296
295
|
// A selected objdir embeds absolute topsrcdir/topobjdir paths back into
|
|
297
|
-
// the
|
|
298
|
-
// usable
|
|
296
|
+
// the primary tree. It is rewritten below before the marker records it as
|
|
297
|
+
// usable. No other objdir ever enters the snapshot.
|
|
299
298
|
if (await pathExists(engineDir)) {
|
|
300
299
|
// Defensive: never inherit a mid-operation git index lock.
|
|
301
300
|
await rm(join(engineDir, '.git', 'index.lock'), { force: true });
|
|
@@ -303,7 +302,7 @@ export async function cloneTree(args) {
|
|
|
303
302
|
if (withObjdir) {
|
|
304
303
|
await rewriteClonedObjdir(engineDir, withObjdir.objDir);
|
|
305
304
|
// Regenerate configure output (config.status, backend.mk, Makefile,
|
|
306
|
-
// config/autoconf.mk) against the tree's paths
|
|
305
|
+
// config/autoconf.mk) against the tree's paths. The mozinfo rewrite
|
|
307
306
|
// alone leaves those naming the primary. A failed reconfigure throws
|
|
308
307
|
// before the marker below records the objdir as usable (fail-closed).
|
|
309
308
|
await withObjdir.reconfigure(engineDir);
|
|
@@ -315,7 +314,7 @@ export async function cloneTree(args) {
|
|
|
315
314
|
}
|
|
316
315
|
if (withObjdir) {
|
|
317
316
|
// The in-tree stale-build and static-components gates anchor on the
|
|
318
|
-
// last-build baseline
|
|
317
|
+
// last-build baseline. Without the copy they would read `undefined`
|
|
319
318
|
// and degrade to first-build semantics inside a fully built tree.
|
|
320
319
|
const baseline = getBuildBaselinePath(primaryRoot);
|
|
321
320
|
if (await pathExists(baseline)) {
|
|
@@ -340,7 +339,7 @@ export async function cloneTree(args) {
|
|
|
340
339
|
* Points the cloned objdir at the tree: rewrites mozinfo.json's
|
|
341
340
|
* topsrcdir/topobjdir (and an in-tree mozconfig) via the same
|
|
342
341
|
* safe-relocation rewriter `build --rewrite-mozinfo` uses, refusing
|
|
343
|
-
* fail-closed when its safety rules cannot prove the rewrite correct
|
|
342
|
+
* fail-closed when its safety rules cannot prove the rewrite correct:
|
|
344
343
|
* a tree must never hold an objdir that still names the primary. Before
|
|
345
344
|
* any write, the cloned objdir is re-checked as a real directory inside
|
|
346
345
|
* the tree ({@link assertCloneSafeObjdir}) so no write ever goes through
|
|
@@ -348,7 +347,7 @@ export async function cloneTree(args) {
|
|
|
348
347
|
* removed outright: their scripts carry primary-tree shebang paths, and
|
|
349
348
|
* mach rebuilds venvs in-tree on first use. The configure-generated root
|
|
350
349
|
* files (config.status, backend.mk, Makefile, config/autoconf.mk) still
|
|
351
|
-
* name the primary after this rewrite
|
|
350
|
+
* name the primary after this rewrite. They are regenerated by the
|
|
352
351
|
* in-tree `mach configure` the caller supplies to {@link cloneTree},
|
|
353
352
|
* which runs before the marker is written.
|
|
354
353
|
*/
|
|
@@ -392,7 +391,7 @@ export async function listTrees(primaryRoot) {
|
|
|
392
391
|
}
|
|
393
392
|
/**
|
|
394
393
|
* Classifies a mkdir-style lock directory. Reads the lock's owner file
|
|
395
|
-
* directly (line 1 = PID
|
|
394
|
+
* directly (line 1 = PID, the format `file-lock.ts` documents as stable,
|
|
396
395
|
* whose name it shares via {@link LOCK_PID_FILE}) instead of exporting
|
|
397
396
|
* file-lock internals.
|
|
398
397
|
*
|
|
@@ -403,7 +402,7 @@ export async function listTrees(primaryRoot) {
|
|
|
403
402
|
*
|
|
404
403
|
* The `unknown` state is not theoretical. `withFileLock` takes the lock by
|
|
405
404
|
* creating the directory and only *then* writes the owner file, treating a
|
|
406
|
-
* write failure as non-fatal
|
|
405
|
+
* write failure as non-fatal, so every acquisition passes through a window
|
|
407
406
|
* in which the lock is genuinely held and has no readable PID, and a
|
|
408
407
|
* read-only or full filesystem leaves it that way for the lock's whole life.
|
|
409
408
|
* Reporting that as `free` lets `removeTree` recursively delete a tree out
|
|
@@ -420,8 +419,9 @@ async function inspectTreeLock(lockPath) {
|
|
|
420
419
|
}
|
|
421
420
|
catch (error) {
|
|
422
421
|
// A lock cleanly released between the existence probe above and this read
|
|
423
|
-
// leaves no directory behind
|
|
424
|
-
// and demanding --force for it would be a spurious
|
|
422
|
+
// leaves no directory behind. That is a release rather than an
|
|
423
|
+
// unreadable owner, and demanding --force for it would be a spurious
|
|
424
|
+
// refusal.
|
|
425
425
|
if (!existsSync(lockPath))
|
|
426
426
|
return { kind: 'free' };
|
|
427
427
|
return {
|
|
@@ -437,16 +437,17 @@ async function inspectTreeLock(lockPath) {
|
|
|
437
437
|
}
|
|
438
438
|
/**
|
|
439
439
|
* Removes one tree. Refuses when a live process holds the tree's build
|
|
440
|
-
* or engine-session lock
|
|
441
|
-
* cannot be established
|
|
440
|
+
* or engine-session lock, or when a lock directory exists whose ownership
|
|
441
|
+
* cannot be established (which `--force` overrides). Never deletes a path
|
|
442
442
|
* outside the trees directory (containment check before `rm -rf`).
|
|
443
443
|
*/
|
|
444
444
|
export async function removeTree(primaryRoot, name, options = {}) {
|
|
445
445
|
assertValidTreeName(name);
|
|
446
446
|
// Both sides resolved: the containment prefix has to be in the same form as
|
|
447
447
|
// the path it guards. `getTreesDir` is a `join`, so on Windows it yields a
|
|
448
|
-
// drive-less path while `resolve` below adds the drive letter
|
|
449
|
-
// test then failed for
|
|
448
|
+
// drive-less path while `resolve` below adds the drive letter, so the
|
|
449
|
+
// prefix test then failed for every tree and refused each removal as an
|
|
450
|
+
// escape.
|
|
450
451
|
const treesDir = resolve(getTreesDir(primaryRoot));
|
|
451
452
|
const treeRoot = resolve(treesDir, name);
|
|
452
453
|
if (!treeRoot.startsWith(treesDir + sep) || basename(treeRoot) !== name) {
|
|
@@ -461,7 +462,7 @@ export async function removeTree(primaryRoot, name, options = {}) {
|
|
|
461
462
|
]) {
|
|
462
463
|
const state = await inspectTreeLock(lockPath);
|
|
463
464
|
if (state.kind === 'held') {
|
|
464
|
-
throw new GeneralError(`Refusing to remove tree "${name}": a live process (pid ${
|
|
465
|
+
throw new GeneralError(`Refusing to remove tree "${name}": a live process (pid ${state.pid}) holds ${lockPath}. ` +
|
|
465
466
|
'Wait for it to finish, then retry.');
|
|
466
467
|
}
|
|
467
468
|
if (state.kind === 'unknown' && options.force !== true) {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* `fireforge typecheck` command (`typecheck.ts`).
|
|
5
5
|
*
|
|
6
6
|
* Centralised so both flows agree on the same Firefox-globals shim
|
|
7
|
-
* and the same set of suppressed diagnostic codes
|
|
7
|
+
* and the same set of suppressed diagnostic codes. Drift between the
|
|
8
8
|
* two would mean a patch could lint clean under `fireforge lint` but
|
|
9
9
|
* still fail `fireforge typecheck`, or vice versa, for reasons the
|
|
10
10
|
* operator could not infer from the rule names.
|
|
@@ -13,15 +13,15 @@
|
|
|
13
13
|
export declare const SHIM_FILENAME = "__fireforge_firefox_globals.d.ts";
|
|
14
14
|
/**
|
|
15
15
|
* Loose declarations for Firefox test-harness globals (mochitest
|
|
16
|
-
* browser-chrome and xpcshell), appended
|
|
16
|
+
* browser-chrome and xpcshell), appended after the composed
|
|
17
17
|
* Firefox-globals + consumer shim when `patchLint.checkJsTestFiles`
|
|
18
18
|
* extends the checkJs pass to patch-adopted test scripts.
|
|
19
|
-
*
|
|
20
|
-
* shim. A consumer that wants
|
|
21
|
-
* a method the harness does not declare fails at the patch boundary)
|
|
22
|
-
* declares them in `patchLint.checkJsTestShim
|
|
23
|
-
* composes
|
|
24
|
-
* `declare var` redeclarations to the
|
|
19
|
+
* These are `any`-typed, the same pragmatic posture as the main
|
|
20
|
+
* shim. A consumer that wants typed harness members (so that, say, a call
|
|
21
|
+
* to a method the harness does not declare fails at the patch boundary)
|
|
22
|
+
* declares them in `patchLint.checkJsTestShim`. Because that shim
|
|
23
|
+
* composes before this baseline and TypeScript resolves conflicting
|
|
24
|
+
* `declare var` redeclarations to the first declaration, the typed
|
|
25
25
|
* consumer declaration wins over the loose fallback here.
|
|
26
26
|
*/
|
|
27
27
|
export declare const TEST_HARNESS_SHIM = "\n// \u2500\u2500 FireForge test-harness shim (loose baseline) \u2500\u2500\ndeclare var TestUtils: any;\ndeclare var BrowserTestUtils: any;\ndeclare var SpecialPowers: any;\ndeclare var EventUtils: any;\ndeclare var SimpleTest: any;\ndeclare var Assert: any;\ndeclare var gTestPath: string;\ndeclare var content: any;\ndeclare function add_task(task: (...args: any[]) => any): any;\ndeclare function add_setup(task: (...args: any[]) => any): any;\ndeclare function ok(condition: any, message?: string): void;\ndeclare function is(actual: any, expected: any, message?: string): void;\ndeclare function isnot(actual: any, expected: any, message?: string): void;\ndeclare function todo(condition: any, message?: string): void;\ndeclare function todo_is(actual: any, expected: any, message?: string): void;\ndeclare function info(message: string): void;\ndeclare function registerCleanupFunction(callback: (...args: any[]) => any): void;\ndeclare function waitForExplicitFinish(): void;\ndeclare function finish(): void;\ndeclare function do_get_profile(): any;\ndeclare function run_test(): any;\n\n";
|
|
@@ -32,7 +32,7 @@ export declare const TEST_HARNESS_SHIM = "\n// \u2500\u2500 FireForge test-harne
|
|
|
32
32
|
* build system: the resolver can't follow `resource://`/`chrome://`
|
|
33
33
|
* URLs and the global shim is intentionally narrow.
|
|
34
34
|
*
|
|
35
|
-
* Widening this set should be deliberate and per-code
|
|
35
|
+
* Widening this set should be deliberate and per-code: silently
|
|
36
36
|
* suppressing more codes hides real type errors. The same set is used
|
|
37
37
|
* by both flows so a patch can't pass one and fail the other for a
|
|
38
38
|
* reason the operator couldn't infer from the docs.
|
|
@@ -44,8 +44,9 @@ export declare const SUPPRESSED_DIAGNOSTIC_CODES: ReadonlySet<number>;
|
|
|
44
44
|
* a module reference a name with no import or declaration anywhere and still
|
|
45
45
|
* typecheck with 0 errors, so the failure surfaces as a runtime
|
|
46
46
|
* `ReferenceError`. Both flows report these at a configurable severity
|
|
47
|
-
* (default `'warning'`: visible without breaking gates
|
|
48
|
-
* are silenced by adding the global to `extraShim`, or per-run via
|
|
47
|
+
* (default `'warning'`: visible without breaking gates, while genuine shim
|
|
48
|
+
* gaps are silenced by adding the global to `extraShim`, or per-run via
|
|
49
|
+
* `'off'`).
|
|
49
50
|
*/
|
|
50
51
|
export declare const UNDEFINED_IDENTIFIER_CODES: ReadonlySet<number>;
|
|
51
52
|
/** Hint appended to reported undefined-identifier diagnostics. */
|
|
@@ -62,18 +63,18 @@ export interface ComposedShim {
|
|
|
62
63
|
/**
|
|
63
64
|
* Composes the synthetic shim source by concatenating the built-in Firefox
|
|
64
65
|
* globals shim with the contents of an optional user-supplied `.d.ts` file.
|
|
65
|
-
* The user file is appended verbatim
|
|
66
|
+
* The user file is appended verbatim. The augment direction is intentional
|
|
66
67
|
* (declarations later in concat order augment earlier ones), so a project
|
|
67
68
|
* that wants to refine `Services` with a more specific type can do so in the
|
|
68
|
-
* extra shim, and members can be
|
|
69
|
-
* their interfaces (`interface ChromeUtilsShim { newMember(): any }
|
|
69
|
+
* extra shim, and members can be added to the structured globals by merging
|
|
70
|
+
* their interfaces (`interface ChromeUtilsShim { newMember(): any }`, see
|
|
70
71
|
* the module doc comment). Any triple-slash `/// <reference path="…">`
|
|
71
72
|
* directives inside the extra shim are inlined (resolved against the extra
|
|
72
73
|
* shim's own directory) so they are not silently dropped at the synthetic
|
|
73
74
|
* shim path.
|
|
74
75
|
*
|
|
75
76
|
* Missing extra-shim files raise a clear error rather than failing silently
|
|
76
|
-
* with a confusing "type not found" downstream
|
|
77
|
+
* with a confusing "type not found" downstream. This is the one
|
|
77
78
|
* config-driven path where a user typo in `fireforge.json` produces a
|
|
78
79
|
* runtime error, so it needs to be unmistakable.
|
|
79
80
|
*
|