@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
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Matches any of:
|
|
14
14
|
* 1. `setElementCreationCallback("tag"` / `setElementCreationCallback('tag'`
|
|
15
|
-
* 2. Single-line array entry: `["tag", "..."]`
|
|
15
|
+
* 2. Single-line array entry: `["tag", "..."]` (column 0 only, comments allowed after)
|
|
16
16
|
* 3. Multi-line array entry: `"tag",` on its own line, optional trailing `//` comment
|
|
17
17
|
*/
|
|
18
18
|
export declare function isTagAlreadyRegistered(content: string, tagName: string): boolean;
|
|
@@ -28,7 +28,6 @@ export interface RegistrationWriteOptions {
|
|
|
28
28
|
*/
|
|
29
29
|
markerComment?: string;
|
|
30
30
|
}
|
|
31
|
-
export { removeCustomElementRegistration } from './furnace-registration-remove.js';
|
|
32
31
|
/**
|
|
33
32
|
* Adds a custom element registration entry to customElements.js.
|
|
34
33
|
*
|
|
@@ -39,7 +38,7 @@ export { removeCustomElementRegistration } from './furnace-registration-remove.j
|
|
|
39
38
|
* ```
|
|
40
39
|
*
|
|
41
40
|
* New entries are inserted in alphabetical order relative to existing entries.
|
|
42
|
-
* This operation is idempotent
|
|
41
|
+
* This operation is idempotent: if the tag is already registered the file is
|
|
43
42
|
* left unchanged.
|
|
44
43
|
*
|
|
45
44
|
* @param engineDir - Path to the Firefox engine source root
|
|
@@ -23,7 +23,7 @@ import { validateRegistrationPlacement, validateTagName } from './furnace-regist
|
|
|
23
23
|
*
|
|
24
24
|
* Matches any of:
|
|
25
25
|
* 1. `setElementCreationCallback("tag"` / `setElementCreationCallback('tag'`
|
|
26
|
-
* 2. Single-line array entry: `["tag", "..."]`
|
|
26
|
+
* 2. Single-line array entry: `["tag", "..."]` (column 0 only, comments allowed after)
|
|
27
27
|
* 3. Multi-line array entry: `"tag",` on its own line, optional trailing `//` comment
|
|
28
28
|
*/
|
|
29
29
|
export function isTagAlreadyRegistered(content, tagName) {
|
|
@@ -46,9 +46,6 @@ function formatMarkerSuffix(markerComment) {
|
|
|
46
46
|
return '';
|
|
47
47
|
return ` // ${markerComment}:`;
|
|
48
48
|
}
|
|
49
|
-
// Re-export from split modules so existing import sites continue working
|
|
50
|
-
export { removeCustomElementRegistration } from './furnace-registration-remove.js';
|
|
51
|
-
// Re-export constants so existing import sites continue working
|
|
52
49
|
// ---------------------------------------------------------------------------
|
|
53
50
|
// Helpers
|
|
54
51
|
// ---------------------------------------------------------------------------
|
|
@@ -237,8 +234,8 @@ function addRegistrationAST(content, tagName, modulePath, isESModule, markerComm
|
|
|
237
234
|
* fails. Finds the last existing `["tag", "path"],` line in the appropriate
|
|
238
235
|
* block and inserts the new entry after it in alphabetical order.
|
|
239
236
|
*
|
|
240
|
-
* This is intentionally less precise than the AST approach
|
|
241
|
-
* validate indentation or multi-line format
|
|
237
|
+
* This is intentionally less precise than the AST approach (it does not
|
|
238
|
+
* validate indentation or multi-line format), but it is robust against
|
|
242
239
|
* upstream syntax changes that break the parser.
|
|
243
240
|
*/
|
|
244
241
|
function addRegistrationRegexFallback(content, tagName, modulePath, isESModule, markerComment) {
|
|
@@ -300,7 +297,7 @@ function hasRecognizableRegistrationLoop(content) {
|
|
|
300
297
|
* ```
|
|
301
298
|
*
|
|
302
299
|
* New entries are inserted in alphabetical order relative to existing entries.
|
|
303
|
-
* This operation is idempotent
|
|
300
|
+
* This operation is idempotent: if the tag is already registered the file is
|
|
304
301
|
* left unchanged.
|
|
305
302
|
*
|
|
306
303
|
* @param engineDir - Path to the Firefox engine source root
|
|
@@ -315,13 +312,13 @@ export async function addCustomElementRegistration(engineDir, tagName, modulePat
|
|
|
315
312
|
const content = await readText(filePath);
|
|
316
313
|
// Idempotency: check column-0 of each array entry rather than a literal
|
|
317
314
|
// substring match. A previous apply may have written this entry with
|
|
318
|
-
// trailing marker comments (see `options.markerComment`)
|
|
315
|
+
// trailing marker comments (see `options.markerComment`). Matching on the
|
|
319
316
|
// full line would then miss it and insert a duplicate on re-apply, which
|
|
320
317
|
// throws NotSupportedError at every window-load.
|
|
321
318
|
if (isTagAlreadyRegistered(content, tagName)) {
|
|
322
319
|
return;
|
|
323
320
|
}
|
|
324
|
-
// Validate upfront
|
|
321
|
+
// Validate upfront. Tag name errors must not fall through to the regex fallback.
|
|
325
322
|
validateTagName(tagName);
|
|
326
323
|
const isESModule = modulePath.endsWith('.mjs');
|
|
327
324
|
// Cheap pre-flight: the AST walker assumes the file contains at least one
|
|
@@ -329,7 +326,7 @@ export async function addCustomElementRegistration(engineDir, tagName, modulePat
|
|
|
329
326
|
// right-hand side, and (for ESM tags) at least one such loop inside a
|
|
330
327
|
// `document.addEventListener("DOMContentLoaded", ...)` block. If either
|
|
331
328
|
// assumption is violated the AST path errors with a confusing
|
|
332
|
-
// "Could not find DOMContentLoaded block" message
|
|
329
|
+
// "Could not find DOMContentLoaded block" message, so fail fast here with
|
|
333
330
|
// actionable guidance instead.
|
|
334
331
|
if (!hasRecognizableRegistrationLoop(content)) {
|
|
335
332
|
throw new FurnaceError(`${CUSTOM_ELEMENTS_JS} does not contain a recognizable registration loop; refusing to mutate. ` +
|
|
@@ -345,7 +342,7 @@ export async function addCustomElementRegistration(engineDir, tagName, modulePat
|
|
|
345
342
|
}
|
|
346
343
|
catch (error) {
|
|
347
344
|
if (error instanceof FurnaceError) {
|
|
348
|
-
// AST structural errors (missing DOMContentLoaded block, etc.)
|
|
345
|
+
// AST structural errors (missing DOMContentLoaded block, etc.): try regex fallback
|
|
349
346
|
warn(`AST-based registration failed for ${tagName}: ${error.message}. ` +
|
|
350
347
|
'Falling back to regex-based insertion. Please report this so the AST parser can be updated.');
|
|
351
348
|
try {
|
|
@@ -399,7 +396,7 @@ export async function validateCustomElementRegistration(engineDir, tagName, modu
|
|
|
399
396
|
addRegistrationAST(content, tagName, modulePath, isESModule);
|
|
400
397
|
}
|
|
401
398
|
catch {
|
|
402
|
-
// Validation only
|
|
399
|
+
// Validation only: if AST fails, try regex to see if the entry could be placed
|
|
403
400
|
addRegistrationRegexFallback(content, tagName, modulePath, isESModule);
|
|
404
401
|
}
|
|
405
402
|
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Uses the same AST parser as the add path (`furnace-registration-ast.ts`) to
|
|
5
5
|
* locate and delete registration entries. A line-by-line scan with a bounded
|
|
6
6
|
* bracket match only works against Firefox's stock formatting and fails
|
|
7
|
-
* silently on a hand-reformatted customElements.js
|
|
8
|
-
* matching
|
|
7
|
+
* silently on a hand-reformatted customElements.js. AST-based bracket
|
|
8
|
+
* matching does not depend on the file's formatting.
|
|
9
9
|
*
|
|
10
10
|
* Contract:
|
|
11
11
|
* - Idempotent: if the tag is not registered, the file is left unchanged.
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
/**
|
|
24
24
|
* Removes a custom element registration from customElements.js.
|
|
25
25
|
*
|
|
26
|
-
* This operation is idempotent
|
|
26
|
+
* This operation is idempotent: if the tag is not registered or the file
|
|
27
27
|
* does not exist, nothing happens. If the file exists but cannot be parsed,
|
|
28
28
|
* the file is left unchanged rather than fall back to a line-based
|
|
29
|
-
* heuristic
|
|
29
|
+
* heuristic. A corrupted customElements.js is a doctor problem, not
|
|
30
30
|
* something `furnace remove` should "helpfully" edit around.
|
|
31
31
|
*
|
|
32
32
|
* @param engineDir - Path to the Firefox engine source root
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Uses the same AST parser as the add path (`furnace-registration-ast.ts`) to
|
|
6
6
|
* locate and delete registration entries. A line-by-line scan with a bounded
|
|
7
7
|
* bracket match only works against Firefox's stock formatting and fails
|
|
8
|
-
* silently on a hand-reformatted customElements.js
|
|
9
|
-
* matching
|
|
8
|
+
* silently on a hand-reformatted customElements.js. AST-based bracket
|
|
9
|
+
* matching does not depend on the file's formatting.
|
|
10
10
|
*
|
|
11
11
|
* Contract:
|
|
12
12
|
* - Idempotent: if the tag is not registered, the file is left unchanged.
|
|
@@ -49,7 +49,7 @@ function expandRemovalRange(content, start, end) {
|
|
|
49
49
|
}
|
|
50
50
|
// Consume a trailing inline comment up to end-of-line so we do not leave
|
|
51
51
|
// the comment marooned on its own line. A leading inline comment is left
|
|
52
|
-
// alone
|
|
52
|
+
// alone, because it may belong to the next entry.
|
|
53
53
|
while (expandedEnd < content.length &&
|
|
54
54
|
(content[expandedEnd] === ' ' || content[expandedEnd] === '\t')) {
|
|
55
55
|
expandedEnd++;
|
|
@@ -88,7 +88,7 @@ function expandRemovalRange(content, start, end) {
|
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
90
90
|
* Returns true if `node` represents a `[tag, module]` entry inside a
|
|
91
|
-
* registration array
|
|
91
|
+
* registration array, i.e. an `ArrayExpression` whose first element is a
|
|
92
92
|
* string literal equal to `tagName`. Callers still have to verify the
|
|
93
93
|
* parent is the outer registration array so we do not accidentally delete
|
|
94
94
|
* an arbitrary user-owned `["moz-card", ...]` literal elsewhere in the file.
|
|
@@ -176,10 +176,10 @@ function collectRemovalRanges(ast, content, tagName) {
|
|
|
176
176
|
/**
|
|
177
177
|
* Removes a custom element registration from customElements.js.
|
|
178
178
|
*
|
|
179
|
-
* This operation is idempotent
|
|
179
|
+
* This operation is idempotent: if the tag is not registered or the file
|
|
180
180
|
* does not exist, nothing happens. If the file exists but cannot be parsed,
|
|
181
181
|
* the file is left unchanged rather than fall back to a line-based
|
|
182
|
-
* heuristic
|
|
182
|
+
* heuristic. A corrupted customElements.js is a doctor problem, not
|
|
183
183
|
* something `furnace remove` should "helpfully" edit around.
|
|
184
184
|
*
|
|
185
185
|
* @param engineDir - Path to the Firefox engine source root
|
|
@@ -25,8 +25,8 @@ export declare function validateTagName(tagName: string): void;
|
|
|
25
25
|
* Returns why `tagName` is invalid, or `undefined` when it is fine.
|
|
26
26
|
*
|
|
27
27
|
* The message-returning half of {@link validateTagName}, for callers that
|
|
28
|
-
* must not throw
|
|
29
|
-
* returned string and re-prompt on it. Passing the
|
|
28
|
+
* must not throw, specifically clack `validate` callbacks, which expect a
|
|
29
|
+
* returned string and re-prompt on it. Passing the throwing form to one
|
|
30
30
|
* makes an invalid tag name escape clack's validation loop as a
|
|
31
31
|
* `FurnaceError`, killing the prompt instead of showing the rule inline.
|
|
32
32
|
*
|
|
@@ -33,8 +33,8 @@ export function validateTagName(tagName) {
|
|
|
33
33
|
* Returns why `tagName` is invalid, or `undefined` when it is fine.
|
|
34
34
|
*
|
|
35
35
|
* The message-returning half of {@link validateTagName}, for callers that
|
|
36
|
-
* must not throw
|
|
37
|
-
* returned string and re-prompt on it. Passing the
|
|
36
|
+
* must not throw, specifically clack `validate` callbacks, which expect a
|
|
37
|
+
* returned string and re-prompt on it. Passing the throwing form to one
|
|
38
38
|
* makes an invalid tag name escape clack's validation loop as a
|
|
39
39
|
* `FurnaceError`, killing the prompt instead of showing the rule inline.
|
|
40
40
|
*
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { addCustomElementRegistration,
|
|
1
|
+
export { addCustomElementRegistration, validateCustomElementRegistration, } from './furnace-registration-ast.js';
|
|
2
|
+
export { removeCustomElementRegistration } from './furnace-registration-remove.js';
|
|
2
3
|
/**
|
|
3
4
|
* Adds jar.mn entries that map chrome:// URIs to on-disk paths for a
|
|
4
5
|
* component's files.
|
|
@@ -16,7 +17,7 @@ export { addCustomElementRegistration, removeCustomElementRegistration, validate
|
|
|
16
17
|
* `content/global/elements/` line. Falls back to 3 spaces when no
|
|
17
18
|
* reference line exists.
|
|
18
19
|
* - **Insertion point**: identified by existing lines matching the regex
|
|
19
|
-
* `^\s+content\/global\/elements\/([^.]+)
|
|
20
|
+
* `^\s+content\/global\/elements\/([^.]+)\.`. New entries are inserted
|
|
20
21
|
* in alphabetical order relative to these.
|
|
21
22
|
* - **Fallback**: if no `content/global/elements/` line exists (empty
|
|
22
23
|
* project), looks for any `content/global/` line and inserts after it.
|
|
@@ -41,7 +42,7 @@ export declare function addJarMnEntries(engineDir: string, tagName: string, file
|
|
|
41
42
|
* does not resolve at runtime, so the generated `--localized` component
|
|
42
43
|
* silently ships broken l10n.
|
|
43
44
|
*
|
|
44
|
-
* Degrades gracefully
|
|
45
|
+
* Degrades gracefully: if the locale jar.mn (e.g. `toolkit/locales/jar.mn`)
|
|
45
46
|
* does not exist, returns 0 rather than throwing, so a custom fork without a
|
|
46
47
|
* standard locales package can still apply a localized component.
|
|
47
48
|
*
|
|
@@ -58,13 +59,13 @@ export declare function addJarMnEntries(engineDir: string, tagName: string, file
|
|
|
58
59
|
export declare function addLocaleFtlJarMnEntry(engineDir: string, jarMnRelPath: string, tagName: string, chromeSubPath: string): Promise<number>;
|
|
59
60
|
/**
|
|
60
61
|
* Removes a locale jar.mn entry previously written by `addLocaleFtlJarMnEntry`.
|
|
61
|
-
* Idempotent
|
|
62
|
+
* Idempotent: if the entry is absent or the file is missing, nothing happens.
|
|
62
63
|
*/
|
|
63
64
|
export declare function removeLocaleFtlJarMnEntry(engineDir: string, jarMnRelPath: string, tagName: string, chromeSubPath: string): Promise<void>;
|
|
64
65
|
/**
|
|
65
66
|
* Removes all jar.mn entries for a given tag name.
|
|
66
67
|
*
|
|
67
|
-
* This operation is idempotent
|
|
68
|
+
* This operation is idempotent: if no entries exist or the file is missing,
|
|
68
69
|
* nothing happens.
|
|
69
70
|
*
|
|
70
71
|
* @param engineDir - Path to the Firefox engine source root
|
|
@@ -82,7 +83,7 @@ export interface StaleJarMnEntry {
|
|
|
82
83
|
}
|
|
83
84
|
/**
|
|
84
85
|
* Scans jar.mn for widget registration lines `(widgets/<tag>/<file>)` whose
|
|
85
|
-
* workspace source file no longer exists
|
|
86
|
+
* workspace source file no longer exists. A renamed component helper
|
|
86
87
|
* otherwise leaves the old line pointing at a deleted file and every build
|
|
87
88
|
* fails at packaging. Only tags in `managedTags` (furnace-managed custom
|
|
88
89
|
* components) are inspected, so upstream lines are never touched.
|
|
@@ -2,22 +2,31 @@
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { FurnaceError } from '../errors/furnace.js';
|
|
4
4
|
import { pathExists, readText, writeText } from '../utils/fs.js';
|
|
5
|
+
/**
|
|
6
|
+
* Returns the leading whitespace of the first line matching `pattern`, whose
|
|
7
|
+
* first capture group must be that indentation. `undefined` when no line
|
|
8
|
+
* matches, so callers can chain progressively looser patterns before falling
|
|
9
|
+
* back to a convention default.
|
|
10
|
+
*/
|
|
11
|
+
function detectIndent(lines, pattern) {
|
|
12
|
+
for (const line of lines) {
|
|
13
|
+
const match = pattern.exec(line);
|
|
14
|
+
if (match?.[1])
|
|
15
|
+
return match[1];
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
5
19
|
/**
|
|
6
20
|
* Detects the indentation used by existing `content/global/elements/` lines
|
|
7
21
|
* in jar.mn. Falls back to 3 spaces (the historical Firefox convention) when
|
|
8
22
|
* no reference line is found.
|
|
9
23
|
*/
|
|
10
24
|
function detectJarMnIndent(lines) {
|
|
11
|
-
|
|
12
|
-
const match = /^(\s+)content\/global\/elements\//.exec(line);
|
|
13
|
-
if (match?.[1]) {
|
|
14
|
-
return match[1];
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
return ' ';
|
|
25
|
+
return detectIndent(lines, /^(\s+)content\/global\/elements\//) ?? ' ';
|
|
18
26
|
}
|
|
19
27
|
// Re-export everything from the AST module so existing imports keep working
|
|
20
|
-
export { addCustomElementRegistration,
|
|
28
|
+
export { addCustomElementRegistration, validateCustomElementRegistration, } from './furnace-registration-ast.js';
|
|
29
|
+
export { removeCustomElementRegistration } from './furnace-registration-remove.js';
|
|
21
30
|
import { escapeRegex } from '../utils/regex.js';
|
|
22
31
|
import { JAR_MN } from './furnace-constants.js';
|
|
23
32
|
/**
|
|
@@ -37,7 +46,7 @@ import { JAR_MN } from './furnace-constants.js';
|
|
|
37
46
|
* `content/global/elements/` line. Falls back to 3 spaces when no
|
|
38
47
|
* reference line exists.
|
|
39
48
|
* - **Insertion point**: identified by existing lines matching the regex
|
|
40
|
-
* `^\s+content\/global\/elements\/([^.]+)
|
|
49
|
+
* `^\s+content\/global\/elements\/([^.]+)\.`. New entries are inserted
|
|
41
50
|
* in alphabetical order relative to these.
|
|
42
51
|
* - **Fallback**: if no `content/global/elements/` line exists (empty
|
|
43
52
|
* project), looks for any `content/global/` line and inserts after it.
|
|
@@ -72,10 +81,7 @@ export async function addJarMnEntries(engineDir, tagName, files) {
|
|
|
72
81
|
// Find insertion point among existing content/global/elements/ lines
|
|
73
82
|
const elementLinePattern = /^\s+content\/global\/elements\/([^.]+)\./;
|
|
74
83
|
let insertIndex = -1;
|
|
75
|
-
for (
|
|
76
|
-
const line = lines[i];
|
|
77
|
-
if (line === undefined)
|
|
78
|
-
continue;
|
|
84
|
+
for (const [i, line] of lines.entries()) {
|
|
79
85
|
const match = elementLinePattern.exec(line);
|
|
80
86
|
if (match) {
|
|
81
87
|
const existingTag = match[1] ?? '';
|
|
@@ -116,7 +122,7 @@ export async function addJarMnEntries(engineDir, tagName, files) {
|
|
|
116
122
|
* does not resolve at runtime, so the generated `--localized` component
|
|
117
123
|
* silently ships broken l10n.
|
|
118
124
|
*
|
|
119
|
-
* Degrades gracefully
|
|
125
|
+
* Degrades gracefully: if the locale jar.mn (e.g. `toolkit/locales/jar.mn`)
|
|
120
126
|
* does not exist, returns 0 rather than throwing, so a custom fork without a
|
|
121
127
|
* standard locales package can still apply a localized component.
|
|
122
128
|
*
|
|
@@ -148,10 +154,7 @@ export async function addLocaleFtlJarMnEntry(engineDir, jarMnRelPath, tagName, c
|
|
|
148
154
|
const newEntry = `${indent}locale/@AB_CD@/${chromeSubPath}/${ftlFile} (%${chromeSubPath}/${ftlFile})`;
|
|
149
155
|
const sectionPattern = new RegExp(`^(\\s+)locale\\/(?:@AB_CD@|[a-zA-Z-]+)\\/${escapedChrome}\\/([^.\\s]+)\\.ftl`);
|
|
150
156
|
let insertIndex = -1;
|
|
151
|
-
for (
|
|
152
|
-
const line = lines[i];
|
|
153
|
-
if (line === undefined)
|
|
154
|
-
continue;
|
|
157
|
+
for (const [i, line] of lines.entries()) {
|
|
155
158
|
const match = sectionPattern.exec(line);
|
|
156
159
|
if (match) {
|
|
157
160
|
const existingTag = match[2] ?? '';
|
|
@@ -174,23 +177,13 @@ export async function addLocaleFtlJarMnEntry(engineDir, jarMnRelPath, tagName, c
|
|
|
174
177
|
/** Detects locale jar.mn indentation by sampling an existing matching entry. */
|
|
175
178
|
function detectLocaleJarMnIndent(lines, chromeSubPath) {
|
|
176
179
|
const escapedChrome = escapeRegex(chromeSubPath);
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
if (match?.[1])
|
|
181
|
-
return match[1];
|
|
182
|
-
}
|
|
183
|
-
// Fall back to detecting any existing `locale/...` indent before giving up.
|
|
184
|
-
for (const line of lines) {
|
|
185
|
-
const match = /^(\s+)locale\//.exec(line);
|
|
186
|
-
if (match?.[1])
|
|
187
|
-
return match[1];
|
|
188
|
-
}
|
|
189
|
-
return ' ';
|
|
180
|
+
const exact = new RegExp(`^(\\s+)locale\\/(?:@AB_CD@|[a-zA-Z-]+)\\/${escapedChrome}\\/`);
|
|
181
|
+
// Fall back to any existing `locale/...` indent before giving up.
|
|
182
|
+
return detectIndent(lines, exact) ?? detectIndent(lines, /^(\s+)locale\//) ?? ' ';
|
|
190
183
|
}
|
|
191
184
|
/**
|
|
192
185
|
* Removes a locale jar.mn entry previously written by `addLocaleFtlJarMnEntry`.
|
|
193
|
-
* Idempotent
|
|
186
|
+
* Idempotent: if the entry is absent or the file is missing, nothing happens.
|
|
194
187
|
*/
|
|
195
188
|
export async function removeLocaleFtlJarMnEntry(engineDir, jarMnRelPath, tagName, chromeSubPath) {
|
|
196
189
|
const filePath = join(engineDir, jarMnRelPath);
|
|
@@ -208,7 +201,7 @@ export async function removeLocaleFtlJarMnEntry(engineDir, jarMnRelPath, tagName
|
|
|
208
201
|
/**
|
|
209
202
|
* Removes all jar.mn entries for a given tag name.
|
|
210
203
|
*
|
|
211
|
-
* This operation is idempotent
|
|
204
|
+
* This operation is idempotent: if no entries exist or the file is missing,
|
|
212
205
|
* nothing happens.
|
|
213
206
|
*
|
|
214
207
|
* @param engineDir - Path to the Firefox engine source root
|
|
@@ -221,9 +214,9 @@ export async function removeJarMnEntries(engineDir, tagName) {
|
|
|
221
214
|
}
|
|
222
215
|
let content = await readText(filePath);
|
|
223
216
|
const lines = content.split('\n');
|
|
224
|
-
// Match by the
|
|
217
|
+
// Match by the source mapping segment `(widgets/<tagName>/...)` so every
|
|
225
218
|
// line the component registered is removed regardless of the target
|
|
226
|
-
// basename
|
|
219
|
+
// basename. A helper `.mjs` whose name does not start with the tag (e.g.
|
|
227
220
|
// a renamed `foo-utils.mjs`) otherwise survives the remove pass and leaves
|
|
228
221
|
// a stale registration that breaks packaging. The legacy target-path match
|
|
229
222
|
// is kept as an OR for lines written before the source mapping existed.
|
|
@@ -239,7 +232,7 @@ export async function removeJarMnEntries(engineDir, tagName) {
|
|
|
239
232
|
const WIDGET_SOURCE_MAPPING_PATTERN = /\(widgets\/([^/)]+)\/([^)]+)\)/;
|
|
240
233
|
/**
|
|
241
234
|
* Scans jar.mn for widget registration lines `(widgets/<tag>/<file>)` whose
|
|
242
|
-
* workspace source file no longer exists
|
|
235
|
+
* workspace source file no longer exists. A renamed component helper
|
|
243
236
|
* otherwise leaves the old line pointing at a deleted file and every build
|
|
244
237
|
* fails at packaging. Only tags in `managedTags` (furnace-managed custom
|
|
245
238
|
* components) are inspected, so upstream lines are never touched.
|
|
@@ -16,7 +16,7 @@ export declare function recordCreatedDir(journal: RollbackJournal, dirPath: stri
|
|
|
16
16
|
/**
|
|
17
17
|
* Recursively snapshots every file under a directory tree so a later rollback
|
|
18
18
|
* can restore deleted files. Skips symlinks to avoid following them out of the
|
|
19
|
-
* tree. The directory itself is not recorded as "created"
|
|
19
|
+
* tree. The directory itself is not recorded as "created", so callers that
|
|
20
20
|
* intend to delete and restore the directory should record it explicitly.
|
|
21
21
|
*
|
|
22
22
|
* Safe to call on a missing path: it returns without recording anything.
|
|
@@ -20,7 +20,7 @@ export function recordCreatedDir(journal, dirPath) {
|
|
|
20
20
|
/**
|
|
21
21
|
* Recursively snapshots every file under a directory tree so a later rollback
|
|
22
22
|
* can restore deleted files. Skips symlinks to avoid following them out of the
|
|
23
|
-
* tree. The directory itself is not recorded as "created"
|
|
23
|
+
* tree. The directory itself is not recorded as "created", so callers that
|
|
24
24
|
* intend to delete and restore the directory should record it explicitly.
|
|
25
25
|
*
|
|
26
26
|
* Safe to call on a missing path: it returns without recording anything.
|
|
@@ -49,9 +49,9 @@ export async function snapshotFile(journal, filePath) {
|
|
|
49
49
|
// Journal keys are the paths rollback will later write back to, and the
|
|
50
50
|
// restore runs from whatever cwd the process happens to be in by then. A
|
|
51
51
|
// relative key would therefore restore somewhere other than where the
|
|
52
|
-
// snapshot was taken
|
|
53
|
-
// is watching. Every caller composes an absolute path already
|
|
54
|
-
// it that way.
|
|
52
|
+
// snapshot was taken, silently, and only on the failure path where nobody
|
|
53
|
+
// is watching. Every caller composes an absolute path already, and this
|
|
54
|
+
// keeps it that way.
|
|
55
55
|
assert(isAbsolute(filePath), () => `snapshot path is absolute (got "${filePath}")`);
|
|
56
56
|
if (journal.files.has(filePath)) {
|
|
57
57
|
return;
|
|
@@ -149,7 +149,7 @@ export async function restoreRollbackJournal(journal) {
|
|
|
149
149
|
// Directory removal is only safe once every file is back where it belongs:
|
|
150
150
|
// a created directory may hold a restored file, and removing it recursively
|
|
151
151
|
// would undo the restore we just performed. The throw above is what
|
|
152
|
-
// normally enforces this
|
|
152
|
+
// normally enforces this. The assertion names it so a future early-return
|
|
153
153
|
// or error-swallowing edit cannot quietly reach the rm loop with failures
|
|
154
154
|
// outstanding.
|
|
155
155
|
assert(errors.length === 0, 'all journal files restored before created directories are removed');
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
-
import { createHash } from 'node:crypto';
|
|
3
2
|
import { readdir } from 'node:fs/promises';
|
|
4
3
|
import { join } from 'node:path';
|
|
5
4
|
import { toError } from '../utils/errors.js';
|
|
6
5
|
import { pathExists, readText } from '../utils/fs.js';
|
|
6
|
+
import { sha256Hex } from '../utils/hash.js';
|
|
7
7
|
import { verbose, warn } from '../utils/logger.js';
|
|
8
8
|
import { asEstree, getNodeSource, parseScript, walkAST } from './ast-utils.js';
|
|
9
9
|
import { CUSTOM_ELEMENTS_JS, FTL_DIR, WIDGETS_DIR } from './furnace-constants.js';
|
|
@@ -48,7 +48,7 @@ export async function scanCustomElementsRegistrations(engineDir) {
|
|
|
48
48
|
return registrations;
|
|
49
49
|
}
|
|
50
50
|
const content = await readText(filePath);
|
|
51
|
-
const contentHash =
|
|
51
|
+
const contentHash = sha256Hex(content);
|
|
52
52
|
// Return cached result if file hasn't changed since last parse.
|
|
53
53
|
if (registrationCache && registrationCache.hash === contentHash) {
|
|
54
54
|
return new Map(registrationCache.registrations);
|
|
@@ -121,10 +121,7 @@ export async function scanCustomElementsRegistrations(engineDir) {
|
|
|
121
121
|
'Results may be incomplete — run "fireforge furnace validate" to verify registration consistency.');
|
|
122
122
|
verbose(`Scanner regex fallback activated due to parse error: ${reason}`);
|
|
123
123
|
const lines = content.split('\n');
|
|
124
|
-
for (
|
|
125
|
-
const line = lines[i];
|
|
126
|
-
if (line === undefined)
|
|
127
|
-
continue;
|
|
124
|
+
for (const [i, line] of lines.entries()) {
|
|
128
125
|
const callbackMatch = /setElementCreationCallback\(\s*"([^"]+)"/.exec(line);
|
|
129
126
|
if (!callbackMatch?.[1])
|
|
130
127
|
continue;
|
|
@@ -1,46 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Stale-furnace-source gate for `fireforge patch export` / `re-export`.
|
|
3
3
|
*
|
|
4
|
-
* Exports capture the
|
|
4
|
+
* Exports capture the deployed engine copies of furnace-managed files, not
|
|
5
5
|
* the `components/` sources. Editing a component source and re-exporting its
|
|
6
|
-
* owning patch
|
|
7
|
-
* exports the stale deployed copy
|
|
6
|
+
* owning patch without an intervening `furnace deploy`/`apply` silently
|
|
7
|
+
* exports the stale deployed copy: per-patch lint then flags the old line
|
|
8
8
|
* count and the patch body lags the source. This gate detects that sequence
|
|
9
9
|
* by comparing component source directories against the checksums recorded
|
|
10
|
-
* at the last apply (`FurnaceState.appliedChecksums`)
|
|
11
|
-
* `warnIfFurnaceStale` uses for run/watch
|
|
10
|
+
* at the last apply (`FurnaceState.appliedChecksums`), the same signal
|
|
11
|
+
* `warnIfFurnaceStale` uses for run/watch, and refuses the export unless
|
|
12
12
|
* the operator passes `--allow-stale-furnace`.
|
|
13
13
|
*
|
|
14
14
|
* Checksum-based on purpose: git checkouts and `furnace refresh` churn
|
|
15
15
|
* mtimes without content changes, so an mtime comparison would misfire.
|
|
16
16
|
*
|
|
17
17
|
* Probe failures (broken furnace config, missing state) degrade to a verbose
|
|
18
|
-
* log and an empty result
|
|
18
|
+
* log and an empty result. A broken furnace setup must never block
|
|
19
19
|
* non-furnace patch work.
|
|
20
20
|
*/
|
|
21
21
|
/** One furnace component whose source drifted from its deployed copy. */
|
|
22
22
|
export interface StaleFurnaceComponent {
|
|
23
23
|
/** Component name (furnace.json key). */
|
|
24
24
|
name: string;
|
|
25
|
-
/** Component flavor
|
|
25
|
+
/** Component flavor, which resolves the source directory root. */
|
|
26
26
|
type: 'custom' | 'override';
|
|
27
27
|
/** Engine-relative deployed prefix (`/`-terminated) the component owns. */
|
|
28
28
|
prefix: string;
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Returns the furnace components whose deployed engine copies the given
|
|
32
|
-
* files fall under
|
|
32
|
+
* files fall under and whose `components/` sources have changed since the
|
|
33
33
|
* last apply. Empty when furnace is not configured, never applied, or the
|
|
34
34
|
* probe fails.
|
|
35
35
|
*
|
|
36
36
|
* Files are attributed per component: the custom `targetPath` / override
|
|
37
|
-
* `basePath` prefixes, plus
|
|
38
|
-
* component
|
|
39
|
-
* FTL dir as a whole stays unclaimed
|
|
40
|
-
* components). `sharedFtl` bundles are
|
|
41
|
-
* prunes a dangling per-widget jar.mn line), so they have no deployed
|
|
42
|
-
* to go stale and get no candidate by design. The storybook stories
|
|
43
|
-
* is likewise skipped.
|
|
37
|
+
* `basePath` prefixes, plus, for a localized non-sharedFtl custom
|
|
38
|
+
* component, its exact deployed `<ftlDir>/<name>.ftl` file (the shared
|
|
39
|
+
* FTL dir as a whole stays unclaimed, because sibling files there belong
|
|
40
|
+
* to other components). `sharedFtl` bundles are not furnace-deployed (apply
|
|
41
|
+
* only prunes a dangling per-widget jar.mn line), so they have no deployed
|
|
42
|
+
* copy to go stale and get no candidate by design. The storybook stories
|
|
43
|
+
* prefix is likewise skipped.
|
|
44
44
|
*
|
|
45
45
|
* @param projectRoot - Project root directory
|
|
46
46
|
* @param files - Engine-relative paths the export will capture
|
|
@@ -49,7 +49,8 @@ export declare function findStaleFurnaceComponentsForFiles(projectRoot: string,
|
|
|
49
49
|
/**
|
|
50
50
|
* Gate helper for export/re-export: refuses (or, with `allow`, warns) when
|
|
51
51
|
* any exported file belongs to a furnace component whose source changed
|
|
52
|
-
* since the last apply
|
|
52
|
+
* since the last apply, where the export would capture the stale deployed
|
|
53
|
+
* copy.
|
|
53
54
|
*
|
|
54
55
|
* @param projectRoot - Project root directory
|
|
55
56
|
* @param files - Engine-relative paths the export will capture
|
|
@@ -2,21 +2,21 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Stale-furnace-source gate for `fireforge patch export` / `re-export`.
|
|
4
4
|
*
|
|
5
|
-
* Exports capture the
|
|
5
|
+
* Exports capture the deployed engine copies of furnace-managed files, not
|
|
6
6
|
* the `components/` sources. Editing a component source and re-exporting its
|
|
7
|
-
* owning patch
|
|
8
|
-
* exports the stale deployed copy
|
|
7
|
+
* owning patch without an intervening `furnace deploy`/`apply` silently
|
|
8
|
+
* exports the stale deployed copy: per-patch lint then flags the old line
|
|
9
9
|
* count and the patch body lags the source. This gate detects that sequence
|
|
10
10
|
* by comparing component source directories against the checksums recorded
|
|
11
|
-
* at the last apply (`FurnaceState.appliedChecksums`)
|
|
12
|
-
* `warnIfFurnaceStale` uses for run/watch
|
|
11
|
+
* at the last apply (`FurnaceState.appliedChecksums`), the same signal
|
|
12
|
+
* `warnIfFurnaceStale` uses for run/watch, and refuses the export unless
|
|
13
13
|
* the operator passes `--allow-stale-furnace`.
|
|
14
14
|
*
|
|
15
15
|
* Checksum-based on purpose: git checkouts and `furnace refresh` churn
|
|
16
16
|
* mtimes without content changes, so an mtime comparison would misfire.
|
|
17
17
|
*
|
|
18
18
|
* Probe failures (broken furnace config, missing state) degrade to a verbose
|
|
19
|
-
* log and an empty result
|
|
19
|
+
* log and an empty result. A broken furnace setup must never block
|
|
20
20
|
* non-furnace patch work.
|
|
21
21
|
*/
|
|
22
22
|
import { GeneralError } from '../errors/base.js';
|
|
@@ -28,18 +28,18 @@ import { furnaceConfigExists, getFurnacePaths, loadFurnaceConfig, loadFurnaceSta
|
|
|
28
28
|
import { resolveFtlDir } from './furnace-constants.js';
|
|
29
29
|
/**
|
|
30
30
|
* Returns the furnace components whose deployed engine copies the given
|
|
31
|
-
* files fall under
|
|
31
|
+
* files fall under and whose `components/` sources have changed since the
|
|
32
32
|
* last apply. Empty when furnace is not configured, never applied, or the
|
|
33
33
|
* probe fails.
|
|
34
34
|
*
|
|
35
35
|
* Files are attributed per component: the custom `targetPath` / override
|
|
36
|
-
* `basePath` prefixes, plus
|
|
37
|
-
* component
|
|
38
|
-
* FTL dir as a whole stays unclaimed
|
|
39
|
-
* components). `sharedFtl` bundles are
|
|
40
|
-
* prunes a dangling per-widget jar.mn line), so they have no deployed
|
|
41
|
-
* to go stale and get no candidate by design. The storybook stories
|
|
42
|
-
* is likewise skipped.
|
|
36
|
+
* `basePath` prefixes, plus, for a localized non-sharedFtl custom
|
|
37
|
+
* component, its exact deployed `<ftlDir>/<name>.ftl` file (the shared
|
|
38
|
+
* FTL dir as a whole stays unclaimed, because sibling files there belong
|
|
39
|
+
* to other components). `sharedFtl` bundles are not furnace-deployed (apply
|
|
40
|
+
* only prunes a dangling per-widget jar.mn line), so they have no deployed
|
|
41
|
+
* copy to go stale and get no candidate by design. The storybook stories
|
|
42
|
+
* prefix is likewise skipped.
|
|
43
43
|
*
|
|
44
44
|
* @param projectRoot - Project root directory
|
|
45
45
|
* @param files - Engine-relative paths the export will capture
|
|
@@ -97,7 +97,8 @@ export async function findStaleFurnaceComponentsForFiles(projectRoot, files) {
|
|
|
97
97
|
/**
|
|
98
98
|
* Gate helper for export/re-export: refuses (or, with `allow`, warns) when
|
|
99
99
|
* any exported file belongs to a furnace component whose source changed
|
|
100
|
-
* since the last apply
|
|
100
|
+
* since the last apply, where the export would capture the stale deployed
|
|
101
|
+
* copy.
|
|
101
102
|
*
|
|
102
103
|
* @param projectRoot - Project root directory
|
|
103
104
|
* @param files - Engine-relative paths the export will capture
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Furnace staleness advisory
|
|
2
|
+
* Furnace staleness advisory, shared between `fireforge run` and
|
|
3
3
|
* `fireforge watch`. Both commands launch the built browser without
|
|
4
4
|
* first running `furnace apply`, so this helper surfaces a warning when
|
|
5
5
|
* component files have drifted from the last-applied checksums and the
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
/**
|
|
12
12
|
* Emits a warning when any tracked override or custom component has
|
|
13
13
|
* changed on disk since the last apply. Safe to call from any build-time
|
|
14
|
-
* command that does not auto-apply
|
|
14
|
+
* command that does not auto-apply. A failure inside the probe is
|
|
15
15
|
* downgraded to a verbose log and the caller continues.
|
|
16
16
|
*/
|
|
17
17
|
export declare function warnIfFurnaceStale(projectRoot: string): Promise<void>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* Furnace staleness advisory
|
|
3
|
+
* Furnace staleness advisory, shared between `fireforge run` and
|
|
4
4
|
* `fireforge watch`. Both commands launch the built browser without
|
|
5
5
|
* first running `furnace apply`, so this helper surfaces a warning when
|
|
6
6
|
* component files have drifted from the last-applied checksums and the
|
|
@@ -16,7 +16,7 @@ import { furnaceConfigExists, getFurnacePaths, loadFurnaceConfig, loadFurnaceSta
|
|
|
16
16
|
/**
|
|
17
17
|
* Emits a warning when any tracked override or custom component has
|
|
18
18
|
* changed on disk since the last apply. Safe to call from any build-time
|
|
19
|
-
* command that does not auto-apply
|
|
19
|
+
* command that does not auto-apply. A failure inside the probe is
|
|
20
20
|
* downgraded to a verbose log and the caller continues.
|
|
21
21
|
*/
|
|
22
22
|
export async function warnIfFurnaceStale(projectRoot) {
|