@hominis/fireforge 0.46.0 → 0.46.2
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 +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- 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 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- 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 +2 -2
- 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 +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- 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 +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- 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 +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- 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 +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- 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 +15 -15
- 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 +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- 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 +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- 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 +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- 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 +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- 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 +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- 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 +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- 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 +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- 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 +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- 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 +3 -3
- 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 +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- 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 +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- 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 +13 -13
- 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 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- 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 +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- 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 +8 -8
- package/dist/src/core/build-audit.js +39 -37
- 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 +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- 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 +15 -16
- 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 +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- 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 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- 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 +9 -9
- 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 +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- 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 +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- 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 +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- 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 +21 -20
- package/dist/src/core/furnace-operation.js +36 -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.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- 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 +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- 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 +10 -10
- 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 +13 -13
- 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 +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- 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 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- 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 +14 -14
- 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 +11 -11
- 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 +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- 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 +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- 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 +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- 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 +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- 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 +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- 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 +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- 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 +27 -27
- 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 +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- 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-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- 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 +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- 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 +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- 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 +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- 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 +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- 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 -21
- package/dist/src/core/test-stale-check.js +29 -28
- 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/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +17 -9
- package/dist/src/core/token-dark-mode.js +41 -28
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- 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 +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- 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 +35 -33
- 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 +31 -31
- 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 +6 -6
- 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 +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- 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 +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- 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 +86 -85
- 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 +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- 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 +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- 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 +1 -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 +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- 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 +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- 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 +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -20,7 +20,7 @@ import { describePatchNameProblem, normalizePatchDisplayName, PATCH_CATEGORIES,
|
|
|
20
20
|
export async function runPatchLint(options) {
|
|
21
21
|
const { engineDir, filesAffected, diffContent, config, skipLint, patchQueueCtx, ignoreChecks, patchTier, } = options;
|
|
22
22
|
// Compute the tier decision independently of the lint pipeline so it can
|
|
23
|
-
// be surfaced even when the rule body emitted no issues
|
|
23
|
+
// be surfaced even when the rule body emitted no issues. A branding patch
|
|
24
24
|
// under the soft threshold still benefits from operators knowing which
|
|
25
25
|
// tier governed the run. The same helper is reused inside `lintPatchSize`,
|
|
26
26
|
// so the surfaced tier and the tier that actually drove the thresholds
|
|
@@ -100,8 +100,8 @@ export function reportPatchLintOutcome(issues, skipLint) {
|
|
|
100
100
|
*/
|
|
101
101
|
export async function promptExportPatchMetadata(options, isInteractive, commandName, config) {
|
|
102
102
|
const categories = config !== undefined ? getPatchPolicyCategories(config) : [...PATCH_CATEGORIES];
|
|
103
|
-
// A filename-shaped `--name foo.patch` must not die on the dot rule
|
|
104
|
-
// strip the extension before validation
|
|
103
|
+
// A filename-shaped `--name foo.patch` must not die on the dot rule, so
|
|
104
|
+
// strip the extension before validation and the one-step flow works for
|
|
105
105
|
// both name shapes.
|
|
106
106
|
let patchName = options.name?.trim().replace(/\.patch$/i, '');
|
|
107
107
|
if (patchName) {
|
|
@@ -158,7 +158,7 @@ export async function promptExportPatchMetadata(options, isInteractive, commandN
|
|
|
158
158
|
description = descResult;
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
|
-
// The filename slug pipeline strips redundant category prefixes
|
|
161
|
+
// The filename slug pipeline strips redundant category prefixes. The
|
|
162
162
|
// manifest display name must agree, or every `export --name ui-foo`
|
|
163
163
|
// needs a follow-up `patch rename` to satisfy bare-slug naming policy.
|
|
164
164
|
const normalized = normalizePatchDisplayName(patchName, category);
|
|
@@ -208,14 +208,14 @@ export async function confirmSupersedePatches(patchesDir, filesAffected, superse
|
|
|
208
208
|
* Detects new files missing license headers and offers to add them.
|
|
209
209
|
*
|
|
210
210
|
* In interactive mode the user is prompted before any files are modified. In
|
|
211
|
-
* non-interactive mode the function is a no-op
|
|
211
|
+
* non-interactive mode the function is a no-op. The existing lint error
|
|
212
212
|
* blocks the export instead.
|
|
213
213
|
*
|
|
214
214
|
* @param engineDir - Absolute path to engine directory
|
|
215
215
|
* @param diffContent - Current unified diff
|
|
216
216
|
* @param config - Project configuration
|
|
217
217
|
* @param isInteractive - Whether interactive prompts are available
|
|
218
|
-
* @param dryRun - When true, only
|
|
218
|
+
* @param dryRun - When true, only report missing headers, never prompt or
|
|
219
219
|
* write. Dry-run must stay read-only: without this flag an interactive
|
|
220
220
|
* `export --dry-run` prompts (default Yes), writes license headers into
|
|
221
221
|
* engine/ files, and then closes with "no changes made".
|
|
@@ -293,7 +293,7 @@ export async function autoFixLicenseHeaders(engineDir, diffContent, config, isIn
|
|
|
293
293
|
*
|
|
294
294
|
* Returns an empty map when no overlap exists. Used by the overlap gate in
|
|
295
295
|
* `export` and `export-all` to refuse a default-mode export that would
|
|
296
|
-
* silently create cross-patch ownership conflicts
|
|
296
|
+
* silently create cross-patch ownership conflicts, the same class of
|
|
297
297
|
* conflict `verify` immediately fails with.
|
|
298
298
|
*/
|
|
299
299
|
export function findPartialOwnershipOverlap(manifest, filesAffected, excludeFilenames) {
|
|
@@ -315,16 +315,16 @@ export function findPartialOwnershipOverlap(manifest, filesAffected, excludeFile
|
|
|
315
315
|
/**
|
|
316
316
|
* Gate that refuses the default export path when the new patch would
|
|
317
317
|
* silently claim files already tracked by other non-superseded patches.
|
|
318
|
-
* `findAllPatchesForFiles` catches the full-coverage supersede case
|
|
319
|
-
* fills the gap for
|
|
318
|
+
* `findAllPatchesForFiles` catches the full-coverage supersede case. This
|
|
319
|
+
* fills the gap for partial overlap: two patches both claiming e.g.
|
|
320
320
|
* `browser/themes/shared/jar.inc.mn` after a second export with `--before`.
|
|
321
321
|
*
|
|
322
322
|
* Proceeds silently when there is no overlap, or when the caller passed
|
|
323
323
|
* `--allow-overlap`. In interactive mode the caller is prompted to
|
|
324
324
|
* acknowledge the overlap (the proper fix path is `re-export --files` to
|
|
325
325
|
* repartition ownership, so the prompt surfaces that pointer). In
|
|
326
|
-
* non-interactive mode it throws
|
|
327
|
-
* fall out of sync with verify.
|
|
326
|
+
* non-interactive mode it throws, since failing fast beats letting the
|
|
327
|
+
* queue fall out of sync with verify.
|
|
328
328
|
*/
|
|
329
329
|
export async function guardOwnershipOverlap(args) {
|
|
330
330
|
const { patchesDir, filesAffected, supersedingFilenames, allowOverlap, isInteractive, s } = args;
|
|
@@ -364,7 +364,7 @@ export async function guardOwnershipOverlap(args) {
|
|
|
364
364
|
* order: the supersede confirmation, then the cross-patch ownership overlap
|
|
365
365
|
* guard. The overlap guard receives the filenames of the patches the export
|
|
366
366
|
* would fully supersede so it does not flag a file claimed by a patch that
|
|
367
|
-
* is about to be removed. Catching only
|
|
367
|
+
* is about to be removed. Catching only full-coverage supersedes leaves a
|
|
368
368
|
* second export targeting a shared file creating a queue where two patches
|
|
369
369
|
* both claim it and `verify` fails immediately.
|
|
370
370
|
*
|
|
@@ -375,7 +375,7 @@ export async function guardOwnershipOverlap(args) {
|
|
|
375
375
|
* @param args.allowOverlap - The command's `--allow-overlap` flag
|
|
376
376
|
* @param args.isInteractive - Whether prompting the operator is possible
|
|
377
377
|
* @param args.s - Active spinner, stopped before any prompt
|
|
378
|
-
* @returns `true` when both gates passed
|
|
378
|
+
* @returns `true` when both gates passed, `false` when the operator declined
|
|
379
379
|
* (the caller returns without committing)
|
|
380
380
|
*/
|
|
381
381
|
export async function runSupersedeAndOverlapGates(args) {
|
|
@@ -88,11 +88,11 @@ async function collectExportFiles(paths, files) {
|
|
|
88
88
|
return { files: [...collectedFiles].sort(), fromDirectory };
|
|
89
89
|
}
|
|
90
90
|
/**
|
|
91
|
-
* Auto-excludes directory-derived files already owned by
|
|
91
|
+
* Auto-excludes directory-derived files already owned by other patches.
|
|
92
92
|
*
|
|
93
93
|
* A directory export otherwise plans files owned by earlier patches into the
|
|
94
94
|
* new patch, and the duplicate-new-file-creation refusal surfaces only at
|
|
95
|
-
* placement lint, suggesting `--force-unsafe
|
|
95
|
+
* placement lint, suggesting `--force-unsafe`, the wrong tool for "leave
|
|
96
96
|
* that file with its owner". Explicitly named files are never excluded (the
|
|
97
97
|
* overlap gates still confront the operator with those). Prints one notice
|
|
98
98
|
* per exclusion.
|
|
@@ -217,7 +217,7 @@ async function prepareExport(projectRoot, files, options) {
|
|
|
217
217
|
}
|
|
218
218
|
const config = await loadConfig(projectRoot);
|
|
219
219
|
const isInteractive = stdioIsInteractive();
|
|
220
|
-
// Auto-fix missing license headers on new files (interactive only
|
|
220
|
+
// Auto-fix missing license headers on new files (interactive only, and
|
|
221
221
|
// report-only under --dry-run so the preview never mutates engine/)
|
|
222
222
|
const headersAdded = await autoFixLicenseHeaders(paths.engine, diff, config, isInteractive, options.dryRun ?? false);
|
|
223
223
|
if (headersAdded) {
|
|
@@ -269,7 +269,7 @@ export async function exportCommand(projectRoot, files, options) {
|
|
|
269
269
|
patchTier: options.tier,
|
|
270
270
|
});
|
|
271
271
|
// Resolve placement (if any flag was given). Placement is mutually
|
|
272
|
-
// exclusive with supersede
|
|
272
|
+
// exclusive with supersede, because the semantics overlap confusingly.
|
|
273
273
|
let placementPlan = null;
|
|
274
274
|
if (placementFlagCount > 0) {
|
|
275
275
|
const gated = await gatePlacementPlan({
|
|
@@ -29,7 +29,7 @@ async function snapshotWatchedChecksums(watchDirs) {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
catch {
|
|
32
|
-
// Directory may have been removed between iterations
|
|
32
|
+
// Directory may have been removed between iterations, so ignore.
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
return combined;
|
|
@@ -46,7 +46,7 @@ function checksumMapsEqual(a, b) {
|
|
|
46
46
|
/**
|
|
47
47
|
* Builds a watch-loop apply-failure message tailored to the error class so
|
|
48
48
|
* transient filesystem errors (EACCES, ENOSPC, lock timeout) look different
|
|
49
|
-
* from genuine apply-level failures
|
|
49
|
+
* from genuine apply-level failures. The previous generic "Apply failed: ..."
|
|
50
50
|
* collapsed all causes into one string and made diagnosis difficult.
|
|
51
51
|
*/
|
|
52
52
|
function classifyWatchApplyError(err) {
|
|
@@ -74,8 +74,8 @@ function classifyWatchApplyError(err) {
|
|
|
74
74
|
}
|
|
75
75
|
async function runWatchLoop(projectRoot) {
|
|
76
76
|
const furnacePaths = getFurnacePaths(projectRoot);
|
|
77
|
-
// Both categories are eligible targets. The set is fixed
|
|
78
|
-
// varies over time
|
|
77
|
+
// Both categories are eligible targets. The set is fixed. Only existence
|
|
78
|
+
// varies over time: a component dir created after watch started (the user
|
|
79
79
|
// running `furnace create` in another terminal) must be picked up without
|
|
80
80
|
// restarting watch. A one-shot `pathExists` check at startup captures only
|
|
81
81
|
// the dirs that existed then, leaving any later creation invisible.
|
|
@@ -115,8 +115,8 @@ async function runWatchLoop(projectRoot) {
|
|
|
115
115
|
// for changes that are already reflected in the engine.
|
|
116
116
|
lastChecksums = await snapshotWatchedChecksums(watchDirs);
|
|
117
117
|
}
|
|
118
|
-
// Another change arrived while we were applying
|
|
119
|
-
// is not silently absorbed into the post-apply checksum bump.
|
|
118
|
+
// Another change arrived while we were applying, so run again and the
|
|
119
|
+
// edit is not silently absorbed into the post-apply checksum bump.
|
|
120
120
|
if (pendingChange) {
|
|
121
121
|
pendingChange = false;
|
|
122
122
|
await runApplyCycle();
|
|
@@ -124,7 +124,7 @@ async function runWatchLoop(projectRoot) {
|
|
|
124
124
|
};
|
|
125
125
|
const triggerApply = () => {
|
|
126
126
|
if (applyInFlight) {
|
|
127
|
-
// An apply is already running
|
|
127
|
+
// An apply is already running. Record the change so runApplyCycle
|
|
128
128
|
// re-runs after it completes. Do not schedule a new debounce: the
|
|
129
129
|
// in-flight apply will observe this flag when it finishes.
|
|
130
130
|
pendingChange = true;
|
|
@@ -136,7 +136,7 @@ async function runWatchLoop(projectRoot) {
|
|
|
136
136
|
debounceTimer = null;
|
|
137
137
|
if (applyInFlight) {
|
|
138
138
|
// Race with a change that started its own apply between the debounce
|
|
139
|
-
// scheduling and the timer firing. Record the pending change
|
|
139
|
+
// scheduling and the timer firing. Record the pending change. The
|
|
140
140
|
// in-flight apply will pick it up.
|
|
141
141
|
pendingChange = true;
|
|
142
142
|
return;
|
|
@@ -188,7 +188,7 @@ async function runWatchLoop(projectRoot) {
|
|
|
188
188
|
}
|
|
189
189
|
return added;
|
|
190
190
|
};
|
|
191
|
-
// Register signal-driven cleanup
|
|
191
|
+
// Register signal-driven cleanup before creating watchers so there is no
|
|
192
192
|
// race window where a SIGINT could arrive after watchers exist but before
|
|
193
193
|
// cleanup handlers are registered.
|
|
194
194
|
const cleanup = () => {
|
|
@@ -229,7 +229,7 @@ async function runWatchLoop(projectRoot) {
|
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
catch {
|
|
232
|
-
// Best effort
|
|
232
|
+
// Best effort: errors here are transient filesystem issues.
|
|
233
233
|
}
|
|
234
234
|
})();
|
|
235
235
|
}, WATCH_POLL_INTERVAL_MS);
|
|
@@ -277,14 +277,14 @@ export async function furnaceApplyCommand(projectRoot, name, options = {}) {
|
|
|
277
277
|
}
|
|
278
278
|
const applySpinner = dryRun ? undefined : spinner('Applying components to engine...');
|
|
279
279
|
const result = await runFurnaceMutation(projectRoot, 'apply-rollback', async (ctx) => {
|
|
280
|
-
// `persistState: false` for a
|
|
281
|
-
//
|
|
282
|
-
//
|
|
283
|
-
//
|
|
284
|
-
//
|
|
280
|
+
// `persistState: false` for a named apply matters: the batch persist
|
|
281
|
+
// path replaces `appliedChecksums` wholesale with only this run's
|
|
282
|
+
// entries, and the batch loops filter to the named component, so
|
|
283
|
+
// routing a named apply through it persists a state file containing
|
|
284
|
+
// only that component and wipes every other component's checksums.
|
|
285
285
|
// Orphan detection and deleted-file undeploy both key on that state,
|
|
286
286
|
// so the wiped components' stale engine files become invisible to
|
|
287
|
-
// apply
|
|
287
|
+
// apply and to `furnace validate`. Named apply merges per-component
|
|
288
288
|
// state below, exactly like `furnace deploy <name>`.
|
|
289
289
|
const applyResult = await applyAllComponents(projectRoot, dryRun, {
|
|
290
290
|
operationContext: ctx,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge furnace chrome-doc remove <name>`
|
|
3
|
+
* `fireforge furnace chrome-doc remove <name>` removes the files and
|
|
4
4
|
* registrations created by `furnace chrome-doc create`.
|
|
5
5
|
*/
|
|
6
6
|
import { readdir } from 'node:fs/promises';
|
|
@@ -41,21 +41,21 @@
|
|
|
41
41
|
*/
|
|
42
42
|
export declare function generateChromeDocXhtml(name: string, withTitlebar: boolean, license: string): string;
|
|
43
43
|
/**
|
|
44
|
-
* browser.xhtml-like scaffold for the document that ships as the fork's
|
|
45
|
-
*
|
|
44
|
+
* browser.xhtml-like scaffold for the document that ships as the fork's main
|
|
45
|
+
* browser window.
|
|
46
46
|
*
|
|
47
47
|
* The generic dialog-shaped `<window>` scaffold is wrong for the
|
|
48
48
|
* `tokenHostDocuments[0]` / BROWSER_CHROME_URL target: platform C++ reads
|
|
49
|
-
* the root element
|
|
49
|
+
* the root element before any script runs, and expects the `browser.xhtml`
|
|
50
50
|
* shape:
|
|
51
51
|
*
|
|
52
|
-
* - `<html id="main-window">` root (not `<window id="<name>-window">`)
|
|
52
|
+
* - `<html id="main-window">` root (not `<window id="<name>-window">`):
|
|
53
53
|
* upstream code from nsXULWindow sizing to session restore looks up
|
|
54
|
-
* `main-window` by id
|
|
54
|
+
* `main-window` by id.
|
|
55
55
|
* - `windowtype="navigator:browser"`, `chromehidden=""` and the geometry
|
|
56
|
-
* `persist` allowlist declared as
|
|
56
|
+
* `persist` allowlist declared as root attributes so the platform's
|
|
57
57
|
* pre-script pass (window tracking, XULStore geometry, chrome flags) sees
|
|
58
|
-
* them
|
|
58
|
+
* them.
|
|
59
59
|
* - the same head/bootstrap wiring (customElements.js, per-doc subscript,
|
|
60
60
|
* CSS + Fluent links) and `data-furnace-chrome-doc` sentinel as the
|
|
61
61
|
* generic scaffold, so jar.mn registration and the platform-module guard
|
|
@@ -89,7 +89,7 @@ export declare function generateChromeDocJs(name: string, licenseHeader: string)
|
|
|
89
89
|
* the platform window controls that `global.css` applies by default.
|
|
90
90
|
*/
|
|
91
91
|
export declare function generateChromeDocCss(name: string, withTitlebar: boolean, licenseHeader: string): string;
|
|
92
|
-
/** Fluent stub
|
|
92
|
+
/** Fluent stub with one placeholder message keyed to the window title. */
|
|
93
93
|
export declare function generateChromeDocFtl(name: string, licenseHeader: string): string;
|
|
94
94
|
/**
|
|
95
95
|
* Single-line jar.mn entry that registers an xhtml + js pair under
|
|
@@ -110,7 +110,7 @@ export declare function jarMnEntriesForChromeDoc(name: string): string[];
|
|
|
110
110
|
* The source path is `../shared/<name>-chrome.css` because `jar.inc.mn` is
|
|
111
111
|
* included from each theme-specific manifest (`browser/themes/osx/jar.mn`,
|
|
112
112
|
* `.../linux/`, `.../windows/`), and every existing entry in those manifests
|
|
113
|
-
* resolves paths relative to the
|
|
113
|
+
* resolves paths relative to the including manifest's directory. A bare
|
|
114
114
|
* `(shared/…)` path resolves to
|
|
115
115
|
* `obj-.../browser/themes/osx/shared/<name>-chrome.css`, which does not
|
|
116
116
|
* exist.
|
|
@@ -120,7 +120,7 @@ export declare function jarIncMnEntryForChromeDoc(name: string): string;
|
|
|
120
120
|
* locales/jar.mn entry that registers the `.ftl` under the browser locale
|
|
121
121
|
* bundle. The source path is resolved by mach-locale-jar relative to the
|
|
122
122
|
* per-locale root (e.g. `engine/browser/locales/en-US/`), and the FTL file
|
|
123
|
-
* is scaffolded at `browser/${name}.ftl` under that root
|
|
123
|
+
* is scaffolded at `browser/${name}.ftl` under that root. The `%` prefix
|
|
124
124
|
* means "per-locale content" and the `browser/` subdirectory matches where
|
|
125
125
|
* the scaffolder writes. A bare `(%${name}.ftl)` points at
|
|
126
126
|
* `en-US/${name}.ftl` and breaks the first post-scaffold build with
|
|
@@ -132,11 +132,11 @@ export declare function localeJarMnEntryForChromeDoc(name: string): string;
|
|
|
132
132
|
* wildcard rooted at `%browser/` whose pattern would already pick up a
|
|
133
133
|
* scaffolded `browser/<name>.ftl` file. Recognises:
|
|
134
134
|
*
|
|
135
|
-
* - `(%browser/**\/*.ftl)
|
|
136
|
-
* - `(%browser/*.ftl)
|
|
135
|
+
* - `(%browser/**\/*.ftl)`: recursive (the upstream shape).
|
|
136
|
+
* - `(%browser/*.ftl)`: flat.
|
|
137
137
|
*
|
|
138
138
|
* Forks that have migrated entirely to `[localization]` wildcards typically
|
|
139
|
-
* keep no per-file `locale/...` entries for FTL at all
|
|
139
|
+
* keep no per-file `locale/...` entries for FTL at all. Appending one
|
|
140
140
|
* there is dead weight at best, and an outright build break when the fork
|
|
141
141
|
* has also dropped the `% locale browser …` registration. The chrome-doc
|
|
142
142
|
* scaffolder consults this predicate before its locales/jar.mn append and
|
|
@@ -146,7 +146,7 @@ export declare function localeJarMnEntryForChromeDoc(name: string): string;
|
|
|
146
146
|
* Conservative by design: only wildcards rooted at `%browser/` count, and
|
|
147
147
|
* a `(%browser/foo.ftl)`-style explicit reference (no `*`) is not treated
|
|
148
148
|
* as a capture. A fork with a narrower wildcard (e.g. `(%browser/about/*.ftl)`)
|
|
149
|
-
* is correctly
|
|
149
|
+
* is correctly not captured by this predicate, because that wildcard would
|
|
150
150
|
* not pick up the top-level `browser/<name>.ftl` the scaffold writes.
|
|
151
151
|
*/
|
|
152
152
|
export declare function localesFtlWildcardCapturesScaffoldedName(jarMnContents: string): boolean;
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* Sentinel attribute emitted on every `furnace chrome-doc create`-scaffolded
|
|
13
13
|
* root element. Platform modules (`DevToolsStartup`, `PageActions`,
|
|
14
14
|
* `SessionStore`, `DownloadsButton`, …) that observe
|
|
15
|
-
* `browser-delayed-startup-finished` and walk
|
|
15
|
+
* `browser-delayed-startup-finished` and walk into the window assume the
|
|
16
16
|
* `browser.xhtml` DOM and throw on anything else. A fork-authored patch
|
|
17
17
|
* to such a module can use `hasAttribute(...)` against this sentinel as
|
|
18
18
|
* a cheap, fork-neutral guard to skip the walk on a custom chrome doc.
|
|
@@ -54,8 +54,8 @@ const FURNACE_CHROME_DOC_SENTINEL = 'data-furnace-chrome-doc';
|
|
|
54
54
|
* the README "Platform module compatibility" section for the pattern.
|
|
55
55
|
*/
|
|
56
56
|
export function generateChromeDocXhtml(name, withTitlebar, license) {
|
|
57
|
-
// navigator:browser minimum set. Carrying every attribute together
|
|
58
|
-
//
|
|
57
|
+
// navigator:browser minimum set. Carrying every attribute together, not
|
|
58
|
+
// just `windowtype`, lets a fork that uses the scaffold output
|
|
59
59
|
// verbatim launch as a real main window: `customtitlebar` opts into the
|
|
60
60
|
// platform-native title bar handling that pairs with the buttonbox
|
|
61
61
|
// markup below, the explicit width/height avoid the OS-minimum first
|
|
@@ -99,21 +99,21 @@ export function generateChromeDocXhtml(name, withTitlebar, license) {
|
|
|
99
99
|
`;
|
|
100
100
|
}
|
|
101
101
|
/**
|
|
102
|
-
* browser.xhtml-like scaffold for the document that ships as the fork's
|
|
103
|
-
*
|
|
102
|
+
* browser.xhtml-like scaffold for the document that ships as the fork's main
|
|
103
|
+
* browser window.
|
|
104
104
|
*
|
|
105
105
|
* The generic dialog-shaped `<window>` scaffold is wrong for the
|
|
106
106
|
* `tokenHostDocuments[0]` / BROWSER_CHROME_URL target: platform C++ reads
|
|
107
|
-
* the root element
|
|
107
|
+
* the root element before any script runs, and expects the `browser.xhtml`
|
|
108
108
|
* shape:
|
|
109
109
|
*
|
|
110
|
-
* - `<html id="main-window">` root (not `<window id="<name>-window">`)
|
|
110
|
+
* - `<html id="main-window">` root (not `<window id="<name>-window">`):
|
|
111
111
|
* upstream code from nsXULWindow sizing to session restore looks up
|
|
112
|
-
* `main-window` by id
|
|
112
|
+
* `main-window` by id.
|
|
113
113
|
* - `windowtype="navigator:browser"`, `chromehidden=""` and the geometry
|
|
114
|
-
* `persist` allowlist declared as
|
|
114
|
+
* `persist` allowlist declared as root attributes so the platform's
|
|
115
115
|
* pre-script pass (window tracking, XULStore geometry, chrome flags) sees
|
|
116
|
-
* them
|
|
116
|
+
* them.
|
|
117
117
|
* - the same head/bootstrap wiring (customElements.js, per-doc subscript,
|
|
118
118
|
* CSS + Fluent links) and `data-furnace-chrome-doc` sentinel as the
|
|
119
119
|
* generic scaffold, so jar.mn registration and the platform-module guard
|
|
@@ -252,7 +252,7 @@ export function generateChromeDocCss(name, withTitlebar, licenseHeader) {
|
|
|
252
252
|
}${titlebarOverrides}
|
|
253
253
|
`;
|
|
254
254
|
}
|
|
255
|
-
/** Fluent stub
|
|
255
|
+
/** Fluent stub with one placeholder message keyed to the window title. */
|
|
256
256
|
export function generateChromeDocFtl(name, licenseHeader) {
|
|
257
257
|
return `${licenseHeader}
|
|
258
258
|
|
|
@@ -283,7 +283,7 @@ export function jarMnEntriesForChromeDoc(name) {
|
|
|
283
283
|
* The source path is `../shared/<name>-chrome.css` because `jar.inc.mn` is
|
|
284
284
|
* included from each theme-specific manifest (`browser/themes/osx/jar.mn`,
|
|
285
285
|
* `.../linux/`, `.../windows/`), and every existing entry in those manifests
|
|
286
|
-
* resolves paths relative to the
|
|
286
|
+
* resolves paths relative to the including manifest's directory. A bare
|
|
287
287
|
* `(shared/…)` path resolves to
|
|
288
288
|
* `obj-.../browser/themes/osx/shared/<name>-chrome.css`, which does not
|
|
289
289
|
* exist.
|
|
@@ -295,7 +295,7 @@ export function jarIncMnEntryForChromeDoc(name) {
|
|
|
295
295
|
* locales/jar.mn entry that registers the `.ftl` under the browser locale
|
|
296
296
|
* bundle. The source path is resolved by mach-locale-jar relative to the
|
|
297
297
|
* per-locale root (e.g. `engine/browser/locales/en-US/`), and the FTL file
|
|
298
|
-
* is scaffolded at `browser/${name}.ftl` under that root
|
|
298
|
+
* is scaffolded at `browser/${name}.ftl` under that root. The `%` prefix
|
|
299
299
|
* means "per-locale content" and the `browser/` subdirectory matches where
|
|
300
300
|
* the scaffolder writes. A bare `(%${name}.ftl)` points at
|
|
301
301
|
* `en-US/${name}.ftl` and breaks the first post-scaffold build with
|
|
@@ -309,11 +309,11 @@ export function localeJarMnEntryForChromeDoc(name) {
|
|
|
309
309
|
* wildcard rooted at `%browser/` whose pattern would already pick up a
|
|
310
310
|
* scaffolded `browser/<name>.ftl` file. Recognises:
|
|
311
311
|
*
|
|
312
|
-
* - `(%browser/**\/*.ftl)
|
|
313
|
-
* - `(%browser/*.ftl)
|
|
312
|
+
* - `(%browser/**\/*.ftl)`: recursive (the upstream shape).
|
|
313
|
+
* - `(%browser/*.ftl)`: flat.
|
|
314
314
|
*
|
|
315
315
|
* Forks that have migrated entirely to `[localization]` wildcards typically
|
|
316
|
-
* keep no per-file `locale/...` entries for FTL at all
|
|
316
|
+
* keep no per-file `locale/...` entries for FTL at all. Appending one
|
|
317
317
|
* there is dead weight at best, and an outright build break when the fork
|
|
318
318
|
* has also dropped the `% locale browser …` registration. The chrome-doc
|
|
319
319
|
* scaffolder consults this predicate before its locales/jar.mn append and
|
|
@@ -323,7 +323,7 @@ export function localeJarMnEntryForChromeDoc(name) {
|
|
|
323
323
|
* Conservative by design: only wildcards rooted at `%browser/` count, and
|
|
324
324
|
* a `(%browser/foo.ftl)`-style explicit reference (no `*`) is not treated
|
|
325
325
|
* as a capture. A fork with a narrower wildcard (e.g. `(%browser/about/*.ftl)`)
|
|
326
|
-
* is correctly
|
|
326
|
+
* is correctly not captured by this predicate, because that wildcard would
|
|
327
327
|
* not pick up the top-level `browser/<name>.ftl` the scaffold writes.
|
|
328
328
|
*/
|
|
329
329
|
export function localesFtlWildcardCapturesScaffoldedName(jarMnContents) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Returns the canonical xpcshell test basename for a chrome doc packaging
|
|
3
|
-
* check (`test_<name>_packaging.js`). Hyphens in `<name>` are preserved
|
|
3
|
+
* check (`test_<name>_packaging.js`). Hyphens in `<name>` are preserved:
|
|
4
4
|
* xpcshell permits them in file basenames even though the derived task
|
|
5
5
|
* function names replace them with underscores.
|
|
6
6
|
*/
|
|
@@ -16,7 +16,7 @@ export declare function generateChromeDocPackagingTest(name: string, header: str
|
|
|
16
16
|
/**
|
|
17
17
|
* Emits the `xpcshell.toml` manifest for the packaging test directory.
|
|
18
18
|
* Sets `firefox-appdir = "browser"` so XCurProcD resolves to the browser
|
|
19
|
-
* subdir rather than the generic gecko runtime dir
|
|
19
|
+
* subdir rather than the generic gecko runtime dir. Without that, the
|
|
20
20
|
* path probe walks the wrong tree on every fork whose app directory is
|
|
21
21
|
* not the default.
|
|
22
22
|
*/
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* - xpcshell's `chrome://browser/*` URI registration lags what the real
|
|
11
11
|
* browser loads even with `firefox-appdir = "browser"` set, so
|
|
12
12
|
* `NetUtil.asyncFetch("chrome://browser/content/<name>.xhtml")` can fail
|
|
13
|
-
* with `NS_ERROR_FILE_NOT_FOUND` against a file that
|
|
13
|
+
* with `NS_ERROR_FILE_NOT_FOUND` against a file that is correctly
|
|
14
14
|
* packaged.
|
|
15
15
|
* - Browser-chrome mochitests require a `tabbrowser`, which a
|
|
16
16
|
* fork-authored chrome doc that replaces `browser.xhtml` deliberately
|
|
@@ -23,13 +23,13 @@
|
|
|
23
23
|
* is stable across platforms at
|
|
24
24
|
* `<AppDir>/chrome/browser/content/browser/<name>.xhtml` on an unpacked tree
|
|
25
25
|
* (the default for `mach build` without `MOZ_CHROME_MULTILOCALE` / omnijar).
|
|
26
|
-
* A tree that packs omni.ja would need a different probe
|
|
26
|
+
* A tree that packs omni.ja would need a different probe. The scaffold notes
|
|
27
27
|
* that out-of-scope case explicitly rather than silently producing a test
|
|
28
28
|
* that fails on packed builds.
|
|
29
29
|
*/
|
|
30
30
|
/**
|
|
31
31
|
* Returns the canonical xpcshell test basename for a chrome doc packaging
|
|
32
|
-
* check (`test_<name>_packaging.js`). Hyphens in `<name>` are preserved
|
|
32
|
+
* check (`test_<name>_packaging.js`). Hyphens in `<name>` are preserved:
|
|
33
33
|
* xpcshell permits them in file basenames even though the derived task
|
|
34
34
|
* function names replace them with underscores.
|
|
35
35
|
*/
|
|
@@ -132,7 +132,7 @@ add_task(async function test_${taskSuffix}_files_packaged() {
|
|
|
132
132
|
/**
|
|
133
133
|
* Emits the `xpcshell.toml` manifest for the packaging test directory.
|
|
134
134
|
* Sets `firefox-appdir = "browser"` so XCurProcD resolves to the browser
|
|
135
|
-
* subdir rather than the generic gecko runtime dir
|
|
135
|
+
* subdir rather than the generic gecko runtime dir. Without that, the
|
|
136
136
|
* path probe walks the wrong tree on every fork whose app directory is
|
|
137
137
|
* not the default.
|
|
138
138
|
*/
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge furnace chrome-doc create <name>`
|
|
2
|
+
* `fireforge furnace chrome-doc create <name>` scaffolds a top-level
|
|
3
3
|
* chrome document (xhtml + js + css + ftl + jar.mn registrations).
|
|
4
4
|
*
|
|
5
5
|
* `furnace create` covers custom elements under `toolkit/content/widgets/`,
|
|
6
|
-
* but top-level chrome documents
|
|
7
|
-
* a fork adds alongside or instead of `browser.xhtml`
|
|
6
|
+
* but top-level chrome documents (the `mybrowser.xhtml`-class entry points
|
|
7
|
+
* a fork adds alongside or instead of `browser.xhtml`) are otherwise
|
|
8
8
|
* hand-authored with error-prone jar.mn + jar.inc.mn + locales/jar.mn glue.
|
|
9
9
|
* The `*` preprocessor flag, the macOS titlebar-button carve-out, the
|
|
10
10
|
* startup-topic observer, and the Fluent linkage each have silent-break
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* This command writes the four source files and appends three jar.mn entries
|
|
14
14
|
* under a rollback journal identical in shape to `furnace create`. A SIGINT
|
|
15
|
-
* mid-scaffold restores every touched file
|
|
15
|
+
* mid-scaffold restores every touched file. A successful run leaves the tree
|
|
16
16
|
* ready for `fireforge build`.
|
|
17
17
|
*/
|
|
18
18
|
/** Options for `furnace chrome-doc create`. */
|
|
@@ -28,16 +28,16 @@ export interface FurnaceChromeDocCreateOptions {
|
|
|
28
28
|
* Scaffold an xpcshell packaging-verification test alongside the chrome
|
|
29
29
|
* document. The generated test probes `XCurProcD/chrome/browser/...` on
|
|
30
30
|
* disk rather than going through `chrome://` URI resolution, which
|
|
31
|
-
* bypasses xpcshell's limited browser-chrome manifest set
|
|
31
|
+
* bypasses xpcshell's limited browser-chrome manifest set, where
|
|
32
32
|
* `NetUtil.asyncFetch` returns `NS_ERROR_FILE_NOT_FOUND` against a file
|
|
33
|
-
* that
|
|
33
|
+
* that is packaged. Registration in `XPCSHELL_TESTS_MANIFESTS` is left to
|
|
34
34
|
* the operator because the owning moz.build depends on the fork's layout.
|
|
35
35
|
*/
|
|
36
36
|
withTests?: boolean;
|
|
37
37
|
/** Print the scaffold plan without writing files. */
|
|
38
38
|
dryRun?: boolean;
|
|
39
39
|
/**
|
|
40
|
-
* Emit the browser.xhtml-like
|
|
40
|
+
* Emit the browser.xhtml-like main-window skeleton (`<html
|
|
41
41
|
* id="main-window">` with the `windowtype`/`chromehidden`/`persist`
|
|
42
42
|
* root attributes platform C++ reads before scripts run) instead of
|
|
43
43
|
* the generic dialog-shaped `<window>` document. Use for the document
|
|
@@ -49,7 +49,7 @@ export interface FurnaceChromeDocCreateOptions {
|
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
51
|
* Validates a chrome-doc name. Lowercase ASCII, optional hyphens, no
|
|
52
|
-
* leading digit
|
|
52
|
+
* leading digit. The name is used verbatim in CSS selectors, jar.mn
|
|
53
53
|
* entries, FTL keys, and file basenames, so anything outside that
|
|
54
54
|
* character set would break at least one downstream consumer.
|
|
55
55
|
* @param name Chrome-doc name (file basename without extension).
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge furnace chrome-doc create <name>`
|
|
3
|
+
* `fireforge furnace chrome-doc create <name>` scaffolds a top-level
|
|
4
4
|
* chrome document (xhtml + js + css + ftl + jar.mn registrations).
|
|
5
5
|
*
|
|
6
6
|
* `furnace create` covers custom elements under `toolkit/content/widgets/`,
|
|
7
|
-
* but top-level chrome documents
|
|
8
|
-
* a fork adds alongside or instead of `browser.xhtml`
|
|
7
|
+
* but top-level chrome documents (the `mybrowser.xhtml`-class entry points
|
|
8
|
+
* a fork adds alongside or instead of `browser.xhtml`) are otherwise
|
|
9
9
|
* hand-authored with error-prone jar.mn + jar.inc.mn + locales/jar.mn glue.
|
|
10
10
|
* The `*` preprocessor flag, the macOS titlebar-button carve-out, the
|
|
11
11
|
* startup-topic observer, and the Fluent linkage each have silent-break
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* This command writes the four source files and appends three jar.mn entries
|
|
15
15
|
* under a rollback journal identical in shape to `furnace create`. A SIGINT
|
|
16
|
-
* mid-scaffold restores every touched file
|
|
16
|
+
* mid-scaffold restores every touched file. A successful run leaves the tree
|
|
17
17
|
* ready for `fireforge build`.
|
|
18
18
|
*/
|
|
19
19
|
import { join } from 'node:path';
|
|
@@ -33,7 +33,7 @@ import { chromeDocPackagingTestFileName, generateChromeDocPackagingManifest, gen
|
|
|
33
33
|
const CHROME_DOC_NAME_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
34
34
|
/**
|
|
35
35
|
* Validates a chrome-doc name. Lowercase ASCII, optional hyphens, no
|
|
36
|
-
* leading digit
|
|
36
|
+
* leading digit. The name is used verbatim in CSS selectors, jar.mn
|
|
37
37
|
* entries, FTL keys, and file basenames, so anything outside that
|
|
38
38
|
* character set would break at least one downstream consumer.
|
|
39
39
|
* @param name Chrome-doc name (file basename without extension).
|
|
@@ -154,8 +154,8 @@ function renderChromeDocCreateDryRun(name, plan) {
|
|
|
154
154
|
*/
|
|
155
155
|
async function appendJarEntryIfAbsent(filePath, entry, journal) {
|
|
156
156
|
if (!(await pathExists(filePath))) {
|
|
157
|
-
// Target jar.mn doesn't exist in this tree layout. We do
|
|
158
|
-
//
|
|
157
|
+
// Target jar.mn doesn't exist in this tree layout. We do not create it:
|
|
158
|
+
// a fork that moved the jar file needs the operator to choose a
|
|
159
159
|
// placement. The command surfaces this as a FurnaceError so the user
|
|
160
160
|
// can investigate rather than silently writing to a non-canonical path.
|
|
161
161
|
throw new FurnaceError(`Required jar file ${filePath} does not exist; cannot register chrome-doc entry. Check that the fork's engine layout matches the expected browser/ and locales/ tree.`);
|
|
@@ -177,7 +177,7 @@ async function performChromeDocMutations(args) {
|
|
|
177
177
|
const journal = createRollbackJournal();
|
|
178
178
|
args.operationContext.registerJournal(journal);
|
|
179
179
|
// XHTML uses an inline XML comment since getLicenseHeader has no XML
|
|
180
|
-
// style
|
|
180
|
+
// style. The SPDX convention is a single-line comment at the top.
|
|
181
181
|
const jsHeader = getLicenseHeader(args.license, 'js');
|
|
182
182
|
const cssHeader = getLicenseHeader(args.license, 'css');
|
|
183
183
|
const ftlHeader = getLicenseHeader(args.license, 'hash');
|
|
@@ -213,7 +213,7 @@ async function performChromeDocMutations(args) {
|
|
|
213
213
|
await snapshotFile(journal, ftlPath);
|
|
214
214
|
await writeText(ftlPath, generateChromeDocFtl(args.name, ftlHeader));
|
|
215
215
|
written.push(`browser/locales/en-US/browser/${args.name}.ftl`);
|
|
216
|
-
// jar.mn registrations
|
|
216
|
+
// jar.mn registrations: XHTML + JS go through the `*` preprocessor
|
|
217
217
|
// for brand substitution, CSS goes through jar.inc.mn, FTL through
|
|
218
218
|
// the locale jar.
|
|
219
219
|
const jarMnPath = join(args.engineDir, 'browser/base/jar.mn');
|
|
@@ -226,12 +226,12 @@ async function performChromeDocMutations(args) {
|
|
|
226
226
|
written.push('browser/themes/shared/jar.inc.mn');
|
|
227
227
|
const localeJarMnPath = join(args.engineDir, 'browser/locales/jar.mn');
|
|
228
228
|
// Forks that have migrated to a `[localization] (%browser/**/*.ftl)`
|
|
229
|
-
// wildcard already pick up the scaffolded FTL automatically
|
|
230
|
-
// a per-file `locale/...` entry on top is at best dead weight
|
|
231
|
-
// worst a build error when the fork has dropped the
|
|
232
|
-
// registration the per-file entry depends on. The
|
|
233
|
-
//
|
|
234
|
-
// count as a capture.
|
|
229
|
+
// wildcard already pick up the scaffolded FTL automatically, so
|
|
230
|
+
// appending a per-file `locale/...` entry on top is at best dead weight
|
|
231
|
+
// and at worst a build error when the fork has dropped the
|
|
232
|
+
// `% locale browser` registration the per-file entry depends on. The
|
|
233
|
+
// wildcard predicate is narrow on purpose: only `%browser/`-rooted globs
|
|
234
|
+
// ending in `*.ftl` count as a capture.
|
|
235
235
|
if (await pathExists(localeJarMnPath)) {
|
|
236
236
|
const existingLocaleJar = await readText(localeJarMnPath);
|
|
237
237
|
if (localesFtlWildcardCapturesScaffoldedName(existingLocaleJar)) {
|
|
@@ -298,12 +298,12 @@ export async function furnaceChromeDocCreateCommand(projectRoot, name, options =
|
|
|
298
298
|
});
|
|
299
299
|
const browserWindow = options.browserWindow ?? false;
|
|
300
300
|
// The browser-window skeleton always carries its own titlebar markup and
|
|
301
|
-
// chrome attributes
|
|
301
|
+
// chrome attributes. --no-titlebar only applies to the generic scaffold.
|
|
302
302
|
const withTitlebar = browserWindow ? true : (options.titlebar ?? true);
|
|
303
303
|
const withTests = options.withTests ?? false;
|
|
304
304
|
// Hint: when the scaffolded document is the configured token-host document
|
|
305
305
|
// (the fork's main browser window), the generic dialog-shaped scaffold is
|
|
306
|
-
// almost certainly wrong
|
|
306
|
+
// almost certainly wrong: correct jar.mn registrations, wrong document
|
|
307
307
|
// body.
|
|
308
308
|
if (!browserWindow && (await furnaceConfigExists(projectRoot))) {
|
|
309
309
|
try {
|
|
@@ -317,7 +317,7 @@ export async function furnaceChromeDocCreateCommand(projectRoot, name, options =
|
|
|
317
317
|
}
|
|
318
318
|
}
|
|
319
319
|
catch {
|
|
320
|
-
// A broken furnace.json must not block chrome-doc scaffolding
|
|
320
|
+
// A broken furnace.json must not block chrome-doc scaffolding. The
|
|
321
321
|
// hint is best-effort.
|
|
322
322
|
}
|
|
323
323
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Browser-chrome test scaffolding for `furnace create --with-tests`,
|
|
3
3
|
* including the `--test-dir` redirect and collision safety (existing
|
|
4
|
-
* manifests are appended to
|
|
4
|
+
* manifests are appended to, and head.js and test implementations are never
|
|
5
5
|
* overwritten). Split out of `create.ts` to keep that command file within
|
|
6
6
|
* the per-file line budget.
|
|
7
7
|
*/
|