@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
|
@@ -3,10 +3,26 @@
|
|
|
3
3
|
* command entrypoint so the generator is unit-testable in isolation and the
|
|
4
4
|
* command file stays under the per-file LOC budget.
|
|
5
5
|
*/
|
|
6
|
+
export interface GenerateMjsContentOptions {
|
|
7
|
+
/** Custom element tag name. */
|
|
8
|
+
name: string;
|
|
9
|
+
/** Generated component class name. */
|
|
10
|
+
className: string;
|
|
11
|
+
/** Human-readable component description. */
|
|
12
|
+
description: string;
|
|
13
|
+
/** Whether to emit the Fluent wiring. */
|
|
14
|
+
localized: boolean;
|
|
15
|
+
/** License header prepended to the module. */
|
|
16
|
+
header: string;
|
|
17
|
+
/** chrome:// sub-path for the generated FTL reference, when localized. */
|
|
18
|
+
ftlChromeSubPath: string | undefined;
|
|
19
|
+
/** Explicit shared FTL path, used verbatim when supplied. */
|
|
20
|
+
sharedFtl: string | undefined;
|
|
21
|
+
}
|
|
6
22
|
/**
|
|
7
23
|
* Generates the .mjs file content for a custom component.
|
|
8
24
|
*
|
|
9
|
-
* `MozLitElement` does
|
|
25
|
+
* `MozLitElement` does not expose `insertFTLIfNeeded`. That method lives on
|
|
10
26
|
* `MozXULElement`. Calling it from `connectedCallback` on a Lit-based
|
|
11
27
|
* component throws `TypeError: this.insertFTLIfNeeded is not a function` at
|
|
12
28
|
* every connect. Upstream Firefox components (e.g. `moz-input-folder.mjs`)
|
|
@@ -15,15 +31,15 @@
|
|
|
15
31
|
* that pattern here so `--localized` produces functional code.
|
|
16
32
|
*
|
|
17
33
|
* Path resolution precedence (when `localized` is true):
|
|
18
|
-
* 1. `sharedFtl
|
|
19
|
-
* `--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.
|
|
20
36
|
* Use this when the component participates in a feature-scoped
|
|
21
37
|
* bundle that another component owns.
|
|
22
|
-
* 2. `<ftlChromeSubPath>/<name>.ftl
|
|
38
|
+
* 2. `<ftlChromeSubPath>/<name>.ftl`: the default per-component path,
|
|
23
39
|
* matching the locale jar.mn entry that `furnace apply` writes.
|
|
24
|
-
* 3. `<name>.ftl
|
|
40
|
+
* 3. `<name>.ftl`: fallback when no chrome sub-path was resolvable.
|
|
25
41
|
*/
|
|
26
|
-
export declare function generateMjsContent(
|
|
42
|
+
export declare function generateMjsContent(options: GenerateMjsContentOptions): string;
|
|
27
43
|
/** Generates the .css file content for a custom component. */
|
|
28
44
|
export declare function generateCssContent(header: string): string;
|
|
29
45
|
/** Generates the .ftl file content for a custom component. */
|
|
@@ -34,7 +50,7 @@ export declare function xpcshellTestFileName(name: string): string;
|
|
|
34
50
|
* Generates an xpcshell test file for a custom component.
|
|
35
51
|
*
|
|
36
52
|
* xpcshell cannot execute a component module that imports
|
|
37
|
-
* `chrome://global/content/vendor/lit.all.mjs
|
|
53
|
+
* `chrome://global/content/vendor/lit.all.mjs`: the Lit bundle touches
|
|
38
54
|
* `window` at module-load time and the xpcshell harness has no `window`
|
|
39
55
|
* global. A scaffold that calls `ChromeUtils.importESModule` on the
|
|
40
56
|
* component's MJS therefore fails with `ReferenceError: window is not
|
|
@@ -45,15 +61,15 @@ export declare function xpcshellTestFileName(name: string): string;
|
|
|
45
61
|
* This template mirrors the chrome-doc packaging test instead: XCurProcD is
|
|
46
62
|
* probed at a pair of candidate layouts (dist/bin/browser and the macOS
|
|
47
63
|
* .app-bundle / ESR layout) to confirm the `.mjs` and `.css` files landed
|
|
48
|
-
* where jar.mn promised. That is the assertion xpcshell
|
|
64
|
+
* where jar.mn promised. That is the assertion xpcshell can make. Functional
|
|
49
65
|
* tests that need DOM/shadow-root/keyboard behaviour belong in a
|
|
50
|
-
* browser-chrome mochitest
|
|
66
|
+
* browser-chrome mochitest, scaffolded via
|
|
51
67
|
* `fireforge furnace create --test-style browser-chrome`.
|
|
52
68
|
*/
|
|
53
69
|
export declare function generateXpcshellTestContent(name: string, header: string): string;
|
|
54
70
|
/**
|
|
55
71
|
* Generates an `xpcshell.toml` manifest for a custom component's test
|
|
56
|
-
* directory. Kept minimal
|
|
72
|
+
* directory. Kept minimal: adding prefs, head.js, and support-files is
|
|
57
73
|
* left to the operator because those decisions depend on what the
|
|
58
74
|
* component actually touches (Services.storage, observer topics, etc.).
|
|
59
75
|
*/
|
|
@@ -68,17 +84,17 @@ export declare function mochikitTestFileName(name: string): string;
|
|
|
68
84
|
* They run on forks whose top-level chrome document lacks a `tabbrowser`
|
|
69
85
|
* because they do not traverse `URILoadingHelper.openLinkIn`.
|
|
70
86
|
*
|
|
71
|
-
* The scaffold is a smoke test
|
|
87
|
+
* The scaffold is a smoke test: the component is defined and the
|
|
72
88
|
* constructor is a function. Real UI assertions (render output, l10n wiring,
|
|
73
89
|
* keyboard interactions) are left out because they depend on the
|
|
74
|
-
* component's shape
|
|
90
|
+
* component's shape. Operators can extend the test using the same SimpleTest
|
|
75
91
|
* APIs upstream toolkit widgets rely on.
|
|
76
92
|
*
|
|
77
|
-
* The template
|
|
93
|
+
* The template omits `SimpleTest.waitForExplicitFinish()` on purpose.
|
|
78
94
|
* `add_task` owns the test lifecycle: when every queued task resolves, the
|
|
79
95
|
* task harness calls `SimpleTest.finish()` itself. Combining
|
|
80
96
|
* `waitForExplicitFinish()` with `add_task` and no explicit
|
|
81
|
-
* `SimpleTest.finish()` in the task body makes the harness wait forever
|
|
97
|
+
* `SimpleTest.finish()` in the task body makes the harness wait forever,
|
|
82
98
|
* an indefinite hang on `fireforge test --headless`. Omitting it matches the
|
|
83
99
|
* convention upstream toolkit widget tests use.
|
|
84
100
|
*/
|
|
@@ -86,7 +102,7 @@ export declare function generateMochikitTestContent(name: string): string;
|
|
|
86
102
|
/**
|
|
87
103
|
* Generates the `chrome.toml` entry block to append for a newly scaffolded
|
|
88
104
|
* mochikit test. When the manifest already exists the caller appends this
|
|
89
|
-
* snippet
|
|
105
|
+
* snippet. When it is absent, the caller writes a file that starts with a
|
|
90
106
|
* `[DEFAULT]` stanza followed by this block.
|
|
91
107
|
*/
|
|
92
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,15 +16,16 @@
|
|
|
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
|
-
export function generateMjsContent(
|
|
27
|
+
export function generateMjsContent(options) {
|
|
28
|
+
const { name, className, description, localized, header, ftlChromeSubPath, sharedFtl } = options;
|
|
28
29
|
// A `*/` in the operator-supplied description would close the JSDoc block
|
|
29
30
|
// early and leave the remainder as stray code. Escaped here rather than
|
|
30
31
|
// rejected at input, because the same text is also rendered by
|
|
@@ -35,10 +36,10 @@ export function generateMjsContent(name, className, description, localized, head
|
|
|
35
36
|
: ftlChromeSubPath !== undefined
|
|
36
37
|
? `${ftlChromeSubPath}/${name}.ftl`
|
|
37
38
|
: `${name}.ftl`;
|
|
38
|
-
//
|
|
39
|
-
// three sources
|
|
40
|
-
// and a derived `<name>.ftl`
|
|
41
|
-
// `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
|
|
42
43
|
// string literal for all of them, including the `"` and raw-newline cases
|
|
43
44
|
// that would otherwise break the generated module into a syntax error.
|
|
44
45
|
const ftlModulePreamble = localized
|
|
@@ -117,7 +118,7 @@ export function xpcshellTestFileName(name) {
|
|
|
117
118
|
* Generates an xpcshell test file for a custom component.
|
|
118
119
|
*
|
|
119
120
|
* xpcshell cannot execute a component module that imports
|
|
120
|
-
* `chrome://global/content/vendor/lit.all.mjs
|
|
121
|
+
* `chrome://global/content/vendor/lit.all.mjs`: the Lit bundle touches
|
|
121
122
|
* `window` at module-load time and the xpcshell harness has no `window`
|
|
122
123
|
* global. A scaffold that calls `ChromeUtils.importESModule` on the
|
|
123
124
|
* component's MJS therefore fails with `ReferenceError: window is not
|
|
@@ -128,9 +129,9 @@ export function xpcshellTestFileName(name) {
|
|
|
128
129
|
* This template mirrors the chrome-doc packaging test instead: XCurProcD is
|
|
129
130
|
* probed at a pair of candidate layouts (dist/bin/browser and the macOS
|
|
130
131
|
* .app-bundle / ESR layout) to confirm the `.mjs` and `.css` files landed
|
|
131
|
-
* where jar.mn promised. That is the assertion xpcshell
|
|
132
|
+
* where jar.mn promised. That is the assertion xpcshell can make. Functional
|
|
132
133
|
* tests that need DOM/shadow-root/keyboard behaviour belong in a
|
|
133
|
-
* browser-chrome mochitest
|
|
134
|
+
* browser-chrome mochitest, scaffolded via
|
|
134
135
|
* `fireforge furnace create --test-style browser-chrome`.
|
|
135
136
|
*/
|
|
136
137
|
export function generateXpcshellTestContent(name, header) {
|
|
@@ -212,7 +213,7 @@ add_task(async function test_${taskSuffix}_files_packaged() {
|
|
|
212
213
|
}
|
|
213
214
|
/**
|
|
214
215
|
* Generates an `xpcshell.toml` manifest for a custom component's test
|
|
215
|
-
* directory. Kept minimal
|
|
216
|
+
* directory. Kept minimal: adding prefs, head.js, and support-files is
|
|
216
217
|
* left to the operator because those decisions depend on what the
|
|
217
218
|
* component actually touches (Services.storage, observer topics, etc.).
|
|
218
219
|
*/
|
|
@@ -237,17 +238,17 @@ export function mochikitTestFileName(name) {
|
|
|
237
238
|
* They run on forks whose top-level chrome document lacks a `tabbrowser`
|
|
238
239
|
* because they do not traverse `URILoadingHelper.openLinkIn`.
|
|
239
240
|
*
|
|
240
|
-
* The scaffold is a smoke test
|
|
241
|
+
* The scaffold is a smoke test: the component is defined and the
|
|
241
242
|
* constructor is a function. Real UI assertions (render output, l10n wiring,
|
|
242
243
|
* keyboard interactions) are left out because they depend on the
|
|
243
|
-
* component's shape
|
|
244
|
+
* component's shape. Operators can extend the test using the same SimpleTest
|
|
244
245
|
* APIs upstream toolkit widgets rely on.
|
|
245
246
|
*
|
|
246
|
-
* The template
|
|
247
|
+
* The template omits `SimpleTest.waitForExplicitFinish()` on purpose.
|
|
247
248
|
* `add_task` owns the test lifecycle: when every queued task resolves, the
|
|
248
249
|
* task harness calls `SimpleTest.finish()` itself. Combining
|
|
249
250
|
* `waitForExplicitFinish()` with `add_task` and no explicit
|
|
250
|
-
* `SimpleTest.finish()` in the task body makes the harness wait forever
|
|
251
|
+
* `SimpleTest.finish()` in the task body makes the harness wait forever,
|
|
251
252
|
* an indefinite hang on `fireforge test --headless`. Omitting it matches the
|
|
252
253
|
* convention upstream toolkit widget tests use.
|
|
253
254
|
*/
|
|
@@ -280,7 +281,7 @@ export function generateMochikitTestContent(name) {
|
|
|
280
281
|
/**
|
|
281
282
|
* Generates the `chrome.toml` entry block to append for a newly scaffolded
|
|
282
283
|
* mochikit test. When the manifest already exists the caller appends this
|
|
283
|
-
* snippet
|
|
284
|
+
* snippet. When it is absent, the caller writes a file that starts with a
|
|
284
285
|
* `[DEFAULT]` stanza followed by this block.
|
|
285
286
|
*/
|
|
286
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
|
|
@@ -3,7 +3,7 @@ import { join } from 'node:path';
|
|
|
3
3
|
import { text } from '@clack/prompts';
|
|
4
4
|
import { getProjectPaths, loadConfig } from '../../core/config.js';
|
|
5
5
|
import { stdioIsInteractive } from '../../core/destructive.js';
|
|
6
|
-
import {
|
|
6
|
+
import { getFurnacePaths, writeFurnaceConfig } from '../../core/furnace-config.js';
|
|
7
7
|
import { resolveFtlChromeSubPath, tagNameToClassName, WIDGETS_DIR, } from '../../core/furnace-constants.js';
|
|
8
8
|
import { completeJournalRollback, runFurnaceMutation, } from '../../core/furnace-operation.js';
|
|
9
9
|
import { CUSTOM_ELEMENT_TAG_PATTERN, CUSTOM_ELEMENT_TAG_RULES, describeTagNameProblem, } from '../../core/furnace-registration-validate.js';
|
|
@@ -15,6 +15,7 @@ import { InvalidArgumentError } from '../../errors/base.js';
|
|
|
15
15
|
import { FurnaceError } from '../../errors/furnace.js';
|
|
16
16
|
import { ensureDir, pathExists, writeText } from '../../utils/fs.js';
|
|
17
17
|
import { cancel, intro, isCancel, note, outro } from '../../utils/logger.js';
|
|
18
|
+
import { loadAuthoringFurnaceConfig } from './authoring-config.js';
|
|
18
19
|
import { resolveValidatedTestDir, scaffoldTestFiles } from './create-browser-test.js';
|
|
19
20
|
import { formatDryRunPlan, formatSuccessNote } from './create-dry-run.js';
|
|
20
21
|
import { resolveCreateFeatures } from './create-features.js';
|
|
@@ -23,12 +24,6 @@ import { assertCustomEntryPersisted } from './create-readback.js';
|
|
|
23
24
|
import { generateCssContent, generateFtlContent, generateMjsContent } from './create-templates.js';
|
|
24
25
|
import { validateCreateAgainstConfig } from './create-validation.js';
|
|
25
26
|
import { scaffoldXpcshellTestFiles } from './create-xpcshell.js';
|
|
26
|
-
async function loadAuthoringFurnaceConfig(projectRoot) {
|
|
27
|
-
if (await furnaceConfigExists(projectRoot)) {
|
|
28
|
-
return loadFurnaceConfig(projectRoot);
|
|
29
|
-
}
|
|
30
|
-
return createDefaultFurnaceConfig();
|
|
31
|
-
}
|
|
32
27
|
function knownComponentSet(config) {
|
|
33
28
|
return new Set([
|
|
34
29
|
...config.stock,
|
|
@@ -64,24 +59,25 @@ function validateTagName(name) {
|
|
|
64
59
|
}
|
|
65
60
|
/**
|
|
66
61
|
* Writes the scaffolded component source files to disk.
|
|
67
|
-
* @param
|
|
68
|
-
* @param componentName - Custom element tag name
|
|
69
|
-
* @param className - Generated component class name
|
|
70
|
-
* @param description - Human-readable component description
|
|
71
|
-
* @param localized - Whether to include a Fluent file
|
|
72
|
-
* @param license - Project license used for generated headers
|
|
73
|
-
* @param ftlChromeSubPath - chrome:// sub-path for the generated FTL reference, when localized
|
|
74
|
-
* @param sharedFtl - Explicit shared FTL path from `--shared-ftl`, when supplied
|
|
75
|
-
* @param journal - Optional rollback journal that snapshots files before writes
|
|
62
|
+
* @param options - See {@link WriteComponentFilesOptions}
|
|
76
63
|
* @returns Relative filenames written for the component
|
|
77
64
|
*/
|
|
78
|
-
async function writeComponentFiles(
|
|
65
|
+
async function writeComponentFiles(options) {
|
|
66
|
+
const { componentDir, componentName, className, description, localized, license, ftlChromeSubPath, sharedFtl, journal, } = options;
|
|
79
67
|
await ensureDir(componentDir);
|
|
80
68
|
const files = [`${componentName}.mjs`, `${componentName}.css`];
|
|
81
69
|
const mjsPath = join(componentDir, `${componentName}.mjs`);
|
|
82
70
|
if (journal)
|
|
83
71
|
await snapshotFile(journal, mjsPath);
|
|
84
|
-
const mjsContent = generateMjsContent(
|
|
72
|
+
const mjsContent = generateMjsContent({
|
|
73
|
+
name: componentName,
|
|
74
|
+
className,
|
|
75
|
+
description,
|
|
76
|
+
localized,
|
|
77
|
+
header: getLicenseHeader(license, 'js'),
|
|
78
|
+
ftlChromeSubPath,
|
|
79
|
+
sharedFtl,
|
|
80
|
+
});
|
|
85
81
|
await writeText(mjsPath, mjsContent);
|
|
86
82
|
const cssPath = join(componentDir, `${componentName}.css`);
|
|
87
83
|
if (journal)
|
|
@@ -90,7 +86,7 @@ async function writeComponentFiles(componentDir, componentName, className, descr
|
|
|
90
86
|
await writeText(cssPath, cssContent);
|
|
91
87
|
// Skip the per-component .ftl stub when the component participates in a
|
|
92
88
|
// pre-existing feature-scoped bundle. The shared bundle is owned
|
|
93
|
-
// elsewhere
|
|
89
|
+
// elsewhere. Dropping a stub here would clutter the workspace with
|
|
94
90
|
// empty files that never get packaged (furnace apply also skips copying
|
|
95
91
|
// them in this mode).
|
|
96
92
|
if (localized && !sharedFtl) {
|
|
@@ -110,7 +106,7 @@ async function writeComponentFiles(componentDir, componentName, className, descr
|
|
|
110
106
|
* Invariants:
|
|
111
107
|
* - `--xpcshell` alone is equivalent to `--test-style=xpcshell`.
|
|
112
108
|
* - `--with-tests` alone (no `--test-style`) defaults to `browser-chrome`
|
|
113
|
-
* (multi-process mochitest
|
|
109
|
+
* (multi-process mochitest, reliable on macOS for interactive chrome).
|
|
114
110
|
* Forks whose chrome document has no `tabbrowser` should pass
|
|
115
111
|
* `--test-style=mochikit` explicitly.
|
|
116
112
|
* - When both `--xpcshell` and `--with-tests` are set, `--xpcshell` wins
|
|
@@ -139,8 +135,8 @@ export function resolveTestStyle(options) {
|
|
|
139
135
|
* state.
|
|
140
136
|
*/
|
|
141
137
|
async function performCreateMutations(args) {
|
|
142
|
-
// Invariant: the journal
|
|
143
|
-
//
|
|
138
|
+
// Invariant: the journal must be registered with the operation context
|
|
139
|
+
// before any filesystem mutation (including recordCreatedDir, whose entries
|
|
144
140
|
// are consulted by SIGINT rollback). The try/catch below assumes signal
|
|
145
141
|
// handlers can find the journal for any partial write that follows.
|
|
146
142
|
const journal = createRollbackJournal();
|
|
@@ -165,7 +161,17 @@ async function performCreateMutations(args) {
|
|
|
165
161
|
// so signal-driven rollback can clean it up even if writeComponentFiles
|
|
166
162
|
// is interrupted mid-ensureDir.
|
|
167
163
|
recordCreatedDir(journal, args.componentDir);
|
|
168
|
-
files = await writeComponentFiles(
|
|
164
|
+
files = await writeComponentFiles({
|
|
165
|
+
componentDir: args.componentDir,
|
|
166
|
+
componentName: args.componentName,
|
|
167
|
+
className: args.className,
|
|
168
|
+
description: args.description,
|
|
169
|
+
localized: args.localized,
|
|
170
|
+
license: args.license,
|
|
171
|
+
ftlChromeSubPath: resolveFtlChromeSubPath(freshConfig.ftlBasePath),
|
|
172
|
+
sharedFtl: args.sharedFtl,
|
|
173
|
+
journal,
|
|
174
|
+
});
|
|
169
175
|
const customEntry = {
|
|
170
176
|
description: args.description,
|
|
171
177
|
targetPath: `${WIDGETS_DIR}/${args.componentName}`,
|
|
@@ -263,7 +269,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
|
|
|
263
269
|
const license = forgeConfig.license ?? DEFAULT_LICENSE;
|
|
264
270
|
const furnacePaths = getFurnacePaths(projectRoot);
|
|
265
271
|
if (!componentName) {
|
|
266
|
-
// Interactive prompt path
|
|
272
|
+
// Interactive prompt path. Non-interactive missing-name was rejected above.
|
|
267
273
|
const nameResult = await text({
|
|
268
274
|
message: 'Component tag name:',
|
|
269
275
|
placeholder: 'moz-my-widget',
|
|
@@ -309,7 +315,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
|
|
|
309
315
|
// partial mutation behind.
|
|
310
316
|
const testStyle = resolveTestStyle(options);
|
|
311
317
|
const testDir = resolveValidatedTestDir(options.testDir, testStyle);
|
|
312
|
-
// Not routed through assertFurnaceEngineReady: this rung is
|
|
318
|
+
// Not routed through assertFurnaceEngineReady: this rung is conditional on
|
|
313
319
|
// a test style being requested, and it names the component so the refusal
|
|
314
320
|
// identifies which create failed. Both are outside the shared helper's
|
|
315
321
|
// shape, and a scaffold without --with-tests must keep working with no
|
|
@@ -328,7 +334,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
|
|
|
328
334
|
// structural rules with furnace-config.ts so the command and the on-disk
|
|
329
335
|
// schema cannot diverge. Pass the resolved `localized` rather than a `true`
|
|
330
336
|
// literal so the validator's cross-field check stays anchored to the real
|
|
331
|
-
// feature selection
|
|
337
|
+
// feature selection. `resolveCreateFeatures` promotes localized upstream,
|
|
332
338
|
// and hard-coding `true` here would hide a regression if that promotion
|
|
333
339
|
// ever moved or dropped.
|
|
334
340
|
let sharedFtl;
|
|
@@ -339,10 +345,10 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
|
|
|
339
345
|
}
|
|
340
346
|
sharedFtl = result.value;
|
|
341
347
|
}
|
|
342
|
-
// Dry-run exits here
|
|
348
|
+
// Dry-run exits here. Every validation that does not need a write has
|
|
343
349
|
// already run, so the plan we render reflects exactly what the real
|
|
344
350
|
// command would do. The mutation phase and its rollback journal are
|
|
345
|
-
//
|
|
351
|
+
// skipped so no furnace.json/engine state is touched.
|
|
346
352
|
if (isDryRun) {
|
|
347
353
|
const plan = formatDryRunPlan({
|
|
348
354
|
componentName,
|
|
@@ -351,7 +357,7 @@ export async function furnaceCreateCommand(projectRoot, name, options = {}) {
|
|
|
351
357
|
composes,
|
|
352
358
|
stockAdditions,
|
|
353
359
|
// Spread rather than assign so the key is absent when sharedFtl is
|
|
354
|
-
// undefined
|
|
360
|
+
// undefined. The DryRunPlanInput type uses a strict-optional shape.
|
|
355
361
|
...(sharedFtl !== undefined ? { sharedFtl } : {}),
|
|
356
362
|
testStyle,
|
|
357
363
|
description,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { loadConfig } from '../../core/config.js';
|
|
3
3
|
import { applyAllComponents } from '../../core/furnace-apply.js';
|
|
4
4
|
import { logApplyResult } from '../../core/furnace-apply-output.js';
|
|
5
|
-
import { getFurnacePaths
|
|
5
|
+
import { getFurnacePaths } from '../../core/furnace-config.js';
|
|
6
6
|
import { reportJsconfigPathsSync } from '../../core/furnace-jsconfig.js';
|
|
7
7
|
import { runFurnaceMutation, waitLockMutationOptions, } from '../../core/furnace-operation.js';
|
|
8
8
|
import { assertFurnaceReady } from '../../core/furnace-precondition.js';
|
|
@@ -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);
|
|
@@ -203,7 +203,16 @@ export async function furnaceDeployCommand(projectRoot, name, options = {}) {
|
|
|
203
203
|
}
|
|
204
204
|
const validateSpinner = spinner(isDryRun ? 'Validating (read-only)...' : 'Validating...');
|
|
205
205
|
const failedComponents = getFailedComponentNames(result);
|
|
206
|
-
const validation = await runDeployValidation(
|
|
206
|
+
const validation = await runDeployValidation({
|
|
207
|
+
validateSpinner,
|
|
208
|
+
name,
|
|
209
|
+
config,
|
|
210
|
+
furnacePaths,
|
|
211
|
+
failedComponents,
|
|
212
|
+
isDryRun,
|
|
213
|
+
projectRoot,
|
|
214
|
+
dryRunActions: result.actions,
|
|
215
|
+
});
|
|
207
216
|
if (validation.done)
|
|
208
217
|
return;
|
|
209
218
|
const { totalErrors, totalWarnings, componentCount, skippedValidationCount } = validation;
|
|
@@ -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);
|