@hominis/fireforge 0.46.0 → 0.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +17 -9
- package/dist/src/core/token-dark-mode.js +41 -28
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* override as `mozInfo["appname"] + "-appdir"`. On a stock Firefox build the
|
|
10
10
|
* key is `firefox-appdir`, so the very common `firefox-appdir = "browser"`
|
|
11
11
|
* directive is honoured. On a rebranded fork (appname=`mybrowser`) the
|
|
12
|
-
* harness looks for `mybrowser-appdir
|
|
12
|
+
* harness looks for `mybrowser-appdir`, so the literal `firefox-appdir` line
|
|
13
13
|
* is silently ignored, `appPath` falls back to `xrePath`, and every
|
|
14
14
|
* `resource:///modules/…` import throws `Failed to load
|
|
15
15
|
* resource:///modules/<name>.sys.mjs` because xpcshell resolves the
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* `xpcshell.toml`. If none exists, the test is not an xpcshell test and
|
|
22
22
|
* there is nothing to inject.
|
|
23
23
|
* 2. Read the manifest's `[DEFAULT]` section. Look for `<appname>-appdir`
|
|
24
|
-
* first
|
|
24
|
+
* first. If present, the harness already finds it. Fall back to
|
|
25
25
|
* `firefox-appdir`. This ordering matches upstream precedence and avoids
|
|
26
26
|
* overriding an operator who already migrated.
|
|
27
27
|
* 3. If only `firefox-appdir` is present and `appname != "firefox"`, compute
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
* `dist/<bundle>.app/Contents/Resources/<value>` for the macOS packaged
|
|
31
31
|
* layout) and return it as the value to pass to `--app-path`.
|
|
32
32
|
* 4. If multiple test paths disagree on the resolved value, refuse injection
|
|
33
|
-
* and return null
|
|
33
|
+
* and return null. The operator can drop down to `--mach-arg`.
|
|
34
34
|
*
|
|
35
35
|
* Operator escape hatch: `--mach-arg=--app-path=…` always wins (handled in
|
|
36
36
|
* test.ts, which skips injection when `--app-path=` already appears in the
|
|
@@ -60,7 +60,7 @@ export interface AppdirResolveResult {
|
|
|
60
60
|
* - Single- or double-quoted values
|
|
61
61
|
* - Whitespace either side of `=`
|
|
62
62
|
* - Continuation comments (`#` or `;`) at the end of the line
|
|
63
|
-
* - Bare unquoted bareword values (e.g. `firefox-appdir = browser`)
|
|
63
|
+
* - Bare unquoted bareword values (e.g. `firefox-appdir = browser`). Some
|
|
64
64
|
* operators omit the quotes and the harness honours either form.
|
|
65
65
|
*
|
|
66
66
|
* Returns `undefined` when the key is absent or sits outside `[DEFAULT]`.
|
|
@@ -74,10 +74,10 @@ export declare function parseAppdirFromToml(tomlText: string, key: string): {
|
|
|
74
74
|
* returns the absolute path of the first sibling `xpcshell.toml` found.
|
|
75
75
|
* Stops at `engineDir` (inclusive) and returns null on miss.
|
|
76
76
|
*
|
|
77
|
-
* Special-cases `startPath` itself when it already ends with
|
|
78
|
-
*
|
|
77
|
+
* Special-cases `startPath` itself when it already ends with
|
|
78
|
+
* `xpcshell.toml`, since operators sometimes pass a manifest path directly.
|
|
79
79
|
*
|
|
80
|
-
* When `startPath` is a
|
|
80
|
+
* When `startPath` is a directory, the walk starts at the directory itself
|
|
81
81
|
* (checking `<dir>/xpcshell.toml` first) rather than at its parent.
|
|
82
82
|
* Starting at the parent misses a directory's own manifest, so
|
|
83
83
|
* `fireforge test <dir>` classifies it non-xpcshell and dispatches to the
|
|
@@ -86,31 +86,31 @@ export declare function parseAppdirFromToml(tomlText: string, key: string): {
|
|
|
86
86
|
export declare function findNearestXpcshellManifest(engineDir: string, startPath: string): Promise<string | null>;
|
|
87
87
|
/**
|
|
88
88
|
* Reads `<objDir>/mozinfo.json` for the active app name. Returns
|
|
89
|
-
* `"firefox"` when mozinfo cannot be read or the field is missing
|
|
89
|
+
* `"firefox"` when mozinfo cannot be read or the field is missing. That
|
|
90
90
|
* is the safe default because it matches stock Firefox behaviour and
|
|
91
91
|
* means the resolver will not inject anything (the manifest's
|
|
92
|
-
* `firefox-appdir` value
|
|
92
|
+
* `firefox-appdir` value is honoured by the upstream harness when
|
|
93
93
|
* appname is firefox).
|
|
94
94
|
*/
|
|
95
95
|
export declare function readMozinfoAppname(objDirPath: string): Promise<string>;
|
|
96
96
|
/**
|
|
97
97
|
* Probes the obj-dir's `dist/` subtree for the absolute path the harness
|
|
98
98
|
* would have computed if the manifest key had been honoured. Returns null
|
|
99
|
-
* when no candidate exists
|
|
99
|
+
* when no candidate exists: better to skip injection silently than to point
|
|
100
100
|
* the harness at a path that does not exist, which fails with a different
|
|
101
101
|
* error than the original symptom and confuses triage.
|
|
102
102
|
*
|
|
103
103
|
* Probe order differs by host platform:
|
|
104
104
|
*
|
|
105
|
-
* -
|
|
106
|
-
* `<objDir>/dist/<App>.app/Contents/Resources/<value>`
|
|
105
|
+
* - macOS (`darwin`): prefer
|
|
106
|
+
* `<objDir>/dist/<App>.app/Contents/Resources/<value>` first, then fall
|
|
107
107
|
* back to `<objDir>/dist/bin/<value>`. On macOS `dist/bin` is symlinked to
|
|
108
|
-
* `dist/<App>.app/Contents/MacOS/` (the
|
|
109
|
-
* `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser
|
|
110
|
-
*
|
|
111
|
-
* successful in the log but points at a directory with no modules
|
|
112
|
-
* every `resource:///modules/…` import still throws.
|
|
113
|
-
* -
|
|
108
|
+
* `dist/<App>.app/Contents/MacOS/` (the binaries directory), so
|
|
109
|
+
* `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser/`,
|
|
110
|
+
* which is not where `resource:///modules/` is rooted. Injecting that path
|
|
111
|
+
* looks successful in the log but points at a directory with no modules
|
|
112
|
+
* tree, so every `resource:///modules/…` import still throws.
|
|
113
|
+
* - non-macOS: `dist/bin/<value>` first,
|
|
114
114
|
* `.app/Contents/Resources/<value>` as fallback.
|
|
115
115
|
*
|
|
116
116
|
* On both platforms the final `.app` fallback iterates every `*.app` entry
|
|
@@ -121,7 +121,7 @@ export declare function resolveAbsoluteAppPath(objDirAbs: string, relativeAppdir
|
|
|
121
121
|
* Outcome carrier for {@link resolveXpcshellAppdirArg}. Distinguishes the
|
|
122
122
|
* three "did nothing" cases so callers can shape diagnostics:
|
|
123
123
|
* - `none`: no manifest under any test path needs injection.
|
|
124
|
-
* - `mismatch`: at least two manifests resolved to different values
|
|
124
|
+
* - `mismatch`: at least two manifests resolved to different values. We
|
|
125
125
|
* refuse to guess which one the operator meant.
|
|
126
126
|
* - `unresolved`: the manifest asks for `firefox-appdir = "<value>"` but
|
|
127
127
|
* no `dist/` candidate exists for that value.
|
|
@@ -143,7 +143,7 @@ export type XpcshellAppdirOutcome = {
|
|
|
143
143
|
/**
|
|
144
144
|
* Top-level resolver. Walks every test path, reads the nearest
|
|
145
145
|
* xpcshell.toml, and returns the single absolute path to inject (or a
|
|
146
|
-
* structured "no injection" outcome). Never throws
|
|
146
|
+
* structured "no injection" outcome). Never throws: every fs / parse
|
|
147
147
|
* error is folded into a `none` outcome so the test command always falls
|
|
148
148
|
* through to the diagnostic hint instead of dying inside a helper.
|
|
149
149
|
*/
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* override as `mozInfo["appname"] + "-appdir"`. On a stock Firefox build the
|
|
11
11
|
* key is `firefox-appdir`, so the very common `firefox-appdir = "browser"`
|
|
12
12
|
* directive is honoured. On a rebranded fork (appname=`mybrowser`) the
|
|
13
|
-
* harness looks for `mybrowser-appdir
|
|
13
|
+
* harness looks for `mybrowser-appdir`, so the literal `firefox-appdir` line
|
|
14
14
|
* is silently ignored, `appPath` falls back to `xrePath`, and every
|
|
15
15
|
* `resource:///modules/…` import throws `Failed to load
|
|
16
16
|
* resource:///modules/<name>.sys.mjs` because xpcshell resolves the
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* `xpcshell.toml`. If none exists, the test is not an xpcshell test and
|
|
23
23
|
* there is nothing to inject.
|
|
24
24
|
* 2. Read the manifest's `[DEFAULT]` section. Look for `<appname>-appdir`
|
|
25
|
-
* first
|
|
25
|
+
* first. If present, the harness already finds it. Fall back to
|
|
26
26
|
* `firefox-appdir`. This ordering matches upstream precedence and avoids
|
|
27
27
|
* overriding an operator who already migrated.
|
|
28
28
|
* 3. If only `firefox-appdir` is present and `appname != "firefox"`, compute
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
* `dist/<bundle>.app/Contents/Resources/<value>` for the macOS packaged
|
|
32
32
|
* layout) and return it as the value to pass to `--app-path`.
|
|
33
33
|
* 4. If multiple test paths disagree on the resolved value, refuse injection
|
|
34
|
-
* and return null
|
|
34
|
+
* and return null. The operator can drop down to `--mach-arg`.
|
|
35
35
|
*
|
|
36
36
|
* Operator escape hatch: `--mach-arg=--app-path=…` always wins (handled in
|
|
37
37
|
* test.ts, which skips injection when `--app-path=` already appears in the
|
|
@@ -51,7 +51,7 @@ import { isObject, isString } from '../utils/validation.js';
|
|
|
51
51
|
* - Single- or double-quoted values
|
|
52
52
|
* - Whitespace either side of `=`
|
|
53
53
|
* - Continuation comments (`#` or `;`) at the end of the line
|
|
54
|
-
* - Bare unquoted bareword values (e.g. `firefox-appdir = browser`)
|
|
54
|
+
* - Bare unquoted bareword values (e.g. `firefox-appdir = browser`). Some
|
|
55
55
|
* operators omit the quotes and the harness honours either form.
|
|
56
56
|
*
|
|
57
57
|
* Returns `undefined` when the key is absent or sits outside `[DEFAULT]`.
|
|
@@ -93,7 +93,7 @@ function stripQuotes(raw) {
|
|
|
93
93
|
if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
|
|
94
94
|
return raw.slice(1, -1);
|
|
95
95
|
}
|
|
96
|
-
// Bareword: must not contain whitespace
|
|
96
|
+
// Bareword: must not contain whitespace. Otherwise we are looking at
|
|
97
97
|
// commentary that the regex's optional comment tail did not strip.
|
|
98
98
|
if (/\s/.test(raw))
|
|
99
99
|
return undefined;
|
|
@@ -104,10 +104,10 @@ function stripQuotes(raw) {
|
|
|
104
104
|
* returns the absolute path of the first sibling `xpcshell.toml` found.
|
|
105
105
|
* Stops at `engineDir` (inclusive) and returns null on miss.
|
|
106
106
|
*
|
|
107
|
-
* Special-cases `startPath` itself when it already ends with
|
|
108
|
-
*
|
|
107
|
+
* Special-cases `startPath` itself when it already ends with
|
|
108
|
+
* `xpcshell.toml`, since operators sometimes pass a manifest path directly.
|
|
109
109
|
*
|
|
110
|
-
* When `startPath` is a
|
|
110
|
+
* When `startPath` is a directory, the walk starts at the directory itself
|
|
111
111
|
* (checking `<dir>/xpcshell.toml` first) rather than at its parent.
|
|
112
112
|
* Starting at the parent misses a directory's own manifest, so
|
|
113
113
|
* `fireforge test <dir>` classifies it non-xpcshell and dispatches to the
|
|
@@ -122,8 +122,8 @@ export async function findNearestXpcshellManifest(engineDir, startPath) {
|
|
|
122
122
|
const engineAbs = resolve(engineDir);
|
|
123
123
|
let current = absStart;
|
|
124
124
|
// First iteration resolves the starting directory (the path itself for a
|
|
125
|
-
// directory argument, its parent for a file)
|
|
126
|
-
// Cap iterations defensively
|
|
125
|
+
// directory argument, its parent for a file). Subsequent ones walk up.
|
|
126
|
+
// Cap iterations defensively: a pathological symlink loop would
|
|
127
127
|
// otherwise spin until the call stack overflows.
|
|
128
128
|
for (let i = 0; i < 64; i += 1) {
|
|
129
129
|
const dir = i === 0 ? (startIsDirectory ? absStart : dirname(absStart)) : dirname(current);
|
|
@@ -138,10 +138,10 @@ export async function findNearestXpcshellManifest(engineDir, startPath) {
|
|
|
138
138
|
}
|
|
139
139
|
/**
|
|
140
140
|
* Reads `<objDir>/mozinfo.json` for the active app name. Returns
|
|
141
|
-
* `"firefox"` when mozinfo cannot be read or the field is missing
|
|
141
|
+
* `"firefox"` when mozinfo cannot be read or the field is missing. That
|
|
142
142
|
* is the safe default because it matches stock Firefox behaviour and
|
|
143
143
|
* means the resolver will not inject anything (the manifest's
|
|
144
|
-
* `firefox-appdir` value
|
|
144
|
+
* `firefox-appdir` value is honoured by the upstream harness when
|
|
145
145
|
* appname is firefox).
|
|
146
146
|
*/
|
|
147
147
|
export async function readMozinfoAppname(objDirPath) {
|
|
@@ -156,28 +156,28 @@ export async function readMozinfoAppname(objDirPath) {
|
|
|
156
156
|
}
|
|
157
157
|
catch {
|
|
158
158
|
// Malformed mozinfo is a build-system problem out of scope for the
|
|
159
|
-
// appdir resolver
|
|
159
|
+
// appdir resolver. Treat as if appname were missing.
|
|
160
160
|
}
|
|
161
161
|
return 'firefox';
|
|
162
162
|
}
|
|
163
163
|
/**
|
|
164
164
|
* Probes the obj-dir's `dist/` subtree for the absolute path the harness
|
|
165
165
|
* would have computed if the manifest key had been honoured. Returns null
|
|
166
|
-
* when no candidate exists
|
|
166
|
+
* when no candidate exists: better to skip injection silently than to point
|
|
167
167
|
* the harness at a path that does not exist, which fails with a different
|
|
168
168
|
* error than the original symptom and confuses triage.
|
|
169
169
|
*
|
|
170
170
|
* Probe order differs by host platform:
|
|
171
171
|
*
|
|
172
|
-
* -
|
|
173
|
-
* `<objDir>/dist/<App>.app/Contents/Resources/<value>`
|
|
172
|
+
* - macOS (`darwin`): prefer
|
|
173
|
+
* `<objDir>/dist/<App>.app/Contents/Resources/<value>` first, then fall
|
|
174
174
|
* back to `<objDir>/dist/bin/<value>`. On macOS `dist/bin` is symlinked to
|
|
175
|
-
* `dist/<App>.app/Contents/MacOS/` (the
|
|
176
|
-
* `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser
|
|
177
|
-
*
|
|
178
|
-
* successful in the log but points at a directory with no modules
|
|
179
|
-
* every `resource:///modules/…` import still throws.
|
|
180
|
-
* -
|
|
175
|
+
* `dist/<App>.app/Contents/MacOS/` (the binaries directory), so
|
|
176
|
+
* `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser/`,
|
|
177
|
+
* which is not where `resource:///modules/` is rooted. Injecting that path
|
|
178
|
+
* looks successful in the log but points at a directory with no modules
|
|
179
|
+
* tree, so every `resource:///modules/…` import still throws.
|
|
180
|
+
* - non-macOS: `dist/bin/<value>` first,
|
|
181
181
|
* `.app/Contents/Resources/<value>` as fallback.
|
|
182
182
|
*
|
|
183
183
|
* On both platforms the final `.app` fallback iterates every `*.app` entry
|
|
@@ -222,7 +222,7 @@ export async function resolveAbsoluteAppPath(objDirAbs, relativeAppdir) {
|
|
|
222
222
|
/**
|
|
223
223
|
* Top-level resolver. Walks every test path, reads the nearest
|
|
224
224
|
* xpcshell.toml, and returns the single absolute path to inject (or a
|
|
225
|
-
* structured "no injection" outcome). Never throws
|
|
225
|
+
* structured "no injection" outcome). Never throws: every fs / parse
|
|
226
226
|
* error is folded into a `none` outcome so the test command always falls
|
|
227
227
|
* through to the diagnostic hint instead of dying inside a helper.
|
|
228
228
|
*/
|
|
@@ -231,7 +231,7 @@ export async function resolveXpcshellAppdirArg(engineDir, testPaths, objDirName)
|
|
|
231
231
|
return { kind: 'none' };
|
|
232
232
|
const objDirAbs = resolve(engineDir, objDirName);
|
|
233
233
|
const appname = await readMozinfoAppname(objDirAbs);
|
|
234
|
-
// When appname
|
|
234
|
+
// When appname is "firefox" the upstream harness reads `firefox-appdir`
|
|
235
235
|
// natively. Injecting in that case would be a no-op at best and an
|
|
236
236
|
// override at worst, so bail out before doing any IO per-path.
|
|
237
237
|
if (appname === 'firefox')
|
|
@@ -247,11 +247,11 @@ export async function resolveXpcshellAppdirArg(engineDir, testPaths, objDirName)
|
|
|
247
247
|
body = await readText(manifestPath);
|
|
248
248
|
}
|
|
249
249
|
catch {
|
|
250
|
-
// An unreadable manifest cannot declare an appdir
|
|
250
|
+
// An unreadable manifest cannot declare an appdir. Skip it and keep
|
|
251
251
|
// walking the remaining candidates.
|
|
252
252
|
continue;
|
|
253
253
|
}
|
|
254
|
-
// Operator already migrated
|
|
254
|
+
// Operator already migrated. The harness will read the appname-keyed
|
|
255
255
|
// value directly. Nothing to do.
|
|
256
256
|
if (parseAppdirFromToml(body, appnameKey) !== undefined)
|
|
257
257
|
continue;
|
|
@@ -2,11 +2,11 @@ export declare const XPCSHELL_PROFILE_ENV_VAR = "XPCSHELL_TEST_PROFILE_DIR";
|
|
|
2
2
|
/**
|
|
3
3
|
* Runs `fn` with a fresh per-invocation xpcshell profile directory
|
|
4
4
|
* injected into the environment, removing the directory afterwards
|
|
5
|
-
* (best-effort
|
|
6
|
-
* for the OS tmp reaper
|
|
5
|
+
* (best-effort: a failure to clean up warns and leaves the mkdtemp dir
|
|
6
|
+
* for the OS tmp reaper, and the harness may still hold files briefly).
|
|
7
7
|
*
|
|
8
8
|
* An operator-provided `XPCSHELL_TEST_PROFILE_DIR` (in `baseEnv` or the
|
|
9
9
|
* process environment) is respected verbatim: no directory is minted and
|
|
10
|
-
*
|
|
10
|
+
* nothing is deleted, because we never remove a directory we did not create.
|
|
11
11
|
*/
|
|
12
12
|
export declare function withXpcshellProfileDir<T>(baseEnv: Record<string, string> | undefined, fn: (env: Record<string, string>) => Promise<T>): Promise<T>;
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* Per-invocation xpcshell profile directory.
|
|
4
4
|
*
|
|
5
5
|
* Firefox's xpcshell harness defaults `XPCSHELL_TEST_PROFILE_DIR` to a
|
|
6
|
-
*
|
|
7
|
-
* harness invocations
|
|
8
|
-
* verification-tree shards
|
|
9
|
-
* never set the variable
|
|
6
|
+
* fixed path (`$TMPDIR/firefox/xpcshellprofile`), so two overlapping
|
|
7
|
+
* harness invocations (concurrent `fireforge test` processes, or future
|
|
8
|
+
* verification-tree shards) corrupt each other's profiles. FireForge
|
|
9
|
+
* never set the variable. This helper mints a fresh `mkdtemp` directory
|
|
10
10
|
* per harness invocation and exports it through the mach env channel.
|
|
11
11
|
*/
|
|
12
12
|
import { mkdtemp, rm } from 'node:fs/promises';
|
|
@@ -18,12 +18,12 @@ export const XPCSHELL_PROFILE_ENV_VAR = 'XPCSHELL_TEST_PROFILE_DIR';
|
|
|
18
18
|
/**
|
|
19
19
|
* Runs `fn` with a fresh per-invocation xpcshell profile directory
|
|
20
20
|
* injected into the environment, removing the directory afterwards
|
|
21
|
-
* (best-effort
|
|
22
|
-
* for the OS tmp reaper
|
|
21
|
+
* (best-effort: a failure to clean up warns and leaves the mkdtemp dir
|
|
22
|
+
* for the OS tmp reaper, and the harness may still hold files briefly).
|
|
23
23
|
*
|
|
24
24
|
* An operator-provided `XPCSHELL_TEST_PROFILE_DIR` (in `baseEnv` or the
|
|
25
25
|
* process environment) is respected verbatim: no directory is minted and
|
|
26
|
-
*
|
|
26
|
+
* nothing is deleted, because we never remove a directory we did not create.
|
|
27
27
|
*/
|
|
28
28
|
export async function withXpcshellProfileDir(baseEnv, fn) {
|
|
29
29
|
const operatorProvided = baseEnv?.[XPCSHELL_PROFILE_ENV_VAR] ?? process.env[XPCSHELL_PROFILE_ENV_VAR];
|
|
@@ -26,7 +26,7 @@ export declare abstract class FireForgeError extends Error {
|
|
|
26
26
|
* Numbering is derived from the array rather than written into each string.
|
|
27
27
|
* Several classes vary their advice by context (`FurnaceError` drops the
|
|
28
28
|
* validate step, `ChecksumMismatchError` adds a Developer Edition note), and
|
|
29
|
-
* hand-numbered branches had to renumber every later step by hand
|
|
29
|
+
* hand-numbered branches had to renumber every later step by hand, one
|
|
30
30
|
* conditional away from printing "2." twice.
|
|
31
31
|
*
|
|
32
32
|
* @param steps - The remedy lines, in order, without their numbers
|
|
@@ -48,8 +48,8 @@ export declare class GeneralError extends FireForgeError {
|
|
|
48
48
|
* kebab-case refusal class that the `FIREFORGE-VERDICT:` line reports as an
|
|
49
49
|
* additive `note=` key. Without it every preflight refusal reached an
|
|
50
50
|
* unattended reader as the single token `reason=preflight`, which covers
|
|
51
|
-
* everything from a missing build to a peer's packaging record
|
|
52
|
-
* line that survives a truncating pipe could not say
|
|
51
|
+
* everything from a missing build to a peer's packaging record, so the one
|
|
52
|
+
* line that survives a truncating pipe could not say which gate fired.
|
|
53
53
|
*/
|
|
54
54
|
export declare class PreflightRefusalError extends GeneralError {
|
|
55
55
|
/** Stable refusal class, e.g. `stale-browser`. */
|
|
@@ -59,7 +59,7 @@ export declare class PreflightRefusalError extends GeneralError {
|
|
|
59
59
|
note: string);
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
-
* Raised when one of FireForge's own internal invariants did not hold
|
|
62
|
+
* Raised when one of FireForge's own internal invariants did not hold:
|
|
63
63
|
* the failure of a runtime assertion from `src/utils/assert.ts`.
|
|
64
64
|
*
|
|
65
65
|
* Dedicated subclass (rather than raw GeneralError) because an invariant
|
|
@@ -68,12 +68,12 @@ export declare class PreflightRefusalError extends GeneralError {
|
|
|
68
68
|
* fix. That difference is worth carrying all the way to the exit status
|
|
69
69
|
* (see {@link ExitCode.INTERNAL_ERROR}) so a CI job can escalate it
|
|
70
70
|
* instead of retrying it, and it is the one error class the CLI boundary
|
|
71
|
-
* prints a stack trace for
|
|
71
|
+
* prints a stack trace for, since the stack is the report.
|
|
72
72
|
*
|
|
73
73
|
* Assertions exist so that a violated invariant stops the run at the
|
|
74
74
|
* first inconsistency instead of continuing to write. In the mutating
|
|
75
75
|
* paths that means the surrounding rollback journal restores the engine
|
|
76
|
-
* before this reaches the operator
|
|
76
|
+
* before this reaches the operator. See `docs/lifecycle-invariants.md`.
|
|
77
77
|
*/
|
|
78
78
|
export declare class InternalInvariantError extends FireForgeError {
|
|
79
79
|
readonly code: 11;
|
|
@@ -81,7 +81,7 @@ export declare class InternalInvariantError extends FireForgeError {
|
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
83
83
|
* Raised when a legacy regex/brace-depth fallback parser decides it
|
|
84
|
-
* cannot safely perform its mutation
|
|
84
|
+
* cannot safely perform its mutation, e.g. because a block it expected
|
|
85
85
|
* to walk never closes, because the inserted result fails a round-trip
|
|
86
86
|
* brace balance check, or because an expected pattern is missing.
|
|
87
87
|
*
|
|
@@ -113,9 +113,10 @@ export declare class InvalidArgumentError extends FireForgeError {
|
|
|
113
113
|
*
|
|
114
114
|
* Every `exec*` helper in `src/utils/process.ts` rejects with this type
|
|
115
115
|
* instead of Node's bare `AbortError: The operation was aborted`, which
|
|
116
|
-
* carries no command name, no elapsed time, and no hint that a timeout
|
|
117
|
-
*
|
|
118
|
-
* errors/git.ts for the git-specific
|
|
116
|
+
* carries no command name, no elapsed time, and no hint that a timeout
|
|
117
|
+
* (rather than the command) was responsible. See
|
|
118
|
+
* {@link GitIndexingTimeoutError} in errors/git.ts for the git-specific
|
|
119
|
+
* variant.
|
|
119
120
|
*/
|
|
120
121
|
export declare class ExecTimeoutError extends FireForgeError {
|
|
121
122
|
/** Executable that was spawned (argv[0]). */
|
|
@@ -142,12 +143,12 @@ export declare class ExecTimeoutError extends FireForgeError {
|
|
|
142
143
|
/**
|
|
143
144
|
* The last few lines the command printed before it was killed, so an
|
|
144
145
|
* operator can see what it was doing (a `git add -A` stuck on one path,
|
|
145
|
-
* a build step that hung) instead of a bare budget number.
|
|
146
|
-
* stderr
|
|
146
|
+
* a build step that hung) instead of a bare budget number. It prefers
|
|
147
|
+
* stderr and falls back to stdout when stderr is silent.
|
|
147
148
|
*/
|
|
148
149
|
private outputTailForUser;
|
|
149
150
|
}
|
|
150
|
-
/** Output captured before an exec timeout fired
|
|
151
|
+
/** Output captured before an exec timeout fired. See {@link ExecTimeoutError}. */
|
|
151
152
|
export interface ExecTimeoutOutput {
|
|
152
153
|
stdout: string;
|
|
153
154
|
stderr: string;
|
|
@@ -160,12 +161,12 @@ export interface ExecTimeoutOutput {
|
|
|
160
161
|
* Dedicated subclass so the CLI boundary renders lock contention as the
|
|
161
162
|
* one-line reason-first/remedy-second refusal it is. As a plain `Error` it
|
|
162
163
|
* is treated by `withErrorHandling` as an internal failure and printed with
|
|
163
|
-
* a five-frame stack
|
|
164
|
+
* a five-frame stack: a correct refusal that looks like a crash.
|
|
164
165
|
*
|
|
165
166
|
* Exit code 15, not 1: the run never started. A script that retries on
|
|
166
167
|
* failure wants to re-queue this one, not treat it as a failure of the work
|
|
167
168
|
* it asked for. Every lock in FireForge shares the class and therefore the
|
|
168
|
-
* code
|
|
169
|
+
* code, because the fact is the same whichever lock was contended.
|
|
169
170
|
*/
|
|
170
171
|
export declare class LockContentionError extends FireForgeError {
|
|
171
172
|
readonly code: 15;
|
|
@@ -177,19 +178,19 @@ export declare class LockContentionError extends FireForgeError {
|
|
|
177
178
|
*
|
|
178
179
|
* Dedicated subclass for its exit code alone: as a `GeneralError` this
|
|
179
180
|
* refusal exited 1 beside real test failures' 5, and a summary line reading
|
|
180
|
-
* `FAIL
|
|
181
|
-
* kind of fact. They are opposites
|
|
182
|
-
* was discarded
|
|
181
|
+
* `FAIL, exit 1` next to `FAIL, exit 5` invites treating them as the same
|
|
182
|
+
* kind of fact. They are opposites (one suite failed, the other's result
|
|
183
|
+
* was discarded) and only a distinct code makes "unknown, re-run"
|
|
183
184
|
* mechanically separable from "red".
|
|
184
185
|
*/
|
|
185
186
|
export declare class InconclusiveVerdictError extends FireForgeError {
|
|
186
187
|
readonly code: 14;
|
|
187
188
|
}
|
|
188
189
|
/**
|
|
189
|
-
* Error thrown when the user
|
|
190
|
+
* Error thrown when the user interrupts an interactive prompt: Esc or
|
|
190
191
|
* Ctrl+C, i.e. `isCancel(...)`.
|
|
191
192
|
*
|
|
192
|
-
* Not for a prompt the operator
|
|
193
|
+
* Not for a prompt the operator answered "no" to: 130 is
|
|
193
194
|
* 128+SIGINT, which claims an interrupt. A declined confirmation is a
|
|
194
195
|
* successful run that chose not to proceed, and exits 0.
|
|
195
196
|
*/
|
|
@@ -208,7 +209,7 @@ export declare class ResolutionError extends FireForgeError {
|
|
|
208
209
|
* without calling process.exit() from shared library code.
|
|
209
210
|
*
|
|
210
211
|
* The user-visible error message has already been logged by the time this
|
|
211
|
-
* is thrown
|
|
212
|
+
* is thrown. The entrypoint only needs to read `.exitCode` and terminate.
|
|
212
213
|
*/
|
|
213
214
|
export declare class CommandError extends Error {
|
|
214
215
|
readonly exitCode: ExitCode;
|
package/dist/src/errors/base.js
CHANGED
|
@@ -18,7 +18,7 @@ export class FireForgeError extends Error {
|
|
|
18
18
|
this.cause = cause;
|
|
19
19
|
}
|
|
20
20
|
// Trims the constructor frames off the stack. `engines` pins Node >= 22,
|
|
21
|
-
// so the V8-only `captureStackTrace` is always present
|
|
21
|
+
// so the V8-only `captureStackTrace` is always present. The former
|
|
22
22
|
// `typeof === 'function'` guard was an unreachable branch that coverage
|
|
23
23
|
// could never close.
|
|
24
24
|
Error.captureStackTrace(this, this.constructor);
|
|
@@ -38,7 +38,7 @@ export class FireForgeError extends Error {
|
|
|
38
38
|
* Numbering is derived from the array rather than written into each string.
|
|
39
39
|
* Several classes vary their advice by context (`FurnaceError` drops the
|
|
40
40
|
* validate step, `ChecksumMismatchError` adds a Developer Edition note), and
|
|
41
|
-
* hand-numbered branches had to renumber every later step by hand
|
|
41
|
+
* hand-numbered branches had to renumber every later step by hand, one
|
|
42
42
|
* conditional away from printing "2." twice.
|
|
43
43
|
*
|
|
44
44
|
* @param steps - The remedy lines, in order, without their numbers
|
|
@@ -62,8 +62,8 @@ export class GeneralError extends FireForgeError {
|
|
|
62
62
|
* kebab-case refusal class that the `FIREFORGE-VERDICT:` line reports as an
|
|
63
63
|
* additive `note=` key. Without it every preflight refusal reached an
|
|
64
64
|
* unattended reader as the single token `reason=preflight`, which covers
|
|
65
|
-
* everything from a missing build to a peer's packaging record
|
|
66
|
-
* line that survives a truncating pipe could not say
|
|
65
|
+
* everything from a missing build to a peer's packaging record, so the one
|
|
66
|
+
* line that survives a truncating pipe could not say which gate fired.
|
|
67
67
|
*/
|
|
68
68
|
export class PreflightRefusalError extends GeneralError {
|
|
69
69
|
note;
|
|
@@ -75,7 +75,7 @@ export class PreflightRefusalError extends GeneralError {
|
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
/**
|
|
78
|
-
* Raised when one of FireForge's own internal invariants did not hold
|
|
78
|
+
* Raised when one of FireForge's own internal invariants did not hold:
|
|
79
79
|
* the failure of a runtime assertion from `src/utils/assert.ts`.
|
|
80
80
|
*
|
|
81
81
|
* Dedicated subclass (rather than raw GeneralError) because an invariant
|
|
@@ -84,12 +84,12 @@ export class PreflightRefusalError extends GeneralError {
|
|
|
84
84
|
* fix. That difference is worth carrying all the way to the exit status
|
|
85
85
|
* (see {@link ExitCode.INTERNAL_ERROR}) so a CI job can escalate it
|
|
86
86
|
* instead of retrying it, and it is the one error class the CLI boundary
|
|
87
|
-
* prints a stack trace for
|
|
87
|
+
* prints a stack trace for, since the stack is the report.
|
|
88
88
|
*
|
|
89
89
|
* Assertions exist so that a violated invariant stops the run at the
|
|
90
90
|
* first inconsistency instead of continuing to write. In the mutating
|
|
91
91
|
* paths that means the surrounding rollback journal restores the engine
|
|
92
|
-
* before this reaches the operator
|
|
92
|
+
* before this reaches the operator. See `docs/lifecycle-invariants.md`.
|
|
93
93
|
*/
|
|
94
94
|
export class InternalInvariantError extends FireForgeError {
|
|
95
95
|
code = ExitCode.INTERNAL_ERROR;
|
|
@@ -107,7 +107,7 @@ export class InternalInvariantError extends FireForgeError {
|
|
|
107
107
|
}
|
|
108
108
|
/**
|
|
109
109
|
* Raised when a legacy regex/brace-depth fallback parser decides it
|
|
110
|
-
* cannot safely perform its mutation
|
|
110
|
+
* cannot safely perform its mutation, e.g. because a block it expected
|
|
111
111
|
* to walk never closes, because the inserted result fails a round-trip
|
|
112
112
|
* brace balance check, or because an expected pattern is missing.
|
|
113
113
|
*
|
|
@@ -150,9 +150,10 @@ export class InvalidArgumentError extends FireForgeError {
|
|
|
150
150
|
*
|
|
151
151
|
* Every `exec*` helper in `src/utils/process.ts` rejects with this type
|
|
152
152
|
* instead of Node's bare `AbortError: The operation was aborted`, which
|
|
153
|
-
* carries no command name, no elapsed time, and no hint that a timeout
|
|
154
|
-
*
|
|
155
|
-
* errors/git.ts for the git-specific
|
|
153
|
+
* carries no command name, no elapsed time, and no hint that a timeout
|
|
154
|
+
* (rather than the command) was responsible. See
|
|
155
|
+
* {@link GitIndexingTimeoutError} in errors/git.ts for the git-specific
|
|
156
|
+
* variant.
|
|
156
157
|
*/
|
|
157
158
|
export class ExecTimeoutError extends FireForgeError {
|
|
158
159
|
command;
|
|
@@ -189,8 +190,8 @@ export class ExecTimeoutError extends FireForgeError {
|
|
|
189
190
|
/**
|
|
190
191
|
* The last few lines the command printed before it was killed, so an
|
|
191
192
|
* operator can see what it was doing (a `git add -A` stuck on one path,
|
|
192
|
-
* a build step that hung) instead of a bare budget number.
|
|
193
|
-
* stderr
|
|
193
|
+
* a build step that hung) instead of a bare budget number. It prefers
|
|
194
|
+
* stderr and falls back to stdout when stderr is silent.
|
|
194
195
|
*/
|
|
195
196
|
outputTailForUser() {
|
|
196
197
|
const source = this.stderr.trim().length > 0 ? this.stderr : this.stdout;
|
|
@@ -216,12 +217,12 @@ const EXEC_TIMEOUT_TAIL_LINES = 20;
|
|
|
216
217
|
* Dedicated subclass so the CLI boundary renders lock contention as the
|
|
217
218
|
* one-line reason-first/remedy-second refusal it is. As a plain `Error` it
|
|
218
219
|
* is treated by `withErrorHandling` as an internal failure and printed with
|
|
219
|
-
* a five-frame stack
|
|
220
|
+
* a five-frame stack: a correct refusal that looks like a crash.
|
|
220
221
|
*
|
|
221
222
|
* Exit code 15, not 1: the run never started. A script that retries on
|
|
222
223
|
* failure wants to re-queue this one, not treat it as a failure of the work
|
|
223
224
|
* it asked for. Every lock in FireForge shares the class and therefore the
|
|
224
|
-
* code
|
|
225
|
+
* code, because the fact is the same whichever lock was contended.
|
|
225
226
|
*/
|
|
226
227
|
export class LockContentionError extends FireForgeError {
|
|
227
228
|
code = ExitCode.LOCK_TIMEOUT;
|
|
@@ -233,19 +234,19 @@ export class LockContentionError extends FireForgeError {
|
|
|
233
234
|
*
|
|
234
235
|
* Dedicated subclass for its exit code alone: as a `GeneralError` this
|
|
235
236
|
* refusal exited 1 beside real test failures' 5, and a summary line reading
|
|
236
|
-
* `FAIL
|
|
237
|
-
* kind of fact. They are opposites
|
|
238
|
-
* was discarded
|
|
237
|
+
* `FAIL, exit 1` next to `FAIL, exit 5` invites treating them as the same
|
|
238
|
+
* kind of fact. They are opposites (one suite failed, the other's result
|
|
239
|
+
* was discarded) and only a distinct code makes "unknown, re-run"
|
|
239
240
|
* mechanically separable from "red".
|
|
240
241
|
*/
|
|
241
242
|
export class InconclusiveVerdictError extends FireForgeError {
|
|
242
243
|
code = ExitCode.INCONCLUSIVE;
|
|
243
244
|
}
|
|
244
245
|
/**
|
|
245
|
-
* Error thrown when the user
|
|
246
|
+
* Error thrown when the user interrupts an interactive prompt: Esc or
|
|
246
247
|
* Ctrl+C, i.e. `isCancel(...)`.
|
|
247
248
|
*
|
|
248
|
-
* Not for a prompt the operator
|
|
249
|
+
* Not for a prompt the operator answered "no" to: 130 is
|
|
249
250
|
* 128+SIGINT, which claims an interrupt. A declined confirmation is a
|
|
250
251
|
* successful run that chose not to proceed, and exits 0.
|
|
251
252
|
*/
|
|
@@ -266,7 +267,7 @@ export class ResolutionError extends FireForgeError {
|
|
|
266
267
|
* without calling process.exit() from shared library code.
|
|
267
268
|
*
|
|
268
269
|
* The user-visible error message has already been logged by the time this
|
|
269
|
-
* is thrown
|
|
270
|
+
* is thrown. The entrypoint only needs to read `.exitCode` and terminate.
|
|
270
271
|
*/
|
|
271
272
|
export class CommandError extends Error {
|
|
272
273
|
exitCode;
|
|
@@ -10,19 +10,19 @@ export declare class BuildError extends FireForgeError {
|
|
|
10
10
|
get userMessage(): string;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* A test
|
|
14
|
-
* pass. Distinct from its {@link BuildError} parent only in what it
|
|
15
|
-
* the operator,
|
|
13
|
+
* A test suite went red: assertions failed, or sharded runs did not all
|
|
14
|
+
* pass. Distinct from its {@link BuildError} parent only in what it tells
|
|
15
|
+
* the operator, and not in its exit code: `docs/exit-codes.md`
|
|
16
16
|
* documents 5 as "a suite that FAILED", and consumers key CI on it.
|
|
17
17
|
*
|
|
18
|
-
* The parent's remedies are all build remedies
|
|
19
|
-
* "fireforge bootstrap", "delete obj-* directories"
|
|
18
|
+
* The parent's remedies are all build remedies ("check the build output",
|
|
19
|
+
* "fireforge bootstrap", "delete obj-* directories") and none of them apply
|
|
20
20
|
* to a failing assertion. Worse, the first points at the wrong half of the
|
|
21
21
|
* log, which is exactly the half a `tail` keeps. Ground truth for a test red
|
|
22
22
|
* is the harness's own output, so the remedies here name the failing tests,
|
|
23
23
|
* the `FIREFORGE-VERDICT:` line, and the run log that survives a pipe.
|
|
24
24
|
*
|
|
25
|
-
*
|
|
25
|
+
* `machineErrorCode` derives the `--json` error code from the class
|
|
26
26
|
* name, so this reports as `test-failure` rather than `build`.
|
|
27
27
|
*/
|
|
28
28
|
export declare class TestFailureError extends BuildError {
|
package/dist/src/errors/build.js
CHANGED
|
@@ -22,19 +22,19 @@ export class BuildError extends FireForgeError {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
* A test
|
|
26
|
-
* pass. Distinct from its {@link BuildError} parent only in what it
|
|
27
|
-
* the operator,
|
|
25
|
+
* A test suite went red: assertions failed, or sharded runs did not all
|
|
26
|
+
* pass. Distinct from its {@link BuildError} parent only in what it tells
|
|
27
|
+
* the operator, and not in its exit code: `docs/exit-codes.md`
|
|
28
28
|
* documents 5 as "a suite that FAILED", and consumers key CI on it.
|
|
29
29
|
*
|
|
30
|
-
* The parent's remedies are all build remedies
|
|
31
|
-
* "fireforge bootstrap", "delete obj-* directories"
|
|
30
|
+
* The parent's remedies are all build remedies ("check the build output",
|
|
31
|
+
* "fireforge bootstrap", "delete obj-* directories") and none of them apply
|
|
32
32
|
* to a failing assertion. Worse, the first points at the wrong half of the
|
|
33
33
|
* log, which is exactly the half a `tail` keeps. Ground truth for a test red
|
|
34
34
|
* is the harness's own output, so the remedies here name the failing tests,
|
|
35
35
|
* the `FIREFORGE-VERDICT:` line, and the run log that survives a pipe.
|
|
36
36
|
*
|
|
37
|
-
*
|
|
37
|
+
* `machineErrorCode` derives the `--json` error code from the class
|
|
38
38
|
* name, so this reports as `test-failure` rather than `build`.
|
|
39
39
|
*/
|
|
40
40
|
export class TestFailureError extends BuildError {
|