@hominis/fireforge 0.35.0 → 0.36.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 +29 -0
- package/README.md +34 -9
- package/dist/bin/fireforge.js +21 -6
- package/dist/src/cli.js +22 -5
- package/dist/src/commands/bootstrap-checks.js +0 -1
- package/dist/src/commands/bootstrap.d.ts +2 -1
- package/dist/src/commands/bootstrap.js +16 -7
- package/dist/src/commands/build.js +4 -3
- package/dist/src/commands/config.js +30 -10
- package/dist/src/commands/discard.js +18 -3
- package/dist/src/commands/doctor/post-rebase-audit.js +0 -1
- package/dist/src/commands/doctor-check-core.js +0 -1
- package/dist/src/commands/doctor-external-toolchains.d.ts +3 -0
- package/dist/src/commands/doctor-external-toolchains.js +54 -0
- package/dist/src/commands/doctor-furnace-jar.js +0 -1
- package/dist/src/commands/doctor-furnace-manifest-sync.js +0 -1
- package/dist/src/commands/doctor-furnace.js +2 -2
- package/dist/src/commands/doctor-working-tree.js +0 -1
- package/dist/src/commands/doctor.js +4 -1
- package/dist/src/commands/download.js +28 -13
- package/dist/src/commands/export-all.js +5 -3
- package/dist/src/commands/export-flow.js +12 -7
- package/dist/src/commands/export-placement-gate.js +0 -1
- package/dist/src/commands/export-placement-policy.js +0 -1
- package/dist/src/commands/export-shared.d.ts +5 -1
- package/dist/src/commands/export-shared.js +18 -6
- package/dist/src/commands/export.js +15 -10
- package/dist/src/commands/furnace/apply.js +22 -6
- package/dist/src/commands/furnace/chrome-doc-remove.js +0 -1
- package/dist/src/commands/furnace/chrome-doc-templates.js +0 -1
- package/dist/src/commands/furnace/chrome-doc-tests.js +0 -1
- package/dist/src/commands/furnace/chrome-doc.js +0 -1
- package/dist/src/commands/furnace/create-browser-test.js +0 -1
- package/dist/src/commands/furnace/create-dry-run.js +0 -1
- package/dist/src/commands/furnace/create-features.js +0 -1
- package/dist/src/commands/furnace/create-mochikit.js +0 -1
- package/dist/src/commands/furnace/create-readback.js +0 -1
- package/dist/src/commands/furnace/create-templates.js +0 -1
- package/dist/src/commands/furnace/create-validation.js +0 -1
- package/dist/src/commands/furnace/create-xpcshell.js +0 -1
- package/dist/src/commands/furnace/create.js +0 -1
- package/dist/src/commands/furnace/deploy.js +7 -83
- package/dist/src/commands/furnace/diff.js +0 -1
- package/dist/src/commands/furnace/index.js +59 -25
- package/dist/src/commands/furnace/init.js +0 -1
- package/dist/src/commands/furnace/list.js +0 -1
- package/dist/src/commands/furnace/override.js +0 -1
- package/dist/src/commands/furnace/preview.js +3 -3
- package/dist/src/commands/furnace/refresh.js +0 -1
- package/dist/src/commands/furnace/remove-state.d.ts +15 -0
- package/dist/src/commands/furnace/remove-state.js +47 -1
- package/dist/src/commands/furnace/remove.js +3 -9
- package/dist/src/commands/furnace/rename-browser-test.js +1 -5
- package/dist/src/commands/furnace/rename-helpers.d.ts +6 -0
- package/dist/src/commands/furnace/rename-helpers.js +30 -1
- package/dist/src/commands/furnace/rename-xpcshell.js +7 -6
- package/dist/src/commands/furnace/rename.js +15 -36
- package/dist/src/commands/furnace/scan.js +0 -1
- package/dist/src/commands/furnace/status.js +0 -1
- package/dist/src/commands/furnace/sync.js +76 -4
- package/dist/src/commands/furnace/validate.js +0 -1
- package/dist/src/commands/furnace/validation-output.js +0 -1
- package/dist/src/commands/import.js +35 -9
- package/dist/src/commands/lint-per-patch.js +19 -7
- package/dist/src/commands/lint.js +13 -3
- package/dist/src/commands/manifest.js +1 -2
- package/dist/src/commands/package.js +2 -1
- package/dist/src/commands/patch/compact.js +1 -1
- package/dist/src/commands/patch/delete.js +1 -1
- package/dist/src/commands/patch/index.js +1 -1
- package/dist/src/commands/patch/lint-ignore.js +21 -6
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.js +0 -1
- package/dist/src/commands/patch/rename.js +4 -4
- package/dist/src/commands/patch/reorder.js +3 -4
- package/dist/src/commands/patch/split-plan.js +2 -1
- package/dist/src/commands/patch/split.js +4 -4
- package/dist/src/commands/patch/staged-dependency.js +1 -1
- package/dist/src/commands/patch/tier.js +18 -5
- package/dist/src/commands/re-export-bulk-scan.js +0 -1
- package/dist/src/commands/re-export-files.js +1 -1
- package/dist/src/commands/re-export-options.js +0 -1
- package/dist/src/commands/re-export-scan.js +0 -1
- package/dist/src/commands/re-export.js +6 -4
- package/dist/src/commands/rebase/abort.js +2 -9
- package/dist/src/commands/rebase/confirm.js +0 -1
- package/dist/src/commands/rebase/conflict-summary.js +0 -1
- package/dist/src/commands/rebase/continue.js +0 -1
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +10 -15
- package/dist/src/commands/rebase/patch-loop.js +38 -7
- package/dist/src/commands/rebase/summary.js +2 -3
- package/dist/src/commands/rebase.js +0 -1
- package/dist/src/commands/register.js +1 -1
- package/dist/src/commands/reset.js +16 -9
- package/dist/src/commands/resolve.js +2 -2
- package/dist/src/commands/run.js +4 -4
- package/dist/src/commands/setup-support.js +0 -1
- package/dist/src/commands/setup.js +1 -2
- package/dist/src/commands/source.js +1 -2
- package/dist/src/commands/status-output.js +1 -12
- package/dist/src/commands/status.js +147 -133
- package/dist/src/commands/test-appdir.js +0 -1
- package/dist/src/commands/test-diagnose.js +18 -2
- package/dist/src/commands/test-modes.d.ts +15 -0
- package/dist/src/commands/test-modes.js +61 -0
- package/dist/src/commands/test-register.d.ts +4 -0
- package/dist/src/commands/test-register.js +64 -0
- package/dist/src/commands/test-run.d.ts +23 -7
- package/dist/src/commands/test-run.js +15 -14
- package/dist/src/commands/test.d.ts +0 -4
- package/dist/src/commands/test.js +85 -86
- package/dist/src/commands/token-coverage.js +0 -1
- package/dist/src/commands/token.js +1 -2
- package/dist/src/commands/typecheck.js +1 -1
- package/dist/src/commands/verify.js +3 -9
- package/dist/src/commands/watch.js +5 -1
- package/dist/src/commands/wire.js +1 -1
- package/dist/src/core/ast-utils.js +0 -1
- package/dist/src/core/brand-validation.js +0 -1
- package/dist/src/core/branding.js +0 -1
- package/dist/src/core/browser-wire.js +0 -1
- package/dist/src/core/build-audit-platform.js +0 -1
- package/dist/src/core/build-audit-registration.js +0 -1
- package/dist/src/core/build-audit-resolve.js +0 -1
- package/dist/src/core/build-audit-transforms.js +0 -1
- package/dist/src/core/build-audit.js +0 -1
- package/dist/src/core/build-baseline-types.js +0 -1
- package/dist/src/core/build-baseline.js +0 -1
- package/dist/src/core/build-prepare.js +2 -2
- package/dist/src/core/config-mutate.js +0 -1
- package/dist/src/core/config-paths.d.ts +2 -2
- package/dist/src/core/config-paths.js +6 -1
- package/dist/src/core/config-state.js +0 -1
- package/dist/src/core/config-validate-patch-policy.js +0 -1
- package/dist/src/core/config-validate-test-toolchains.d.ts +8 -0
- package/dist/src/core/config-validate-test-toolchains.js +105 -0
- package/dist/src/core/config-validate.js +3 -1
- package/dist/src/core/config.js +0 -1
- package/dist/src/core/destructive.js +0 -1
- package/dist/src/core/diff-hunks.js +13 -7
- package/dist/src/core/engine-changes.js +0 -1
- package/dist/src/core/engine-session-lock.d.ts +12 -0
- package/dist/src/core/engine-session-lock.js +45 -0
- package/dist/src/core/file-lock.d.ts +8 -0
- package/dist/src/core/file-lock.js +157 -48
- package/dist/src/core/firefox-archive.d.ts +4 -0
- package/dist/src/core/firefox-archive.js +6 -1
- package/dist/src/core/firefox-cache.js +60 -4
- package/dist/src/core/firefox-download.js +0 -1
- package/dist/src/core/firefox-extract.js +75 -16
- package/dist/src/core/firefox-ignorefile.js +0 -1
- package/dist/src/core/firefox.d.ts +12 -0
- package/dist/src/core/firefox.js +64 -2
- package/dist/src/core/furnace-apply-dry-run.js +0 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +7 -3
- package/dist/src/core/furnace-apply-ftl.js +10 -5
- package/dist/src/core/furnace-apply-helpers.js +0 -1
- package/dist/src/core/furnace-apply-output.js +2 -2
- package/dist/src/core/furnace-apply.d.ts +7 -1
- package/dist/src/core/furnace-apply.js +47 -13
- package/dist/src/core/furnace-checksum-utils.js +0 -1
- package/dist/src/core/furnace-config-array-utils.js +0 -1
- package/dist/src/core/furnace-config-custom.js +0 -1
- package/dist/src/core/furnace-config-order.js +0 -1
- package/dist/src/core/furnace-config-tokens.js +0 -1
- package/dist/src/core/furnace-config-validate.js +0 -1
- package/dist/src/core/furnace-config.d.ts +11 -0
- package/dist/src/core/furnace-config.js +37 -1
- package/dist/src/core/furnace-constants.js +0 -1
- package/dist/src/core/furnace-css-fragments.js +0 -1
- package/dist/src/core/furnace-graph-utils.js +0 -1
- package/dist/src/core/furnace-jsconfig.d.ts +2 -3
- package/dist/src/core/furnace-jsconfig.js +25 -18
- package/dist/src/core/furnace-marker.js +0 -1
- package/dist/src/core/furnace-operation.js +0 -1
- package/dist/src/core/furnace-refresh.js +0 -1
- package/dist/src/core/furnace-registration-ast.d.ts +14 -0
- package/dist/src/core/furnace-registration-ast.js +1 -2
- package/dist/src/core/furnace-registration-remove.js +0 -1
- package/dist/src/core/furnace-registration-validate.js +1 -5
- package/dist/src/core/furnace-registration.js +0 -1
- package/dist/src/core/furnace-rollback.js +0 -1
- package/dist/src/core/furnace-scanner.js +0 -1
- package/dist/src/core/furnace-staleness.js +0 -1
- package/dist/src/core/furnace-state-persist.d.ts +72 -0
- package/dist/src/core/furnace-state-persist.js +118 -0
- package/dist/src/core/furnace-step-errors.d.ts +23 -0
- package/dist/src/core/furnace-step-errors.js +25 -0
- package/dist/src/core/furnace-stories.js +0 -1
- package/dist/src/core/furnace-validate-accessibility.js +0 -1
- package/dist/src/core/furnace-validate-checks.js +0 -1
- package/dist/src/core/furnace-validate-compatibility.js +0 -1
- package/dist/src/core/furnace-validate-helpers.js +0 -1
- package/dist/src/core/furnace-validate-registration.js +7 -7
- package/dist/src/core/furnace-validate-structure.d.ts +8 -0
- package/dist/src/core/furnace-validate-structure.js +11 -2
- package/dist/src/core/furnace-validate.js +0 -1
- package/dist/src/core/furnace-version-drift.d.ts +6 -3
- package/dist/src/core/furnace-version-drift.js +6 -4
- package/dist/src/core/git-base.js +0 -1
- package/dist/src/core/git-diff.js +0 -1
- package/dist/src/core/git-file-ops.js +0 -1
- package/dist/src/core/git-status.d.ts +13 -0
- package/dist/src/core/git-status.js +32 -2
- package/dist/src/core/git.d.ts +10 -1
- package/dist/src/core/git.js +63 -6
- package/dist/src/core/license-headers.js +0 -1
- package/dist/src/core/lint-cache.js +0 -1
- package/dist/src/core/lint-projection.js +0 -1
- package/dist/src/core/mach-build-artifacts.js +0 -1
- package/dist/src/core/mach-error-hints.js +0 -1
- package/dist/src/core/mach-mozconfig.js +0 -1
- package/dist/src/core/mach-python.js +0 -1
- package/dist/src/core/mach-resource-shim.js +0 -1
- package/dist/src/core/mach.js +0 -1
- package/dist/src/core/manifest-helpers.js +0 -1
- package/dist/src/core/manifest-register.js +0 -1
- package/dist/src/core/manifest-rules.js +0 -1
- package/dist/src/core/manifest-tokenizers.js +0 -1
- package/dist/src/core/marionette-port.d.ts +8 -0
- package/dist/src/core/marionette-port.js +34 -3
- package/dist/src/core/marionette-preflight.js +0 -1
- package/dist/src/core/markdown-table.js +0 -1
- package/dist/src/core/ownership-table.js +2 -9
- package/dist/src/core/parser-fallback.js +0 -1
- package/dist/src/core/patch-apply-fuzz.d.ts +27 -9
- package/dist/src/core/patch-apply-fuzz.js +71 -34
- package/dist/src/core/patch-apply.d.ts +30 -0
- package/dist/src/core/patch-apply.js +101 -18
- package/dist/src/core/patch-artifact-normalize.d.ts +18 -5
- package/dist/src/core/patch-artifact-normalize.js +19 -15
- package/dist/src/core/patch-export-coverage.js +0 -1
- package/dist/src/core/patch-export-metadata.js +0 -1
- package/dist/src/core/patch-export-update.js +2 -3
- package/dist/src/core/patch-export.d.ts +2 -6
- package/dist/src/core/patch-export.js +24 -48
- package/dist/src/core/patch-files.js +0 -1
- package/dist/src/core/patch-identifier-suggest.js +0 -1
- package/dist/src/core/patch-lint-checkjs.js +0 -1
- package/dist/src/core/patch-lint-chrome-jsdoc.js +0 -1
- package/dist/src/core/patch-lint-cross.js +0 -1
- package/dist/src/core/patch-lint-css.js +0 -1
- package/dist/src/core/patch-lint-diff-tag.js +0 -1
- package/dist/src/core/patch-lint-diff.d.ts +2 -1
- package/dist/src/core/patch-lint-diff.js +17 -32
- package/dist/src/core/patch-lint-imports.js +0 -1
- package/dist/src/core/patch-lint-jsdoc.js +0 -1
- package/dist/src/core/patch-lint-observer.js +0 -1
- package/dist/src/core/patch-lint-ownership.js +0 -1
- package/dist/src/core/patch-lint-reexports.js +0 -1
- package/dist/src/core/patch-lint.d.ts +37 -2
- package/dist/src/core/patch-lint.js +47 -34
- package/dist/src/core/patch-lock.js +0 -1
- package/dist/src/core/patch-manifest-consistency.js +9 -1
- package/dist/src/core/patch-manifest-io.d.ts +16 -0
- package/dist/src/core/patch-manifest-io.js +30 -5
- package/dist/src/core/patch-manifest-query.js +18 -10
- package/dist/src/core/patch-manifest-resolve.js +0 -1
- package/dist/src/core/patch-manifest-validate.js +0 -1
- package/dist/src/core/patch-manifest.d.ts +1 -1
- package/dist/src/core/patch-manifest.js +1 -2
- package/dist/src/core/patch-parse.d.ts +59 -0
- package/dist/src/core/patch-parse.js +209 -92
- package/dist/src/core/patch-policy.js +0 -1
- package/dist/src/core/patch-registration-refs.js +16 -26
- package/dist/src/core/patch-source-metadata.js +0 -1
- package/dist/src/core/patch-transform.d.ts +4 -0
- package/dist/src/core/patch-transform.js +30 -38
- package/dist/src/core/rebase-session.js +0 -1
- package/dist/src/core/register-browser-content.js +0 -1
- package/dist/src/core/register-module.js +0 -1
- package/dist/src/core/register-result.js +0 -1
- package/dist/src/core/register-scaffold.js +0 -1
- package/dist/src/core/register-shared-css.js +0 -1
- package/dist/src/core/register-test-manifest.js +0 -1
- package/dist/src/core/register-xpcshell-test.js +0 -1
- package/dist/src/core/shared-ftl.js +0 -1
- package/dist/src/core/signal-critical.js +0 -1
- package/dist/src/core/smoke-patterns.js +0 -1
- package/dist/src/core/state-file.js +0 -1
- package/dist/src/core/status-classify.d.ts +16 -0
- package/dist/src/core/status-classify.js +24 -16
- package/dist/src/core/test-harness-crash.d.ts +64 -7
- package/dist/src/core/test-harness-crash.js +196 -15
- package/dist/src/core/test-harness-output.js +0 -1
- package/dist/src/core/test-path-scope.d.ts +21 -13
- package/dist/src/core/test-path-scope.js +43 -28
- package/dist/src/core/test-stale-check.js +0 -1
- package/dist/src/core/test-stale-symlink.js +0 -1
- package/dist/src/core/test-xpcshell-retry.js +0 -1
- package/dist/src/core/token-coverage.js +0 -1
- package/dist/src/core/token-dark-mode.js +0 -1
- package/dist/src/core/token-docs.js +0 -1
- package/dist/src/core/token-manager.js +0 -1
- package/dist/src/core/token-scaffold.js +0 -1
- package/dist/src/core/token-variant.js +0 -1
- package/dist/src/core/toolchain-preflight.d.ts +31 -10
- package/dist/src/core/toolchain-preflight.js +97 -36
- package/dist/src/core/typecheck-shim.js +13 -1
- package/dist/src/core/typecheck.js +0 -1
- package/dist/src/core/wire-destroy.js +0 -1
- package/dist/src/core/wire-dom-fragment.js +0 -1
- package/dist/src/core/wire-init.js +0 -1
- package/dist/src/core/wire-subscript.js +0 -1
- package/dist/src/core/wire-targets.js +0 -1
- package/dist/src/core/wire-utils.js +0 -1
- package/dist/src/core/xpcshell-appdir.js +1 -4
- package/dist/src/errors/base.d.ts +29 -0
- package/dist/src/errors/base.js +35 -1
- package/dist/src/errors/build.js +0 -1
- package/dist/src/errors/codes.d.ts +6 -0
- package/dist/src/errors/codes.js +6 -1
- package/dist/src/errors/config.js +0 -1
- package/dist/src/errors/download.js +0 -1
- package/dist/src/errors/furnace.d.ts +11 -1
- package/dist/src/errors/furnace.js +6 -5
- package/dist/src/errors/git.js +0 -1
- package/dist/src/errors/patch.d.ts +17 -0
- package/dist/src/errors/patch.js +29 -1
- package/dist/src/errors/rebase.js +0 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.js +0 -1
- package/dist/src/types/cli.js +0 -1
- package/dist/src/types/commands/index.js +0 -1
- package/dist/src/types/commands/options.d.ts +13 -5
- package/dist/src/types/commands/options.js +0 -1
- package/dist/src/types/commands/patches.d.ts +8 -0
- package/dist/src/types/commands/patches.js +0 -1
- package/dist/src/types/commands/project.d.ts +11 -2
- package/dist/src/types/commands/project.js +0 -1
- package/dist/src/types/config.d.ts +32 -0
- package/dist/src/types/config.js +0 -1
- package/dist/src/types/furnace.d.ts +10 -0
- package/dist/src/types/furnace.js +0 -1
- package/dist/src/types/index.js +0 -1
- package/dist/src/types/typecheck.js +0 -1
- package/dist/src/utils/elapsed.js +0 -1
- package/dist/src/utils/errors.js +0 -1
- package/dist/src/utils/fs.js +37 -5
- package/dist/src/utils/logger.d.ts +7 -0
- package/dist/src/utils/logger.js +85 -3
- package/dist/src/utils/options.d.ts +15 -0
- package/dist/src/utils/options.js +25 -1
- package/dist/src/utils/package-root.js +11 -4
- package/dist/src/utils/parse.js +0 -1
- package/dist/src/utils/paths.js +0 -1
- package/dist/src/utils/platform.js +0 -1
- package/dist/src/utils/process.d.ts +33 -4
- package/dist/src/utils/process.js +183 -28
- package/dist/src/utils/regex.d.ts +13 -3
- package/dist/src/utils/regex.js +53 -4
- package/dist/src/utils/validation.d.ts +0 -12
- package/dist/src/utils/validation.js +13 -26
- package/package.json +8 -7
package/dist/src/errors/run.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
import { FireForgeError } from './base.js';
|
|
3
|
+
import { ExitCode } from './codes.js';
|
|
3
4
|
/**
|
|
4
5
|
* Error raised by `fireforge run --smoke-exit` when the captured console
|
|
5
6
|
* stream produced one or more error lines that did NOT match the
|
|
@@ -19,4 +20,3 @@ export class SmokeRunError extends FireForgeError {
|
|
|
19
20
|
return `Smoke run failed: ${this.message}`;
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
|
-
//# sourceMappingURL=run.js.map
|
package/dist/src/index.js
CHANGED
|
@@ -18,4 +18,3 @@ export { validateAllComponents, validateComponent } from './core/furnace-validat
|
|
|
18
18
|
export { addToken, getTokensCssPath, validateTokenAdd } from './core/token-manager.js';
|
|
19
19
|
export { CancellationError, CommandError, FireForgeError, GeneralError, InvalidArgumentError, ResolutionError, } from './errors/base.js';
|
|
20
20
|
export { ExitCode } from './errors/codes.js';
|
|
21
|
-
//# sourceMappingURL=index.js.map
|
package/dist/src/types/cli.js
CHANGED
|
@@ -299,11 +299,6 @@ export interface PatchStagedDependencyOptions {
|
|
|
299
299
|
/** Skip the confirmation prompt (required for non-TTY). */
|
|
300
300
|
yes?: boolean;
|
|
301
301
|
}
|
|
302
|
-
/**
|
|
303
|
-
* Options for the preview-only `fireforge patch move-files` subcommand.
|
|
304
|
-
* It validates an ownership transfer and prints the explicit
|
|
305
|
-
* `re-export --files` commands needed to perform it.
|
|
306
|
-
*/
|
|
307
302
|
/**
|
|
308
303
|
* Options for the `patch split` command.
|
|
309
304
|
*/
|
|
@@ -331,6 +326,11 @@ export interface PatchSplitOptions {
|
|
|
331
326
|
/** Skip per-patch lint of the projected bodies. */
|
|
332
327
|
skipLint?: boolean;
|
|
333
328
|
}
|
|
329
|
+
/**
|
|
330
|
+
* Options for the preview-only `fireforge patch move-files` subcommand.
|
|
331
|
+
* It validates an ownership transfer and prints the explicit
|
|
332
|
+
* `re-export --files` commands needed to perform it.
|
|
333
|
+
*/
|
|
334
334
|
export interface PatchMoveFilesOptions {
|
|
335
335
|
/** File paths relative to engine/ to move from the source patch to the target patch. */
|
|
336
336
|
file?: string[];
|
|
@@ -405,6 +405,8 @@ export interface TestOptions {
|
|
|
405
405
|
headless?: boolean;
|
|
406
406
|
/** Run incremental UI build before testing */
|
|
407
407
|
build?: boolean;
|
|
408
|
+
/** Forward mach's pathless auto-selection mode. Valid only with no explicit paths. */
|
|
409
|
+
auto?: boolean;
|
|
408
410
|
/**
|
|
409
411
|
* Run a marionette preflight before tests. Reports PASS/FAIL in under a
|
|
410
412
|
* minute. When test paths are supplied, a FAIL aborts before mach test is
|
|
@@ -428,6 +430,12 @@ export interface TestOptions {
|
|
|
428
430
|
* stale process holds the default port or CI uses another port.
|
|
429
431
|
*/
|
|
430
432
|
marionettePort?: number;
|
|
433
|
+
/** Kill a recognized stale browser process holding the Marionette port, then continue. */
|
|
434
|
+
killStaleMarionette?: boolean;
|
|
435
|
+
/** Permit tests against packageable engine edits newer than the last successful build. */
|
|
436
|
+
allowStaleBuild?: boolean;
|
|
437
|
+
/** Run the configured short harness canary. `true` means use `fireforge.json`'s test.canaryPath. */
|
|
438
|
+
canary?: string | boolean;
|
|
431
439
|
/**
|
|
432
440
|
* Retry budget for recognized harness crashes (resource-monitor
|
|
433
441
|
* tracebacks, pre-test no-output hangs, post-green shutdown re-entry).
|
|
@@ -31,6 +31,14 @@ export interface PatchResult {
|
|
|
31
31
|
conflictingFiles?: string[];
|
|
32
32
|
/** Whether the patch was auto-resolved (new file vs existing file conflict) */
|
|
33
33
|
autoResolved?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Pre-existing content of files the auto-resolve overwrote, keyed by
|
|
36
|
+
* engine-relative path. Kept for the RUN's duration (not just the retry):
|
|
37
|
+
* if a later patch fails and `rollbackPatches` reverse-applies this one,
|
|
38
|
+
* reversing a new-file patch DELETES the file — these snapshots are the
|
|
39
|
+
* only way to restore what was there before the auto-resolve.
|
|
40
|
+
*/
|
|
41
|
+
autoResolvedOriginals?: Map<string, string>;
|
|
34
42
|
}
|
|
35
43
|
/**
|
|
36
44
|
* Extended patch information with metadata.
|
|
@@ -3,19 +3,28 @@
|
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
5
|
* Result of a doctor check.
|
|
6
|
+
*
|
|
7
|
+
* Field precedence (consumers and producers must agree):
|
|
8
|
+
* 1. `severity`, when present, is authoritative — `'error'` counts as a
|
|
9
|
+
* failure and `'warning'` as a warning REGARDLESS of `passed`.
|
|
10
|
+
* 2. Without `severity`, `passed: false` is a failure unless
|
|
11
|
+
* `warning: true` downgrades it to a warning.
|
|
12
|
+
* Producers should prefer setting `severity` explicitly; `warning` exists
|
|
13
|
+
* for older checks that predate the field. Do not emit contradictory
|
|
14
|
+
* combinations like `passed: true, severity: 'error'`.
|
|
6
15
|
*/
|
|
7
16
|
export interface DoctorCheck {
|
|
8
17
|
/** Name of the check */
|
|
9
18
|
name: string;
|
|
10
19
|
/** Whether the check passed */
|
|
11
20
|
passed: boolean;
|
|
12
|
-
/** Severity of the result */
|
|
21
|
+
/** Severity of the result (authoritative when present — see above) */
|
|
13
22
|
severity?: 'ok' | 'warning' | 'error';
|
|
14
23
|
/** Description of the result */
|
|
15
24
|
message: string;
|
|
16
25
|
/** Suggested fix if check failed */
|
|
17
26
|
fix?: string;
|
|
18
|
-
/**
|
|
27
|
+
/** Legacy warning flag for checks that predate `severity` */
|
|
19
28
|
warning?: boolean;
|
|
20
29
|
}
|
|
21
30
|
/**
|
|
@@ -24,6 +24,34 @@ export interface BuildConfig {
|
|
|
24
24
|
/** Number of parallel jobs for mach build */
|
|
25
25
|
jobs?: number;
|
|
26
26
|
}
|
|
27
|
+
/** Test command defaults stored in fireforge.json. */
|
|
28
|
+
export interface TestConfig {
|
|
29
|
+
/**
|
|
30
|
+
* Engine-relative browser-chrome canary file used by `fireforge test --canary`
|
|
31
|
+
* when the command does not receive an explicit canary path.
|
|
32
|
+
*/
|
|
33
|
+
canaryPath?: string;
|
|
34
|
+
/** Short no-output ceiling for `fireforge test --canary`, in seconds. */
|
|
35
|
+
canaryTimeoutSeconds?: number;
|
|
36
|
+
}
|
|
37
|
+
/** A single external executable required by a project-specific toolchain. */
|
|
38
|
+
export interface ExternalToolRequirement {
|
|
39
|
+
/** Tool name as shown in doctor output, and PATH/xcrun lookup key when no path is set. */
|
|
40
|
+
name: string;
|
|
41
|
+
/** Absolute or project-relative executable path. */
|
|
42
|
+
path?: string;
|
|
43
|
+
/** Resolve the tool with `xcrun -find <name>` instead of PATH. */
|
|
44
|
+
xcrun?: boolean;
|
|
45
|
+
/** Missing tool is an error by default; set false for advisory probes. */
|
|
46
|
+
required?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/** Named group of project-specific external asset/build tools. */
|
|
49
|
+
export interface ExternalToolchainConfig {
|
|
50
|
+
/** Human-readable toolchain name, e.g. "seasonal-branding". */
|
|
51
|
+
name: string;
|
|
52
|
+
/** Tools this toolchain needs. */
|
|
53
|
+
tools: ExternalToolRequirement[];
|
|
54
|
+
}
|
|
27
55
|
/** Enforcement mode for patch policy violations during mutating commands. */
|
|
28
56
|
export type PatchPolicyMutationMode = 'error' | 'warn' | 'force';
|
|
29
57
|
/** A category-owned numeric range in the patch queue. */
|
|
@@ -89,6 +117,10 @@ export interface FireForgeConfig {
|
|
|
89
117
|
firefox: FirefoxConfig;
|
|
90
118
|
/** Build settings */
|
|
91
119
|
build?: BuildConfig;
|
|
120
|
+
/** Test command defaults */
|
|
121
|
+
test?: TestConfig;
|
|
122
|
+
/** Optional project-specific external toolchains checked by doctor. */
|
|
123
|
+
externalToolchains?: ExternalToolchainConfig[];
|
|
92
124
|
/** Project license SPDX identifier */
|
|
93
125
|
license?: ProjectLicense;
|
|
94
126
|
/** Wire command configuration */
|
package/dist/src/types/config.js
CHANGED
|
@@ -208,6 +208,16 @@ export interface FurnaceState {
|
|
|
208
208
|
export interface StepError {
|
|
209
209
|
step: string;
|
|
210
210
|
error: string;
|
|
211
|
+
/**
|
|
212
|
+
* Advisory step errors are reported as warnings and never trigger
|
|
213
|
+
* rollback or a non-zero exit. Used by the `.ftl` helpers, whose module
|
|
214
|
+
* contract is graceful degradation: a missing locale jar.mn on a fork
|
|
215
|
+
* without a locale package must not block a working `.mjs`/`.css` from
|
|
216
|
+
* shipping. Before this flag existed the contract was contradicted in
|
|
217
|
+
* practice — any FTL step error rolled back the entire apply, so a
|
|
218
|
+
* localized component on such a fork could never be applied at all.
|
|
219
|
+
*/
|
|
220
|
+
advisory?: boolean;
|
|
211
221
|
}
|
|
212
222
|
/**
|
|
213
223
|
* Result of applying all components to the engine source tree.
|
package/dist/src/types/index.js
CHANGED
package/dist/src/utils/errors.js
CHANGED
package/dist/src/utils/fs.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
3
|
import { access, chmod, copyFile as fsCopyFile, lstat, mkdir, open, readdir, readFile, rename, rm, stat, statfs, } from 'node:fs/promises';
|
|
4
|
-
import { dirname, join } from 'node:path';
|
|
4
|
+
import { basename, dirname, join } from 'node:path';
|
|
5
5
|
const RETRIABLE_REMOVE_ERRORS = new Set(['ENOTEMPTY', 'EBUSY', 'EPERM']);
|
|
6
|
+
const RETRIABLE_RENAME_ERRORS = new Set(['EPERM', 'EACCES', 'EBUSY']);
|
|
6
7
|
function sleep(ms) {
|
|
7
8
|
return new Promise((resolve) => {
|
|
8
9
|
setTimeout(resolve, ms);
|
|
@@ -199,7 +200,7 @@ export async function writeFileAtomic(path, content) {
|
|
|
199
200
|
if (existingMode !== undefined) {
|
|
200
201
|
await chmod(tempPath, existingMode);
|
|
201
202
|
}
|
|
202
|
-
await
|
|
203
|
+
await renameWithRetries(tempPath, path);
|
|
203
204
|
await syncParentDir(path);
|
|
204
205
|
}
|
|
205
206
|
catch (error) {
|
|
@@ -207,6 +208,31 @@ export async function writeFileAtomic(path, content) {
|
|
|
207
208
|
throw error;
|
|
208
209
|
}
|
|
209
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* Renames the temp file over its destination, retrying transient sharing
|
|
213
|
+
* violations. On Windows, a rename onto a target that another writer is
|
|
214
|
+
* concurrently replacing — or that an antivirus/indexer briefly holds open —
|
|
215
|
+
* fails with EPERM/EACCES/EBUSY even though the same rename succeeds a moment
|
|
216
|
+
* later; POSIX renames never hit this. Non-retriable codes and exhausted
|
|
217
|
+
* budgets rethrow, so a genuine permission problem still surfaces.
|
|
218
|
+
*/
|
|
219
|
+
async function renameWithRetries(from, to) {
|
|
220
|
+
for (let attempt = 0;; attempt++) {
|
|
221
|
+
try {
|
|
222
|
+
await rename(from, to);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
const code = error instanceof Error && 'code' in error && typeof error.code === 'string'
|
|
227
|
+
? error.code
|
|
228
|
+
: undefined;
|
|
229
|
+
if (!code || !RETRIABLE_RENAME_ERRORS.has(code) || attempt === 4) {
|
|
230
|
+
throw error;
|
|
231
|
+
}
|
|
232
|
+
await sleep(25 * (attempt + 1));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
210
236
|
async function syncParentDir(path) {
|
|
211
237
|
let directoryHandle;
|
|
212
238
|
try {
|
|
@@ -270,7 +296,10 @@ export const FIREFORGE_TMP_PATH_PATTERN = /(^|\/)\.[^/]+\.fireforge-tmp-\d+-[0-9
|
|
|
270
296
|
*/
|
|
271
297
|
function createAtomicTempPath(path) {
|
|
272
298
|
const directory = dirname(path);
|
|
273
|
-
|
|
299
|
+
// basename, not slice(dirname.length + 1): when dirname ends with the
|
|
300
|
+
// separator (filesystem/drive roots, e.g. dirname('/foo') === '/'), the
|
|
301
|
+
// slice arithmetic chopped the first filename character ('/foo' → 'oo').
|
|
302
|
+
const filename = basename(path);
|
|
274
303
|
return join(directory, `.${filename}.fireforge-tmp-${process.pid}-${randomUUID()}`);
|
|
275
304
|
}
|
|
276
305
|
/**
|
|
@@ -287,7 +316,11 @@ function createAtomicTempPath(path) {
|
|
|
287
316
|
export async function checkDiskSpace(path, minBytes, onLowSpace) {
|
|
288
317
|
try {
|
|
289
318
|
const stats = await statfs(path);
|
|
290
|
-
|
|
319
|
+
// bavail = blocks available to UNPRIVILEGED users; bfree includes the
|
|
320
|
+
// root-reserved blocks (typically 5% on ext4), so it over-reported free
|
|
321
|
+
// space and silently suppressed the low-space warning exactly when it
|
|
322
|
+
// mattered.
|
|
323
|
+
const availableBytes = stats.bavail * stats.bsize;
|
|
291
324
|
if (availableBytes < minBytes) {
|
|
292
325
|
const availableGB = (availableBytes / (1024 * 1024 * 1024)).toFixed(1);
|
|
293
326
|
const requiredGB = (minBytes / (1024 * 1024 * 1024)).toFixed(1);
|
|
@@ -302,4 +335,3 @@ export async function checkDiskSpace(path, minBytes, onLowSpace) {
|
|
|
302
335
|
return undefined;
|
|
303
336
|
}
|
|
304
337
|
}
|
|
305
|
-
//# sourceMappingURL=fs.js.map
|
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
* @param enabled - Whether to enable verbose output
|
|
4
4
|
*/
|
|
5
5
|
export declare function setVerbose(enabled: boolean): void;
|
|
6
|
+
/**
|
|
7
|
+
* Switches the logger into (or out of) machine-output mode. Commands with
|
|
8
|
+
* `--json`/`--raw` flags call this before producing any output.
|
|
9
|
+
*/
|
|
10
|
+
export declare function setMachineOutputMode(enabled: boolean): void;
|
|
11
|
+
/** True when machine-output mode is active. */
|
|
12
|
+
export declare function isMachineOutputMode(): boolean;
|
|
6
13
|
/**
|
|
7
14
|
* Displays a verbose/debug message (only shown if verbose mode is enabled).
|
|
8
15
|
* @param message - Message to display
|
package/dist/src/utils/logger.js
CHANGED
|
@@ -3,6 +3,19 @@ import * as p from '@clack/prompts';
|
|
|
3
3
|
import pc from 'picocolors';
|
|
4
4
|
/** Whether verbose mode is enabled */
|
|
5
5
|
let verboseMode = false;
|
|
6
|
+
/**
|
|
7
|
+
* Whether machine-output mode is active (`--json` / `--raw`).
|
|
8
|
+
*
|
|
9
|
+
* In machine mode, stdout belongs EXCLUSIVELY to the machine-readable
|
|
10
|
+
* payload: all human-facing diagnostics (intro/outro banners, info, warn,
|
|
11
|
+
* error, steps, notes) are routed to stderr as plain unstyled lines.
|
|
12
|
+
* Before this mode existed, clack's log helpers wrote styled warnings to
|
|
13
|
+
* stdout *before* the JSON body — a truncated-directory warning during
|
|
14
|
+
* `status --json` broke every `JSON.parse(stdout)` consumer, and error
|
|
15
|
+
* objects on the machine contract were followed by a styled duplicate on
|
|
16
|
+
* the same stream.
|
|
17
|
+
*/
|
|
18
|
+
let machineOutputMode = false;
|
|
6
19
|
/**
|
|
7
20
|
* Enables or disables verbose mode.
|
|
8
21
|
* @param enabled - Whether to enable verbose output
|
|
@@ -10,6 +23,21 @@ let verboseMode = false;
|
|
|
10
23
|
export function setVerbose(enabled) {
|
|
11
24
|
verboseMode = enabled;
|
|
12
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Switches the logger into (or out of) machine-output mode. Commands with
|
|
28
|
+
* `--json`/`--raw` flags call this before producing any output.
|
|
29
|
+
*/
|
|
30
|
+
export function setMachineOutputMode(enabled) {
|
|
31
|
+
machineOutputMode = enabled;
|
|
32
|
+
}
|
|
33
|
+
/** True when machine-output mode is active. */
|
|
34
|
+
export function isMachineOutputMode() {
|
|
35
|
+
return machineOutputMode;
|
|
36
|
+
}
|
|
37
|
+
/** Writes a plain diagnostic line to stderr (machine-mode side channel). */
|
|
38
|
+
function writeDiagnostic(prefix, message) {
|
|
39
|
+
process.stderr.write(`${prefix}${message}\n`);
|
|
40
|
+
}
|
|
13
41
|
/**
|
|
14
42
|
* Checks if verbose mode is enabled.
|
|
15
43
|
* @returns True if verbose mode is enabled
|
|
@@ -22,43 +50,75 @@ function isVerbose() {
|
|
|
22
50
|
* @param message - Message to display
|
|
23
51
|
*/
|
|
24
52
|
export function verbose(message) {
|
|
25
|
-
if (isVerbose())
|
|
26
|
-
|
|
53
|
+
if (!isVerbose())
|
|
54
|
+
return;
|
|
55
|
+
if (machineOutputMode) {
|
|
56
|
+
writeDiagnostic('[debug] ', message);
|
|
57
|
+
return;
|
|
27
58
|
}
|
|
59
|
+
p.log.info(`[debug] ${message}`);
|
|
28
60
|
}
|
|
29
61
|
function supportsInteractiveSpinner() {
|
|
30
62
|
return process.stdout.isTTY && process.stderr.isTTY;
|
|
31
63
|
}
|
|
32
64
|
/** Displays the top-level intro banner for a command. */
|
|
33
65
|
export function intro(message) {
|
|
66
|
+
if (machineOutputMode)
|
|
67
|
+
return;
|
|
34
68
|
p.intro(message);
|
|
35
69
|
}
|
|
36
70
|
/** Displays the closing outro banner for a command. */
|
|
37
71
|
export function outro(message) {
|
|
72
|
+
if (machineOutputMode)
|
|
73
|
+
return;
|
|
38
74
|
p.outro(message);
|
|
39
75
|
}
|
|
40
76
|
/** Logs an informational message. */
|
|
41
77
|
export function info(message) {
|
|
78
|
+
if (machineOutputMode) {
|
|
79
|
+
writeDiagnostic('', message);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
42
82
|
p.log.info(message);
|
|
43
83
|
}
|
|
44
84
|
/** Logs a success message. */
|
|
45
85
|
export function success(message) {
|
|
86
|
+
if (machineOutputMode) {
|
|
87
|
+
writeDiagnostic('', message);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
46
90
|
p.log.success(message);
|
|
47
91
|
}
|
|
48
92
|
/** Logs a warning message. */
|
|
49
93
|
export function warn(message) {
|
|
94
|
+
if (machineOutputMode) {
|
|
95
|
+
writeDiagnostic('warning: ', message);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
50
98
|
p.log.warn(message);
|
|
51
99
|
}
|
|
52
100
|
/** Logs an error message. */
|
|
53
101
|
export function error(message) {
|
|
102
|
+
if (machineOutputMode) {
|
|
103
|
+
writeDiagnostic('error: ', message);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
54
106
|
p.log.error(message);
|
|
55
107
|
}
|
|
56
108
|
/** Logs an in-progress step message. */
|
|
57
109
|
export function step(message) {
|
|
110
|
+
if (machineOutputMode) {
|
|
111
|
+
writeDiagnostic('', message);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
58
114
|
p.log.step(message);
|
|
59
115
|
}
|
|
60
116
|
/** Logs a plain message without a status prefix. */
|
|
61
117
|
export function message(message) {
|
|
118
|
+
if (machineOutputMode) {
|
|
119
|
+
writeDiagnostic('', message);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
62
122
|
p.log.message(message);
|
|
63
123
|
}
|
|
64
124
|
/** Formats text using the success color without logging it. */
|
|
@@ -75,6 +135,21 @@ export function formatErrorText(message) {
|
|
|
75
135
|
* @returns Spinner handle with message(), stop(), and error() methods
|
|
76
136
|
*/
|
|
77
137
|
export function spinner(initialMessage) {
|
|
138
|
+
if (machineOutputMode) {
|
|
139
|
+
// Spinner progress is diagnostics; keep stdout clean for the payload.
|
|
140
|
+
return {
|
|
141
|
+
message: (msg) => {
|
|
142
|
+
writeDiagnostic('', msg);
|
|
143
|
+
},
|
|
144
|
+
stop: (msg) => {
|
|
145
|
+
if (msg)
|
|
146
|
+
writeDiagnostic('', msg);
|
|
147
|
+
},
|
|
148
|
+
error: (msg) => {
|
|
149
|
+
writeDiagnostic('error: ', msg ?? 'Failed');
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
78
153
|
if (!supportsInteractiveSpinner()) {
|
|
79
154
|
let latestMessage = initialMessage;
|
|
80
155
|
return {
|
|
@@ -107,6 +182,10 @@ export function spinner(initialMessage) {
|
|
|
107
182
|
}
|
|
108
183
|
/** Emits a cancellation message. */
|
|
109
184
|
export function cancel(message) {
|
|
185
|
+
if (machineOutputMode) {
|
|
186
|
+
writeDiagnostic('cancelled: ', message);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
110
189
|
p.cancel(message);
|
|
111
190
|
}
|
|
112
191
|
/** Checks whether a prompt result represents a user cancellation. */
|
|
@@ -115,6 +194,9 @@ export function isCancel(value) {
|
|
|
115
194
|
}
|
|
116
195
|
/** Displays a titled note block for follow-up details. */
|
|
117
196
|
export function note(message, title) {
|
|
197
|
+
if (machineOutputMode) {
|
|
198
|
+
writeDiagnostic('', title ? `${title}: ${message}` : message);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
118
201
|
p.note(message, title);
|
|
119
202
|
}
|
|
120
|
-
//# sourceMappingURL=logger.js.map
|
|
@@ -6,3 +6,18 @@
|
|
|
6
6
|
export declare function pickDefined<T extends Record<string, unknown>>(obj: T): {
|
|
7
7
|
[K in keyof T]+?: Exclude<T[K], undefined>;
|
|
8
8
|
};
|
|
9
|
+
/**
|
|
10
|
+
* Wraps an option-argument parser so its failures surface through
|
|
11
|
+
* commander's own invalid-argument channel.
|
|
12
|
+
*
|
|
13
|
+
* Commander only treats errors whose `code` is `'commander.invalidArgument'`
|
|
14
|
+
* as argument-validation failures; anything else re-throws out of
|
|
15
|
+
* `parseAsync`, BYPASSING `withErrorHandling` entirely and landing in the
|
|
16
|
+
* bin's `main().catch` as an unformatted `Fatal error: …` dump with exit 1.
|
|
17
|
+
* That was the observed behavior for `run --smoke-exit abc` (plain Error),
|
|
18
|
+
* `test --harness-retries 99` (GeneralError), and `export --order 0`
|
|
19
|
+
* (FireForge InvalidArgumentError, whose `code` is a numeric ExitCode).
|
|
20
|
+
* Every `.argParser()`/option-parser callback must be wrapped with this
|
|
21
|
+
* helper (or throw commander's InvalidArgumentError directly).
|
|
22
|
+
*/
|
|
23
|
+
export declare function commanderArgParser<T>(parse: (raw: string) => T): (raw: string) => T;
|
|
@@ -13,4 +13,28 @@ export function pickDefined(obj) {
|
|
|
13
13
|
}
|
|
14
14
|
return result;
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
import { InvalidArgumentError as CommanderInvalidArgumentError } from 'commander';
|
|
17
|
+
/**
|
|
18
|
+
* Wraps an option-argument parser so its failures surface through
|
|
19
|
+
* commander's own invalid-argument channel.
|
|
20
|
+
*
|
|
21
|
+
* Commander only treats errors whose `code` is `'commander.invalidArgument'`
|
|
22
|
+
* as argument-validation failures; anything else re-throws out of
|
|
23
|
+
* `parseAsync`, BYPASSING `withErrorHandling` entirely and landing in the
|
|
24
|
+
* bin's `main().catch` as an unformatted `Fatal error: …` dump with exit 1.
|
|
25
|
+
* That was the observed behavior for `run --smoke-exit abc` (plain Error),
|
|
26
|
+
* `test --harness-retries 99` (GeneralError), and `export --order 0`
|
|
27
|
+
* (FireForge InvalidArgumentError, whose `code` is a numeric ExitCode).
|
|
28
|
+
* Every `.argParser()`/option-parser callback must be wrapped with this
|
|
29
|
+
* helper (or throw commander's InvalidArgumentError directly).
|
|
30
|
+
*/
|
|
31
|
+
export function commanderArgParser(parse) {
|
|
32
|
+
return (raw) => {
|
|
33
|
+
try {
|
|
34
|
+
return parse(raw);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
throw new CommanderInvalidArgumentError(error instanceof Error ? error.message : String(error));
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -34,8 +34,8 @@ export function getPackageRoot() {
|
|
|
34
34
|
}
|
|
35
35
|
let current = dirname(fileURLToPath(import.meta.url));
|
|
36
36
|
for (;;) {
|
|
37
|
+
const packagePath = join(current, 'package.json');
|
|
37
38
|
try {
|
|
38
|
-
const packagePath = join(current, 'package.json');
|
|
39
39
|
const pkg = readPackageMetadata(packagePath);
|
|
40
40
|
if (isFireForgePackageMetadata(pkg)) {
|
|
41
41
|
cachedPackageRoot = current;
|
|
@@ -43,8 +43,16 @@ export function getPackageRoot() {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
catch (error) {
|
|
46
|
-
|
|
47
|
-
//
|
|
46
|
+
// Absent package.json: keep walking. A package.json that EXISTS but
|
|
47
|
+
// fails to parse is a different animal — walking past it could bind
|
|
48
|
+
// to a wrong ancestor package (any parent exposing bin.fireforge) or
|
|
49
|
+
// end in the unhelpful generic "could not locate" error, hiding the
|
|
50
|
+
// actual syntax problem.
|
|
51
|
+
const code = error.code;
|
|
52
|
+
if (code !== 'ENOENT' && code !== 'ENOTDIR') {
|
|
53
|
+
throw new Error(`Found ${packagePath} but could not parse it: ` +
|
|
54
|
+
(error instanceof Error ? error.message : String(error)), { cause: error });
|
|
55
|
+
}
|
|
48
56
|
}
|
|
49
57
|
const parent = dirname(current);
|
|
50
58
|
if (parent === current) {
|
|
@@ -66,4 +74,3 @@ export function getPackageVersion() {
|
|
|
66
74
|
const packageRoot = getPackageRoot();
|
|
67
75
|
return readPackageMetadata(join(packageRoot, 'package.json')).version;
|
|
68
76
|
}
|
|
69
|
-
//# sourceMappingURL=package-root.js.map
|
package/dist/src/utils/parse.js
CHANGED
package/dist/src/utils/paths.js
CHANGED