@hominis/fireforge 0.43.1 → 0.44.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 +153 -0
- package/README.md +3 -3
- 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 +13 -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-patch-manifest.d.ts +8 -0
- package/dist/src/commands/doctor-patch-manifest.js +155 -0
- 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.d.ts +1 -1
- package/dist/src/commands/doctor.js +64 -96
- 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 +15 -10
- 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 +14 -17
- 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 +48 -37
- 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 +39 -36
- 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 +17 -27
- package/dist/src/core/build-prepare.d.ts +2 -2
- package/dist/src/core/build-prepare.js +8 -9
- package/dist/src/core/config-mutate.js +20 -19
- 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 +16 -13
- package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
- package/dist/src/core/furnace-apply-helpers.js +30 -21
- 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 +21 -9
- package/dist/src/core/git-base.js +24 -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 +57 -71
- 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 +41 -20
- 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 +57 -6
- package/dist/src/core/patch-manifest-consistency.js +111 -40
- package/dist/src/core/patch-manifest-files-affected.d.ts +43 -0
- package/dist/src/core/patch-manifest-files-affected.js +77 -0
- 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-manifest.d.ts +2 -1
- package/dist/src/core/patch-manifest.js +2 -1
- 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 +66 -14
- 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 +29 -13
- package/dist/src/core/token-docs.d.ts +2 -0
- package/dist/src/core/token-docs.js +3 -1
- 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 +28 -6
- 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 +68 -43
- 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 +15 -9
- 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 +111 -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 +3 -3
- 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
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pure parsing functions for extracting information from patch files.
|
|
3
|
-
*
|
|
2
|
+
* Pure parsing functions for extracting information from patch files. All
|
|
3
|
+
* functions are synchronous and operate on string content.
|
|
4
4
|
*
|
|
5
|
-
* This module is the ONE unified-diff walker in the codebase.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* mis-split any path containing ` b/`. New diff-shaped parsing must build
|
|
12
|
-
* on {@link parseDiffSections} rather than re-walking lines.
|
|
5
|
+
* This module is the ONE unified-diff walker in the codebase. Hand-rolled
|
|
6
|
+
* `diff --git` walkers diverge in ways that matter: CRLF handling (a
|
|
7
|
+
* CRLF-saved patch file silently fails target-file matching and
|
|
8
|
+
* `\ No newline` detection on Windows), quoted-path support, and greedy path
|
|
9
|
+
* captures that mis-split any path containing ` b/`. New diff-shaped parsing
|
|
10
|
+
* must build on {@link parseDiffSections} rather than re-walking lines.
|
|
13
11
|
*/
|
|
14
12
|
/**
|
|
15
13
|
* Extracts the order number from a patch filename.
|
|
@@ -53,9 +51,9 @@ export interface DiffGitHeader {
|
|
|
53
51
|
* (`diff --git "a/x y" "b/x y"`), and disambiguates the unquoted form for
|
|
54
52
|
* paths that themselves contain ` b/`: for the overwhelmingly common
|
|
55
53
|
* non-rename case the two paths are identical, so a symmetric split
|
|
56
|
-
* (`a/<p> b/<p>`) is tried first —
|
|
57
|
-
*
|
|
58
|
-
*
|
|
54
|
+
* (`a/<p> b/<p>`) is tried first — a greedy `a\/.+ b\/(.+)$` splits such
|
|
55
|
+
* lines at the LAST ` b/` and returns a truncated path. Falls back to a
|
|
56
|
+
* non-greedy split for renames.
|
|
59
57
|
*
|
|
60
58
|
* @returns null when the line is not a diff --git header.
|
|
61
59
|
*/
|
|
@@ -78,6 +76,19 @@ export interface DiffSection {
|
|
|
78
76
|
* refuse them rather than treat base85 lines starting with `+` as content.
|
|
79
77
|
*/
|
|
80
78
|
isBinary: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* True ONLY for `GIT binary patch` sections — the body carries a
|
|
81
|
+
* reconstructable literal/delta payload. False for `Binary files … differ`,
|
|
82
|
+
* which records THAT the bytes changed but carries none of them and cannot
|
|
83
|
+
* be replayed by `git apply`.
|
|
84
|
+
*
|
|
85
|
+
* The distinction is not cosmetic: the stub form still carries a correct
|
|
86
|
+
* `index <old>..<new>` line, so identity checks keyed on {@link indexNewHash}
|
|
87
|
+
* alone happily conclude "the recorded bytes match the live file" for a body
|
|
88
|
+
* that can no longer produce those bytes. Consumers deciding whether a patch
|
|
89
|
+
* can RECREATE a file must read this flag, never `isBinary` plus a hash.
|
|
90
|
+
*/
|
|
91
|
+
hasBinaryDelta: boolean;
|
|
81
92
|
/**
|
|
82
93
|
* Old-side blob hash from the section's `index <old>..<new>` line
|
|
83
94
|
* (possibly abbreviated). Undefined when the metadata zone carries no
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
import { assert } from '../utils/assert.js';
|
|
3
3
|
/**
|
|
4
|
-
* Pure parsing functions for extracting information from patch files.
|
|
5
|
-
*
|
|
4
|
+
* Pure parsing functions for extracting information from patch files. All
|
|
5
|
+
* functions are synchronous and operate on string content.
|
|
6
6
|
*
|
|
7
|
-
* This module is the ONE unified-diff walker in the codebase.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* mis-split any path containing ` b/`. New diff-shaped parsing must build
|
|
14
|
-
* on {@link parseDiffSections} rather than re-walking lines.
|
|
7
|
+
* This module is the ONE unified-diff walker in the codebase. Hand-rolled
|
|
8
|
+
* `diff --git` walkers diverge in ways that matter: CRLF handling (a
|
|
9
|
+
* CRLF-saved patch file silently fails target-file matching and
|
|
10
|
+
* `\ No newline` detection on Windows), quoted-path support, and greedy path
|
|
11
|
+
* captures that mis-split any path containing ` b/`. New diff-shaped parsing
|
|
12
|
+
* must build on {@link parseDiffSections} rather than re-walking lines.
|
|
15
13
|
*/
|
|
16
14
|
/**
|
|
17
15
|
* Extracts the order number from a patch filename.
|
|
@@ -89,9 +87,9 @@ function unquoteGitPath(quoted) {
|
|
|
89
87
|
* (`diff --git "a/x y" "b/x y"`), and disambiguates the unquoted form for
|
|
90
88
|
* paths that themselves contain ` b/`: for the overwhelmingly common
|
|
91
89
|
* non-rename case the two paths are identical, so a symmetric split
|
|
92
|
-
* (`a/<p> b/<p>`) is tried first —
|
|
93
|
-
*
|
|
94
|
-
*
|
|
90
|
+
* (`a/<p> b/<p>`) is tried first — a greedy `a\/.+ b\/(.+)$` splits such
|
|
91
|
+
* lines at the LAST ` b/` and returns a truncated path. Falls back to a
|
|
92
|
+
* non-greedy split for renames.
|
|
95
93
|
*
|
|
96
94
|
* @returns null when the line is not a diff --git header.
|
|
97
95
|
*/
|
|
@@ -171,6 +169,7 @@ export function parseDiffSections(diffContent) {
|
|
|
171
169
|
isNewFile: false,
|
|
172
170
|
isDeletedFile: false,
|
|
173
171
|
isBinary: false,
|
|
172
|
+
hasBinaryDelta: false,
|
|
174
173
|
hunks: [],
|
|
175
174
|
};
|
|
176
175
|
sections.push(current);
|
|
@@ -188,7 +187,13 @@ export function parseDiffSections(diffContent) {
|
|
|
188
187
|
current.isDeletedFile = true;
|
|
189
188
|
continue;
|
|
190
189
|
}
|
|
191
|
-
if (line === 'GIT binary patch'
|
|
190
|
+
if (line === 'GIT binary patch') {
|
|
191
|
+
current.isBinary = true;
|
|
192
|
+
current.hasBinaryDelta = true;
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (/^Binary files .* differ$/.test(line)) {
|
|
196
|
+
// Informational form: binary, but with no payload to apply.
|
|
192
197
|
current.isBinary = true;
|
|
193
198
|
continue;
|
|
194
199
|
}
|
|
@@ -43,8 +43,8 @@ export declare function isCategoryAllowedByConfig(config: FireForgeConfig, categ
|
|
|
43
43
|
export declare function categoryRangeLabel(ranges: readonly PatchPolicyRange[], category: string): string;
|
|
44
44
|
/**
|
|
45
45
|
* Returns the configured range that contains `order` for `category`, or
|
|
46
|
-
* null when no such range exists. Exported for the forward-import hint
|
|
47
|
-
|
|
46
|
+
* null when no such range exists. Exported for the forward-import hint,
|
|
47
|
+
* which suppresses ordinal suggestions the reorder policy
|
|
48
48
|
* would refuse.
|
|
49
49
|
*/
|
|
50
50
|
export declare function categoryRangeForOrder(cfg: PatchPolicyConfig, category: string, order: number): PatchPolicyRange | null;
|
|
@@ -61,8 +61,8 @@ function reservedRangeForOrder(cfg, order) {
|
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
63
|
* Returns the configured range that contains `order` for `category`, or
|
|
64
|
-
* null when no such range exists. Exported for the forward-import hint
|
|
65
|
-
|
|
64
|
+
* null when no such range exists. Exported for the forward-import hint,
|
|
65
|
+
* which suppresses ordinal suggestions the reorder policy
|
|
66
66
|
* would refuse.
|
|
67
67
|
*/
|
|
68
68
|
export function categoryRangeForOrder(cfg, category, order) {
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Extracts furnace-shaped registration references from a patch body.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `toolkit/content/
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* the broken queue. This module provides a pattern-scoped scan so
|
|
4
|
+
* `export-all --exclude-furnace` can land a patch that registers a furnace
|
|
5
|
+
* component (via edits to `toolkit/content/customElements.js`,
|
|
6
|
+
* `toolkit/content/jar.mn`, or `toolkit/locales/jar.mn`) without including
|
|
7
|
+
* the component's source files, and `fireforge verify` then reports "Verify
|
|
8
|
+
* clean" for the broken queue. This module provides a pattern-scoped scan so
|
|
10
9
|
* `verify` can cross-check registrations against available file bodies.
|
|
11
10
|
*
|
|
12
11
|
* The scan is deliberately narrow: it only matches component-shaped
|
|
13
|
-
* references (widget tag names, locale fluent names). Unrelated jar.mn
|
|
14
|
-
*
|
|
12
|
+
* references (widget tag names, locale fluent names). Unrelated jar.mn or
|
|
13
|
+
* customElements.js edits pass through without spurious warnings.
|
|
15
14
|
*/
|
|
16
15
|
/**
|
|
17
16
|
* A referenced engine path extracted from a registration hunk, together
|
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Extracts furnace-shaped registration references from a patch body.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `toolkit/content/
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* the broken queue. This module provides a pattern-scoped scan so
|
|
5
|
+
* `export-all --exclude-furnace` can land a patch that registers a furnace
|
|
6
|
+
* component (via edits to `toolkit/content/customElements.js`,
|
|
7
|
+
* `toolkit/content/jar.mn`, or `toolkit/locales/jar.mn`) without including
|
|
8
|
+
* the component's source files, and `fireforge verify` then reports "Verify
|
|
9
|
+
* clean" for the broken queue. This module provides a pattern-scoped scan so
|
|
11
10
|
* `verify` can cross-check registrations against available file bodies.
|
|
12
11
|
*
|
|
13
12
|
* The scan is deliberately narrow: it only matches component-shaped
|
|
14
|
-
* references (widget tag names, locale fluent names). Unrelated jar.mn
|
|
15
|
-
*
|
|
13
|
+
* references (widget tag names, locale fluent names). Unrelated jar.mn or
|
|
14
|
+
* customElements.js edits pass through without spurious warnings.
|
|
16
15
|
*/
|
|
16
|
+
import { WIDGETS_DIR } from './furnace-constants.js';
|
|
17
17
|
import { parseDiffSections } from './patch-parse.js';
|
|
18
18
|
/** Canonical file paths that registration-shaped diffs touch. */
|
|
19
19
|
const REGISTRATION_FILE_PATHS = new Set([
|
|
@@ -99,7 +99,7 @@ function extractTargetPathsFromRegistrationLine(sourceFile, added) {
|
|
|
99
99
|
if (elementMatch?.[1] && elementMatch[2]) {
|
|
100
100
|
const tag = elementMatch[1];
|
|
101
101
|
const fileStem = elementMatch[2];
|
|
102
|
-
return [
|
|
102
|
+
return [`${WIDGETS_DIR}/${tag}/${fileStem}.mjs`];
|
|
103
103
|
}
|
|
104
104
|
return [];
|
|
105
105
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads a process's accumulated CPU seconds.
|
|
3
|
+
*
|
|
4
|
+
* Best-effort: a missing `ps`, an exited process, or an unparseable field
|
|
5
|
+
* yields `undefined`, which callers must render as "unknown" rather than as
|
|
6
|
+
* zero — reporting a live build as having used no CPU would invert the very
|
|
7
|
+
* diagnosis this exists for.
|
|
8
|
+
*
|
|
9
|
+
* @param pid - Process to inspect
|
|
10
|
+
* @returns Accumulated CPU seconds, or `undefined` when unmeasurable
|
|
11
|
+
*/
|
|
12
|
+
export declare function readProcessCpuSeconds(pid: number): Promise<number | undefined>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* Accumulated-CPU-time probe for a single PID.
|
|
4
|
+
*
|
|
5
|
+
* Exists to answer the one question `kill(pid, 0)` cannot: a lock holder
|
|
6
|
+
* that EXISTS may still be wedged. A downstream fork running five concurrent
|
|
7
|
+
* sessions on one checkout diagnosed exactly this by hand — "a holder at
|
|
8
|
+
* near-zero CPU is hung, not working" — after a queue stalled behind a
|
|
9
|
+
* command that had consumed 0.3 s of CPU in eleven minutes.
|
|
10
|
+
*
|
|
11
|
+
* It is reported as EVIDENCE, never as a verdict. A legitimately slow holder
|
|
12
|
+
* can also sit at low CPU while blocked on I/O or on a child process, so
|
|
13
|
+
* nothing keys a refusal, a kill, or a lock steal off this number.
|
|
14
|
+
*/
|
|
15
|
+
import { exec } from '../utils/process.js';
|
|
16
|
+
import { parsePsDuration } from '../utils/ps-duration.js';
|
|
17
|
+
/**
|
|
18
|
+
* Reads a process's accumulated CPU seconds.
|
|
19
|
+
*
|
|
20
|
+
* Best-effort: a missing `ps`, an exited process, or an unparseable field
|
|
21
|
+
* yields `undefined`, which callers must render as "unknown" rather than as
|
|
22
|
+
* zero — reporting a live build as having used no CPU would invert the very
|
|
23
|
+
* diagnosis this exists for.
|
|
24
|
+
*
|
|
25
|
+
* @param pid - Process to inspect
|
|
26
|
+
* @returns Accumulated CPU seconds, or `undefined` when unmeasurable
|
|
27
|
+
*/
|
|
28
|
+
export async function readProcessCpuSeconds(pid) {
|
|
29
|
+
if (!Number.isSafeInteger(pid) || pid <= 0)
|
|
30
|
+
return undefined;
|
|
31
|
+
try {
|
|
32
|
+
if (process.platform === 'win32') {
|
|
33
|
+
const result = await exec('powershell.exe', [
|
|
34
|
+
'-NoProfile',
|
|
35
|
+
'-NonInteractive',
|
|
36
|
+
'-Command',
|
|
37
|
+
`(Get-Process -Id ${String(pid)} -ErrorAction SilentlyContinue).CPU`,
|
|
38
|
+
]);
|
|
39
|
+
const seconds = Number.parseFloat(result.stdout.trim());
|
|
40
|
+
return Number.isFinite(seconds) ? seconds : undefined;
|
|
41
|
+
}
|
|
42
|
+
const result = await exec('ps', ['-p', String(pid), '-o', 'time=']);
|
|
43
|
+
const field = result.stdout.split(/\r?\n/).find((line) => line.trim().length > 0);
|
|
44
|
+
if (field === undefined)
|
|
45
|
+
return undefined;
|
|
46
|
+
const seconds = parsePsDuration(field);
|
|
47
|
+
return Number.isNaN(seconds) ? undefined : seconds;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -6,16 +6,34 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { FirefoxProduct } from '../types/config.js';
|
|
8
8
|
export type RebasePatchStatus = 'pending' | 'applied-clean' | 'applied-fuzz' | 'failed' | 'resolved' | 'skipped';
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* One patch's outcome in a rebase session.
|
|
11
|
+
*
|
|
12
|
+
* A discriminated union on `status`, so a payload can only be present on the
|
|
13
|
+
* status it belongs to. A flat-optionals shape makes
|
|
14
|
+
* `{ status: 'resolved', error, conflictingFiles }` representable, and
|
|
15
|
+
* `rebase --continue` will write it — flipping the status without clearing
|
|
16
|
+
* the failure payload, then persisting that to the session file.
|
|
17
|
+
*
|
|
18
|
+
* The on-disk validator (`isValidPatchEntry`) is deliberately NOT tightened
|
|
19
|
+
* to match. The session file carries no schema version, so a stricter
|
|
20
|
+
* validator would reject an older file mid-rebase, where the only remedies
|
|
21
|
+
* discard the operator's in-progress conflict resolution. Instead
|
|
22
|
+
* {@link normalizeEntry} drops payload that does not belong to the status on
|
|
23
|
+
* read, so an older file loads and is corrected rather than refused.
|
|
24
|
+
*/
|
|
25
|
+
export type RebasePatchEntry = {
|
|
10
26
|
filename: string;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
27
|
+
} & ({
|
|
28
|
+
status: 'pending' | 'applied-clean' | 'skipped' | 'resolved';
|
|
29
|
+
} | {
|
|
30
|
+
status: 'applied-fuzz';
|
|
31
|
+
fuzzFactor: number;
|
|
32
|
+
} | {
|
|
33
|
+
status: 'failed';
|
|
15
34
|
error?: string;
|
|
16
|
-
/** Files that caused conflicts. */
|
|
17
35
|
conflictingFiles?: string[];
|
|
18
|
-
}
|
|
36
|
+
});
|
|
19
37
|
export interface RebaseSession {
|
|
20
38
|
/** ISO timestamp when the rebase started. */
|
|
21
39
|
startedAt: string;
|
|
@@ -39,12 +57,11 @@ export interface RebaseSession {
|
|
|
39
57
|
* discriminated-union form rather than collapsing three states into `null`.
|
|
40
58
|
*
|
|
41
59
|
* Distinguishing `present: false` from `present: true, valid: false` is
|
|
42
|
-
* load-bearing.
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* "
|
|
46
|
-
*
|
|
47
|
-
* named it, so the only escape was knowing to `rm` it by hand.
|
|
60
|
+
* load-bearing. Collapsing both to `null` while reporting liveness from
|
|
61
|
+
* `pathExists` alone wedges the operator in a closed cycle: `rebase` says
|
|
62
|
+
* "already in progress — use --continue or --abort", and both of those say
|
|
63
|
+
* "no rebase session in progress", with no CLI path deleting the file and no
|
|
64
|
+
* message naming it.
|
|
48
65
|
*/
|
|
49
66
|
export type RebaseSessionRead = {
|
|
50
67
|
present: false;
|
|
@@ -62,14 +79,15 @@ export declare function getRebaseSessionPath(projectRoot: string): string;
|
|
|
62
79
|
/**
|
|
63
80
|
* Reads the session file, reporting absent, valid, and corrupt as three
|
|
64
81
|
* distinct outcomes. Never throws for a malformed file: `readJson` calls
|
|
65
|
-
* `JSON.parse` with no guard of its own, so an interrupted write
|
|
66
|
-
* raw `SyntaxError` out of `--continue`/`--abort
|
|
82
|
+
* `JSON.parse` with no guard of its own, so an interrupted write would
|
|
83
|
+
* otherwise surface a raw `SyntaxError` out of `--continue`/`--abort`.
|
|
67
84
|
*
|
|
68
85
|
* A single read determines liveness and validity: only ENOENT/ENOTDIR from
|
|
69
|
-
* that read mean `absent`. A pathExists pre-probe both
|
|
70
|
-
* removed between probe and read
|
|
71
|
-
* and
|
|
72
|
-
* absent) — the same failure `
|
|
86
|
+
* that read mean `absent`. A pathExists pre-probe both races deletion (a
|
|
87
|
+
* file removed between probe and read misreports an absent session as
|
|
88
|
+
* corrupt) and swallows EACCES (an unreadable `.fireforge/` misreports a
|
|
89
|
+
* session as absent) — the same failure `readTreeMarker` avoids for tree
|
|
90
|
+
* markers.
|
|
73
91
|
*/
|
|
74
92
|
export declare function readRebaseSession(projectRoot: string): Promise<RebaseSessionRead>;
|
|
75
93
|
/**
|
|
@@ -77,7 +95,7 @@ export declare function readRebaseSession(projectRoot: string): Promise<RebaseSe
|
|
|
77
95
|
* file on disk is unusable. Callers that must tell those two apart — every
|
|
78
96
|
* command that reports to an operator — should use {@link readRebaseSession}.
|
|
79
97
|
*/
|
|
80
|
-
export declare function
|
|
98
|
+
export declare function tryReadRebaseSession(projectRoot: string): Promise<RebaseSession | null>;
|
|
81
99
|
/**
|
|
82
100
|
* Persists a rebase session atomically.
|
|
83
101
|
*/
|
|
@@ -86,9 +104,3 @@ export declare function saveRebaseSession(projectRoot: string, session: RebaseSe
|
|
|
86
104
|
* Removes the rebase session file.
|
|
87
105
|
*/
|
|
88
106
|
export declare function clearRebaseSession(projectRoot: string): Promise<void>;
|
|
89
|
-
/**
|
|
90
|
-
* Returns `true` when a rebase session file exists on disk, valid or not.
|
|
91
|
-
* Test-facing convenience — production code reads `readRebaseSession` once
|
|
92
|
-
* instead, so liveness and validity come from the same read.
|
|
93
|
-
*/
|
|
94
|
-
export declare function hasActiveRebaseSession(projectRoot: string): Promise<boolean>;
|
|
@@ -25,6 +25,31 @@ const REBASE_PATCH_STATUSES = [
|
|
|
25
25
|
'skipped',
|
|
26
26
|
];
|
|
27
27
|
/** Validates one `patches[]` element to its declared shape. */
|
|
28
|
+
/**
|
|
29
|
+
* Drops payload that does not belong to an entry's status.
|
|
30
|
+
*
|
|
31
|
+
* Applied on read so a session written by an older FireForge — where
|
|
32
|
+
* `rebase --continue` left `error`/`conflictingFiles` on a now-`resolved`
|
|
33
|
+
* entry — loads cleanly and is corrected, instead of being refused by a
|
|
34
|
+
* stricter validator mid-rebase.
|
|
35
|
+
*
|
|
36
|
+
* @param entry - A structurally valid entry, possibly carrying stale payload
|
|
37
|
+
* @returns The entry with only the fields its status permits
|
|
38
|
+
*/
|
|
39
|
+
function normalizeEntry(entry) {
|
|
40
|
+
if (entry.status === 'applied-fuzz') {
|
|
41
|
+
return { filename: entry.filename, status: 'applied-fuzz', fuzzFactor: entry.fuzzFactor };
|
|
42
|
+
}
|
|
43
|
+
if (entry.status === 'failed') {
|
|
44
|
+
return {
|
|
45
|
+
filename: entry.filename,
|
|
46
|
+
status: 'failed',
|
|
47
|
+
...(entry.error !== undefined ? { error: entry.error } : {}),
|
|
48
|
+
...(entry.conflictingFiles !== undefined ? { conflictingFiles: entry.conflictingFiles } : {}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return { filename: entry.filename, status: entry.status };
|
|
52
|
+
}
|
|
28
53
|
function isValidPatchEntry(value) {
|
|
29
54
|
if (!isObject(value))
|
|
30
55
|
return false;
|
|
@@ -50,19 +75,19 @@ function isValidOptionalProduct(value) {
|
|
|
50
75
|
* Validates a session file against the shape the rebase commands actually
|
|
51
76
|
* consume — not merely against broad field types.
|
|
52
77
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* `typeof === 'number'`)
|
|
58
|
-
* success; a negative one
|
|
59
|
-
* ""`
|
|
60
|
-
* `baseVersion`. `fromProduct`/`toProduct`
|
|
61
|
-
* being typed `FirefoxProduct`.
|
|
78
|
+
* A looser predicate that checks six `typeof`s and nothing else admits
|
|
79
|
+
* sessions the resume path then acts on. `patches: [null]` reaches
|
|
80
|
+
* `patch-loop.ts`, which reads `.filename` off each entry and hands it to
|
|
81
|
+
* `stampPatchVersions`. A `currentIndex` of `NaN` (legal for
|
|
82
|
+
* `typeof === 'number'`) makes the resume loop run zero iterations and
|
|
83
|
+
* report success; a negative one indexes out of range in `continue.ts`.
|
|
84
|
+
* `toVersion: ""` passes `isString` and is stamped verbatim onto every
|
|
85
|
+
* Furnace override's `baseVersion`. `fromProduct`/`toProduct` go unchecked
|
|
86
|
+
* despite being typed `FirefoxProduct`.
|
|
62
87
|
*
|
|
63
|
-
* The session file is written only by `rebase/index.ts` from validated CLI
|
|
64
|
-
* config values, so every one of these is a corrupt-file or hand-edit
|
|
65
|
-
* which is exactly
|
|
88
|
+
* The session file is written only by `rebase/index.ts` from validated CLI
|
|
89
|
+
* and config values, so every one of these is a corrupt-file or hand-edit
|
|
90
|
+
* case — which is exactly what this predicate exists to catch.
|
|
66
91
|
*/
|
|
67
92
|
function isValidSession(data) {
|
|
68
93
|
if (!isObject(data))
|
|
@@ -98,14 +123,15 @@ export function getRebaseSessionPath(projectRoot) {
|
|
|
98
123
|
/**
|
|
99
124
|
* Reads the session file, reporting absent, valid, and corrupt as three
|
|
100
125
|
* distinct outcomes. Never throws for a malformed file: `readJson` calls
|
|
101
|
-
* `JSON.parse` with no guard of its own, so an interrupted write
|
|
102
|
-
* raw `SyntaxError` out of `--continue`/`--abort
|
|
126
|
+
* `JSON.parse` with no guard of its own, so an interrupted write would
|
|
127
|
+
* otherwise surface a raw `SyntaxError` out of `--continue`/`--abort`.
|
|
103
128
|
*
|
|
104
129
|
* A single read determines liveness and validity: only ENOENT/ENOTDIR from
|
|
105
|
-
* that read mean `absent`. A pathExists pre-probe both
|
|
106
|
-
* removed between probe and read
|
|
107
|
-
* and
|
|
108
|
-
* absent) — the same failure `
|
|
130
|
+
* that read mean `absent`. A pathExists pre-probe both races deletion (a
|
|
131
|
+
* file removed between probe and read misreports an absent session as
|
|
132
|
+
* corrupt) and swallows EACCES (an unreadable `.fireforge/` misreports a
|
|
133
|
+
* session as absent) — the same failure `readTreeMarker` avoids for tree
|
|
134
|
+
* markers.
|
|
109
135
|
*/
|
|
110
136
|
export async function readRebaseSession(projectRoot) {
|
|
111
137
|
const path = sessionPath(projectRoot);
|
|
@@ -122,14 +148,23 @@ export async function readRebaseSession(projectRoot) {
|
|
|
122
148
|
if (!isValidSession(data)) {
|
|
123
149
|
return { present: true, valid: false, reason: 'the file is not a valid rebase session' };
|
|
124
150
|
}
|
|
125
|
-
|
|
151
|
+
// Normalize on read: an older session can carry a failure's
|
|
152
|
+
// `error`/`conflictingFiles` on an entry whose status has since been
|
|
153
|
+
// flipped to `resolved`. Correcting it here is what lets the validator
|
|
154
|
+
// stay permissive, so an in-flight rebase from an older FireForge still
|
|
155
|
+
// loads.
|
|
156
|
+
return {
|
|
157
|
+
present: true,
|
|
158
|
+
valid: true,
|
|
159
|
+
session: { ...data, patches: data.patches.map(normalizeEntry) },
|
|
160
|
+
};
|
|
126
161
|
}
|
|
127
162
|
/**
|
|
128
163
|
* Loads an existing rebase session, or returns `null` when none exists or the
|
|
129
164
|
* file on disk is unusable. Callers that must tell those two apart — every
|
|
130
165
|
* command that reports to an operator — should use {@link readRebaseSession}.
|
|
131
166
|
*/
|
|
132
|
-
export async function
|
|
167
|
+
export async function tryReadRebaseSession(projectRoot) {
|
|
133
168
|
const result = await readRebaseSession(projectRoot);
|
|
134
169
|
return result.present && result.valid ? result.session : null;
|
|
135
170
|
}
|
|
@@ -151,11 +186,3 @@ export async function clearRebaseSession(projectRoot) {
|
|
|
151
186
|
await removeFile(path);
|
|
152
187
|
}
|
|
153
188
|
}
|
|
154
|
-
/**
|
|
155
|
-
* Returns `true` when a rebase session file exists on disk, valid or not.
|
|
156
|
-
* Test-facing convenience — production code reads `readRebaseSession` once
|
|
157
|
-
* instead, so liveness and validity come from the same read.
|
|
158
|
-
*/
|
|
159
|
-
export async function hasActiveRebaseSession(projectRoot) {
|
|
160
|
-
return pathExists(sessionPath(projectRoot));
|
|
161
|
-
}
|
|
@@ -5,83 +5,18 @@
|
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { GeneralError } from '../errors/base.js';
|
|
7
7
|
import { pathExists, readText, writeText } from '../utils/fs.js';
|
|
8
|
-
import {
|
|
9
|
-
import { findAlphabeticalPosition, findAlphabeticalTokenPosition } from './manifest-helpers.js';
|
|
10
|
-
import { tokenizeJarMn } from './manifest-tokenizers.js';
|
|
11
|
-
import { withParserFallback } from './parser-fallback.js';
|
|
8
|
+
import { insertJarMnEntry } from './moz-manifest-helpers.js';
|
|
12
9
|
/**
|
|
13
10
|
* Tokenizer-based implementation for browser content registration.
|
|
14
11
|
*/
|
|
15
12
|
function registerBrowserContentTokenized(content, fileName, entry, after) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const afterToken = tokens.find((t) => afterPattern.test(t.raw));
|
|
24
|
-
if (afterToken) {
|
|
25
|
-
insertIndex = afterToken.lineIndex + 1;
|
|
26
|
-
previousEntry = afterToken.raw.trim();
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
afterFallback = true;
|
|
30
|
-
({ insertIndex, previousEntry } = findAlphabeticalTokenPosition(tokens, /content\/browser\/([^\s]+)/, fileName));
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
({ insertIndex, previousEntry } = findAlphabeticalTokenPosition(tokens, /content\/browser\/([^\s]+)/, fileName));
|
|
35
|
-
}
|
|
36
|
-
if (insertIndex === -1) {
|
|
37
|
-
throw new GeneralError('Could not find content/browser/ section in browser/base/jar.mn');
|
|
38
|
-
}
|
|
39
|
-
lines.splice(insertIndex, 0, entry);
|
|
40
|
-
return { result: lines.join('\n'), previousEntry, afterFallback };
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Legacy line-based implementation preserved as fallback.
|
|
44
|
-
*/
|
|
45
|
-
function legacyRegisterBrowserContent(content, fileName, entry, after) {
|
|
46
|
-
const lines = content.split('\n');
|
|
47
|
-
let afterFallback = false;
|
|
48
|
-
const extractKey = (line) => {
|
|
49
|
-
const match = /content\/browser\/([^\s]+)/.exec(line);
|
|
50
|
-
return match?.[1];
|
|
51
|
-
};
|
|
52
|
-
let sectionStart = -1;
|
|
53
|
-
let sectionEnd = lines.length;
|
|
54
|
-
for (let i = 0; i < lines.length; i++) {
|
|
55
|
-
const line = lines[i];
|
|
56
|
-
if (line === undefined)
|
|
57
|
-
continue;
|
|
58
|
-
if (/^\s+content\/browser\//.test(line)) {
|
|
59
|
-
if (sectionStart === -1)
|
|
60
|
-
sectionStart = i;
|
|
61
|
-
sectionEnd = i + 1;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (sectionStart === -1) {
|
|
65
|
-
throw new GeneralError('Could not find content/browser/ section in browser/base/jar.mn');
|
|
66
|
-
}
|
|
67
|
-
let insertIndex;
|
|
68
|
-
let previousEntry;
|
|
69
|
-
if (after) {
|
|
70
|
-
const afterLineIdx = lines.findIndex((l) => l.includes(after));
|
|
71
|
-
if (afterLineIdx !== -1) {
|
|
72
|
-
insertIndex = afterLineIdx + 1;
|
|
73
|
-
previousEntry = lines[afterLineIdx]?.trim();
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
afterFallback = true;
|
|
77
|
-
({ insertIndex, previousEntry } = findAlphabeticalPosition(lines, sectionStart, sectionEnd, fileName, extractKey));
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
({ insertIndex, previousEntry } = findAlphabeticalPosition(lines, sectionStart, sectionEnd, fileName, extractKey));
|
|
82
|
-
}
|
|
83
|
-
lines.splice(insertIndex, 0, entry);
|
|
84
|
-
return { result: lines.join('\n'), previousEntry, afterFallback };
|
|
13
|
+
const { result, previousEntry, afterFallback } = insertJarMnEntry(content, entry, {
|
|
14
|
+
sortPattern: /content\/browser\/([^\s]+)/,
|
|
15
|
+
sortKey: fileName,
|
|
16
|
+
missingSectionMessage: 'Could not find content/browser/ section in browser/base/jar.mn',
|
|
17
|
+
after,
|
|
18
|
+
});
|
|
19
|
+
return { result, previousEntry, afterFallback };
|
|
85
20
|
}
|
|
86
21
|
/**
|
|
87
22
|
* Registers a JS/content file in browser/base/jar.mn.
|
|
@@ -102,7 +37,7 @@ export async function registerBrowserContent(engineDir, fileName, after, sourceP
|
|
|
102
37
|
if (content.includes(`content/browser/${fileName}`)) {
|
|
103
38
|
return { manifest, entry, skipped: true };
|
|
104
39
|
}
|
|
105
|
-
const
|
|
40
|
+
const value = registerBrowserContentTokenized(content, fileName, entry, after);
|
|
106
41
|
if (!dryRun) {
|
|
107
42
|
await writeText(manifestPath, value.result);
|
|
108
43
|
}
|