@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
|
@@ -4,25 +4,25 @@
|
|
|
4
4
|
* There are exactly two sanctioned ways checksums land in
|
|
5
5
|
* furnace-state.json:
|
|
6
6
|
*
|
|
7
|
-
* 1. The
|
|
8
|
-
* replaces `appliedChecksums` wholesale
|
|
9
|
-
* covered every component.
|
|
10
|
-
* 2. The per-component
|
|
7
|
+
* 1. The batch path inside `applyAllComponents` (persistState: true), which
|
|
8
|
+
* replaces `appliedChecksums` wholesale. That is correct only when the
|
|
9
|
+
* run covered every component.
|
|
10
|
+
* 2. The per-component merge in this module, which rewrites only the
|
|
11
11
|
* `<type>/<name>/…` keys of the component that was applied.
|
|
12
12
|
*
|
|
13
|
-
* Every targeted (named) apply/deploy
|
|
13
|
+
* Every targeted (named) apply/deploy must use path 2 with
|
|
14
14
|
* `persistState: false`. Routing a named run through the batch path wipes
|
|
15
15
|
* every other component's checksum state: the batch loops filter to the
|
|
16
16
|
* named component, so the wholesale replace persists a state file containing
|
|
17
17
|
* only that component. Downstream, `diffDeletedFiles` and
|
|
18
18
|
* `findOrphanedEngineFiles` both key on `appliedChecksums`, so the wiped
|
|
19
|
-
* components' stale engine files become undetectable by apply
|
|
19
|
+
* components' stale engine files become undetectable by apply and by
|
|
20
20
|
* `furnace validate`.
|
|
21
21
|
*/
|
|
22
22
|
import { type ApplyAllComponentsResult } from './furnace-apply.js';
|
|
23
|
-
import { type
|
|
23
|
+
import { type FurnacePaths } from './furnace-config.js';
|
|
24
24
|
/**
|
|
25
|
-
* Counts applied entries that carry at least one
|
|
25
|
+
* Counts applied entries that carry at least one blocking step error
|
|
26
26
|
* (advisory step errors are warnings and never fail a run).
|
|
27
27
|
*/
|
|
28
28
|
export declare function getStepFailureCount(result: ApplyAllComponentsResult): number;
|
|
@@ -33,7 +33,7 @@ export declare function getStepFailureCount(result: ApplyAllComponentsResult): n
|
|
|
33
33
|
* Named runs are atomic: if any apply step fails, the rollback journal
|
|
34
34
|
* restores the engine to its pre-run state and this helper returns `false`
|
|
35
35
|
* so state is not touched. The conditions must stay in lock-step with the
|
|
36
|
-
* rollback trigger in `applyAllComponents
|
|
36
|
+
* rollback trigger in `applyAllComponents`: both read step errors, so a
|
|
37
37
|
* future refactor cannot drift them apart and accidentally persist partial
|
|
38
38
|
* state.
|
|
39
39
|
*/
|
|
@@ -43,7 +43,7 @@ export declare function shouldPersistSingleComponentState(result: ApplyAllCompon
|
|
|
43
43
|
*
|
|
44
44
|
* Guards against future refactors that might reorder or misroute the
|
|
45
45
|
* applied[] array: a named run persists state under a single component
|
|
46
|
-
* name, so the first applied entry
|
|
46
|
+
* name, so the first applied entry must be that component. Persisting a
|
|
47
47
|
* different component's checksums would cause the next status/apply run to
|
|
48
48
|
* mis-report health for both components involved.
|
|
49
49
|
*
|
|
@@ -55,7 +55,7 @@ export declare function getPersistableAppliedEntry(commandLabel: string, name: s
|
|
|
55
55
|
};
|
|
56
56
|
/**
|
|
57
57
|
* Persists checksum state for a successfully applied named component by
|
|
58
|
-
*
|
|
58
|
+
* merging its `<type>/<name>/…` keys into the existing state rather than
|
|
59
59
|
* replacing the whole map.
|
|
60
60
|
*
|
|
61
61
|
* @param projectRoot - Root directory of the project
|
|
@@ -65,4 +65,4 @@ export declare function getPersistableAppliedEntry(commandLabel: string, name: s
|
|
|
65
65
|
export declare function persistSingleComponentState(projectRoot: string, appliedEntry: {
|
|
66
66
|
name: string;
|
|
67
67
|
type: 'override' | 'custom';
|
|
68
|
-
}, furnacePaths:
|
|
68
|
+
}, furnacePaths: FurnacePaths): Promise<void>;
|
|
@@ -5,19 +5,19 @@
|
|
|
5
5
|
* There are exactly two sanctioned ways checksums land in
|
|
6
6
|
* furnace-state.json:
|
|
7
7
|
*
|
|
8
|
-
* 1. The
|
|
9
|
-
* replaces `appliedChecksums` wholesale
|
|
10
|
-
* covered every component.
|
|
11
|
-
* 2. The per-component
|
|
8
|
+
* 1. The batch path inside `applyAllComponents` (persistState: true), which
|
|
9
|
+
* replaces `appliedChecksums` wholesale. That is correct only when the
|
|
10
|
+
* run covered every component.
|
|
11
|
+
* 2. The per-component merge in this module, which rewrites only the
|
|
12
12
|
* `<type>/<name>/…` keys of the component that was applied.
|
|
13
13
|
*
|
|
14
|
-
* Every targeted (named) apply/deploy
|
|
14
|
+
* Every targeted (named) apply/deploy must use path 2 with
|
|
15
15
|
* `persistState: false`. Routing a named run through the batch path wipes
|
|
16
16
|
* every other component's checksum state: the batch loops filter to the
|
|
17
17
|
* named component, so the wholesale replace persists a state file containing
|
|
18
18
|
* only that component. Downstream, `diffDeletedFiles` and
|
|
19
19
|
* `findOrphanedEngineFiles` both key on `appliedChecksums`, so the wiped
|
|
20
|
-
* components' stale engine files become undetectable by apply
|
|
20
|
+
* components' stale engine files become undetectable by apply and by
|
|
21
21
|
* `furnace validate`.
|
|
22
22
|
*/
|
|
23
23
|
import { join } from 'node:path';
|
|
@@ -26,7 +26,7 @@ import { computeComponentChecksums, prefixChecksums, } from './furnace-apply.js'
|
|
|
26
26
|
import { updateFurnaceState } from './furnace-config.js';
|
|
27
27
|
import { countEntriesWithBlockingStepErrors } from './furnace-step-errors.js';
|
|
28
28
|
/**
|
|
29
|
-
* Counts applied entries that carry at least one
|
|
29
|
+
* Counts applied entries that carry at least one blocking step error
|
|
30
30
|
* (advisory step errors are warnings and never fail a run).
|
|
31
31
|
*/
|
|
32
32
|
export function getStepFailureCount(result) {
|
|
@@ -39,7 +39,7 @@ export function getStepFailureCount(result) {
|
|
|
39
39
|
* Named runs are atomic: if any apply step fails, the rollback journal
|
|
40
40
|
* restores the engine to its pre-run state and this helper returns `false`
|
|
41
41
|
* so state is not touched. The conditions must stay in lock-step with the
|
|
42
|
-
* rollback trigger in `applyAllComponents
|
|
42
|
+
* rollback trigger in `applyAllComponents`: both read step errors, so a
|
|
43
43
|
* future refactor cannot drift them apart and accidentally persist partial
|
|
44
44
|
* state.
|
|
45
45
|
*/
|
|
@@ -57,7 +57,7 @@ export function shouldPersistSingleComponentState(result, isDryRun) {
|
|
|
57
57
|
*
|
|
58
58
|
* Guards against future refactors that might reorder or misroute the
|
|
59
59
|
* applied[] array: a named run persists state under a single component
|
|
60
|
-
* name, so the first applied entry
|
|
60
|
+
* name, so the first applied entry must be that component. Persisting a
|
|
61
61
|
* different component's checksums would cause the next status/apply run to
|
|
62
62
|
* mis-report health for both components involved.
|
|
63
63
|
*
|
|
@@ -87,7 +87,7 @@ export function getPersistableAppliedEntry(commandLabel, name, appliedEntry) {
|
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
89
89
|
* Persists checksum state for a successfully applied named component by
|
|
90
|
-
*
|
|
90
|
+
* merging its `<type>/<name>/…` keys into the existing state rather than
|
|
91
91
|
* replacing the whole map.
|
|
92
92
|
*
|
|
93
93
|
* @param projectRoot - Root directory of the project
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared predicates over {@link StepError} lists.
|
|
3
3
|
*
|
|
4
|
-
* Step errors come in two severities:
|
|
5
|
-
* considered failed, triggers rollback and a non-zero exit) and
|
|
6
|
-
* (`advisory: true
|
|
7
|
-
* `.ftl` helpers whose contract is graceful degradation). Every
|
|
8
|
-
* decides rollback/failure must count only blocking errors
|
|
9
|
-
* should still surface advisory ones. This module is a leaf (types-only
|
|
4
|
+
* Step errors come in two severities: blocking (the default: the apply is
|
|
5
|
+
* considered failed, triggers rollback and a non-zero exit) and advisory
|
|
6
|
+
* (`advisory: true`, which is reported as a warning, never blocks, and is
|
|
7
|
+
* used by the `.ftl` helpers whose contract is graceful degradation). Every
|
|
8
|
+
* gate that decides rollback/failure must count only blocking errors, and
|
|
9
|
+
* every reporter should still surface advisory ones. This module is a leaf (types-only
|
|
10
10
|
* imports) so both `furnace-apply.ts` and its callers can share the
|
|
11
11
|
* predicates without import cycles.
|
|
12
12
|
*/
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Shared predicates over {@link StepError} lists.
|
|
4
4
|
*
|
|
5
|
-
* Step errors come in two severities:
|
|
6
|
-
* considered failed, triggers rollback and a non-zero exit) and
|
|
7
|
-
* (`advisory: true
|
|
8
|
-
* `.ftl` helpers whose contract is graceful degradation). Every
|
|
9
|
-
* decides rollback/failure must count only blocking errors
|
|
10
|
-
* should still surface advisory ones. This module is a leaf (types-only
|
|
5
|
+
* Step errors come in two severities: blocking (the default: the apply is
|
|
6
|
+
* considered failed, triggers rollback and a non-zero exit) and advisory
|
|
7
|
+
* (`advisory: true`, which is reported as a warning, never blocks, and is
|
|
8
|
+
* used by the `.ftl` helpers whose contract is graceful degradation). Every
|
|
9
|
+
* gate that decides rollback/failure must count only blocking errors, and
|
|
10
|
+
* every reporter should still surface advisory ones. This module is a leaf (types-only
|
|
11
11
|
* imports) so both `furnace-apply.ts` and its callers can share the
|
|
12
12
|
* predicates without import cycles.
|
|
13
13
|
*/
|
|
@@ -81,7 +81,7 @@ function hasPositiveTabindex(content) {
|
|
|
81
81
|
* Collects `[start, end)` spans of `<label>…</label>` elements whose content
|
|
82
82
|
* includes actual label text. Labels cannot nest per HTML, so the non-greedy
|
|
83
83
|
* inner match is sound. A span qualifies only when the inner content minus
|
|
84
|
-
* tags still contains non-whitespace
|
|
84
|
+
* tags still contains non-whitespace. An empty or tag-only wrapper provides
|
|
85
85
|
* no accessible name. A `${…}` Lit binding counts as label text: dynamic
|
|
86
86
|
* (usually localized) text is a legitimate accessible name.
|
|
87
87
|
*/
|
|
@@ -132,12 +132,12 @@ function hasTemplateKeyboardHandler(content) {
|
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
134
134
|
* Native HTML elements that dispatch `click` on Enter and Space via the
|
|
135
|
-
* platform. Attaching `@click` to these is
|
|
136
|
-
* the browser already handles the keyboard activation path
|
|
135
|
+
* platform. Attaching `@click` to these is not a keyboard-a11y bug, because
|
|
136
|
+
* the browser already handles the keyboard activation path. A duplicate
|
|
137
137
|
* `@keydown`/`@keypress` handler would usually double-fire the action.
|
|
138
138
|
*
|
|
139
|
-
* `<a>` is accepted only when an `href` attribute is present
|
|
140
|
-
* non-interactive and is treated as synthetic.
|
|
139
|
+
* `<a>` is accepted only when an `href` attribute is present. A bare `<a>`
|
|
140
|
+
* is non-interactive and is treated as synthetic.
|
|
141
141
|
*/
|
|
142
142
|
const NATIVE_CLICK_INTERACTIVE_TAGS = new Set([
|
|
143
143
|
'button',
|
|
@@ -178,7 +178,7 @@ function isKeyboardCoveredByComposition(customConfig) {
|
|
|
178
178
|
* *synthetic* interactive element (e.g. `<div @click>`), which lacks native
|
|
179
179
|
* keyboard activation and therefore needs an explicit key handler for
|
|
180
180
|
* Enter/Space. Returns false when every `@click` handler sits on a native
|
|
181
|
-
* interactive element
|
|
181
|
+
* interactive element. Those already fire `click` on keyboard activation.
|
|
182
182
|
*/
|
|
183
183
|
function hasTemplateClickOnSyntheticInteractive(content) {
|
|
184
184
|
const pattern = /@click\s*=\s*\$\{/g;
|
|
@@ -219,7 +219,7 @@ function isClickOnSyntheticInteractive(content, clickIndex) {
|
|
|
219
219
|
return true;
|
|
220
220
|
const tagName = tagMatch[1].toLowerCase();
|
|
221
221
|
if (tagName === 'a') {
|
|
222
|
-
// Bare <a> (no href) is non-interactive
|
|
222
|
+
// Bare <a> (no href) is non-interactive, so require a keyboard handler.
|
|
223
223
|
// Look forward from the tag open for the closing `>` and scan the
|
|
224
224
|
// attribute text in between for an href attribute.
|
|
225
225
|
const tagEnd = content.indexOf('>', tagOpenIndex);
|
|
@@ -236,20 +236,20 @@ const SYMBOL_ONLY_ASCII = '+-*=<>|/\\^~@#&!?%';
|
|
|
236
236
|
* Reports whether `text` is decoration (arrows, maths, emoji, bare
|
|
237
237
|
* punctuation) rather than user-facing prose that needs localizing.
|
|
238
238
|
*
|
|
239
|
-
* The letter/number/mark test comes first and is script-agnostic
|
|
239
|
+
* The letter/number/mark test comes first and is script-agnostic. A rule
|
|
240
240
|
* keyed on `code > 0xff` would classify every code point above U+00FF as a
|
|
241
241
|
* symbol, exempting all CJK, Cyrillic, Greek, Arabic, Hebrew, Devanagari and
|
|
242
|
-
* Thai text from a
|
|
242
|
+
* Thai text from a localization validator.
|
|
243
243
|
*
|
|
244
|
-
* Combining marks are
|
|
244
|
+
* Combining marks are not counted as text: the check is an
|
|
245
245
|
* `every()`, so a script's base letters already disqualify the string, and
|
|
246
246
|
* treating marks as text would flag emoji carrying a variation selector
|
|
247
|
-
* (U+FE0F is category Mn
|
|
247
|
+
* (U+FE0F is category Mn, and `⚙️` is U+2699 + U+FE0F).
|
|
248
248
|
*
|
|
249
|
-
* High code points that are not letters
|
|
249
|
+
* High code points that are not letters (emoji, arrows, CJK punctuation)
|
|
250
250
|
* stay exempt, which is the rule's intent.
|
|
251
251
|
*
|
|
252
|
-
* A handful of emoji are
|
|
252
|
+
* A handful of emoji are also Unicode letters, and the letter test alone
|
|
253
253
|
* gets them wrong: U+2139 (`ℹ`, the base of the common `ℹ️`) is category Ll,
|
|
254
254
|
* so `\p{L}` would classify an info badge as prose needing localization.
|
|
255
255
|
* Non-ASCII code points carrying `Emoji` are therefore read as symbols
|
|
@@ -335,7 +335,7 @@ function hasFlaggedTextInLitTemplates(content) {
|
|
|
335
335
|
return false;
|
|
336
336
|
}
|
|
337
337
|
function hasFlaggedTextInDomAssignment(content) {
|
|
338
|
-
// `<expr>.textContent = "abc"` and `<expr>.innerHTML = "abc"
|
|
338
|
+
// `<expr>.textContent = "abc"` and `<expr>.innerHTML = "abc"`: these are
|
|
339
339
|
// user-visible render paths. Template-literal RHS is excluded (usually
|
|
340
340
|
// dynamic), matching the `${` guard used elsewhere in this helper.
|
|
341
341
|
const assignPattern = /\.(?:textContent|innerHTML)\s*=\s*(["'])((?:\\.|(?!\1).)*)\1/g;
|
|
@@ -170,7 +170,7 @@ function hasCustomElementDefineCall(mjsContent) {
|
|
|
170
170
|
/**
|
|
171
171
|
* Detects whether the module's `customElements.define(...)` call includes a
|
|
172
172
|
* literal `extends:` option (third argument). That shape is the marker for
|
|
173
|
-
* a customized built-in element
|
|
173
|
+
* a customized built-in element: the class extends a specific
|
|
174
174
|
* `HTMLxxxElement` rather than the autonomous `MozLitElement` path.
|
|
175
175
|
*
|
|
176
176
|
* Firefox's own widgets use this pattern for toolkit anchors (e.g.
|
|
@@ -193,24 +193,24 @@ function hasCustomElementExtendsOption(mjsContent) {
|
|
|
193
193
|
*
|
|
194
194
|
* Two shapes are accepted:
|
|
195
195
|
*
|
|
196
|
-
* 1. Autonomous custom element: `class X extends MozLitElement
|
|
196
|
+
* 1. Autonomous custom element: `class X extends MozLitElement`, the
|
|
197
197
|
* default FireForge pattern for fork-authored components and most
|
|
198
198
|
* toolkit widgets.
|
|
199
199
|
* 2. Customized built-in: `class X extends HTML<Something>Element` paired
|
|
200
200
|
* with a `customElements.define(..., ..., { extends: "<tagname>" })`
|
|
201
201
|
* call. Firefox's `moz-support-link`, `moz-button-group` tabbing
|
|
202
|
-
* widgets, and a handful of other toolkit components use this form
|
|
202
|
+
* widgets, and a handful of other toolkit components use this form.
|
|
203
203
|
* `furnace override` of those components writes the original source
|
|
204
204
|
* verbatim and the validator must not reject them.
|
|
205
205
|
*
|
|
206
|
-
* A class that extends a plain `HTMLElement`
|
|
207
|
-
* is still rejected
|
|
206
|
+
* A class that extends a plain `HTMLElement` without an `extends:` option
|
|
207
|
+
* is still rejected. That is the legitimate `not-moz-lit-element` case
|
|
208
208
|
* the rule was originally designed to catch.
|
|
209
209
|
*/
|
|
210
210
|
function classExtendsMozLitElement(mjsContent) {
|
|
211
211
|
const hasClassDeclaration = /class\s+\w+\s+extends\s+/.test(mjsContent);
|
|
212
212
|
if (!hasClassDeclaration) {
|
|
213
|
-
// No class declaration
|
|
213
|
+
// No class declaration, so skip this check since the component may use a
|
|
214
214
|
// different pattern (e.g. function-based). Other validators will catch
|
|
215
215
|
// structural issues.
|
|
216
216
|
return true;
|
|
@@ -218,8 +218,8 @@ function classExtendsMozLitElement(mjsContent) {
|
|
|
218
218
|
if (/class\s+\w+\s+extends\s+MozLitElement\b/.test(mjsContent)) {
|
|
219
219
|
return true;
|
|
220
220
|
}
|
|
221
|
-
// Customized built-in: extend a specific HTMLxxxElement
|
|
222
|
-
// call carries an `extends:` option. Both halves are required
|
|
221
|
+
// Customized built-in: extend a specific HTMLxxxElement and the define
|
|
222
|
+
// call carries an `extends:` option. Both halves are required: a class
|
|
223
223
|
// that extends `HTMLAnchorElement` without the matching define option is
|
|
224
224
|
// almost certainly an author mistake, and a define call with `extends:`
|
|
225
225
|
// without a matching class is unreachable.
|
|
@@ -243,7 +243,7 @@ function collectCssVariableReferences(cssContent) {
|
|
|
243
243
|
return referencedVariables;
|
|
244
244
|
}
|
|
245
245
|
/**
|
|
246
|
-
* Collects CSS custom property *declarations
|
|
246
|
+
* Collects CSS custom property *declarations*, i.e. names appearing on the
|
|
247
247
|
* left-hand side of a `--name:` declaration. Used to auto-exempt
|
|
248
248
|
* component-local runtime variables from the token-prefix check: if the
|
|
249
249
|
* component both declares and consumes a variable in its own CSS file, it
|
|
@@ -44,10 +44,10 @@ export declare function withRegistrationValidationCache<T>(body: () => Promise<T
|
|
|
44
44
|
*
|
|
45
45
|
* Scan set is the union of (a) the configured `tokenHostDocuments` (or
|
|
46
46
|
* the upstream default when unset) and (b) any `browser/base/content/*.xhtml`
|
|
47
|
-
* document that references `tagName
|
|
47
|
+
* document that references `tagName`. The auto-detection path catches
|
|
48
48
|
* forks that mount components from a replacement chrome document without
|
|
49
49
|
* having configured `tokenHostDocuments`. The warning fires only when
|
|
50
|
-
*
|
|
50
|
+
* none of the documents in the final scan set link the tokens CSS.
|
|
51
51
|
*/
|
|
52
52
|
export declare function validateTokenLink(componentDir: string, tagName: string, root: string, tokenPrefix?: string, tokenHostDocuments?: string[]): Promise<ValidationIssue[]>;
|
|
53
53
|
/**
|
|
@@ -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 { warn } from '../utils/logger.js';
|
|
8
8
|
import { escapeRegex, stripJsComments } from '../utils/regex.js';
|
|
9
9
|
import { getProjectPaths, loadConfig } from './config.js';
|
|
@@ -94,7 +94,7 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
|
|
|
94
94
|
// Check target directory
|
|
95
95
|
const targetDir = join(engineDir, config.targetPath);
|
|
96
96
|
status.targetExists = await pathExists(targetDir);
|
|
97
|
-
// Compare files (sourceExists is guaranteed true
|
|
97
|
+
// Compare files (sourceExists is guaranteed true, we early-returned above)
|
|
98
98
|
if (status.targetExists) {
|
|
99
99
|
const entries = await readdir(componentDir, { withFileTypes: true });
|
|
100
100
|
for (const entry of entries) {
|
|
@@ -110,7 +110,7 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
|
|
|
110
110
|
continue;
|
|
111
111
|
}
|
|
112
112
|
// Deploy writes CSS-with-include-directives in fragment-expanded form,
|
|
113
|
-
// so the drift oracle must compare the *expanded* source
|
|
113
|
+
// so the drift oracle must compare the *expanded* source. Otherwise a
|
|
114
114
|
// freshly deployed component would read as permanently drifted, and a
|
|
115
115
|
// fragment edit would never read as drifted at all.
|
|
116
116
|
let srcContent = await readText(srcPath);
|
|
@@ -119,8 +119,8 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
|
|
|
119
119
|
srcContent = (await expandCssFragments(srcContent, furnacePaths.sharedDir)).expanded;
|
|
120
120
|
}
|
|
121
121
|
catch {
|
|
122
|
-
// Missing fragment: validate reports it as `missing-fragment
|
|
123
|
-
//
|
|
122
|
+
// Missing fragment: validate reports it as `missing-fragment`.
|
|
123
|
+
// For drift purposes fall back to the raw source so the compare
|
|
124
124
|
// still happens deterministically.
|
|
125
125
|
}
|
|
126
126
|
}
|
|
@@ -129,8 +129,8 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
|
|
|
129
129
|
// comparisons hashed raw bytes, so on a CRLF checkout `furnace status`
|
|
130
130
|
// and `furnace validate` reported drift for files apply had just
|
|
131
131
|
// decided were identical.
|
|
132
|
-
const srcHash =
|
|
133
|
-
const destHash =
|
|
132
|
+
const srcHash = sha256Hex(normalizeForChecksum(srcContent));
|
|
133
|
+
const destHash = sha256Hex(normalizeForChecksum(destContent));
|
|
134
134
|
if (srcHash !== destHash) {
|
|
135
135
|
status.driftedFiles.push(entry.name);
|
|
136
136
|
status.filesInSync = false;
|
|
@@ -155,10 +155,8 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
|
|
|
155
155
|
else {
|
|
156
156
|
const srcContent = await readText(ftlSrc);
|
|
157
157
|
const destContent = await readText(ftlDest);
|
|
158
|
-
const srcHash =
|
|
159
|
-
const destHash =
|
|
160
|
-
.update(normalizeForChecksum(destContent))
|
|
161
|
-
.digest('hex');
|
|
158
|
+
const srcHash = sha256Hex(normalizeForChecksum(srcContent));
|
|
159
|
+
const destHash = sha256Hex(normalizeForChecksum(destContent));
|
|
162
160
|
if (srcHash !== destHash) {
|
|
163
161
|
status.driftedFiles.push(ftlName);
|
|
164
162
|
status.filesInSync = false;
|
|
@@ -177,7 +175,7 @@ export async function checkRegistrationConsistency(root, name, config, ftlDir) {
|
|
|
177
175
|
const cePath = join(engineDir, CUSTOM_ELEMENTS_JS);
|
|
178
176
|
if (await pathExists(cePath)) {
|
|
179
177
|
const ceContent = await readText(cePath);
|
|
180
|
-
// Structure-aware check shared with the
|
|
178
|
+
// Structure-aware check shared with the add path. A bare substring
|
|
181
179
|
// test counted any mention of the tag (a leftover comment, an
|
|
182
180
|
// unrelated string) as "registered", masking genuinely missing
|
|
183
181
|
// registrations from both validate and the re-apply drift oracle.
|
|
@@ -269,7 +267,7 @@ const AUTO_DETECT_HOST_DIR = 'browser/base/content';
|
|
|
269
267
|
* This catches a fork that mounts a custom element from its own top-level
|
|
270
268
|
* chrome document (e.g. `mybrowser.xhtml`) without setting
|
|
271
269
|
* `tokenHostDocuments`: scanning only the stock `browser.xhtml` would miss
|
|
272
|
-
* the tokens CSS link in the
|
|
270
|
+
* the tokens CSS link in the actual host document and false-fire the
|
|
273
271
|
* warning.
|
|
274
272
|
*
|
|
275
273
|
* @param engineDir Absolute engine root.
|
|
@@ -282,7 +280,7 @@ const AUTO_DETECT_HOST_DIR = 'browser/base/content';
|
|
|
282
280
|
* `validateAllComponents` walks every component, and re-parsing
|
|
283
281
|
* `fireforge.json` plus re-scanning every `.xhtml` under the chrome-document
|
|
284
282
|
* directory per component is one config parse and one full directory read
|
|
285
|
-
*
|
|
283
|
+
* per component, for work that depends only on the project and the engine.
|
|
286
284
|
*
|
|
287
285
|
* Keyed by root/engine dir and cleared by
|
|
288
286
|
* {@link resetRegistrationValidationCaches} at the start of each run, so a
|
|
@@ -293,9 +291,9 @@ const chromeDocumentCache = new Map();
|
|
|
293
291
|
/**
|
|
294
292
|
* Whether a batch validation is in flight.
|
|
295
293
|
*
|
|
296
|
-
* The caches are consulted
|
|
294
|
+
* The caches are consulted only while this is set. Outside a batch (a direct
|
|
297
295
|
* `validateComponent` call from `furnace status`, from apply's consistency
|
|
298
|
-
* check, or from a test
|
|
296
|
+
* check, or from a test) every read goes to disk, so a caller that mutates
|
|
299
297
|
* the engine between calls can never be served a stale document.
|
|
300
298
|
*/
|
|
301
299
|
let batchInFlight = false;
|
|
@@ -358,7 +356,7 @@ async function loadChromeDocuments(engineDir) {
|
|
|
358
356
|
return documents;
|
|
359
357
|
}
|
|
360
358
|
async function autoDetectTokenHostDocuments(engineDir, tagName, already) {
|
|
361
|
-
// Reads the directory
|
|
359
|
+
// Reads the directory once per run rather than once per component: only the
|
|
362
360
|
// tag being searched for differs between components.
|
|
363
361
|
const documents = await loadChromeDocuments(engineDir);
|
|
364
362
|
const alreadySet = new Set(already);
|
|
@@ -379,10 +377,10 @@ async function autoDetectTokenHostDocuments(engineDir, tagName, already) {
|
|
|
379
377
|
*
|
|
380
378
|
* Scan set is the union of (a) the configured `tokenHostDocuments` (or
|
|
381
379
|
* the upstream default when unset) and (b) any `browser/base/content/*.xhtml`
|
|
382
|
-
* document that references `tagName
|
|
380
|
+
* document that references `tagName`. The auto-detection path catches
|
|
383
381
|
* forks that mount components from a replacement chrome document without
|
|
384
382
|
* having configured `tokenHostDocuments`. The warning fires only when
|
|
385
|
-
*
|
|
383
|
+
* none of the documents in the final scan set link the tokens CSS.
|
|
386
384
|
*/
|
|
387
385
|
export async function validateTokenLink(componentDir, tagName, root, tokenPrefix, tokenHostDocuments) {
|
|
388
386
|
const issues = [];
|
|
@@ -483,7 +481,7 @@ export async function runPostApplyConsistencyChecks(root, config, result, ftlDir
|
|
|
483
481
|
}
|
|
484
482
|
}
|
|
485
483
|
catch {
|
|
486
|
-
// Consistency check is best-effort
|
|
484
|
+
// Consistency check is best-effort. Failures here should not block apply
|
|
487
485
|
}
|
|
488
486
|
}
|
|
489
487
|
}
|
|
@@ -2,7 +2,7 @@ import type { ComponentType, CustomComponentConfig, ValidationIssue } from '../t
|
|
|
2
2
|
/**
|
|
3
3
|
* Returns true when file content carries unresolved three-way-merge
|
|
4
4
|
* conflict markers (as left behind by `furnace refresh`). Shared between
|
|
5
|
-
* the structure validator and `furnace sync`'s pre-apply gate
|
|
5
|
+
* the structure validator and `furnace sync`'s pre-apply gate. Both must
|
|
6
6
|
* agree on what "conflicted" means so a file that validate flags can never
|
|
7
7
|
* slip through sync into the engine.
|
|
8
8
|
*/
|
|
@@ -5,7 +5,7 @@ import { pathExists, readText } from '../utils/fs.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* Returns true when file content carries unresolved three-way-merge
|
|
7
7
|
* conflict markers (as left behind by `furnace refresh`). Shared between
|
|
8
|
-
* the structure validator and `furnace sync`'s pre-apply gate
|
|
8
|
+
* the structure validator and `furnace sync`'s pre-apply gate. Both must
|
|
9
9
|
* agree on what "conflicted" means so a file that validate flags can never
|
|
10
10
|
* slip through sync into the engine.
|
|
11
11
|
*/
|
|
@@ -37,7 +37,7 @@ export async function validateStructure(componentDir, tagName, type, customConfi
|
|
|
37
37
|
message: `Required file ${tagName}.mjs not found.`,
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
|
-
// .css should exist
|
|
40
|
+
// .css should exist, except for library components (base class + helpers,
|
|
41
41
|
// no element of their own), which render nothing and need no stylesheet.
|
|
42
42
|
if (!(await pathExists(cssPath)) && customConfig?.kind !== 'library') {
|
|
43
43
|
issues.push({
|
|
@@ -52,8 +52,8 @@ export async function validateStructure(componentDir, tagName, type, customConfi
|
|
|
52
52
|
// localization payload is empty, which is hard to spot in review.
|
|
53
53
|
//
|
|
54
54
|
// Components that declare `sharedFtl` participate in a pre-existing
|
|
55
|
-
// feature-scoped bundle, so there is no per-component .ftl to require
|
|
56
|
-
//
|
|
55
|
+
// feature-scoped bundle, so there is no per-component .ftl to require.
|
|
56
|
+
// The shared file is owned by whoever authored the feature bundle.
|
|
57
57
|
if (type === 'custom' && customConfig?.localized && !customConfig.sharedFtl) {
|
|
58
58
|
const ftlPath = join(componentDir, `${tagName}.ftl`);
|
|
59
59
|
if (!(await pathExists(ftlPath))) {
|
|
@@ -61,8 +61,8 @@ export async function validateComponent(componentDir, tagName, type, config, roo
|
|
|
61
61
|
if (root) {
|
|
62
62
|
issues.push(...(await validateTokenLink(componentDir, tagName, root, config?.tokenPrefix, config?.tokenHostDocuments)));
|
|
63
63
|
}
|
|
64
|
-
// CSS fragment checks: missing fragment files are structural errors
|
|
65
|
-
//
|
|
64
|
+
// CSS fragment checks: missing fragment files are structural errors.
|
|
65
|
+
// Stale deployed expansions are drift the next deploy refreshes.
|
|
66
66
|
if (type === 'custom') {
|
|
67
67
|
const furnacePaths = getFurnacePaths(root ?? join(componentDir, '..', '..', '..'));
|
|
68
68
|
const engineTargetDir = root && config?.custom[tagName]
|
|
@@ -81,7 +81,7 @@ export async function validateComponent(componentDir, tagName, type, config, roo
|
|
|
81
81
|
// When root is provided and this is a custom component with registration,
|
|
82
82
|
// also run registration pattern and jar.mn validation for this component.
|
|
83
83
|
// Skipped when an outer orchestrator (validateAllComponents) will run the
|
|
84
|
-
// aggregate versions itself
|
|
84
|
+
// aggregate versions itself. Otherwise the same issues are reported twice.
|
|
85
85
|
if (root && config && type === 'custom' && !options?.skipAggregateChecks) {
|
|
86
86
|
const customConfig = config.custom[tagName];
|
|
87
87
|
if (customConfig?.register) {
|
|
@@ -183,7 +183,7 @@ export async function validateAllComponents(root) {
|
|
|
183
183
|
continue;
|
|
184
184
|
}
|
|
185
185
|
// Pass root so that per-component token link validation runs.
|
|
186
|
-
// Skip registration/jar.mn checks inside validateComponent
|
|
186
|
+
// Skip registration/jar.mn checks inside validateComponent. The aggregate
|
|
187
187
|
// validators below run them exactly once across all components, which both
|
|
188
188
|
// surfaces cross-component issues and avoids double-counting.
|
|
189
189
|
const issues = await validateComponent(componentDir, name, 'custom', config, root, {
|
|
@@ -209,7 +209,7 @@ export async function validateAllComponents(root) {
|
|
|
209
209
|
// `furnace create --with-tests --xpcshell` scaffolds a test directory at
|
|
210
210
|
// `browser/base/content/test/<binary>-xpcshell/<name>/`. A leftover
|
|
211
211
|
// scaffold whose `<name>` is not in furnace.json is almost always the
|
|
212
|
-
// aftermath of an incomplete `furnace remove` or `rename
|
|
212
|
+
// aftermath of an incomplete `furnace remove` or `rename`. Flag it as an
|
|
213
213
|
// `orphan-xpcshell-scaffold` error so operators delete or re-create the
|
|
214
214
|
// scaffold instead of discovering the mismatch at test run time. A
|
|
215
215
|
// missing engine or scaffold parent directory degrades silently, so this
|
|
@@ -224,14 +224,14 @@ export async function validateAllComponents(root) {
|
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
226
|
catch {
|
|
227
|
-
// Validation degrades gracefully
|
|
227
|
+
// Validation degrades gracefully: the absence of an engine
|
|
228
228
|
// directory, permission denial reading the scaffold tree, or any
|
|
229
229
|
// other transient fs issue should never cascade into false
|
|
230
230
|
// "orphan" reports.
|
|
231
231
|
}
|
|
232
232
|
// jsconfig chrome-module paths drift: when `typecheckJsconfig` is
|
|
233
|
-
// configured, deploy maintains a paths mapping per deployed module file
|
|
234
|
-
//
|
|
233
|
+
// configured, deploy maintains a paths mapping per deployed module file.
|
|
234
|
+
// Missing or stale entries mean typed cross-module imports are silently
|
|
235
235
|
// degrading to `any` in the consumer's typecheck.
|
|
236
236
|
if (config.typecheckJsconfig) {
|
|
237
237
|
try {
|
|
@@ -256,7 +256,7 @@ export async function validateAllComponents(root) {
|
|
|
256
256
|
}
|
|
257
257
|
catch {
|
|
258
258
|
// Drift detection must not break validation when the jsconfig is
|
|
259
|
-
// missing or unparsable
|
|
259
|
+
// missing or unparsable. Deploy reports those cases with guidance.
|
|
260
260
|
}
|
|
261
261
|
}
|
|
262
262
|
return results;
|
|
@@ -5,19 +5,19 @@
|
|
|
5
5
|
* Overrides are forks of Firefox source files taken at a specific point in
|
|
6
6
|
* time. If Firefox moves forward and the override's `baseVersion` is not
|
|
7
7
|
* refreshed, the override may apply against a file whose upstream shape has
|
|
8
|
-
* changed
|
|
8
|
+
* changed, which is the single biggest silent failure mode for furnace.
|
|
9
9
|
*
|
|
10
10
|
* Deliberately pure and string-only: no I/O, and no parsing of Firefox
|
|
11
11
|
* version components. String equality is sufficient because `fireforge.json`
|
|
12
12
|
* stores a canonical version string (e.g. `"140.9.0esr"`) and overrides are
|
|
13
13
|
* created with exactly that string copied from
|
|
14
|
-
* `forgeConfig.firefox.version`. Any mismatch is worth surfacing
|
|
14
|
+
* `forgeConfig.firefox.version`. Any mismatch is worth surfacing: even
|
|
15
15
|
* "140.0" vs "140.9.0esr" is a real drift signal.
|
|
16
16
|
*
|
|
17
|
-
* The result
|
|
17
|
+
* The result gates apply/deploy: both warn and then fail without --force
|
|
18
18
|
* (see furnaceApplyCommand / furnaceDeployCommand), and `furnace sync`
|
|
19
19
|
* re-checks it after refresh before applying. Status reports drift alongside
|
|
20
|
-
* the component overview. Keep this doc in sync with the gates
|
|
20
|
+
* the component overview. Keep this doc in sync with the gates. It is not
|
|
21
21
|
* advisory.
|
|
22
22
|
*/
|
|
23
23
|
import type { FurnaceConfig } from '../types/furnace.js';
|
|
@@ -35,7 +35,7 @@ export interface OverrideVersionDrift {
|
|
|
35
35
|
/**
|
|
36
36
|
* Classifies how severe a version drift is by comparing the numeric
|
|
37
37
|
* components of the two version strings. Falls back to `'major'` when
|
|
38
|
-
* either version is unparseable
|
|
38
|
+
* either version is unparseable. This ensures that unusual version
|
|
39
39
|
* formats surface with the highest visibility rather than being silently
|
|
40
40
|
* downgraded.
|
|
41
41
|
*/
|
|
@@ -6,19 +6,19 @@
|
|
|
6
6
|
* Overrides are forks of Firefox source files taken at a specific point in
|
|
7
7
|
* time. If Firefox moves forward and the override's `baseVersion` is not
|
|
8
8
|
* refreshed, the override may apply against a file whose upstream shape has
|
|
9
|
-
* changed
|
|
9
|
+
* changed, which is the single biggest silent failure mode for furnace.
|
|
10
10
|
*
|
|
11
11
|
* Deliberately pure and string-only: no I/O, and no parsing of Firefox
|
|
12
12
|
* version components. String equality is sufficient because `fireforge.json`
|
|
13
13
|
* stores a canonical version string (e.g. `"140.9.0esr"`) and overrides are
|
|
14
14
|
* created with exactly that string copied from
|
|
15
|
-
* `forgeConfig.firefox.version`. Any mismatch is worth surfacing
|
|
15
|
+
* `forgeConfig.firefox.version`. Any mismatch is worth surfacing: even
|
|
16
16
|
* "140.0" vs "140.9.0esr" is a real drift signal.
|
|
17
17
|
*
|
|
18
|
-
* The result
|
|
18
|
+
* The result gates apply/deploy: both warn and then fail without --force
|
|
19
19
|
* (see furnaceApplyCommand / furnaceDeployCommand), and `furnace sync`
|
|
20
20
|
* re-checks it after refresh before applying. Status reports drift alongside
|
|
21
|
-
* the component overview. Keep this doc in sync with the gates
|
|
21
|
+
* the component overview. Keep this doc in sync with the gates. It is not
|
|
22
22
|
* advisory.
|
|
23
23
|
*/
|
|
24
24
|
/**
|
|
@@ -39,7 +39,7 @@ function parseVersionComponents(version) {
|
|
|
39
39
|
/**
|
|
40
40
|
* Classifies how severe a version drift is by comparing the numeric
|
|
41
41
|
* components of the two version strings. Falls back to `'major'` when
|
|
42
|
-
* either version is unparseable
|
|
42
|
+
* either version is unparseable. This ensures that unusual version
|
|
43
43
|
* formats surface with the highest visibility rather than being silently
|
|
44
44
|
* downgraded.
|
|
45
45
|
*/
|