@hominis/fireforge 0.45.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 +409 -446
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +21 -15
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +46 -0
- package/dist/src/cli-usage-error.js +81 -0
- package/dist/src/cli.d.ts +7 -2
- package/dist/src/cli.js +47 -47
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +3 -4
- package/dist/src/commands/build.js +27 -17
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +19 -0
- package/dist/src/commands/destructive-decision.js +31 -0
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -10
- package/dist/src/commands/doctor-check-core.js +0 -8
- 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 -17
- package/dist/src/commands/doctor-orphaned-harness.js +14 -23
- 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 +3 -3
- 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 +3 -1
- package/dist/src/commands/doctor.js +15 -16
- package/dist/src/commands/download.js +50 -37
- package/dist/src/commands/export-all.js +29 -12
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +29 -59
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +12 -12
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +7 -13
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +4 -6
- package/dist/src/commands/export-shared.d.ts +51 -32
- package/dist/src/commands/export-shared.js +17 -32
- package/dist/src/commands/export.js +14 -5
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
- package/dist/src/commands/furnace/authoring-config.js +19 -0
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
- 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 +7 -12
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +6 -9
- 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 +31 -15
- package/dist/src/commands/furnace/create-templates.js +20 -19
- 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 +35 -29
- package/dist/src/commands/furnace/deploy.js +15 -6
- 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 +17 -16
- 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 +43 -34
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +15 -7
- package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
- package/dist/src/commands/furnace/remove-mutations.js +19 -19
- 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 +4 -8
- package/dist/src/commands/furnace/rename-browser-test.js +10 -15
- 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 +36 -36
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +19 -16
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
- package/dist/src/commands/furnace/test-file-name.js +39 -0
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/furnace/validation-output.d.ts +21 -9
- package/dist/src/commands/furnace/validation-output.js +3 -8
- package/dist/src/commands/import.js +22 -29
- package/dist/src/commands/lint-per-patch.d.ts +2 -2
- package/dist/src/commands/lint-per-patch.js +27 -12
- package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
- 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 +5 -4
- package/dist/src/commands/lint.js +36 -36
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/manifest.js +1 -1
- package/dist/src/commands/package.js +4 -6
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +19 -20
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +23 -33
- package/dist/src/commands/patch/entry-projection.d.ts +13 -0
- package/dist/src/commands/patch/entry-projection.js +24 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
- package/dist/src/commands/patch/lint-ignore.js +33 -44
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +29 -15
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +41 -37
- package/dist/src/commands/patch/move-files.js +5 -14
- 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 +35 -49
- package/dist/src/commands/patch/reorder.js +35 -48
- package/dist/src/commands/patch/split-plan.d.ts +7 -8
- package/dist/src/commands/patch/split-plan.js +10 -13
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +50 -48
- 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 +22 -28
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +20 -30
- package/dist/src/commands/patch-rename-map.d.ts +19 -0
- package/dist/src/commands/patch-rename-map.js +36 -0
- package/dist/src/commands/pending-resolution.d.ts +15 -0
- package/dist/src/commands/pending-resolution.js +25 -0
- package/dist/src/commands/re-export-adjacent.d.ts +25 -3
- package/dist/src/commands/re-export-adjacent.js +40 -24
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +23 -27
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +33 -33
- package/dist/src/commands/re-export-files.d.ts +2 -3
- package/dist/src/commands/re-export-files.js +52 -44
- package/dist/src/commands/re-export-lint.d.ts +29 -30
- package/dist/src/commands/re-export-lint.js +36 -29
- 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 +12 -9
- package/dist/src/commands/re-export-single.d.ts +23 -4
- package/dist/src/commands/re-export-single.js +39 -31
- package/dist/src/commands/re-export.js +35 -17
- package/dist/src/commands/rebase/abort.js +9 -14
- package/dist/src/commands/rebase/continue.js +20 -19
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +5 -5
- package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
- package/dist/src/commands/rebase/patch-loop.js +20 -24
- 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 +21 -13
- package/dist/src/commands/run.d.ts +0 -13
- package/dist/src/commands/run.js +38 -51
- package/dist/src/commands/setup-support.d.ts +16 -4
- package/dist/src/commands/setup-support.js +20 -20
- package/dist/src/commands/setup.js +4 -10
- package/dist/src/commands/source.js +9 -2
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +6 -6
- 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 +5 -5
- 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 +25 -26
- package/dist/src/commands/test-build-phase.d.ts +3 -3
- package/dist/src/commands/test-build-phase.js +48 -24
- 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 +4 -4
- package/dist/src/commands/test-modes.js +4 -5
- package/dist/src/commands/test-register.js +5 -3
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +40 -33
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +17 -17
- package/dist/src/commands/test-verdict.d.ts +19 -5
- package/dist/src/commands/test-verdict.js +26 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +73 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.d.ts +26 -0
- package/dist/src/commands/token-list.js +153 -0
- package/dist/src/commands/token.js +26 -10
- package/dist/src/commands/tree.js +26 -21
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +16 -16
- 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 +17 -16
- 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 -12
- package/dist/src/core/branding.js +6 -5
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +10 -7
- package/dist/src/core/build-audit-platform.d.ts +32 -3
- package/dist/src/core/build-audit-platform.js +153 -13
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +10 -9
- 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 +57 -0
- package/dist/src/core/build-audit-skip.js +112 -0
- 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 +21 -8
- package/dist/src/core/build-audit.js +142 -40
- 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 +48 -31
- package/dist/src/core/build-baseline.js +20 -43
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +18 -17
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +14 -14
- package/dist/src/core/build-prepare.d.ts +4 -12
- package/dist/src/core/build-prepare.js +22 -26
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-paths.d.ts +2 -6
- package/dist/src/core/config-paths.js +4 -2
- package/dist/src/core/config-state.d.ts +0 -6
- package/dist/src/core/config-state.js +3 -21
- package/dist/src/core/config-validate-build-audit.d.ts +8 -0
- package/dist/src/core/config-validate-build-audit.js +80 -0
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +3 -3
- package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
- package/dist/src/core/config-validate-patch-policy.js +3 -3
- package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
- package/dist/src/core/config-validate-test-toolchains.js +4 -5
- package/dist/src/core/config-validate.js +22 -12
- package/dist/src/core/config.d.ts +12 -12
- package/dist/src/core/config.js +21 -25
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +20 -20
- 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 +22 -23
- 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 +5 -13
- package/dist/src/core/engine-precondition.js +5 -10
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +50 -54
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock-owner.d.ts +103 -0
- package/dist/src/core/file-lock-owner.js +259 -0
- package/dist/src/core/file-lock.d.ts +14 -19
- package/dist/src/core/file-lock.js +90 -128
- package/dist/src/core/firefox-cache.d.ts +13 -1
- package/dist/src/core/firefox-cache.js +61 -36
- package/dist/src/core/firefox-download.d.ts +15 -0
- package/dist/src/core/firefox-download.js +38 -22
- package/dist/src/core/firefox-extract.d.ts +8 -7
- package/dist/src/core/firefox-extract.js +45 -27
- package/dist/src/core/firefox.d.ts +34 -36
- package/dist/src/core/firefox.js +13 -44
- package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
- package/dist/src/core/furnace-apply-dry-run.js +2 -8
- 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 -20
- package/dist/src/core/furnace-apply-helpers.js +28 -39
- 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 +13 -11
- 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 +4 -4
- package/dist/src/core/furnace-apply.js +50 -29
- 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 +5 -5
- package/dist/src/core/furnace-config.js +40 -53
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +9 -8
- 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 +20 -0
- package/dist/src/core/furnace-dir-entry.js +21 -0
- 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 +22 -19
- package/dist/src/core/furnace-operation.js +38 -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.d.ts +18 -6
- package/dist/src/core/furnace-refresh.js +5 -8
- package/dist/src/core/furnace-registration-ast.d.ts +2 -3
- package/dist/src/core/furnace-registration-ast.js +9 -12
- 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 +7 -6
- package/dist/src/core/furnace-registration.js +29 -36
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-scanner.js +3 -6
- 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 +12 -12
- 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 +18 -20
- 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 +6 -4
- package/dist/src/core/git-base.js +29 -7
- package/dist/src/core/git-diff-new-file.d.ts +40 -0
- package/dist/src/core/git-diff-new-file.js +119 -0
- package/dist/src/core/git-diff.d.ts +13 -13
- package/dist/src/core/git-diff.js +121 -189
- package/dist/src/core/git-file-ops.d.ts +6 -13
- package/dist/src/core/git-file-ops.js +11 -35
- package/dist/src/core/git-readonly-index.d.ts +12 -14
- package/dist/src/core/git-readonly-index.js +12 -16
- package/dist/src/core/git-status.d.ts +9 -2
- package/dist/src/core/git-status.js +23 -11
- package/dist/src/core/git.d.ts +3 -9
- package/dist/src/core/git.js +28 -57
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +28 -27
- package/dist/src/core/history-log.d.ts +19 -0
- package/dist/src/core/history-log.js +29 -0
- 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 -10
- package/dist/src/core/mach-error-hints.js +14 -14
- package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
- package/dist/src/core/mach-known-noise-filter.js +57 -56
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +17 -16
- package/dist/src/core/mach-python.d.ts +3 -0
- package/dist/src/core/mach-python.js +13 -7
- package/dist/src/core/mach-resource-shim.d.ts +24 -12
- package/dist/src/core/mach-resource-shim.js +124 -21
- package/dist/src/core/mach.d.ts +59 -73
- package/dist/src/core/mach.js +47 -115
- package/dist/src/core/marionette-port.d.ts +15 -30
- package/dist/src/core/marionette-port.js +46 -89
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +32 -50
- 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 +17 -17
- 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 +46 -42
- 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 +13 -13
- package/dist/src/core/patch-apply.d.ts +13 -14
- package/dist/src/core/patch-apply.js +36 -42
- package/dist/src/core/patch-export-coverage.d.ts +0 -9
- package/dist/src/core/patch-export-coverage.js +1 -30
- package/dist/src/core/patch-export-update.d.ts +21 -4
- package/dist/src/core/patch-export-update.js +7 -6
- package/dist/src/core/patch-export.d.ts +20 -30
- package/dist/src/core/patch-export.js +55 -77
- package/dist/src/core/patch-files.d.ts +0 -4
- package/dist/src/core/patch-files.js +0 -11
- 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 +12 -18
- package/dist/src/core/patch-lint-cache.d.ts +18 -2
- package/dist/src/core/patch-lint-cache.js +16 -19
- package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
- package/dist/src/core/patch-lint-checkjs.js +78 -64
- 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 +5 -9
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +27 -19
- package/dist/src/core/patch-lint-cross.js +67 -110
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +15 -11
- 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 +6 -6
- package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
- package/dist/src/core/patch-lint-forward-registration.js +210 -0
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +46 -46
- package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
- 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 +7 -7
- package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
- package/dist/src/core/patch-lint-queue-types.js +12 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
- package/dist/src/core/patch-lint-staged-registration.js +90 -0
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +41 -35
- package/dist/src/core/patch-lint.js +52 -49
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +11 -11
- 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 +35 -34
- 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 +32 -21
- package/dist/src/core/patch-parse.js +40 -15
- package/dist/src/core/patch-policy.js +15 -27
- 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-source-metadata.d.ts +1 -3
- package/dist/src/core/patch-source-metadata.js +0 -4
- package/dist/src/core/patch-transform.d.ts +8 -16
- package/dist/src/core/patch-transform.js +13 -23
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +6 -6
- package/dist/src/core/rebase-session.d.ts +9 -15
- package/dist/src/core/rebase-session.js +13 -25
- package/dist/src/core/register-browser-content.js +3 -2
- package/dist/src/core/register-browser-test.js +2 -1
- package/dist/src/core/register-module.js +2 -1
- package/dist/src/core/register-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 +8 -7
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +6 -5
- 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 +38 -0
- package/dist/src/core/run-log-redact.js +69 -0
- package/dist/src/core/run-log.d.ts +21 -10
- package/dist/src/core/run-log.js +76 -27
- 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 +4 -6
- package/dist/src/core/smoke-patterns.d.ts +5 -6
- package/dist/src/core/smoke-patterns.js +15 -20
- package/dist/src/core/state-file.d.ts +15 -4
- package/dist/src/core/state-file.js +14 -1
- 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 +13 -12
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +40 -25
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +69 -69
- 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 -23
- package/dist/src/core/test-stale-check.js +31 -30
- 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/test-xpcshell-retry.d.ts +26 -7
- package/dist/src/core/test-xpcshell-retry.js +14 -11
- package/dist/src/core/token-category.d.ts +35 -2
- package/dist/src/core/token-category.js +67 -58
- 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 +13 -25
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +56 -0
- package/dist/src/core/token-inventory.js +109 -0
- package/dist/src/core/token-manager.d.ts +4 -4
- package/dist/src/core/token-manager.js +22 -22
- 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 +52 -53
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +23 -23
- package/dist/src/core/tree-cow.d.ts +3 -5
- package/dist/src/core/tree-cow.js +8 -8
- 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 +39 -38
- 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 +33 -33
- 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 +12 -23
- 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 +16 -28
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +28 -30
- 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 +69 -16
- package/dist/src/errors/base.js +95 -26
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +26 -34
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/config.d.ts +0 -14
- package/dist/src/errors/config.js +13 -34
- package/dist/src/errors/download.d.ts +13 -0
- package/dist/src/errors/download.js +53 -24
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/furnace.js +8 -9
- package/dist/src/errors/git.d.ts +9 -9
- package/dist/src/errors/git.js +21 -31
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +11 -13
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +8 -8
- 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 +155 -200
- 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 +52 -19
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/index.d.ts +0 -1
- 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 +4 -16
- package/dist/src/utils/assert.js +7 -24
- package/dist/src/utils/build-info.d.ts +6 -6
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +7 -6
- 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 +10 -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 +15 -20
- package/dist/src/utils/hash.d.ts +12 -0
- package/dist/src/utils/hash.js +16 -0
- package/dist/src/utils/line-dispatch.d.ts +15 -0
- package/dist/src/utils/line-dispatch.js +48 -0
- package/dist/src/utils/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 +14 -20
- package/dist/src/utils/options.js +26 -27
- package/dist/src/utils/package-root.js +5 -14
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/platform.d.ts +0 -4
- package/dist/src/utils/process-group.d.ts +10 -9
- package/dist/src/utils/process-group.js +37 -36
- package/dist/src/utils/process.d.ts +70 -55
- package/dist/src/utils/process.js +129 -179
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +9 -9
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +26 -0
- package/dist/src/utils/sleep.js +31 -0
- 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 +12 -49
- package/dist/src/utils/validation.js +26 -36
- package/docs/README.md +2 -2
- package/docs/configuration.md +163 -69
- package/docs/exit-codes.md +66 -49
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +414 -247
- package/docs/machine-output.md +58 -34
- package/docs/patch-workflow.md +48 -44
- package/docs/run-logs.md +72 -28
- package/docs/testing.md +105 -98
- package/docs/verification-trees.md +23 -22
- package/package.json +7 -6
- package/dist/src/commands/rebase.d.ts +0 -4
- package/dist/src/commands/rebase.js +0 -5
- package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
- package/dist/src/core/patch-artifact-normalize.js +0 -24
- package/dist/src/core/patch-lint-reexports.d.ts +0 -7
- package/dist/src/core/patch-lint-reexports.js +0 -8
- package/dist/src/core/wire-targets.d.ts +0 -7
- package/dist/src/core/wire-targets.js +0 -8
|
@@ -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,17 +280,17 @@ 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) {
|
|
293
|
-
throw new GeneralError(`tree exec: fireforge ${args.join(' ')} exited with code ${
|
|
293
|
+
throw new GeneralError(`tree exec: fireforge ${args.join(' ')} exited with code ${exitCode}.`);
|
|
294
294
|
}
|
|
295
295
|
}
|
|
296
296
|
/** Registers the tree command group on the CLI program. */
|
|
@@ -298,7 +298,12 @@ export function registerTree(program, context) {
|
|
|
298
298
|
const { getProjectRoot, withErrorHandling } = context;
|
|
299
299
|
const tree = program
|
|
300
300
|
.command('tree')
|
|
301
|
-
.description('Manage copy-on-write verification clones of this project for concurrent read-mostly work (lint, typecheck, status, verify, export/re-export --dry-run; build-less test with create --with-objdir). Mutation commands are refused inside a tree.')
|
|
301
|
+
.description('Manage copy-on-write verification clones of this project for concurrent read-mostly work (lint, typecheck, status, verify, export/re-export --dry-run; build-less test with create --with-objdir). Mutation commands are refused inside a tree.')
|
|
302
|
+
// No-subcommand contract shared with `patch`/`token`/`furnace`: help on
|
|
303
|
+
// stdout, exit 0 (see `handleParseError` for the groups without an action).
|
|
304
|
+
.action(() => {
|
|
305
|
+
tree.outputHelp();
|
|
306
|
+
});
|
|
302
307
|
addWaitLockOption(tree
|
|
303
308
|
.command('create <name>')
|
|
304
309
|
.description('Clone the project (engine included, obj-* excluded) into .fireforge/trees/<name> using filesystem copy-on-write (APFS clonefile / btrfs-XFS reflink). Refuses on filesystems without CoW support unless --force-copy explicitly accepts a full physical copy.')
|
|
@@ -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) {
|
|
@@ -57,8 +57,8 @@ export function resolveTypecheckProjects(configTypecheck, override) {
|
|
|
57
57
|
*/
|
|
58
58
|
function formatIssue(projectRoot, issue) {
|
|
59
59
|
const file = relativeForDisplay(projectRoot, issue.file);
|
|
60
|
-
const codeLabel = issue.code > 0 ? ` TS${
|
|
61
|
-
return `[${issue.project}] ${file}:${
|
|
60
|
+
const codeLabel = issue.code > 0 ? ` TS${issue.code}` : '';
|
|
61
|
+
return `[${issue.project}] ${file}:${issue.line}:${issue.column}${codeLabel} ${issue.message}`;
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
64
|
* Top-level entry point invoked by the registered Commander action.
|
|
@@ -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);
|
|
@@ -87,7 +87,7 @@ async function runTypecheckCommandBody(projectRoot, options) {
|
|
|
87
87
|
// session never touched. Run the same reconciler `furnace deploy`/`sync`
|
|
88
88
|
// use so typecheck checks against the current workspace.
|
|
89
89
|
await regenerateStaleGeneratedJsconfig(projectRoot);
|
|
90
|
-
info(`Running typecheck across ${
|
|
90
|
+
info(`Running typecheck across ${cfg.projects.length} project(s): ${cfg.projects.join(', ')}`);
|
|
91
91
|
const results = await runTypecheck(projectRoot, cfg);
|
|
92
92
|
// Fold the EXPORT-TIME authority into this pass. Per-patch lint runs
|
|
93
93
|
// checkJs over the queue's patch-owned modules in relative isolation and
|
|
@@ -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.
|
|
@@ -139,8 +139,8 @@ async function regenerateStaleGeneratedJsconfig(projectRoot) {
|
|
|
139
139
|
if (!drift.changed)
|
|
140
140
|
return;
|
|
141
141
|
info(`Regenerating stale generated jsconfig ${furnaceConfig.typecheckJsconfig} before typecheck ` +
|
|
142
|
-
`(+${
|
|
143
|
-
`-${
|
|
142
|
+
`(+${drift.added.length} added, ~${drift.updated.length} updated, ` +
|
|
143
|
+
`-${drift.pruned.length} pruned).`);
|
|
144
144
|
await syncFurnaceJsconfigPaths(projectRoot, furnaceConfig);
|
|
145
145
|
}
|
|
146
146
|
/**
|
|
@@ -171,10 +171,10 @@ export function reportResults(projectRoot, results, patchLintIssues = []) {
|
|
|
171
171
|
for (const issue of errors)
|
|
172
172
|
warn(formatIssue(projectRoot, issue));
|
|
173
173
|
}
|
|
174
|
-
const summary = `Typecheck: ${
|
|
175
|
-
`${
|
|
174
|
+
const summary = `Typecheck: ${totalErrors} error(s), ${totalWarnings} warning(s) across ` +
|
|
175
|
+
`${results.length} project(s)` +
|
|
176
176
|
(patchLintIssues.length > 0
|
|
177
|
-
? ` (including ${
|
|
177
|
+
? ` (including ${patchLintIssues.length} per-patch checkJs finding(s))`
|
|
178
178
|
: '');
|
|
179
179
|
if (totalErrors === 0) {
|
|
180
180
|
success(summary);
|
|
@@ -183,7 +183,7 @@ export function reportResults(projectRoot, results, patchLintIssues = []) {
|
|
|
183
183
|
}
|
|
184
184
|
info(summary);
|
|
185
185
|
outro('Typecheck failed');
|
|
186
|
-
throw new GeneralError(`Typecheck found ${
|
|
186
|
+
throw new GeneralError(`Typecheck found ${totalErrors} error(s) across ${results.length} project(s).`);
|
|
187
187
|
}
|
|
188
188
|
/**
|
|
189
189
|
* Registers the `typecheck` command on the CLI program.
|
|
@@ -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)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
import { join, relative } from 'node:path';
|
|
3
3
|
import { Command } from 'commander';
|
|
4
|
-
import { DEFAULT_BROWSER_SUBSCRIPT_DIR, wireSubscript } from '../core/browser-wire.js';
|
|
4
|
+
import { DEFAULT_BROWSER_SUBSCRIPT_DIR, wireSubscript, } from '../core/browser-wire.js';
|
|
5
5
|
import { getProjectPaths, loadConfig } from '../core/config.js';
|
|
6
6
|
import { furnaceConfigExists as checkFurnaceConfigExists, loadFurnaceConfig, } from '../core/furnace-config.js';
|
|
7
7
|
import { consumeParserFallbackEvents } from '../core/parser-fallback.js';
|
|
@@ -13,14 +13,15 @@ import { pathExists } from '../utils/fs.js';
|
|
|
13
13
|
import { info, intro, outro, success, warn } from '../utils/logger.js';
|
|
14
14
|
import { pickDefined } from '../utils/options.js';
|
|
15
15
|
import { isContainedRelativePath, isExplicitAbsolutePath, isPathInsideRoot, stripEnginePrefix, toRootRelativePath, } from '../utils/paths.js';
|
|
16
|
+
import { normalizePathSlashes } from '../utils/paths.js';
|
|
16
17
|
const BROWSER_BASE_DIR = 'browser/base';
|
|
17
18
|
function printWireDryRun(engineDir, name, subscriptDir, domFilePath, domTargetPath, options) {
|
|
18
19
|
info('[dry-run] Would wire subscript:');
|
|
19
20
|
info(` source: ${subscriptDir}/${name}.js`);
|
|
20
21
|
info(` browser-main.js: loadSubScript("chrome://browser/content/${name}.js")`);
|
|
21
22
|
if (options.init) {
|
|
22
|
-
// Show the coerced form so the preview matches the emitted block
|
|
23
|
-
//
|
|
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
|
|
24
25
|
// writes `X.init();` to browser-init.js.
|
|
25
26
|
info(` browser-init.js: ${coerceToCall(options.init)}`);
|
|
26
27
|
}
|
|
@@ -28,10 +29,10 @@ function printWireDryRun(engineDir, name, subscriptDir, domFilePath, domTargetPa
|
|
|
28
29
|
info(` browser-init.js onUnload(): ${coerceToCall(options.destroy)}`);
|
|
29
30
|
}
|
|
30
31
|
if (domFilePath) {
|
|
31
|
-
const includePath = relative(join(engineDir, subscriptDir), join(engineDir, domFilePath))
|
|
32
|
+
const includePath = normalizePathSlashes(relative(join(engineDir, subscriptDir), join(engineDir, domFilePath)));
|
|
32
33
|
info(` ${domTargetPath}: #include ${includePath}`);
|
|
33
34
|
}
|
|
34
|
-
const relPath = relative(join(engineDir, BROWSER_BASE_DIR), join(engineDir, subscriptDir))
|
|
35
|
+
const relPath = normalizePathSlashes(relative(join(engineDir, BROWSER_BASE_DIR), join(engineDir, subscriptDir)));
|
|
35
36
|
info(` jar.mn: content/browser/${name}.js (${relPath}/${name}.js)`);
|
|
36
37
|
outro('Dry run complete');
|
|
37
38
|
}
|
|
@@ -41,11 +42,11 @@ function printWireDryRun(engineDir, name, subscriptDir, domFilePath, domTargetPa
|
|
|
41
42
|
* Preference order:
|
|
42
43
|
* 1. `--target <path>` CLI flag (explicit caller intent)
|
|
43
44
|
* 2. First entry of `furnace.json.tokenHostDocuments` (fork-configured
|
|
44
|
-
* chrome doc list
|
|
45
|
+
* chrome doc list, already consumed by the missing-token-link
|
|
45
46
|
* validator and the doctor check)
|
|
46
47
|
* 3. `browser/base/content/browser.xhtml` (upstream default)
|
|
47
48
|
*
|
|
48
|
-
* Step 2 is silent
|
|
49
|
+
* Step 2 is silent: a missing or invalid furnace.json falls through to the
|
|
49
50
|
* upstream default rather than surfacing a warning, because forks that don't
|
|
50
51
|
* use furnace shouldn't have to configure anything.
|
|
51
52
|
*/
|
|
@@ -62,7 +63,7 @@ async function resolveDomTargetPath(projectRoot, explicit) {
|
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
65
|
catch {
|
|
65
|
-
// Fall through to default
|
|
66
|
+
// Fall through to the default. A broken furnace.json should not block
|
|
66
67
|
// the wire command. The doctor surfaces that issue separately.
|
|
67
68
|
}
|
|
68
69
|
}
|
|
@@ -84,7 +85,7 @@ function validateWireName(name) {
|
|
|
84
85
|
}
|
|
85
86
|
}
|
|
86
87
|
/**
|
|
87
|
-
* Asserts that the resolved chrome document both exists on disk
|
|
88
|
+
* Asserts that the resolved chrome document both exists on disk and exposes
|
|
88
89
|
* an insertion anchor (`#include browser-sets.inc` or `<html:body>`) that
|
|
89
90
|
* `addDomFragment` can splice into. Fires in dry-run and real-run mode
|
|
90
91
|
* alike, so the preview and execution agree on whether the target is
|
|
@@ -145,7 +146,7 @@ async function ensureSubscriptSourceExists(projectRoot, subscriptDir, name, dryR
|
|
|
145
146
|
/**
|
|
146
147
|
* Validates the `--dom` fragment argument and computes its engine-root-
|
|
147
148
|
* relative path. Accepts absolute, repo-root-relative (`engine/...`), and
|
|
148
|
-
* engine-relative inputs
|
|
149
|
+
* engine-relative inputs. Rejects missing files and paths escaping
|
|
149
150
|
* engine/. Returns undefined when `--dom` was not supplied.
|
|
150
151
|
*/
|
|
151
152
|
async function resolveDomFragmentPath(projectRoot, dom) {
|
|
@@ -277,10 +278,10 @@ export async function wireCommand(projectRoot, name, options = {}) {
|
|
|
277
278
|
// --after and have it forwarded unchanged to the lookup layer.
|
|
278
279
|
validateWireName(options.after);
|
|
279
280
|
}
|
|
280
|
-
// Validate init/destroy expressions
|
|
281
|
+
// Validate init/destroy expressions before the dry-run/real fork so both
|
|
281
282
|
// paths enforce the same contract. Validating only inside
|
|
282
|
-
// `addInitToBrowserInit`/`addDestroyToBrowserInit`
|
|
283
|
-
// path
|
|
283
|
+
// `addInitToBrowserInit`/`addDestroyToBrowserInit` (the real-execution
|
|
284
|
+
// path) lets `--dry-run --init 'void 0'` succeed and render a plausible
|
|
284
285
|
// preview even though the real run rejects the same arguments.
|
|
285
286
|
if (options.init !== undefined) {
|
|
286
287
|
validateWireExpression(options.init, 'init expression');
|
|
@@ -292,8 +293,8 @@ export async function wireCommand(projectRoot, name, options = {}) {
|
|
|
292
293
|
const subscriptDir = await resolveWireSubscriptDir(projectRoot, options);
|
|
293
294
|
const domFilePath = await resolveDomFragmentPath(projectRoot, options.dom);
|
|
294
295
|
// Resolve the chrome document the `#include` directive will land in. Only
|
|
295
|
-
// consulted when `--dom` is supplied
|
|
296
|
-
// 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.
|
|
297
298
|
//
|
|
298
299
|
// `stripEnginePrefix` is applied so
|
|
299
300
|
// `--target engine/browser/base/browser.xhtml` and
|
|
@@ -316,7 +317,7 @@ export async function wireCommand(projectRoot, name, options = {}) {
|
|
|
316
317
|
// setup scripts rely on.
|
|
317
318
|
//
|
|
318
319
|
// The check stays advisory rather than fatal in dry-run because
|
|
319
|
-
// "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
|
|
320
321
|
// dry-run over a typo would otherwise produce a plausible plan and the
|
|
321
322
|
// real command then refuse with `Subscript file not found`. The info line
|
|
322
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
|
|
@@ -6,15 +6,15 @@ import { walk } from 'estree-walker';
|
|
|
6
6
|
* `acorn.parse` produces nodes that carry both the ESTree shape and
|
|
7
7
|
* `start`/`end` offsets at runtime, but its static `acorn.Program` type is
|
|
8
8
|
* nominally distinct from `estree.Program`, so the compiler cannot verify
|
|
9
|
-
* the conversion structurally
|
|
10
|
-
*
|
|
9
|
+
* the conversion structurally, hence the double assertion. This helper is the
|
|
10
|
+
* only sanctioned crossing point between the two types.
|
|
11
11
|
*/
|
|
12
12
|
function toPositionedProgram(program) {
|
|
13
13
|
// eslint-disable-next-line no-restricted-syntax -- the sanctioned acorn→estree bridge this rule's message points at
|
|
14
14
|
return program;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
* Parse JavaScript source as a
|
|
17
|
+
* Parse JavaScript source as a script, not an ES module.
|
|
18
18
|
* All Mozilla chrome JS files (`browser-main.js`, `browser-init.js`,
|
|
19
19
|
* `customElements.js`, etc.) are scripts that run in a privileged scope.
|
|
20
20
|
*
|
|
@@ -32,7 +32,7 @@ export function parseScript(content, onComment) {
|
|
|
32
32
|
return toPositionedProgram(acorn.parse(content, opts));
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
|
-
* Parse JavaScript source as an
|
|
35
|
+
* Parse JavaScript source as an ES module.
|
|
36
36
|
* Used for `.sys.mjs` files which use static import/export syntax.
|
|
37
37
|
*
|
|
38
38
|
* @param content - Source text to parse
|
|
@@ -53,12 +53,12 @@ export function parseModule(content, onComment) {
|
|
|
53
53
|
* Convenience cast from `acorn.Node` (or the generic ESTree union returned
|
|
54
54
|
* by estree-walker callbacks) to a positioned, narrowly-typed node.
|
|
55
55
|
*
|
|
56
|
-
*
|
|
57
|
-
* This performs no runtime check
|
|
58
|
-
* offsets to a node the caller has
|
|
56
|
+
* Caller obligation: you must already have discriminated on `node.type`.
|
|
57
|
+
* This performs no runtime check. It exists to attach acorn's `start`/`end`
|
|
58
|
+
* offsets to a node the caller has already narrowed, typically inside an
|
|
59
59
|
* `if (node.type === 'CallExpression')` branch or an equivalent walker
|
|
60
60
|
* guard. Calling it on an undiscriminated node produces a value whose type
|
|
61
|
-
* is
|
|
61
|
+
* is wrong.
|
|
62
62
|
*
|
|
63
63
|
* No runtime `type` assertion: every call site sits in the hot loop of a lint
|
|
64
64
|
* or registration walker and is already post-narrowing, so the check would
|