@hominis/fireforge 0.46.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +11 -11
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -34,11 +34,11 @@ export async function tokenCoverageCommand(projectRoot) {
|
|
|
34
34
|
.map((f) => f.file);
|
|
35
35
|
// Also scan CSS files deployed by Furnace custom components. Deployed
|
|
36
36
|
// files can be committed (and therefore absent from `git status`) while
|
|
37
|
-
// still being the primary surface where token adoption matters
|
|
37
|
+
// still being the primary surface where token adoption matters. Looking
|
|
38
38
|
// only at modified files silently undercounts projects where Furnace
|
|
39
39
|
// writes many component-CSS files into the engine.
|
|
40
40
|
const furnaceCssFiles = await collectFurnaceCustomCssFiles(projectRoot, paths.engine, tokensCssPath);
|
|
41
|
-
// De-dupe so a file that is both a custom deploy target
|
|
41
|
+
// De-dupe so a file that is both a custom deploy target and modified is
|
|
42
42
|
// scanned exactly once.
|
|
43
43
|
const cssFiles = [...new Set([...statusCssFiles, ...furnaceCssFiles])];
|
|
44
44
|
const tokenSourceFiles = [...new Set(statusTokenCssFiles)];
|
|
@@ -129,7 +129,7 @@ async function validateTokenSourceFiles(engineDir, tokenSourceFiles, tokenPrefix
|
|
|
129
129
|
/**
|
|
130
130
|
* Returns engine-relative `.css` paths deployed by every Furnace custom
|
|
131
131
|
* component registered in `furnace.json`. Only files that actually exist
|
|
132
|
-
* on disk are included
|
|
132
|
+
* on disk are included. A component whose deploy target is missing (e.g.
|
|
133
133
|
* `furnace apply` has not run yet) is skipped silently so a fresh
|
|
134
134
|
* `furnace init` followed immediately by `token coverage` does not error.
|
|
135
135
|
*
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `token list` and `token show
|
|
3
|
+
* `token list` and `token show`: the read half of design-token management.
|
|
4
4
|
*
|
|
5
5
|
* `token add` requires `--category` and refuses an unknown one, but nothing
|
|
6
6
|
* reported the categories a project has, so naming one meant hand-parsing a
|
|
7
7
|
* neighbouring `= Category =` banner out of the tokens CSS. Both commands
|
|
8
8
|
* read through `token-inventory.ts`, which is built on the same banner and
|
|
9
|
-
* `:root`-bounds primitives `token add` and `token coverage` use
|
|
10
|
-
* tokens-CSS parser would let the report and the writer disagree about
|
|
9
|
+
* `:root`-bounds primitives `token add` and `token coverage` use, because
|
|
10
|
+
* a second tokens-CSS parser would let the report and the writer disagree about
|
|
11
11
|
* which section a token lives in.
|
|
12
12
|
*
|
|
13
13
|
* Helper module: no registrar, called from `token.ts`.
|
|
@@ -38,7 +38,7 @@ function filterByCategory(groups, category, tokensCssPath) {
|
|
|
38
38
|
if (matched.length > 0)
|
|
39
39
|
return matched;
|
|
40
40
|
// Same "name the alternatives" contract `token add` gives for an unknown
|
|
41
|
-
// category
|
|
41
|
+
// category: a filter that silently prints nothing reads as "this
|
|
42
42
|
// category is empty", which is a different fact.
|
|
43
43
|
const available = groups
|
|
44
44
|
.map((group) => group.category)
|
|
@@ -57,7 +57,7 @@ function filterByCategory(groups, category, tokensCssPath) {
|
|
|
57
57
|
*/
|
|
58
58
|
export async function tokenListCommand(projectRoot, options = {}) {
|
|
59
59
|
if (options.json === true) {
|
|
60
|
-
// stdout belongs exclusively to the payload from here on
|
|
60
|
+
// stdout belongs exclusively to the payload from here on. A later
|
|
61
61
|
// diagnostic (including withErrorHandling's) routes to stderr.
|
|
62
62
|
setMachineOutputMode(true);
|
|
63
63
|
try {
|
|
@@ -21,7 +21,7 @@ async function normalizeTokenNameForProject(projectRoot, rawTokenName) {
|
|
|
21
21
|
const strippedPrefix = furnaceConfig.tokenPrefix.replace(/^--/, '').replace(/-$/, '');
|
|
22
22
|
const strippedName = rawTokenName.replace(/^--/, '');
|
|
23
23
|
// A bare name that already starts with the configured prefix text is
|
|
24
|
-
// treated as fully qualified
|
|
24
|
+
// treated as fully qualified. Blindly prepending would silently
|
|
25
25
|
// produce a double-prefixed token (e.g. "--hominis-hominis-shadow-low").
|
|
26
26
|
if (strippedName === strippedPrefix || strippedName.startsWith(`${strippedPrefix}-`)) {
|
|
27
27
|
info(`Token name "${rawTokenName}" already starts with the configured prefix ` +
|
|
@@ -37,12 +37,12 @@ async function normalizeTokenNameForProject(projectRoot, rawTokenName) {
|
|
|
37
37
|
return normalizeTokenName(rawTokenName);
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
|
-
* Reports a no-op add, naming
|
|
40
|
+
* Reports a no-op add, naming where the existing declaration lives.
|
|
41
41
|
*
|
|
42
|
-
* A variant skip has no category to name
|
|
43
|
-
* `:root<selector>` block
|
|
42
|
+
* A variant skip has no category to name, because the declaration lives in
|
|
43
|
+
* a `:root<selector>` block, so the location reads as that block. The
|
|
44
44
|
* variant path used to report no location at all, so a re-run meant to
|
|
45
|
-
*
|
|
45
|
+
* change a value exited 0 having silently changed nothing.
|
|
46
46
|
*
|
|
47
47
|
* @param tokenName - Full token name including prefix
|
|
48
48
|
* @param result - Result carrying the skip location, when known
|
|
@@ -69,8 +69,8 @@ export async function tokenAddCommand(projectRoot, tokenName, value, options) {
|
|
|
69
69
|
intro('Token Add');
|
|
70
70
|
// A fresh project without furnace.json otherwise fails deep inside the
|
|
71
71
|
// token-manager's `assertTokenCategoryExists` with "Token CSS file not
|
|
72
|
-
// found: browser/themes/shared/<binary>-tokens.css"
|
|
73
|
-
// but the operator's actual next step is to initialize Furnace, which
|
|
72
|
+
// found: browser/themes/shared/<binary>-tokens.css", which is technically
|
|
73
|
+
// correct, but the operator's actual next step is to initialize Furnace, which
|
|
74
74
|
// scaffolds the tokens CSS file. Catching the uninitialized case here
|
|
75
75
|
// gives the right guidance before the generic "file not found" error.
|
|
76
76
|
if (!(await furnaceConfigExists(projectRoot))) {
|
|
@@ -171,9 +171,9 @@ export function registerToken(program, { getProjectRoot, withErrorHandling }) {
|
|
|
171
171
|
// Commander's argument parsing.
|
|
172
172
|
// Description ends with `(required)` because Commander's
|
|
173
173
|
// `makeOptionMandatory` does not render a required marker in `--help`
|
|
174
|
-
// output
|
|
174
|
+
// output. Only `.requiredOption` does that, and switching to
|
|
175
175
|
// `.requiredOption` would lose the `.choices()` enforcement. The
|
|
176
|
-
// explicit suffix keeps the runtime validation
|
|
176
|
+
// explicit suffix keeps the runtime validation and surfaces required
|
|
177
177
|
// status in help alongside the other options that use `.requiredOption`.
|
|
178
178
|
new Option('--mode <mode>', 'Dark mode behavior (required)')
|
|
179
179
|
.choices(['auto', 'static', 'override'])
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge tree
|
|
3
|
+
* `fireforge tree`: copy-on-write verification clones.
|
|
4
4
|
*
|
|
5
|
-
* Trees enable concurrent
|
|
5
|
+
* Trees enable concurrent read-mostly verification (lint, typecheck, status,
|
|
6
6
|
* verify, doctor, export dry-runs) beside a busy primary tree. Exports and
|
|
7
|
-
* every other mutation stay strictly serial in the primary
|
|
7
|
+
* every other mutation stay strictly serial in the primary, because a tree's
|
|
8
8
|
* patches/components are snapshots with no merge model, and the tree guard
|
|
9
9
|
* (cli.ts preAction + core/tree-guard.ts) refuses mutating commands inside a
|
|
10
10
|
* tree.
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
* directory, rewrites its mozinfo.json to the tree, and runs `mach configure`
|
|
14
14
|
* inside the tree so the remaining configure output (config.status,
|
|
15
15
|
* backend.mk, Makefile, config/autoconf.mk) stops naming the primary. That is
|
|
16
|
-
* fail-closed by design
|
|
17
|
-
* unrelocated clone would silently operate against the primary
|
|
16
|
+
* fail-closed by design (mach objdirs embed absolute source paths, and an
|
|
17
|
+
* unrelocated clone would silently operate against the primary), and it is
|
|
18
18
|
* what admits build-less `fireforge test` inside that tree.
|
|
19
19
|
*/
|
|
20
20
|
import { spawn } from 'node:child_process';
|
|
@@ -61,14 +61,14 @@ async function resolveObjdirForClone(projectRoot) {
|
|
|
61
61
|
/**
|
|
62
62
|
* Runs `mach configure` inside the tree's engine so the configure-generated
|
|
63
63
|
* root files (config.status, backend.mk, Makefile, config/autoconf.mk) are
|
|
64
|
-
* regenerated against the tree's paths
|
|
64
|
+
* regenerated against the tree's paths. The mozinfo rewrite alone leaves
|
|
65
65
|
* those naming the primary, and a build-less in-tree `test` must never
|
|
66
66
|
* consult primary state. Exit code 0 is not trusted on its own: configure
|
|
67
67
|
* obeys MOZCONFIG / MOZ_OBJDIR, so the postcondition is verified afterwards
|
|
68
|
-
* via `findObjdirRelocationViolation
|
|
68
|
+
* via `findObjdirRelocationViolation`: the intended objdir was configured,
|
|
69
69
|
* its mozinfo points into the tree, and none of those root files still
|
|
70
70
|
* names the primary engine (nested Makefiles are products of the verified
|
|
71
|
-
* config.status
|
|
71
|
+
* config.status, and `.deps` build products are out of scope, see the
|
|
72
72
|
* checker's doc). A failure throws before `cloneTree` writes the marker,
|
|
73
73
|
* so the tree is removed and `clonedObjdir` is never recorded (fail-closed).
|
|
74
74
|
*/
|
|
@@ -102,7 +102,7 @@ export async function treeCreateCommand(projectRoot, name, options = {}) {
|
|
|
102
102
|
intro('FireForge Tree Create');
|
|
103
103
|
assertValidTreeName(name);
|
|
104
104
|
// A marker we cannot parse still means "something claims this is a tree", so
|
|
105
|
-
// it must block nesting too
|
|
105
|
+
// it must block nesting too. Otherwise a corrupt marker is a licence to
|
|
106
106
|
// clone a snapshot into itself.
|
|
107
107
|
const markerState = await readTreeMarker(projectRoot);
|
|
108
108
|
if (markerState.kind !== 'absent') {
|
|
@@ -128,15 +128,15 @@ export async function treeCreateCommand(projectRoot, name, options = {}) {
|
|
|
128
128
|
warn('No copy-on-write support detected — performing a full physical copy (--force-copy).');
|
|
129
129
|
}
|
|
130
130
|
// Courtesy fast-fail: refuse obvious no-build cases before waiting on
|
|
131
|
-
// locks. The result is
|
|
131
|
+
// locks. The result is discarded: a build can still start before the
|
|
132
132
|
// locks below are held, so only the re-resolution under the build lock
|
|
133
133
|
// is authoritative for what actually gets cloned.
|
|
134
134
|
if (options.withObjdir === true) {
|
|
135
135
|
await resolveObjdirForClone(projectRoot);
|
|
136
136
|
}
|
|
137
|
-
// Snapshot under the
|
|
138
|
-
// state (half-applied export, furnace deploy) is never captured
|
|
139
|
-
// objdir snapshot additionally holds the primary
|
|
137
|
+
// Snapshot under the primary engine-session lock so a mid-mutation
|
|
138
|
+
// state (half-applied export, furnace deploy) is never captured. An
|
|
139
|
+
// objdir snapshot additionally holds the primary build lock, under
|
|
140
140
|
// which the objdir is re-validated immediately before cloning so a
|
|
141
141
|
// concurrent `fireforge build` can neither tear the obj-* mid-write
|
|
142
142
|
// nor swap it after preflight. A failed clone (including the
|
|
@@ -183,8 +183,8 @@ export async function treeCreateCommand(projectRoot, name, options = {}) {
|
|
|
183
183
|
export async function treeListCommand(projectRoot, options = {}) {
|
|
184
184
|
if (options.json === true) {
|
|
185
185
|
// stdout belongs exclusively to the JSON payload: engage machine mode so
|
|
186
|
-
// any diagnostic
|
|
187
|
-
// withErrorHandling
|
|
186
|
+
// any diagnostic, including a listTrees failure rendered later by
|
|
187
|
+
// withErrorHandling (which also resets the mode), routes to stderr.
|
|
188
188
|
setMachineOutputMode(true);
|
|
189
189
|
try {
|
|
190
190
|
const trees = await listTrees(projectRoot);
|
|
@@ -280,13 +280,13 @@ async function treeExecCommand(projectRoot, name, args) {
|
|
|
280
280
|
resolvePromise(code ?? 1);
|
|
281
281
|
});
|
|
282
282
|
}).finally(() => {
|
|
283
|
-
// With `stdio: 'inherit'` the child owned stdout
|
|
284
|
-
// FIREFORGE-VERDICT line it emitted as its
|
|
283
|
+
// With `stdio: 'inherit'` the child owned stdout, including any
|
|
284
|
+
// FIREFORGE-VERDICT line it emitted as its last stdout write. From here
|
|
285
285
|
// on the parent must not write stdout again, or its own refusal text
|
|
286
|
-
// (the GeneralError below, rendered by withErrorHandling) prints
|
|
286
|
+
// (the GeneralError below, rendered by withErrorHandling) prints after
|
|
287
287
|
// the child's verdict and breaks the "verdict is the run's last stdout
|
|
288
288
|
// line" contract at the tree-exec boundary. Sealing routes the parent's
|
|
289
|
-
// remaining output to stderr
|
|
289
|
+
// remaining output to stderr. withErrorHandling's finally clears it.
|
|
290
290
|
setStdoutSealed(true);
|
|
291
291
|
});
|
|
292
292
|
if (exitCode !== 0) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge typecheck
|
|
2
|
+
* `fireforge typecheck`: whole-project TypeScript type checking driven by
|
|
3
3
|
* user-supplied jsconfig.json paths.
|
|
4
4
|
*
|
|
5
5
|
* Distinct from `patchLint.checkJs`: that pass is patch-hygiene (scoped to
|
|
6
|
-
* patch-owned `.sys.mjs`, run automatically by `fireforge lint`)
|
|
7
|
-
* command is CI-grade
|
|
6
|
+
* patch-owned `.sys.mjs`, run automatically by `fireforge lint`). This
|
|
7
|
+
* command is CI-grade: it runs whole projects with the user's own compiler
|
|
8
8
|
* options. The two share their Firefox-globals shim and the same
|
|
9
9
|
* suppressed-diagnostic set so a file that lints clean cannot fail typecheck
|
|
10
10
|
* for a reason the operator could not have inferred from the docs.
|
|
@@ -21,15 +21,15 @@ import type { TypecheckProjectResult } from '../types/typecheck.js';
|
|
|
21
21
|
export interface TypecheckCommandOptions {
|
|
22
22
|
/**
|
|
23
23
|
* Override `typecheck.projects` with a single jsconfig.json path
|
|
24
|
-
* for one-off verification. Replaces (does not augment) the config
|
|
25
|
-
*
|
|
24
|
+
* for one-off verification. Replaces (does not augment) the config,
|
|
25
|
+
* which is useful to re-run a single project after fixing one of its
|
|
26
26
|
* issues without waiting for the full set.
|
|
27
27
|
*/
|
|
28
28
|
project?: string;
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Resolves the project list to type-check. `--project` wins over
|
|
32
|
-
* config
|
|
32
|
+
* config. If neither is set, throws a clear error pointing at both
|
|
33
33
|
* paths to a fix (add the config field or pass --project).
|
|
34
34
|
*/
|
|
35
35
|
export declare function resolveTypecheckProjects(configTypecheck: TypecheckConfig | undefined, override: string | undefined): TypecheckConfig;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge typecheck
|
|
3
|
+
* `fireforge typecheck`: whole-project TypeScript type checking driven by
|
|
4
4
|
* user-supplied jsconfig.json paths.
|
|
5
5
|
*
|
|
6
6
|
* Distinct from `patchLint.checkJs`: that pass is patch-hygiene (scoped to
|
|
7
|
-
* patch-owned `.sys.mjs`, run automatically by `fireforge lint`)
|
|
8
|
-
* command is CI-grade
|
|
7
|
+
* patch-owned `.sys.mjs`, run automatically by `fireforge lint`). This
|
|
8
|
+
* command is CI-grade: it runs whole projects with the user's own compiler
|
|
9
9
|
* options. The two share their Firefox-globals shim and the same
|
|
10
10
|
* suppressed-diagnostic set so a file that lints clean cannot fail typecheck
|
|
11
11
|
* for a reason the operator could not have inferred from the docs.
|
|
@@ -26,7 +26,7 @@ import { info, intro, outro, success, warn } from '../utils/logger.js';
|
|
|
26
26
|
import { buildPerRunCheckJs } from './lint-per-run-checkjs.js';
|
|
27
27
|
/**
|
|
28
28
|
* Resolves the project list to type-check. `--project` wins over
|
|
29
|
-
* config
|
|
29
|
+
* config. If neither is set, throws a clear error pointing at both
|
|
30
30
|
* paths to a fix (add the config field or pass --project).
|
|
31
31
|
*/
|
|
32
32
|
export function resolveTypecheckProjects(configTypecheck, override) {
|
|
@@ -75,7 +75,7 @@ export async function typecheckCommand(projectRoot, options) {
|
|
|
75
75
|
}
|
|
76
76
|
async function runTypecheckCommandBody(projectRoot, options) {
|
|
77
77
|
// Validate project is initialised. `loadConfig` throws on missing
|
|
78
|
-
// fireforge.json
|
|
78
|
+
// fireforge.json, and withErrorHandling at the CLI layer renders the
|
|
79
79
|
// resulting `ConfigNotFoundError` cleanly, so we don't need to
|
|
80
80
|
// re-wrap.
|
|
81
81
|
getProjectPaths(projectRoot);
|
|
@@ -101,8 +101,8 @@ async function runTypecheckCommandBody(projectRoot, options) {
|
|
|
101
101
|
reportResults(projectRoot, results, patchIssues);
|
|
102
102
|
}
|
|
103
103
|
/**
|
|
104
|
-
* Runs the per-patch-lint checkJs pass
|
|
105
|
-
* `lint --per-patch` use
|
|
104
|
+
* Runs the per-patch-lint checkJs pass (the same program `export` and
|
|
105
|
+
* `lint --per-patch` use) and returns its findings.
|
|
106
106
|
*
|
|
107
107
|
* Returns an empty list when `patchLint.checkJs` is off or the project has
|
|
108
108
|
* no patch queue: there is no second authority to reconcile then.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge verify
|
|
2
|
+
* `fireforge verify`: read-only fsck for the patch queue.
|
|
3
3
|
*
|
|
4
4
|
* Combines the manifest consistency check (orphan files, missing entries,
|
|
5
5
|
* files-affected mismatch, duplicate entries) with the cross-patch lint
|
|
6
6
|
* rules (duplicate /dev/null creation, forward imports). Does not run
|
|
7
|
-
* `planExport` per patch
|
|
7
|
+
* `planExport` per patch. That is out of scope because it
|
|
8
8
|
* would couple verify to engine state and make the command too slow to be
|
|
9
9
|
* useful as a pre-flight gate. Engine-level patch application issues are
|
|
10
10
|
* still covered by the existing `fireforge doctor` and `fireforge import`
|
|
@@ -35,7 +35,7 @@ export interface PatchQueueHealth {
|
|
|
35
35
|
export declare function collectPatchQueueHealth(projectRoot: string): Promise<PatchQueueHealth>;
|
|
36
36
|
/**
|
|
37
37
|
* Runs the `verify` command: manifest consistency + cross-patch lint.
|
|
38
|
-
* Read-only
|
|
38
|
+
* Read-only. Exits non-zero on any error-severity finding.
|
|
39
39
|
*
|
|
40
40
|
* @param projectRoot - Project root directory
|
|
41
41
|
*/
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge verify
|
|
3
|
+
* `fireforge verify`: read-only fsck for the patch queue.
|
|
4
4
|
*
|
|
5
5
|
* Combines the manifest consistency check (orphan files, missing entries,
|
|
6
6
|
* files-affected mismatch, duplicate entries) with the cross-patch lint
|
|
7
7
|
* rules (duplicate /dev/null creation, forward imports). Does not run
|
|
8
|
-
* `planExport` per patch
|
|
8
|
+
* `planExport` per patch. That is out of scope because it
|
|
9
9
|
* would couple verify to engine state and make the command too slow to be
|
|
10
10
|
* useful as a pre-flight gate. Engine-level patch application issues are
|
|
11
11
|
* still covered by the existing `fireforge doctor` and `fireforge import`
|
|
@@ -34,16 +34,16 @@ import { info, intro, outro, success, warn } from '../utils/logger.js';
|
|
|
34
34
|
/**
|
|
35
35
|
* Walks each patch body in the manifest, extracts the set of
|
|
36
36
|
* component-shaped registration references it adds (widget paths
|
|
37
|
-
* implied by jar.mn + customElements.js
|
|
37
|
+
* implied by jar.mn + customElements.js, and FTL paths implied by locale
|
|
38
38
|
* jar.mn), and confirms every reference is either created by some
|
|
39
|
-
* patch in the queue
|
|
40
|
-
* unreachable reference is a dangling-registration error
|
|
39
|
+
* patch in the queue or present as a tracked file in engine/. Any
|
|
40
|
+
* unreachable reference is a dangling-registration error: the patch
|
|
41
41
|
* registers a file that nothing in the world supplies, which fails at
|
|
42
42
|
* install time.
|
|
43
43
|
*/
|
|
44
44
|
async function detectDanglingRegistrations(patchesDir, engineDir, patches) {
|
|
45
45
|
// Aggregate the set of all paths any patch in the queue is responsible for
|
|
46
|
-
// (per `filesAffected`). Individual patch bodies are deliberately
|
|
46
|
+
// (per `filesAffected`). Individual patch bodies are deliberately not
|
|
47
47
|
// parsed for new-file creations here: `filesAffected` is already the
|
|
48
48
|
// contract manifest callers rely on, and
|
|
49
49
|
// `validatePatchesManifestConsistency` has already ensured the two are in
|
|
@@ -65,7 +65,7 @@ async function detectDanglingRegistrations(patchesDir, engineDir, patches) {
|
|
|
65
65
|
}
|
|
66
66
|
catch {
|
|
67
67
|
// Bad file read is surfaced by the manifest consistency check
|
|
68
|
-
// already
|
|
68
|
+
// already. Skipping here avoids double-reporting the same issue.
|
|
69
69
|
continue;
|
|
70
70
|
}
|
|
71
71
|
const refs = collectPatchRegistrationReferences(body);
|
|
@@ -77,7 +77,7 @@ async function detectDanglingRegistrations(patchesDir, engineDir, patches) {
|
|
|
77
77
|
// Engine existence check: if the target file is already present in
|
|
78
78
|
// engine/ (upstream Firefox ships it, or a separate baseline branch
|
|
79
79
|
// has it), the registration is not dangling. "Is this tracked by git"
|
|
80
|
-
// cannot be probed without a git round-trip
|
|
80
|
+
// cannot be probed without a git round-trip. Existence on disk is a
|
|
81
81
|
// close-enough proxy for verify's read-only context.
|
|
82
82
|
if (await pathExists(join(engineDir, ref.targetPath)))
|
|
83
83
|
continue;
|
|
@@ -170,7 +170,7 @@ export async function collectPatchQueueHealth(projectRoot) {
|
|
|
170
170
|
}
|
|
171
171
|
// Engine-aware module-resolution preflight. The queue-level
|
|
172
172
|
// `unregistered-system-module` rule only sees modules a patch NEWLY
|
|
173
|
-
// CREATES
|
|
173
|
+
// CREATES. This asks the same question of the engine, so an import ADDED
|
|
174
174
|
// to an existing module is named as text instead of surfacing later as a
|
|
175
175
|
// bare `xpcshell return code: -11` with zero output.
|
|
176
176
|
if (await pathExists(paths.engine)) {
|
|
@@ -253,7 +253,7 @@ export async function collectPatchQueueHealth(projectRoot) {
|
|
|
253
253
|
}
|
|
254
254
|
/**
|
|
255
255
|
* Runs the `verify` command: manifest consistency + cross-patch lint.
|
|
256
|
-
* Read-only
|
|
256
|
+
* Read-only. Exits non-zero on any error-severity finding.
|
|
257
257
|
*
|
|
258
258
|
* @param projectRoot - Project root directory
|
|
259
259
|
*/
|
|
@@ -17,7 +17,7 @@ const WATCHMAN_PROBE_TIMEOUT_MS = 5000;
|
|
|
17
17
|
* in PATH but cannot respond (corrupt install, server crashed mid-session,
|
|
18
18
|
* permission denied on the state directory) would otherwise surface as a
|
|
19
19
|
* confusing mid-watch failure. Returns the trimmed version string when
|
|
20
|
-
* the probe succeeds
|
|
20
|
+
* the probe succeeds. Throws a {@link GeneralError} with actionable
|
|
21
21
|
* remediation when it does not.
|
|
22
22
|
*/
|
|
23
23
|
async function probeWatchman() {
|
|
@@ -64,7 +64,7 @@ function hasWatchPermissionFailure(output) {
|
|
|
64
64
|
*
|
|
65
65
|
* @param exitCode - Exit code returned by `mach watch`
|
|
66
66
|
* @param watchmanPath - Optional absolute path to the resolved watchman
|
|
67
|
-
* binary
|
|
67
|
+
* binary, surfaced in the guidance so the operator can see whether
|
|
68
68
|
* FireForge actually found one.
|
|
69
69
|
* @returns User-facing failure guidance
|
|
70
70
|
*/
|
|
@@ -106,10 +106,10 @@ export async function watchCommand(projectRoot) {
|
|
|
106
106
|
// Check if engine exists
|
|
107
107
|
await assertEngineExists(paths.engine);
|
|
108
108
|
// Resolve the watchman binary to an absolute path up-front so we can (a)
|
|
109
|
-
// refuse fast when it is missing
|
|
109
|
+
// refuse fast when it is missing and (b) prepend its directory to the mach
|
|
110
110
|
// subprocess PATH. On macOS, `which watchman` from an interactive shell
|
|
111
111
|
// returns `/opt/homebrew/bin/watchman`, but the Node subprocess PATH
|
|
112
|
-
// frequently omits `/opt/homebrew/bin
|
|
112
|
+
// frequently omits `/opt/homebrew/bin`, so the shell probe passes and
|
|
113
113
|
// mach's `watch-project` call then times out on its own failed PATH
|
|
114
114
|
// lookup. Threading the directory through the subprocess env fixes it.
|
|
115
115
|
const watchmanPath = await findExecutable('watchman');
|
|
@@ -117,7 +117,7 @@ export async function watchCommand(projectRoot) {
|
|
|
117
117
|
throw new GeneralError('Watch mode requires watchman to be installed and available in PATH.\n\n' +
|
|
118
118
|
'Install watchman first, then rerun "fireforge watch".');
|
|
119
119
|
}
|
|
120
|
-
// Verify watchman actually responds
|
|
120
|
+
// Verify watchman actually responds: a binary that is in PATH but
|
|
121
121
|
// unable to respond (broken install, crashed server, bad state dir
|
|
122
122
|
// permissions) would otherwise surface as a confusing mid-build failure
|
|
123
123
|
// instead of an actionable preflight error.
|
|
@@ -125,7 +125,7 @@ export async function watchCommand(projectRoot) {
|
|
|
125
125
|
// Check for build artifacts before starting watch
|
|
126
126
|
// The mismatch rung rejects copied or relocated obj-* dirs whose mozinfo
|
|
127
127
|
// metadata (topsrcdir, topobjdir, mozconfig) still points at a different
|
|
128
|
-
// source tree
|
|
128
|
+
// source tree. mach watch against stale metadata produces confusing errors.
|
|
129
129
|
const buildCheck = await hasBuildArtifacts(paths.engine);
|
|
130
130
|
assertBuildArtifacts(paths.engine, buildCheck, {
|
|
131
131
|
label: 'Watch mode',
|
|
@@ -136,7 +136,7 @@ export async function watchCommand(projectRoot) {
|
|
|
136
136
|
// Report bundle state alongside the "Using build artifacts..." banner
|
|
137
137
|
// so an operator watching a mid-build tree can see why `fireforge run`
|
|
138
138
|
// would refuse right now while watch is still going. Watch remains
|
|
139
|
-
// permissive (it exists to drive rebuilds)
|
|
139
|
+
// permissive (it exists to drive rebuilds), so this is informational.
|
|
140
140
|
// The `hasBuildArtifacts` check already passed at this point, so
|
|
141
141
|
// `objDir` is always defined.
|
|
142
142
|
const bundleCheck = buildCheck.objDir
|
|
@@ -148,7 +148,7 @@ export async function watchCommand(projectRoot) {
|
|
|
148
148
|
info(`Using build artifacts from ${buildCheck.objDir}/${bundleSuffix}`);
|
|
149
149
|
// Advisory: warn when Furnace components have drifted since the last
|
|
150
150
|
// apply so the user doesn't launch watch-mode builds with stale
|
|
151
|
-
// components baked in. Mirrors the check in `fireforge run
|
|
151
|
+
// components baked in. Mirrors the check in `fireforge run`: without
|
|
152
152
|
// it, users editing a component then running `watch` would see their
|
|
153
153
|
// change never surface in the rebuilt browser.
|
|
154
154
|
await warnIfFurnaceStale(projectRoot);
|
|
@@ -173,7 +173,7 @@ export async function watchCommand(projectRoot) {
|
|
|
173
173
|
const watchmanDir = dirname(watchmanPath);
|
|
174
174
|
const existingPath = process.env['PATH'] ?? '';
|
|
175
175
|
const pathSegments = existingPath.split(delimiter).filter((segment) => segment.length > 0);
|
|
176
|
-
// Both arms filter identically
|
|
176
|
+
// Both arms filter identically. The cast this replaced laundered
|
|
177
177
|
// `string | undefined` on one arm while the other built the annotated shape
|
|
178
178
|
// honestly.
|
|
179
179
|
const baseEnv = {};
|
|
@@ -197,8 +197,8 @@ export async function watchCommand(projectRoot) {
|
|
|
197
197
|
}
|
|
198
198
|
// On Ctrl+C the bin signal handler now waits for the mach child to shut
|
|
199
199
|
// down (waitForActiveChildShutdown) before exiting, so this continuation
|
|
200
|
-
// can run and whitelist the SIGINT exit code
|
|
201
|
-
// win the race and terminate first
|
|
200
|
+
// can run and whitelist the SIGINT exit code, though the bin may still
|
|
201
|
+
// win the race and terminate first. Both outcomes are acceptable.
|
|
202
202
|
if (result.exitCode !== 0 && result.exitCode !== 130) {
|
|
203
203
|
const combinedOutput = `${result.stdout}\n${result.stderr}`;
|
|
204
204
|
if (hasConfigureTimeWatchmanFailure(combinedOutput)) {
|
|
@@ -20,8 +20,8 @@ function printWireDryRun(engineDir, name, subscriptDir, domFilePath, domTargetPa
|
|
|
20
20
|
info(` source: ${subscriptDir}/${name}.js`);
|
|
21
21
|
info(` browser-main.js: loadSubScript("chrome://browser/content/${name}.js")`);
|
|
22
22
|
if (options.init) {
|
|
23
|
-
// Show the coerced form so the preview matches the emitted block
|
|
24
|
-
//
|
|
23
|
+
// Show the coerced form so the preview matches the emitted block.
|
|
24
|
+
// Echoing the raw input ("X.init") does not reflect that the real run
|
|
25
25
|
// writes `X.init();` to browser-init.js.
|
|
26
26
|
info(` browser-init.js: ${coerceToCall(options.init)}`);
|
|
27
27
|
}
|
|
@@ -42,11 +42,11 @@ function printWireDryRun(engineDir, name, subscriptDir, domFilePath, domTargetPa
|
|
|
42
42
|
* Preference order:
|
|
43
43
|
* 1. `--target <path>` CLI flag (explicit caller intent)
|
|
44
44
|
* 2. First entry of `furnace.json.tokenHostDocuments` (fork-configured
|
|
45
|
-
* chrome doc list
|
|
45
|
+
* chrome doc list, already consumed by the missing-token-link
|
|
46
46
|
* validator and the doctor check)
|
|
47
47
|
* 3. `browser/base/content/browser.xhtml` (upstream default)
|
|
48
48
|
*
|
|
49
|
-
* Step 2 is silent
|
|
49
|
+
* Step 2 is silent: a missing or invalid furnace.json falls through to the
|
|
50
50
|
* upstream default rather than surfacing a warning, because forks that don't
|
|
51
51
|
* use furnace shouldn't have to configure anything.
|
|
52
52
|
*/
|
|
@@ -63,7 +63,7 @@ async function resolveDomTargetPath(projectRoot, explicit) {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
catch {
|
|
66
|
-
// Fall through to default
|
|
66
|
+
// Fall through to the default. A broken furnace.json should not block
|
|
67
67
|
// the wire command. The doctor surfaces that issue separately.
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -85,7 +85,7 @@ function validateWireName(name) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
|
-
* Asserts that the resolved chrome document both exists on disk
|
|
88
|
+
* Asserts that the resolved chrome document both exists on disk and exposes
|
|
89
89
|
* an insertion anchor (`#include browser-sets.inc` or `<html:body>`) that
|
|
90
90
|
* `addDomFragment` can splice into. Fires in dry-run and real-run mode
|
|
91
91
|
* alike, so the preview and execution agree on whether the target is
|
|
@@ -146,7 +146,7 @@ async function ensureSubscriptSourceExists(projectRoot, subscriptDir, name, dryR
|
|
|
146
146
|
/**
|
|
147
147
|
* Validates the `--dom` fragment argument and computes its engine-root-
|
|
148
148
|
* relative path. Accepts absolute, repo-root-relative (`engine/...`), and
|
|
149
|
-
* engine-relative inputs
|
|
149
|
+
* engine-relative inputs. Rejects missing files and paths escaping
|
|
150
150
|
* engine/. Returns undefined when `--dom` was not supplied.
|
|
151
151
|
*/
|
|
152
152
|
async function resolveDomFragmentPath(projectRoot, dom) {
|
|
@@ -278,10 +278,10 @@ export async function wireCommand(projectRoot, name, options = {}) {
|
|
|
278
278
|
// --after and have it forwarded unchanged to the lookup layer.
|
|
279
279
|
validateWireName(options.after);
|
|
280
280
|
}
|
|
281
|
-
// Validate init/destroy expressions
|
|
281
|
+
// Validate init/destroy expressions before the dry-run/real fork so both
|
|
282
282
|
// paths enforce the same contract. Validating only inside
|
|
283
|
-
// `addInitToBrowserInit`/`addDestroyToBrowserInit`
|
|
284
|
-
// path
|
|
283
|
+
// `addInitToBrowserInit`/`addDestroyToBrowserInit` (the real-execution
|
|
284
|
+
// path) lets `--dry-run --init 'void 0'` succeed and render a plausible
|
|
285
285
|
// preview even though the real run rejects the same arguments.
|
|
286
286
|
if (options.init !== undefined) {
|
|
287
287
|
validateWireExpression(options.init, 'init expression');
|
|
@@ -293,8 +293,8 @@ export async function wireCommand(projectRoot, name, options = {}) {
|
|
|
293
293
|
const subscriptDir = await resolveWireSubscriptDir(projectRoot, options);
|
|
294
294
|
const domFilePath = await resolveDomFragmentPath(projectRoot, options.dom);
|
|
295
295
|
// Resolve the chrome document the `#include` directive will land in. Only
|
|
296
|
-
// consulted when `--dom` is supplied
|
|
297
|
-
// plan can print the target accurately.
|
|
296
|
+
// consulted when `--dom` is supplied, but resolved here anyway so the
|
|
297
|
+
// dry-run plan can print the target accurately.
|
|
298
298
|
//
|
|
299
299
|
// `stripEnginePrefix` is applied so
|
|
300
300
|
// `--target engine/browser/base/browser.xhtml` and
|
|
@@ -317,7 +317,7 @@ export async function wireCommand(projectRoot, name, options = {}) {
|
|
|
317
317
|
// setup scripts rely on.
|
|
318
318
|
//
|
|
319
319
|
// The check stays advisory rather than fatal in dry-run because
|
|
320
|
-
// "wire first, create file after" is a legitimate use of preview
|
|
320
|
+
// "wire first, create file after" is a legitimate use of preview. But a
|
|
321
321
|
// dry-run over a typo would otherwise produce a plausible plan and the
|
|
322
322
|
// real command then refuse with `Subscript file not found`. The info line
|
|
323
323
|
// surfaces the mismatch in preview mode.
|
|
@@ -4,7 +4,7 @@ import { walk } from 'estree-walker';
|
|
|
4
4
|
/**
|
|
5
5
|
* An ESTree node augmented with acorn's character-offset positions.
|
|
6
6
|
* At runtime `acorn.parse` produces objects that carry both the ESTree
|
|
7
|
-
* shape
|
|
7
|
+
* shape and `start`/`end` indices, but the type system doesn't know that.
|
|
8
8
|
* This intersection type bridges the gap so we can safely use both APIs.
|
|
9
9
|
*/
|
|
10
10
|
export type AcornESTreeNode<T extends estree.Node = estree.Node> = T & {
|
|
@@ -12,7 +12,7 @@ export type AcornESTreeNode<T extends estree.Node = estree.Node> = T & {
|
|
|
12
12
|
end: number;
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
15
|
-
* Parse JavaScript source as a
|
|
15
|
+
* Parse JavaScript source as a script, not an ES module.
|
|
16
16
|
* All Mozilla chrome JS files (`browser-main.js`, `browser-init.js`,
|
|
17
17
|
* `customElements.js`, etc.) are scripts that run in a privileged scope.
|
|
18
18
|
*
|
|
@@ -22,7 +22,7 @@ export type AcornESTreeNode<T extends estree.Node = estree.Node> = T & {
|
|
|
22
22
|
*/
|
|
23
23
|
export declare function parseScript(content: string, onComment?: acorn.Comment[]): AcornESTreeNode<estree.Program>;
|
|
24
24
|
/**
|
|
25
|
-
* Parse JavaScript source as an
|
|
25
|
+
* Parse JavaScript source as an ES module.
|
|
26
26
|
* Used for `.sys.mjs` files which use static import/export syntax.
|
|
27
27
|
*
|
|
28
28
|
* @param content - Source text to parse
|
|
@@ -34,12 +34,12 @@ export declare function parseModule(content: string, onComment?: acorn.Comment[]
|
|
|
34
34
|
* Convenience cast from `acorn.Node` (or the generic ESTree union returned
|
|
35
35
|
* by estree-walker callbacks) to a positioned, narrowly-typed node.
|
|
36
36
|
*
|
|
37
|
-
*
|
|
38
|
-
* This performs no runtime check
|
|
39
|
-
* offsets to a node the caller has
|
|
37
|
+
* Caller obligation: you must already have discriminated on `node.type`.
|
|
38
|
+
* This performs no runtime check. It exists to attach acorn's `start`/`end`
|
|
39
|
+
* offsets to a node the caller has already narrowed, typically inside an
|
|
40
40
|
* `if (node.type === 'CallExpression')` branch or an equivalent walker
|
|
41
41
|
* guard. Calling it on an undiscriminated node produces a value whose type
|
|
42
|
-
* is
|
|
42
|
+
* is wrong.
|
|
43
43
|
*
|
|
44
44
|
* No runtime `type` assertion: every call site sits in the hot loop of a lint
|
|
45
45
|
* or registration walker and is already post-narrowing, so the check would
|