@hominis/fireforge 0.43.1 → 0.44.0
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 +126 -0
- package/README.md +10 -1
- package/dist/bin/fireforge.d.ts +4 -9
- package/dist/bin/fireforge.js +42 -40
- package/dist/build-info.json +4 -4
- package/dist/src/cli.js +74 -8
- package/dist/src/commands/bootstrap.js +17 -20
- package/dist/src/commands/build.js +25 -32
- package/dist/src/commands/config.js +34 -41
- package/dist/src/commands/discard.js +8 -9
- package/dist/src/commands/doctor-check-core.d.ts +4 -18
- package/dist/src/commands/doctor-check-core.js +8 -35
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
- package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
- package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
- package/dist/src/commands/doctor-furnace-jar.js +7 -9
- package/dist/src/commands/doctor-furnace.js +21 -24
- package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
- package/dist/src/commands/doctor-orphaned-harness.js +18 -44
- package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
- package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
- package/dist/src/commands/doctor-working-tree.d.ts +10 -12
- package/dist/src/commands/doctor-working-tree.js +11 -18
- package/dist/src/commands/doctor.js +35 -53
- package/dist/src/commands/download.js +32 -48
- package/dist/src/commands/export-all.js +29 -33
- package/dist/src/commands/export-flow.js +6 -6
- package/dist/src/commands/export-placement-conflicts.js +10 -9
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-shared.d.ts +30 -33
- package/dist/src/commands/export-shared.js +45 -43
- package/dist/src/commands/export.js +21 -27
- package/dist/src/commands/furnace/apply.js +14 -23
- package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
- package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
- package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
- package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
- package/dist/src/commands/furnace/chrome-doc.js +31 -41
- package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
- package/dist/src/commands/furnace/create-browser-test.js +8 -8
- package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
- package/dist/src/commands/furnace/create-mochikit.js +8 -9
- package/dist/src/commands/furnace/create-readback.d.ts +12 -13
- package/dist/src/commands/furnace/create-readback.js +12 -13
- package/dist/src/commands/furnace/create-templates.d.ts +22 -28
- package/dist/src/commands/furnace/create-templates.js +35 -30
- package/dist/src/commands/furnace/create-xpcshell.js +2 -2
- package/dist/src/commands/furnace/create.js +33 -23
- package/dist/src/commands/furnace/deploy.js +16 -24
- package/dist/src/commands/furnace/diff.js +9 -9
- package/dist/src/commands/furnace/init.js +33 -36
- package/dist/src/commands/furnace/override.js +23 -25
- package/dist/src/commands/furnace/preview.js +47 -67
- package/dist/src/commands/furnace/refresh.js +12 -16
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
- package/dist/src/commands/furnace/remove-mutations.js +9 -16
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +33 -38
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
- package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
- package/dist/src/commands/furnace/rename.js +59 -69
- package/dist/src/commands/furnace/scan.js +19 -33
- package/dist/src/commands/furnace/status.js +12 -9
- package/dist/src/commands/furnace/sync.js +9 -16
- package/dist/src/commands/furnace/validate.js +20 -20
- package/dist/src/commands/import.js +42 -35
- package/dist/src/commands/lint-per-patch.js +15 -10
- package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
- package/dist/src/commands/lint-per-run-checkjs.js +13 -13
- package/dist/src/commands/lint-report.js +6 -7
- package/dist/src/commands/lint.d.ts +15 -16
- package/dist/src/commands/lint.js +86 -102
- package/dist/src/commands/package.js +6 -11
- package/dist/src/commands/patch/compact.js +1 -1
- package/dist/src/commands/patch/delete.js +24 -33
- package/dist/src/commands/patch/index.d.ts +5 -6
- package/dist/src/commands/patch/index.js +10 -12
- package/dist/src/commands/patch/lint-ignore.js +14 -13
- package/dist/src/commands/patch/move-files-create.d.ts +6 -6
- package/dist/src/commands/patch/move-files-create.js +8 -8
- package/dist/src/commands/patch/move-files-into.d.ts +6 -6
- package/dist/src/commands/patch/move-files-into.js +8 -8
- package/dist/src/commands/patch/patch-context.d.ts +2 -3
- package/dist/src/commands/patch/patch-context.js +2 -3
- package/dist/src/commands/patch/rename.d.ts +10 -11
- package/dist/src/commands/patch/rename.js +11 -12
- package/dist/src/commands/patch/reorder.js +8 -9
- package/dist/src/commands/patch/split-plan.js +1 -1
- package/dist/src/commands/patch/split.d.ts +8 -10
- package/dist/src/commands/patch/split.js +9 -11
- package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
- package/dist/src/commands/patch/staged-dependency.js +7 -3
- package/dist/src/commands/patch/tier.d.ts +9 -9
- package/dist/src/commands/patch/tier.js +18 -15
- package/dist/src/commands/re-export-adjacent.js +9 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
- package/dist/src/commands/re-export-bulk-scan.js +22 -21
- package/dist/src/commands/re-export-drift.js +10 -10
- package/dist/src/commands/re-export-files.d.ts +6 -7
- package/dist/src/commands/re-export-files.js +34 -44
- package/dist/src/commands/re-export-lint.d.ts +10 -13
- package/dist/src/commands/re-export-lint.js +16 -14
- package/dist/src/commands/re-export-options.d.ts +6 -6
- package/dist/src/commands/re-export-options.js +6 -6
- package/dist/src/commands/re-export-register.d.ts +4 -10
- package/dist/src/commands/re-export-register.js +5 -11
- package/dist/src/commands/re-export-scan.js +1 -1
- package/dist/src/commands/re-export-single.d.ts +3 -3
- package/dist/src/commands/re-export-single.js +33 -25
- package/dist/src/commands/re-export.js +13 -21
- package/dist/src/commands/rebase/abort.js +3 -3
- package/dist/src/commands/rebase/confirm.js +2 -1
- package/dist/src/commands/rebase/continue.d.ts +1 -1
- package/dist/src/commands/rebase/continue.js +14 -9
- package/dist/src/commands/rebase/index.js +11 -11
- package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
- package/dist/src/commands/rebase/patch-loop.js +60 -39
- package/dist/src/commands/rebase/summary.js +1 -1
- package/dist/src/commands/register.js +5 -7
- package/dist/src/commands/reset.js +2 -1
- package/dist/src/commands/resolve.d.ts +16 -13
- package/dist/src/commands/resolve.js +30 -33
- package/dist/src/commands/run.js +33 -35
- package/dist/src/commands/setup-support.js +15 -19
- package/dist/src/commands/setup.js +13 -9
- package/dist/src/commands/status-check.d.ts +6 -6
- package/dist/src/commands/status-json.d.ts +6 -6
- package/dist/src/commands/status-json.js +5 -0
- package/dist/src/commands/status-output.d.ts +5 -5
- package/dist/src/commands/status-output.js +6 -6
- package/dist/src/commands/status-ownership.d.ts +16 -14
- package/dist/src/commands/status-ownership.js +16 -14
- package/dist/src/commands/status.js +42 -34
- package/dist/src/commands/test-build-phase.js +26 -13
- package/dist/src/commands/test-diagnose.js +44 -44
- package/dist/src/commands/test-register.js +1 -0
- package/dist/src/commands/test-run.d.ts +14 -16
- package/dist/src/commands/test-run.js +21 -13
- package/dist/src/commands/test-stale-gate.d.ts +15 -16
- package/dist/src/commands/test-stale-gate.js +15 -16
- package/dist/src/commands/test-verdict.d.ts +20 -3
- package/dist/src/commands/test-verdict.js +30 -0
- package/dist/src/commands/test.js +83 -76
- package/dist/src/commands/token-coverage.js +3 -4
- package/dist/src/commands/token.js +16 -18
- package/dist/src/commands/tree.js +47 -31
- package/dist/src/commands/typecheck.d.ts +10 -12
- package/dist/src/commands/typecheck.js +24 -27
- package/dist/src/commands/verify.js +13 -15
- package/dist/src/commands/watch.js +21 -23
- package/dist/src/commands/wire.js +52 -62
- package/dist/src/core/ast-utils.d.ts +8 -7
- package/dist/src/core/ast-utils.js +8 -7
- package/dist/src/core/branding.d.ts +9 -14
- package/dist/src/core/branding.js +7 -11
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +14 -19
- package/dist/src/core/build-audit-platform.js +25 -33
- package/dist/src/core/build-audit-registration.js +17 -25
- package/dist/src/core/build-audit-resolve.d.ts +15 -17
- package/dist/src/core/build-audit-resolve.js +27 -33
- package/dist/src/core/build-audit-transforms.js +18 -19
- package/dist/src/core/build-audit.js +28 -42
- package/dist/src/core/build-baseline-types.d.ts +29 -35
- package/dist/src/core/build-baseline.d.ts +5 -4
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-overwrite-guard.d.ts +7 -14
- package/dist/src/core/build-overwrite-guard.js +17 -27
- package/dist/src/core/build-prepare.d.ts +2 -2
- package/dist/src/core/build-prepare.js +8 -9
- package/dist/src/core/config-state.js +12 -4
- package/dist/src/core/config-validate.js +8 -5
- package/dist/src/core/config.d.ts +5 -8
- package/dist/src/core/config.js +7 -16
- package/dist/src/core/coverage-extend.d.ts +15 -13
- package/dist/src/core/coverage-extend.js +15 -13
- package/dist/src/core/destructive.d.ts +31 -9
- package/dist/src/core/destructive.js +29 -26
- package/dist/src/core/diff-hunks.js +10 -12
- package/dist/src/core/discard-baseline.d.ts +8 -8
- package/dist/src/core/discard-baseline.js +16 -15
- package/dist/src/core/display-state.d.ts +12 -14
- package/dist/src/core/display-state.js +12 -14
- package/dist/src/core/engine-changes.d.ts +2 -4
- package/dist/src/core/engine-changes.js +2 -4
- package/dist/src/core/engine-precondition.d.ts +28 -13
- package/dist/src/core/engine-precondition.js +25 -10
- package/dist/src/core/engine-session-lock.d.ts +47 -21
- package/dist/src/core/engine-session-lock.js +168 -33
- package/dist/src/core/export-moved-code-shape.d.ts +10 -10
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock.d.ts +62 -5
- package/dist/src/core/file-lock.js +196 -59
- package/dist/src/core/firefox-cache.js +1 -3
- package/dist/src/core/firefox-extract.js +10 -14
- package/dist/src/core/firefox.d.ts +7 -5
- package/dist/src/core/firefox.js +4 -5
- package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
- package/dist/src/core/furnace-apply-dry-run.js +3 -2
- package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
- package/dist/src/core/furnace-apply-ftl.js +12 -12
- package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
- package/dist/src/core/furnace-apply-helpers.js +19 -16
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
- package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
- package/dist/src/core/furnace-apply.d.ts +5 -8
- package/dist/src/core/furnace-apply.js +19 -24
- package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
- package/dist/src/core/furnace-checksum-utils.js +16 -0
- package/dist/src/core/furnace-config.d.ts +21 -30
- package/dist/src/core/furnace-config.js +32 -54
- package/dist/src/core/furnace-constants.d.ts +8 -0
- package/dist/src/core/furnace-constants.js +10 -2
- package/dist/src/core/furnace-css-fragments.d.ts +5 -5
- package/dist/src/core/furnace-css-fragments.js +5 -5
- package/dist/src/core/furnace-jsconfig.d.ts +11 -12
- package/dist/src/core/furnace-jsconfig.js +11 -12
- package/dist/src/core/furnace-marker.d.ts +7 -8
- package/dist/src/core/furnace-marker.js +7 -8
- package/dist/src/core/furnace-operation.d.ts +31 -0
- package/dist/src/core/furnace-operation.js +54 -17
- package/dist/src/core/furnace-precondition.d.ts +61 -0
- package/dist/src/core/furnace-precondition.js +67 -0
- package/dist/src/core/furnace-registration-remove.d.ts +5 -6
- package/dist/src/core/furnace-registration-remove.js +6 -7
- package/dist/src/core/furnace-registration-validate.d.ts +13 -0
- package/dist/src/core/furnace-registration-validate.js +20 -1
- package/dist/src/core/furnace-registration.d.ts +5 -6
- package/dist/src/core/furnace-registration.js +10 -12
- package/dist/src/core/furnace-rollback.js +7 -7
- package/dist/src/core/furnace-scanner.d.ts +1 -0
- package/dist/src/core/furnace-scanner.js +1 -2
- package/dist/src/core/furnace-stale-export.d.ts +10 -10
- package/dist/src/core/furnace-stale-export.js +10 -10
- package/dist/src/core/furnace-state-persist.d.ts +6 -8
- package/dist/src/core/furnace-state-persist.js +6 -8
- package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
- package/dist/src/core/furnace-validate-accessibility.js +310 -1
- package/dist/src/core/furnace-validate-compatibility.js +141 -1
- package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
- package/dist/src/core/furnace-validate-helpers.js +0 -491
- package/dist/src/core/furnace-validate-registration.d.ts +7 -0
- package/dist/src/core/furnace-validate-registration.js +115 -41
- package/dist/src/core/furnace-validate.d.ts +16 -0
- package/dist/src/core/furnace-validate.js +188 -145
- package/dist/src/core/furnace-version-drift.d.ts +10 -11
- package/dist/src/core/furnace-version-drift.js +10 -11
- package/dist/src/core/git-base.d.ts +7 -9
- package/dist/src/core/git-base.js +7 -9
- package/dist/src/core/git-diff.d.ts +20 -9
- package/dist/src/core/git-diff.js +148 -63
- package/dist/src/core/git-file-ops.d.ts +19 -19
- package/dist/src/core/git-file-ops.js +19 -19
- package/dist/src/core/git-readonly-index.d.ts +53 -19
- package/dist/src/core/git-readonly-index.js +75 -31
- package/dist/src/core/git-status.d.ts +5 -6
- package/dist/src/core/git-status.js +5 -6
- package/dist/src/core/git.d.ts +9 -10
- package/dist/src/core/git.js +54 -70
- package/dist/src/core/license-headers.d.ts +17 -23
- package/dist/src/core/license-headers.js +17 -23
- package/dist/src/core/mach-build-artifacts.d.ts +9 -9
- package/dist/src/core/mach-build-artifacts.js +57 -19
- package/dist/src/core/mach-error-hints.js +42 -29
- package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
- package/dist/src/core/mach-known-noise-filter.js +18 -20
- package/dist/src/core/mach-mozconfig.d.ts +14 -0
- package/dist/src/core/mach-mozconfig.js +30 -0
- package/dist/src/core/mach-resource-shim.d.ts +43 -58
- package/dist/src/core/mach-resource-shim.js +50 -67
- package/dist/src/core/mach.d.ts +37 -41
- package/dist/src/core/mach.js +50 -51
- package/dist/src/core/marionette-port.d.ts +36 -1
- package/dist/src/core/marionette-port.js +96 -31
- package/dist/src/core/marionette-preflight.d.ts +8 -12
- package/dist/src/core/marionette-preflight.js +86 -52
- package/dist/src/core/mochitest-server-port.d.ts +42 -0
- package/dist/src/core/mochitest-server-port.js +119 -0
- package/dist/src/core/module-resolution-preflight.d.ts +9 -11
- package/dist/src/core/module-resolution-preflight.js +9 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
- package/dist/src/core/moz-manifest-helpers.js +163 -0
- package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
- package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
- package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
- package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
- package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
- package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
- package/dist/src/core/ownership-table.d.ts +14 -16
- package/dist/src/core/ownership-table.js +14 -16
- package/dist/src/core/parser-fallback.d.ts +15 -1
- package/dist/src/core/parser-fallback.js +22 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
- package/dist/src/core/patch-apply-fuzz.js +15 -18
- package/dist/src/core/patch-apply.d.ts +13 -34
- package/dist/src/core/patch-apply.js +16 -76
- package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
- package/dist/src/core/patch-artifact-normalize.js +13 -15
- package/dist/src/core/patch-export-metadata.d.ts +12 -2
- package/dist/src/core/patch-export-metadata.js +13 -4
- package/dist/src/core/patch-export-update.d.ts +13 -1
- package/dist/src/core/patch-export-update.js +25 -8
- package/dist/src/core/patch-export.d.ts +15 -8
- package/dist/src/core/patch-export.js +10 -11
- package/dist/src/core/patch-files.d.ts +5 -6
- package/dist/src/core/patch-files.js +5 -6
- package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
- package/dist/src/core/patch-identifier-suggest.js +14 -19
- package/dist/src/core/patch-lint-binary.d.ts +51 -0
- package/dist/src/core/patch-lint-binary.js +39 -0
- package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
- package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
- package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
- package/dist/src/core/patch-lint-checkjs.js +16 -16
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
- package/dist/src/core/patch-lint-creators.d.ts +8 -8
- package/dist/src/core/patch-lint-creators.js +8 -8
- package/dist/src/core/patch-lint-cross.d.ts +17 -20
- package/dist/src/core/patch-lint-cross.js +16 -16
- package/dist/src/core/patch-lint-css.d.ts +3 -5
- package/dist/src/core/patch-lint-css.js +17 -22
- package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
- package/dist/src/core/patch-lint-diff-tag.js +14 -16
- package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
- package/dist/src/core/patch-lint-jsdoc.js +26 -19
- package/dist/src/core/patch-lint-mozbuild.js +20 -20
- package/dist/src/core/patch-lint-observer.d.ts +7 -7
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint.d.ts +38 -29
- package/dist/src/core/patch-lint.js +89 -121
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +45 -9
- package/dist/src/core/patch-manifest-consistency.d.ts +2 -1
- package/dist/src/core/patch-manifest-consistency.js +25 -27
- package/dist/src/core/patch-manifest-io.js +14 -18
- package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
- package/dist/src/core/patch-manifest-resolve.js +9 -12
- package/dist/src/core/patch-manifest-validate.d.ts +6 -1
- package/dist/src/core/patch-manifest-validate.js +25 -13
- package/dist/src/core/patch-parse.d.ts +24 -13
- package/dist/src/core/patch-parse.js +19 -14
- package/dist/src/core/patch-policy.d.ts +2 -2
- package/dist/src/core/patch-policy.js +2 -2
- package/dist/src/core/patch-registration-refs.d.ts +7 -8
- package/dist/src/core/patch-registration-refs.js +9 -9
- package/dist/src/core/process-cpu-time.d.ts +12 -0
- package/dist/src/core/process-cpu-time.js +52 -0
- package/dist/src/core/rebase-session.d.ts +38 -26
- package/dist/src/core/rebase-session.js +55 -28
- package/dist/src/core/register-browser-content.js +9 -74
- package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
- package/dist/src/core/register-module.js +10 -43
- package/dist/src/core/register-scaffold.d.ts +8 -8
- package/dist/src/core/register-scaffold.js +10 -10
- package/dist/src/core/register-shared-css.d.ts +9 -12
- package/dist/src/core/register-shared-css.js +17 -87
- package/dist/src/core/register-xpcshell-test.d.ts +6 -7
- package/dist/src/core/register-xpcshell-test.js +7 -8
- package/dist/src/core/shared-ftl.js +12 -4
- package/dist/src/core/state-file.d.ts +45 -0
- package/dist/src/core/state-file.js +34 -0
- package/dist/src/core/status-binary.d.ts +18 -11
- package/dist/src/core/status-binary.js +19 -12
- package/dist/src/core/status-classify.d.ts +30 -36
- package/dist/src/core/status-classify.js +21 -26
- package/dist/src/core/test-changed-prefs.d.ts +30 -0
- package/dist/src/core/test-changed-prefs.js +78 -0
- package/dist/src/core/test-harness-crash.d.ts +25 -63
- package/dist/src/core/test-harness-crash.js +121 -142
- package/dist/src/core/test-harness-signature.d.ts +18 -0
- package/dist/src/core/test-harness-signature.js +13 -0
- package/dist/src/core/test-path-scope.d.ts +12 -15
- package/dist/src/core/test-path-scope.js +15 -18
- package/dist/src/core/test-stale-check.d.ts +17 -17
- package/dist/src/core/test-stale-check.js +50 -43
- package/dist/src/core/test-stall-triage.d.ts +51 -0
- package/dist/src/core/test-stall-triage.js +126 -0
- package/dist/src/core/token-category.js +5 -7
- package/dist/src/core/token-coverage.js +9 -9
- package/dist/src/core/token-dark-mode.d.ts +9 -11
- package/dist/src/core/token-dark-mode.js +9 -11
- package/dist/src/core/token-docs.d.ts +2 -0
- package/dist/src/core/token-docs.js +2 -0
- package/dist/src/core/token-manager.d.ts +10 -2
- package/dist/src/core/token-manager.js +17 -8
- package/dist/src/core/token-scaffold.d.ts +7 -7
- package/dist/src/core/token-scaffold.js +7 -7
- package/dist/src/core/token-variant.d.ts +4 -4
- package/dist/src/core/token-variant.js +4 -4
- package/dist/src/core/toolchain-preflight.d.ts +20 -21
- package/dist/src/core/toolchain-preflight.js +28 -31
- package/dist/src/core/tree-guard.js +12 -2
- package/dist/src/core/tree-store.d.ts +41 -27
- package/dist/src/core/tree-store.js +63 -42
- package/dist/src/core/typecheck-shim.d.ts +23 -24
- package/dist/src/core/typecheck-shim.js +23 -24
- package/dist/src/core/typecheck.js +8 -8
- package/dist/src/core/wire-destroy.d.ts +3 -3
- package/dist/src/core/wire-destroy.js +7 -15
- package/dist/src/core/wire-dom-fragment.d.ts +9 -17
- package/dist/src/core/wire-dom-fragment.js +11 -44
- package/dist/src/core/wire-init.d.ts +2 -3
- package/dist/src/core/wire-init.js +8 -19
- package/dist/src/core/wire-subscript.d.ts +2 -3
- package/dist/src/core/wire-subscript.js +4 -13
- package/dist/src/core/wire-utils.d.ts +7 -8
- package/dist/src/core/wire-utils.js +7 -8
- package/dist/src/core/xpcshell-appdir.d.ts +38 -45
- package/dist/src/core/xpcshell-appdir.js +38 -45
- package/dist/src/errors/base.d.ts +37 -16
- package/dist/src/errors/base.js +37 -16
- package/dist/src/errors/build.d.ts +13 -1
- package/dist/src/errors/build.js +14 -2
- package/dist/src/errors/codes.d.ts +16 -0
- package/dist/src/errors/codes.js +16 -0
- package/dist/src/errors/furnace.d.ts +4 -4
- package/dist/src/errors/git.d.ts +6 -10
- package/dist/src/errors/git.js +6 -10
- package/dist/src/errors/patch.d.ts +7 -7
- package/dist/src/errors/patch.js +7 -7
- package/dist/src/errors/rebase.d.ts +4 -4
- package/dist/src/errors/rebase.js +4 -4
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.js +5 -0
- package/dist/src/types/commands/index.d.ts +2 -2
- package/dist/src/types/commands/options.d.ts +88 -70
- package/dist/src/types/commands/patches.d.ts +24 -34
- package/dist/src/types/commands/project.d.ts +5 -34
- package/dist/src/types/config.d.ts +25 -23
- package/dist/src/types/config.js +6 -1
- package/dist/src/types/furnace.d.ts +37 -13
- package/dist/src/types/furnace.js +19 -1
- package/dist/src/types/index.d.ts +3 -3
- package/dist/src/utils/build-info.d.ts +7 -8
- package/dist/src/utils/build-info.js +12 -11
- package/dist/src/utils/errors.d.ts +6 -8
- package/dist/src/utils/errors.js +6 -8
- package/dist/src/utils/logger.d.ts +27 -10
- package/dist/src/utils/logger.js +28 -16
- package/dist/src/utils/machine-output.d.ts +12 -0
- package/dist/src/utils/machine-output.js +33 -0
- package/dist/src/utils/options.d.ts +31 -14
- package/dist/src/utils/options.js +86 -30
- package/dist/src/utils/paths.d.ts +10 -8
- package/dist/src/utils/paths.js +10 -8
- package/dist/src/utils/platform.d.ts +0 -25
- package/dist/src/utils/platform.js +1 -42
- package/dist/src/utils/process-group.d.ts +9 -4
- package/dist/src/utils/process-group.js +19 -5
- package/dist/src/utils/process.d.ts +42 -7
- package/dist/src/utils/process.js +44 -17
- package/dist/src/utils/ps-duration.d.ts +31 -0
- package/dist/src/utils/ps-duration.js +70 -0
- package/dist/src/utils/regex.d.ts +9 -10
- package/dist/src/utils/regex.js +9 -10
- package/dist/src/utils/validation.d.ts +58 -28
- package/dist/src/utils/validation.js +60 -33
- package/package.json +2 -2
- package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
- package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
- package/dist/src/core/manifest-helpers.d.ts +0 -38
- package/dist/src/core/manifest-helpers.js +0 -120
- /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
- /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
- /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CustomComponentConfig, DryRunAction, OverrideComponentConfig, StepError } from '../types/furnace.js';
|
|
1
|
+
import type { ComponentApplyContext, CustomComponentConfig, DryRunAction, OverrideComponentConfig, StepError } from '../types/furnace.js';
|
|
2
2
|
import { type RollbackJournal } from './furnace-rollback.js';
|
|
3
3
|
interface DirectoryEntry {
|
|
4
4
|
isFile(): boolean;
|
|
@@ -7,8 +7,8 @@ interface DirectoryEntry {
|
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* True for a plain-file directory entry — symlinks and directories are
|
|
10
|
-
* never copy candidates. Exported for the patch-owned overwrite probe
|
|
11
|
-
|
|
10
|
+
* never copy candidates. Exported for the patch-owned overwrite probe,
|
|
11
|
+
* which walks the same override copy-candidate set as apply.
|
|
12
12
|
*/
|
|
13
13
|
export declare function isRegularFile(entry: DirectoryEntry): boolean;
|
|
14
14
|
/**
|
|
@@ -86,14 +86,14 @@ export declare function hasComponentChanged(componentDir: string, previousChecks
|
|
|
86
86
|
* the comparison when the engine hash still matches, which is the common case
|
|
87
87
|
* for projects with many components.
|
|
88
88
|
*/
|
|
89
|
-
export declare function hasOverrideEngineDrift(
|
|
89
|
+
export declare function hasOverrideEngineDrift(ctx: Pick<ComponentApplyContext, 'engineDir' | 'componentDir' | 'ftlDir'>, config: OverrideComponentConfig, cachedEngineChecksums?: Record<string, string>): Promise<boolean>;
|
|
90
90
|
/**
|
|
91
91
|
* Detects whether a custom component's deployed copies, jar.mn entries, or
|
|
92
92
|
* customElements.js registration are missing from the engine or out of sync.
|
|
93
93
|
* Delegates to `checkRegistrationConsistency` so the oracle stays aligned with
|
|
94
94
|
* the validate command.
|
|
95
95
|
*/
|
|
96
|
-
export declare function hasCustomEngineDrift(
|
|
96
|
+
export declare function hasCustomEngineDrift(ctx: Pick<ComponentApplyContext, 'root' | 'name' | 'componentDir' | 'ftlDir'>, config: CustomComponentConfig): Promise<boolean>;
|
|
97
97
|
/** Extra knobs threaded into `applyCustomComponent` from the project config. */
|
|
98
98
|
export interface CustomApplyOptions {
|
|
99
99
|
/**
|
|
@@ -104,13 +104,13 @@ export interface CustomApplyOptions {
|
|
|
104
104
|
markerComment?: string;
|
|
105
105
|
}
|
|
106
106
|
/** Applies a custom component into the engine tree and captures registration step errors. */
|
|
107
|
-
export declare function applyCustomComponent(
|
|
107
|
+
export declare function applyCustomComponent(ctx: Pick<ComponentApplyContext, 'engineDir' | 'name' | 'componentDir' | 'ftlDir'>, config: CustomComponentConfig, dryRun?: boolean, rollbackJournal?: RollbackJournal, applyOptions?: CustomApplyOptions): Promise<{
|
|
108
108
|
affectedPaths: string[];
|
|
109
109
|
stepErrors: StepError[];
|
|
110
110
|
actions?: DryRunAction[];
|
|
111
111
|
}>;
|
|
112
112
|
/** Applies an override component by copying its matching files onto the engine tree. */
|
|
113
|
-
export declare function applyOverrideComponent(
|
|
113
|
+
export declare function applyOverrideComponent(ctx: Pick<ComponentApplyContext, 'engineDir' | 'name' | 'componentDir' | 'ftlDir'>, config: OverrideComponentConfig, dryRun?: boolean, rollbackJournal?: RollbackJournal): Promise<{
|
|
114
114
|
affectedPaths: string[];
|
|
115
115
|
actions?: DryRunAction[];
|
|
116
116
|
}>;
|
|
@@ -8,6 +8,7 @@ import { copyFile, ensureDir, pathExists, readText, removeFile } from '../utils/
|
|
|
8
8
|
import { verbose } from '../utils/logger.js';
|
|
9
9
|
import { buildCustomDryRunActions } from './furnace-apply-dry-run.js';
|
|
10
10
|
import { applyCustomFtlFile, applySharedFtlPrune, removeCustomFtlJarMnEntry, } from './furnace-apply-ftl.js';
|
|
11
|
+
import { normalizeForChecksum } from './furnace-checksum-utils.js';
|
|
11
12
|
import { CUSTOM_ELEMENTS_JS, JAR_MN } from './furnace-constants.js';
|
|
12
13
|
import { deployFileWithFragments, SHARED_FRAGMENTS_DIR } from './furnace-css-fragments.js';
|
|
13
14
|
import { addCustomElementRegistration, addJarMnEntries } from './furnace-registration.js';
|
|
@@ -17,8 +18,8 @@ import { isGitRepository } from './git.js';
|
|
|
17
18
|
import { fileExistsInHead, restoreTrackedPath } from './git-file-ops.js';
|
|
18
19
|
/**
|
|
19
20
|
* True for a plain-file directory entry — symlinks and directories are
|
|
20
|
-
* never copy candidates. Exported for the patch-owned overwrite probe
|
|
21
|
-
|
|
21
|
+
* never copy candidates. Exported for the patch-owned overwrite probe,
|
|
22
|
+
* which walks the same override copy-candidate set as apply.
|
|
22
23
|
*/
|
|
23
24
|
export function isRegularFile(entry) {
|
|
24
25
|
if (!entry.isFile())
|
|
@@ -98,8 +99,7 @@ export async function computeComponentChecksums(componentDir) {
|
|
|
98
99
|
if (!isChecksummedComponentFile(entry.name))
|
|
99
100
|
continue;
|
|
100
101
|
const content = await readText(join(componentDir, entry.name));
|
|
101
|
-
const
|
|
102
|
-
const hash = createHash('sha256').update(normalized).digest('hex');
|
|
102
|
+
const hash = createHash('sha256').update(normalizeForChecksum(content)).digest('hex');
|
|
103
103
|
checksums[entry.name] = hash;
|
|
104
104
|
}
|
|
105
105
|
return checksums;
|
|
@@ -200,9 +200,6 @@ function componentChecksumsChanged(current, previousChecksums) {
|
|
|
200
200
|
}
|
|
201
201
|
return false;
|
|
202
202
|
}
|
|
203
|
-
function normalizeForChecksum(content) {
|
|
204
|
-
return content.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n');
|
|
205
|
-
}
|
|
206
203
|
/**
|
|
207
204
|
* Detects whether an override component's deployed files are missing from the
|
|
208
205
|
* engine or differ from the source. Used as a guard before skipping apply on a
|
|
@@ -215,7 +212,8 @@ function normalizeForChecksum(content) {
|
|
|
215
212
|
* the comparison when the engine hash still matches, which is the common case
|
|
216
213
|
* for projects with many components.
|
|
217
214
|
*/
|
|
218
|
-
export async function hasOverrideEngineDrift(
|
|
215
|
+
export async function hasOverrideEngineDrift(ctx, config, cachedEngineChecksums) {
|
|
216
|
+
const { engineDir, componentDir, ftlDir } = ctx;
|
|
219
217
|
const entries = await readdir(componentDir, { withFileTypes: true, encoding: 'utf8' });
|
|
220
218
|
for (const entry of entries) {
|
|
221
219
|
if (!isRegularFile(entry))
|
|
@@ -251,7 +249,8 @@ export async function hasOverrideEngineDrift(engineDir, componentDir, config, ft
|
|
|
251
249
|
* Delegates to `checkRegistrationConsistency` so the oracle stays aligned with
|
|
252
250
|
* the validate command.
|
|
253
251
|
*/
|
|
254
|
-
export async function hasCustomEngineDrift(
|
|
252
|
+
export async function hasCustomEngineDrift(ctx, config) {
|
|
253
|
+
const { root, name, componentDir, ftlDir } = ctx;
|
|
255
254
|
const status = await checkRegistrationConsistency(root, name, config, ftlDir);
|
|
256
255
|
if (!status.targetExists || !status.filesInSync) {
|
|
257
256
|
return true;
|
|
@@ -289,7 +288,10 @@ export async function hasCustomEngineDrift(root, name, componentDir, config, ftl
|
|
|
289
288
|
return false;
|
|
290
289
|
}
|
|
291
290
|
/** Applies a custom component into the engine tree and captures registration step errors. */
|
|
292
|
-
export async function applyCustomComponent(
|
|
291
|
+
export async function applyCustomComponent(ctx, config, dryRun = false, rollbackJournal, applyOptions = {}) {
|
|
292
|
+
// `ftlDir` stays on the context (the FTL and dry-run callees below read
|
|
293
|
+
// it) but is not needed by name here.
|
|
294
|
+
const { engineDir, name, componentDir } = ctx;
|
|
293
295
|
if (!/^[a-z][a-z0-9-]*$/.test(name)) {
|
|
294
296
|
throw new FurnaceError(`Invalid component name "${name}": must match /^[a-z][a-z0-9-]*$/`);
|
|
295
297
|
}
|
|
@@ -300,7 +302,7 @@ export async function applyCustomComponent(engineDir, name, componentDir, config
|
|
|
300
302
|
verbose(`Skipped ${customSymlinks.length} symlink(s) in "${name}": ${customSymlinks.map((e) => e.name).join(', ')}`);
|
|
301
303
|
}
|
|
302
304
|
if (dryRun) {
|
|
303
|
-
const { actions, stepErrors } = await buildCustomDryRunActions(
|
|
305
|
+
const { actions, stepErrors } = await buildCustomDryRunActions(ctx, config, targetDir, entries);
|
|
304
306
|
return { affectedPaths: [], stepErrors, actions };
|
|
305
307
|
}
|
|
306
308
|
if (rollbackJournal && !(await pathExists(targetDir))) {
|
|
@@ -323,8 +325,8 @@ export async function applyCustomComponent(engineDir, name, componentDir, config
|
|
|
323
325
|
}
|
|
324
326
|
// Copy phase (parallel — independent file writes to different paths).
|
|
325
327
|
// CSS files carrying @fireforge-include directives are written as their
|
|
326
|
-
// fragment-expanded form
|
|
327
|
-
//
|
|
328
|
+
// fragment-expanded form; the workspace source keeps only the directive,
|
|
329
|
+
// so shared CSS stays single-sourced.
|
|
328
330
|
const sharedDir = join(componentDir, '..', '..', SHARED_FRAGMENTS_DIR);
|
|
329
331
|
await Promise.all(filesToCopy.map(async (entry) => {
|
|
330
332
|
const src = join(componentDir, entry.name);
|
|
@@ -337,13 +339,13 @@ export async function applyCustomComponent(engineDir, name, componentDir, config
|
|
|
337
339
|
// the shared bundle is owned elsewhere and FireForge must not copy or
|
|
338
340
|
// register a per-component `.ftl` on its behalf.
|
|
339
341
|
if (config.localized && !config.sharedFtl) {
|
|
340
|
-
await applyCustomFtlFile(
|
|
342
|
+
await applyCustomFtlFile(ctx, affectedPaths, stepErrors, rollbackJournal);
|
|
341
343
|
}
|
|
342
344
|
else if (config.localized && config.sharedFtl) {
|
|
343
345
|
// Drop any dangling per-widget locale jar.mn entry that would point at a
|
|
344
346
|
// non-existent `<chromeSubPath>/<name>.ftl` and fail `mach build`. The
|
|
345
347
|
// shared bundle (a different chrome path/base name) is never touched.
|
|
346
|
-
await applySharedFtlPrune(
|
|
348
|
+
await applySharedFtlPrune(ctx, config, affectedPaths, stepErrors, rollbackJournal);
|
|
347
349
|
}
|
|
348
350
|
if (config.register) {
|
|
349
351
|
try {
|
|
@@ -383,7 +385,8 @@ export async function applyCustomComponent(engineDir, name, componentDir, config
|
|
|
383
385
|
return { affectedPaths, stepErrors };
|
|
384
386
|
}
|
|
385
387
|
/** Applies an override component by copying its matching files onto the engine tree. */
|
|
386
|
-
export async function applyOverrideComponent(
|
|
388
|
+
export async function applyOverrideComponent(ctx, config, dryRun = false, rollbackJournal) {
|
|
389
|
+
const { engineDir, name, componentDir, ftlDir } = ctx;
|
|
387
390
|
const targetDir = join(engineDir, config.basePath);
|
|
388
391
|
if (!(await pathExists(targetDir))) {
|
|
389
392
|
throw new FurnaceError(`Override target path not found in engine: ${config.basePath}`, name);
|
|
@@ -2,19 +2,18 @@
|
|
|
2
2
|
* Patch-owned overwrite warnings for `furnace apply`.
|
|
3
3
|
*
|
|
4
4
|
* For Furnace-managed components, apply OVERWRITES the deployed engine
|
|
5
|
-
* copies with the `components/` sources. A fix made directly in `engine/`
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* and produces a loud per-file warning naming the file, the owning
|
|
5
|
+
* copies with the `components/` sources. A fix made directly in `engine/` and
|
|
6
|
+
* exported into a patch — but never back-ported to the component source — is
|
|
7
|
+
* silently undone by the next apply, and a plain drift line reads like
|
|
8
|
+
* "someone's uncommitted work". This module detects that exact case BEFORE
|
|
9
|
+
* the copy (deployed bytes differ from the component source AND the file is
|
|
10
|
+
* patch-owned) and produces a per-file warning naming the file, the owning
|
|
12
11
|
* patch, and the consequence.
|
|
13
12
|
*
|
|
14
13
|
* The per-file byte comparison already exists —
|
|
15
14
|
* `checkRegistrationConsistency` for custom components (fragment- and
|
|
16
|
-
* ftl-aware) and the copy-candidate walk for overrides — this module
|
|
17
|
-
*
|
|
15
|
+
* ftl-aware) and the copy-candidate walk for overrides — so this module only
|
|
16
|
+
* surfaces what was previously computed and thrown away.
|
|
18
17
|
*/
|
|
19
18
|
import type { CustomComponentConfig, OverrideComponentConfig } from '../types/furnace.js';
|
|
20
19
|
/** One deployed, patch-owned file about to be overwritten with different bytes. */
|
|
@@ -3,19 +3,18 @@
|
|
|
3
3
|
* Patch-owned overwrite warnings for `furnace apply`.
|
|
4
4
|
*
|
|
5
5
|
* For Furnace-managed components, apply OVERWRITES the deployed engine
|
|
6
|
-
* copies with the `components/` sources. A fix made directly in `engine/`
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* and produces a loud per-file warning naming the file, the owning
|
|
6
|
+
* copies with the `components/` sources. A fix made directly in `engine/` and
|
|
7
|
+
* exported into a patch — but never back-ported to the component source — is
|
|
8
|
+
* silently undone by the next apply, and a plain drift line reads like
|
|
9
|
+
* "someone's uncommitted work". This module detects that exact case BEFORE
|
|
10
|
+
* the copy (deployed bytes differ from the component source AND the file is
|
|
11
|
+
* patch-owned) and produces a per-file warning naming the file, the owning
|
|
13
12
|
* patch, and the consequence.
|
|
14
13
|
*
|
|
15
14
|
* The per-file byte comparison already exists —
|
|
16
15
|
* `checkRegistrationConsistency` for custom components (fragment- and
|
|
17
|
-
* ftl-aware) and the copy-candidate walk for overrides — this module
|
|
18
|
-
*
|
|
16
|
+
* ftl-aware) and the copy-candidate walk for overrides — so this module only
|
|
17
|
+
* surfaces what was previously computed and thrown away.
|
|
19
18
|
*/
|
|
20
19
|
import { readdir } from 'node:fs/promises';
|
|
21
20
|
import { join, relative } from 'node:path';
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dry-run action builders for files deleted from a component workspace
|
|
3
|
-
*
|
|
4
|
-
* line budget
|
|
5
|
-
* undeploy paths stay in `furnace-apply-helpers.ts`.
|
|
2
|
+
* Dry-run action builders for files deleted from a component workspace since
|
|
3
|
+
* the last apply. Split out of `furnace-apply.ts` to stay under the per-file
|
|
4
|
+
* line budget; the real undeploy paths stay in `furnace-apply-helpers.ts`.
|
|
6
5
|
*/
|
|
7
6
|
import type { CustomComponentConfig, DryRunAction, OverrideComponentConfig } from '../types/furnace.js';
|
|
8
7
|
/** Plans the engine-restore actions for deleted override workspace files. */
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* Dry-run action builders for files deleted from a component workspace
|
|
4
|
-
*
|
|
5
|
-
* line budget
|
|
6
|
-
* undeploy paths stay in `furnace-apply-helpers.ts`.
|
|
3
|
+
* Dry-run action builders for files deleted from a component workspace since
|
|
4
|
+
* the last apply. Split out of `furnace-apply.ts` to stay under the per-file
|
|
5
|
+
* line budget; the real undeploy paths stay in `furnace-apply-helpers.ts`.
|
|
7
6
|
*/
|
|
8
7
|
import { join } from 'node:path';
|
|
9
8
|
import { getOverrideEngineTargetPath } from './furnace-apply-helpers.js';
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import type { ApplyResult, DryRunAction } from '../types/furnace.js';
|
|
2
2
|
import { type FurnaceOperationContext } from './furnace-operation.js';
|
|
3
3
|
import { type RollbackJournal } from './furnace-rollback.js';
|
|
4
|
-
export { computeComponentChecksums,
|
|
4
|
+
export { computeComponentChecksums, hasComponentChanged, prefixChecksums, } from './furnace-apply-helpers.js';
|
|
5
5
|
/**
|
|
6
6
|
* Result of {@link applyAllComponents}.
|
|
7
7
|
*
|
|
8
|
-
* Named
|
|
9
|
-
* `Awaited<ReturnType<typeof applyAllComponents
|
|
10
|
-
* `furnace/deploy.ts`, `furnace/preview.ts`, `furnace-state-persist.ts` and
|
|
11
|
-
* `build-prepare.ts` — none of which could be read without opening this file.
|
|
8
|
+
* Named so consumers can refer to the shape directly instead of going
|
|
9
|
+
* through `Awaited<ReturnType<typeof applyAllComponents>>`.
|
|
12
10
|
*
|
|
13
11
|
* `actions` is populated only on a dry run; `rollbackJournal` only when
|
|
14
12
|
* `persistState: false` hands journal ownership back to the caller.
|
|
@@ -46,7 +44,6 @@ export declare function applyAllComponents(root: string, dryRun?: boolean, optio
|
|
|
46
44
|
}): Promise<ApplyAllComponentsResult>; /**
|
|
47
45
|
* Shared context threaded through the batch apply loops. Bundles the state
|
|
48
46
|
* both loops mutate (result/actions/checksums) with the immutable run
|
|
49
|
-
* parameters
|
|
50
|
-
* drift
|
|
51
|
-
* two-signature change.
|
|
47
|
+
* parameters; the 12–13 positional parameters this replaced let call sites
|
|
48
|
+
* drift and made every new parameter a two-signature change.
|
|
52
49
|
*/
|
|
@@ -14,11 +14,12 @@ import { CUSTOM_ELEMENTS_JS, JAR_MN, resolveFtlDir } from './furnace-constants.j
|
|
|
14
14
|
import { topologicalSortCustom } from './furnace-graph-utils.js';
|
|
15
15
|
import { resolveFurnaceMarkerComment } from './furnace-marker.js';
|
|
16
16
|
import { recordFurnaceRollbackFailure } from './furnace-operation.js';
|
|
17
|
+
import { assertFurnaceEngineDirReady } from './furnace-precondition.js';
|
|
17
18
|
import { addJarMnEntries, removeCustomElementRegistration, removeJarMnEntries, } from './furnace-registration.js';
|
|
18
19
|
import { createRollbackJournal, restoreRollbackJournalOrThrow, snapshotFile, } from './furnace-rollback.js';
|
|
19
20
|
import { blockingStepErrors, hasBlockingStepErrors } from './furnace-step-errors.js';
|
|
20
21
|
import { runPostApplyConsistencyChecks } from './furnace-validate-registration.js';
|
|
21
|
-
export { computeComponentChecksums,
|
|
22
|
+
export { computeComponentChecksums, hasComponentChanged, prefixChecksums, } from './furnace-apply-helpers.js';
|
|
22
23
|
function addMissingComponentError(result, name, directoryPath) {
|
|
23
24
|
result.errors.push({
|
|
24
25
|
name,
|
|
@@ -50,7 +51,7 @@ async function applyOverrideBatch(ctx) {
|
|
|
50
51
|
// reset/download/manual edits can silently erase engine files; the
|
|
51
52
|
// checksum record alone cannot detect that.
|
|
52
53
|
const cachedEngine = extractComponentChecksums(state.engineChecksums, 'override', name);
|
|
53
|
-
const drifted = await hasOverrideEngineDrift(engineDir, componentDir,
|
|
54
|
+
const drifted = await hasOverrideEngineDrift({ engineDir, componentDir, ftlDir }, overrideConfig, cachedEngine);
|
|
54
55
|
if (!drifted) {
|
|
55
56
|
result.skipped.push({ name, reason: 'No changes since last apply' });
|
|
56
57
|
Object.assign(newChecksums, prefixChecksums(previous, 'override', name));
|
|
@@ -76,7 +77,7 @@ async function applyOverrideBatch(ctx) {
|
|
|
76
77
|
if (!dryRun) {
|
|
77
78
|
// Runs unconditionally — including when the component source
|
|
78
79
|
// changed — because the lost-work case is precisely a deployed
|
|
79
|
-
// engine edit that the incoming copy is about to replace
|
|
80
|
+
// engine edit that the incoming copy is about to replace.
|
|
80
81
|
recordOverwriteWarnings(result, await findPatchOwnedOverwrites({
|
|
81
82
|
type: 'override',
|
|
82
83
|
engineDir,
|
|
@@ -87,7 +88,7 @@ async function applyOverrideBatch(ctx) {
|
|
|
87
88
|
patchClaims: ctx.patchClaims,
|
|
88
89
|
}));
|
|
89
90
|
}
|
|
90
|
-
const { affectedPaths: filesAffected, actions } = await applyOverrideComponent(engineDir, name, componentDir,
|
|
91
|
+
const { affectedPaths: filesAffected, actions } = await applyOverrideComponent({ engineDir, name, componentDir, ftlDir }, overrideConfig, dryRun, rollbackJournal);
|
|
91
92
|
if (dryRun && actions) {
|
|
92
93
|
allActions.push(...actions);
|
|
93
94
|
}
|
|
@@ -208,7 +209,7 @@ async function applyCustomBatch(ctx, root, markerComment) {
|
|
|
208
209
|
// As with overrides, the checksum record is not sufficient on its
|
|
209
210
|
// own: a reset/download that cleared the engine must trigger a
|
|
210
211
|
// re-apply even though the workspace is unchanged.
|
|
211
|
-
const drifted = await hasCustomEngineDrift(root, name, componentDir,
|
|
212
|
+
const drifted = await hasCustomEngineDrift({ root, name, componentDir, ftlDir }, customConfig);
|
|
212
213
|
if (!drifted) {
|
|
213
214
|
result.skipped.push({ name, reason: 'No changes since last apply' });
|
|
214
215
|
Object.assign(newChecksums, prefixChecksums(previous, 'custom', name));
|
|
@@ -244,7 +245,7 @@ async function applyCustomBatch(ctx, root, markerComment) {
|
|
|
244
245
|
patchClaims: ctx.patchClaims,
|
|
245
246
|
}));
|
|
246
247
|
}
|
|
247
|
-
const { affectedPaths: filesAffected, stepErrors, actions, } = await applyCustomComponent(engineDir, name, componentDir,
|
|
248
|
+
const { affectedPaths: filesAffected, stepErrors, actions, } = await applyCustomComponent({ engineDir, name, componentDir, ftlDir }, customConfig, dryRun, rollbackJournal, markerComment !== undefined ? { markerComment } : {});
|
|
248
249
|
if (dryRun && actions) {
|
|
249
250
|
allActions.push(...actions);
|
|
250
251
|
}
|
|
@@ -304,19 +305,14 @@ export async function applyAllComponents(root, dryRun = false, options) {
|
|
|
304
305
|
const { engine: engineDir } = getProjectPaths(root);
|
|
305
306
|
const furnacePaths = getFurnacePaths(root);
|
|
306
307
|
const ftlDir = resolveFtlDir(config.ftlBasePath);
|
|
307
|
-
//
|
|
308
|
-
//
|
|
309
|
-
//
|
|
310
|
-
//
|
|
311
|
-
//
|
|
312
|
-
// `[missing-modification-comment]` on every furnace-applied
|
|
313
|
-
// upstream edit because the implicit default was `undefined`. An
|
|
314
|
-
// explicit `markerComment` in fireforge.json still wins.
|
|
308
|
+
// When `markerComment` is unset in fireforge.json, default it to
|
|
309
|
+
// `binaryName.toUpperCase()` so the furnace-emitted edits to upstream
|
|
310
|
+
// files (e.g. customElements.js) carry a marker that satisfies
|
|
311
|
+
// `lintModificationComments` — that rule keys on
|
|
312
|
+
// `${binaryName.toUpperCase()}:`. An explicit `markerComment` still wins.
|
|
315
313
|
const forgeConfig = await loadConfig(root).catch(() => undefined);
|
|
316
314
|
const markerComment = resolveFurnaceMarkerComment(forgeConfig);
|
|
317
|
-
|
|
318
|
-
throw new FurnaceError('Engine directory not found. Run "fireforge download" first.');
|
|
319
|
-
}
|
|
315
|
+
await assertFurnaceEngineDirReady(engineDir);
|
|
320
316
|
const rollbackJournal = dryRun ? undefined : createRollbackJournal();
|
|
321
317
|
if (rollbackJournal && operationContext) {
|
|
322
318
|
operationContext.registerJournal(rollbackJournal);
|
|
@@ -376,10 +372,10 @@ export async function applyAllComponents(root, dryRun = false, options) {
|
|
|
376
372
|
}
|
|
377
373
|
// Recompute AFTER the consistency checks: they MUTATE entry.stepErrors
|
|
378
374
|
// when the applied output is inconsistent (e.g. a jar.mn entry that
|
|
379
|
-
// silently mis-landed). Reading the pre-check snapshot
|
|
380
|
-
//
|
|
381
|
-
//
|
|
382
|
-
//
|
|
375
|
+
// silently mis-landed). Reading the pre-check snapshot lets those failures
|
|
376
|
+
// skip rollback and persist checksums for a component known to be
|
|
377
|
+
// inconsistent, while the CLI simultaneously reports "failed to apply
|
|
378
|
+
// cleanly".
|
|
383
379
|
const hasStepErrors = result.applied.some((entry) => hasBlockingStepErrors(entry));
|
|
384
380
|
// --- Rollback on failure, persist on success (skip for dry-run) ---
|
|
385
381
|
if (!dryRun) {
|
|
@@ -426,7 +422,6 @@ export async function applyAllComponents(root, dryRun = false, options) {
|
|
|
426
422
|
} /**
|
|
427
423
|
* Shared context threaded through the batch apply loops. Bundles the state
|
|
428
424
|
* both loops mutate (result/actions/checksums) with the immutable run
|
|
429
|
-
* parameters
|
|
430
|
-
* drift
|
|
431
|
-
* two-signature change.
|
|
425
|
+
* parameters; the 12–13 positional parameters this replaced let call sites
|
|
426
|
+
* drift and made every new parameter a two-signature change.
|
|
432
427
|
*/
|
|
@@ -9,3 +9,17 @@ export declare function prefixChecksums(checksums: Record<string, string>, type:
|
|
|
9
9
|
* (sorted 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
|
+
/**
|
|
13
|
+
* Canonical content normalization for every FireForge component checksum.
|
|
14
|
+
*
|
|
15
|
+
* Strips a leading BOM and folds CRLF to LF, so a file that differs from its
|
|
16
|
+
* deployed copy only by line endings or a byte-order mark is not reported as
|
|
17
|
+
* drift. Every comparison that decides "has this component changed?" must
|
|
18
|
+
* use it — otherwise `furnace status` and `furnace validate` can disagree
|
|
19
|
+
* with `apply`'s skip fast-path about the same pair of files on a CRLF
|
|
20
|
+
* checkout.
|
|
21
|
+
*
|
|
22
|
+
* @param content - Raw file content
|
|
23
|
+
* @returns Content with the BOM removed and CRLF folded to LF
|
|
24
|
+
*/
|
|
25
|
+
export declare function normalizeForChecksum(content: string): string;
|
|
@@ -36,3 +36,19 @@ export function diffDeletedFiles(previous, current) {
|
|
|
36
36
|
}
|
|
37
37
|
return deleted.sort();
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Canonical content normalization for every FireForge component checksum.
|
|
41
|
+
*
|
|
42
|
+
* Strips a leading BOM and folds CRLF to LF, so a file that differs from its
|
|
43
|
+
* deployed copy only by line endings or a byte-order mark is not reported as
|
|
44
|
+
* drift. Every comparison that decides "has this component changed?" must
|
|
45
|
+
* use it — otherwise `furnace status` and `furnace validate` can disagree
|
|
46
|
+
* with `apply`'s skip fast-path about the same pair of files on a CRLF
|
|
47
|
+
* checkout.
|
|
48
|
+
*
|
|
49
|
+
* @param content - Raw file content
|
|
50
|
+
* @returns Content with the BOM removed and CRLF folded to LF
|
|
51
|
+
*/
|
|
52
|
+
export function normalizeForChecksum(content) {
|
|
53
|
+
return content.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n');
|
|
54
|
+
}
|
|
@@ -53,8 +53,7 @@ export declare function loadFurnaceConfig(root: string): Promise<FurnaceConfig>;
|
|
|
53
53
|
* reset, rebase, rebase --abort): every applied checksum describes content
|
|
54
54
|
* that no longer exists, but pendingRepair tracks authoring-side rollback
|
|
55
55
|
* issues in the component WORKSPACE and must survive an engine refresh.
|
|
56
|
-
* No-ops when the state file does not exist.
|
|
57
|
-
* reset logic had drifted into four separate command files.
|
|
56
|
+
* No-ops when the state file does not exist.
|
|
58
57
|
*/
|
|
59
58
|
export declare function clearAppliedFurnaceState(root: string): Promise<void>;
|
|
60
59
|
/**
|
|
@@ -65,20 +64,15 @@ export declare function clearAppliedFurnaceState(root: string): Promise<void>;
|
|
|
65
64
|
export declare function writeFurnaceConfig(root: string, config: FurnaceConfig): Promise<void>;
|
|
66
65
|
/**
|
|
67
66
|
* Stamps every override's `baseVersion` to the supplied version. Used by
|
|
68
|
-
* `fireforge rebase` after a successful patch re-export so
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
67
|
+
* `fireforge rebase` after a successful patch re-export, so an ESR bump does
|
|
68
|
+
* not leave Furnace overrides in a doctor-failing drift state: `rebase`
|
|
69
|
+
* stamps patch `sourceEsrVersion` via `stampPatchVersions`, and without the
|
|
70
|
+
* matching override stamp `doctor` fails Furnace component validation on
|
|
71
|
+
* every override.
|
|
72
72
|
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* then immediately failed Furnace component validation on every
|
|
77
|
-
* override. The stamp is deliberately unconditional — `fireforge
|
|
78
|
-
* furnace validate` is the right tool for "does this override still
|
|
79
|
-
* apply", and rebase already attested that the patch layer re-validated
|
|
80
|
-
* against the new ESR; the per-override health check belongs in a
|
|
81
|
-
* separate pass, not inline with the stamp.
|
|
73
|
+
* The stamp is deliberately unconditional — `fireforge furnace validate` is
|
|
74
|
+
* the right tool for "does this override still apply", and rebase has
|
|
75
|
+
* already attested that the patch layer re-validated against the new ESR.
|
|
82
76
|
*
|
|
83
77
|
* @param root - Root directory of the project
|
|
84
78
|
* @param version - Firefox version string to stamp onto every override
|
|
@@ -90,23 +84,20 @@ export declare function stampFurnaceOverrideBaseVersions(root: string, version:
|
|
|
90
84
|
* Creates a default furnace configuration.
|
|
91
85
|
*
|
|
92
86
|
* When a `binaryName` is provided, the default config carries a
|
|
93
|
-
* `tokenPrefix` derived as `--<binaryName>-`. Without
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* the prefix from the binary name matches the convention the scaffolded
|
|
100
|
-
* tokens CSS already uses for its `--<binaryName>-*` declarations.
|
|
87
|
+
* `tokenPrefix` derived as `--<binaryName>-`. Without it, `fireforge token
|
|
88
|
+
* coverage` on a fresh project reports `0 tokens` and labels every
|
|
89
|
+
* custom-property reference as `unknown`, because the scan has no prefix to
|
|
90
|
+
* key off. Deriving the prefix from the binary name matches the convention
|
|
91
|
+
* the scaffolded tokens CSS already uses for its `--<binaryName>-*`
|
|
92
|
+
* declarations.
|
|
101
93
|
*
|
|
102
|
-
* `validateFurnaceConfig` treats `tokenPrefix` as optional, so callers
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* `fireforge.json` and always sets one.
|
|
94
|
+
* `validateFurnaceConfig` treats `tokenPrefix` as optional, so callers on
|
|
95
|
+
* the no-arg call shape still get a valid config without a prefix; the CLI
|
|
96
|
+
* init path always has a `binaryName` from `fireforge.json` and always sets
|
|
97
|
+
* one.
|
|
107
98
|
*
|
|
108
|
-
* @param options - Optional init context; pass `{ binaryName }` to
|
|
109
|
-
*
|
|
99
|
+
* @param options - Optional init context; pass `{ binaryName }` to derive
|
|
100
|
+
* the token prefix.
|
|
110
101
|
* @returns A valid FurnaceConfig
|
|
111
102
|
*/
|
|
112
103
|
export declare function createDefaultFurnaceConfig(options?: {
|