@hominis/fireforge 0.44.4 → 0.46.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 +120 -0
- package/dist/bin/fireforge.js +6 -0
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +46 -0
- package/dist/src/cli-usage-error.js +81 -0
- package/dist/src/cli.d.ts +5 -1
- package/dist/src/cli.js +20 -21
- package/dist/src/commands/bootstrap.js +1 -2
- package/dist/src/commands/build.js +15 -6
- package/dist/src/commands/destructive-decision.d.ts +19 -0
- package/dist/src/commands/destructive-decision.js +31 -0
- package/dist/src/commands/doctor-check-core.d.ts +0 -6
- package/dist/src/commands/doctor-check-core.js +0 -8
- package/dist/src/commands/doctor-orphaned-harness.d.ts +0 -6
- package/dist/src/commands/doctor-orphaned-harness.js +4 -12
- package/dist/src/commands/doctor-post-rebase-audit.js +1 -1
- package/dist/src/commands/doctor-source-pin.d.ts +29 -0
- package/dist/src/commands/doctor-source-pin.js +81 -0
- package/dist/src/commands/doctor.d.ts +2 -0
- package/dist/src/commands/doctor.js +9 -8
- package/dist/src/commands/download.js +35 -24
- package/dist/src/commands/export-all.js +21 -4
- package/dist/src/commands/export-flow.js +15 -60
- package/dist/src/commands/export-placement-conflicts.js +3 -3
- package/dist/src/commands/export-placement-gate.js +2 -8
- package/dist/src/commands/export-placement-policy.js +3 -5
- package/dist/src/commands/export-shared.d.ts +42 -23
- package/dist/src/commands/export-shared.js +4 -19
- package/dist/src/commands/export.js +10 -1
- package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
- package/dist/src/commands/furnace/authoring-config.js +19 -0
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +3 -8
- package/dist/src/commands/furnace/create-dry-run.js +2 -5
- package/dist/src/commands/furnace/create-templates.d.ts +17 -1
- package/dist/src/commands/furnace/create-templates.js +2 -1
- package/dist/src/commands/furnace/create.js +25 -19
- package/dist/src/commands/furnace/deploy.js +11 -2
- package/dist/src/commands/furnace/init.js +2 -1
- package/dist/src/commands/furnace/override.js +28 -19
- package/dist/src/commands/furnace/refresh.js +9 -1
- package/dist/src/commands/furnace/remove-mutations.d.ts +6 -7
- package/dist/src/commands/furnace/remove-mutations.js +0 -1
- package/dist/src/commands/furnace/remove.js +2 -6
- package/dist/src/commands/furnace/rename-browser-test.js +1 -7
- package/dist/src/commands/furnace/rename.js +29 -29
- package/dist/src/commands/furnace/status.js +12 -9
- package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
- package/dist/src/commands/furnace/test-file-name.js +39 -0
- package/dist/src/commands/furnace/validation-output.d.ts +21 -9
- package/dist/src/commands/furnace/validation-output.js +3 -8
- package/dist/src/commands/import.js +2 -9
- package/dist/src/commands/lint-per-patch.d.ts +2 -2
- package/dist/src/commands/lint-per-patch.js +19 -4
- package/dist/src/commands/lint-per-run-checkjs.d.ts +2 -2
- package/dist/src/commands/lint.d.ts +2 -1
- package/dist/src/commands/lint.js +1 -1
- package/dist/src/commands/manifest.js +1 -1
- package/dist/src/commands/package.js +2 -4
- package/dist/src/commands/patch/compact.js +14 -15
- package/dist/src/commands/patch/delete.js +15 -25
- package/dist/src/commands/patch/entry-projection.d.ts +13 -0
- package/dist/src/commands/patch/entry-projection.js +24 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +0 -8
- package/dist/src/commands/patch/lint-ignore.js +19 -29
- package/dist/src/commands/patch/move-files-create.js +24 -10
- package/dist/src/commands/patch/move-files-into.js +38 -37
- package/dist/src/commands/patch/move-files.js +4 -13
- package/dist/src/commands/patch/rename.js +27 -41
- package/dist/src/commands/patch/reorder.js +25 -38
- package/dist/src/commands/patch/split-plan.d.ts +4 -5
- package/dist/src/commands/patch/split-plan.js +4 -11
- package/dist/src/commands/patch/split.js +45 -43
- package/dist/src/commands/patch/staged-dependency.js +16 -22
- package/dist/src/commands/patch/tier.js +15 -25
- package/dist/src/commands/patch-rename-map.d.ts +19 -0
- package/dist/src/commands/patch-rename-map.js +36 -0
- package/dist/src/commands/pending-resolution.d.ts +15 -0
- package/dist/src/commands/pending-resolution.js +25 -0
- package/dist/src/commands/re-export-adjacent.d.ts +32 -2
- package/dist/src/commands/re-export-adjacent.js +51 -10
- package/dist/src/commands/re-export-bulk-scan.js +6 -10
- package/dist/src/commands/re-export-drift.d.ts +8 -0
- package/dist/src/commands/re-export-drift.js +65 -4
- package/dist/src/commands/re-export-files.d.ts +2 -3
- package/dist/src/commands/re-export-files.js +38 -32
- package/dist/src/commands/re-export-lint.d.ts +3 -4
- package/dist/src/commands/re-export-lint.js +9 -2
- package/dist/src/commands/re-export-options.js +19 -5
- package/dist/src/commands/re-export-register.js +5 -1
- package/dist/src/commands/re-export-scan.js +8 -8
- package/dist/src/commands/re-export-single.d.ts +22 -3
- package/dist/src/commands/re-export-single.js +19 -11
- package/dist/src/commands/re-export.js +44 -27
- package/dist/src/commands/rebase/abort.js +3 -8
- package/dist/src/commands/rebase/continue.js +12 -12
- package/dist/src/commands/rebase/index.js +2 -2
- package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
- package/dist/src/commands/rebase/patch-loop.js +2 -7
- package/dist/src/commands/resolve.js +18 -10
- package/dist/src/commands/run.d.ts +0 -13
- package/dist/src/commands/run.js +12 -25
- package/dist/src/commands/setup-support.d.ts +16 -4
- package/dist/src/commands/setup-support.js +16 -16
- package/dist/src/commands/setup.js +3 -9
- package/dist/src/commands/source.js +8 -1
- package/dist/src/commands/status-check.js +2 -2
- package/dist/src/commands/status-output.js +2 -2
- package/dist/src/commands/status.js +3 -4
- package/dist/src/commands/test-build-phase.d.ts +2 -2
- package/dist/src/commands/test-build-phase.js +33 -8
- package/dist/src/commands/test-diagnose.js +14 -5
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +0 -1
- package/dist/src/commands/test-register.js +6 -3
- package/dist/src/commands/test-run.js +29 -21
- package/dist/src/commands/test-stale-gate.js +8 -5
- package/dist/src/commands/test-verdict.d.ts +16 -2
- package/dist/src/commands/test-verdict.js +18 -3
- package/dist/src/commands/test.js +51 -7
- package/dist/src/commands/token-list.d.ts +26 -0
- package/dist/src/commands/token-list.js +153 -0
- package/dist/src/commands/token.js +17 -1
- package/dist/src/commands/tree.js +7 -2
- package/dist/src/commands/typecheck.js +9 -9
- package/dist/src/commands/wire.js +4 -3
- package/dist/src/core/branding.d.ts +0 -7
- package/dist/src/core/branding.js +3 -2
- package/dist/src/core/browser-wire.js +6 -3
- package/dist/src/core/build-audit-platform.d.ts +29 -0
- package/dist/src/core/build-audit-platform.js +140 -0
- package/dist/src/core/build-audit-registration.js +3 -2
- package/dist/src/core/build-audit-skip.d.ts +57 -0
- package/dist/src/core/build-audit-skip.js +112 -0
- package/dist/src/core/build-audit.d.ts +15 -2
- package/dist/src/core/build-audit.js +154 -12
- package/dist/src/core/build-baseline.d.ts +45 -28
- package/dist/src/core/build-baseline.js +6 -29
- package/dist/src/core/build-jar-escalation.d.ts +64 -0
- package/dist/src/core/build-jar-escalation.js +128 -0
- package/dist/src/core/build-overwrite-guard.js +1 -1
- package/dist/src/core/build-prepare.d.ts +5 -2
- package/dist/src/core/build-prepare.js +34 -6
- package/dist/src/core/config-paths.d.ts +2 -6
- package/dist/src/core/config-paths.js +4 -2
- package/dist/src/core/config-state.d.ts +0 -6
- package/dist/src/core/config-state.js +1 -19
- package/dist/src/core/config-validate-build-audit.d.ts +8 -0
- package/dist/src/core/config-validate-build-audit.js +80 -0
- package/dist/src/core/config-validate-file-size.d.ts +12 -0
- package/dist/src/core/config-validate-file-size.js +65 -0
- package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
- package/dist/src/core/config-validate-patch-policy.js +3 -3
- package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
- package/dist/src/core/config-validate-test-toolchains.js +4 -5
- package/dist/src/core/config-validate.js +20 -3
- package/dist/src/core/config.d.ts +2 -2
- package/dist/src/core/config.js +11 -15
- package/dist/src/core/coverage-extend.js +4 -4
- package/dist/src/core/discard-baseline.js +7 -7
- package/dist/src/core/engine-precondition.d.ts +1 -9
- package/dist/src/core/engine-precondition.js +3 -8
- package/dist/src/core/engine-session-lock.js +13 -17
- package/dist/src/core/export-moved-code-shape.js +2 -2
- package/dist/src/core/file-lock-owner.d.ts +103 -0
- package/dist/src/core/file-lock-owner.js +259 -0
- package/dist/src/core/file-lock.d.ts +2 -7
- package/dist/src/core/file-lock.js +40 -91
- package/dist/src/core/firefox-cache.d.ts +13 -1
- package/dist/src/core/firefox-cache.js +59 -34
- package/dist/src/core/firefox-download.d.ts +15 -0
- package/dist/src/core/firefox-download.js +37 -21
- package/dist/src/core/firefox-extract.d.ts +6 -5
- package/dist/src/core/firefox-extract.js +36 -18
- package/dist/src/core/firefox.d.ts +30 -32
- package/dist/src/core/firefox.js +5 -36
- package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
- package/dist/src/core/furnace-apply-dry-run.js +1 -7
- package/dist/src/core/furnace-apply-helpers.d.ts +0 -11
- package/dist/src/core/furnace-apply-helpers.js +8 -19
- package/dist/src/core/furnace-apply-overwrite-warn.js +4 -2
- package/dist/src/core/furnace-apply.d.ts +1 -1
- package/dist/src/core/furnace-apply.js +30 -10
- package/dist/src/core/furnace-config.d.ts +1 -1
- package/dist/src/core/furnace-config.js +23 -36
- package/dist/src/core/furnace-constants.js +3 -2
- package/dist/src/core/furnace-dir-entry.d.ts +20 -0
- package/dist/src/core/furnace-dir-entry.js +21 -0
- package/dist/src/core/furnace-operation.d.ts +2 -0
- package/dist/src/core/furnace-operation.js +3 -1
- package/dist/src/core/furnace-refresh.d.ts +18 -6
- package/dist/src/core/furnace-refresh.js +3 -6
- package/dist/src/core/furnace-registration-ast.d.ts +0 -1
- package/dist/src/core/furnace-registration-ast.js +0 -3
- package/dist/src/core/furnace-registration.d.ts +2 -1
- package/dist/src/core/furnace-registration.js +22 -29
- package/dist/src/core/furnace-scanner.js +3 -6
- package/dist/src/core/furnace-state-persist.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +5 -7
- package/dist/src/core/git-base.d.ts +3 -1
- package/dist/src/core/git-base.js +25 -3
- package/dist/src/core/git-diff-new-file.d.ts +40 -0
- package/dist/src/core/git-diff-new-file.js +119 -0
- package/dist/src/core/git-diff.d.ts +9 -9
- package/dist/src/core/git-diff.js +88 -157
- package/dist/src/core/git-file-ops.d.ts +0 -7
- package/dist/src/core/git-file-ops.js +4 -28
- package/dist/src/core/git-readonly-index.d.ts +0 -2
- package/dist/src/core/git-readonly-index.js +0 -4
- package/dist/src/core/git-status.d.ts +7 -0
- package/dist/src/core/git-status.js +21 -9
- package/dist/src/core/git.d.ts +0 -6
- package/dist/src/core/git.js +14 -43
- package/dist/src/core/harness-orphans.d.ts +73 -0
- package/dist/src/core/harness-orphans.js +187 -0
- package/dist/src/core/history-log.d.ts +19 -0
- package/dist/src/core/history-log.js +29 -0
- package/dist/src/core/mach-error-hints.d.ts +0 -5
- package/dist/src/core/mach-error-hints.js +1 -1
- package/dist/src/core/mach-known-noise-filter.d.ts +25 -3
- package/dist/src/core/mach-known-noise-filter.js +31 -10
- package/dist/src/core/mach-mozconfig.js +2 -1
- package/dist/src/core/mach-python.d.ts +2 -0
- package/dist/src/core/mach-python.js +12 -7
- package/dist/src/core/mach-resource-shim.d.ts +13 -1
- package/dist/src/core/mach-resource-shim.js +112 -9
- package/dist/src/core/mach.d.ts +46 -53
- package/dist/src/core/mach.js +31 -83
- package/dist/src/core/marionette-port.d.ts +0 -17
- package/dist/src/core/marionette-port.js +12 -58
- package/dist/src/core/marionette-preflight.js +9 -27
- package/dist/src/core/mochitest-server-port.js +3 -3
- package/dist/src/core/moz-manifest-rules.js +37 -33
- package/dist/src/core/patch-apply-fuzz.js +4 -4
- package/dist/src/core/patch-apply.d.ts +4 -5
- package/dist/src/core/patch-apply.js +55 -32
- package/dist/src/core/patch-export-coverage.d.ts +0 -9
- package/dist/src/core/patch-export-coverage.js +1 -30
- package/dist/src/core/patch-export-update.d.ts +18 -1
- package/dist/src/core/patch-export-update.js +4 -3
- package/dist/src/core/patch-export.d.ts +11 -21
- package/dist/src/core/patch-export.js +44 -66
- package/dist/src/core/patch-files.d.ts +0 -4
- package/dist/src/core/patch-files.js +0 -11
- package/dist/src/core/patch-lint-binary.d.ts +6 -12
- package/dist/src/core/patch-lint-cache.d.ts +17 -1
- package/dist/src/core/patch-lint-cache.js +3 -6
- package/dist/src/core/patch-lint-checkjs.d.ts +33 -16
- package/dist/src/core/patch-lint-checkjs.js +43 -25
- package/dist/src/core/patch-lint-creators.d.ts +2 -6
- package/dist/src/core/patch-lint-cross.d.ts +16 -8
- package/dist/src/core/patch-lint-cross.js +49 -92
- package/dist/src/core/patch-lint-css.js +10 -6
- package/dist/src/core/patch-lint-file-size.d.ts +52 -0
- package/dist/src/core/patch-lint-file-size.js +53 -0
- package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
- package/dist/src/core/patch-lint-forward-registration.js +210 -0
- package/dist/src/core/patch-lint-jsdoc.js +36 -36
- package/dist/src/core/patch-lint-module-registration.d.ts +2 -8
- package/dist/src/core/patch-lint-prettier.d.ts +36 -0
- package/dist/src/core/patch-lint-prettier.js +126 -0
- package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
- package/dist/src/core/patch-lint-queue-types.js +12 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
- package/dist/src/core/patch-lint-staged-registration.js +90 -0
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +106 -0
- package/dist/src/core/patch-lint-unmanaged-companion.js +214 -0
- package/dist/src/core/patch-lint.d.ts +14 -9
- package/dist/src/core/patch-lint.js +27 -27
- package/dist/src/core/patch-lock.js +3 -3
- package/dist/src/core/patch-manifest-io.js +8 -7
- package/dist/src/core/patch-parse.d.ts +19 -8
- package/dist/src/core/patch-parse.js +25 -0
- package/dist/src/core/patch-policy.js +15 -27
- package/dist/src/core/patch-source-metadata.d.ts +1 -3
- package/dist/src/core/patch-source-metadata.js +0 -4
- package/dist/src/core/patch-transform.d.ts +21 -8
- package/dist/src/core/patch-transform.js +38 -10
- package/dist/src/core/process-cpu-time.js +1 -1
- package/dist/src/core/rebase-session.d.ts +2 -8
- package/dist/src/core/rebase-session.js +5 -17
- package/dist/src/core/register-browser-content.js +3 -2
- package/dist/src/core/register-browser-test.js +2 -1
- package/dist/src/core/register-module.js +2 -1
- package/dist/src/core/register-scaffold.js +5 -4
- package/dist/src/core/register-shared-css.js +2 -1
- package/dist/src/core/run-log-redact.d.ts +38 -0
- package/dist/src/core/run-log-redact.js +69 -0
- package/dist/src/core/run-log.d.ts +13 -2
- package/dist/src/core/run-log.js +67 -18
- package/dist/src/core/signal-critical.js +2 -4
- package/dist/src/core/smoke-patterns.d.ts +0 -1
- package/dist/src/core/smoke-patterns.js +18 -11
- package/dist/src/core/state-file.d.ts +12 -1
- package/dist/src/core/state-file.js +14 -1
- package/dist/src/core/status-classify.js +2 -1
- package/dist/src/core/test-changed-prefs.js +26 -11
- package/dist/src/core/test-harness-crash.js +61 -48
- package/dist/src/core/test-harness-verdict-notes.d.ts +55 -0
- package/dist/src/core/test-harness-verdict-notes.js +48 -0
- package/dist/src/core/test-stale-check.d.ts +23 -8
- package/dist/src/core/test-stale-check.js +77 -4
- package/dist/src/core/test-stall-triage.js +37 -19
- package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
- package/dist/src/core/test-xpcshell-retry.js +14 -11
- package/dist/src/core/token-category.d.ts +33 -0
- package/dist/src/core/token-category.js +56 -48
- package/dist/src/core/token-dark-mode.js +2 -14
- package/dist/src/core/token-inventory.d.ts +56 -0
- package/dist/src/core/token-inventory.js +109 -0
- package/dist/src/core/token-manager.d.ts +1 -1
- package/dist/src/core/token-manager.js +1 -1
- package/dist/src/core/token-variant.js +21 -22
- package/dist/src/core/toolchain-preflight.js +1 -1
- package/dist/src/core/tree-cow.d.ts +0 -2
- package/dist/src/core/tree-cow.js +2 -2
- package/dist/src/core/tree-store.js +4 -5
- package/dist/src/core/typecheck.js +2 -2
- package/dist/src/core/wire-dom-fragment.js +6 -17
- package/dist/src/core/wire-utils.js +5 -17
- package/dist/src/core/xpcshell-appdir.js +2 -4
- package/dist/src/errors/base.d.ts +53 -1
- package/dist/src/errors/base.js +79 -11
- package/dist/src/errors/build.d.ts +28 -0
- package/dist/src/errors/build.js +51 -10
- package/dist/src/errors/config.d.ts +0 -14
- package/dist/src/errors/config.js +13 -34
- package/dist/src/errors/download.d.ts +13 -0
- package/dist/src/errors/download.js +53 -24
- package/dist/src/errors/furnace.js +8 -9
- package/dist/src/errors/git.d.ts +8 -8
- package/dist/src/errors/git.js +20 -30
- package/dist/src/errors/patch.js +8 -10
- package/dist/src/errors/rebase.js +7 -7
- package/dist/src/types/commands/options.d.ts +96 -123
- package/dist/src/types/commands/patches.d.ts +17 -6
- package/dist/src/types/config.d.ts +75 -2
- package/dist/src/types/index.d.ts +0 -1
- package/dist/src/utils/assert.d.ts +3 -15
- package/dist/src/utils/assert.js +1 -18
- package/dist/src/utils/build-info.d.ts +1 -1
- package/dist/src/utils/child-env.d.ts +2 -1
- package/dist/src/utils/elapsed.js +10 -1
- package/dist/src/utils/fs.d.ts +4 -2
- package/dist/src/utils/fs.js +11 -14
- package/dist/src/utils/hash.d.ts +12 -0
- package/dist/src/utils/hash.js +16 -0
- package/dist/src/utils/line-dispatch.d.ts +15 -0
- package/dist/src/utils/line-dispatch.js +48 -0
- package/dist/src/utils/options.d.ts +1 -7
- package/dist/src/utils/options.js +6 -7
- package/dist/src/utils/package-root.js +3 -12
- package/dist/src/utils/platform.d.ts +0 -4
- package/dist/src/utils/process-group.d.ts +2 -1
- package/dist/src/utils/process-group.js +20 -19
- package/dist/src/utils/process.d.ts +40 -26
- package/dist/src/utils/process.js +115 -166
- package/dist/src/utils/ps-duration.js +3 -3
- package/dist/src/utils/sleep.d.ts +26 -0
- package/dist/src/utils/sleep.js +31 -0
- package/dist/src/utils/validation.d.ts +2 -38
- package/dist/src/utils/validation.js +7 -16
- package/docs/configuration.md +136 -1
- package/docs/exit-codes.md +34 -20
- package/docs/lifecycle-invariants.md +18 -12
- package/docs/machine-output.md +31 -8
- package/docs/patch-workflow.md +2 -1
- package/docs/run-logs.md +44 -4
- package/docs/testing.md +70 -11
- package/package.json +8 -7
- package/dist/src/commands/rebase.d.ts +0 -4
- package/dist/src/commands/rebase.js +0 -5
- package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
- package/dist/src/core/patch-artifact-normalize.js +0 -24
- package/dist/src/core/patch-lint-reexports.d.ts +0 -7
- package/dist/src/core/patch-lint-reexports.js +0 -8
- package/dist/src/core/wire-targets.d.ts +0 -7
- package/dist/src/core/wire-targets.js +0 -8
package/dist/src/errors/build.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
-
import { FireForgeError } from './base.js';
|
|
2
|
+
import { FireForgeError, remedies } from './base.js';
|
|
3
3
|
import { ExitCode } from './codes.js';
|
|
4
4
|
/**
|
|
5
5
|
* Error thrown when a build operation fails.
|
|
@@ -12,15 +12,56 @@ export class BuildError extends FireForgeError {
|
|
|
12
12
|
this.command = command;
|
|
13
13
|
}
|
|
14
14
|
get userMessage() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
return (`Build Error: ${this.message}` +
|
|
16
|
+
(this.command ? `\n\nCommand: ${this.command}` : '') +
|
|
17
|
+
remedies([
|
|
18
|
+
'Check the build output above for specific errors',
|
|
19
|
+
'Ensure all dependencies are installed with "fireforge bootstrap"',
|
|
20
|
+
'Try a clean build by deleting obj-* directories',
|
|
21
|
+
]));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A test SUITE went red — assertions failed, or sharded runs did not all
|
|
26
|
+
* pass. Distinct from its {@link BuildError} parent only in what it TELLS
|
|
27
|
+
* the operator, deliberately not in its exit code: `docs/exit-codes.md`
|
|
28
|
+
* documents 5 as "a suite that FAILED", and consumers key CI on it.
|
|
29
|
+
*
|
|
30
|
+
* The parent's remedies are all build remedies — "check the build output",
|
|
31
|
+
* "fireforge bootstrap", "delete obj-* directories" — and none of them apply
|
|
32
|
+
* to a failing assertion. Worse, the first points at the wrong half of the
|
|
33
|
+
* log, which is exactly the half a `tail` keeps. Ground truth for a test red
|
|
34
|
+
* is the harness's own output, so the remedies here name the failing tests,
|
|
35
|
+
* the `FIREFORGE-VERDICT:` line, and the run log that survives a pipe.
|
|
36
|
+
*
|
|
37
|
+
* Note that `machineErrorCode` derives the `--json` error code from the class
|
|
38
|
+
* name, so this reports as `test-failure` rather than `build`.
|
|
39
|
+
*/
|
|
40
|
+
export class TestFailureError extends BuildError {
|
|
41
|
+
failureBlocks;
|
|
42
|
+
logPath;
|
|
43
|
+
constructor(message, command,
|
|
44
|
+
/** Rendered TEST-UNEXPECTED blocks, when the verdict carried any. */
|
|
45
|
+
failureBlocks,
|
|
46
|
+
/** The run's complete raw log, when one was opened. */
|
|
47
|
+
logPath) {
|
|
48
|
+
super(message, command);
|
|
49
|
+
this.failureBlocks = failureBlocks;
|
|
50
|
+
this.logPath = logPath;
|
|
51
|
+
}
|
|
52
|
+
get userMessage() {
|
|
53
|
+
return (`Test Failure: ${this.message}` +
|
|
54
|
+
(this.command ? `\n\nCommand: ${this.command}` : '') +
|
|
55
|
+
(this.failureBlocks ? `\n\n${this.failureBlocks}` : '') +
|
|
56
|
+
remedies([
|
|
57
|
+
this.failureBlocks
|
|
58
|
+
? 'Fix the failing assertions listed above, then re-run just those test paths'
|
|
59
|
+
: 'Find the TEST-UNEXPECTED-FAIL lines in the output above — they name what broke',
|
|
60
|
+
'Read the "FIREFORGE-VERDICT:" line for the run\'s ground truth (checks, unexpected)',
|
|
61
|
+
this.logPath !== undefined
|
|
62
|
+
? `The complete raw output is at ${this.logPath} — it survives a piped/tailed terminal`
|
|
63
|
+
: 'Re-run without piping the output, so the failure lines are not cut off by "tail"',
|
|
64
|
+
]));
|
|
24
65
|
}
|
|
25
66
|
}
|
|
26
67
|
/**
|
|
@@ -15,17 +15,3 @@ export declare class ConfigNotFoundError extends ConfigError {
|
|
|
15
15
|
constructor(configPath: string);
|
|
16
16
|
get userMessage(): string;
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Error thrown when a required field is missing from config.
|
|
20
|
-
*/
|
|
21
|
-
export declare class MissingFieldError extends ConfigError {
|
|
22
|
-
constructor(field: string);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Error thrown when a field has an invalid value.
|
|
26
|
-
*/
|
|
27
|
-
export declare class InvalidFieldError extends ConfigError {
|
|
28
|
-
readonly expectedType: string;
|
|
29
|
-
readonly actualValue: unknown;
|
|
30
|
-
constructor(field: string, expectedType: string, actualValue: unknown);
|
|
31
|
-
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
-
import { FireForgeError } from './base.js';
|
|
2
|
+
import { FireForgeError, remedies } from './base.js';
|
|
3
3
|
import { ExitCode } from './codes.js';
|
|
4
4
|
/**
|
|
5
5
|
* Error thrown when configuration is missing or invalid.
|
|
@@ -12,15 +12,13 @@ export class ConfigError extends FireForgeError {
|
|
|
12
12
|
this.field = field;
|
|
13
13
|
}
|
|
14
14
|
get userMessage() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
msg += ' 3. See the documentation for the expected format';
|
|
23
|
-
return msg;
|
|
15
|
+
return (`Configuration Error: ${this.message}` +
|
|
16
|
+
(this.field ? `\n\nField: ${this.field}` : '') +
|
|
17
|
+
remedies([
|
|
18
|
+
'Check your fireforge.json file for errors',
|
|
19
|
+
'Run "fireforge setup" to create a new configuration',
|
|
20
|
+
'See the documentation for the expected format',
|
|
21
|
+
]));
|
|
24
22
|
}
|
|
25
23
|
}
|
|
26
24
|
/**
|
|
@@ -32,29 +30,10 @@ export class ConfigNotFoundError extends ConfigError {
|
|
|
32
30
|
}
|
|
33
31
|
get userMessage() {
|
|
34
32
|
return (`Configuration Error: ${this.message}\n\n` +
|
|
35
|
-
'This directory does not appear to be a FireForge project
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Error thrown when a required field is missing from config.
|
|
43
|
-
*/
|
|
44
|
-
export class MissingFieldError extends ConfigError {
|
|
45
|
-
constructor(field) {
|
|
46
|
-
super(`Required field "${field}" is missing from fireforge.json`, field);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Error thrown when a field has an invalid value.
|
|
51
|
-
*/
|
|
52
|
-
export class InvalidFieldError extends ConfigError {
|
|
53
|
-
expectedType;
|
|
54
|
-
actualValue;
|
|
55
|
-
constructor(field, expectedType, actualValue) {
|
|
56
|
-
super(`Field "${field}" has invalid value. Expected ${expectedType}, got ${typeof actualValue}`, field);
|
|
57
|
-
this.expectedType = expectedType;
|
|
58
|
-
this.actualValue = actualValue;
|
|
33
|
+
'This directory does not appear to be a FireForge project.' +
|
|
34
|
+
remedies([
|
|
35
|
+
'Navigate to your project root directory',
|
|
36
|
+
'Run "fireforge setup" to initialize a new project',
|
|
37
|
+
]));
|
|
59
38
|
}
|
|
60
39
|
}
|
|
@@ -19,6 +19,19 @@ export declare class ChecksumMismatchError extends DownloadError {
|
|
|
19
19
|
constructor(product: FirefoxProduct, expectedSha256: string, actualSha256: string, url: string);
|
|
20
20
|
get userMessage(): string;
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Error thrown when the default integrity check cannot obtain Mozilla's
|
|
24
|
+
* published SHA-256 for a freshly downloaded archive (checksum file
|
|
25
|
+
* unreachable, malformed, or not listing the archive) and no operator pin
|
|
26
|
+
* or explicit opt-out allows the download to be trusted on TLS alone.
|
|
27
|
+
*/
|
|
28
|
+
export declare class ChecksumUnavailableError extends DownloadError {
|
|
29
|
+
readonly product: FirefoxProduct;
|
|
30
|
+
readonly checksumsUrl: string;
|
|
31
|
+
readonly reason: string;
|
|
32
|
+
constructor(product: FirefoxProduct, checksumsUrl: string, reason: string, url: string);
|
|
33
|
+
get userMessage(): string;
|
|
34
|
+
}
|
|
22
35
|
/**
|
|
23
36
|
* Error thrown when extraction of the downloaded archive fails.
|
|
24
37
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FireForgeError } from './base.js';
|
|
1
|
+
import { FireForgeError, remedies } from './base.js';
|
|
2
2
|
import { ExitCode } from './codes.js';
|
|
3
3
|
/**
|
|
4
4
|
* Error thrown when Firefox source download fails.
|
|
@@ -11,15 +11,13 @@ export class DownloadError extends FireForgeError {
|
|
|
11
11
|
this.url = url;
|
|
12
12
|
}
|
|
13
13
|
get userMessage() {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
msg += ' 3. Try again with "fireforge download --force"';
|
|
22
|
-
return msg;
|
|
14
|
+
return (`Download Error: ${this.message}` +
|
|
15
|
+
(this.url ? `\n\nURL: ${this.url}` : '') +
|
|
16
|
+
remedies([
|
|
17
|
+
'Check your internet connection',
|
|
18
|
+
'Verify the Firefox version in fireforge.json is valid',
|
|
19
|
+
'Try again with "fireforge download --force"',
|
|
20
|
+
]));
|
|
23
21
|
}
|
|
24
22
|
}
|
|
25
23
|
/**
|
|
@@ -36,23 +34,54 @@ export class ChecksumMismatchError extends DownloadError {
|
|
|
36
34
|
this.actualSha256 = actualSha256;
|
|
37
35
|
}
|
|
38
36
|
get userMessage() {
|
|
39
|
-
|
|
37
|
+
return (`Download Error: Firefox source archive checksum mismatch.\n\n` +
|
|
40
38
|
`Product: ${this.product}\n` +
|
|
41
39
|
`URL: ${this.url}\n` +
|
|
42
40
|
`Expected SHA-256: ${this.expectedSha256}\n` +
|
|
43
|
-
`Actual SHA-256: ${this.actualSha256}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
41
|
+
`Actual SHA-256: ${this.actualSha256}` +
|
|
42
|
+
remedies([
|
|
43
|
+
'Verify firefox.product, firefox.version, and firefox.sha256 in fireforge.json',
|
|
44
|
+
'Compare the pinned hash with Mozilla SHA256SUMMARY for the resolved archive',
|
|
45
|
+
...(this.product === 'firefox-devedition'
|
|
46
|
+
? [
|
|
47
|
+
'Developer Edition archives should resolve under https://archive.mozilla.org/pub/devedition/releases/',
|
|
48
|
+
]
|
|
49
|
+
: []),
|
|
50
|
+
'Re-run "fireforge download --force" after correcting the source settings',
|
|
51
|
+
]));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Error thrown when the default integrity check cannot obtain Mozilla's
|
|
56
|
+
* published SHA-256 for a freshly downloaded archive (checksum file
|
|
57
|
+
* unreachable, malformed, or not listing the archive) and no operator pin
|
|
58
|
+
* or explicit opt-out allows the download to be trusted on TLS alone.
|
|
59
|
+
*/
|
|
60
|
+
export class ChecksumUnavailableError extends DownloadError {
|
|
61
|
+
product;
|
|
62
|
+
checksumsUrl;
|
|
63
|
+
reason;
|
|
64
|
+
constructor(product, checksumsUrl, reason, url) {
|
|
65
|
+
super(`Could not verify archive against published SHA256SUMS: ${reason}`, url);
|
|
66
|
+
this.product = product;
|
|
67
|
+
this.checksumsUrl = checksumsUrl;
|
|
68
|
+
this.reason = reason;
|
|
69
|
+
}
|
|
70
|
+
get userMessage() {
|
|
71
|
+
return (`Download Error: Firefox source archive integrity could not be verified.\n\n` +
|
|
72
|
+
`Product: ${this.product}\n` +
|
|
73
|
+
`Archive: ${this.url ?? ''}\n` +
|
|
74
|
+
`Checksums: ${this.checksumsUrl}\n` +
|
|
75
|
+
`Reason: ${this.reason}\n\n` +
|
|
76
|
+
'The archive was downloaded but discarded: without the published digest it would be ' +
|
|
77
|
+
'trusted on TLS alone, and it becomes the git baseline every patch is built on.\n\n' +
|
|
78
|
+
'To fix this:\n' +
|
|
79
|
+
' 1. Check connectivity to archive.mozilla.org (a captive portal or proxy may be ' +
|
|
80
|
+
'answering the SHA256SUMS request) and retry\n' +
|
|
81
|
+
' 2. Or pin the archive digest: set firefox.sha256 in fireforge.json ' +
|
|
82
|
+
'(from the release SHA256SUMS, obtained out of band)\n' +
|
|
83
|
+
' 3. Or, for an offline mirror you trust, set firefox.allowUnverifiedDownload: true ' +
|
|
84
|
+
'in fireforge.json to accept the download with a warning');
|
|
56
85
|
}
|
|
57
86
|
}
|
|
58
87
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
-
import { FireForgeError } from './base.js';
|
|
2
|
+
import { FireForgeError, remedies } from './base.js';
|
|
3
3
|
import { ExitCode } from './codes.js';
|
|
4
4
|
/**
|
|
5
5
|
* Error thrown when a furnace component operation fails.
|
|
@@ -15,15 +15,14 @@ export class FurnaceError extends FireForgeError {
|
|
|
15
15
|
}
|
|
16
16
|
omitValidateAdvice;
|
|
17
17
|
get userMessage() {
|
|
18
|
-
|
|
18
|
+
const head = this.component
|
|
19
19
|
? `Furnace Error (${this.component}): ${this.message}`
|
|
20
20
|
: `Furnace Error: ${this.message}`;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return msg;
|
|
21
|
+
return (head +
|
|
22
|
+
remedies([
|
|
23
|
+
'Check the error message above for specifics',
|
|
24
|
+
...(this.omitValidateAdvice ? [] : ['Run "fireforge furnace validate" to diagnose issues']),
|
|
25
|
+
'Use "fireforge doctor --repair-furnace" if state is inconsistent',
|
|
26
|
+
]));
|
|
28
27
|
}
|
|
29
28
|
}
|
package/dist/src/errors/git.d.ts
CHANGED
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
import { FireForgeError } from './base.js';
|
|
2
|
+
import { ExitCode } from './codes.js';
|
|
2
3
|
/**
|
|
3
4
|
* Error thrown when a git operation fails.
|
|
4
5
|
*/
|
|
5
6
|
export declare class GitError extends FireForgeError {
|
|
6
7
|
readonly command?: string | undefined;
|
|
7
|
-
readonly code:
|
|
8
|
+
readonly code: ExitCode;
|
|
8
9
|
constructor(message: string, command?: string | undefined, cause?: Error);
|
|
9
10
|
get userMessage(): string;
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
13
|
* Error thrown when git is not installed.
|
|
14
|
+
*
|
|
15
|
+
* MISSING_DEPENDENCY, not GIT_ERROR: the fact is "a required tool is
|
|
16
|
+
* absent", the same fact `PythonNotFoundError` and `MachNotFoundError`
|
|
17
|
+
* report, and a consumer should install something rather than inspect a
|
|
18
|
+
* repository.
|
|
13
19
|
*/
|
|
14
20
|
export declare class GitNotFoundError extends GitError {
|
|
21
|
+
readonly code: 7;
|
|
15
22
|
constructor();
|
|
16
23
|
get userMessage(): string;
|
|
17
24
|
}
|
|
@@ -23,13 +30,6 @@ export declare class PatchApplyError extends GitError {
|
|
|
23
30
|
constructor(patchPath: string, cause?: Error);
|
|
24
31
|
get userMessage(): string;
|
|
25
32
|
}
|
|
26
|
-
/**
|
|
27
|
-
* Error thrown when the repository is in a dirty state.
|
|
28
|
-
*/
|
|
29
|
-
export declare class DirtyRepositoryError extends GitError {
|
|
30
|
-
constructor();
|
|
31
|
-
get userMessage(): string;
|
|
32
|
-
}
|
|
33
33
|
/**
|
|
34
34
|
* Error thrown when a stale git index lock blocks repository initialization.
|
|
35
35
|
*/
|
package/dist/src/errors/git.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
-
import { FireForgeError } from './base.js';
|
|
2
|
+
import { FireForgeError, remedies } from './base.js';
|
|
3
3
|
import { ExitCode } from './codes.js';
|
|
4
4
|
/**
|
|
5
5
|
* Error thrown when a git operation fails.
|
|
@@ -12,21 +12,25 @@ export class GitError extends FireForgeError {
|
|
|
12
12
|
this.command = command;
|
|
13
13
|
}
|
|
14
14
|
get userMessage() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
msg += ' 3. Try running "fireforge reset" to start fresh';
|
|
23
|
-
return msg;
|
|
15
|
+
return (`Git Error: ${this.message}` +
|
|
16
|
+
(this.command ? `\n\nCommand: git ${this.command}` : '') +
|
|
17
|
+
remedies([
|
|
18
|
+
'Ensure git is installed and in your PATH',
|
|
19
|
+
'Check if the repository is in a valid state',
|
|
20
|
+
'Try running "fireforge reset" to start fresh',
|
|
21
|
+
]));
|
|
24
22
|
}
|
|
25
23
|
}
|
|
26
24
|
/**
|
|
27
25
|
* Error thrown when git is not installed.
|
|
26
|
+
*
|
|
27
|
+
* MISSING_DEPENDENCY, not GIT_ERROR: the fact is "a required tool is
|
|
28
|
+
* absent", the same fact `PythonNotFoundError` and `MachNotFoundError`
|
|
29
|
+
* report, and a consumer should install something rather than inspect a
|
|
30
|
+
* repository.
|
|
28
31
|
*/
|
|
29
32
|
export class GitNotFoundError extends GitError {
|
|
33
|
+
code = ExitCode.MISSING_DEPENDENCY;
|
|
30
34
|
constructor() {
|
|
31
35
|
super('Git is not installed or not found in PATH');
|
|
32
36
|
}
|
|
@@ -50,26 +54,12 @@ export class PatchApplyError extends GitError {
|
|
|
50
54
|
get userMessage() {
|
|
51
55
|
return (`Git Error: Failed to apply patch.\n\n` +
|
|
52
56
|
`Patch: ${this.patchPath}\n\n` +
|
|
53
|
-
'This usually means the patch conflicts with existing changes
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Error thrown when the repository is in a dirty state.
|
|
62
|
-
*/
|
|
63
|
-
export class DirtyRepositoryError extends GitError {
|
|
64
|
-
constructor() {
|
|
65
|
-
super('Repository has uncommitted changes');
|
|
66
|
-
}
|
|
67
|
-
get userMessage() {
|
|
68
|
-
return ('Git Error: The Firefox source has uncommitted changes.\n\n' +
|
|
69
|
-
'To fix this:\n' +
|
|
70
|
-
' 1. Export your changes with "fireforge export"\n' +
|
|
71
|
-
' 2. Use "fireforge reset" to restore clean state\n' +
|
|
72
|
-
' 3. Then run "fireforge import" to reapply patches');
|
|
57
|
+
'This usually means the patch conflicts with existing changes.' +
|
|
58
|
+
remedies([
|
|
59
|
+
'Check if the Firefox version matches the patch',
|
|
60
|
+
'Use "fireforge reset" to start with clean source',
|
|
61
|
+
'Update the patch to match the current Firefox version',
|
|
62
|
+
]));
|
|
73
63
|
}
|
|
74
64
|
}
|
|
75
65
|
/**
|
package/dist/src/errors/patch.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
-
import { FireForgeError } from './base.js';
|
|
2
|
+
import { FireForgeError, remedies } from './base.js';
|
|
3
3
|
import { ExitCode } from './codes.js';
|
|
4
4
|
/**
|
|
5
5
|
* Error thrown when `patches.json` exists but cannot be parsed or validated.
|
|
@@ -41,14 +41,12 @@ export class PatchError extends FireForgeError {
|
|
|
41
41
|
this.patchName = patchName;
|
|
42
42
|
}
|
|
43
43
|
get userMessage() {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
msg += ' 3. Update the patch for the current Firefox version';
|
|
52
|
-
return msg;
|
|
44
|
+
return (`Patch Error: ${this.message}` +
|
|
45
|
+
(this.patchName ? `\n\nPatch: ${this.patchName}` : '') +
|
|
46
|
+
remedies([
|
|
47
|
+
'Check if the patch is compatible with the Firefox version',
|
|
48
|
+
'Use "fireforge reset" to start with clean source',
|
|
49
|
+
'Update the patch for the current Firefox version',
|
|
50
|
+
]));
|
|
53
51
|
}
|
|
54
52
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
-
import { FireForgeError } from './base.js';
|
|
2
|
+
import { FireForgeError, remedies } from './base.js';
|
|
3
3
|
import { ExitCode } from './codes.js';
|
|
4
4
|
/**
|
|
5
5
|
* Base error for rebase operations.
|
|
@@ -7,12 +7,12 @@ import { ExitCode } from './codes.js';
|
|
|
7
7
|
export class RebaseError extends FireForgeError {
|
|
8
8
|
code = ExitCode.PATCH_ERROR;
|
|
9
9
|
get userMessage() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
return (`Rebase Error: ${this.message}` +
|
|
11
|
+
remedies([
|
|
12
|
+
'Check the error message above for specifics',
|
|
13
|
+
'Use "fireforge rebase --continue" to resume an interrupted rebase',
|
|
14
|
+
'Use "fireforge rebase --abort" to cancel and restore engine state',
|
|
15
|
+
]));
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
/**
|