@hominis/fireforge 0.43.0 → 0.44.0
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 +127 -0
- package/README.md +10 -1
- package/dist/bin/fireforge.d.ts +4 -9
- package/dist/bin/fireforge.js +42 -40
- package/dist/build-info.json +4 -4
- package/dist/src/cli.js +74 -8
- package/dist/src/commands/bootstrap.js +17 -20
- package/dist/src/commands/build.js +25 -32
- package/dist/src/commands/config.js +34 -41
- package/dist/src/commands/discard.js +8 -9
- package/dist/src/commands/doctor-check-core.d.ts +4 -18
- package/dist/src/commands/doctor-check-core.js +8 -35
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
- package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
- package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
- package/dist/src/commands/doctor-furnace-jar.js +7 -9
- package/dist/src/commands/doctor-furnace.js +21 -24
- package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
- package/dist/src/commands/doctor-orphaned-harness.js +18 -44
- package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
- package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
- package/dist/src/commands/doctor-working-tree.d.ts +10 -12
- package/dist/src/commands/doctor-working-tree.js +11 -18
- package/dist/src/commands/doctor.js +35 -53
- package/dist/src/commands/download.js +32 -48
- package/dist/src/commands/export-all.js +29 -33
- package/dist/src/commands/export-flow.js +6 -6
- package/dist/src/commands/export-placement-conflicts.js +10 -9
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-shared.d.ts +30 -33
- package/dist/src/commands/export-shared.js +45 -43
- package/dist/src/commands/export.js +21 -27
- package/dist/src/commands/furnace/apply.js +14 -23
- package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
- package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
- package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
- package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
- package/dist/src/commands/furnace/chrome-doc.js +31 -41
- package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
- package/dist/src/commands/furnace/create-browser-test.js +8 -8
- package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
- package/dist/src/commands/furnace/create-mochikit.js +8 -9
- package/dist/src/commands/furnace/create-readback.d.ts +12 -13
- package/dist/src/commands/furnace/create-readback.js +12 -13
- package/dist/src/commands/furnace/create-templates.d.ts +22 -28
- package/dist/src/commands/furnace/create-templates.js +35 -30
- package/dist/src/commands/furnace/create-xpcshell.js +2 -2
- package/dist/src/commands/furnace/create.js +33 -23
- package/dist/src/commands/furnace/deploy.js +16 -24
- package/dist/src/commands/furnace/diff.js +9 -9
- package/dist/src/commands/furnace/init.js +33 -36
- package/dist/src/commands/furnace/override.js +23 -25
- package/dist/src/commands/furnace/preview.js +47 -67
- package/dist/src/commands/furnace/refresh.js +12 -16
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
- package/dist/src/commands/furnace/remove-mutations.js +9 -16
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +33 -38
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
- package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
- package/dist/src/commands/furnace/rename.js +59 -69
- package/dist/src/commands/furnace/scan.js +19 -33
- package/dist/src/commands/furnace/status.js +12 -9
- package/dist/src/commands/furnace/sync.js +9 -16
- package/dist/src/commands/furnace/validate.js +20 -20
- package/dist/src/commands/import.js +42 -35
- package/dist/src/commands/lint-per-patch.js +15 -10
- package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
- package/dist/src/commands/lint-per-run-checkjs.js +13 -13
- package/dist/src/commands/lint-report.js +6 -7
- package/dist/src/commands/lint.d.ts +15 -16
- package/dist/src/commands/lint.js +86 -102
- package/dist/src/commands/package.js +6 -11
- package/dist/src/commands/patch/compact.js +1 -1
- package/dist/src/commands/patch/delete.js +24 -33
- package/dist/src/commands/patch/index.d.ts +5 -6
- package/dist/src/commands/patch/index.js +10 -12
- package/dist/src/commands/patch/lint-ignore.js +14 -13
- package/dist/src/commands/patch/move-files-create.d.ts +6 -6
- package/dist/src/commands/patch/move-files-create.js +8 -8
- package/dist/src/commands/patch/move-files-into.d.ts +6 -6
- package/dist/src/commands/patch/move-files-into.js +8 -8
- package/dist/src/commands/patch/patch-context.d.ts +2 -3
- package/dist/src/commands/patch/patch-context.js +2 -3
- package/dist/src/commands/patch/rename.d.ts +10 -11
- package/dist/src/commands/patch/rename.js +11 -12
- package/dist/src/commands/patch/reorder.js +8 -9
- package/dist/src/commands/patch/split-plan.js +1 -1
- package/dist/src/commands/patch/split.d.ts +8 -10
- package/dist/src/commands/patch/split.js +9 -11
- package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
- package/dist/src/commands/patch/staged-dependency.js +7 -3
- package/dist/src/commands/patch/tier.d.ts +9 -9
- package/dist/src/commands/patch/tier.js +18 -15
- package/dist/src/commands/re-export-adjacent.js +9 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
- package/dist/src/commands/re-export-bulk-scan.js +22 -21
- package/dist/src/commands/re-export-drift.js +10 -10
- package/dist/src/commands/re-export-files.d.ts +6 -7
- package/dist/src/commands/re-export-files.js +34 -44
- package/dist/src/commands/re-export-lint.d.ts +10 -13
- package/dist/src/commands/re-export-lint.js +16 -14
- package/dist/src/commands/re-export-options.d.ts +6 -6
- package/dist/src/commands/re-export-options.js +6 -6
- package/dist/src/commands/re-export-register.d.ts +4 -10
- package/dist/src/commands/re-export-register.js +5 -11
- package/dist/src/commands/re-export-scan.js +1 -1
- package/dist/src/commands/re-export-single.d.ts +3 -3
- package/dist/src/commands/re-export-single.js +33 -25
- package/dist/src/commands/re-export.js +13 -21
- package/dist/src/commands/rebase/abort.js +3 -3
- package/dist/src/commands/rebase/confirm.js +2 -1
- package/dist/src/commands/rebase/continue.d.ts +1 -1
- package/dist/src/commands/rebase/continue.js +14 -9
- package/dist/src/commands/rebase/index.js +11 -11
- package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
- package/dist/src/commands/rebase/patch-loop.js +60 -39
- package/dist/src/commands/rebase/summary.js +1 -1
- package/dist/src/commands/register.js +5 -7
- package/dist/src/commands/reset.js +2 -1
- package/dist/src/commands/resolve.d.ts +16 -13
- package/dist/src/commands/resolve.js +30 -33
- package/dist/src/commands/run.js +33 -35
- package/dist/src/commands/setup-support.js +15 -19
- package/dist/src/commands/setup.js +13 -9
- package/dist/src/commands/status-check.d.ts +6 -6
- package/dist/src/commands/status-json.d.ts +6 -6
- package/dist/src/commands/status-json.js +5 -0
- package/dist/src/commands/status-output.d.ts +5 -5
- package/dist/src/commands/status-output.js +6 -6
- package/dist/src/commands/status-ownership.d.ts +16 -14
- package/dist/src/commands/status-ownership.js +16 -14
- package/dist/src/commands/status.js +42 -34
- package/dist/src/commands/test-build-phase.js +26 -13
- package/dist/src/commands/test-diagnose.js +44 -44
- package/dist/src/commands/test-register.js +1 -0
- package/dist/src/commands/test-run.d.ts +14 -16
- package/dist/src/commands/test-run.js +21 -13
- package/dist/src/commands/test-stale-gate.d.ts +15 -16
- package/dist/src/commands/test-stale-gate.js +15 -16
- package/dist/src/commands/test-verdict.d.ts +20 -3
- package/dist/src/commands/test-verdict.js +30 -0
- package/dist/src/commands/test.js +83 -76
- package/dist/src/commands/token-coverage.js +3 -4
- package/dist/src/commands/token.js +16 -18
- package/dist/src/commands/tree.js +47 -31
- package/dist/src/commands/typecheck.d.ts +10 -12
- package/dist/src/commands/typecheck.js +24 -27
- package/dist/src/commands/verify.js +13 -15
- package/dist/src/commands/watch.js +21 -23
- package/dist/src/commands/wire.js +52 -62
- package/dist/src/core/ast-utils.d.ts +8 -7
- package/dist/src/core/ast-utils.js +8 -7
- package/dist/src/core/branding.d.ts +9 -14
- package/dist/src/core/branding.js +7 -11
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +14 -19
- package/dist/src/core/build-audit-platform.js +25 -33
- package/dist/src/core/build-audit-registration.js +17 -25
- package/dist/src/core/build-audit-resolve.d.ts +15 -17
- package/dist/src/core/build-audit-resolve.js +27 -33
- package/dist/src/core/build-audit-transforms.js +18 -19
- package/dist/src/core/build-audit.js +28 -42
- package/dist/src/core/build-baseline-types.d.ts +29 -35
- package/dist/src/core/build-baseline.d.ts +5 -4
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-overwrite-guard.d.ts +7 -14
- package/dist/src/core/build-overwrite-guard.js +62 -19
- package/dist/src/core/build-prepare.d.ts +2 -2
- package/dist/src/core/build-prepare.js +8 -9
- package/dist/src/core/config-state.js +12 -4
- package/dist/src/core/config-validate.js +8 -5
- package/dist/src/core/config.d.ts +5 -8
- package/dist/src/core/config.js +7 -16
- package/dist/src/core/coverage-extend.d.ts +15 -13
- package/dist/src/core/coverage-extend.js +15 -13
- package/dist/src/core/destructive.d.ts +31 -9
- package/dist/src/core/destructive.js +29 -26
- package/dist/src/core/diff-hunks.js +10 -12
- package/dist/src/core/discard-baseline.d.ts +8 -8
- package/dist/src/core/discard-baseline.js +16 -15
- package/dist/src/core/display-state.d.ts +12 -14
- package/dist/src/core/display-state.js +12 -14
- package/dist/src/core/engine-changes.d.ts +2 -4
- package/dist/src/core/engine-changes.js +2 -4
- package/dist/src/core/engine-precondition.d.ts +28 -13
- package/dist/src/core/engine-precondition.js +25 -10
- package/dist/src/core/engine-session-lock.d.ts +47 -21
- package/dist/src/core/engine-session-lock.js +168 -33
- package/dist/src/core/export-moved-code-shape.d.ts +10 -10
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock.d.ts +62 -5
- package/dist/src/core/file-lock.js +196 -59
- package/dist/src/core/firefox-cache.js +1 -3
- package/dist/src/core/firefox-extract.js +10 -14
- package/dist/src/core/firefox.d.ts +7 -5
- package/dist/src/core/firefox.js +4 -5
- package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
- package/dist/src/core/furnace-apply-dry-run.js +3 -2
- package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
- package/dist/src/core/furnace-apply-ftl.js +12 -12
- package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
- package/dist/src/core/furnace-apply-helpers.js +19 -16
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
- package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
- package/dist/src/core/furnace-apply.d.ts +5 -8
- package/dist/src/core/furnace-apply.js +19 -24
- package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
- package/dist/src/core/furnace-checksum-utils.js +16 -0
- package/dist/src/core/furnace-config.d.ts +21 -30
- package/dist/src/core/furnace-config.js +32 -54
- package/dist/src/core/furnace-constants.d.ts +8 -0
- package/dist/src/core/furnace-constants.js +10 -2
- package/dist/src/core/furnace-css-fragments.d.ts +5 -5
- package/dist/src/core/furnace-css-fragments.js +5 -5
- package/dist/src/core/furnace-jsconfig.d.ts +11 -12
- package/dist/src/core/furnace-jsconfig.js +11 -12
- package/dist/src/core/furnace-marker.d.ts +7 -8
- package/dist/src/core/furnace-marker.js +7 -8
- package/dist/src/core/furnace-operation.d.ts +31 -0
- package/dist/src/core/furnace-operation.js +54 -17
- package/dist/src/core/furnace-precondition.d.ts +61 -0
- package/dist/src/core/furnace-precondition.js +67 -0
- package/dist/src/core/furnace-registration-remove.d.ts +5 -6
- package/dist/src/core/furnace-registration-remove.js +6 -7
- package/dist/src/core/furnace-registration-validate.d.ts +13 -0
- package/dist/src/core/furnace-registration-validate.js +20 -1
- package/dist/src/core/furnace-registration.d.ts +5 -6
- package/dist/src/core/furnace-registration.js +10 -12
- package/dist/src/core/furnace-rollback.js +7 -7
- package/dist/src/core/furnace-scanner.d.ts +1 -0
- package/dist/src/core/furnace-scanner.js +1 -2
- package/dist/src/core/furnace-stale-export.d.ts +10 -10
- package/dist/src/core/furnace-stale-export.js +10 -10
- package/dist/src/core/furnace-state-persist.d.ts +6 -8
- package/dist/src/core/furnace-state-persist.js +6 -8
- package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
- package/dist/src/core/furnace-validate-accessibility.js +310 -1
- package/dist/src/core/furnace-validate-compatibility.js +141 -1
- package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
- package/dist/src/core/furnace-validate-helpers.js +0 -491
- package/dist/src/core/furnace-validate-registration.d.ts +7 -0
- package/dist/src/core/furnace-validate-registration.js +115 -41
- package/dist/src/core/furnace-validate.d.ts +16 -0
- package/dist/src/core/furnace-validate.js +188 -145
- package/dist/src/core/furnace-version-drift.d.ts +10 -11
- package/dist/src/core/furnace-version-drift.js +10 -11
- package/dist/src/core/git-base.d.ts +7 -9
- package/dist/src/core/git-base.js +7 -9
- package/dist/src/core/git-diff.d.ts +20 -9
- package/dist/src/core/git-diff.js +148 -63
- package/dist/src/core/git-file-ops.d.ts +19 -19
- package/dist/src/core/git-file-ops.js +19 -19
- package/dist/src/core/git-readonly-index.d.ts +53 -19
- package/dist/src/core/git-readonly-index.js +75 -31
- package/dist/src/core/git-status.d.ts +5 -6
- package/dist/src/core/git-status.js +5 -6
- package/dist/src/core/git.d.ts +9 -10
- package/dist/src/core/git.js +54 -70
- package/dist/src/core/license-headers.d.ts +17 -23
- package/dist/src/core/license-headers.js +17 -23
- package/dist/src/core/mach-build-artifacts.d.ts +9 -9
- package/dist/src/core/mach-build-artifacts.js +57 -19
- package/dist/src/core/mach-error-hints.js +42 -29
- package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
- package/dist/src/core/mach-known-noise-filter.js +18 -20
- package/dist/src/core/mach-mozconfig.d.ts +14 -0
- package/dist/src/core/mach-mozconfig.js +30 -0
- package/dist/src/core/mach-resource-shim.d.ts +43 -58
- package/dist/src/core/mach-resource-shim.js +50 -67
- package/dist/src/core/mach.d.ts +37 -41
- package/dist/src/core/mach.js +50 -51
- package/dist/src/core/marionette-port.d.ts +36 -1
- package/dist/src/core/marionette-port.js +96 -31
- package/dist/src/core/marionette-preflight.d.ts +8 -12
- package/dist/src/core/marionette-preflight.js +86 -52
- package/dist/src/core/mochitest-server-port.d.ts +42 -0
- package/dist/src/core/mochitest-server-port.js +119 -0
- package/dist/src/core/module-resolution-preflight.d.ts +9 -11
- package/dist/src/core/module-resolution-preflight.js +9 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
- package/dist/src/core/moz-manifest-helpers.js +163 -0
- package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
- package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
- package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
- package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
- package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
- package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
- package/dist/src/core/ownership-table.d.ts +14 -16
- package/dist/src/core/ownership-table.js +14 -16
- package/dist/src/core/parser-fallback.d.ts +15 -1
- package/dist/src/core/parser-fallback.js +22 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
- package/dist/src/core/patch-apply-fuzz.js +15 -18
- package/dist/src/core/patch-apply.d.ts +13 -34
- package/dist/src/core/patch-apply.js +16 -76
- package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
- package/dist/src/core/patch-artifact-normalize.js +13 -15
- package/dist/src/core/patch-export-metadata.d.ts +12 -2
- package/dist/src/core/patch-export-metadata.js +13 -4
- package/dist/src/core/patch-export-update.d.ts +13 -1
- package/dist/src/core/patch-export-update.js +25 -8
- package/dist/src/core/patch-export.d.ts +15 -8
- package/dist/src/core/patch-export.js +10 -11
- package/dist/src/core/patch-files.d.ts +5 -6
- package/dist/src/core/patch-files.js +5 -6
- package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
- package/dist/src/core/patch-identifier-suggest.js +14 -19
- package/dist/src/core/patch-lint-binary.d.ts +51 -0
- package/dist/src/core/patch-lint-binary.js +39 -0
- package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
- package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
- package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
- package/dist/src/core/patch-lint-checkjs.js +16 -16
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
- package/dist/src/core/patch-lint-creators.d.ts +8 -8
- package/dist/src/core/patch-lint-creators.js +8 -8
- package/dist/src/core/patch-lint-cross.d.ts +17 -20
- package/dist/src/core/patch-lint-cross.js +16 -16
- package/dist/src/core/patch-lint-css.d.ts +3 -5
- package/dist/src/core/patch-lint-css.js +17 -22
- package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
- package/dist/src/core/patch-lint-diff-tag.js +14 -16
- package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
- package/dist/src/core/patch-lint-jsdoc.js +26 -19
- package/dist/src/core/patch-lint-mozbuild.js +20 -20
- package/dist/src/core/patch-lint-observer.d.ts +7 -7
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint.d.ts +38 -29
- package/dist/src/core/patch-lint.js +89 -121
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +45 -9
- package/dist/src/core/patch-manifest-consistency.d.ts +2 -1
- package/dist/src/core/patch-manifest-consistency.js +25 -27
- package/dist/src/core/patch-manifest-io.js +14 -18
- package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
- package/dist/src/core/patch-manifest-resolve.js +9 -12
- package/dist/src/core/patch-manifest-validate.d.ts +6 -1
- package/dist/src/core/patch-manifest-validate.js +25 -13
- package/dist/src/core/patch-parse.d.ts +24 -13
- package/dist/src/core/patch-parse.js +19 -14
- package/dist/src/core/patch-policy.d.ts +2 -2
- package/dist/src/core/patch-policy.js +2 -2
- package/dist/src/core/patch-registration-refs.d.ts +7 -8
- package/dist/src/core/patch-registration-refs.js +9 -9
- package/dist/src/core/process-cpu-time.d.ts +12 -0
- package/dist/src/core/process-cpu-time.js +52 -0
- package/dist/src/core/rebase-session.d.ts +38 -26
- package/dist/src/core/rebase-session.js +55 -28
- package/dist/src/core/register-browser-content.js +9 -74
- package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
- package/dist/src/core/register-module.js +10 -43
- package/dist/src/core/register-scaffold.d.ts +8 -8
- package/dist/src/core/register-scaffold.js +10 -10
- package/dist/src/core/register-shared-css.d.ts +9 -12
- package/dist/src/core/register-shared-css.js +17 -87
- package/dist/src/core/register-xpcshell-test.d.ts +6 -7
- package/dist/src/core/register-xpcshell-test.js +7 -8
- package/dist/src/core/shared-ftl.js +12 -4
- package/dist/src/core/state-file.d.ts +45 -0
- package/dist/src/core/state-file.js +34 -0
- package/dist/src/core/status-binary.d.ts +18 -11
- package/dist/src/core/status-binary.js +19 -12
- package/dist/src/core/status-classify.d.ts +30 -36
- package/dist/src/core/status-classify.js +21 -26
- package/dist/src/core/test-changed-prefs.d.ts +30 -0
- package/dist/src/core/test-changed-prefs.js +78 -0
- package/dist/src/core/test-harness-crash.d.ts +25 -63
- package/dist/src/core/test-harness-crash.js +121 -142
- package/dist/src/core/test-harness-signature.d.ts +18 -0
- package/dist/src/core/test-harness-signature.js +13 -0
- package/dist/src/core/test-path-scope.d.ts +12 -15
- package/dist/src/core/test-path-scope.js +15 -18
- package/dist/src/core/test-stale-check.d.ts +17 -17
- package/dist/src/core/test-stale-check.js +50 -43
- package/dist/src/core/test-stall-triage.d.ts +51 -0
- package/dist/src/core/test-stall-triage.js +126 -0
- package/dist/src/core/token-category.js +5 -7
- package/dist/src/core/token-coverage.js +9 -9
- package/dist/src/core/token-dark-mode.d.ts +9 -11
- package/dist/src/core/token-dark-mode.js +9 -11
- package/dist/src/core/token-docs.d.ts +2 -0
- package/dist/src/core/token-docs.js +2 -0
- package/dist/src/core/token-manager.d.ts +10 -2
- package/dist/src/core/token-manager.js +17 -8
- package/dist/src/core/token-scaffold.d.ts +7 -7
- package/dist/src/core/token-scaffold.js +7 -7
- package/dist/src/core/token-variant.d.ts +4 -4
- package/dist/src/core/token-variant.js +4 -4
- package/dist/src/core/toolchain-preflight.d.ts +20 -21
- package/dist/src/core/toolchain-preflight.js +28 -31
- package/dist/src/core/tree-guard.js +12 -2
- package/dist/src/core/tree-store.d.ts +41 -27
- package/dist/src/core/tree-store.js +63 -42
- package/dist/src/core/typecheck-shim.d.ts +23 -24
- package/dist/src/core/typecheck-shim.js +23 -24
- package/dist/src/core/typecheck.js +8 -8
- package/dist/src/core/wire-destroy.d.ts +3 -3
- package/dist/src/core/wire-destroy.js +7 -15
- package/dist/src/core/wire-dom-fragment.d.ts +9 -17
- package/dist/src/core/wire-dom-fragment.js +11 -44
- package/dist/src/core/wire-init.d.ts +2 -3
- package/dist/src/core/wire-init.js +8 -19
- package/dist/src/core/wire-subscript.d.ts +2 -3
- package/dist/src/core/wire-subscript.js +4 -13
- package/dist/src/core/wire-utils.d.ts +7 -8
- package/dist/src/core/wire-utils.js +7 -8
- package/dist/src/core/xpcshell-appdir.d.ts +38 -45
- package/dist/src/core/xpcshell-appdir.js +38 -45
- package/dist/src/errors/base.d.ts +37 -16
- package/dist/src/errors/base.js +37 -16
- package/dist/src/errors/build.d.ts +13 -1
- package/dist/src/errors/build.js +14 -2
- package/dist/src/errors/codes.d.ts +16 -0
- package/dist/src/errors/codes.js +16 -0
- package/dist/src/errors/furnace.d.ts +4 -4
- package/dist/src/errors/git.d.ts +6 -10
- package/dist/src/errors/git.js +6 -10
- package/dist/src/errors/patch.d.ts +7 -7
- package/dist/src/errors/patch.js +7 -7
- package/dist/src/errors/rebase.d.ts +4 -4
- package/dist/src/errors/rebase.js +4 -4
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.js +5 -0
- package/dist/src/types/commands/index.d.ts +2 -2
- package/dist/src/types/commands/options.d.ts +88 -70
- package/dist/src/types/commands/patches.d.ts +24 -34
- package/dist/src/types/commands/project.d.ts +5 -34
- package/dist/src/types/config.d.ts +25 -23
- package/dist/src/types/config.js +6 -1
- package/dist/src/types/furnace.d.ts +37 -13
- package/dist/src/types/furnace.js +19 -1
- package/dist/src/types/index.d.ts +3 -3
- package/dist/src/utils/build-info.d.ts +7 -8
- package/dist/src/utils/build-info.js +12 -11
- package/dist/src/utils/errors.d.ts +6 -8
- package/dist/src/utils/errors.js +6 -8
- package/dist/src/utils/logger.d.ts +27 -10
- package/dist/src/utils/logger.js +28 -16
- package/dist/src/utils/machine-output.d.ts +12 -0
- package/dist/src/utils/machine-output.js +33 -0
- package/dist/src/utils/options.d.ts +31 -14
- package/dist/src/utils/options.js +86 -30
- package/dist/src/utils/paths.d.ts +10 -8
- package/dist/src/utils/paths.js +10 -8
- package/dist/src/utils/platform.d.ts +0 -25
- package/dist/src/utils/platform.js +1 -42
- package/dist/src/utils/process-group.d.ts +9 -4
- package/dist/src/utils/process-group.js +19 -5
- package/dist/src/utils/process.d.ts +42 -7
- package/dist/src/utils/process.js +44 -17
- package/dist/src/utils/ps-duration.d.ts +31 -0
- package/dist/src/utils/ps-duration.js +70 -0
- package/dist/src/utils/regex.d.ts +9 -10
- package/dist/src/utils/regex.js +9 -10
- package/dist/src/utils/validation.d.ts +58 -28
- package/dist/src/utils/validation.js +60 -33
- package/package.json +2 -2
- package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
- package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
- package/dist/src/core/manifest-helpers.d.ts +0 -38
- package/dist/src/core/manifest-helpers.js +0 -120
- /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
- /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
- /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
|
@@ -11,28 +11,3 @@ export type Arch = 'x64' | 'arm64';
|
|
|
11
11
|
* @throws Error if running on an unsupported platform
|
|
12
12
|
*/
|
|
13
13
|
export declare function getPlatform(): Platform;
|
|
14
|
-
/**
|
|
15
|
-
* Gets the current CPU architecture.
|
|
16
|
-
* @throws Error if running on an unsupported architecture
|
|
17
|
-
*/
|
|
18
|
-
export declare function getArch(): Arch;
|
|
19
|
-
/**
|
|
20
|
-
* Gets the mozconfig filename for the current platform.
|
|
21
|
-
*/
|
|
22
|
-
export declare function getMozconfigName(): string;
|
|
23
|
-
/**
|
|
24
|
-
* Checks if the current platform is macOS.
|
|
25
|
-
*/
|
|
26
|
-
export declare function isDarwin(): boolean;
|
|
27
|
-
/**
|
|
28
|
-
* Checks if the current platform is Linux.
|
|
29
|
-
*/
|
|
30
|
-
export declare function isLinux(): boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Checks if the current platform is Windows.
|
|
33
|
-
*/
|
|
34
|
-
export declare function isWindows(): boolean;
|
|
35
|
-
/**
|
|
36
|
-
* Gets the appropriate file extension for executables on the current platform.
|
|
37
|
-
*/
|
|
38
|
-
export declare function getExecutableExtension(): string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
-
import {
|
|
2
|
+
import { platform } from 'node:os';
|
|
3
3
|
import { GeneralError } from '../errors/base.js';
|
|
4
4
|
/**
|
|
5
5
|
* Gets the current operating system platform.
|
|
@@ -12,44 +12,3 @@ export function getPlatform() {
|
|
|
12
12
|
}
|
|
13
13
|
throw new GeneralError(`Unsupported platform: ${p}. FireForge supports darwin, linux, and win32.`);
|
|
14
14
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Gets the current CPU architecture.
|
|
17
|
-
* @throws Error if running on an unsupported architecture
|
|
18
|
-
*/
|
|
19
|
-
export function getArch() {
|
|
20
|
-
const a = arch();
|
|
21
|
-
if (a === 'x64' || a === 'arm64') {
|
|
22
|
-
return a;
|
|
23
|
-
}
|
|
24
|
-
throw new GeneralError(`Unsupported architecture: ${a}. FireForge supports x64 and arm64.`);
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Gets the mozconfig filename for the current platform.
|
|
28
|
-
*/
|
|
29
|
-
export function getMozconfigName() {
|
|
30
|
-
return `${getPlatform()}.mozconfig`;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Checks if the current platform is macOS.
|
|
34
|
-
*/
|
|
35
|
-
export function isDarwin() {
|
|
36
|
-
return platform() === 'darwin';
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Checks if the current platform is Linux.
|
|
40
|
-
*/
|
|
41
|
-
export function isLinux() {
|
|
42
|
-
return platform() === 'linux';
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Checks if the current platform is Windows.
|
|
46
|
-
*/
|
|
47
|
-
export function isWindows() {
|
|
48
|
-
return platform() === 'win32';
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Gets the appropriate file extension for executables on the current platform.
|
|
52
|
-
*/
|
|
53
|
-
export function getExecutableExtension() {
|
|
54
|
-
return isWindows() ? '.exe' : '';
|
|
55
|
-
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Process-group kill and post-run sweep helpers for the exec layer
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Process-group kill and post-run sweep helpers for the exec layer. Split
|
|
3
|
+
* out of `process.ts` to keep that file within the per-file line budget;
|
|
4
|
+
* deliberately spawn-based (not `exec`-based) so the two modules do not
|
|
5
|
+
* import each other cyclically.
|
|
6
6
|
*/
|
|
7
7
|
import { type ChildProcess } from 'node:child_process';
|
|
8
8
|
/**
|
|
@@ -11,6 +11,11 @@ import { type ChildProcess } from 'node:child_process';
|
|
|
11
11
|
* chains), or a `taskkill /T /F` tree kill plus a direct `child.kill`
|
|
12
12
|
* fallback on Windows. No-ops once the direct child has exited (group
|
|
13
13
|
* survivors after exit are the post-run sweep's job, not this function's).
|
|
14
|
+
*
|
|
15
|
+
* A failed group kill falls through to a direct `child.kill` on POSIX too:
|
|
16
|
+
* ESRCH/EPERM on the negative PID means the group is gone or was never
|
|
17
|
+
* created, and signalling the direct child is strictly better than
|
|
18
|
+
* returning silently.
|
|
14
19
|
*/
|
|
15
20
|
export declare function killProcessTree(child: ChildProcess, signal: NodeJS.Signals, usesProcessGroup: boolean): void;
|
|
16
21
|
/** One process still alive in a swept group. */
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* Process-group kill and post-run sweep helpers for the exec layer
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* Process-group kill and post-run sweep helpers for the exec layer. Split
|
|
4
|
+
* out of `process.ts` to keep that file within the per-file line budget;
|
|
5
|
+
* deliberately spawn-based (not `exec`-based) so the two modules do not
|
|
6
|
+
* import each other cyclically.
|
|
7
7
|
*/
|
|
8
8
|
import { spawn } from 'node:child_process';
|
|
9
9
|
import { getNodeErrorCode } from './errors.js';
|
|
@@ -14,6 +14,11 @@ import { verbose, warn } from './logger.js';
|
|
|
14
14
|
* chains), or a `taskkill /T /F` tree kill plus a direct `child.kill`
|
|
15
15
|
* fallback on Windows. No-ops once the direct child has exited (group
|
|
16
16
|
* survivors after exit are the post-run sweep's job, not this function's).
|
|
17
|
+
*
|
|
18
|
+
* A failed group kill falls through to a direct `child.kill` on POSIX too:
|
|
19
|
+
* ESRCH/EPERM on the negative PID means the group is gone or was never
|
|
20
|
+
* created, and signalling the direct child is strictly better than
|
|
21
|
+
* returning silently.
|
|
17
22
|
*/
|
|
18
23
|
export function killProcessTree(child, signal, usesProcessGroup) {
|
|
19
24
|
if (child.exitCode !== null || child.signalCode !== null)
|
|
@@ -26,7 +31,16 @@ export function killProcessTree(child, signal, usesProcessGroup) {
|
|
|
26
31
|
// Negative PID routes to the process group, killing the Python
|
|
27
32
|
// wrapper, the firefox it forked, and every content process
|
|
28
33
|
// that inherited the group.
|
|
29
|
-
|
|
34
|
+
try {
|
|
35
|
+
process.kill(-targetPid, signal);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// ESRCH/EPERM: the group is gone, or was never created because the
|
|
39
|
+
// platform ignored `detached`. Signal the direct child rather than
|
|
40
|
+
// doing nothing — it may well still be alive. Without this
|
|
41
|
+
// fall-through a failed group kill left the child running.
|
|
42
|
+
child.kill(signal);
|
|
43
|
+
}
|
|
30
44
|
}
|
|
31
45
|
else {
|
|
32
46
|
// No process group on Windows — taskkill /T walks the descendant
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
1
2
|
/**
|
|
2
3
|
* Result of executing a command.
|
|
3
4
|
*/
|
|
@@ -33,9 +34,8 @@ export interface ExecOptions {
|
|
|
33
34
|
* POSIX: spawn the child as a process-group leader and route every kill
|
|
34
35
|
* (parent-signal forwarding, abort, escalation) to the whole GROUP, then
|
|
35
36
|
* sweep the group for survivors after close — so a harness that dies at
|
|
36
|
-
* startup cannot strand spinning `multiprocessing` workers
|
|
37
|
-
*
|
|
38
|
-
* busy-spun at 100% CPU for ~26 days). Win32: tree-kill via
|
|
37
|
+
* startup cannot strand spinning `multiprocessing` workers, which reparent
|
|
38
|
+
* to launchd and busy-spin at 100% CPU indefinitely. Win32: tree-kill via
|
|
39
39
|
* `taskkill /T /F` on abort/signals only, no post-run sweep
|
|
40
40
|
* (best-effort). Default false — non-mach consumers are unaffected.
|
|
41
41
|
*
|
|
@@ -74,6 +74,27 @@ export interface StreamOptions extends ExecOptions {
|
|
|
74
74
|
* @returns Exit code of the process
|
|
75
75
|
*/
|
|
76
76
|
export declare function execStream(command: string, args: string[], options?: StreamOptions): Promise<number>;
|
|
77
|
+
/**
|
|
78
|
+
* Registers a child with {@link waitForActiveChildShutdown}.
|
|
79
|
+
*
|
|
80
|
+
* Exported for the one legitimate spawn outside this module:
|
|
81
|
+
* `core/marionette-preflight.ts` keeps its own `spawn` because it needs the
|
|
82
|
+
* live `ChildProcess` mid-run, returns while the child is still running, and
|
|
83
|
+
* aborts on a TCP byte rather than a deadline — none of which any wrapper
|
|
84
|
+
* here can express. It still needs the shutdown contract, and a second
|
|
85
|
+
* hand-rolled copy is what lets a Ctrl+C orphan the whole mach → Firefox
|
|
86
|
+
* tree.
|
|
87
|
+
*/
|
|
88
|
+
/**
|
|
89
|
+
* Registers a child whose shutdown {@link waitForActiveChildShutdown} must
|
|
90
|
+
* wait for, and returns the handle that deregisters it.
|
|
91
|
+
*
|
|
92
|
+
* @returns `settle()` — call from both the child's `close` and `error`
|
|
93
|
+
* handlers so a dead child never holds the shutdown wait open
|
|
94
|
+
*/
|
|
95
|
+
export declare function trackChildClosure(): {
|
|
96
|
+
settle: () => void;
|
|
97
|
+
};
|
|
77
98
|
/**
|
|
78
99
|
* Waits (bounded) for every tracked child process to close. Called by the
|
|
79
100
|
* bin signal handler after forwarding SIGINT/SIGTERM, so the parent stays
|
|
@@ -100,6 +121,17 @@ export declare function waitForActiveChildShutdown(timeoutMs: number): Promise<v
|
|
|
100
121
|
export declare function execInherit(command: string, args: string[], options?: ExecOptions & {
|
|
101
122
|
shutdownGraceMs?: number;
|
|
102
123
|
}): Promise<number>;
|
|
124
|
+
/**
|
|
125
|
+
* Wires parent-process SIGINT/SIGTERM to a child: first signal → child.kill
|
|
126
|
+
* (SIGTERM) + grace timer; second matching signal → immediate SIGKILL; grace
|
|
127
|
+
* timer expiry → SIGKILL. Returns a `dispose()` that clears the listeners and
|
|
128
|
+
* any outstanding timer. Callers must invoke `dispose()` from both the child's
|
|
129
|
+
* `close` and `error` handlers so the process does not accumulate signal
|
|
130
|
+
* listeners across repeated spawns.
|
|
131
|
+
*/
|
|
132
|
+
export declare function installGracefulShutdownForwarder(child: ReturnType<typeof spawn>, graceMs: number, killTarget?: (signal: NodeJS.Signals) => void): {
|
|
133
|
+
dispose: () => void;
|
|
134
|
+
};
|
|
103
135
|
/**
|
|
104
136
|
* Executes a command while inheriting stdin, streaming stdout/stderr live,
|
|
105
137
|
* and capturing the emitted output for diagnostics.
|
|
@@ -118,11 +150,14 @@ export type SmokeLineCallback = (line: string) => void;
|
|
|
118
150
|
*
|
|
119
151
|
* Deliberately omits `ExecOptions.timeout`: the smoke run's only deadline is
|
|
120
152
|
* {@link SmokeRunOptions.smokeTimeoutMs}, which signals the whole process
|
|
121
|
-
* group. Inheriting `timeout`
|
|
122
|
-
*
|
|
123
|
-
*
|
|
153
|
+
* group. Inheriting `timeout` is a leaky trap — accepted by the type but
|
|
154
|
+
* silently ignored, so a caller setting it gets no deadline at all.
|
|
155
|
+
*
|
|
156
|
+
* `processGroup` is omitted for the same reason: a smoke run is ALWAYS
|
|
157
|
+
* detached on POSIX (`usesProcessGroup` is derived from `process.platform`
|
|
158
|
+
* alone), so the field would be accepted and never read.
|
|
124
159
|
*/
|
|
125
|
-
export interface SmokeRunOptions extends Omit<ExecOptions, 'timeout'> {
|
|
160
|
+
export interface SmokeRunOptions extends Omit<ExecOptions, 'processGroup' | 'timeout'> {
|
|
126
161
|
/**
|
|
127
162
|
* Hard deadline in milliseconds. When it elapses the child process
|
|
128
163
|
* group is sent SIGTERM and, after `killGraceMs`, SIGKILL. The returned
|
|
@@ -145,6 +145,12 @@ export async function execStream(command, args, options = {}) {
|
|
|
145
145
|
killProcessTree(child, signal, usesProcessGroup);
|
|
146
146
|
})
|
|
147
147
|
: undefined;
|
|
148
|
+
// Closure tracking: this was the one wrapper that omitted it, so the bin
|
|
149
|
+
// signal handler did not wait for `runMachStream`'s children on Ctrl+C
|
|
150
|
+
// and the forwarder's SIGTERM → grace → SIGKILL escalation above could
|
|
151
|
+
// not finish before the parent exited — the exact failure the tracking
|
|
152
|
+
// set was introduced to fix, left unwired here.
|
|
153
|
+
const closure = trackChildClosure();
|
|
148
154
|
child.on('error', (error) => {
|
|
149
155
|
// Abort/startup failure: make sure a partially-started tree does not
|
|
150
156
|
// outlive the dispatch (a mach dying at startup used to strand
|
|
@@ -153,11 +159,13 @@ export async function execStream(command, args, options = {}) {
|
|
|
153
159
|
killProcessTree(child, 'SIGKILL', usesProcessGroup);
|
|
154
160
|
}
|
|
155
161
|
forwarder?.dispose();
|
|
162
|
+
closure.settle();
|
|
156
163
|
reject(toExecRejection(error, command, args, options.timeout));
|
|
157
164
|
});
|
|
158
165
|
child.on('close', (code, signal) => {
|
|
159
166
|
forwarder?.dispose();
|
|
160
167
|
const finish = () => {
|
|
168
|
+
closure.settle();
|
|
161
169
|
resolve(exitCodeFromClose(code, signal));
|
|
162
170
|
};
|
|
163
171
|
if (groupPid !== undefined) {
|
|
@@ -171,15 +179,33 @@ export async function execStream(command, args, options = {}) {
|
|
|
171
179
|
}
|
|
172
180
|
/**
|
|
173
181
|
* Close-promises of children whose shutdown the CLI must wait for when a
|
|
174
|
-
* termination signal arrives.
|
|
175
|
-
* within a microtask of the first Ctrl+C
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
182
|
+
* termination signal arrives. A bin signal handler that calls `process.exit`
|
|
183
|
+
* within a microtask of the first Ctrl+C makes `execInherit`'s documented
|
|
184
|
+
* SIGTERM → grace → SIGKILL escalation unreachable: the parent is gone
|
|
185
|
+
* before the 1500 ms grace timer can fire, so a hung Firefox is orphaned
|
|
186
|
+
* forever instead of being SIGKILLed and a healthy one loses its
|
|
187
|
+
* AsyncShutdown flush window.
|
|
180
188
|
*/
|
|
181
189
|
const activeChildClosures = new Set();
|
|
182
|
-
|
|
190
|
+
/**
|
|
191
|
+
* Registers a child with {@link waitForActiveChildShutdown}.
|
|
192
|
+
*
|
|
193
|
+
* Exported for the one legitimate spawn outside this module:
|
|
194
|
+
* `core/marionette-preflight.ts` keeps its own `spawn` because it needs the
|
|
195
|
+
* live `ChildProcess` mid-run, returns while the child is still running, and
|
|
196
|
+
* aborts on a TCP byte rather than a deadline — none of which any wrapper
|
|
197
|
+
* here can express. It still needs the shutdown contract, and a second
|
|
198
|
+
* hand-rolled copy is what lets a Ctrl+C orphan the whole mach → Firefox
|
|
199
|
+
* tree.
|
|
200
|
+
*/
|
|
201
|
+
/**
|
|
202
|
+
* Registers a child whose shutdown {@link waitForActiveChildShutdown} must
|
|
203
|
+
* wait for, and returns the handle that deregisters it.
|
|
204
|
+
*
|
|
205
|
+
* @returns `settle()` — call from both the child's `close` and `error`
|
|
206
|
+
* handlers so a dead child never holds the shutdown wait open
|
|
207
|
+
*/
|
|
208
|
+
export function trackChildClosure() {
|
|
183
209
|
let resolveClosed;
|
|
184
210
|
const closed = new Promise((resolve) => {
|
|
185
211
|
resolveClosed = resolve;
|
|
@@ -274,7 +300,7 @@ export async function execInherit(command, args, options = {}) {
|
|
|
274
300
|
* `close` and `error` handlers so the process does not accumulate signal
|
|
275
301
|
* listeners across repeated spawns.
|
|
276
302
|
*/
|
|
277
|
-
function installGracefulShutdownForwarder(child, graceMs, killTarget) {
|
|
303
|
+
export function installGracefulShutdownForwarder(child, graceMs, killTarget) {
|
|
278
304
|
let graceTimer;
|
|
279
305
|
const forwarded = new Set();
|
|
280
306
|
const sendKill = (signal) => {
|
|
@@ -508,6 +534,8 @@ export async function execSmokeRun(command, args, options) {
|
|
|
508
534
|
stdout: out.getText(),
|
|
509
535
|
stderr: err.getText(),
|
|
510
536
|
exitCode: exitCodeFromClose(code, signal),
|
|
537
|
+
stdoutTruncated: out.wasTruncated(),
|
|
538
|
+
stderrTruncated: err.wasTruncated(),
|
|
511
539
|
timedOut,
|
|
512
540
|
});
|
|
513
541
|
});
|
|
@@ -516,21 +544,20 @@ export async function execSmokeRun(command, args, options) {
|
|
|
516
544
|
/**
|
|
517
545
|
* Cap on the partial-line tail kept between chunks. A child emitting one
|
|
518
546
|
* enormous line with no terminator (minified JS dumped to stderr, a raw
|
|
519
|
-
* binary blob)
|
|
520
|
-
*
|
|
521
|
-
*
|
|
522
|
-
*
|
|
547
|
+
* binary blob) would otherwise grow the buffer without bound — the 50 MB cap
|
|
548
|
+
* guards the collector, not these line buffers. When the tail exceeds the
|
|
549
|
+
* cap it is dispatched as a synthetic (oversized) line so the matchers still
|
|
550
|
+
* see its content, then the buffer resets.
|
|
523
551
|
*/
|
|
524
552
|
const MAX_PARTIAL_LINE_SIZE = 1024 * 1024;
|
|
525
553
|
/**
|
|
526
554
|
* Drains complete lines from `buffer`, dispatching each to `cb`. Treats
|
|
527
555
|
* `\n`, `\r\n`, and lone `\r` as line terminators — the lone-`\r` case
|
|
528
556
|
* matters for progress-bar style output (mach, cargo) that repaints a line
|
|
529
|
-
* with carriage returns and never sends a newline
|
|
530
|
-
*
|
|
531
|
-
*
|
|
532
|
-
*
|
|
533
|
-
* into it.
|
|
557
|
+
* with carriage returns and never sends a newline, which otherwise
|
|
558
|
+
* accumulates indefinitely. A single trailing `\r` is held back since it may
|
|
559
|
+
* be the first half of a `\r\n` pair split across chunks. Returns the
|
|
560
|
+
* remaining partial line — callers keep accumulating into it.
|
|
534
561
|
*/
|
|
535
562
|
function dispatchCompleteLines(buffer, cb) {
|
|
536
563
|
let searchFrom = 0;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for the duration fields `ps` prints.
|
|
3
|
+
*
|
|
4
|
+
* Two different columns share one grammar, which is why this lives apart
|
|
5
|
+
* from either consumer: `time=` (accumulated CPU) and `etime=` (elapsed
|
|
6
|
+
* wall clock). Reading them with one parser is deliberate — a second
|
|
7
|
+
* hand-rolled copy is how the two would drift, and the darwin dialect is
|
|
8
|
+
* the half that is easy to get wrong.
|
|
9
|
+
*
|
|
10
|
+
* Dialects:
|
|
11
|
+
* - linux `[dd-]hh:mm:ss` (e.g. `26-03:14:12`, `03:14:12`)
|
|
12
|
+
* - darwin/BSD `mm:ss.cc`, whose minutes field accumulates without
|
|
13
|
+
* wrapping (e.g. `38412:07.55`)
|
|
14
|
+
*
|
|
15
|
+
* Returns `NaN` for anything else, so callers must treat an unrecognized
|
|
16
|
+
* shape as "unknown" rather than as zero — a browser reported as 0 seconds
|
|
17
|
+
* old would be exactly the wrong attribution.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Parses a `ps` duration field into whole seconds.
|
|
21
|
+
*
|
|
22
|
+
* @param value - Raw field text, e.g. `03:14:12` or `38412:07.55`
|
|
23
|
+
* @returns Seconds, or `NaN` when the shape is not recognized
|
|
24
|
+
*/
|
|
25
|
+
export declare function parsePsDuration(value: string): number;
|
|
26
|
+
/**
|
|
27
|
+
* Renders a duration for an operator-facing line: `4s`, `3m12s`, `2h05m`.
|
|
28
|
+
* Returns `undefined` for `NaN`, so a caller can omit the clause entirely
|
|
29
|
+
* rather than print "unknown" noise.
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatPsDuration(seconds: number): string | undefined;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* Parser for the duration fields `ps` prints.
|
|
4
|
+
*
|
|
5
|
+
* Two different columns share one grammar, which is why this lives apart
|
|
6
|
+
* from either consumer: `time=` (accumulated CPU) and `etime=` (elapsed
|
|
7
|
+
* wall clock). Reading them with one parser is deliberate — a second
|
|
8
|
+
* hand-rolled copy is how the two would drift, and the darwin dialect is
|
|
9
|
+
* the half that is easy to get wrong.
|
|
10
|
+
*
|
|
11
|
+
* Dialects:
|
|
12
|
+
* - linux `[dd-]hh:mm:ss` (e.g. `26-03:14:12`, `03:14:12`)
|
|
13
|
+
* - darwin/BSD `mm:ss.cc`, whose minutes field accumulates without
|
|
14
|
+
* wrapping (e.g. `38412:07.55`)
|
|
15
|
+
*
|
|
16
|
+
* Returns `NaN` for anything else, so callers must treat an unrecognized
|
|
17
|
+
* shape as "unknown" rather than as zero — a browser reported as 0 seconds
|
|
18
|
+
* old would be exactly the wrong attribution.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Parses a `ps` duration field into whole seconds.
|
|
22
|
+
*
|
|
23
|
+
* @param value - Raw field text, e.g. `03:14:12` or `38412:07.55`
|
|
24
|
+
* @returns Seconds, or `NaN` when the shape is not recognized
|
|
25
|
+
*/
|
|
26
|
+
export function parsePsDuration(value) {
|
|
27
|
+
const trimmed = value.trim();
|
|
28
|
+
let days = 0;
|
|
29
|
+
let rest = trimmed;
|
|
30
|
+
const dayMatch = /^(\d+)-(.*)$/.exec(trimmed);
|
|
31
|
+
if (dayMatch) {
|
|
32
|
+
days = Number(dayMatch[1]);
|
|
33
|
+
rest = dayMatch[2] ?? '';
|
|
34
|
+
}
|
|
35
|
+
const parts = rest.split(':');
|
|
36
|
+
if (parts.length === 3) {
|
|
37
|
+
// hh:mm:ss (linux; seconds may not carry fractions but tolerate them)
|
|
38
|
+
const [h, m, s] = parts.map(Number);
|
|
39
|
+
if ([h, m, s].some((n) => Number.isNaN(n)))
|
|
40
|
+
return NaN;
|
|
41
|
+
return days * 86400 + (h ?? 0) * 3600 + (m ?? 0) * 60 + (s ?? 0);
|
|
42
|
+
}
|
|
43
|
+
if (parts.length === 2) {
|
|
44
|
+
// mm:ss.cc (darwin — the minutes field accumulates without wrapping)
|
|
45
|
+
const [m, s] = parts.map(Number);
|
|
46
|
+
if ([m, s].some((n) => Number.isNaN(n)))
|
|
47
|
+
return NaN;
|
|
48
|
+
return days * 86400 + (m ?? 0) * 60 + (s ?? 0);
|
|
49
|
+
}
|
|
50
|
+
return NaN;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Renders a duration for an operator-facing line: `4s`, `3m12s`, `2h05m`.
|
|
54
|
+
* Returns `undefined` for `NaN`, so a caller can omit the clause entirely
|
|
55
|
+
* rather than print "unknown" noise.
|
|
56
|
+
*/
|
|
57
|
+
export function formatPsDuration(seconds) {
|
|
58
|
+
if (Number.isNaN(seconds) || seconds < 0)
|
|
59
|
+
return undefined;
|
|
60
|
+
if (seconds < 60)
|
|
61
|
+
return `${String(Math.floor(seconds))}s`;
|
|
62
|
+
if (seconds < 3600) {
|
|
63
|
+
const m = Math.floor(seconds / 60);
|
|
64
|
+
const s = Math.floor(seconds % 60);
|
|
65
|
+
return `${String(m)}m${String(s).padStart(2, '0')}s`;
|
|
66
|
+
}
|
|
67
|
+
const h = Math.floor(seconds / 3600);
|
|
68
|
+
const m = Math.floor((seconds % 3600) / 60);
|
|
69
|
+
return `${String(h)}h${String(m).padStart(2, '0')}m`;
|
|
70
|
+
}
|
|
@@ -9,17 +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 AND line numbers are preserved. String literals
|
|
13
|
-
*
|
|
12
|
+
* both character offsets AND line numbers are preserved. String literals are
|
|
13
|
+
* preserved intact.
|
|
14
14
|
*
|
|
15
|
-
* Uses acorn's tokenizer, which understands regex literals —
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* strings but NOT regex literals (documented limitation of the fallback).
|
|
15
|
+
* Uses acorn's tokenizer, which understands regex literals — a pure-regex
|
|
16
|
+
* implementation does not model them, so two adjacent slashes inside a regex
|
|
17
|
+
* (the tail of `/https?:\/\//`) read as a `//` line comment and the rest of
|
|
18
|
+
* the line is blanked, corrupting whatever lint pass consumes the stripped
|
|
19
|
+
* text. Firefox chrome sources contain preprocessor directives (`#ifdef`)
|
|
20
|
+
* and other constructs acorn cannot tokenize; those fall back to the legacy
|
|
21
|
+
* regex strip, which handles strings but NOT regex literals.
|
|
23
22
|
*/
|
|
24
23
|
export declare function stripJsComments(source: string): string;
|
|
25
24
|
/**
|
package/dist/src/utils/regex.js
CHANGED
|
@@ -25,17 +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 AND line numbers are preserved. String literals
|
|
29
|
-
*
|
|
28
|
+
* both character offsets AND line numbers are preserved. String literals are
|
|
29
|
+
* preserved intact.
|
|
30
30
|
*
|
|
31
|
-
* Uses acorn's tokenizer, which understands regex literals —
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* strings but NOT regex literals (documented limitation of the fallback).
|
|
31
|
+
* Uses acorn's tokenizer, which understands regex literals — a pure-regex
|
|
32
|
+
* implementation does not model them, so two adjacent slashes inside a regex
|
|
33
|
+
* (the tail of `/https?:\/\//`) read as a `//` line comment and the rest of
|
|
34
|
+
* the line is blanked, corrupting whatever lint pass consumes the stripped
|
|
35
|
+
* text. Firefox chrome sources contain preprocessor directives (`#ifdef`)
|
|
36
|
+
* and other constructs acorn cannot tokenize; those fall back to the legacy
|
|
37
|
+
* regex strip, which handles strings but NOT regex literals.
|
|
39
38
|
*/
|
|
40
39
|
export function stripJsComments(source) {
|
|
41
40
|
const comments = [];
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { FirefoxProduct } from '../types/config.js';
|
|
2
1
|
import type { JsonObject, JsonValue } from '../types/json.js';
|
|
3
2
|
/**
|
|
4
3
|
* Checks whether a value is a string.
|
|
@@ -22,15 +21,15 @@ export declare function isPositiveInteger(value: unknown): value is number;
|
|
|
22
21
|
* Parses a CLI flag value as a positive integer. Throws
|
|
23
22
|
* {@link InvalidArgumentError} on NaN, non-integer, or non-positive input.
|
|
24
23
|
*
|
|
25
|
-
* Intended for use inside Commander `argParser` bodies where the raw
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
24
|
+
* Intended for use inside Commander `argParser` bodies where the raw input
|
|
25
|
+
* arrives as a string. The default pattern (`parseInt(v, 10)`) silently
|
|
26
|
+
* hands NaN to downstream planners, which then embed it into filenames and
|
|
27
|
+
* orders instead of failing fast.
|
|
29
28
|
*
|
|
30
29
|
* Rejects leading-zero forms ("01"), decimals ("1.5"), whitespace, and
|
|
31
|
-
* non-numeric garbage via a strict regex —
|
|
32
|
-
* representation so there is no ambiguity between what the user
|
|
33
|
-
* and what the value becomes on disk.
|
|
30
|
+
* non-numeric garbage via a strict regex — only the canonical
|
|
31
|
+
* representation is accepted, so there is no ambiguity between what the user
|
|
32
|
+
* typed and what the value becomes on disk.
|
|
34
33
|
*
|
|
35
34
|
* @param flagName - Flag name to include in the error (e.g. `--order`)
|
|
36
35
|
* @param rawValue - Raw string value from Commander
|
|
@@ -75,30 +74,61 @@ export declare function isValidFirefoxVersion(version: string): boolean;
|
|
|
75
74
|
*/
|
|
76
75
|
export declare function isValidFirefoxCandidate(candidate: string): boolean;
|
|
77
76
|
/**
|
|
78
|
-
*
|
|
77
|
+
* Naming contract for this module's checks.
|
|
78
|
+
*
|
|
79
|
+
* `validate*` is easy to spread across incompatible return contracts — some
|
|
80
|
+
* throwing and returning void, some returning an issue list, some a parsed
|
|
81
|
+
* value, some a boolean, some an error MESSAGE — and a caller cannot tell
|
|
82
|
+
* which from the name. Passing a THROWING `validate*` to a clack `validate`
|
|
83
|
+
* callback, which expects a returned message, kills the prompt instead of
|
|
84
|
+
* re-prompting.
|
|
85
|
+
*
|
|
86
|
+
* The two dominant contracts keep the prefix:
|
|
87
|
+
* - `validate*` — throws on failure, or returns an issue list.
|
|
88
|
+
* - `is*` / `has*` — a type predicate or boolean.
|
|
89
|
+
* The message-returning minority is `describe*Problem`, which reads as what
|
|
90
|
+
* it is: a description of what is wrong, or `undefined`.
|
|
79
91
|
*
|
|
80
|
-
* `
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
*
|
|
84
|
-
* direction is covered by the exhaustive switch in
|
|
85
|
-
* `utils/__tests__/validation.test.ts`, which fails to compile when the union
|
|
86
|
-
* grows.
|
|
92
|
+
* `assert*` is uniform throughout: throw-or-continue.
|
|
93
|
+
*/
|
|
94
|
+
/**
|
|
95
|
+
* Valid Firefox product identifiers.
|
|
87
96
|
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
97
|
+
* `satisfies readonly FirefoxProduct[]` links the runtime list to the union
|
|
98
|
+
* in ONE direction: it rejects an entry here that the union does not
|
|
99
|
+
* declare. It cannot see a union member missing from this list — widening a
|
|
100
|
+
* `readonly T[]` check never fails for being short. The reverse direction is
|
|
101
|
+
* covered by the exhaustive switch in `utils/__tests__/validation.test.ts`,
|
|
102
|
+
* which fails to compile when the union grows.
|
|
91
103
|
*/
|
|
92
104
|
export declare const FIREFOX_PRODUCTS: readonly ["firefox", "firefox-esr", "firefox-beta", "firefox-devedition"];
|
|
93
105
|
/**
|
|
94
106
|
* Validates a Firefox product string.
|
|
95
107
|
*
|
|
96
108
|
* A type predicate, matching its siblings {@link isValidPatchCategory} and
|
|
97
|
-
* {@link isValidProjectLicense}.
|
|
98
|
-
*
|
|
99
|
-
*
|
|
109
|
+
* {@link isValidProjectLicense}. Returning plain `boolean` would force
|
|
110
|
+
* `as FirefoxProduct` casts at the call sites even though the `.includes`
|
|
111
|
+
* check IS the runtime proof.
|
|
112
|
+
*/
|
|
113
|
+
export declare const isValidFirefoxProduct: (value: string) => value is "firefox" | "firefox-esr" | "firefox-beta" | "firefox-devedition";
|
|
114
|
+
/**
|
|
115
|
+
* Builds a type predicate from a `readonly` tuple of allowed values.
|
|
116
|
+
*
|
|
117
|
+
* Deriving the type from the list — rather than declaring a union and
|
|
118
|
+
* hand-maintaining a matching array — removes a whole class of drift: a
|
|
119
|
+
* union can otherwise accept a stale allowlist with no compile error, and a
|
|
120
|
+
* copy of the member list on the `fireforge.json` read path can silently
|
|
121
|
+
* reject a newly added value.
|
|
122
|
+
*
|
|
123
|
+
* Returning a predicate rather than a boolean is what removes the `as`
|
|
124
|
+
* casts: `.includes` IS the runtime proof, so the caller should not have to
|
|
125
|
+
* re-assert it. `ParsedRecord.stringEnum` (src/utils/parse.ts) consumes
|
|
126
|
+
* exactly this shape.
|
|
127
|
+
*
|
|
128
|
+
* @param values - The allowed values, as a `readonly` tuple
|
|
129
|
+
* @returns A type predicate narrowing a string to one of `values`
|
|
100
130
|
*/
|
|
101
|
-
export declare function
|
|
131
|
+
export declare function makeEnumGuard<const T extends readonly string[]>(values: T): (value: string) => value is T[number];
|
|
102
132
|
/**
|
|
103
133
|
* Valid project license SPDX identifiers.
|
|
104
134
|
*/
|
|
@@ -106,7 +136,7 @@ export declare const PROJECT_LICENSES: readonly ["EUPL-1.2", "MPL-2.0", "0BSD",
|
|
|
106
136
|
/**
|
|
107
137
|
* Validates a project license string.
|
|
108
138
|
*/
|
|
109
|
-
export declare
|
|
139
|
+
export declare const isValidProjectLicense: (value: string) => value is "EUPL-1.2" | "MPL-2.0" | "0BSD" | "GPL-2.0-or-later";
|
|
110
140
|
/**
|
|
111
141
|
* Valid patch categories.
|
|
112
142
|
*/
|
|
@@ -114,7 +144,7 @@ export declare const PATCH_CATEGORIES: readonly ["branding", "ui", "privacy", "s
|
|
|
114
144
|
/**
|
|
115
145
|
* Validates a patch category string.
|
|
116
146
|
*/
|
|
117
|
-
export declare
|
|
147
|
+
export declare const isValidPatchCategory: (value: string) => value is "branding" | "ui" | "privacy" | "security" | "infra";
|
|
118
148
|
/**
|
|
119
149
|
* Infers the Firefox product type from a version string.
|
|
120
150
|
* Returns undefined if no clear inference can be made.
|
|
@@ -130,7 +160,7 @@ export declare function inferProductFromVersion(version: string): 'firefox' | 'f
|
|
|
130
160
|
*
|
|
131
161
|
* @returns An error message if incompatible, or undefined if valid.
|
|
132
162
|
*/
|
|
133
|
-
export declare function
|
|
163
|
+
export declare function describeProductVersionIncompatibility(version: string, product: string): string | undefined;
|
|
134
164
|
/**
|
|
135
165
|
* Validates an application ID string.
|
|
136
166
|
* Accepts reverse-domain format like "org.example.browser"
|
|
@@ -151,7 +181,7 @@ export declare function isDefined<T>(value: T | undefined | null): value is T;
|
|
|
151
181
|
*
|
|
152
182
|
* @returns An error message if invalid, or undefined if valid.
|
|
153
183
|
*/
|
|
154
|
-
export declare function
|
|
184
|
+
export declare function describeTokenNameProblem(name: string): string | undefined;
|
|
155
185
|
/**
|
|
156
186
|
* Normalizes a CSS custom property token name.
|
|
157
187
|
* Strips leading `--` if present, then always prepends `--`.
|
|
@@ -175,4 +205,4 @@ export declare function normalizePatchDisplayName(name: string, category: string
|
|
|
175
205
|
* @param name - The patch name to validate
|
|
176
206
|
* @returns Error message if invalid, undefined if valid
|
|
177
207
|
*/
|
|
178
|
-
export declare function
|
|
208
|
+
export declare function describePatchNameProblem(name: string): string | undefined;
|