@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,10 @@ export declare function extractComponentChecksums(allChecksums: Record<string, s
|
|
|
3
3
|
/** Prefixes component checksums so they can be stored in the flattened state format. */
|
|
4
4
|
export declare function prefixChecksums(checksums: Record<string, string>, type: string, name: string): Record<string, string>;
|
|
5
5
|
/**
|
|
6
|
-
* Returns the filenames present in `previous` that are absent from
|
|
7
|
-
*
|
|
8
|
-
* deleted. The order of returned names is
|
|
9
|
-
*
|
|
6
|
+
* Returns the filenames present in `previous` that are absent from
|
|
7
|
+
* `current`, i.e. files we know we deployed last time but the workspace has
|
|
8
|
+
* since deleted. The order of returned names is stable (sorted
|
|
9
|
+
* alphabetically) so test snapshots and CLI output are deterministic.
|
|
10
10
|
*/
|
|
11
11
|
export declare function diffDeletedFiles(previous: Record<string, string>, current: Record<string, string>): string[];
|
|
12
12
|
/**
|
|
@@ -15,7 +15,7 @@ export declare function diffDeletedFiles(previous: Record<string, string>, curre
|
|
|
15
15
|
* Strips a leading BOM and folds CRLF to LF, so a file that differs from its
|
|
16
16
|
* deployed copy only by line endings or a byte-order mark is not reported as
|
|
17
17
|
* drift. Every comparison that decides "has this component changed?" must
|
|
18
|
-
* use it
|
|
18
|
+
* use it. Otherwise `furnace status` and `furnace validate` can disagree
|
|
19
19
|
* with `apply`'s skip fast-path about the same pair of files on a CRLF
|
|
20
20
|
* checkout.
|
|
21
21
|
*
|
|
@@ -22,10 +22,10 @@ export function prefixChecksums(checksums, type, name) {
|
|
|
22
22
|
return result;
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
* Returns the filenames present in `previous` that are absent from
|
|
26
|
-
*
|
|
27
|
-
* deleted. The order of returned names is
|
|
28
|
-
*
|
|
25
|
+
* Returns the filenames present in `previous` that are absent from
|
|
26
|
+
* `current`, i.e. files we know we deployed last time but the workspace has
|
|
27
|
+
* since deleted. The order of returned names is stable (sorted
|
|
28
|
+
* alphabetically) so test snapshots and CLI output are deterministic.
|
|
29
29
|
*/
|
|
30
30
|
export function diffDeletedFiles(previous, current) {
|
|
31
31
|
const deleted = [];
|
|
@@ -42,7 +42,7 @@ export function diffDeletedFiles(previous, current) {
|
|
|
42
42
|
* Strips a leading BOM and folds CRLF to LF, so a file that differs from its
|
|
43
43
|
* deployed copy only by line endings or a byte-order mark is not reported as
|
|
44
44
|
* drift. Every comparison that decides "has this component changed?" must
|
|
45
|
-
* use it
|
|
45
|
+
* use it. Otherwise `furnace status` and `furnace validate` can disagree
|
|
46
46
|
* with `apply`'s skip fast-path about the same pair of files on a CRLF
|
|
47
47
|
* checkout.
|
|
48
48
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Parser for the `custom` entries in furnace.json. Extracted from
|
|
3
3
|
* `furnace-config.ts` so the main config module stays under the
|
|
4
|
-
* per-file LOC budget
|
|
4
|
+
* per-file LOC budget. The custom-component schema has grown to
|
|
5
5
|
* carry opt-in fields (`composes`, `keyboardCovered`, `sharedFtl`) that
|
|
6
6
|
* each add their own validation branch.
|
|
7
7
|
*/
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Parser for the `custom` entries in furnace.json. Extracted from
|
|
4
4
|
* `furnace-config.ts` so the main config module stays under the
|
|
5
|
-
* per-file LOC budget
|
|
5
|
+
* per-file LOC budget. The custom-component schema has grown to
|
|
6
6
|
* carry opt-in fields (`composes`, `keyboardCovered`, `sharedFtl`) that
|
|
7
7
|
* each add their own validation branch.
|
|
8
8
|
*/
|
|
@@ -65,7 +65,7 @@ export function parseCustomConfig(data, name) {
|
|
|
65
65
|
? { composes: parseStringArray(data['composes'], `${name}.composes`) }
|
|
66
66
|
: {}),
|
|
67
67
|
...(data['keyboardCovered'] === true ? { keyboardCovered: true } : {}),
|
|
68
|
-
// Explicit `kind: "element"` is the default
|
|
68
|
+
// Explicit `kind: "element"` is the default. Normalize it away so the
|
|
69
69
|
// stored config carries the field only when it changes behavior.
|
|
70
70
|
...(data['kind'] === 'library' ? { kind: 'library' } : {}),
|
|
71
71
|
...(sharedFtl !== undefined ? { sharedFtl } : {}),
|
|
@@ -60,7 +60,7 @@ function orderComponentMapLikeExisting(existing, next) {
|
|
|
60
60
|
export function orderFurnaceConfigForWrite(existing, config) {
|
|
61
61
|
// FurnaceConfig is plain parsed-JSON data, but as an interface it carries
|
|
62
62
|
// no index signature, so the compiler cannot verify the JsonObject
|
|
63
|
-
// contract structurally
|
|
63
|
+
// contract structurally, hence the double assertion. This is the one
|
|
64
64
|
// place a typed furnace config re-enters the raw-document world.
|
|
65
65
|
// eslint-disable-next-line no-restricted-syntax -- see above
|
|
66
66
|
const next = config;
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
/**
|
|
7
7
|
* Validates a `tokenHostDocuments` raw value. Each entry must be a non-empty
|
|
8
8
|
* relative path contained in the engine tree. Throws `FurnaceError` on
|
|
9
|
-
* violation
|
|
9
|
+
* violation. Does nothing for `undefined` (field is optional).
|
|
10
10
|
*/
|
|
11
11
|
export declare function validateTokenHostDocuments(raw: unknown): void;
|
|
12
12
|
/**
|
|
13
13
|
* Validates a `runtimeVariables` raw value. Each entry must start with `--`
|
|
14
|
-
* (it is a CSS custom property name). Throws `FurnaceError` on violation
|
|
15
|
-
*
|
|
14
|
+
* (it is a CSS custom property name). Throws `FurnaceError` on violation.
|
|
15
|
+
* Does nothing for `undefined` (field is optional).
|
|
16
16
|
*/
|
|
17
17
|
export declare function validateRuntimeVariables(raw: unknown): void;
|
|
@@ -10,7 +10,7 @@ import { parseStringArray } from './furnace-config-array-utils.js';
|
|
|
10
10
|
/**
|
|
11
11
|
* Validates a `tokenHostDocuments` raw value. Each entry must be a non-empty
|
|
12
12
|
* relative path contained in the engine tree. Throws `FurnaceError` on
|
|
13
|
-
* violation
|
|
13
|
+
* violation. Does nothing for `undefined` (field is optional).
|
|
14
14
|
*/
|
|
15
15
|
export function validateTokenHostDocuments(raw) {
|
|
16
16
|
if (raw === undefined)
|
|
@@ -27,8 +27,8 @@ export function validateTokenHostDocuments(raw) {
|
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
29
|
* Validates a `runtimeVariables` raw value. Each entry must start with `--`
|
|
30
|
-
* (it is a CSS custom property name). Throws `FurnaceError` on violation
|
|
31
|
-
*
|
|
30
|
+
* (it is a CSS custom property name). Throws `FurnaceError` on violation.
|
|
31
|
+
* Does nothing for `undefined` (field is optional).
|
|
32
32
|
*/
|
|
33
33
|
export function validateRuntimeVariables(raw) {
|
|
34
34
|
if (raw === undefined)
|
|
@@ -110,8 +110,8 @@ export function applyOptionalFurnaceFields(migrated, config) {
|
|
|
110
110
|
}
|
|
111
111
|
config.ftlBasePath = migrated['ftlBasePath'];
|
|
112
112
|
}
|
|
113
|
-
// Validate optional typecheckJsconfig
|
|
114
|
-
// chrome-elements `paths` entries Furnace maintains on deploy.
|
|
113
|
+
// Validate optional typecheckJsconfig. This is a consumer-owned jsconfig
|
|
114
|
+
// whose chrome-elements `paths` entries Furnace maintains on deploy.
|
|
115
115
|
if (migrated['typecheckJsconfig'] !== undefined) {
|
|
116
116
|
const jsconfigPath = migrated['typecheckJsconfig'];
|
|
117
117
|
if (!isString(jsconfigPath) || jsconfigPath.includes('..')) {
|
|
@@ -6,7 +6,7 @@ export declare const SHARED_FRAGMENTS_DIR = "shared";
|
|
|
6
6
|
/**
|
|
7
7
|
* Paths for furnace-related files and directories.
|
|
8
8
|
*/
|
|
9
|
-
interface FurnacePaths {
|
|
9
|
+
export interface FurnacePaths {
|
|
10
10
|
/** Path to furnace.json */
|
|
11
11
|
furnaceConfig: string;
|
|
12
12
|
/** Path to components directory */
|
|
@@ -70,8 +70,8 @@ export declare function writeFurnaceConfig(root: string, config: FurnaceConfig):
|
|
|
70
70
|
* matching override stamp `doctor` fails Furnace component validation on
|
|
71
71
|
* every override.
|
|
72
72
|
*
|
|
73
|
-
* The stamp is
|
|
74
|
-
*
|
|
73
|
+
* The stamp is unconditional: `fireforge furnace validate` is the right
|
|
74
|
+
* tool for "does this override still apply", and rebase has
|
|
75
75
|
* already attested that the patch layer re-validated against the new ESR.
|
|
76
76
|
*
|
|
77
77
|
* @param root - Root directory of the project
|
|
@@ -92,11 +92,11 @@ export declare function stampFurnaceOverrideBaseVersions(root: string, version:
|
|
|
92
92
|
* declarations.
|
|
93
93
|
*
|
|
94
94
|
* `validateFurnaceConfig` treats `tokenPrefix` as optional, so callers on
|
|
95
|
-
* the no-arg call shape still get a valid config without a prefix
|
|
95
|
+
* the no-arg call shape still get a valid config without a prefix. The CLI
|
|
96
96
|
* init path always has a `binaryName` from `fireforge.json` and always sets
|
|
97
97
|
* one.
|
|
98
98
|
*
|
|
99
|
-
* @param options - Optional init context
|
|
99
|
+
* @param options - Optional init context. Pass `{ binaryName }` to derive
|
|
100
100
|
* the token prefix.
|
|
101
101
|
* @returns A valid FurnaceConfig
|
|
102
102
|
*/
|
|
@@ -53,25 +53,18 @@ export async function furnaceConfigExists(root) {
|
|
|
53
53
|
const paths = getFurnacePaths(root);
|
|
54
54
|
return pathExists(paths.furnaceConfig);
|
|
55
55
|
}
|
|
56
|
+
/** True when a recovered record carries at least one entry. */
|
|
57
|
+
function hasEntries(record) {
|
|
58
|
+
return Object.keys(record).length > 0;
|
|
59
|
+
}
|
|
56
60
|
/** The current (and only) config schema version. */
|
|
57
61
|
const CURRENT_CONFIG_VERSION = 1;
|
|
58
62
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* When a future version 2 is introduced, add a `case 1:` that transforms
|
|
63
|
-
* v1 data into v2 shape and falls through to validation. The pattern is:
|
|
64
|
-
*
|
|
65
|
-
* ```
|
|
66
|
-
* case 1:
|
|
67
|
-
* data = migrateV1ToV2(data);
|
|
68
|
-
* // fallthrough
|
|
69
|
-
* case 2:
|
|
70
|
-
* break;
|
|
71
|
-
* ```
|
|
63
|
+
* Rejects a config whose `version` field is not the single schema version that
|
|
64
|
+
* exists. A non-integer or sub-1 value is a malformed document. A value above
|
|
65
|
+
* the current version was written by a newer FireForge and cannot be read here.
|
|
72
66
|
*/
|
|
73
|
-
function
|
|
74
|
-
const version = data['version'];
|
|
67
|
+
function validateConfigVersion(version) {
|
|
75
68
|
if (typeof version !== 'number' || !Number.isInteger(version) || version < 1) {
|
|
76
69
|
throw new FurnaceError(`Furnace config: "version" must be a positive integer (got ${JSON.stringify(version)}). ` +
|
|
77
70
|
`Current schema version is ${CURRENT_CONFIG_VERSION}.`);
|
|
@@ -80,9 +73,6 @@ function migrateFurnaceConfig(data) {
|
|
|
80
73
|
throw new FurnaceError(`Furnace config: version ${version} is newer than what this version of FireForge supports (${CURRENT_CONFIG_VERSION}). ` +
|
|
81
74
|
'Upgrade FireForge to read this config.');
|
|
82
75
|
}
|
|
83
|
-
// Today only version 1 exists, so no migration is needed. When future
|
|
84
|
-
// versions are added, migration steps will be chained here.
|
|
85
|
-
return data;
|
|
86
76
|
}
|
|
87
77
|
/**
|
|
88
78
|
* Validates a raw config object and returns a typed FurnaceConfig.
|
|
@@ -97,39 +87,36 @@ export function validateFurnaceConfig(data) {
|
|
|
97
87
|
// Furnace config documents arrive from JSON.parse (loadFurnaceConfig /
|
|
98
88
|
// writeFurnaceConfig round-trips), which can only produce JSON values,
|
|
99
89
|
// so the object check above is the only invariant left to establish.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (
|
|
103
|
-
throw new FurnaceError(`Furnace config: "version" must be ${CURRENT_CONFIG_VERSION} after migration`);
|
|
104
|
-
}
|
|
105
|
-
if (!isString(migrated['componentPrefix'])) {
|
|
90
|
+
const raw = data;
|
|
91
|
+
validateConfigVersion(raw['version']);
|
|
92
|
+
if (!isString(raw['componentPrefix'])) {
|
|
106
93
|
throw new FurnaceError('Furnace config: "componentPrefix" must be a string');
|
|
107
94
|
}
|
|
108
95
|
// Validate optional tokenPrefix
|
|
109
|
-
if (
|
|
96
|
+
if (raw['tokenPrefix'] !== undefined && !isString(raw['tokenPrefix'])) {
|
|
110
97
|
throw new FurnaceError('Furnace config: "tokenPrefix" must be a string if provided');
|
|
111
98
|
}
|
|
112
99
|
// Validate optional tokenAllowlist
|
|
113
|
-
if (
|
|
114
|
-
parseStringArray(
|
|
100
|
+
if (raw['tokenAllowlist'] !== undefined) {
|
|
101
|
+
parseStringArray(raw['tokenAllowlist'], 'tokenAllowlist');
|
|
115
102
|
}
|
|
116
|
-
// Validate optional runtimeVariables
|
|
103
|
+
// Validate optional runtimeVariables: CSS runtime state channels
|
|
117
104
|
// (e.g. `--cam-x`) that are exempt from `token-prefix-violation`.
|
|
118
|
-
validateRuntimeVariables(
|
|
119
|
-
// Validate optional tokenHostDocuments
|
|
105
|
+
validateRuntimeVariables(raw['runtimeVariables']);
|
|
106
|
+
// Validate optional tokenHostDocuments: list of chrome XHTMLs that the
|
|
120
107
|
// `missing-token-link` validator scans for the tokens CSS link.
|
|
121
|
-
validateTokenHostDocuments(
|
|
122
|
-
const stock = parseStockList(
|
|
123
|
-
const overrides = parseNamedComponentMap(
|
|
124
|
-
const custom = parseNamedComponentMap(
|
|
108
|
+
validateTokenHostDocuments(raw['tokenHostDocuments']);
|
|
109
|
+
const stock = parseStockList(raw['stock']);
|
|
110
|
+
const overrides = parseNamedComponentMap(raw['overrides'], 'override', 'overrides', parseOverrideConfig);
|
|
111
|
+
const custom = parseNamedComponentMap(raw['custom'], 'custom', 'custom', parseCustomConfig);
|
|
125
112
|
// Detect circular composes references among custom components.
|
|
126
113
|
detectComposesCycles(custom);
|
|
127
114
|
// Validate that every composes reference points to a known component.
|
|
128
115
|
validateComposesReferences(stock, overrides, custom);
|
|
129
116
|
// Warn when two custom components share a targetPath. Nothing technically
|
|
130
117
|
// prevents co-location, but per-component removal and orphan detection
|
|
131
|
-
// both reason about "files this component deployed into its directory"
|
|
132
|
-
//
|
|
118
|
+
// both reason about "files this component deployed into its directory".
|
|
119
|
+
// Shared directories make those judgements ambiguous, and can lead to
|
|
133
120
|
// `furnace remove` of one component deleting the other's deployed files.
|
|
134
121
|
const targetPathOwners = new Map();
|
|
135
122
|
for (const [name, custom_] of Object.entries(custom)) {
|
|
@@ -146,12 +133,12 @@ export function validateFurnaceConfig(data) {
|
|
|
146
133
|
}
|
|
147
134
|
const config = {
|
|
148
135
|
version: CURRENT_CONFIG_VERSION,
|
|
149
|
-
componentPrefix:
|
|
136
|
+
componentPrefix: raw['componentPrefix'],
|
|
150
137
|
stock,
|
|
151
138
|
overrides,
|
|
152
139
|
custom,
|
|
153
140
|
};
|
|
154
|
-
applyOptionalFurnaceFields(
|
|
141
|
+
applyOptionalFurnaceFields(raw, config);
|
|
155
142
|
return config;
|
|
156
143
|
}
|
|
157
144
|
/**
|
|
@@ -167,8 +154,8 @@ function validateFurnaceState(data) {
|
|
|
167
154
|
return result.state;
|
|
168
155
|
}
|
|
169
156
|
// Single source of truth: the list the union is derived from. The copy
|
|
170
|
-
// this replaced was annotated
|
|
171
|
-
// from the union but never one
|
|
157
|
+
// this replaced was annotated rather than linked, so it caught a member
|
|
158
|
+
// removed from the union but never one added to it, and listed them in a
|
|
172
159
|
// different order.
|
|
173
160
|
const PENDING_REPAIR_OPERATIONS = FURNACE_PENDING_REPAIR_OPERATIONS;
|
|
174
161
|
function parsePendingRepair(data) {
|
|
@@ -228,7 +215,7 @@ function sanitizeFurnaceState(data) {
|
|
|
228
215
|
}
|
|
229
216
|
appliedChecksums[filePath] = checksum;
|
|
230
217
|
}
|
|
231
|
-
if (
|
|
218
|
+
if (hasEntries(appliedChecksums) || !hasInvalidChecksum) {
|
|
232
219
|
state.appliedChecksums = appliedChecksums;
|
|
233
220
|
recoveredFields.push('appliedChecksums');
|
|
234
221
|
}
|
|
@@ -245,7 +232,7 @@ function sanitizeFurnaceState(data) {
|
|
|
245
232
|
engineChecksums[filePath] = checksum;
|
|
246
233
|
}
|
|
247
234
|
}
|
|
248
|
-
if (
|
|
235
|
+
if (hasEntries(engineChecksums)) {
|
|
249
236
|
state.engineChecksums = engineChecksums;
|
|
250
237
|
recoveredFields.push('engineChecksums');
|
|
251
238
|
}
|
|
@@ -351,14 +338,14 @@ export async function writeFurnaceConfig(root, config) {
|
|
|
351
338
|
if (await pathExists(paths.furnaceConfig)) {
|
|
352
339
|
try {
|
|
353
340
|
const raw = await readJson(paths.furnaceConfig);
|
|
354
|
-
// JSON.parse
|
|
355
|
-
//
|
|
341
|
+
// JSON.parse only produces JSON data, so the object check is the
|
|
342
|
+
// only invariant left for the JsonObject contract.
|
|
356
343
|
if (isObject(raw))
|
|
357
344
|
existing = raw;
|
|
358
345
|
}
|
|
359
346
|
catch {
|
|
360
347
|
// A missing or corrupt furnace.json means there is no prior document to
|
|
361
|
-
// preserve key order from
|
|
348
|
+
// preserve key order from. The writer falls back to canonical ordering.
|
|
362
349
|
existing = undefined;
|
|
363
350
|
}
|
|
364
351
|
}
|
|
@@ -372,8 +359,8 @@ export async function writeFurnaceConfig(root, config) {
|
|
|
372
359
|
* matching override stamp `doctor` fails Furnace component validation on
|
|
373
360
|
* every override.
|
|
374
361
|
*
|
|
375
|
-
* The stamp is
|
|
376
|
-
*
|
|
362
|
+
* The stamp is unconditional: `fireforge furnace validate` is the right
|
|
363
|
+
* tool for "does this override still apply", and rebase has
|
|
377
364
|
* already attested that the patch layer re-validated against the new ESR.
|
|
378
365
|
*
|
|
379
366
|
* @param root - Root directory of the project
|
|
@@ -409,11 +396,11 @@ export async function stampFurnaceOverrideBaseVersions(root, version) {
|
|
|
409
396
|
* declarations.
|
|
410
397
|
*
|
|
411
398
|
* `validateFurnaceConfig` treats `tokenPrefix` as optional, so callers on
|
|
412
|
-
* the no-arg call shape still get a valid config without a prefix
|
|
399
|
+
* the no-arg call shape still get a valid config without a prefix. The CLI
|
|
413
400
|
* init path always has a `binaryName` from `fireforge.json` and always sets
|
|
414
401
|
* one.
|
|
415
402
|
*
|
|
416
|
-
* @param options - Optional init context
|
|
403
|
+
* @param options - Optional init context. Pass `{ binaryName }` to derive
|
|
417
404
|
* the token prefix.
|
|
418
405
|
* @returns A valid FurnaceConfig
|
|
419
406
|
*/
|
|
@@ -481,8 +468,8 @@ export async function updateFurnaceState(root, updates) {
|
|
|
481
468
|
* Engine-relative path of the directory `furnace preview` writes its
|
|
482
469
|
* generated Storybook story files into. Treated as Furnace-managed so
|
|
483
470
|
* `status` does not flag them as unmanaged and `lint` does not fail on their
|
|
484
|
-
* (intentionally bare) license headers
|
|
485
|
-
* operator commits or hand-edits.
|
|
471
|
+
* (intentionally bare) license headers. They are tool output rather than
|
|
472
|
+
* files an operator commits or hand-edits.
|
|
486
473
|
*/
|
|
487
474
|
const FURNACE_STORYBOOK_STORIES_PREFIX = 'browser/components/storybook/stories/furnace/';
|
|
488
475
|
/**
|
|
@@ -517,8 +504,8 @@ export async function collectFurnaceManagedPrefixes(root) {
|
|
|
517
504
|
}
|
|
518
505
|
// Always include the preview-generated stories prefix when furnace is
|
|
519
506
|
// initialised. The directory may not exist yet (no preview ever ran),
|
|
520
|
-
// but classifying it as furnace-managed is safe even when empty
|
|
521
|
-
//
|
|
507
|
+
// but classifying it as furnace-managed is safe even when empty. Status
|
|
508
|
+
// simply has nothing to bucket.
|
|
522
509
|
prefixes.add(FURNACE_STORYBOOK_STORIES_PREFIX);
|
|
523
510
|
return prefixes;
|
|
524
511
|
}
|
|
@@ -5,7 +5,7 @@ export declare const JAR_MN = "toolkit/content/jar.mn";
|
|
|
5
5
|
/**
|
|
6
6
|
* Upstream home of the MozLitElement widget sources.
|
|
7
7
|
*
|
|
8
|
-
* The trailing slash is
|
|
8
|
+
* The trailing slash is not included: `build-audit-transforms.ts` needs
|
|
9
9
|
* `${WIDGETS_DIR}/` and its ordered prefix table depends on that slash, so
|
|
10
10
|
* appending it at the one site that wants it keeps the others correct.
|
|
11
11
|
*/
|
|
@@ -27,15 +27,15 @@ export declare function xpcshellTestParentDir(binaryName: string): string;
|
|
|
27
27
|
/**
|
|
28
28
|
* Resolves the engine-relative directory a browser-chrome scaffold is
|
|
29
29
|
* written to: the `--test-dir` override when given, else
|
|
30
|
-
* `browser/base/content/test/<binaryName>`. The scaffolder
|
|
30
|
+
* `browser/base/content/test/<binaryName>`. The scaffolder and the
|
|
31
31
|
* dry-run / success formatters resolve through this one function, so the
|
|
32
32
|
* printed plan cannot disagree with the files that land on disk.
|
|
33
33
|
*/
|
|
34
34
|
export declare function resolveBrowserChromeTestDir(binaryName: string, override?: string): string;
|
|
35
35
|
/**
|
|
36
36
|
* Resolves the engine-relative directory an xpcshell scaffold is written
|
|
37
|
-
* to. A `--test-dir` override names the
|
|
38
|
-
* segment is appended)
|
|
37
|
+
* to. A `--test-dir` override names the final directory (no per-component
|
|
38
|
+
* segment is appended). The default is
|
|
39
39
|
* `browser/base/content/test/<binaryName>-xpcshell/<componentName>`.
|
|
40
40
|
*/
|
|
41
41
|
export declare function resolveXpcshellTestDir(binaryName: string, componentName: string, override?: string): string;
|
|
@@ -62,8 +62,8 @@ export declare function resolveFtlChromeSubPath(ftlBasePath?: string): string |
|
|
|
62
62
|
* given `ftlBasePath`. For the default toolkit tree this yields
|
|
63
63
|
* `toolkit/locales/jar.mn`.
|
|
64
64
|
*
|
|
65
|
-
* Returns `undefined` when the path does not contain a `locales/` segment
|
|
66
|
-
*
|
|
65
|
+
* Returns `undefined` when the path does not contain a `locales/` segment.
|
|
66
|
+
* Callers must treat that as "cannot locate" and degrade gracefully.
|
|
67
67
|
*/
|
|
68
68
|
export declare function resolveFtlLocaleJarMnPath(ftlBasePath?: string): string | undefined;
|
|
69
69
|
/**
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/** Path to customElements.js within the engine source tree */
|
|
3
3
|
export const CUSTOM_ELEMENTS_JS = 'toolkit/content/customElements.js';
|
|
4
|
+
import { normalizePathSlashes } from '../utils/paths.js';
|
|
4
5
|
/** Path to jar.mn within the engine source tree (toolkit global) */
|
|
5
6
|
export const JAR_MN = 'toolkit/content/jar.mn';
|
|
6
7
|
/**
|
|
7
8
|
* Upstream home of the MozLitElement widget sources.
|
|
8
9
|
*
|
|
9
|
-
* The trailing slash is
|
|
10
|
+
* The trailing slash is not included: `build-audit-transforms.ts` needs
|
|
10
11
|
* `${WIDGETS_DIR}/` and its ordered prefix table depends on that slash, so
|
|
11
12
|
* appending it at the one site that wants it keeps the others correct.
|
|
12
13
|
*/
|
|
@@ -38,7 +39,7 @@ export function xpcshellTestParentDir(binaryName) {
|
|
|
38
39
|
/**
|
|
39
40
|
* Resolves the engine-relative directory a browser-chrome scaffold is
|
|
40
41
|
* written to: the `--test-dir` override when given, else
|
|
41
|
-
* `browser/base/content/test/<binaryName>`. The scaffolder
|
|
42
|
+
* `browser/base/content/test/<binaryName>`. The scaffolder and the
|
|
42
43
|
* dry-run / success formatters resolve through this one function, so the
|
|
43
44
|
* printed plan cannot disagree with the files that land on disk.
|
|
44
45
|
*/
|
|
@@ -47,8 +48,8 @@ export function resolveBrowserChromeTestDir(binaryName, override) {
|
|
|
47
48
|
}
|
|
48
49
|
/**
|
|
49
50
|
* Resolves the engine-relative directory an xpcshell scaffold is written
|
|
50
|
-
* to. A `--test-dir` override names the
|
|
51
|
-
* segment is appended)
|
|
51
|
+
* to. A `--test-dir` override names the final directory (no per-component
|
|
52
|
+
* segment is appended). The default is
|
|
52
53
|
* `browser/base/content/test/<binaryName>-xpcshell/<componentName>`.
|
|
53
54
|
*/
|
|
54
55
|
export function resolveXpcshellTestDir(binaryName, componentName, override) {
|
|
@@ -78,7 +79,7 @@ export function resolveFtlDir(configuredPath) {
|
|
|
78
79
|
* degrade gracefully rather than inventing a path.
|
|
79
80
|
*/
|
|
80
81
|
export function resolveFtlChromeSubPath(ftlBasePath) {
|
|
81
|
-
const path = (ftlBasePath ?? FTL_DIR)
|
|
82
|
+
const path = normalizePathSlashes(ftlBasePath ?? FTL_DIR);
|
|
82
83
|
const match = /^(.*?)\/locales\/[^/]+\/(.+?)\/?$/.exec(path);
|
|
83
84
|
if (!match?.[2])
|
|
84
85
|
return undefined;
|
|
@@ -89,11 +90,11 @@ export function resolveFtlChromeSubPath(ftlBasePath) {
|
|
|
89
90
|
* given `ftlBasePath`. For the default toolkit tree this yields
|
|
90
91
|
* `toolkit/locales/jar.mn`.
|
|
91
92
|
*
|
|
92
|
-
* Returns `undefined` when the path does not contain a `locales/` segment
|
|
93
|
-
*
|
|
93
|
+
* Returns `undefined` when the path does not contain a `locales/` segment.
|
|
94
|
+
* Callers must treat that as "cannot locate" and degrade gracefully.
|
|
94
95
|
*/
|
|
95
96
|
export function resolveFtlLocaleJarMnPath(ftlBasePath) {
|
|
96
|
-
const path = (ftlBasePath ?? FTL_DIR)
|
|
97
|
+
const path = normalizePathSlashes(ftlBasePath ?? FTL_DIR);
|
|
97
98
|
const match = /^(.*?)\/locales\/[^/]+\//.exec(path);
|
|
98
99
|
if (!match?.[1])
|
|
99
100
|
return undefined;
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
* @fireforge-include shared-anims.css
|
|
10
10
|
*
|
|
11
11
|
* naming a fragment file in `components/shared/`. `furnace deploy` expands
|
|
12
|
-
* the fragment into the *deployed* copy only
|
|
13
|
-
* DRY
|
|
12
|
+
* the fragment into the *deployed* copy only (the workspace source stays
|
|
13
|
+
* DRY), fencing the expansion between the directive line and a matching
|
|
14
14
|
* `@fireforge-end-include` marker so re-deploys can refresh it idempotently.
|
|
15
15
|
*
|
|
16
16
|
* Drift contract: the apply fast-path and `furnace validate` compare the
|
|
@@ -24,7 +24,7 @@ export { SHARED_FRAGMENTS_DIR } from './furnace-config.js';
|
|
|
24
24
|
export declare function listFragmentIncludes(css: string): string[];
|
|
25
25
|
/**
|
|
26
26
|
* Collapses fenced fragment expansions back to their bare directives.
|
|
27
|
-
* Inverse of {@link expandCssFragments}
|
|
27
|
+
* Inverse of {@link expandCssFragments}. Used to compare a deployed file
|
|
28
28
|
* against its workspace source and to re-expand idempotently.
|
|
29
29
|
*/
|
|
30
30
|
export declare function stripExpandedFragments(css: string): string;
|
|
@@ -52,7 +52,7 @@ export declare function expandCssFragments(css: string, sharedDir: string): Prom
|
|
|
52
52
|
export declare function extractExpandedFragmentBodies(css: string): Map<string, string>;
|
|
53
53
|
/**
|
|
54
54
|
* Deploys one component file: CSS sources carrying include directives are
|
|
55
|
-
* written as their fragment-expanded form
|
|
55
|
+
* written as their fragment-expanded form. Everything else is a plain
|
|
56
56
|
* copy. Extracted here so `applyCustomComponent` stays inside the
|
|
57
57
|
* per-file line budget.
|
|
58
58
|
*
|
|
@@ -73,7 +73,7 @@ export declare function describeFragmentExpansion(src: string): Promise<string>;
|
|
|
73
73
|
* @param componentDir - Workspace directory of the component
|
|
74
74
|
* @param tagName - Component tag name for issue attribution
|
|
75
75
|
* @param sharedDir - Shared fragments directory
|
|
76
|
-
* @param engineTargetDir - Deployed directory in the engine
|
|
77
|
-
* pre-deploy validation skips the staleness check
|
|
76
|
+
* @param engineTargetDir - Deployed directory in the engine. Optional, and
|
|
77
|
+
* pre-deploy validation skips the staleness check.
|
|
78
78
|
*/
|
|
79
79
|
export declare function validateCssFragments(componentDir: string, tagName: string, sharedDir: string, engineTargetDir?: string): Promise<ValidationIssue[]>;
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* @fireforge-include shared-anims.css
|
|
11
11
|
*
|
|
12
12
|
* naming a fragment file in `components/shared/`. `furnace deploy` expands
|
|
13
|
-
* the fragment into the *deployed* copy only
|
|
14
|
-
* DRY
|
|
13
|
+
* the fragment into the *deployed* copy only (the workspace source stays
|
|
14
|
+
* DRY), fencing the expansion between the directive line and a matching
|
|
15
15
|
* `@fireforge-end-include` marker so re-deploys can refresh it idempotently.
|
|
16
16
|
*
|
|
17
17
|
* Drift contract: the apply fast-path and `furnace validate` compare the
|
|
@@ -24,7 +24,7 @@ import { join } from 'node:path';
|
|
|
24
24
|
import { FurnaceError } from '../errors/furnace.js';
|
|
25
25
|
import { copyFile, pathExists, readText, writeText } from '../utils/fs.js';
|
|
26
26
|
export { SHARED_FRAGMENTS_DIR } from './furnace-config.js';
|
|
27
|
-
// Local copy of the directory name for message text
|
|
27
|
+
// Local copy of the directory name for message text. Importing the
|
|
28
28
|
// binding for value use keeps a single source of truth.
|
|
29
29
|
import { SHARED_FRAGMENTS_DIR } from './furnace-config.js';
|
|
30
30
|
const INCLUDE_PATTERN = /^\s*\/\*\s*@fireforge-include\s+([\w./-]+)\s*\*\/\s*$/;
|
|
@@ -41,7 +41,7 @@ export function listFragmentIncludes(css) {
|
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
43
|
* Collapses fenced fragment expansions back to their bare directives.
|
|
44
|
-
* Inverse of {@link expandCssFragments}
|
|
44
|
+
* Inverse of {@link expandCssFragments}. Used to compare a deployed file
|
|
45
45
|
* against its workspace source and to re-expand idempotently.
|
|
46
46
|
*/
|
|
47
47
|
export function stripExpandedFragments(css) {
|
|
@@ -54,8 +54,8 @@ export function stripExpandedFragments(css) {
|
|
|
54
54
|
if (!inc?.[1])
|
|
55
55
|
continue;
|
|
56
56
|
// A bare directive (workspace file) has no fence to strip. Only skip
|
|
57
|
-
// the expansion body when a matching end marker actually follows
|
|
58
|
-
//
|
|
57
|
+
// the expansion body when a matching end marker actually follows.
|
|
58
|
+
// Otherwise an unterminated fence would silently eat the rest of the
|
|
59
59
|
// file.
|
|
60
60
|
let endIndex = -1;
|
|
61
61
|
for (let j = i + 1; j < lines.length; j++) {
|
|
@@ -141,7 +141,7 @@ export function extractExpandedFragmentBodies(css) {
|
|
|
141
141
|
}
|
|
142
142
|
/**
|
|
143
143
|
* Deploys one component file: CSS sources carrying include directives are
|
|
144
|
-
* written as their fragment-expanded form
|
|
144
|
+
* written as their fragment-expanded form. Everything else is a plain
|
|
145
145
|
* copy. Extracted here so `applyCustomComponent` stays inside the
|
|
146
146
|
* per-file line budget.
|
|
147
147
|
*
|
|
@@ -180,8 +180,8 @@ export async function describeFragmentExpansion(src) {
|
|
|
180
180
|
* @param componentDir - Workspace directory of the component
|
|
181
181
|
* @param tagName - Component tag name for issue attribution
|
|
182
182
|
* @param sharedDir - Shared fragments directory
|
|
183
|
-
* @param engineTargetDir - Deployed directory in the engine
|
|
184
|
-
* pre-deploy validation skips the staleness check
|
|
183
|
+
* @param engineTargetDir - Deployed directory in the engine. Optional, and
|
|
184
|
+
* pre-deploy validation skips the staleness check.
|
|
185
185
|
*/
|
|
186
186
|
export async function validateCssFragments(componentDir, tagName, sharedDir, engineTargetDir) {
|
|
187
187
|
const issues = [];
|
|
@@ -194,8 +194,8 @@ export async function validateCssFragments(componentDir, tagName, sharedDir, eng
|
|
|
194
194
|
entries = await readdir(componentDir);
|
|
195
195
|
}
|
|
196
196
|
catch {
|
|
197
|
-
// An unreadable component directory contributes no fragment issues
|
|
198
|
-
// what has been collected so far rather than failing validation.
|
|
197
|
+
// An unreadable component directory contributes no fragment issues.
|
|
198
|
+
// Return what has been collected so far rather than failing validation.
|
|
199
199
|
return issues;
|
|
200
200
|
}
|
|
201
201
|
for (const fileName of entries) {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The minimal `readdir(..., { withFileTypes: true })` entry shape the furnace
|
|
3
|
+
* apply path needs, plus the single predicate that decides whether an entry is
|
|
4
|
+
* a copy candidate. Kept in its own leaf module so both `furnace-apply-helpers`
|
|
5
|
+
* and its dry-run mirror can share one definition without importing each other.
|
|
6
|
+
*/
|
|
7
|
+
/** Structural subset of `Dirent` used by the furnace apply/dry-run walkers. */
|
|
8
|
+
export interface DirectoryEntry {
|
|
9
|
+
isFile(): boolean;
|
|
10
|
+
isSymbolicLink?(): boolean;
|
|
11
|
+
name: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* True for a plain-file directory entry. Symlinks and directories are
|
|
15
|
+
* never copy candidates.
|
|
16
|
+
*
|
|
17
|
+
* @param entry - Directory entry to classify
|
|
18
|
+
* @returns True when the entry is a regular file
|
|
19
|
+
*/
|
|
20
|
+
export declare function isRegularFile(entry: DirectoryEntry): boolean;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* The minimal `readdir(..., { withFileTypes: true })` entry shape the furnace
|
|
4
|
+
* apply path needs, plus the single predicate that decides whether an entry is
|
|
5
|
+
* a copy candidate. Kept in its own leaf module so both `furnace-apply-helpers`
|
|
6
|
+
* and its dry-run mirror can share one definition without importing each other.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* True for a plain-file directory entry. Symlinks and directories are
|
|
10
|
+
* never copy candidates.
|
|
11
|
+
*
|
|
12
|
+
* @param entry - Directory entry to classify
|
|
13
|
+
* @returns True when the entry is a regular file
|
|
14
|
+
*/
|
|
15
|
+
export function isRegularFile(entry) {
|
|
16
|
+
if (!entry.isFile())
|
|
17
|
+
return false;
|
|
18
|
+
if (typeof entry.isSymbolicLink === 'function' && entry.isSymbolicLink())
|
|
19
|
+
return false;
|
|
20
|
+
return true;
|
|
21
|
+
}
|