@hominis/fireforge 0.45.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +409 -446
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +21 -15
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +46 -0
- package/dist/src/cli-usage-error.js +81 -0
- package/dist/src/cli.d.ts +7 -2
- package/dist/src/cli.js +47 -47
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +3 -4
- package/dist/src/commands/build.js +27 -17
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +19 -0
- package/dist/src/commands/destructive-decision.js +31 -0
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -10
- package/dist/src/commands/doctor-check-core.js +0 -8
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
- package/dist/src/commands/doctor-orphaned-harness.js +14 -23
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +3 -1
- package/dist/src/commands/doctor.js +15 -16
- package/dist/src/commands/download.js +50 -37
- package/dist/src/commands/export-all.js +29 -12
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +29 -59
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +12 -12
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +7 -13
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +4 -6
- package/dist/src/commands/export-shared.d.ts +51 -32
- package/dist/src/commands/export-shared.js +17 -32
- package/dist/src/commands/export.js +14 -5
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
- package/dist/src/commands/furnace/authoring-config.js +19 -0
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +7 -12
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +6 -9
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +31 -15
- package/dist/src/commands/furnace/create-templates.js +20 -19
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +35 -29
- package/dist/src/commands/furnace/deploy.js +15 -6
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +17 -16
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +43 -34
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +15 -7
- package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
- package/dist/src/commands/furnace/remove-mutations.js +19 -19
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +4 -8
- package/dist/src/commands/furnace/rename-browser-test.js +10 -15
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +36 -36
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +19 -16
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
- package/dist/src/commands/furnace/test-file-name.js +39 -0
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/furnace/validation-output.d.ts +21 -9
- package/dist/src/commands/furnace/validation-output.js +3 -8
- package/dist/src/commands/import.js +22 -29
- package/dist/src/commands/lint-per-patch.d.ts +2 -2
- package/dist/src/commands/lint-per-patch.js +27 -12
- package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +5 -4
- package/dist/src/commands/lint.js +36 -36
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/manifest.js +1 -1
- package/dist/src/commands/package.js +4 -6
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +19 -20
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +23 -33
- package/dist/src/commands/patch/entry-projection.d.ts +13 -0
- package/dist/src/commands/patch/entry-projection.js +24 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
- package/dist/src/commands/patch/lint-ignore.js +33 -44
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +29 -15
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +41 -37
- package/dist/src/commands/patch/move-files.js +5 -14
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +35 -49
- package/dist/src/commands/patch/reorder.js +35 -48
- package/dist/src/commands/patch/split-plan.d.ts +7 -8
- package/dist/src/commands/patch/split-plan.js +10 -13
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +50 -48
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +22 -28
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +20 -30
- package/dist/src/commands/patch-rename-map.d.ts +19 -0
- package/dist/src/commands/patch-rename-map.js +36 -0
- package/dist/src/commands/pending-resolution.d.ts +15 -0
- package/dist/src/commands/pending-resolution.js +25 -0
- package/dist/src/commands/re-export-adjacent.d.ts +25 -3
- package/dist/src/commands/re-export-adjacent.js +40 -24
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +23 -27
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +33 -33
- package/dist/src/commands/re-export-files.d.ts +2 -3
- package/dist/src/commands/re-export-files.js +52 -44
- package/dist/src/commands/re-export-lint.d.ts +29 -30
- package/dist/src/commands/re-export-lint.js +36 -29
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +12 -9
- package/dist/src/commands/re-export-single.d.ts +23 -4
- package/dist/src/commands/re-export-single.js +39 -31
- package/dist/src/commands/re-export.js +35 -17
- package/dist/src/commands/rebase/abort.js +9 -14
- package/dist/src/commands/rebase/continue.js +20 -19
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +5 -5
- package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
- package/dist/src/commands/rebase/patch-loop.js +20 -24
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +21 -13
- package/dist/src/commands/run.d.ts +0 -13
- package/dist/src/commands/run.js +38 -51
- package/dist/src/commands/setup-support.d.ts +16 -4
- package/dist/src/commands/setup-support.js +20 -20
- package/dist/src/commands/setup.js +4 -10
- package/dist/src/commands/source.js +9 -2
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +6 -6
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +5 -5
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +25 -26
- package/dist/src/commands/test-build-phase.d.ts +3 -3
- package/dist/src/commands/test-build-phase.js +48 -24
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +4 -4
- package/dist/src/commands/test-modes.js +4 -5
- package/dist/src/commands/test-register.js +5 -3
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +40 -33
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +17 -17
- package/dist/src/commands/test-verdict.d.ts +19 -5
- package/dist/src/commands/test-verdict.js +26 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +73 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.d.ts +26 -0
- package/dist/src/commands/token-list.js +153 -0
- package/dist/src/commands/token.js +26 -10
- package/dist/src/commands/tree.js +26 -21
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +16 -16
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +17 -16
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -12
- package/dist/src/core/branding.js +6 -5
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +10 -7
- package/dist/src/core/build-audit-platform.d.ts +32 -3
- package/dist/src/core/build-audit-platform.js +153 -13
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +10 -9
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +57 -0
- package/dist/src/core/build-audit-skip.js +112 -0
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +21 -8
- package/dist/src/core/build-audit.js +142 -40
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +48 -31
- package/dist/src/core/build-baseline.js +20 -43
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +18 -17
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +14 -14
- package/dist/src/core/build-prepare.d.ts +4 -12
- package/dist/src/core/build-prepare.js +22 -26
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-paths.d.ts +2 -6
- package/dist/src/core/config-paths.js +4 -2
- package/dist/src/core/config-state.d.ts +0 -6
- package/dist/src/core/config-state.js +3 -21
- package/dist/src/core/config-validate-build-audit.d.ts +8 -0
- package/dist/src/core/config-validate-build-audit.js +80 -0
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +3 -3
- package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
- package/dist/src/core/config-validate-patch-policy.js +3 -3
- package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
- package/dist/src/core/config-validate-test-toolchains.js +4 -5
- package/dist/src/core/config-validate.js +22 -12
- package/dist/src/core/config.d.ts +12 -12
- package/dist/src/core/config.js +21 -25
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +20 -20
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +22 -23
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +5 -13
- package/dist/src/core/engine-precondition.js +5 -10
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +50 -54
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock-owner.d.ts +103 -0
- package/dist/src/core/file-lock-owner.js +259 -0
- package/dist/src/core/file-lock.d.ts +14 -19
- package/dist/src/core/file-lock.js +90 -128
- package/dist/src/core/firefox-cache.d.ts +13 -1
- package/dist/src/core/firefox-cache.js +61 -36
- package/dist/src/core/firefox-download.d.ts +15 -0
- package/dist/src/core/firefox-download.js +38 -22
- package/dist/src/core/firefox-extract.d.ts +8 -7
- package/dist/src/core/firefox-extract.js +45 -27
- package/dist/src/core/firefox.d.ts +34 -36
- package/dist/src/core/firefox.js +13 -44
- package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
- package/dist/src/core/furnace-apply-dry-run.js +2 -8
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
- package/dist/src/core/furnace-apply-helpers.js +28 -39
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +4 -4
- package/dist/src/core/furnace-apply.js +50 -29
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +5 -5
- package/dist/src/core/furnace-config.js +40 -53
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +9 -8
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +20 -0
- package/dist/src/core/furnace-dir-entry.js +21 -0
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +22 -19
- package/dist/src/core/furnace-operation.js +38 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.d.ts +18 -6
- package/dist/src/core/furnace-refresh.js +5 -8
- package/dist/src/core/furnace-registration-ast.d.ts +2 -3
- package/dist/src/core/furnace-registration-ast.js +9 -12
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +7 -6
- package/dist/src/core/furnace-registration.js +29 -36
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-scanner.js +3 -6
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +12 -12
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +18 -20
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +6 -4
- package/dist/src/core/git-base.js +29 -7
- package/dist/src/core/git-diff-new-file.d.ts +40 -0
- package/dist/src/core/git-diff-new-file.js +119 -0
- package/dist/src/core/git-diff.d.ts +13 -13
- package/dist/src/core/git-diff.js +121 -189
- package/dist/src/core/git-file-ops.d.ts +6 -13
- package/dist/src/core/git-file-ops.js +11 -35
- package/dist/src/core/git-readonly-index.d.ts +12 -14
- package/dist/src/core/git-readonly-index.js +12 -16
- package/dist/src/core/git-status.d.ts +9 -2
- package/dist/src/core/git-status.js +23 -11
- package/dist/src/core/git.d.ts +3 -9
- package/dist/src/core/git.js +28 -57
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +28 -27
- package/dist/src/core/history-log.d.ts +19 -0
- package/dist/src/core/history-log.js +29 -0
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -10
- package/dist/src/core/mach-error-hints.js +14 -14
- package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
- package/dist/src/core/mach-known-noise-filter.js +57 -56
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +17 -16
- package/dist/src/core/mach-python.d.ts +3 -0
- package/dist/src/core/mach-python.js +13 -7
- package/dist/src/core/mach-resource-shim.d.ts +24 -12
- package/dist/src/core/mach-resource-shim.js +124 -21
- package/dist/src/core/mach.d.ts +59 -73
- package/dist/src/core/mach.js +47 -115
- package/dist/src/core/marionette-port.d.ts +15 -30
- package/dist/src/core/marionette-port.js +46 -89
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +32 -50
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +17 -17
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +46 -42
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +13 -13
- package/dist/src/core/patch-apply.d.ts +13 -14
- package/dist/src/core/patch-apply.js +36 -42
- package/dist/src/core/patch-export-coverage.d.ts +0 -9
- package/dist/src/core/patch-export-coverage.js +1 -30
- package/dist/src/core/patch-export-update.d.ts +21 -4
- package/dist/src/core/patch-export-update.js +7 -6
- package/dist/src/core/patch-export.d.ts +20 -30
- package/dist/src/core/patch-export.js +55 -77
- package/dist/src/core/patch-files.d.ts +0 -4
- package/dist/src/core/patch-files.js +0 -11
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +12 -18
- package/dist/src/core/patch-lint-cache.d.ts +18 -2
- package/dist/src/core/patch-lint-cache.js +16 -19
- package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
- package/dist/src/core/patch-lint-checkjs.js +78 -64
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +5 -9
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +27 -19
- package/dist/src/core/patch-lint-cross.js +67 -110
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +15 -11
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +6 -6
- package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
- package/dist/src/core/patch-lint-forward-registration.js +210 -0
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +46 -46
- package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +7 -7
- package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
- package/dist/src/core/patch-lint-queue-types.js +12 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
- package/dist/src/core/patch-lint-staged-registration.js +90 -0
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +41 -35
- package/dist/src/core/patch-lint.js +52 -49
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +11 -11
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +35 -34
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +32 -21
- package/dist/src/core/patch-parse.js +40 -15
- package/dist/src/core/patch-policy.js +15 -27
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-source-metadata.d.ts +1 -3
- package/dist/src/core/patch-source-metadata.js +0 -4
- package/dist/src/core/patch-transform.d.ts +8 -16
- package/dist/src/core/patch-transform.js +13 -23
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +6 -6
- package/dist/src/core/rebase-session.d.ts +9 -15
- package/dist/src/core/rebase-session.js +13 -25
- package/dist/src/core/register-browser-content.js +3 -2
- package/dist/src/core/register-browser-test.js +2 -1
- package/dist/src/core/register-module.js +2 -1
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +8 -7
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +6 -5
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +38 -0
- package/dist/src/core/run-log-redact.js +69 -0
- package/dist/src/core/run-log.d.ts +21 -10
- package/dist/src/core/run-log.js +76 -27
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +4 -6
- package/dist/src/core/smoke-patterns.d.ts +5 -6
- package/dist/src/core/smoke-patterns.js +15 -20
- package/dist/src/core/state-file.d.ts +15 -4
- package/dist/src/core/state-file.js +14 -1
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +13 -12
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +40 -25
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +69 -69
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -23
- package/dist/src/core/test-stale-check.js +31 -30
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
- package/dist/src/core/test-xpcshell-retry.js +14 -11
- package/dist/src/core/token-category.d.ts +35 -2
- package/dist/src/core/token-category.js +67 -58
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +13 -25
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +56 -0
- package/dist/src/core/token-inventory.js +109 -0
- package/dist/src/core/token-manager.d.ts +4 -4
- package/dist/src/core/token-manager.js +22 -22
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +52 -53
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +23 -23
- package/dist/src/core/tree-cow.d.ts +3 -5
- package/dist/src/core/tree-cow.js +8 -8
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +39 -38
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +33 -33
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +12 -23
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +16 -28
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +28 -30
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +69 -16
- package/dist/src/errors/base.js +95 -26
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +26 -34
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/config.d.ts +0 -14
- package/dist/src/errors/config.js +13 -34
- package/dist/src/errors/download.d.ts +13 -0
- package/dist/src/errors/download.js +53 -24
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/furnace.js +8 -9
- package/dist/src/errors/git.d.ts +9 -9
- package/dist/src/errors/git.js +21 -31
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +11 -13
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +8 -8
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +155 -200
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +52 -19
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/index.d.ts +0 -1
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +4 -16
- package/dist/src/utils/assert.js +7 -24
- package/dist/src/utils/build-info.d.ts +6 -6
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +7 -6
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +10 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +15 -20
- package/dist/src/utils/hash.d.ts +12 -0
- package/dist/src/utils/hash.js +16 -0
- package/dist/src/utils/line-dispatch.d.ts +15 -0
- package/dist/src/utils/line-dispatch.js +48 -0
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +14 -20
- package/dist/src/utils/options.js +26 -27
- package/dist/src/utils/package-root.js +5 -14
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/platform.d.ts +0 -4
- package/dist/src/utils/process-group.d.ts +10 -9
- package/dist/src/utils/process-group.js +37 -36
- package/dist/src/utils/process.d.ts +70 -55
- package/dist/src/utils/process.js +129 -179
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +9 -9
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +26 -0
- package/dist/src/utils/sleep.js +31 -0
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +12 -49
- package/dist/src/utils/validation.js +26 -36
- package/docs/README.md +2 -2
- package/docs/configuration.md +163 -69
- package/docs/exit-codes.md +66 -49
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +414 -247
- package/docs/machine-output.md +58 -34
- package/docs/patch-workflow.md +48 -44
- package/docs/run-logs.md +72 -28
- package/docs/testing.md +105 -98
- package/docs/verification-trees.md +23 -22
- package/package.json +7 -6
- package/dist/src/commands/rebase.d.ts +0 -4
- package/dist/src/commands/rebase.js +0 -5
- package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
- package/dist/src/core/patch-artifact-normalize.js +0 -24
- package/dist/src/core/patch-lint-reexports.d.ts +0 -7
- package/dist/src/core/patch-lint-reexports.js +0 -8
- package/dist/src/core/wire-targets.d.ts +0 -7
- package/dist/src/core/wire-targets.js +0 -8
|
@@ -4,8 +4,9 @@ import { constants as osConstants } from 'node:os';
|
|
|
4
4
|
import { StringDecoder } from 'node:string_decoder';
|
|
5
5
|
import { ExecTimeoutError } from '../errors/base.js';
|
|
6
6
|
import { buildChildEnv } from './child-env.js';
|
|
7
|
+
import { dispatchCompleteLines } from './line-dispatch.js';
|
|
7
8
|
import { killProcessTree, sweepProcessGroup } from './process-group.js';
|
|
8
|
-
// 50 MB cap per stream to prevent OOM
|
|
9
|
+
// 50 MB cap per stream to prevent OOM. Large toolchain builds (e.g. Firefox, Chromium)
|
|
9
10
|
// can easily blow past this, so we truncate rather than let the buffer grow unbounded.
|
|
10
11
|
// Callers for whom truncation is unacceptable (e.g. the archive-safety preflight
|
|
11
12
|
// scanning a full `tar -tvf` listing) must check `wasTruncated` and fail hard.
|
|
@@ -57,12 +58,25 @@ function buildSignalFromTimeout(timeout) {
|
|
|
57
58
|
* {@link ExecTimeoutError} naming the command and budget instead of Node's
|
|
58
59
|
* opaque `AbortError: The operation was aborted`.
|
|
59
60
|
*/
|
|
60
|
-
function toExecRejection(error, command, args, timeout) {
|
|
61
|
+
function toExecRejection(error, command, args, timeout, output) {
|
|
61
62
|
if (timeout !== undefined && error.name === 'AbortError') {
|
|
62
|
-
return new ExecTimeoutError(command, args, timeout, error);
|
|
63
|
+
return new ExecTimeoutError(command, args, timeout, error, output);
|
|
63
64
|
}
|
|
64
65
|
return error;
|
|
65
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Snapshot of what two collectors hold, for carrying onto a timeout
|
|
69
|
+
* rejection. Without it a `git add -A` killed at its budget rejected with
|
|
70
|
+
* nothing but the budget: the partial stdout/stderr that said what git was
|
|
71
|
+
* doing when it died was already collected and simply dropped.
|
|
72
|
+
*/
|
|
73
|
+
function collectedOutput(out, err) {
|
|
74
|
+
return {
|
|
75
|
+
stdout: out.getText(),
|
|
76
|
+
stderr: err.getText(),
|
|
77
|
+
truncated: out.wasTruncated() || err.wasTruncated(),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
66
80
|
function exitCodeFromClose(code, signal) {
|
|
67
81
|
if (code !== null) {
|
|
68
82
|
return code;
|
|
@@ -95,7 +109,7 @@ export async function exec(command, args, options = {}) {
|
|
|
95
109
|
child.stdout.on('data', out.onData);
|
|
96
110
|
child.stderr.on('data', err.onData);
|
|
97
111
|
child.on('error', (error) => {
|
|
98
|
-
reject(toExecRejection(error, command, args, options.timeout));
|
|
112
|
+
reject(toExecRejection(error, command, args, options.timeout, collectedOutput(out, err)));
|
|
99
113
|
});
|
|
100
114
|
child.on('close', (code, signal) => {
|
|
101
115
|
resolve({
|
|
@@ -109,48 +123,48 @@ export async function exec(command, args, options = {}) {
|
|
|
109
123
|
});
|
|
110
124
|
}
|
|
111
125
|
/**
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
126
|
+
* The shared body of every spawn wrapper that outlives its call: detach
|
|
127
|
+
* decision, shutdown forwarding, closure tracking, process-group sweep and
|
|
128
|
+
* typed timeout rejection.
|
|
129
|
+
*
|
|
130
|
+
* `execStream`, `execInherit` and `execInheritCapture` each hand-rolled this
|
|
131
|
+
* sequence, and the copies drifted: `execStream` was the one that omitted
|
|
132
|
+
* {@link trackChildClosure}, so the bin signal handler did not wait for
|
|
133
|
+
* `runMachStream`'s children on Ctrl+C and the forwarder's SIGTERM → grace →
|
|
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
|
+
*
|
|
138
|
+
* `exec` deliberately stays outside: it neither forwards signals nor tracks
|
|
139
|
+
* closure, because it is for short-lived helpers that no one Ctrl+Cs through.
|
|
140
|
+
* `execSmokeRun` also stays outside: its deadline owns the SIGTERM → grace →
|
|
141
|
+
* SIGKILL escalation directly, so it shares no forwarder with the others.
|
|
142
|
+
*
|
|
143
|
+
* @param spec - The variant's stdio, stream wiring, grace budget and result shape
|
|
144
|
+
* @returns Whatever `spec.result` builds from the child's `close` event
|
|
117
145
|
*/
|
|
118
|
-
|
|
146
|
+
async function spawnTracked(spec) {
|
|
147
|
+
const { command, args, options } = spec;
|
|
119
148
|
return new Promise((resolve, reject) => {
|
|
120
149
|
const usesProcessGroup = options.processGroup === true && process.platform !== 'win32';
|
|
121
|
-
const child =
|
|
150
|
+
const child = spec.spawnChild({
|
|
122
151
|
cwd: options.cwd,
|
|
123
152
|
env: buildChildEnv(options),
|
|
124
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
125
153
|
signal: buildSignalFromTimeout(options.timeout),
|
|
126
154
|
detached: usesProcessGroup,
|
|
127
155
|
});
|
|
128
156
|
const groupPid = usesProcessGroup ? child.pid : undefined;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
options.onStdout?.(chunk);
|
|
135
|
-
});
|
|
136
|
-
child.stderr.on('data', (data) => {
|
|
137
|
-
const chunk = stderrDecoder.write(data);
|
|
138
|
-
if (chunk.length > 0)
|
|
139
|
-
options.onStderr?.(chunk);
|
|
140
|
-
});
|
|
141
|
-
// A detached group leader no longer receives the terminal's Ctrl+C, so
|
|
142
|
-
// the forwarder is mandatory (not just graceful-UX) when processGroup
|
|
143
|
-
// is set. Group-aware: kills route to the whole tree.
|
|
144
|
-
const forwarder = options.processGroup === true
|
|
145
|
-
? installGracefulShutdownForwarder(child, 1500, (signal) => {
|
|
157
|
+
spec.attach?.(child);
|
|
158
|
+
// Group-aware kills route to the whole tree. A non-group child is killed
|
|
159
|
+
// directly by the forwarder's own `child.kill`.
|
|
160
|
+
const killTarget = options.processGroup === true
|
|
161
|
+
? (signal) => {
|
|
146
162
|
killProcessTree(child, signal, usesProcessGroup);
|
|
147
|
-
}
|
|
163
|
+
}
|
|
164
|
+
: undefined;
|
|
165
|
+
const forwarder = spec.forwardWithoutProcessGroup || options.processGroup === true
|
|
166
|
+
? installGracefulShutdownForwarder(child, spec.graceMs, killTarget)
|
|
148
167
|
: undefined;
|
|
149
|
-
// Closure tracking: this was the one wrapper that omitted it, so the bin
|
|
150
|
-
// signal handler did not wait for `runMachStream`'s children on Ctrl+C
|
|
151
|
-
// and the forwarder's SIGTERM → grace → SIGKILL escalation above could
|
|
152
|
-
// not finish before the parent exited — the exact failure the tracking
|
|
153
|
-
// set was introduced to fix, left unwired here.
|
|
154
168
|
const closure = trackChildClosure();
|
|
155
169
|
child.on('error', (error) => {
|
|
156
170
|
// Abort/startup failure: make sure a partially-started tree does not
|
|
@@ -161,13 +175,13 @@ export async function execStream(command, args, options = {}) {
|
|
|
161
175
|
}
|
|
162
176
|
forwarder?.dispose();
|
|
163
177
|
closure.settle();
|
|
164
|
-
reject(toExecRejection(error, command, args, options.timeout));
|
|
178
|
+
reject(toExecRejection(error, command, args, options.timeout, spec.rejectionOutput?.()));
|
|
165
179
|
});
|
|
166
180
|
child.on('close', (code, signal) => {
|
|
167
181
|
forwarder?.dispose();
|
|
168
182
|
const finish = () => {
|
|
169
183
|
closure.settle();
|
|
170
|
-
resolve(
|
|
184
|
+
resolve(spec.result(code, signal));
|
|
171
185
|
};
|
|
172
186
|
if (groupPid !== undefined) {
|
|
173
187
|
sweepProcessGroup(groupPid).then(finish, finish);
|
|
@@ -178,6 +192,41 @@ export async function execStream(command, args, options = {}) {
|
|
|
178
192
|
});
|
|
179
193
|
});
|
|
180
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Executes a command and streams its output.
|
|
197
|
+
* @param command - Command to execute
|
|
198
|
+
* @param args - Command arguments
|
|
199
|
+
* @param options - Execution options
|
|
200
|
+
* @returns Exit code of the process
|
|
201
|
+
*/
|
|
202
|
+
export async function execStream(command, args, options = {}) {
|
|
203
|
+
return spawnTracked({
|
|
204
|
+
command,
|
|
205
|
+
args,
|
|
206
|
+
options,
|
|
207
|
+
graceMs: 1500,
|
|
208
|
+
// A detached group leader no longer receives the terminal's Ctrl+C, so
|
|
209
|
+
// the forwarder is mandatory (not just graceful-UX) when processGroup
|
|
210
|
+
// is set. A plain streamed child does not get one.
|
|
211
|
+
forwardWithoutProcessGroup: false,
|
|
212
|
+
spawnChild: (base) => spawn(command, args, { ...base, stdio: ['ignore', 'pipe', 'pipe'] }),
|
|
213
|
+
attach: (child) => {
|
|
214
|
+
const stdoutDecoder = new StringDecoder('utf8');
|
|
215
|
+
const stderrDecoder = new StringDecoder('utf8');
|
|
216
|
+
child.stdout.on('data', (data) => {
|
|
217
|
+
const chunk = stdoutDecoder.write(data);
|
|
218
|
+
if (chunk.length > 0)
|
|
219
|
+
options.onStdout?.(chunk);
|
|
220
|
+
});
|
|
221
|
+
child.stderr.on('data', (data) => {
|
|
222
|
+
const chunk = stderrDecoder.write(data);
|
|
223
|
+
if (chunk.length > 0)
|
|
224
|
+
options.onStderr?.(chunk);
|
|
225
|
+
});
|
|
226
|
+
},
|
|
227
|
+
result: exitCodeFromClose,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
181
230
|
/**
|
|
182
231
|
* Close-promises of children whose shutdown the CLI must wait for when a
|
|
183
232
|
* termination signal arrives. A bin signal handler that calls `process.exit`
|
|
@@ -194,7 +243,7 @@ const activeChildClosures = new Set();
|
|
|
194
243
|
* Exported for the one legitimate spawn outside this module:
|
|
195
244
|
* `core/marionette-preflight.ts` keeps its own `spawn` because it needs the
|
|
196
245
|
* live `ChildProcess` mid-run, returns while the child is still running, and
|
|
197
|
-
* aborts on a TCP byte rather than a deadline
|
|
246
|
+
* aborts on a TCP byte rather than a deadline, none of which any wrapper
|
|
198
247
|
* here can express. It still needs the shutdown contract, and a second
|
|
199
248
|
* hand-rolled copy is what lets a Ctrl+C orphan the whole mach → Firefox
|
|
200
249
|
* tree.
|
|
@@ -203,7 +252,7 @@ const activeChildClosures = new Set();
|
|
|
203
252
|
* Registers a child whose shutdown {@link waitForActiveChildShutdown} must
|
|
204
253
|
* wait for, and returns the handle that deregisters it.
|
|
205
254
|
*
|
|
206
|
-
* @returns `settle()
|
|
255
|
+
* @returns `settle()`. Call from both the child's `close` and `error`
|
|
207
256
|
* handlers so a dead child never holds the shutdown wait open
|
|
208
257
|
*/
|
|
209
258
|
export function trackChildClosure() {
|
|
@@ -242,7 +291,7 @@ export async function waitForActiveChildShutdown(timeoutMs) {
|
|
|
242
291
|
* Graceful shutdown: when the FireForge process receives SIGINT/SIGTERM, the
|
|
243
292
|
* signal is forwarded to the child as SIGTERM and a short grace timer (default
|
|
244
293
|
* 1500ms) runs before escalating to SIGKILL. A second matching signal during
|
|
245
|
-
* the grace period triggers an immediate SIGKILL
|
|
294
|
+
* the grace period triggers an immediate SIGKILL, matching the usual
|
|
246
295
|
* "hit Ctrl-C again to force-quit" UX. Without this, Firefox's AsyncShutdown
|
|
247
296
|
* / profileBeforeChange blockers (which flush in-memory state to disk) can be
|
|
248
297
|
* racing the OS child-exit path, losing the last few seconds of edits.
|
|
@@ -253,51 +302,21 @@ export async function waitForActiveChildShutdown(timeoutMs) {
|
|
|
253
302
|
* @returns Exit code of the process
|
|
254
303
|
*/
|
|
255
304
|
export async function execInherit(command, args, options = {}) {
|
|
256
|
-
return
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
});
|
|
265
|
-
const groupPid = usesProcessGroup ? child.pid : undefined;
|
|
266
|
-
const graceMs = options.shutdownGraceMs ?? 1500;
|
|
267
|
-
const { dispose } = installGracefulShutdownForwarder(child, graceMs, options.processGroup === true
|
|
268
|
-
? (signal) => {
|
|
269
|
-
killProcessTree(child, signal, usesProcessGroup);
|
|
270
|
-
}
|
|
271
|
-
: undefined);
|
|
272
|
-
const closure = trackChildClosure();
|
|
273
|
-
child.on('error', (error) => {
|
|
274
|
-
if (options.processGroup === true) {
|
|
275
|
-
killProcessTree(child, 'SIGKILL', usesProcessGroup);
|
|
276
|
-
}
|
|
277
|
-
dispose();
|
|
278
|
-
closure.settle();
|
|
279
|
-
reject(toExecRejection(error, command, args, options.timeout));
|
|
280
|
-
});
|
|
281
|
-
child.on('close', (code, signal) => {
|
|
282
|
-
dispose();
|
|
283
|
-
const finish = () => {
|
|
284
|
-
closure.settle();
|
|
285
|
-
resolve(exitCodeFromClose(code, signal));
|
|
286
|
-
};
|
|
287
|
-
if (groupPid !== undefined) {
|
|
288
|
-
sweepProcessGroup(groupPid).then(finish, finish);
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
finish();
|
|
292
|
-
}
|
|
293
|
-
});
|
|
305
|
+
return spawnTracked({
|
|
306
|
+
command,
|
|
307
|
+
args,
|
|
308
|
+
options,
|
|
309
|
+
graceMs: options.shutdownGraceMs ?? 1500,
|
|
310
|
+
forwardWithoutProcessGroup: true,
|
|
311
|
+
spawnChild: (base) => spawn(command, args, { ...base, stdio: 'inherit' }),
|
|
312
|
+
result: exitCodeFromClose,
|
|
294
313
|
});
|
|
295
314
|
}
|
|
296
315
|
/**
|
|
297
316
|
* Wires parent-process SIGINT/SIGTERM to a child: first signal → child.kill
|
|
298
|
-
* (SIGTERM) + grace timer
|
|
299
|
-
* timer expiry → SIGKILL. Returns a `dispose()` that clears the
|
|
300
|
-
* 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
|
|
301
320
|
* `close` and `error` handlers so the process does not accumulate signal
|
|
302
321
|
* listeners across repeated spawns.
|
|
303
322
|
*/
|
|
@@ -318,7 +337,7 @@ export function installGracefulShutdownForwarder(child, graceMs, killTarget) {
|
|
|
318
337
|
sendKill('SIGKILL');
|
|
319
338
|
}
|
|
320
339
|
catch {
|
|
321
|
-
// Child is already gone
|
|
340
|
+
// Child is already gone, nothing to do.
|
|
322
341
|
}
|
|
323
342
|
};
|
|
324
343
|
const handleSignal = (signal) => {
|
|
@@ -365,54 +384,27 @@ export function installGracefulShutdownForwarder(child, graceMs, killTarget) {
|
|
|
365
384
|
* @returns Execution result with stdout, stderr, and exit code
|
|
366
385
|
*/
|
|
367
386
|
export async function execInheritCapture(command, args, options = {}) {
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
})
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
child.on('error', (error) => {
|
|
390
|
-
if (options.processGroup === true) {
|
|
391
|
-
killProcessTree(child, 'SIGKILL', usesProcessGroup);
|
|
392
|
-
}
|
|
393
|
-
dispose();
|
|
394
|
-
closure.settle();
|
|
395
|
-
reject(toExecRejection(error, command, args, options.timeout));
|
|
396
|
-
});
|
|
397
|
-
child.on('close', (code, signal) => {
|
|
398
|
-
dispose();
|
|
399
|
-
const finish = () => {
|
|
400
|
-
closure.settle();
|
|
401
|
-
resolve({
|
|
402
|
-
stdout: out.getText(),
|
|
403
|
-
stderr: err.getText(),
|
|
404
|
-
exitCode: exitCodeFromClose(code, signal),
|
|
405
|
-
stdoutTruncated: out.wasTruncated(),
|
|
406
|
-
stderrTruncated: err.wasTruncated(),
|
|
407
|
-
});
|
|
408
|
-
};
|
|
409
|
-
if (groupPid !== undefined) {
|
|
410
|
-
sweepProcessGroup(groupPid).then(finish, finish);
|
|
411
|
-
}
|
|
412
|
-
else {
|
|
413
|
-
finish();
|
|
414
|
-
}
|
|
415
|
-
});
|
|
387
|
+
const out = createStreamCollector(options.mirror?.stdout ?? process.stdout);
|
|
388
|
+
const err = createStreamCollector(options.mirror?.stderr ?? process.stderr);
|
|
389
|
+
return spawnTracked({
|
|
390
|
+
command,
|
|
391
|
+
args,
|
|
392
|
+
options,
|
|
393
|
+
graceMs: options.shutdownGraceMs ?? 1500,
|
|
394
|
+
forwardWithoutProcessGroup: true,
|
|
395
|
+
spawnChild: (base) => spawn(command, args, { ...base, stdio: ['inherit', 'pipe', 'pipe'] }),
|
|
396
|
+
attach: (child) => {
|
|
397
|
+
child.stdout.on('data', out.onData);
|
|
398
|
+
child.stderr.on('data', err.onData);
|
|
399
|
+
},
|
|
400
|
+
result: (code, signal) => ({
|
|
401
|
+
stdout: out.getText(),
|
|
402
|
+
stderr: err.getText(),
|
|
403
|
+
exitCode: exitCodeFromClose(code, signal),
|
|
404
|
+
stdoutTruncated: out.wasTruncated(),
|
|
405
|
+
stderrTruncated: err.wasTruncated(),
|
|
406
|
+
}),
|
|
407
|
+
rejectionOutput: () => collectedOutput(out, err),
|
|
416
408
|
});
|
|
417
409
|
}
|
|
418
410
|
/**
|
|
@@ -430,9 +422,10 @@ export async function execInheritCapture(command, args, options = {}) {
|
|
|
430
422
|
*
|
|
431
423
|
* Windows fallback: `detached: true` does not create an equivalent group
|
|
432
424
|
* there, so we kill the descendant tree with `taskkill /pid <pid> /T /F`
|
|
433
|
-
* instead. taskkill has no graceful-signal equivalent
|
|
434
|
-
* and the grace re-invocation are forced kills
|
|
435
|
-
* 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.
|
|
436
429
|
* `child.kill()` is still sent as a direct-child fallback in case
|
|
437
430
|
* taskkill itself is unavailable.
|
|
438
431
|
*/
|
|
@@ -481,8 +474,8 @@ export async function execSmokeRun(command, args, options) {
|
|
|
481
474
|
}, options.smokeTimeoutMs);
|
|
482
475
|
deadlineTimer.unref();
|
|
483
476
|
// Forward parent SIGINT/SIGTERM to the whole child process group. The
|
|
484
|
-
// smoke child is a group leader (detached), so it does
|
|
485
|
-
// 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
|
|
486
479
|
// and the entire mach → firefox tree is orphaned. Second signal (or
|
|
487
480
|
// grace expiry) escalates to a group SIGKILL.
|
|
488
481
|
const forwardedSignals = new Set();
|
|
@@ -542,48 +535,6 @@ export async function execSmokeRun(command, args, options) {
|
|
|
542
535
|
});
|
|
543
536
|
});
|
|
544
537
|
}
|
|
545
|
-
/**
|
|
546
|
-
* Cap on the partial-line tail kept between chunks. A child emitting one
|
|
547
|
-
* enormous line with no terminator (minified JS dumped to stderr, a raw
|
|
548
|
-
* binary blob) would otherwise grow the buffer without bound — the 50 MB cap
|
|
549
|
-
* guards the collector, not these line buffers. When the tail exceeds the
|
|
550
|
-
* cap it is dispatched as a synthetic (oversized) line so the matchers still
|
|
551
|
-
* see its content, then the buffer resets.
|
|
552
|
-
*/
|
|
553
|
-
const MAX_PARTIAL_LINE_SIZE = 1024 * 1024;
|
|
554
|
-
/**
|
|
555
|
-
* Drains complete lines from `buffer`, dispatching each to `cb`. Treats
|
|
556
|
-
* `\n`, `\r\n`, and lone `\r` as line terminators — the lone-`\r` case
|
|
557
|
-
* matters for progress-bar style output (mach, cargo) that repaints a line
|
|
558
|
-
* with carriage returns and never sends a newline, which otherwise
|
|
559
|
-
* accumulates indefinitely. A single trailing `\r` is held back since it may
|
|
560
|
-
* be the first half of a `\r\n` pair split across chunks. Returns the
|
|
561
|
-
* remaining partial line — callers keep accumulating into it.
|
|
562
|
-
*/
|
|
563
|
-
function dispatchCompleteLines(buffer, cb) {
|
|
564
|
-
let searchFrom = 0;
|
|
565
|
-
for (;;) {
|
|
566
|
-
const nl = buffer.indexOf('\n', searchFrom);
|
|
567
|
-
const cr = buffer.indexOf('\r', searchFrom);
|
|
568
|
-
const idx = nl === -1 ? cr : cr === -1 ? nl : Math.min(nl, cr);
|
|
569
|
-
if (idx === -1)
|
|
570
|
-
break;
|
|
571
|
-
if (buffer[idx] === '\r' && idx === buffer.length - 1) {
|
|
572
|
-
// Possible first half of a chunk-split \r\n — wait for the next chunk.
|
|
573
|
-
break;
|
|
574
|
-
}
|
|
575
|
-
const line = buffer.slice(0, idx);
|
|
576
|
-
const terminatorLength = buffer[idx] === '\r' && buffer[idx + 1] === '\n' ? 2 : 1;
|
|
577
|
-
buffer = buffer.slice(idx + terminatorLength);
|
|
578
|
-
searchFrom = 0;
|
|
579
|
-
cb?.(line);
|
|
580
|
-
}
|
|
581
|
-
if (buffer.length > MAX_PARTIAL_LINE_SIZE) {
|
|
582
|
-
cb?.(buffer);
|
|
583
|
-
return '';
|
|
584
|
-
}
|
|
585
|
-
return buffer;
|
|
586
|
-
}
|
|
587
538
|
/**
|
|
588
539
|
* Finds an executable in the system PATH.
|
|
589
540
|
* @param name - Name of the executable
|
|
@@ -602,8 +553,7 @@ export async function findExecutable(name) {
|
|
|
602
553
|
}
|
|
603
554
|
return undefined;
|
|
604
555
|
}
|
|
605
|
-
catch
|
|
606
|
-
void error;
|
|
556
|
+
catch {
|
|
607
557
|
return undefined;
|
|
608
558
|
}
|
|
609
559
|
}
|
|
@@ -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;
|
|
@@ -58,13 +58,13 @@ export function formatPsDuration(seconds) {
|
|
|
58
58
|
if (Number.isNaN(seconds) || seconds < 0)
|
|
59
59
|
return undefined;
|
|
60
60
|
if (seconds < 60)
|
|
61
|
-
return `${
|
|
61
|
+
return `${Math.floor(seconds)}s`;
|
|
62
62
|
if (seconds < 3600) {
|
|
63
63
|
const m = Math.floor(seconds / 60);
|
|
64
64
|
const s = Math.floor(seconds % 60);
|
|
65
|
-
return `${
|
|
65
|
+
return `${m}m${String(s).padStart(2, '0')}s`;
|
|
66
66
|
}
|
|
67
67
|
const h = Math.floor(seconds / 3600);
|
|
68
68
|
const m = Math.floor((seconds % 3600) / 60);
|
|
69
|
-
return `${
|
|
69
|
+
return `${h}h${String(m).padStart(2, '0')}m`;
|
|
70
70
|
}
|
|
@@ -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) {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single awaitable delay used across FireForge.
|
|
3
|
+
*
|
|
4
|
+
* Five modules had grown a private copy of this (`sleep`, `delay`,
|
|
5
|
+
* `sweepDelay`) and four more sites inlined
|
|
6
|
+
* `new Promise((resolve) => setTimeout(resolve, ms))`. The copies disagreed on
|
|
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
|
+
*
|
|
11
|
+
* The default is a ref'd timer, because the dangerous mistake is the other
|
|
12
|
+
* one: an unref'd delay awaited between a SIGTERM and its escalation lets Node
|
|
13
|
+
* exit mid-grace and skip the escalation entirely.
|
|
14
|
+
*
|
|
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
|
+
* @param ms - Milliseconds to wait.
|
|
20
|
+
* @param options - Pass `unref: true` when a pending delay must not keep the
|
|
21
|
+
* process alive (background probes, best-effort retries during shutdown).
|
|
22
|
+
* @returns A promise that resolves once the delay has elapsed.
|
|
23
|
+
*/
|
|
24
|
+
export declare function sleep(ms: number, options?: {
|
|
25
|
+
unref?: boolean;
|
|
26
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* The single awaitable delay used across FireForge.
|
|
4
|
+
*
|
|
5
|
+
* Five modules had grown a private copy of this (`sleep`, `delay`,
|
|
6
|
+
* `sweepDelay`) and four more sites inlined
|
|
7
|
+
* `new Promise((resolve) => setTimeout(resolve, ms))`. The copies disagreed on
|
|
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
|
+
*
|
|
12
|
+
* The default is a ref'd timer, because the dangerous mistake is the other
|
|
13
|
+
* one: an unref'd delay awaited between a SIGTERM and its escalation lets Node
|
|
14
|
+
* exit mid-grace and skip the escalation entirely.
|
|
15
|
+
*
|
|
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
|
+
* @param ms - Milliseconds to wait.
|
|
21
|
+
* @param options - Pass `unref: true` when a pending delay must not keep the
|
|
22
|
+
* process alive (background probes, best-effort retries during shutdown).
|
|
23
|
+
* @returns A promise that resolves once the delay has elapsed.
|
|
24
|
+
*/
|
|
25
|
+
export function sleep(ms, options) {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
const timer = setTimeout(resolve, ms);
|
|
28
|
+
if (options?.unref === true)
|
|
29
|
+
timer.unref();
|
|
30
|
+
});
|
|
31
|
+
}
|