@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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Browser-chrome test scaffolding for `furnace create --with-tests`,
|
|
4
4
|
* including the `--test-dir` redirect and collision safety (existing
|
|
5
|
-
* manifests are appended to
|
|
5
|
+
* manifests are appended to, and head.js and test implementations are never
|
|
6
6
|
* overwritten). Split out of `create.ts` to keep that command file within
|
|
7
7
|
* the per-file line budget.
|
|
8
8
|
*/
|
|
@@ -83,12 +83,12 @@ export async function scaffoldTestFiles(componentName, license, forgeConfig, pat
|
|
|
83
83
|
const jsHeader = getLicenseHeader(license, 'js');
|
|
84
84
|
const hashHeader = getLicenseHeader(license, 'hash');
|
|
85
85
|
const testFiles = [];
|
|
86
|
-
// browser.toml
|
|
86
|
+
// browser.toml: create if missing, append entry if existing.
|
|
87
87
|
const tomlPath = join(testDir, 'browser.toml');
|
|
88
88
|
if (await pathExists(tomlPath)) {
|
|
89
89
|
// Defensive guard: only append if the entry is not already present.
|
|
90
90
|
// With a fresh journal per create, the same test file name cannot be
|
|
91
|
-
// appended twice in a single run
|
|
91
|
+
// appended twice in a single run, but retaining the check protects
|
|
92
92
|
// against accidental re-entrance or a future refactor that reuses the
|
|
93
93
|
// helper with a stale test directory.
|
|
94
94
|
const existingToml = await readText(tomlPath);
|
|
@@ -113,7 +113,7 @@ support-files = ["head.js"]
|
|
|
113
113
|
await writeText(tomlPath, browserToml);
|
|
114
114
|
}
|
|
115
115
|
testFiles.push('browser.toml');
|
|
116
|
-
// head.js
|
|
116
|
+
// head.js: only create if it doesn't exist (shared across components).
|
|
117
117
|
const headPath = join(testDir, 'head.js');
|
|
118
118
|
if (!(await pathExists(headPath))) {
|
|
119
119
|
if (journal)
|
|
@@ -8,7 +8,7 @@ export interface DryRunPlanInput {
|
|
|
8
8
|
/**
|
|
9
9
|
* Feature-scoped Fluent bundle the component participates in (the same
|
|
10
10
|
* value that will be written to `furnace.json`'s `sharedFtl`). When set,
|
|
11
|
-
* the component's own `.ftl` is
|
|
11
|
+
* the component's own `.ftl` is not scaffolded and the plan preview
|
|
12
12
|
* reflects that. Omit the key for the default per-component scaffold.
|
|
13
13
|
*/
|
|
14
14
|
sharedFtl?: string;
|
|
@@ -18,8 +18,8 @@ export interface DryRunPlanInput {
|
|
|
18
18
|
/**
|
|
19
19
|
* Resolved `--test-dir` override (engine-relative, already validated by
|
|
20
20
|
* `resolveValidatedTestDir`). Omit for the default `<binaryName>`-derived
|
|
21
|
-
* scaffold directory. The formatters
|
|
22
|
-
* scaffolders get
|
|
21
|
+
* scaffold directory. The formatters must receive the same value the
|
|
22
|
+
* scaffolders get. The plan used to recompute the default from
|
|
23
23
|
* `binaryName` and named a directory the real run never wrote to.
|
|
24
24
|
*/
|
|
25
25
|
testDir?: string;
|
|
@@ -35,7 +35,7 @@ export declare function formatSuccessNote(args: {
|
|
|
35
35
|
testFiles: string[];
|
|
36
36
|
testStyle: ResolvedTestStyle;
|
|
37
37
|
binaryName: string;
|
|
38
|
-
/** Resolved `--test-dir` override
|
|
38
|
+
/** Resolved `--test-dir` override. See {@link DryRunPlanInput.testDir}. */
|
|
39
39
|
testDir?: string | undefined;
|
|
40
40
|
}): string;
|
|
41
41
|
/**
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Dry-run plan formatter for `furnace create`.
|
|
4
4
|
*
|
|
5
5
|
* Lives outside `create.ts` so the authoring command stays under the
|
|
6
|
-
* per-file LOC budget. The formatter is pure
|
|
7
|
-
* resolved by the command's validation phase
|
|
6
|
+
* per-file LOC budget. The formatter is pure (all inputs are already
|
|
7
|
+
* resolved by the command's validation phase), so it can be exercised
|
|
8
8
|
* independently of the mutation plumbing.
|
|
9
9
|
*/
|
|
10
10
|
import { BROWSER_TEST_SCAFFOLD_ROOT, resolveBrowserChromeTestDir, resolveXpcshellTestDir, } from '../../core/furnace-constants.js';
|
|
@@ -23,7 +23,7 @@ function formatTestSection(args) {
|
|
|
23
23
|
if (testStyle === 'browser-chrome') {
|
|
24
24
|
// Same resolver as scaffoldTestFiles: the registration name is the
|
|
25
25
|
// path below browser/base/content/test/, which under --test-dir is
|
|
26
|
-
//
|
|
26
|
+
// not the binary name.
|
|
27
27
|
const testDirRel = resolveBrowserChromeTestDir(binaryName, testDir);
|
|
28
28
|
const manifestName = testDirRel.slice(BROWSER_TEST_SCAFFOLD_ROOT.length);
|
|
29
29
|
return (`\n\nWould create test files in engine/${testDirRel}/:\n` +
|
|
@@ -79,7 +79,7 @@ export function formatSuccessNote(args) {
|
|
|
79
79
|
export function formatDryRunPlan(args) {
|
|
80
80
|
const { componentName, localized, register, composes, stockAdditions, sharedFtl, testStyle, description, binaryName, testDir, } = args;
|
|
81
81
|
const componentFiles = [`${componentName}.mjs`, `${componentName}.css`];
|
|
82
|
-
// A per-component .ftl is scaffolded only when the component does
|
|
82
|
+
// A per-component .ftl is scaffolded only when the component does not
|
|
83
83
|
// opt into a shared feature-scoped bundle. Mirrors writeComponentFiles.
|
|
84
84
|
if (localized && !sharedFtl)
|
|
85
85
|
componentFiles.push(`${componentName}.ftl`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Feature-flag resolution for `furnace create`. Extracted from
|
|
3
3
|
* `create.ts` so the authoring command stays under the per-file LOC
|
|
4
|
-
* budget
|
|
4
|
+
* budget. The flag resolver has grown with each new opt-in (`--xpcshell`,
|
|
5
5
|
* `--test-style`, `--shared-ftl`).
|
|
6
6
|
*/
|
|
7
7
|
import type { FurnaceCreateOptions } from '../../types/commands/index.js';
|
|
@@ -11,7 +11,7 @@ import type { FurnaceCreateOptions } from '../../types/commands/index.js';
|
|
|
11
11
|
* `--shared-ftl` implies `localized` and short-circuits the interactive
|
|
12
12
|
* prompt so the operator is not asked to flip a flag we are about to
|
|
13
13
|
* enforce. `--no-localized` combined with `--shared-ftl` is rejected
|
|
14
|
-
* fast-fail
|
|
14
|
+
* fast-fail. The cross-field check in furnace-config would catch it
|
|
15
15
|
* too, but later and without a clear command-line message.
|
|
16
16
|
*
|
|
17
17
|
* @param isInteractive - Whether interactive prompts are available
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Feature-flag resolution for `furnace create`. Extracted from
|
|
4
4
|
* `create.ts` so the authoring command stays under the per-file LOC
|
|
5
|
-
* budget
|
|
5
|
+
* budget. The flag resolver has grown with each new opt-in (`--xpcshell`,
|
|
6
6
|
* `--test-style`, `--shared-ftl`).
|
|
7
7
|
*/
|
|
8
8
|
import { multiselect } from '@clack/prompts';
|
|
@@ -14,7 +14,7 @@ import { cancel, isCancel } from '../../utils/logger.js';
|
|
|
14
14
|
* `--shared-ftl` implies `localized` and short-circuits the interactive
|
|
15
15
|
* prompt so the operator is not asked to flip a flag we are about to
|
|
16
16
|
* enforce. `--no-localized` combined with `--shared-ftl` is rejected
|
|
17
|
-
* fast-fail
|
|
17
|
+
* fast-fail. The cross-field check in furnace-config would catch it
|
|
18
18
|
* too, but later and without a clear command-line message.
|
|
19
19
|
*
|
|
20
20
|
* @param isInteractive - Whether interactive prompts are available
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* `fireforge furnace create --test-style=mochikit`.
|
|
4
4
|
*
|
|
5
5
|
* Browser-chrome mochitests require a `tabbrowser` in the top-level chrome
|
|
6
|
-
* document, so forks with a bespoke chrome document that
|
|
7
|
-
*
|
|
6
|
+
* document, so forks with a bespoke chrome document that omits one cannot
|
|
7
|
+
* run them. MochiKit tests load the component module directly via
|
|
8
8
|
* `chrome://global/` and assert against `customElements`, so they work
|
|
9
|
-
* against any fork that registers the upstream toolkit test manifest tree
|
|
9
|
+
* against any fork that registers the upstream toolkit test manifest tree,
|
|
10
10
|
* including those without a tabbrowser.
|
|
11
11
|
*/
|
|
12
12
|
import { type RollbackJournal } from '../../core/furnace-rollback.js';
|
|
@@ -21,7 +21,7 @@ import type { ProjectLicense } from '../../types/config.js';
|
|
|
21
21
|
* Appends a per-test entry to the existing `chrome.toml` when present,
|
|
22
22
|
* writes a fresh `[DEFAULT]`-headed one otherwise. The caller is still
|
|
23
23
|
* responsible for ensuring the `toolkit/content/tests/widgets/chrome.toml`
|
|
24
|
-
* path is registered somewhere in the moz.build tree
|
|
24
|
+
* path is registered somewhere in the moz.build tree. Most forks inherit
|
|
25
25
|
* this from upstream via `TEST_HARNESS_FILES += [...]`.
|
|
26
26
|
*/
|
|
27
27
|
export declare function scaffoldMochikitTestFiles(componentName: string, license: ProjectLicense, paths: {
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* `fireforge furnace create --test-style=mochikit`.
|
|
5
5
|
*
|
|
6
6
|
* Browser-chrome mochitests require a `tabbrowser` in the top-level chrome
|
|
7
|
-
* document, so forks with a bespoke chrome document that
|
|
8
|
-
*
|
|
7
|
+
* document, so forks with a bespoke chrome document that omits one cannot
|
|
8
|
+
* run them. MochiKit tests load the component module directly via
|
|
9
9
|
* `chrome://global/` and assert against `customElements`, so they work
|
|
10
|
-
* against any fork that registers the upstream toolkit test manifest tree
|
|
10
|
+
* against any fork that registers the upstream toolkit test manifest tree,
|
|
11
11
|
* including those without a tabbrowser.
|
|
12
12
|
*/
|
|
13
13
|
import { join } from 'node:path';
|
|
@@ -26,7 +26,7 @@ import { generateMochikitChromeTomlEntry, generateMochikitChromeTomlSkeleton, ge
|
|
|
26
26
|
* Appends a per-test entry to the existing `chrome.toml` when present,
|
|
27
27
|
* writes a fresh `[DEFAULT]`-headed one otherwise. The caller is still
|
|
28
28
|
* responsible for ensuring the `toolkit/content/tests/widgets/chrome.toml`
|
|
29
|
-
* path is registered somewhere in the moz.build tree
|
|
29
|
+
* path is registered somewhere in the moz.build tree. Most forks inherit
|
|
30
30
|
* this from upstream via `TEST_HARNESS_FILES += [...]`.
|
|
31
31
|
*/
|
|
32
32
|
export async function scaffoldMochikitTestFiles(componentName, license, paths, journal) {
|
|
@@ -50,9 +50,9 @@ export async function scaffoldMochikitTestFiles(componentName, license, paths, j
|
|
|
50
50
|
await writeText(testFilePath, generateMochikitTestContent(componentName));
|
|
51
51
|
writtenFiles.push(testFileName);
|
|
52
52
|
}
|
|
53
|
-
// chrome.toml
|
|
54
|
-
// a fresh skeleton + entry. Idempotency: if the entry is already
|
|
55
|
-
// the manifest is left untouched so re-runs don't double-register.
|
|
53
|
+
// chrome.toml: append an entry if the file already exists, otherwise
|
|
54
|
+
// write a fresh skeleton + entry. Idempotency: if the entry is already
|
|
55
|
+
// present the manifest is left untouched so re-runs don't double-register.
|
|
56
56
|
const manifestPath = join(testDir, 'chrome.toml');
|
|
57
57
|
const entry = generateMochikitChromeTomlEntry(componentName);
|
|
58
58
|
if (await pathExists(manifestPath)) {
|
|
@@ -22,7 +22,7 @@ export interface GenerateMjsContentOptions {
|
|
|
22
22
|
/**
|
|
23
23
|
* Generates the .mjs file content for a custom component.
|
|
24
24
|
*
|
|
25
|
-
* `MozLitElement` does
|
|
25
|
+
* `MozLitElement` does not expose `insertFTLIfNeeded`. That method lives on
|
|
26
26
|
* `MozXULElement`. Calling it from `connectedCallback` on a Lit-based
|
|
27
27
|
* component throws `TypeError: this.insertFTLIfNeeded is not a function` at
|
|
28
28
|
* every connect. Upstream Firefox components (e.g. `moz-input-folder.mjs`)
|
|
@@ -31,13 +31,13 @@ export interface GenerateMjsContentOptions {
|
|
|
31
31
|
* that pattern here so `--localized` produces functional code.
|
|
32
32
|
*
|
|
33
33
|
* Path resolution precedence (when `localized` is true):
|
|
34
|
-
* 1. `sharedFtl
|
|
35
|
-
* `--shared-ftl` / `furnace.json
|
|
34
|
+
* 1. `sharedFtl`: used verbatim. The caller has resolved it from
|
|
35
|
+
* `--shared-ftl` / `furnace.json`. This template does no rewriting.
|
|
36
36
|
* Use this when the component participates in a feature-scoped
|
|
37
37
|
* bundle that another component owns.
|
|
38
|
-
* 2. `<ftlChromeSubPath>/<name>.ftl
|
|
38
|
+
* 2. `<ftlChromeSubPath>/<name>.ftl`: the default per-component path,
|
|
39
39
|
* matching the locale jar.mn entry that `furnace apply` writes.
|
|
40
|
-
* 3. `<name>.ftl
|
|
40
|
+
* 3. `<name>.ftl`: fallback when no chrome sub-path was resolvable.
|
|
41
41
|
*/
|
|
42
42
|
export declare function generateMjsContent(options: GenerateMjsContentOptions): string;
|
|
43
43
|
/** Generates the .css file content for a custom component. */
|
|
@@ -50,7 +50,7 @@ export declare function xpcshellTestFileName(name: string): string;
|
|
|
50
50
|
* Generates an xpcshell test file for a custom component.
|
|
51
51
|
*
|
|
52
52
|
* xpcshell cannot execute a component module that imports
|
|
53
|
-
* `chrome://global/content/vendor/lit.all.mjs
|
|
53
|
+
* `chrome://global/content/vendor/lit.all.mjs`: the Lit bundle touches
|
|
54
54
|
* `window` at module-load time and the xpcshell harness has no `window`
|
|
55
55
|
* global. A scaffold that calls `ChromeUtils.importESModule` on the
|
|
56
56
|
* component's MJS therefore fails with `ReferenceError: window is not
|
|
@@ -61,15 +61,15 @@ export declare function xpcshellTestFileName(name: string): string;
|
|
|
61
61
|
* This template mirrors the chrome-doc packaging test instead: XCurProcD is
|
|
62
62
|
* probed at a pair of candidate layouts (dist/bin/browser and the macOS
|
|
63
63
|
* .app-bundle / ESR layout) to confirm the `.mjs` and `.css` files landed
|
|
64
|
-
* where jar.mn promised. That is the assertion xpcshell
|
|
64
|
+
* where jar.mn promised. That is the assertion xpcshell can make. Functional
|
|
65
65
|
* tests that need DOM/shadow-root/keyboard behaviour belong in a
|
|
66
|
-
* browser-chrome mochitest
|
|
66
|
+
* browser-chrome mochitest, scaffolded via
|
|
67
67
|
* `fireforge furnace create --test-style browser-chrome`.
|
|
68
68
|
*/
|
|
69
69
|
export declare function generateXpcshellTestContent(name: string, header: string): string;
|
|
70
70
|
/**
|
|
71
71
|
* Generates an `xpcshell.toml` manifest for a custom component's test
|
|
72
|
-
* directory. Kept minimal
|
|
72
|
+
* directory. Kept minimal: adding prefs, head.js, and support-files is
|
|
73
73
|
* left to the operator because those decisions depend on what the
|
|
74
74
|
* component actually touches (Services.storage, observer topics, etc.).
|
|
75
75
|
*/
|
|
@@ -84,17 +84,17 @@ export declare function mochikitTestFileName(name: string): string;
|
|
|
84
84
|
* They run on forks whose top-level chrome document lacks a `tabbrowser`
|
|
85
85
|
* because they do not traverse `URILoadingHelper.openLinkIn`.
|
|
86
86
|
*
|
|
87
|
-
* The scaffold is a smoke test
|
|
87
|
+
* The scaffold is a smoke test: the component is defined and the
|
|
88
88
|
* constructor is a function. Real UI assertions (render output, l10n wiring,
|
|
89
89
|
* keyboard interactions) are left out because they depend on the
|
|
90
|
-
* component's shape
|
|
90
|
+
* component's shape. Operators can extend the test using the same SimpleTest
|
|
91
91
|
* APIs upstream toolkit widgets rely on.
|
|
92
92
|
*
|
|
93
|
-
* The template
|
|
93
|
+
* The template omits `SimpleTest.waitForExplicitFinish()` on purpose.
|
|
94
94
|
* `add_task` owns the test lifecycle: when every queued task resolves, the
|
|
95
95
|
* task harness calls `SimpleTest.finish()` itself. Combining
|
|
96
96
|
* `waitForExplicitFinish()` with `add_task` and no explicit
|
|
97
|
-
* `SimpleTest.finish()` in the task body makes the harness wait forever
|
|
97
|
+
* `SimpleTest.finish()` in the task body makes the harness wait forever,
|
|
98
98
|
* an indefinite hang on `fireforge test --headless`. Omitting it matches the
|
|
99
99
|
* convention upstream toolkit widget tests use.
|
|
100
100
|
*/
|
|
@@ -102,7 +102,7 @@ export declare function generateMochikitTestContent(name: string): string;
|
|
|
102
102
|
/**
|
|
103
103
|
* Generates the `chrome.toml` entry block to append for a newly scaffolded
|
|
104
104
|
* mochikit test. When the manifest already exists the caller appends this
|
|
105
|
-
* snippet
|
|
105
|
+
* snippet. When it is absent, the caller writes a file that starts with a
|
|
106
106
|
* `[DEFAULT]` stanza followed by this block.
|
|
107
107
|
*/
|
|
108
108
|
export declare function generateMochikitChromeTomlEntry(name: string): string;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
/**
|
|
8
8
|
* Generates the .mjs file content for a custom component.
|
|
9
9
|
*
|
|
10
|
-
* `MozLitElement` does
|
|
10
|
+
* `MozLitElement` does not expose `insertFTLIfNeeded`. That method lives on
|
|
11
11
|
* `MozXULElement`. Calling it from `connectedCallback` on a Lit-based
|
|
12
12
|
* component throws `TypeError: this.insertFTLIfNeeded is not a function` at
|
|
13
13
|
* every connect. Upstream Firefox components (e.g. `moz-input-folder.mjs`)
|
|
@@ -16,13 +16,13 @@
|
|
|
16
16
|
* that pattern here so `--localized` produces functional code.
|
|
17
17
|
*
|
|
18
18
|
* Path resolution precedence (when `localized` is true):
|
|
19
|
-
* 1. `sharedFtl
|
|
20
|
-
* `--shared-ftl` / `furnace.json
|
|
19
|
+
* 1. `sharedFtl`: used verbatim. The caller has resolved it from
|
|
20
|
+
* `--shared-ftl` / `furnace.json`. This template does no rewriting.
|
|
21
21
|
* Use this when the component participates in a feature-scoped
|
|
22
22
|
* bundle that another component owns.
|
|
23
|
-
* 2. `<ftlChromeSubPath>/<name>.ftl
|
|
23
|
+
* 2. `<ftlChromeSubPath>/<name>.ftl`: the default per-component path,
|
|
24
24
|
* matching the locale jar.mn entry that `furnace apply` writes.
|
|
25
|
-
* 3. `<name>.ftl
|
|
25
|
+
* 3. `<name>.ftl`: fallback when no chrome sub-path was resolvable.
|
|
26
26
|
*/
|
|
27
27
|
export function generateMjsContent(options) {
|
|
28
28
|
const { name, className, description, localized, header, ftlChromeSubPath, sharedFtl } = options;
|
|
@@ -36,10 +36,10 @@ export function generateMjsContent(options) {
|
|
|
36
36
|
: ftlChromeSubPath !== undefined
|
|
37
37
|
? `${ftlChromeSubPath}/${name}.ftl`
|
|
38
38
|
: `${name}.ftl`;
|
|
39
|
-
//
|
|
40
|
-
// three sources
|
|
41
|
-
// and a derived `<name>.ftl`
|
|
42
|
-
// `validateSharedFtl`. `JSON.stringify` produces a correctly-escaped JS
|
|
39
|
+
// Escaping happens at the sink rather than at the validator. `ftlPath`
|
|
40
|
+
// reaches here from three sources (the `--shared-ftl` flag, the
|
|
41
|
+
// furnace.json `ftlBasePath`, and a derived `<name>.ftl`), and only the
|
|
42
|
+
// first passes through `validateSharedFtl`. `JSON.stringify` produces a correctly-escaped JS
|
|
43
43
|
// string literal for all of them, including the `"` and raw-newline cases
|
|
44
44
|
// that would otherwise break the generated module into a syntax error.
|
|
45
45
|
const ftlModulePreamble = localized
|
|
@@ -118,7 +118,7 @@ export function xpcshellTestFileName(name) {
|
|
|
118
118
|
* Generates an xpcshell test file for a custom component.
|
|
119
119
|
*
|
|
120
120
|
* xpcshell cannot execute a component module that imports
|
|
121
|
-
* `chrome://global/content/vendor/lit.all.mjs
|
|
121
|
+
* `chrome://global/content/vendor/lit.all.mjs`: the Lit bundle touches
|
|
122
122
|
* `window` at module-load time and the xpcshell harness has no `window`
|
|
123
123
|
* global. A scaffold that calls `ChromeUtils.importESModule` on the
|
|
124
124
|
* component's MJS therefore fails with `ReferenceError: window is not
|
|
@@ -129,9 +129,9 @@ export function xpcshellTestFileName(name) {
|
|
|
129
129
|
* This template mirrors the chrome-doc packaging test instead: XCurProcD is
|
|
130
130
|
* probed at a pair of candidate layouts (dist/bin/browser and the macOS
|
|
131
131
|
* .app-bundle / ESR layout) to confirm the `.mjs` and `.css` files landed
|
|
132
|
-
* where jar.mn promised. That is the assertion xpcshell
|
|
132
|
+
* where jar.mn promised. That is the assertion xpcshell can make. Functional
|
|
133
133
|
* tests that need DOM/shadow-root/keyboard behaviour belong in a
|
|
134
|
-
* browser-chrome mochitest
|
|
134
|
+
* browser-chrome mochitest, scaffolded via
|
|
135
135
|
* `fireforge furnace create --test-style browser-chrome`.
|
|
136
136
|
*/
|
|
137
137
|
export function generateXpcshellTestContent(name, header) {
|
|
@@ -213,7 +213,7 @@ add_task(async function test_${taskSuffix}_files_packaged() {
|
|
|
213
213
|
}
|
|
214
214
|
/**
|
|
215
215
|
* Generates an `xpcshell.toml` manifest for a custom component's test
|
|
216
|
-
* directory. Kept minimal
|
|
216
|
+
* directory. Kept minimal: adding prefs, head.js, and support-files is
|
|
217
217
|
* left to the operator because those decisions depend on what the
|
|
218
218
|
* component actually touches (Services.storage, observer topics, etc.).
|
|
219
219
|
*/
|
|
@@ -238,17 +238,17 @@ export function mochikitTestFileName(name) {
|
|
|
238
238
|
* They run on forks whose top-level chrome document lacks a `tabbrowser`
|
|
239
239
|
* because they do not traverse `URILoadingHelper.openLinkIn`.
|
|
240
240
|
*
|
|
241
|
-
* The scaffold is a smoke test
|
|
241
|
+
* The scaffold is a smoke test: the component is defined and the
|
|
242
242
|
* constructor is a function. Real UI assertions (render output, l10n wiring,
|
|
243
243
|
* keyboard interactions) are left out because they depend on the
|
|
244
|
-
* component's shape
|
|
244
|
+
* component's shape. Operators can extend the test using the same SimpleTest
|
|
245
245
|
* APIs upstream toolkit widgets rely on.
|
|
246
246
|
*
|
|
247
|
-
* The template
|
|
247
|
+
* The template omits `SimpleTest.waitForExplicitFinish()` on purpose.
|
|
248
248
|
* `add_task` owns the test lifecycle: when every queued task resolves, the
|
|
249
249
|
* task harness calls `SimpleTest.finish()` itself. Combining
|
|
250
250
|
* `waitForExplicitFinish()` with `add_task` and no explicit
|
|
251
|
-
* `SimpleTest.finish()` in the task body makes the harness wait forever
|
|
251
|
+
* `SimpleTest.finish()` in the task body makes the harness wait forever,
|
|
252
252
|
* an indefinite hang on `fireforge test --headless`. Omitting it matches the
|
|
253
253
|
* convention upstream toolkit widget tests use.
|
|
254
254
|
*/
|
|
@@ -281,7 +281,7 @@ export function generateMochikitTestContent(name) {
|
|
|
281
281
|
/**
|
|
282
282
|
* Generates the `chrome.toml` entry block to append for a newly scaffolded
|
|
283
283
|
* mochikit test. When the manifest already exists the caller appends this
|
|
284
|
-
* snippet
|
|
284
|
+
* snippet. When it is absent, the caller writes a file that starts with a
|
|
285
285
|
* `[DEFAULT]` stanza followed by this block.
|
|
286
286
|
*/
|
|
287
287
|
export function generateMochikitChromeTomlEntry(name) {
|
|
@@ -10,15 +10,15 @@ import type { ProjectLicense } from '../../types/config.js';
|
|
|
10
10
|
*
|
|
11
11
|
* xpcshell is the appropriate harness for storage-layer code on forks
|
|
12
12
|
* without a `tabbrowser` (no `openLinkIn` → `URILoadingHelper`). Browser
|
|
13
|
-
* chrome mochitests require tabbrowser
|
|
13
|
+
* chrome mochitests require tabbrowser, but xpcshell does not, so storage,
|
|
14
14
|
* observers, and ESM-loading logic can be covered headless.
|
|
15
15
|
*
|
|
16
16
|
* Writes `test_<name>_packaged.js` and an `xpcshell.toml` manifest
|
|
17
17
|
* into `engine/browser/base/content/test/<binary-name>-xpcshell/
|
|
18
|
-
* <component-name>/`. moz.build registration is
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* <component-name>/`. moz.build registration is left to the operator:
|
|
19
|
+
* wiring an `XPCSHELL_TESTS_MANIFESTS` entry requires a choice about which
|
|
20
|
+
* moz.build should own it, and an auto-insertion that guessed wrong would
|
|
21
|
+
* be worse than a note.
|
|
22
22
|
*/
|
|
23
23
|
export declare function scaffoldXpcshellTestFiles(componentName: string, license: ProjectLicense, forgeConfig: {
|
|
24
24
|
binaryName: string;
|
|
@@ -16,20 +16,20 @@ import { generateXpcshellManifestContent, generateXpcshellTestContent, xpcshellT
|
|
|
16
16
|
*
|
|
17
17
|
* xpcshell is the appropriate harness for storage-layer code on forks
|
|
18
18
|
* without a `tabbrowser` (no `openLinkIn` → `URILoadingHelper`). Browser
|
|
19
|
-
* chrome mochitests require tabbrowser
|
|
19
|
+
* chrome mochitests require tabbrowser, but xpcshell does not, so storage,
|
|
20
20
|
* observers, and ESM-loading logic can be covered headless.
|
|
21
21
|
*
|
|
22
22
|
* Writes `test_<name>_packaged.js` and an `xpcshell.toml` manifest
|
|
23
23
|
* into `engine/browser/base/content/test/<binary-name>-xpcshell/
|
|
24
|
-
* <component-name>/`. moz.build registration is
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
24
|
+
* <component-name>/`. moz.build registration is left to the operator:
|
|
25
|
+
* wiring an `XPCSHELL_TESTS_MANIFESTS` entry requires a choice about which
|
|
26
|
+
* moz.build should own it, and an auto-insertion that guessed wrong would
|
|
27
|
+
* be worse than a note.
|
|
28
28
|
*/
|
|
29
29
|
export async function scaffoldXpcshellTestFiles(componentName, license, forgeConfig, paths, journal, testDirOverride) {
|
|
30
30
|
const parentRelDir = xpcshellTestParentDir(forgeConfig.binaryName);
|
|
31
31
|
const parentDirName = parentRelDir.split('/').slice(-1)[0] ?? `${forgeConfig.binaryName}-xpcshell`;
|
|
32
|
-
// --test-dir names the
|
|
32
|
+
// --test-dir names the final directory (no per-component segment is
|
|
33
33
|
// appended) so the operator controls the exact scaffold target.
|
|
34
34
|
const testDirRel = resolveXpcshellTestDir(forgeConfig.binaryName, componentName, testDirOverride);
|
|
35
35
|
const testDir = join(paths.engine, testDirRel);
|
|
@@ -53,8 +53,8 @@ export async function scaffoldXpcshellTestFiles(componentName, license, forgeCon
|
|
|
53
53
|
await writeText(testFilePath, generateXpcshellTestContent(componentName, jsHeader));
|
|
54
54
|
testFiles.push(testFileName);
|
|
55
55
|
}
|
|
56
|
-
// xpcshell.toml
|
|
57
|
-
// of scaffolding over it
|
|
56
|
+
// xpcshell.toml: append the test entry to an existing manifest instead
|
|
57
|
+
// of scaffolding over it. Write a fresh one only when absent.
|
|
58
58
|
const manifestPath = join(testDir, 'xpcshell.toml');
|
|
59
59
|
if (await pathExists(manifestPath)) {
|
|
60
60
|
const existing = await readText(manifestPath);
|
|
@@ -7,7 +7,7 @@ import type { ResolvedTestStyle } from '../../types/furnace.js';
|
|
|
7
7
|
* Invariants:
|
|
8
8
|
* - `--xpcshell` alone is equivalent to `--test-style=xpcshell`.
|
|
9
9
|
* - `--with-tests` alone (no `--test-style`) defaults to `browser-chrome`
|
|
10
|
-
* (multi-process mochitest
|
|
10
|
+
* (multi-process mochitest, reliable on macOS for interactive chrome).
|
|
11
11
|
* Forks whose chrome document has no `tabbrowser` should pass
|
|
12
12
|
* `--test-style=mochikit` explicitly.
|
|
13
13
|
* - When both `--xpcshell` and `--with-tests` are set, `--xpcshell` wins
|
|
@@ -86,7 +86,7 @@ async function writeComponentFiles(options) {
|
|
|
86
86
|
await writeText(cssPath, cssContent);
|
|
87
87
|
// Skip the per-component .ftl stub when the component participates in a
|
|
88
88
|
// pre-existing feature-scoped bundle. The shared bundle is owned
|
|
89
|
-
// elsewhere
|
|
89
|
+
// elsewhere. Dropping a stub here would clutter the workspace with
|
|
90
90
|
// empty files that never get packaged (furnace apply also skips copying
|
|
91
91
|
// them in this mode).
|
|
92
92
|
if (localized && !sharedFtl) {
|
|
@@ -106,7 +106,7 @@ async function writeComponentFiles(options) {
|
|
|
106
106
|
* Invariants:
|
|
107
107
|
* - `--xpcshell` alone is equivalent to `--test-style=xpcshell`.
|
|
108
108
|
* - `--with-tests` alone (no `--test-style`) defaults to `browser-chrome`
|
|
109
|
-
* (multi-process mochitest
|
|
109
|
+
* (multi-process mochitest, reliable on macOS for interactive chrome).
|
|
110
110
|
* Forks whose chrome document has no `tabbrowser` should pass
|
|
111
111
|
* `--test-style=mochikit` explicitly.
|
|
112
112
|
* - When both `--xpcshell` and `--with-tests` are set, `--xpcshell` wins
|
|
@@ -135,8 +135,8 @@ export function resolveTestStyle(options) {
|
|
|
135
135
|
* state.
|
|
136
136
|
*/
|
|
137
137
|
async function performCreateMutations(args) {
|
|
138
|
-
// Invariant: the journal
|
|
139
|
-
//
|
|
138
|
+
// Invariant: the journal must be registered with the operation context
|
|
139
|
+
// before any filesystem mutation (including recordCreatedDir, whose entries
|
|
140
140
|
// are consulted by SIGINT rollback). The try/catch below assumes signal
|
|
141
141
|
// handlers can find the journal for any partial write that follows.
|
|
142
142
|
const journal = createRollbackJournal();
|
|
@@ -269,7 +269,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
|
|
|
269
269
|
const license = forgeConfig.license ?? DEFAULT_LICENSE;
|
|
270
270
|
const furnacePaths = getFurnacePaths(projectRoot);
|
|
271
271
|
if (!componentName) {
|
|
272
|
-
// Interactive prompt path
|
|
272
|
+
// Interactive prompt path. Non-interactive missing-name was rejected above.
|
|
273
273
|
const nameResult = await text({
|
|
274
274
|
message: 'Component tag name:',
|
|
275
275
|
placeholder: 'moz-my-widget',
|
|
@@ -315,7 +315,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
|
|
|
315
315
|
// partial mutation behind.
|
|
316
316
|
const testStyle = resolveTestStyle(options);
|
|
317
317
|
const testDir = resolveValidatedTestDir(options.testDir, testStyle);
|
|
318
|
-
// Not routed through assertFurnaceEngineReady: this rung is
|
|
318
|
+
// Not routed through assertFurnaceEngineReady: this rung is conditional on
|
|
319
319
|
// a test style being requested, and it names the component so the refusal
|
|
320
320
|
// identifies which create failed. Both are outside the shared helper's
|
|
321
321
|
// shape, and a scaffold without --with-tests must keep working with no
|
|
@@ -334,7 +334,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
|
|
|
334
334
|
// structural rules with furnace-config.ts so the command and the on-disk
|
|
335
335
|
// schema cannot diverge. Pass the resolved `localized` rather than a `true`
|
|
336
336
|
// literal so the validator's cross-field check stays anchored to the real
|
|
337
|
-
// feature selection
|
|
337
|
+
// feature selection. `resolveCreateFeatures` promotes localized upstream,
|
|
338
338
|
// and hard-coding `true` here would hide a regression if that promotion
|
|
339
339
|
// ever moved or dropped.
|
|
340
340
|
let sharedFtl;
|
|
@@ -345,10 +345,10 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
|
|
|
345
345
|
}
|
|
346
346
|
sharedFtl = result.value;
|
|
347
347
|
}
|
|
348
|
-
// Dry-run exits here
|
|
348
|
+
// Dry-run exits here. Every validation that does not need a write has
|
|
349
349
|
// already run, so the plan we render reflects exactly what the real
|
|
350
350
|
// command would do. The mutation phase and its rollback journal are
|
|
351
|
-
//
|
|
351
|
+
// skipped so no furnace.json/engine state is touched.
|
|
352
352
|
if (isDryRun) {
|
|
353
353
|
const plan = formatDryRunPlan({
|
|
354
354
|
componentName,
|
|
@@ -357,7 +357,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
|
|
|
357
357
|
composes,
|
|
358
358
|
stockAdditions,
|
|
359
359
|
// Spread rather than assign so the key is absent when sharedFtl is
|
|
360
|
-
// undefined
|
|
360
|
+
// undefined. The DryRunPlanInput type uses a strict-optional shape.
|
|
361
361
|
...(sharedFtl !== undefined ? { sharedFtl } : {}),
|
|
362
362
|
testStyle,
|
|
363
363
|
description,
|
|
@@ -43,18 +43,18 @@ function getFailedComponentNames(result) {
|
|
|
43
43
|
* mode.
|
|
44
44
|
*
|
|
45
45
|
* Delegates to {@link applyAllComponents} with a `componentName` filter so
|
|
46
|
-
* targeted deploys run the exact same pipeline as deploy-all
|
|
46
|
+
* targeted deploys run the exact same pipeline as deploy-all, including
|
|
47
47
|
* workspace-deletion detection, engine orphan undeploy, and jar.mn /
|
|
48
48
|
* customElements.js re-sync. Calling the per-component apply helpers
|
|
49
49
|
* directly never prunes: renaming a helper file in the workspace then leaves
|
|
50
50
|
* the old deployed file and its stale jar.mn line in the engine.
|
|
51
51
|
*
|
|
52
|
-
* `persistState: false`
|
|
52
|
+
* `persistState: false` matters here: the batch persist path replaces
|
|
53
53
|
* `appliedChecksums` wholesale with only this run's entries, which for a
|
|
54
54
|
* named deploy would wipe every other component's state. Named deploy keeps
|
|
55
55
|
* its per-component state merge ({@link persistSingleComponentState}) and
|
|
56
56
|
* its atomicity gate ({@link shouldPersistSingleComponentState}) at the call
|
|
57
|
-
* site. Rollback on failure happens inside `applyAllComponents
|
|
57
|
+
* site. Rollback on failure happens inside `applyAllComponents`. The journal
|
|
58
58
|
* returned on success is ignored (the deploy keeps its files).
|
|
59
59
|
*
|
|
60
60
|
* @param name - Component name to apply
|
|
@@ -188,7 +188,7 @@ export async function furnaceDeployCommand(projectRoot, name, options = {}) {
|
|
|
188
188
|
applySpinner.stop(isDryRun ? 'Planned actions calculated' : 'Components applied');
|
|
189
189
|
logApplyResult(result, isDryRun);
|
|
190
190
|
// Keep the consumer jsconfig's chrome-module `paths` in step with the
|
|
191
|
-
// deployed module set. Only after a clean apply
|
|
191
|
+
// deployed module set. Only after a clean apply: a rolled-back deploy
|
|
192
192
|
// must not advance the typecheck mapping either.
|
|
193
193
|
if (result.errors.length === 0 && getStepFailureCount(result) === 0) {
|
|
194
194
|
await reportJsconfigPathsSync(projectRoot, config, isDryRun);
|
|
@@ -15,9 +15,9 @@ import { normalizePathSlashes } from '../../utils/paths.js';
|
|
|
15
15
|
/**
|
|
16
16
|
* Renders a multi-hunk unified diff between the two strings and returns a
|
|
17
17
|
* flat list of display-ready lines. Each line has already had its marker
|
|
18
|
-
* prefix and color applied by this function
|
|
18
|
+
* prefix and color applied by this function. The caller just emits them.
|
|
19
19
|
*
|
|
20
|
-
* Pure delegation to the `diff-hunks` module
|
|
20
|
+
* Pure delegation to the `diff-hunks` module, kept here as a thin wrapper
|
|
21
21
|
* so the command file does not need to care about the hunk data shape.
|
|
22
22
|
*/
|
|
23
23
|
function formatUnifiedDiff(original, modified) {
|
|
@@ -48,7 +48,7 @@ async function diffOverride(name, projectRoot, config) {
|
|
|
48
48
|
if (!(await pathExists(overrideDir))) {
|
|
49
49
|
throw new FurnaceError(`Override directory not found: components/overrides/${name}`, name);
|
|
50
50
|
}
|
|
51
|
-
// Prefer the per-override baseCommit (survives download --force)
|
|
51
|
+
// Prefer the per-override baseCommit (survives download --force). Fall back
|
|
52
52
|
// to the project-wide value for overrides created before this field existed.
|
|
53
53
|
const state = await loadState(projectRoot);
|
|
54
54
|
const baseCommit = overrideConfig.baseCommit ?? state.baseCommit;
|
|
@@ -64,9 +64,9 @@ async function diffOverride(name, projectRoot, config) {
|
|
|
64
64
|
continue;
|
|
65
65
|
if (!isComponentSourceFile(entry.name))
|
|
66
66
|
continue;
|
|
67
|
-
// git show takes a repo-relative path. paths.engine
|
|
67
|
+
// git show takes a repo-relative path. paths.engine is the repo root.
|
|
68
68
|
// The slice leaves the host's separators behind, and `git show <ref>:<path>`
|
|
69
|
-
// only understands forward slashes
|
|
69
|
+
// only understands forward slashes. On Windows the unnormalized form makes
|
|
70
70
|
// every baseline read miss, so every overridden file is reported as a new
|
|
71
71
|
// file and `furnace diff` shows nothing.
|
|
72
72
|
const enginePath = normalizePathSlashes(getOverrideEngineTargetPath(paths.engine, overrideConfig, entry.name, ftlDir).slice(paths.engine.length + 1));
|
|
@@ -109,7 +109,7 @@ async function diffOverride(name, projectRoot, config) {
|
|
|
109
109
|
* `furnace apply`.
|
|
110
110
|
*
|
|
111
111
|
* `.ftl` files deploy to `engine/<ftlDir>/<name>.ftl` via
|
|
112
|
-
* `applyCustomFtlFile
|
|
112
|
+
* `applyCustomFtlFile`, not to `customConfig.targetPath`, so the
|
|
113
113
|
* deployment-target lookup has to branch on extension. Without the branch, a
|
|
114
114
|
* component's localization file always reports "not yet deployed to engine
|
|
115
115
|
* (new file)" after a successful apply, because diff looks for it under the
|
|
@@ -138,7 +138,7 @@ async function diffCustom(name, projectRoot, config) {
|
|
|
138
138
|
const workspacePath = join(customDir, entry.name);
|
|
139
139
|
const workspaceContent = await readText(workspacePath);
|
|
140
140
|
// `.ftl` files deploy to the locale tree, not the component's
|
|
141
|
-
// targetPath
|
|
141
|
+
// targetPath. Mirror `applyCustomFtlFile`'s target computation so the
|
|
142
142
|
// diff header and the existence probe name the same path apply
|
|
143
143
|
// writes to. Any change here must stay in lock-step with
|
|
144
144
|
// `src/core/furnace-apply-ftl.ts`.
|
|
@@ -35,7 +35,7 @@ function registerFurnaceApplyCommand(furnace, context) {
|
|
|
35
35
|
.option('-w, --watch', 'Watch component directories and re-apply on changes');
|
|
36
36
|
addWaitLockOption(apply).action(withErrorHandling(async (name, options) => {
|
|
37
37
|
const { waitLock, ...rest } = options ?? {};
|
|
38
|
-
// Resolved
|
|
38
|
+
// Resolved once and used twice: the engine session lock below, and
|
|
39
39
|
// the furnace lock the mutation takes inside it. Resolving twice
|
|
40
40
|
// would be the same value today and a drift risk tomorrow.
|
|
41
41
|
const waitLockSeconds = resolveWaitLockSeconds(waitLock);
|