@hominis/fireforge 0.46.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +11 -11
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -11,21 +11,21 @@ export interface ExecResult {
|
|
|
11
11
|
exitCode: number;
|
|
12
12
|
/**
|
|
13
13
|
* True when `stdout` was cut off at the 50 MB collector cap. Optional so
|
|
14
|
-
* existing mocks stay valid
|
|
14
|
+
* existing mocks stay valid. Absent means "not truncated". Callers that
|
|
15
15
|
* feed the output into safety decisions (e.g. archive-listing scans) must
|
|
16
|
-
* treat `true` as a hard failure
|
|
17
|
-
* a complete one
|
|
16
|
+
* treat `true` as a hard failure, since a truncated listing otherwise
|
|
17
|
+
* looks exactly like a complete one.
|
|
18
18
|
*/
|
|
19
19
|
stdoutTruncated?: boolean;
|
|
20
20
|
/** True when `stderr` was cut off at the 50 MB collector cap. See {@link ExecResult.stdoutTruncated}. */
|
|
21
21
|
stderrTruncated?: boolean;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Options for plain `exec()
|
|
24
|
+
* Options for plain `exec()`, the pipe-capturing, non-grouped, non-mirrored
|
|
25
25
|
* path. The other wrappers extend this with the fields they actually read:
|
|
26
26
|
* `processGroup` lives in {@link ProcessGroupOptions}, `mirror` in
|
|
27
27
|
* {@link MirrorOptions}. Neither belongs here because `exec()` reads
|
|
28
|
-
* neither
|
|
28
|
+
* neither, and a field the type accepts but the function ignores is a trap
|
|
29
29
|
* (the caller believes it got a process group, and never did).
|
|
30
30
|
*/
|
|
31
31
|
export interface ExecOptions {
|
|
@@ -34,13 +34,13 @@ export interface ExecOptions {
|
|
|
34
34
|
/** Environment variables */
|
|
35
35
|
env?: Record<string, string>;
|
|
36
36
|
/**
|
|
37
|
-
* Environment variables to
|
|
37
|
+
* Environment variables to remove from the child's inherited environment,
|
|
38
38
|
* applied after {@link ExecOptions.env} is merged over `process.env`.
|
|
39
39
|
*
|
|
40
40
|
* Needed because `env` can only add or overwrite, and some variables are
|
|
41
|
-
* read for their
|
|
41
|
+
* read only for their presence: mozbuild's `is_running_under_coding_agent()`
|
|
42
42
|
* keys on `CLAUDECODE`, so setting it empty would not unset it. An
|
|
43
|
-
* explicit delete says what it means
|
|
43
|
+
* explicit delete says what it means. Relying on Node dropping
|
|
44
44
|
* `undefined`-valued env entries would be a semantics gamble at a layer
|
|
45
45
|
* that must not have any.
|
|
46
46
|
*/
|
|
@@ -59,7 +59,7 @@ export interface MirrorOptions {
|
|
|
59
59
|
* path, or an operator-supplied `--capture-console` file on the smoke
|
|
60
60
|
* path. Lets a caller tee the live output somewhere else (a run log)
|
|
61
61
|
* without a second per-chunk hook. Writes happen inline with capture and
|
|
62
|
-
* the stream is
|
|
62
|
+
* the stream is not closed here. The caller owns its lifecycle.
|
|
63
63
|
*/
|
|
64
64
|
mirror?: {
|
|
65
65
|
stdout?: NodeJS.WritableStream;
|
|
@@ -73,15 +73,15 @@ export interface MirrorOptions {
|
|
|
73
73
|
export interface ProcessGroupOptions {
|
|
74
74
|
/**
|
|
75
75
|
* POSIX: spawn the child as a process-group leader and route every kill
|
|
76
|
-
* (parent-signal forwarding, abort, escalation) to the whole
|
|
77
|
-
* sweep the group for survivors after close
|
|
76
|
+
* (parent-signal forwarding, abort, escalation) to the whole group, then
|
|
77
|
+
* sweep the group for survivors after close, so a harness that dies at
|
|
78
78
|
* startup cannot strand spinning `multiprocessing` workers, which reparent
|
|
79
79
|
* to launchd and busy-spin at 100% CPU indefinitely. Win32: tree-kill via
|
|
80
80
|
* `taskkill /T /F` on abort/signals only, no post-run sweep
|
|
81
|
-
* (best-effort). Default false
|
|
81
|
+
* (best-effort). Default false, so non-mach consumers are unaffected.
|
|
82
82
|
*
|
|
83
|
-
* NOTE for callers: a detached group leader does
|
|
84
|
-
* Ctrl+C
|
|
83
|
+
* NOTE for callers: a detached group leader does not receive terminal
|
|
84
|
+
* Ctrl+C. The exec layer installs its own group-aware signal forwarder
|
|
85
85
|
* whenever this option is set.
|
|
86
86
|
*/
|
|
87
87
|
processGroup?: boolean;
|
|
@@ -121,7 +121,7 @@ export declare function execStream(command: string, args: string[], options?: St
|
|
|
121
121
|
* Exported for the one legitimate spawn outside this module:
|
|
122
122
|
* `core/marionette-preflight.ts` keeps its own `spawn` because it needs the
|
|
123
123
|
* live `ChildProcess` mid-run, returns while the child is still running, and
|
|
124
|
-
* aborts on a TCP byte rather than a deadline
|
|
124
|
+
* aborts on a TCP byte rather than a deadline, none of which any wrapper
|
|
125
125
|
* here can express. It still needs the shutdown contract, and a second
|
|
126
126
|
* hand-rolled copy is what lets a Ctrl+C orphan the whole mach → Firefox
|
|
127
127
|
* tree.
|
|
@@ -130,7 +130,7 @@ export declare function execStream(command: string, args: string[], options?: St
|
|
|
130
130
|
* Registers a child whose shutdown {@link waitForActiveChildShutdown} must
|
|
131
131
|
* wait for, and returns the handle that deregisters it.
|
|
132
132
|
*
|
|
133
|
-
* @returns `settle()
|
|
133
|
+
* @returns `settle()`. Call from both the child's `close` and `error`
|
|
134
134
|
* handlers so a dead child never holds the shutdown wait open
|
|
135
135
|
*/
|
|
136
136
|
export declare function trackChildClosure(): {
|
|
@@ -157,7 +157,7 @@ export interface InheritCaptureOptions extends InheritOptions, MirrorOptions {
|
|
|
157
157
|
* Graceful shutdown: when the FireForge process receives SIGINT/SIGTERM, the
|
|
158
158
|
* signal is forwarded to the child as SIGTERM and a short grace timer (default
|
|
159
159
|
* 1500ms) runs before escalating to SIGKILL. A second matching signal during
|
|
160
|
-
* the grace period triggers an immediate SIGKILL
|
|
160
|
+
* the grace period triggers an immediate SIGKILL, matching the usual
|
|
161
161
|
* "hit Ctrl-C again to force-quit" UX. Without this, Firefox's AsyncShutdown
|
|
162
162
|
* / profileBeforeChange blockers (which flush in-memory state to disk) can be
|
|
163
163
|
* racing the OS child-exit path, losing the last few seconds of edits.
|
|
@@ -170,9 +170,9 @@ export interface InheritCaptureOptions extends InheritOptions, MirrorOptions {
|
|
|
170
170
|
export declare function execInherit(command: string, args: string[], options?: InheritOptions): Promise<number>;
|
|
171
171
|
/**
|
|
172
172
|
* Wires parent-process SIGINT/SIGTERM to a child: first signal → child.kill
|
|
173
|
-
* (SIGTERM) + grace timer
|
|
174
|
-
* timer expiry → SIGKILL. Returns a `dispose()` that clears the
|
|
175
|
-
* any outstanding timer. Callers must invoke `dispose()` from both the child's
|
|
173
|
+
* (SIGTERM) + grace timer. A second matching signal → immediate SIGKILL.
|
|
174
|
+
* Grace timer expiry → SIGKILL. Returns a `dispose()` that clears the
|
|
175
|
+
* listeners and any outstanding timer. Callers must invoke `dispose()` from both the child's
|
|
176
176
|
* `close` and `error` handlers so the process does not accumulate signal
|
|
177
177
|
* listeners across repeated spawns.
|
|
178
178
|
*/
|
|
@@ -193,28 +193,28 @@ export type SmokeLineCallback = (line: string) => void;
|
|
|
193
193
|
/**
|
|
194
194
|
* Options for {@link execSmokeRun}.
|
|
195
195
|
*
|
|
196
|
-
*
|
|
196
|
+
* Omits `ExecOptions.timeout`: the smoke run's only deadline is
|
|
197
197
|
* {@link SmokeRunOptions.smokeTimeoutMs}, which signals the whole process
|
|
198
|
-
* group. Inheriting `timeout`
|
|
199
|
-
* silently ignored, so a caller setting it gets no deadline at all.
|
|
198
|
+
* group. Inheriting `timeout` would be a leaky trap, accepted by the type
|
|
199
|
+
* but silently ignored, so a caller setting it gets no deadline at all.
|
|
200
200
|
*
|
|
201
201
|
* {@link ProcessGroupOptions} is not mixed in for the same reason: a smoke
|
|
202
|
-
* run is
|
|
202
|
+
* run is always detached on POSIX (`usesProcessGroup` is derived from
|
|
203
203
|
* `process.platform` alone), so the field would be accepted and never read.
|
|
204
204
|
*/
|
|
205
205
|
interface SmokeRunOptions extends Omit<ExecOptions, 'timeout'>, MirrorOptions {
|
|
206
206
|
/**
|
|
207
207
|
* Hard deadline in milliseconds. When it elapses the child process
|
|
208
208
|
* group is sent SIGTERM and, after `killGraceMs`, SIGKILL. The returned
|
|
209
|
-
* {@link SmokeRunResult.timedOut} is `true` when the deadline fires
|
|
210
|
-
*
|
|
211
|
-
*
|
|
209
|
+
* {@link SmokeRunResult.timedOut} is `true` when the deadline fires.
|
|
210
|
+
* Callers treat that as a clean smoke window (no child-driven error)
|
|
211
|
+
* rather than a failure.
|
|
212
212
|
*/
|
|
213
213
|
smokeTimeoutMs: number;
|
|
214
214
|
/**
|
|
215
215
|
* Grace period between SIGTERM and SIGKILL when the deadline fires.
|
|
216
216
|
* Defaults to 10000 ms because Firefox's AsyncShutdown and
|
|
217
|
-
* profileBeforeChange blockers can take
|
|
217
|
+
* profileBeforeChange blockers can take roughly 5 to 10 s to flush in-memory
|
|
218
218
|
* state. A shorter grace risks corrupting the dev profile mid-quit.
|
|
219
219
|
*/
|
|
220
220
|
killGraceMs?: number;
|
|
@@ -228,9 +228,9 @@ export interface SmokeRunResult extends ExecResult {
|
|
|
228
228
|
/**
|
|
229
229
|
* `true` when the smoke deadline fired and we SIGTERMed the child
|
|
230
230
|
* ourselves. Callers that want to distinguish "smoke window elapsed
|
|
231
|
-
* cleanly" from "child exited on its own" check this flag
|
|
231
|
+
* cleanly" from "child exited on its own" check this flag: the
|
|
232
232
|
* `exitCode` in the timedOut path is almost always 143 (SIGTERM) and
|
|
233
|
-
* should
|
|
233
|
+
* should not be treated as a child-driven failure.
|
|
234
234
|
*/
|
|
235
235
|
timedOut: boolean;
|
|
236
236
|
}
|
|
@@ -249,9 +249,10 @@ export interface SmokeRunResult extends ExecResult {
|
|
|
249
249
|
*
|
|
250
250
|
* Windows fallback: `detached: true` does not create an equivalent group
|
|
251
251
|
* there, so we kill the descendant tree with `taskkill /pid <pid> /T /F`
|
|
252
|
-
* instead. taskkill has no graceful-signal equivalent
|
|
253
|
-
* and the grace re-invocation are forced kills
|
|
254
|
-
* no shutdown window
|
|
252
|
+
* instead. taskkill has no graceful-signal equivalent, so both the deadline
|
|
253
|
+
* and the grace re-invocation are forced kills and Windows children get
|
|
254
|
+
* no shutdown window. This is best-effort and Windows is untested, see
|
|
255
|
+
* README.
|
|
255
256
|
* `child.kill()` is still sent as a direct-child fallback in case
|
|
256
257
|
* taskkill itself is unavailable.
|
|
257
258
|
*/
|
|
@@ -6,7 +6,7 @@ import { ExecTimeoutError } from '../errors/base.js';
|
|
|
6
6
|
import { buildChildEnv } from './child-env.js';
|
|
7
7
|
import { dispatchCompleteLines } from './line-dispatch.js';
|
|
8
8
|
import { killProcessTree, sweepProcessGroup } from './process-group.js';
|
|
9
|
-
// 50 MB cap per stream to prevent OOM
|
|
9
|
+
// 50 MB cap per stream to prevent OOM. Large toolchain builds (e.g. Firefox, Chromium)
|
|
10
10
|
// can easily blow past this, so we truncate rather than let the buffer grow unbounded.
|
|
11
11
|
// Callers for whom truncation is unacceptable (e.g. the archive-safety preflight
|
|
12
12
|
// scanning a full `tar -tvf` listing) must check `wasTruncated` and fail hard.
|
|
@@ -67,7 +67,7 @@ function toExecRejection(error, command, args, timeout, output) {
|
|
|
67
67
|
/**
|
|
68
68
|
* Snapshot of what two collectors hold, for carrying onto a timeout
|
|
69
69
|
* rejection. Without it a `git add -A` killed at its budget rejected with
|
|
70
|
-
* nothing but the budget
|
|
70
|
+
* nothing but the budget: the partial stdout/stderr that said what git was
|
|
71
71
|
* doing when it died was already collected and simply dropped.
|
|
72
72
|
*/
|
|
73
73
|
function collectedOutput(out, err) {
|
|
@@ -131,9 +131,9 @@ export async function exec(command, args, options = {}) {
|
|
|
131
131
|
* sequence, and the copies drifted: `execStream` was the one that omitted
|
|
132
132
|
* {@link trackChildClosure}, so the bin signal handler did not wait for
|
|
133
133
|
* `runMachStream`'s children on Ctrl+C and the forwarder's SIGTERM → grace →
|
|
134
|
-
* SIGKILL escalation could not finish before the parent exited
|
|
135
|
-
* failure the tracking set was introduced to fix, left unwired in one
|
|
136
|
-
* Keeping the sequence in one place is what stops that recurring.
|
|
134
|
+
* SIGKILL escalation could not finish before the parent exited. That was the
|
|
135
|
+
* exact failure the tracking set was introduced to fix, left unwired in one
|
|
136
|
+
* copy. Keeping the sequence in one place is what stops that recurring.
|
|
137
137
|
*
|
|
138
138
|
* `exec` deliberately stays outside: it neither forwards signals nor tracks
|
|
139
139
|
* closure, because it is for short-lived helpers that no one Ctrl+Cs through.
|
|
@@ -155,7 +155,7 @@ async function spawnTracked(spec) {
|
|
|
155
155
|
});
|
|
156
156
|
const groupPid = usesProcessGroup ? child.pid : undefined;
|
|
157
157
|
spec.attach?.(child);
|
|
158
|
-
// Group-aware kills route to the whole tree
|
|
158
|
+
// Group-aware kills route to the whole tree. A non-group child is killed
|
|
159
159
|
// directly by the forwarder's own `child.kill`.
|
|
160
160
|
const killTarget = options.processGroup === true
|
|
161
161
|
? (signal) => {
|
|
@@ -207,7 +207,7 @@ export async function execStream(command, args, options = {}) {
|
|
|
207
207
|
graceMs: 1500,
|
|
208
208
|
// A detached group leader no longer receives the terminal's Ctrl+C, so
|
|
209
209
|
// the forwarder is mandatory (not just graceful-UX) when processGroup
|
|
210
|
-
// is set
|
|
210
|
+
// is set. A plain streamed child does not get one.
|
|
211
211
|
forwardWithoutProcessGroup: false,
|
|
212
212
|
spawnChild: (base) => spawn(command, args, { ...base, stdio: ['ignore', 'pipe', 'pipe'] }),
|
|
213
213
|
attach: (child) => {
|
|
@@ -243,7 +243,7 @@ const activeChildClosures = new Set();
|
|
|
243
243
|
* Exported for the one legitimate spawn outside this module:
|
|
244
244
|
* `core/marionette-preflight.ts` keeps its own `spawn` because it needs the
|
|
245
245
|
* live `ChildProcess` mid-run, returns while the child is still running, and
|
|
246
|
-
* aborts on a TCP byte rather than a deadline
|
|
246
|
+
* aborts on a TCP byte rather than a deadline, none of which any wrapper
|
|
247
247
|
* here can express. It still needs the shutdown contract, and a second
|
|
248
248
|
* hand-rolled copy is what lets a Ctrl+C orphan the whole mach → Firefox
|
|
249
249
|
* tree.
|
|
@@ -252,7 +252,7 @@ const activeChildClosures = new Set();
|
|
|
252
252
|
* Registers a child whose shutdown {@link waitForActiveChildShutdown} must
|
|
253
253
|
* wait for, and returns the handle that deregisters it.
|
|
254
254
|
*
|
|
255
|
-
* @returns `settle()
|
|
255
|
+
* @returns `settle()`. Call from both the child's `close` and `error`
|
|
256
256
|
* handlers so a dead child never holds the shutdown wait open
|
|
257
257
|
*/
|
|
258
258
|
export function trackChildClosure() {
|
|
@@ -291,7 +291,7 @@ export async function waitForActiveChildShutdown(timeoutMs) {
|
|
|
291
291
|
* Graceful shutdown: when the FireForge process receives SIGINT/SIGTERM, the
|
|
292
292
|
* signal is forwarded to the child as SIGTERM and a short grace timer (default
|
|
293
293
|
* 1500ms) runs before escalating to SIGKILL. A second matching signal during
|
|
294
|
-
* the grace period triggers an immediate SIGKILL
|
|
294
|
+
* the grace period triggers an immediate SIGKILL, matching the usual
|
|
295
295
|
* "hit Ctrl-C again to force-quit" UX. Without this, Firefox's AsyncShutdown
|
|
296
296
|
* / profileBeforeChange blockers (which flush in-memory state to disk) can be
|
|
297
297
|
* racing the OS child-exit path, losing the last few seconds of edits.
|
|
@@ -314,9 +314,9 @@ export async function execInherit(command, args, options = {}) {
|
|
|
314
314
|
}
|
|
315
315
|
/**
|
|
316
316
|
* Wires parent-process SIGINT/SIGTERM to a child: first signal → child.kill
|
|
317
|
-
* (SIGTERM) + grace timer
|
|
318
|
-
* timer expiry → SIGKILL. Returns a `dispose()` that clears the
|
|
319
|
-
* any outstanding timer. Callers must invoke `dispose()` from both the child's
|
|
317
|
+
* (SIGTERM) + grace timer. A second matching signal → immediate SIGKILL.
|
|
318
|
+
* Grace timer expiry → SIGKILL. Returns a `dispose()` that clears the
|
|
319
|
+
* listeners and any outstanding timer. Callers must invoke `dispose()` from both the child's
|
|
320
320
|
* `close` and `error` handlers so the process does not accumulate signal
|
|
321
321
|
* listeners across repeated spawns.
|
|
322
322
|
*/
|
|
@@ -337,7 +337,7 @@ export function installGracefulShutdownForwarder(child, graceMs, killTarget) {
|
|
|
337
337
|
sendKill('SIGKILL');
|
|
338
338
|
}
|
|
339
339
|
catch {
|
|
340
|
-
// Child is already gone
|
|
340
|
+
// Child is already gone, nothing to do.
|
|
341
341
|
}
|
|
342
342
|
};
|
|
343
343
|
const handleSignal = (signal) => {
|
|
@@ -422,9 +422,10 @@ export async function execInheritCapture(command, args, options = {}) {
|
|
|
422
422
|
*
|
|
423
423
|
* Windows fallback: `detached: true` does not create an equivalent group
|
|
424
424
|
* there, so we kill the descendant tree with `taskkill /pid <pid> /T /F`
|
|
425
|
-
* instead. taskkill has no graceful-signal equivalent
|
|
426
|
-
* and the grace re-invocation are forced kills
|
|
427
|
-
* no shutdown window
|
|
425
|
+
* instead. taskkill has no graceful-signal equivalent, so both the deadline
|
|
426
|
+
* and the grace re-invocation are forced kills and Windows children get
|
|
427
|
+
* no shutdown window. This is best-effort and Windows is untested, see
|
|
428
|
+
* README.
|
|
428
429
|
* `child.kill()` is still sent as a direct-child fallback in case
|
|
429
430
|
* taskkill itself is unavailable.
|
|
430
431
|
*/
|
|
@@ -473,8 +474,8 @@ export async function execSmokeRun(command, args, options) {
|
|
|
473
474
|
}, options.smokeTimeoutMs);
|
|
474
475
|
deadlineTimer.unref();
|
|
475
476
|
// Forward parent SIGINT/SIGTERM to the whole child process group. The
|
|
476
|
-
// smoke child is a group leader (detached), so it does
|
|
477
|
-
// terminal's Ctrl+C SIGINT
|
|
477
|
+
// smoke child is a group leader (detached), so it does not receive the
|
|
478
|
+
// terminal's Ctrl+C SIGINT. Without this forwarder, the parent exits
|
|
478
479
|
// and the entire mach → firefox tree is orphaned. Second signal (or
|
|
479
480
|
// grace expiry) escalates to a group SIGKILL.
|
|
480
481
|
const forwardedSignals = new Set();
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Two different columns share one grammar, which is why this lives apart
|
|
5
5
|
* from either consumer: `time=` (accumulated CPU) and `etime=` (elapsed
|
|
6
|
-
* wall clock).
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* wall clock). One parser handles both: a second hand-rolled copy is how
|
|
7
|
+
* the two would drift, and the darwin dialect is the half that is easy to
|
|
8
|
+
* get wrong.
|
|
9
9
|
*
|
|
10
10
|
* Dialects:
|
|
11
11
|
* - linux `[dd-]hh:mm:ss` (e.g. `26-03:14:12`, `03:14:12`)
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* wrapping (e.g. `38412:07.55`)
|
|
14
14
|
*
|
|
15
15
|
* Returns `NaN` for anything else, so callers must treat an unrecognized
|
|
16
|
-
* shape as "unknown" rather than as zero
|
|
16
|
+
* shape as "unknown" rather than as zero. A browser reported as 0 seconds
|
|
17
17
|
* old would be exactly the wrong attribution.
|
|
18
18
|
*/
|
|
19
19
|
/**
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Two different columns share one grammar, which is why this lives apart
|
|
6
6
|
* from either consumer: `time=` (accumulated CPU) and `etime=` (elapsed
|
|
7
|
-
* wall clock).
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* wall clock). One parser handles both: a second hand-rolled copy is how
|
|
8
|
+
* the two would drift, and the darwin dialect is the half that is easy to
|
|
9
|
+
* get wrong.
|
|
10
10
|
*
|
|
11
11
|
* Dialects:
|
|
12
12
|
* - linux `[dd-]hh:mm:ss` (e.g. `26-03:14:12`, `03:14:12`)
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* wrapping (e.g. `38412:07.55`)
|
|
15
15
|
*
|
|
16
16
|
* Returns `NaN` for anything else, so callers must treat an unrecognized
|
|
17
|
-
* shape as "unknown" rather than as zero
|
|
17
|
+
* shape as "unknown" rather than as zero. A browser reported as 0 seconds
|
|
18
18
|
* old would be exactly the wrong attribution.
|
|
19
19
|
*/
|
|
20
20
|
/**
|
|
@@ -34,14 +34,14 @@ export function parsePsDuration(value) {
|
|
|
34
34
|
}
|
|
35
35
|
const parts = rest.split(':');
|
|
36
36
|
if (parts.length === 3) {
|
|
37
|
-
// hh:mm:ss
|
|
37
|
+
// hh:mm:ss on linux. Seconds may not carry fractions but tolerate them.
|
|
38
38
|
const [h, m, s] = parts.map(Number);
|
|
39
39
|
if ([h, m, s].some((n) => Number.isNaN(n)))
|
|
40
40
|
return NaN;
|
|
41
41
|
return days * 86400 + (h ?? 0) * 3600 + (m ?? 0) * 60 + (s ?? 0);
|
|
42
42
|
}
|
|
43
43
|
if (parts.length === 2) {
|
|
44
|
-
// mm:ss.cc
|
|
44
|
+
// mm:ss.cc on darwin. The minutes field accumulates without wrapping.
|
|
45
45
|
const [m, s] = parts.map(Number);
|
|
46
46
|
if ([m, s].some((n) => Number.isNaN(n)))
|
|
47
47
|
return NaN;
|
|
@@ -9,16 +9,16 @@ export declare function hasRawCssColors(content: string): boolean;
|
|
|
9
9
|
/**
|
|
10
10
|
* Strips JS single-line and multi-line comments from source code, replacing
|
|
11
11
|
* comment bytes with spaces (newlines inside block comments are kept) so
|
|
12
|
-
* both character offsets
|
|
12
|
+
* both character offsets and line numbers are preserved. String literals are
|
|
13
13
|
* preserved intact.
|
|
14
14
|
*
|
|
15
|
-
* Uses acorn's tokenizer, which understands regex literals
|
|
15
|
+
* Uses acorn's tokenizer, which understands regex literals. A pure-regex
|
|
16
16
|
* implementation does not model them, so two adjacent slashes inside a regex
|
|
17
17
|
* (the tail of `/https?:\/\//`) read as a `//` line comment and the rest of
|
|
18
18
|
* the line is blanked, corrupting whatever lint pass consumes the stripped
|
|
19
19
|
* text. Firefox chrome sources contain preprocessor directives (`#ifdef`)
|
|
20
|
-
* and other constructs acorn cannot tokenize
|
|
21
|
-
* regex strip, which handles strings but
|
|
20
|
+
* and other constructs acorn cannot tokenize. Those fall back to the legacy
|
|
21
|
+
* regex strip, which handles strings but not regex literals.
|
|
22
22
|
*/
|
|
23
23
|
export declare function stripJsComments(source: string): string;
|
|
24
24
|
/**
|
package/dist/src/utils/regex.js
CHANGED
|
@@ -25,16 +25,16 @@ export function hasRawCssColors(content) {
|
|
|
25
25
|
/**
|
|
26
26
|
* Strips JS single-line and multi-line comments from source code, replacing
|
|
27
27
|
* comment bytes with spaces (newlines inside block comments are kept) so
|
|
28
|
-
* both character offsets
|
|
28
|
+
* both character offsets and line numbers are preserved. String literals are
|
|
29
29
|
* preserved intact.
|
|
30
30
|
*
|
|
31
|
-
* Uses acorn's tokenizer, which understands regex literals
|
|
31
|
+
* Uses acorn's tokenizer, which understands regex literals. A pure-regex
|
|
32
32
|
* implementation does not model them, so two adjacent slashes inside a regex
|
|
33
33
|
* (the tail of `/https?:\/\//`) read as a `//` line comment and the rest of
|
|
34
34
|
* the line is blanked, corrupting whatever lint pass consumes the stripped
|
|
35
35
|
* text. Firefox chrome sources contain preprocessor directives (`#ifdef`)
|
|
36
|
-
* and other constructs acorn cannot tokenize
|
|
37
|
-
* regex strip, which handles strings but
|
|
36
|
+
* and other constructs acorn cannot tokenize. Those fall back to the legacy
|
|
37
|
+
* regex strip, which handles strings but not regex literals.
|
|
38
38
|
*/
|
|
39
39
|
export function stripJsComments(source) {
|
|
40
40
|
const comments = [];
|
|
@@ -47,7 +47,7 @@ export function stripJsComments(source) {
|
|
|
47
47
|
comments.push({ start, end });
|
|
48
48
|
},
|
|
49
49
|
});
|
|
50
|
-
// Drive the tokenizer to EOF
|
|
50
|
+
// Drive the tokenizer to EOF. We only care about onComment callbacks.
|
|
51
51
|
for (;;) {
|
|
52
52
|
const token = t.getToken();
|
|
53
53
|
if (token.type === acornTokTypes.eof)
|
|
@@ -71,8 +71,8 @@ export function stripJsComments(source) {
|
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
73
|
* Legacy pure-regex comment strip, used only when acorn cannot tokenize
|
|
74
|
-
* the source (preprocessor directives, syntax errors). Strings survive
|
|
75
|
-
*
|
|
74
|
+
* the source (preprocessor directives, syntax errors). Strings survive.
|
|
75
|
+
* Regex literals are not modeled, so `//` inside a regex blanks the rest
|
|
76
76
|
* of the line.
|
|
77
77
|
*/
|
|
78
78
|
function stripJsCommentsLegacy(source) {
|
|
@@ -4,18 +4,18 @@
|
|
|
4
4
|
* Five modules had grown a private copy of this (`sleep`, `delay`,
|
|
5
5
|
* `sweepDelay`) and four more sites inlined
|
|
6
6
|
* `new Promise((resolve) => setTimeout(resolve, ms))`. The copies disagreed on
|
|
7
|
-
* the one property that actually matters
|
|
8
|
-
* event loop open
|
|
9
|
-
* behaviours now live here, and callers state which one they need.
|
|
7
|
+
* the one property that actually matters (whether the pending timer holds
|
|
8
|
+
* the event loop open) and the disagreement was invisible at each call site.
|
|
9
|
+
* Both behaviours now live here, and callers state which one they need.
|
|
10
10
|
*
|
|
11
11
|
* The default is a ref'd timer, because the dangerous mistake is the other
|
|
12
12
|
* one: an unref'd delay awaited between a SIGTERM and its escalation lets Node
|
|
13
13
|
* exit mid-grace and skip the escalation entirely.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* Built on the global `setTimeout` rather than `node:timers/promises`: the
|
|
16
|
+
* suites that drive retry and grace-period logic use vitest fake timers,
|
|
17
|
+
* which patch the global but not the promisified module, so the tidier
|
|
18
|
+
* import would make every timing path untestable.
|
|
19
19
|
* @param ms - Milliseconds to wait.
|
|
20
20
|
* @param options - Pass `unref: true` when a pending delay must not keep the
|
|
21
21
|
* process alive (background probes, best-effort retries during shutdown).
|
package/dist/src/utils/sleep.js
CHANGED
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
* Five modules had grown a private copy of this (`sleep`, `delay`,
|
|
6
6
|
* `sweepDelay`) and four more sites inlined
|
|
7
7
|
* `new Promise((resolve) => setTimeout(resolve, ms))`. The copies disagreed on
|
|
8
|
-
* the one property that actually matters
|
|
9
|
-
* event loop open
|
|
10
|
-
* behaviours now live here, and callers state which one they need.
|
|
8
|
+
* the one property that actually matters (whether the pending timer holds
|
|
9
|
+
* the event loop open) and the disagreement was invisible at each call site.
|
|
10
|
+
* Both behaviours now live here, and callers state which one they need.
|
|
11
11
|
*
|
|
12
12
|
* The default is a ref'd timer, because the dangerous mistake is the other
|
|
13
13
|
* one: an unref'd delay awaited between a SIGTERM and its escalation lets Node
|
|
14
14
|
* exit mid-grace and skip the escalation entirely.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* Built on the global `setTimeout` rather than `node:timers/promises`: the
|
|
17
|
+
* suites that drive retry and grace-period logic use vitest fake timers,
|
|
18
|
+
* which patch the global but not the promisified module, so the tidier
|
|
19
|
+
* import would make every timing path untestable.
|
|
20
20
|
* @param ms - Milliseconds to wait.
|
|
21
21
|
* @param options - Pass `unref: true` when a pending delay must not keep the
|
|
22
22
|
* process alive (background probes, best-effort retries during shutdown).
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Bounded stdio drain for delayed process exits.
|
|
3
3
|
*
|
|
4
|
-
* `process.exit()` discards whatever is still queued in an async writable
|
|
5
|
-
* and stdout
|
|
4
|
+
* `process.exit()` discards whatever is still queued in an async writable,
|
|
5
|
+
* and stdout is async when it is a pipe, with a 64 KiB kernel buffer on
|
|
6
6
|
* macOS/Linux. The observed failure: `status --json --fail-on` writes a
|
|
7
7
|
* 176 KB payload, the refusal makes `bin/fireforge.ts` exit non-zero, and a
|
|
8
8
|
* piped consumer receives exactly 65 536 bytes. The bin entry point awaits
|
|
9
|
-
* this helper before every delayed exit
|
|
9
|
+
* this helper before every delayed exit. The helper itself never calls
|
|
10
10
|
* `process.exit` (the process-boundary test keeps that a bin-only right).
|
|
11
11
|
*/
|
|
12
12
|
/**
|
|
13
|
-
* The structural slice of `Writable` the drain wait needs
|
|
13
|
+
* The structural slice of `Writable` the drain wait needs. Accepted instead
|
|
14
14
|
* of `NodeJS.WriteStream` so unit tests can drive synthetic streams.
|
|
15
15
|
*/
|
|
16
16
|
export interface DrainableStream {
|
|
@@ -21,8 +21,8 @@ export interface DrainableStream {
|
|
|
21
21
|
off(event: 'drain' | 'error' | 'close', listener: () => void): unknown;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Waits (bounded by `timeoutMs`) for every given stream
|
|
25
|
-
* by default
|
|
26
|
-
* either way, the bound only decides how much queued output survives.
|
|
24
|
+
* Waits (bounded by `timeoutMs`) for every given stream (stdout and stderr
|
|
25
|
+
* by default) to drain. Resolution is unconditional. The caller exits
|
|
26
|
+
* either way, and the bound only decides how much queued output survives.
|
|
27
27
|
*/
|
|
28
28
|
export declare function waitForStdioDrain(timeoutMs: number, streams?: readonly DrainableStream[]): Promise<void>;
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Bounded stdio drain for delayed process exits.
|
|
4
4
|
*
|
|
5
|
-
* `process.exit()` discards whatever is still queued in an async writable
|
|
6
|
-
* and stdout
|
|
5
|
+
* `process.exit()` discards whatever is still queued in an async writable,
|
|
6
|
+
* and stdout is async when it is a pipe, with a 64 KiB kernel buffer on
|
|
7
7
|
* macOS/Linux. The observed failure: `status --json --fail-on` writes a
|
|
8
8
|
* 176 KB payload, the refusal makes `bin/fireforge.ts` exit non-zero, and a
|
|
9
9
|
* piped consumer receives exactly 65 536 bytes. The bin entry point awaits
|
|
10
|
-
* this helper before every delayed exit
|
|
10
|
+
* this helper before every delayed exit. The helper itself never calls
|
|
11
11
|
* `process.exit` (the process-boundary test keeps that a bin-only right).
|
|
12
12
|
*/
|
|
13
13
|
/** True when nothing the process is about to lose remains queued. */
|
|
@@ -16,8 +16,8 @@ function isFlushed(stream) {
|
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* Resolves once `stream` has drained its queued writes, and always within
|
|
19
|
-
* `timeoutMs`. Never rejects: `'error'` and `'close'` (an EPIPE'd pipe
|
|
20
|
-
* `installBrokenPipeHandler` already swallows
|
|
19
|
+
* `timeoutMs`. Never rejects: `'error'` and `'close'` (an EPIPE'd pipe,
|
|
20
|
+
* whose error `installBrokenPipeHandler` already swallows) resolve
|
|
21
21
|
* immediately, because a destroyed pipe can never drain and must not stall
|
|
22
22
|
* the exit behind it.
|
|
23
23
|
*/
|
|
@@ -45,9 +45,9 @@ function waitForStreamDrain(stream, timeoutMs) {
|
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
|
-
* Waits (bounded by `timeoutMs`) for every given stream
|
|
49
|
-
* by default
|
|
50
|
-
* either way, the bound only decides how much queued output survives.
|
|
48
|
+
* Waits (bounded by `timeoutMs`) for every given stream (stdout and stderr
|
|
49
|
+
* by default) to drain. Resolution is unconditional. The caller exits
|
|
50
|
+
* either way, and the bound only decides how much queued output survives.
|
|
51
51
|
*/
|
|
52
52
|
export async function waitForStdioDrain(timeoutMs, streams = [process.stdout, process.stderr]) {
|
|
53
53
|
await Promise.all(streams.map((stream) => waitForStreamDrain(stream, timeoutMs)));
|
|
@@ -27,9 +27,9 @@ export declare function isPositiveInteger(value: unknown): value is number;
|
|
|
27
27
|
* orders instead of failing fast.
|
|
28
28
|
*
|
|
29
29
|
* Rejects leading-zero forms ("01"), decimals ("1.5"), whitespace, and
|
|
30
|
-
* non-numeric garbage via a strict regex
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* non-numeric garbage via a strict regex. Only the canonical representation
|
|
31
|
+
* is accepted, so there is no ambiguity between what the user typed and what
|
|
32
|
+
* the value becomes on disk.
|
|
33
33
|
*
|
|
34
34
|
* @param flagName - Flag name to include in the error (e.g. `--order`)
|
|
35
35
|
* @param rawValue - Raw string value from Commander
|
|
@@ -57,8 +57,8 @@ export declare function isArray(value: unknown): value is unknown[];
|
|
|
57
57
|
* Narrows a JSON value to a JSON object node (excludes arrays and `null`).
|
|
58
58
|
*
|
|
59
59
|
* Unlike {@link isObject} this accepts only values already known to be JSON
|
|
60
|
-
* data, so the narrowed `JsonObject` keeps its concrete value contract
|
|
61
|
-
*
|
|
60
|
+
* data, so the narrowed `JsonObject` keeps its concrete value contract.
|
|
61
|
+
* Use it when walking a `JsonValue` tree rather than at `unknown` boundaries.
|
|
62
62
|
* @param value - JSON value to check
|
|
63
63
|
* @returns True if value is a JSON object node
|
|
64
64
|
*/
|
|
@@ -78,22 +78,21 @@ export declare const FIREFOX_PRODUCTS: readonly ["firefox", "firefox-esr", "fire
|
|
|
78
78
|
* Validates a Firefox product string.
|
|
79
79
|
*
|
|
80
80
|
* A type predicate, matching its sibling {@link isValidProjectLicense}.
|
|
81
|
-
* Returning plain `boolean` would force
|
|
82
|
-
*
|
|
83
|
-
* check IS the runtime proof.
|
|
81
|
+
* Returning plain `boolean` would force `as FirefoxProduct` casts at the
|
|
82
|
+
* call sites even though the `.includes` check is the runtime proof.
|
|
84
83
|
*/
|
|
85
84
|
export declare const isValidFirefoxProduct: (value: string) => value is "firefox" | "firefox-esr" | "firefox-beta" | "firefox-devedition";
|
|
86
85
|
/**
|
|
87
86
|
* Builds a type predicate from a `readonly` tuple of allowed values.
|
|
88
87
|
*
|
|
89
|
-
* Deriving the type from the list
|
|
90
|
-
* hand-maintaining a matching array
|
|
88
|
+
* Deriving the type from the list, rather than declaring a union and
|
|
89
|
+
* hand-maintaining a matching array, removes a whole class of drift: a
|
|
91
90
|
* union can otherwise accept a stale allowlist with no compile error, and a
|
|
92
91
|
* copy of the member list on the `fireforge.json` read path can silently
|
|
93
92
|
* reject a newly added value.
|
|
94
93
|
*
|
|
95
94
|
* Returning a predicate rather than a boolean is what removes the `as`
|
|
96
|
-
* casts: `.includes`
|
|
95
|
+
* casts: `.includes` is the runtime proof, so the caller should not have to
|
|
97
96
|
* re-assert it. `ParsedRecord.stringEnum` (src/utils/parse.ts) consumes
|
|
98
97
|
* exactly this shape.
|
|
99
98
|
*
|
|
@@ -158,7 +157,7 @@ export declare function normalizeTokenName(name: string): string;
|
|
|
158
157
|
* Normalizes a patch display name against its category:
|
|
159
158
|
* strips a trailing `.patch` and any redundant `NNN-<category>-` /
|
|
160
159
|
* `<category>-` prefixes, case-insensitively and repeatedly, mirroring
|
|
161
|
-
* the filename slug pipeline's require-the-category-token rule
|
|
160
|
+
* the filename slug pipeline's require-the-category-token rule. A bare
|
|
162
161
|
* leading number is never stripped, so names like `2-step-verification`
|
|
163
162
|
* survive intact. Falls back to the `.patch`-stripped stem when the
|
|
164
163
|
* strip would empty the name.
|