@hominis/fireforge 0.43.1 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +126 -0
- package/README.md +10 -1
- package/dist/bin/fireforge.d.ts +4 -9
- package/dist/bin/fireforge.js +42 -40
- package/dist/build-info.json +4 -4
- package/dist/src/cli.js +74 -8
- package/dist/src/commands/bootstrap.js +17 -20
- package/dist/src/commands/build.js +25 -32
- package/dist/src/commands/config.js +34 -41
- package/dist/src/commands/discard.js +8 -9
- package/dist/src/commands/doctor-check-core.d.ts +4 -18
- package/dist/src/commands/doctor-check-core.js +8 -35
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
- package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
- package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
- package/dist/src/commands/doctor-furnace-jar.js +7 -9
- package/dist/src/commands/doctor-furnace.js +21 -24
- package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
- package/dist/src/commands/doctor-orphaned-harness.js +18 -44
- package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
- package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
- package/dist/src/commands/doctor-working-tree.d.ts +10 -12
- package/dist/src/commands/doctor-working-tree.js +11 -18
- package/dist/src/commands/doctor.js +35 -53
- package/dist/src/commands/download.js +32 -48
- package/dist/src/commands/export-all.js +29 -33
- package/dist/src/commands/export-flow.js +6 -6
- package/dist/src/commands/export-placement-conflicts.js +10 -9
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-shared.d.ts +30 -33
- package/dist/src/commands/export-shared.js +45 -43
- package/dist/src/commands/export.js +21 -27
- package/dist/src/commands/furnace/apply.js +14 -23
- package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
- package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
- package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
- package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
- package/dist/src/commands/furnace/chrome-doc.js +31 -41
- package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
- package/dist/src/commands/furnace/create-browser-test.js +8 -8
- package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
- package/dist/src/commands/furnace/create-mochikit.js +8 -9
- package/dist/src/commands/furnace/create-readback.d.ts +12 -13
- package/dist/src/commands/furnace/create-readback.js +12 -13
- package/dist/src/commands/furnace/create-templates.d.ts +22 -28
- package/dist/src/commands/furnace/create-templates.js +35 -30
- package/dist/src/commands/furnace/create-xpcshell.js +2 -2
- package/dist/src/commands/furnace/create.js +33 -23
- package/dist/src/commands/furnace/deploy.js +16 -24
- package/dist/src/commands/furnace/diff.js +9 -9
- package/dist/src/commands/furnace/init.js +33 -36
- package/dist/src/commands/furnace/override.js +23 -25
- package/dist/src/commands/furnace/preview.js +47 -67
- package/dist/src/commands/furnace/refresh.js +12 -16
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
- package/dist/src/commands/furnace/remove-mutations.js +9 -16
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +33 -38
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
- package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
- package/dist/src/commands/furnace/rename.js +59 -69
- package/dist/src/commands/furnace/scan.js +19 -33
- package/dist/src/commands/furnace/status.js +12 -9
- package/dist/src/commands/furnace/sync.js +9 -16
- package/dist/src/commands/furnace/validate.js +20 -20
- package/dist/src/commands/import.js +42 -35
- package/dist/src/commands/lint-per-patch.js +15 -10
- package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
- package/dist/src/commands/lint-per-run-checkjs.js +13 -13
- package/dist/src/commands/lint-report.js +6 -7
- package/dist/src/commands/lint.d.ts +15 -16
- package/dist/src/commands/lint.js +86 -102
- package/dist/src/commands/package.js +6 -11
- package/dist/src/commands/patch/compact.js +1 -1
- package/dist/src/commands/patch/delete.js +24 -33
- package/dist/src/commands/patch/index.d.ts +5 -6
- package/dist/src/commands/patch/index.js +10 -12
- package/dist/src/commands/patch/lint-ignore.js +14 -13
- package/dist/src/commands/patch/move-files-create.d.ts +6 -6
- package/dist/src/commands/patch/move-files-create.js +8 -8
- package/dist/src/commands/patch/move-files-into.d.ts +6 -6
- package/dist/src/commands/patch/move-files-into.js +8 -8
- package/dist/src/commands/patch/patch-context.d.ts +2 -3
- package/dist/src/commands/patch/patch-context.js +2 -3
- package/dist/src/commands/patch/rename.d.ts +10 -11
- package/dist/src/commands/patch/rename.js +11 -12
- package/dist/src/commands/patch/reorder.js +8 -9
- package/dist/src/commands/patch/split-plan.js +1 -1
- package/dist/src/commands/patch/split.d.ts +8 -10
- package/dist/src/commands/patch/split.js +9 -11
- package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
- package/dist/src/commands/patch/staged-dependency.js +7 -3
- package/dist/src/commands/patch/tier.d.ts +9 -9
- package/dist/src/commands/patch/tier.js +18 -15
- package/dist/src/commands/re-export-adjacent.js +9 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
- package/dist/src/commands/re-export-bulk-scan.js +22 -21
- package/dist/src/commands/re-export-drift.js +10 -10
- package/dist/src/commands/re-export-files.d.ts +6 -7
- package/dist/src/commands/re-export-files.js +34 -44
- package/dist/src/commands/re-export-lint.d.ts +10 -13
- package/dist/src/commands/re-export-lint.js +16 -14
- package/dist/src/commands/re-export-options.d.ts +6 -6
- package/dist/src/commands/re-export-options.js +6 -6
- package/dist/src/commands/re-export-register.d.ts +4 -10
- package/dist/src/commands/re-export-register.js +5 -11
- package/dist/src/commands/re-export-scan.js +1 -1
- package/dist/src/commands/re-export-single.d.ts +3 -3
- package/dist/src/commands/re-export-single.js +33 -25
- package/dist/src/commands/re-export.js +13 -21
- package/dist/src/commands/rebase/abort.js +3 -3
- package/dist/src/commands/rebase/confirm.js +2 -1
- package/dist/src/commands/rebase/continue.d.ts +1 -1
- package/dist/src/commands/rebase/continue.js +14 -9
- package/dist/src/commands/rebase/index.js +11 -11
- package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
- package/dist/src/commands/rebase/patch-loop.js +60 -39
- package/dist/src/commands/rebase/summary.js +1 -1
- package/dist/src/commands/register.js +5 -7
- package/dist/src/commands/reset.js +2 -1
- package/dist/src/commands/resolve.d.ts +16 -13
- package/dist/src/commands/resolve.js +30 -33
- package/dist/src/commands/run.js +33 -35
- package/dist/src/commands/setup-support.js +15 -19
- package/dist/src/commands/setup.js +13 -9
- package/dist/src/commands/status-check.d.ts +6 -6
- package/dist/src/commands/status-json.d.ts +6 -6
- package/dist/src/commands/status-json.js +5 -0
- package/dist/src/commands/status-output.d.ts +5 -5
- package/dist/src/commands/status-output.js +6 -6
- package/dist/src/commands/status-ownership.d.ts +16 -14
- package/dist/src/commands/status-ownership.js +16 -14
- package/dist/src/commands/status.js +42 -34
- package/dist/src/commands/test-build-phase.js +26 -13
- package/dist/src/commands/test-diagnose.js +44 -44
- package/dist/src/commands/test-register.js +1 -0
- package/dist/src/commands/test-run.d.ts +14 -16
- package/dist/src/commands/test-run.js +21 -13
- package/dist/src/commands/test-stale-gate.d.ts +15 -16
- package/dist/src/commands/test-stale-gate.js +15 -16
- package/dist/src/commands/test-verdict.d.ts +20 -3
- package/dist/src/commands/test-verdict.js +30 -0
- package/dist/src/commands/test.js +83 -76
- package/dist/src/commands/token-coverage.js +3 -4
- package/dist/src/commands/token.js +16 -18
- package/dist/src/commands/tree.js +47 -31
- package/dist/src/commands/typecheck.d.ts +10 -12
- package/dist/src/commands/typecheck.js +24 -27
- package/dist/src/commands/verify.js +13 -15
- package/dist/src/commands/watch.js +21 -23
- package/dist/src/commands/wire.js +52 -62
- package/dist/src/core/ast-utils.d.ts +8 -7
- package/dist/src/core/ast-utils.js +8 -7
- package/dist/src/core/branding.d.ts +9 -14
- package/dist/src/core/branding.js +7 -11
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +14 -19
- package/dist/src/core/build-audit-platform.js +25 -33
- package/dist/src/core/build-audit-registration.js +17 -25
- package/dist/src/core/build-audit-resolve.d.ts +15 -17
- package/dist/src/core/build-audit-resolve.js +27 -33
- package/dist/src/core/build-audit-transforms.js +18 -19
- package/dist/src/core/build-audit.js +28 -42
- package/dist/src/core/build-baseline-types.d.ts +29 -35
- package/dist/src/core/build-baseline.d.ts +5 -4
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-overwrite-guard.d.ts +7 -14
- package/dist/src/core/build-overwrite-guard.js +17 -27
- package/dist/src/core/build-prepare.d.ts +2 -2
- package/dist/src/core/build-prepare.js +8 -9
- package/dist/src/core/config-state.js +12 -4
- package/dist/src/core/config-validate.js +8 -5
- package/dist/src/core/config.d.ts +5 -8
- package/dist/src/core/config.js +7 -16
- package/dist/src/core/coverage-extend.d.ts +15 -13
- package/dist/src/core/coverage-extend.js +15 -13
- package/dist/src/core/destructive.d.ts +31 -9
- package/dist/src/core/destructive.js +29 -26
- package/dist/src/core/diff-hunks.js +10 -12
- package/dist/src/core/discard-baseline.d.ts +8 -8
- package/dist/src/core/discard-baseline.js +16 -15
- package/dist/src/core/display-state.d.ts +12 -14
- package/dist/src/core/display-state.js +12 -14
- package/dist/src/core/engine-changes.d.ts +2 -4
- package/dist/src/core/engine-changes.js +2 -4
- package/dist/src/core/engine-precondition.d.ts +28 -13
- package/dist/src/core/engine-precondition.js +25 -10
- package/dist/src/core/engine-session-lock.d.ts +47 -21
- package/dist/src/core/engine-session-lock.js +168 -33
- package/dist/src/core/export-moved-code-shape.d.ts +10 -10
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock.d.ts +62 -5
- package/dist/src/core/file-lock.js +196 -59
- package/dist/src/core/firefox-cache.js +1 -3
- package/dist/src/core/firefox-extract.js +10 -14
- package/dist/src/core/firefox.d.ts +7 -5
- package/dist/src/core/firefox.js +4 -5
- package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
- package/dist/src/core/furnace-apply-dry-run.js +3 -2
- package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
- package/dist/src/core/furnace-apply-ftl.js +12 -12
- package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
- package/dist/src/core/furnace-apply-helpers.js +19 -16
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
- package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
- package/dist/src/core/furnace-apply.d.ts +5 -8
- package/dist/src/core/furnace-apply.js +19 -24
- package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
- package/dist/src/core/furnace-checksum-utils.js +16 -0
- package/dist/src/core/furnace-config.d.ts +21 -30
- package/dist/src/core/furnace-config.js +32 -54
- package/dist/src/core/furnace-constants.d.ts +8 -0
- package/dist/src/core/furnace-constants.js +10 -2
- package/dist/src/core/furnace-css-fragments.d.ts +5 -5
- package/dist/src/core/furnace-css-fragments.js +5 -5
- package/dist/src/core/furnace-jsconfig.d.ts +11 -12
- package/dist/src/core/furnace-jsconfig.js +11 -12
- package/dist/src/core/furnace-marker.d.ts +7 -8
- package/dist/src/core/furnace-marker.js +7 -8
- package/dist/src/core/furnace-operation.d.ts +31 -0
- package/dist/src/core/furnace-operation.js +54 -17
- package/dist/src/core/furnace-precondition.d.ts +61 -0
- package/dist/src/core/furnace-precondition.js +67 -0
- package/dist/src/core/furnace-registration-remove.d.ts +5 -6
- package/dist/src/core/furnace-registration-remove.js +6 -7
- package/dist/src/core/furnace-registration-validate.d.ts +13 -0
- package/dist/src/core/furnace-registration-validate.js +20 -1
- package/dist/src/core/furnace-registration.d.ts +5 -6
- package/dist/src/core/furnace-registration.js +10 -12
- package/dist/src/core/furnace-rollback.js +7 -7
- package/dist/src/core/furnace-scanner.d.ts +1 -0
- package/dist/src/core/furnace-scanner.js +1 -2
- package/dist/src/core/furnace-stale-export.d.ts +10 -10
- package/dist/src/core/furnace-stale-export.js +10 -10
- package/dist/src/core/furnace-state-persist.d.ts +6 -8
- package/dist/src/core/furnace-state-persist.js +6 -8
- package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
- package/dist/src/core/furnace-validate-accessibility.js +310 -1
- package/dist/src/core/furnace-validate-compatibility.js +141 -1
- package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
- package/dist/src/core/furnace-validate-helpers.js +0 -491
- package/dist/src/core/furnace-validate-registration.d.ts +7 -0
- package/dist/src/core/furnace-validate-registration.js +115 -41
- package/dist/src/core/furnace-validate.d.ts +16 -0
- package/dist/src/core/furnace-validate.js +188 -145
- package/dist/src/core/furnace-version-drift.d.ts +10 -11
- package/dist/src/core/furnace-version-drift.js +10 -11
- package/dist/src/core/git-base.d.ts +7 -9
- package/dist/src/core/git-base.js +7 -9
- package/dist/src/core/git-diff.d.ts +20 -9
- package/dist/src/core/git-diff.js +148 -63
- package/dist/src/core/git-file-ops.d.ts +19 -19
- package/dist/src/core/git-file-ops.js +19 -19
- package/dist/src/core/git-readonly-index.d.ts +53 -19
- package/dist/src/core/git-readonly-index.js +75 -31
- package/dist/src/core/git-status.d.ts +5 -6
- package/dist/src/core/git-status.js +5 -6
- package/dist/src/core/git.d.ts +9 -10
- package/dist/src/core/git.js +54 -70
- package/dist/src/core/license-headers.d.ts +17 -23
- package/dist/src/core/license-headers.js +17 -23
- package/dist/src/core/mach-build-artifacts.d.ts +9 -9
- package/dist/src/core/mach-build-artifacts.js +57 -19
- package/dist/src/core/mach-error-hints.js +42 -29
- package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
- package/dist/src/core/mach-known-noise-filter.js +18 -20
- package/dist/src/core/mach-mozconfig.d.ts +14 -0
- package/dist/src/core/mach-mozconfig.js +30 -0
- package/dist/src/core/mach-resource-shim.d.ts +43 -58
- package/dist/src/core/mach-resource-shim.js +50 -67
- package/dist/src/core/mach.d.ts +37 -41
- package/dist/src/core/mach.js +50 -51
- package/dist/src/core/marionette-port.d.ts +36 -1
- package/dist/src/core/marionette-port.js +96 -31
- package/dist/src/core/marionette-preflight.d.ts +8 -12
- package/dist/src/core/marionette-preflight.js +86 -52
- package/dist/src/core/mochitest-server-port.d.ts +42 -0
- package/dist/src/core/mochitest-server-port.js +119 -0
- package/dist/src/core/module-resolution-preflight.d.ts +9 -11
- package/dist/src/core/module-resolution-preflight.js +9 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
- package/dist/src/core/moz-manifest-helpers.js +163 -0
- package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
- package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
- package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
- package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
- package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
- package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
- package/dist/src/core/ownership-table.d.ts +14 -16
- package/dist/src/core/ownership-table.js +14 -16
- package/dist/src/core/parser-fallback.d.ts +15 -1
- package/dist/src/core/parser-fallback.js +22 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
- package/dist/src/core/patch-apply-fuzz.js +15 -18
- package/dist/src/core/patch-apply.d.ts +13 -34
- package/dist/src/core/patch-apply.js +16 -76
- package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
- package/dist/src/core/patch-artifact-normalize.js +13 -15
- package/dist/src/core/patch-export-metadata.d.ts +12 -2
- package/dist/src/core/patch-export-metadata.js +13 -4
- package/dist/src/core/patch-export-update.d.ts +13 -1
- package/dist/src/core/patch-export-update.js +25 -8
- package/dist/src/core/patch-export.d.ts +15 -8
- package/dist/src/core/patch-export.js +10 -11
- package/dist/src/core/patch-files.d.ts +5 -6
- package/dist/src/core/patch-files.js +5 -6
- package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
- package/dist/src/core/patch-identifier-suggest.js +14 -19
- package/dist/src/core/patch-lint-binary.d.ts +51 -0
- package/dist/src/core/patch-lint-binary.js +39 -0
- package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
- package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
- package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
- package/dist/src/core/patch-lint-checkjs.js +16 -16
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
- package/dist/src/core/patch-lint-creators.d.ts +8 -8
- package/dist/src/core/patch-lint-creators.js +8 -8
- package/dist/src/core/patch-lint-cross.d.ts +17 -20
- package/dist/src/core/patch-lint-cross.js +16 -16
- package/dist/src/core/patch-lint-css.d.ts +3 -5
- package/dist/src/core/patch-lint-css.js +17 -22
- package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
- package/dist/src/core/patch-lint-diff-tag.js +14 -16
- package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
- package/dist/src/core/patch-lint-jsdoc.js +26 -19
- package/dist/src/core/patch-lint-mozbuild.js +20 -20
- package/dist/src/core/patch-lint-observer.d.ts +7 -7
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint.d.ts +38 -29
- package/dist/src/core/patch-lint.js +89 -121
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +45 -9
- package/dist/src/core/patch-manifest-consistency.d.ts +2 -1
- package/dist/src/core/patch-manifest-consistency.js +25 -27
- package/dist/src/core/patch-manifest-io.js +14 -18
- package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
- package/dist/src/core/patch-manifest-resolve.js +9 -12
- package/dist/src/core/patch-manifest-validate.d.ts +6 -1
- package/dist/src/core/patch-manifest-validate.js +25 -13
- package/dist/src/core/patch-parse.d.ts +24 -13
- package/dist/src/core/patch-parse.js +19 -14
- package/dist/src/core/patch-policy.d.ts +2 -2
- package/dist/src/core/patch-policy.js +2 -2
- package/dist/src/core/patch-registration-refs.d.ts +7 -8
- package/dist/src/core/patch-registration-refs.js +9 -9
- package/dist/src/core/process-cpu-time.d.ts +12 -0
- package/dist/src/core/process-cpu-time.js +52 -0
- package/dist/src/core/rebase-session.d.ts +38 -26
- package/dist/src/core/rebase-session.js +55 -28
- package/dist/src/core/register-browser-content.js +9 -74
- package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
- package/dist/src/core/register-module.js +10 -43
- package/dist/src/core/register-scaffold.d.ts +8 -8
- package/dist/src/core/register-scaffold.js +10 -10
- package/dist/src/core/register-shared-css.d.ts +9 -12
- package/dist/src/core/register-shared-css.js +17 -87
- package/dist/src/core/register-xpcshell-test.d.ts +6 -7
- package/dist/src/core/register-xpcshell-test.js +7 -8
- package/dist/src/core/shared-ftl.js +12 -4
- package/dist/src/core/state-file.d.ts +45 -0
- package/dist/src/core/state-file.js +34 -0
- package/dist/src/core/status-binary.d.ts +18 -11
- package/dist/src/core/status-binary.js +19 -12
- package/dist/src/core/status-classify.d.ts +30 -36
- package/dist/src/core/status-classify.js +21 -26
- package/dist/src/core/test-changed-prefs.d.ts +30 -0
- package/dist/src/core/test-changed-prefs.js +78 -0
- package/dist/src/core/test-harness-crash.d.ts +25 -63
- package/dist/src/core/test-harness-crash.js +121 -142
- package/dist/src/core/test-harness-signature.d.ts +18 -0
- package/dist/src/core/test-harness-signature.js +13 -0
- package/dist/src/core/test-path-scope.d.ts +12 -15
- package/dist/src/core/test-path-scope.js +15 -18
- package/dist/src/core/test-stale-check.d.ts +17 -17
- package/dist/src/core/test-stale-check.js +50 -43
- package/dist/src/core/test-stall-triage.d.ts +51 -0
- package/dist/src/core/test-stall-triage.js +126 -0
- package/dist/src/core/token-category.js +5 -7
- package/dist/src/core/token-coverage.js +9 -9
- package/dist/src/core/token-dark-mode.d.ts +9 -11
- package/dist/src/core/token-dark-mode.js +9 -11
- package/dist/src/core/token-docs.d.ts +2 -0
- package/dist/src/core/token-docs.js +2 -0
- package/dist/src/core/token-manager.d.ts +10 -2
- package/dist/src/core/token-manager.js +17 -8
- package/dist/src/core/token-scaffold.d.ts +7 -7
- package/dist/src/core/token-scaffold.js +7 -7
- package/dist/src/core/token-variant.d.ts +4 -4
- package/dist/src/core/token-variant.js +4 -4
- package/dist/src/core/toolchain-preflight.d.ts +20 -21
- package/dist/src/core/toolchain-preflight.js +28 -31
- package/dist/src/core/tree-guard.js +12 -2
- package/dist/src/core/tree-store.d.ts +41 -27
- package/dist/src/core/tree-store.js +63 -42
- package/dist/src/core/typecheck-shim.d.ts +23 -24
- package/dist/src/core/typecheck-shim.js +23 -24
- package/dist/src/core/typecheck.js +8 -8
- package/dist/src/core/wire-destroy.d.ts +3 -3
- package/dist/src/core/wire-destroy.js +7 -15
- package/dist/src/core/wire-dom-fragment.d.ts +9 -17
- package/dist/src/core/wire-dom-fragment.js +11 -44
- package/dist/src/core/wire-init.d.ts +2 -3
- package/dist/src/core/wire-init.js +8 -19
- package/dist/src/core/wire-subscript.d.ts +2 -3
- package/dist/src/core/wire-subscript.js +4 -13
- package/dist/src/core/wire-utils.d.ts +7 -8
- package/dist/src/core/wire-utils.js +7 -8
- package/dist/src/core/xpcshell-appdir.d.ts +38 -45
- package/dist/src/core/xpcshell-appdir.js +38 -45
- package/dist/src/errors/base.d.ts +37 -16
- package/dist/src/errors/base.js +37 -16
- package/dist/src/errors/build.d.ts +13 -1
- package/dist/src/errors/build.js +14 -2
- package/dist/src/errors/codes.d.ts +16 -0
- package/dist/src/errors/codes.js +16 -0
- package/dist/src/errors/furnace.d.ts +4 -4
- package/dist/src/errors/git.d.ts +6 -10
- package/dist/src/errors/git.js +6 -10
- package/dist/src/errors/patch.d.ts +7 -7
- package/dist/src/errors/patch.js +7 -7
- package/dist/src/errors/rebase.d.ts +4 -4
- package/dist/src/errors/rebase.js +4 -4
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.js +5 -0
- package/dist/src/types/commands/index.d.ts +2 -2
- package/dist/src/types/commands/options.d.ts +88 -70
- package/dist/src/types/commands/patches.d.ts +24 -34
- package/dist/src/types/commands/project.d.ts +5 -34
- package/dist/src/types/config.d.ts +25 -23
- package/dist/src/types/config.js +6 -1
- package/dist/src/types/furnace.d.ts +37 -13
- package/dist/src/types/furnace.js +19 -1
- package/dist/src/types/index.d.ts +3 -3
- package/dist/src/utils/build-info.d.ts +7 -8
- package/dist/src/utils/build-info.js +12 -11
- package/dist/src/utils/errors.d.ts +6 -8
- package/dist/src/utils/errors.js +6 -8
- package/dist/src/utils/logger.d.ts +27 -10
- package/dist/src/utils/logger.js +28 -16
- package/dist/src/utils/machine-output.d.ts +12 -0
- package/dist/src/utils/machine-output.js +33 -0
- package/dist/src/utils/options.d.ts +31 -14
- package/dist/src/utils/options.js +86 -30
- package/dist/src/utils/paths.d.ts +10 -8
- package/dist/src/utils/paths.js +10 -8
- package/dist/src/utils/platform.d.ts +0 -25
- package/dist/src/utils/platform.js +1 -42
- package/dist/src/utils/process-group.d.ts +9 -4
- package/dist/src/utils/process-group.js +19 -5
- package/dist/src/utils/process.d.ts +42 -7
- package/dist/src/utils/process.js +44 -17
- package/dist/src/utils/ps-duration.d.ts +31 -0
- package/dist/src/utils/ps-duration.js +70 -0
- package/dist/src/utils/regex.d.ts +9 -10
- package/dist/src/utils/regex.js +9 -10
- package/dist/src/utils/validation.d.ts +58 -28
- package/dist/src/utils/validation.js +60 -33
- package/package.json +2 -2
- package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
- package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
- package/dist/src/core/manifest-helpers.d.ts +0 -38
- package/dist/src/core/manifest-helpers.js +0 -120
- /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
- /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
- /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
import { watch as fsWatch } from 'node:fs';
|
|
3
|
-
import {
|
|
3
|
+
import { loadConfig } from '../../core/config.js';
|
|
4
4
|
import { applyAllComponents, computeComponentChecksums } from '../../core/furnace-apply.js';
|
|
5
5
|
import { logApplyResult } from '../../core/furnace-apply-output.js';
|
|
6
|
-
import {
|
|
6
|
+
import { getFurnacePaths } from '../../core/furnace-config.js';
|
|
7
7
|
import { isComponentSourceFile } from '../../core/furnace-constants.js';
|
|
8
8
|
import { runFurnaceMutation } from '../../core/furnace-operation.js';
|
|
9
|
+
import { assertFurnaceReady } from '../../core/furnace-precondition.js';
|
|
9
10
|
import { getPersistableAppliedEntry, persistSingleComponentState, shouldPersistSingleComponentState, } from '../../core/furnace-state-persist.js';
|
|
10
11
|
import { countEntriesWithBlockingStepErrors } from '../../core/furnace-step-errors.js';
|
|
11
12
|
import { findOverrideBaseVersionDrift, formatOverrideBaseVersionDriftError, formatOverrideBaseVersionDriftWarning, } from '../../core/furnace-version-drift.js';
|
|
@@ -74,11 +75,10 @@ function classifyWatchApplyError(err) {
|
|
|
74
75
|
async function runWatchLoop(projectRoot) {
|
|
75
76
|
const furnacePaths = getFurnacePaths(projectRoot);
|
|
76
77
|
// Both categories are eligible targets. The set is fixed; only existence
|
|
77
|
-
// varies over time — a component dir created AFTER watch started (
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
//
|
|
81
|
-
// creation invisible.
|
|
78
|
+
// varies over time — a component dir created AFTER watch started (the user
|
|
79
|
+
// running `furnace create` in another terminal) must be picked up without
|
|
80
|
+
// restarting watch. A one-shot `pathExists` check at startup captures only
|
|
81
|
+
// the dirs that existed then, leaving any later creation invisible.
|
|
82
82
|
const candidateDirs = [furnacePaths.overridesDir, furnacePaths.customDir];
|
|
83
83
|
const watchDirs = [];
|
|
84
84
|
const watchers = new Map();
|
|
@@ -253,16 +253,7 @@ async function runWatchLoop(projectRoot) {
|
|
|
253
253
|
*/
|
|
254
254
|
export async function furnaceApplyCommand(projectRoot, name, options = {}) {
|
|
255
255
|
intro(name ? `Furnace Apply (${name})` : 'Furnace Apply');
|
|
256
|
-
|
|
257
|
-
const paths = getProjectPaths(projectRoot);
|
|
258
|
-
if (!(await pathExists(paths.engine))) {
|
|
259
|
-
throw new FurnaceError('Engine directory not found. Run "fireforge download" first.');
|
|
260
|
-
}
|
|
261
|
-
// Load furnace config
|
|
262
|
-
if (!(await furnaceConfigExists(projectRoot))) {
|
|
263
|
-
throw new FurnaceError('No furnace.json found. Run "fireforge furnace create" or "fireforge furnace override" to get started.');
|
|
264
|
-
}
|
|
265
|
-
const config = await loadFurnaceConfig(projectRoot);
|
|
256
|
+
const { config } = await assertFurnaceReady(projectRoot);
|
|
266
257
|
const overrideCount = Object.keys(config.overrides).length;
|
|
267
258
|
const customCount = Object.keys(config.custom).length;
|
|
268
259
|
if (overrideCount === 0 && customCount === 0) {
|
|
@@ -289,12 +280,12 @@ export async function furnaceApplyCommand(projectRoot, name, options = {}) {
|
|
|
289
280
|
// `persistState: false` for a NAMED apply is load-bearing: the batch
|
|
290
281
|
// persist path replaces `appliedChecksums` wholesale with only this
|
|
291
282
|
// run's entries, and the batch loops filter to the named component —
|
|
292
|
-
// so routing a named apply through it
|
|
293
|
-
//
|
|
294
|
-
//
|
|
295
|
-
//
|
|
296
|
-
//
|
|
297
|
-
//
|
|
283
|
+
// so routing a named apply through it persists a state file containing
|
|
284
|
+
// ONLY that component, wiping every other component's checksums.
|
|
285
|
+
// Orphan detection and deleted-file undeploy both key on that state,
|
|
286
|
+
// so the wiped components' stale engine files become invisible to
|
|
287
|
+
// apply AND to `furnace validate`. Named apply merges per-component
|
|
288
|
+
// state below, exactly like `furnace deploy <name>`.
|
|
298
289
|
const applyResult = await applyAllComponents(projectRoot, dryRun, {
|
|
299
290
|
operationContext: ctx,
|
|
300
291
|
...(name !== undefined ? { componentName: name, persistState: false } : {}),
|
|
@@ -7,10 +7,11 @@ import { readdir } from 'node:fs/promises';
|
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
import { confirm } from '@clack/prompts';
|
|
9
9
|
import { loadConfig } from '../../core/config.js';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
10
|
+
import { stdioIsInteractive } from '../../core/destructive.js';
|
|
11
|
+
import { completeJournalRollback, runFurnaceMutation, } from '../../core/furnace-operation.js';
|
|
12
|
+
import { assertFurnaceEngineReady } from '../../core/furnace-precondition.js';
|
|
13
|
+
import { createRollbackJournal, snapshotDir, snapshotFile } from '../../core/furnace-rollback.js';
|
|
12
14
|
import { FurnaceError } from '../../errors/furnace.js';
|
|
13
|
-
import { toError } from '../../utils/errors.js';
|
|
14
15
|
import { pathExists, readText, removeDir, removeFile, writeText } from '../../utils/fs.js';
|
|
15
16
|
import { cancel, info, intro, isCancel, note, outro } from '../../utils/logger.js';
|
|
16
17
|
import { buildChromeDocPlan, validateChromeDocName } from './chrome-doc.js';
|
|
@@ -87,20 +88,12 @@ async function performChromeDocRemoveMutations(args) {
|
|
|
87
88
|
await removeEmptyDirIfPresent(join(args.engineDir, 'browser/base/content/test', `${args.binaryName}-xpcshell`), journal);
|
|
88
89
|
}
|
|
89
90
|
catch (error) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
catch (rollbackError) {
|
|
97
|
-
// Matches the seven sibling mutation sites: a failed rollback leaves the
|
|
98
|
-
// engine in an unknown state, so record the repair breadcrumb and let
|
|
99
|
-
// the rollback error win rather than discarding it.
|
|
100
|
-
await recordFurnaceRollbackFailure(args.projectRoot, 'chrome-doc-rollback', `chrome-doc "${args.name}": ${toError(rollbackError).message}`);
|
|
101
|
-
throw rollbackError;
|
|
102
|
-
}
|
|
103
|
-
throw error;
|
|
91
|
+
return await completeJournalRollback(args.operationContext, journal, error, {
|
|
92
|
+
projectRoot: args.projectRoot,
|
|
93
|
+
operation: 'chrome-doc-rollback',
|
|
94
|
+
failureMessage: `Failed to remove chrome-doc "${args.name}"`,
|
|
95
|
+
subject: `chrome-doc "${args.name}"`,
|
|
96
|
+
});
|
|
104
97
|
}
|
|
105
98
|
return { removedFiles, removedJarEntries, removedTestDir };
|
|
106
99
|
}
|
|
@@ -110,9 +103,9 @@ export async function furnaceChromeDocRemoveCommand(projectRoot, name, options =
|
|
|
110
103
|
validateChromeDocName(name);
|
|
111
104
|
const forgeConfig = await loadConfig(projectRoot);
|
|
112
105
|
const engineDir = join(projectRoot, 'engine');
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
106
|
+
await assertFurnaceEngineReady(projectRoot, {
|
|
107
|
+
engineMissingSuffix: ' before removing a chrome-doc.',
|
|
108
|
+
});
|
|
116
109
|
const plan = await buildChromeDocPlan({
|
|
117
110
|
engineDir,
|
|
118
111
|
name,
|
|
@@ -125,7 +118,7 @@ export async function furnaceChromeDocRemoveCommand(projectRoot, name, options =
|
|
|
125
118
|
outro('Dry run complete');
|
|
126
119
|
return;
|
|
127
120
|
}
|
|
128
|
-
const isInteractive =
|
|
121
|
+
const isInteractive = stdioIsInteractive();
|
|
129
122
|
if (!options.yes && !isInteractive) {
|
|
130
123
|
throw new FurnaceError(`Cannot remove chrome-doc "${name}" in non-interactive mode without --yes flag.`, name);
|
|
131
124
|
}
|
|
@@ -41,23 +41,25 @@
|
|
|
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
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
44
|
+
* browser.xhtml-like scaffold for the document that ships as the fork's MAIN
|
|
45
|
+
* BROWSER WINDOW.
|
|
46
|
+
*
|
|
47
|
+
* The generic dialog-shaped `<window>` scaffold is wrong for the
|
|
48
|
+
* `tokenHostDocuments[0]` / BROWSER_CHROME_URL target: platform C++ reads
|
|
49
|
+
* the root element BEFORE any script runs, and expects the `browser.xhtml`
|
|
50
|
+
* shape:
|
|
49
51
|
*
|
|
50
52
|
* - `<html id="main-window">` root (not `<window id="<name>-window">`) —
|
|
51
53
|
* upstream code from nsXULWindow sizing to session restore looks up
|
|
52
54
|
* `main-window` by id;
|
|
53
55
|
* - `windowtype="navigator:browser"`, `chromehidden=""` and the geometry
|
|
54
56
|
* `persist` allowlist declared as ROOT ATTRIBUTES so the platform's
|
|
55
|
-
* pre-script pass (window tracking, XULStore geometry, chrome flags)
|
|
56
|
-
*
|
|
57
|
+
* pre-script pass (window tracking, XULStore geometry, chrome flags) sees
|
|
58
|
+
* them;
|
|
57
59
|
* - the same head/bootstrap wiring (customElements.js, per-doc subscript,
|
|
58
60
|
* CSS + Fluent links) and `data-furnace-chrome-doc` sentinel as the
|
|
59
|
-
* generic scaffold, so jar.mn registration and the platform-module
|
|
60
|
-
*
|
|
61
|
+
* generic scaffold, so jar.mn registration and the platform-module guard
|
|
62
|
+
* pattern are unchanged.
|
|
61
63
|
*/
|
|
62
64
|
export declare function generateBrowserWindowXhtml(name: string, license: string): string;
|
|
63
65
|
/**
|
|
@@ -105,25 +107,23 @@ export declare function jarMnEntriesForChromeDoc(name: string): string[];
|
|
|
105
107
|
/**
|
|
106
108
|
* jar.inc.mn entry that registers the scoped CSS under `content/browser/`.
|
|
107
109
|
*
|
|
108
|
-
* The source path is `../shared/<name>-chrome.css` because `jar.inc.mn`
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
* `obj-.../browser/themes/osx/shared/<name>-chrome.css
|
|
114
|
-
*
|
|
115
|
-
* `browser/themes/shared/`.
|
|
110
|
+
* The source path is `../shared/<name>-chrome.css` because `jar.inc.mn` is
|
|
111
|
+
* included from each theme-specific manifest (`browser/themes/osx/jar.mn`,
|
|
112
|
+
* `.../linux/`, `.../windows/`), and every existing entry in those manifests
|
|
113
|
+
* resolves paths relative to the INCLUDING manifest's directory. A bare
|
|
114
|
+
* `(shared/…)` path resolves to
|
|
115
|
+
* `obj-.../browser/themes/osx/shared/<name>-chrome.css`, which does not
|
|
116
|
+
* exist.
|
|
116
117
|
*/
|
|
117
118
|
export declare function jarIncMnEntryForChromeDoc(name: string): string;
|
|
118
119
|
/**
|
|
119
120
|
* locales/jar.mn entry that registers the `.ftl` under the browser locale
|
|
120
121
|
* bundle. The source path is resolved by mach-locale-jar relative to the
|
|
121
|
-
* per-locale root (e.g. `engine/browser/locales/en-US/`), and the FTL
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* and broke the first post-scaffold `fireforge build` with
|
|
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 — the `%` prefix
|
|
124
|
+
* means "per-locale content" and the `browser/` subdirectory matches where
|
|
125
|
+
* the scaffolder writes. A bare `(%${name}.ftl)` points at
|
|
126
|
+
* `en-US/${name}.ftl` and breaks the first post-scaffold build with
|
|
127
127
|
* "jar.mn: Cannot find ${name}.ftl".
|
|
128
128
|
*/
|
|
129
129
|
export declare function localeJarMnEntryForChromeDoc(name: string): string;
|
|
@@ -99,23 +99,25 @@ 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
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
102
|
+
* browser.xhtml-like scaffold for the document that ships as the fork's MAIN
|
|
103
|
+
* BROWSER WINDOW.
|
|
104
|
+
*
|
|
105
|
+
* The generic dialog-shaped `<window>` scaffold is wrong for the
|
|
106
|
+
* `tokenHostDocuments[0]` / BROWSER_CHROME_URL target: platform C++ reads
|
|
107
|
+
* the root element BEFORE any script runs, and expects the `browser.xhtml`
|
|
108
|
+
* shape:
|
|
107
109
|
*
|
|
108
110
|
* - `<html id="main-window">` root (not `<window id="<name>-window">`) —
|
|
109
111
|
* upstream code from nsXULWindow sizing to session restore looks up
|
|
110
112
|
* `main-window` by id;
|
|
111
113
|
* - `windowtype="navigator:browser"`, `chromehidden=""` and the geometry
|
|
112
114
|
* `persist` allowlist declared as ROOT ATTRIBUTES so the platform's
|
|
113
|
-
* pre-script pass (window tracking, XULStore geometry, chrome flags)
|
|
114
|
-
*
|
|
115
|
+
* pre-script pass (window tracking, XULStore geometry, chrome flags) sees
|
|
116
|
+
* them;
|
|
115
117
|
* - the same head/bootstrap wiring (customElements.js, per-doc subscript,
|
|
116
118
|
* CSS + Fluent links) and `data-furnace-chrome-doc` sentinel as the
|
|
117
|
-
* generic scaffold, so jar.mn registration and the platform-module
|
|
118
|
-
*
|
|
119
|
+
* generic scaffold, so jar.mn registration and the platform-module guard
|
|
120
|
+
* pattern are unchanged.
|
|
119
121
|
*/
|
|
120
122
|
export function generateBrowserWindowXhtml(name, license) {
|
|
121
123
|
return `<?xml version="1.0"?>
|
|
@@ -278,14 +280,13 @@ export function jarMnEntriesForChromeDoc(name) {
|
|
|
278
280
|
/**
|
|
279
281
|
* jar.inc.mn entry that registers the scoped CSS under `content/browser/`.
|
|
280
282
|
*
|
|
281
|
-
* The source path is `../shared/<name>-chrome.css` because `jar.inc.mn`
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
*
|
|
285
|
-
*
|
|
286
|
-
* `obj-.../browser/themes/osx/shared/<name>-chrome.css
|
|
287
|
-
*
|
|
288
|
-
* `browser/themes/shared/`.
|
|
283
|
+
* The source path is `../shared/<name>-chrome.css` because `jar.inc.mn` is
|
|
284
|
+
* included from each theme-specific manifest (`browser/themes/osx/jar.mn`,
|
|
285
|
+
* `.../linux/`, `.../windows/`), and every existing entry in those manifests
|
|
286
|
+
* resolves paths relative to the INCLUDING manifest's directory. A bare
|
|
287
|
+
* `(shared/…)` path resolves to
|
|
288
|
+
* `obj-.../browser/themes/osx/shared/<name>-chrome.css`, which does not
|
|
289
|
+
* exist.
|
|
289
290
|
*/
|
|
290
291
|
export function jarIncMnEntryForChromeDoc(name) {
|
|
291
292
|
return ` content/browser/${name}-chrome.css (../shared/${name}-chrome.css)`;
|
|
@@ -293,12 +294,11 @@ export function jarIncMnEntryForChromeDoc(name) {
|
|
|
293
294
|
/**
|
|
294
295
|
* locales/jar.mn entry that registers the `.ftl` under the browser locale
|
|
295
296
|
* bundle. The source path is resolved by mach-locale-jar relative to the
|
|
296
|
-
* per-locale root (e.g. `engine/browser/locales/en-US/`), and the FTL
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
*
|
|
300
|
-
*
|
|
301
|
-
* and broke the first post-scaffold `fireforge build` with
|
|
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 — the `%` prefix
|
|
299
|
+
* means "per-locale content" and the `browser/` subdirectory matches where
|
|
300
|
+
* the scaffolder writes. A bare `(%${name}.ftl)` points at
|
|
301
|
+
* `en-US/${name}.ftl` and breaks the first post-scaffold build with
|
|
302
302
|
* "jar.mn: Cannot find ${name}.ftl".
|
|
303
303
|
*/
|
|
304
304
|
export function localeJarMnEntryForChromeDoc(name) {
|
|
@@ -3,30 +3,29 @@
|
|
|
3
3
|
* Packaging-verification test templates for
|
|
4
4
|
* `fireforge furnace chrome-doc create --with-tests`.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* this question:
|
|
6
|
+
* An operator who scaffolds a top-level chrome document wants to know "did
|
|
7
|
+
* the file actually land in the packaged bundle?" before relying on it at
|
|
8
|
+
* runtime. Both natural test harnesses have gaps for that question:
|
|
10
9
|
*
|
|
11
10
|
* - xpcshell's `chrome://browser/*` URI registration lags what the real
|
|
12
11
|
* browser loads even with `firefox-appdir = "browser"` set, so
|
|
13
|
-
* `NetUtil.asyncFetch("chrome://browser/content/<name>.xhtml")` can
|
|
14
|
-
*
|
|
15
|
-
*
|
|
12
|
+
* `NetUtil.asyncFetch("chrome://browser/content/<name>.xhtml")` can fail
|
|
13
|
+
* with `NS_ERROR_FILE_NOT_FOUND` against a file that IS correctly
|
|
14
|
+
* packaged.
|
|
16
15
|
* - Browser-chrome mochitests require a `tabbrowser`, which a
|
|
17
16
|
* fork-authored chrome doc that replaces `browser.xhtml` deliberately
|
|
18
|
-
* does not carry
|
|
17
|
+
* does not carry.
|
|
19
18
|
*
|
|
20
19
|
* This scaffold threads the needle by probing the filesystem directly:
|
|
21
|
-
* `Services.dirsvc.get("XCurProcD", Ci.nsIFile)` returns the current
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* `<AppDir>/chrome/browser/content/browser/<name>.xhtml` on an unpacked
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
20
|
+
* `Services.dirsvc.get("XCurProcD", Ci.nsIFile)` returns the current process
|
|
21
|
+
* directory (the browser app dir when `firefox-appdir = "browser"`), and the
|
|
22
|
+
* packaged chrome layout for a jar.mn entry `content/browser/<name>.xhtml`
|
|
23
|
+
* is stable across platforms at
|
|
24
|
+
* `<AppDir>/chrome/browser/content/browser/<name>.xhtml` on an unpacked tree
|
|
25
|
+
* (the default for `mach build` without `MOZ_CHROME_MULTILOCALE` / omnijar).
|
|
26
|
+
* A tree that packs omni.ja would need a different probe; the scaffold notes
|
|
27
|
+
* that out-of-scope case explicitly rather than silently producing a test
|
|
28
|
+
* that fails on packed builds.
|
|
30
29
|
*/
|
|
31
30
|
/**
|
|
32
31
|
* Returns the canonical xpcshell test basename for a chrome doc packaging
|
|
@@ -70,17 +69,16 @@ add_task(async function test_${taskSuffix}_files_packaged() {
|
|
|
70
69
|
const appDir = Services.dirsvc.get("XCurProcD", Ci.nsIFile);
|
|
71
70
|
|
|
72
71
|
// Probes a pair of candidate layouts for the same packaged file:
|
|
73
|
-
// 1) \`<AppDir>/chrome/browser/…\` — the unpacked layout when
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
// 2) \`<AppDir>/browser/chrome/browser/…\` — the macOS .app bundle
|
|
77
|
-
//
|
|
78
|
-
//
|
|
72
|
+
// 1) \`<AppDir>/chrome/browser/…\` — the unpacked layout when XCurProcD
|
|
73
|
+
// honours \`firefox-appdir = "browser"\` and resolves into
|
|
74
|
+
// \`dist/bin/browser/\`.
|
|
75
|
+
// 2) \`<AppDir>/browser/chrome/browser/…\` — the macOS .app bundle layout
|
|
76
|
+
// and some ESR configurations, where XCurProcD sits one level above
|
|
77
|
+
// \`browser/\` even when the appdir directive is set.
|
|
79
78
|
// If either path exists the file is packaged; the assertion only fails
|
|
80
79
|
// when BOTH layouts miss, which is the actual stale-build / missing
|
|
81
|
-
// jar.mn entry case.
|
|
82
|
-
//
|
|
83
|
-
// packaged correctly.
|
|
80
|
+
// jar.mn entry case. A single-layout probe fails on macOS against layout
|
|
81
|
+
// (2) even though the file is packaged correctly.
|
|
84
82
|
function probeEither(primary, fallback, description) {
|
|
85
83
|
const primaryFile = appDir.clone();
|
|
86
84
|
for (const segment of primary) {
|
|
@@ -121,9 +119,8 @@ add_task(async function test_${taskSuffix}_files_packaged() {
|
|
|
121
119
|
// \`content/browser/<name>-chrome.css\` (see \`chromeDocJarIncMnCssEntry\`
|
|
122
120
|
// in \`src/commands/furnace/chrome-doc-templates.ts\`), so the packaged
|
|
123
121
|
// file lands under \`chrome/browser/content/browser/\`, not under
|
|
124
|
-
// \`skin/classic/browser/\`.
|
|
125
|
-
// \`fireforge test --build\`
|
|
126
|
-
// a false failure because the probe was looking at the skin layout.
|
|
122
|
+
// \`skin/classic/browser/\`. Probing the skin layout reports a false
|
|
123
|
+
// failure on the first \`fireforge test --build\` after a scaffold.
|
|
127
124
|
probeEither(
|
|
128
125
|
["chrome", "browser", "content", "browser", "${name}-chrome.css"],
|
|
129
126
|
["browser", "chrome", "browser", "content", "browser", "${name}-chrome.css"],
|
|
@@ -2,18 +2,18 @@
|
|
|
2
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
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
5
|
+
* `furnace create` covers custom elements under `toolkit/content/widgets/`,
|
|
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
|
+
* hand-authored with error-prone jar.mn + jar.inc.mn + locales/jar.mn glue.
|
|
9
|
+
* The `*` preprocessor flag, the macOS titlebar-button carve-out, the
|
|
10
|
+
* startup-topic observer, and the Fluent linkage each have silent-break
|
|
11
|
+
* failure modes.
|
|
12
12
|
*
|
|
13
|
-
* This command writes the four source files and appends three jar.mn
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* This command writes the four source files and appends three jar.mn entries
|
|
14
|
+
* under a rollback journal identical in shape to `furnace create`. A SIGINT
|
|
15
|
+
* mid-scaffold restores every touched file; a successful run leaves the tree
|
|
16
|
+
* ready for `fireforge build`.
|
|
17
17
|
*/
|
|
18
18
|
/** Options for `furnace chrome-doc create`. */
|
|
19
19
|
export interface FurnaceChromeDocCreateOptions {
|
|
@@ -27,12 +27,11 @@ export interface FurnaceChromeDocCreateOptions {
|
|
|
27
27
|
/**
|
|
28
28
|
* Scaffold an xpcshell packaging-verification test alongside the chrome
|
|
29
29
|
* document. The generated test probes `XCurProcD/chrome/browser/...` on
|
|
30
|
-
* disk rather than going through `chrome://` URI resolution
|
|
31
|
-
* bypasses xpcshell's limited browser-chrome manifest set
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* because the owning moz.build depends on the fork's layout.
|
|
30
|
+
* disk rather than going through `chrome://` URI resolution, which
|
|
31
|
+
* bypasses xpcshell's limited browser-chrome manifest set — where
|
|
32
|
+
* `NetUtil.asyncFetch` returns `NS_ERROR_FILE_NOT_FOUND` against a file
|
|
33
|
+
* that IS packaged. Registration in `XPCSHELL_TESTS_MANIFESTS` is left to
|
|
34
|
+
* the operator because the owning moz.build depends on the fork's layout.
|
|
36
35
|
*/
|
|
37
36
|
withTests?: boolean;
|
|
38
37
|
/** Print the scaffold plan without writing files. */
|
|
@@ -3,29 +3,29 @@
|
|
|
3
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
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
6
|
+
* `furnace create` covers custom elements under `toolkit/content/widgets/`,
|
|
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
|
+
* hand-authored with error-prone jar.mn + jar.inc.mn + locales/jar.mn glue.
|
|
10
|
+
* The `*` preprocessor flag, the macOS titlebar-button carve-out, the
|
|
11
|
+
* startup-topic observer, and the Fluent linkage each have silent-break
|
|
12
|
+
* failure modes.
|
|
13
13
|
*
|
|
14
|
-
* This command writes the four source files and appends three jar.mn
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* This command writes the four source files and appends three jar.mn entries
|
|
15
|
+
* under a rollback journal identical in shape to `furnace create`. A SIGINT
|
|
16
|
+
* mid-scaffold restores every touched file; a successful run leaves the tree
|
|
17
|
+
* ready for `fireforge build`.
|
|
18
18
|
*/
|
|
19
19
|
import { join } from 'node:path';
|
|
20
20
|
import { loadConfig } from '../../core/config.js';
|
|
21
21
|
import { furnaceConfigExists, loadFurnaceConfig } from '../../core/furnace-config.js';
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
22
|
+
import { completeJournalRollback, runFurnaceMutation, } from '../../core/furnace-operation.js';
|
|
23
|
+
import { assertFurnaceEngineReady } from '../../core/furnace-precondition.js';
|
|
24
|
+
import { createRollbackJournal, recordCreatedDir, snapshotFile, } from '../../core/furnace-rollback.js';
|
|
24
25
|
import { DEFAULT_LICENSE, getLicenseHeader } from '../../core/license-headers.js';
|
|
25
26
|
import { InvalidArgumentError } from '../../errors/base.js';
|
|
26
27
|
import { FurnaceError } from '../../errors/furnace.js';
|
|
27
|
-
import {
|
|
28
|
-
import { pathExists, readText, writeText } from '../../utils/fs.js';
|
|
28
|
+
import { ensureDir, pathExists, readText, writeText } from '../../utils/fs.js';
|
|
29
29
|
import { intro, note, outro, warn } from '../../utils/logger.js';
|
|
30
30
|
import { generateBrowserWindowXhtml, generateChromeDocCss, generateChromeDocFtl, generateChromeDocJs, generateChromeDocXhtml, jarIncMnEntryForChromeDoc, jarMnEntriesForChromeDoc, localeJarMnEntryForChromeDoc, localesFtlWildcardCapturesScaffoldedName, } from './chrome-doc-templates.js';
|
|
31
31
|
import { chromeDocPackagingTestFileName, generateChromeDocPackagingManifest, generateChromeDocPackagingTest, } from './chrome-doc-tests.js';
|
|
@@ -189,7 +189,6 @@ async function performChromeDocMutations(args) {
|
|
|
189
189
|
for (const dir of [contentDir, sharedThemeDir, localeDir]) {
|
|
190
190
|
if (!(await pathExists(dir))) {
|
|
191
191
|
recordCreatedDir(journal, dir);
|
|
192
|
-
const { ensureDir } = await import('../../utils/fs.js');
|
|
193
192
|
await ensureDir(dir);
|
|
194
193
|
}
|
|
195
194
|
}
|
|
@@ -230,9 +229,9 @@ async function performChromeDocMutations(args) {
|
|
|
230
229
|
// wildcard already pick up the scaffolded FTL automatically — appending
|
|
231
230
|
// a per-file `locale/...` entry on top is at best dead weight and at
|
|
232
231
|
// worst a build error when the fork has dropped the `% locale browser`
|
|
233
|
-
// registration the per-file entry depends on. The wildcard predicate
|
|
234
|
-
//
|
|
235
|
-
//
|
|
232
|
+
// registration the per-file entry depends on. The wildcard predicate is
|
|
233
|
+
// intentionally narrow: only `%browser/`-rooted globs ending in `*.ftl`
|
|
234
|
+
// count as a capture.
|
|
236
235
|
if (await pathExists(localeJarMnPath)) {
|
|
237
236
|
const existingLocaleJar = await readText(localeJarMnPath);
|
|
238
237
|
if (localesFtlWildcardCapturesScaffoldedName(existingLocaleJar)) {
|
|
@@ -256,7 +255,6 @@ async function performChromeDocMutations(args) {
|
|
|
256
255
|
if (args.withTests) {
|
|
257
256
|
const testParentDir = `${args.binaryName}-xpcshell`;
|
|
258
257
|
const testDir = join(args.engineDir, 'browser/base/content/test', testParentDir, args.name);
|
|
259
|
-
const { ensureDir } = await import('../../utils/fs.js');
|
|
260
258
|
if (!(await pathExists(testDir))) {
|
|
261
259
|
recordCreatedDir(journal, testDir);
|
|
262
260
|
}
|
|
@@ -274,20 +272,12 @@ async function performChromeDocMutations(args) {
|
|
|
274
272
|
}
|
|
275
273
|
}
|
|
276
274
|
catch (error) {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
catch (rollbackError) {
|
|
284
|
-
// Matches the seven sibling mutation sites: when the rollback itself
|
|
285
|
-
// fails the engine is in an unknown state, so leave a breadcrumb for
|
|
286
|
-
// `doctor --repair-furnace` and let the rollback error win.
|
|
287
|
-
await recordFurnaceRollbackFailure(args.projectRoot, 'chrome-doc-rollback', `chrome-doc "${args.name}": ${toError(rollbackError).message}`);
|
|
288
|
-
throw rollbackError;
|
|
289
|
-
}
|
|
290
|
-
throw error;
|
|
275
|
+
return await completeJournalRollback(args.operationContext, journal, error, {
|
|
276
|
+
projectRoot: args.projectRoot,
|
|
277
|
+
operation: 'chrome-doc-rollback',
|
|
278
|
+
failureMessage: `Failed to scaffold chrome-doc "${args.name}"`,
|
|
279
|
+
subject: `chrome-doc "${args.name}"`,
|
|
280
|
+
});
|
|
291
281
|
}
|
|
292
282
|
return written;
|
|
293
283
|
}
|
|
@@ -303,18 +293,18 @@ export async function furnaceChromeDocCreateCommand(projectRoot, name, options =
|
|
|
303
293
|
const forgeConfig = await loadConfig(projectRoot);
|
|
304
294
|
const license = forgeConfig.license ?? DEFAULT_LICENSE;
|
|
305
295
|
const engineDir = join(projectRoot, 'engine');
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
}
|
|
296
|
+
await assertFurnaceEngineReady(projectRoot, {
|
|
297
|
+
engineMissingSuffix: ' to scaffold a chrome-doc.',
|
|
298
|
+
});
|
|
309
299
|
const browserWindow = options.browserWindow ?? false;
|
|
310
300
|
// The browser-window skeleton always carries its own titlebar markup and
|
|
311
301
|
// chrome attributes; --no-titlebar only applies to the generic scaffold.
|
|
312
302
|
const withTitlebar = browserWindow ? true : (options.titlebar ?? true);
|
|
313
303
|
const withTests = options.withTests ?? false;
|
|
314
|
-
// Hint: when the scaffolded document is the configured token-host
|
|
315
|
-
//
|
|
316
|
-
//
|
|
317
|
-
//
|
|
304
|
+
// Hint: when the scaffolded document is the configured token-host document
|
|
305
|
+
// (the fork's main browser window), the generic dialog-shaped scaffold is
|
|
306
|
+
// almost certainly wrong — correct jar.mn registrations, wrong document
|
|
307
|
+
// body.
|
|
318
308
|
if (!browserWindow && (await furnaceConfigExists(projectRoot))) {
|
|
319
309
|
try {
|
|
320
310
|
const furnaceConfig = await loadFurnaceConfig(projectRoot);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Browser-chrome test scaffolding for `furnace create --with-tests`,
|
|
3
|
-
* including the
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* including the `--test-dir` redirect and collision safety (existing
|
|
4
|
+
* manifests are appended to; head.js and test implementations are never
|
|
5
|
+
* overwritten). Split out of `create.ts` to keep that command file within
|
|
6
|
+
* the per-file line budget.
|
|
7
7
|
*/
|
|
8
8
|
import { type RollbackJournal } from '../../core/furnace-rollback.js';
|
|
9
9
|
import type { ProjectLicense } from '../../types/config.js';
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
3
|
* Browser-chrome test scaffolding for `furnace create --with-tests`,
|
|
4
|
-
* including the
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* including the `--test-dir` redirect and collision safety (existing
|
|
5
|
+
* manifests are appended to; head.js and test implementations are never
|
|
6
|
+
* overwritten). Split out of `create.ts` to keep that command file within
|
|
7
|
+
* the per-file line budget.
|
|
8
8
|
*/
|
|
9
9
|
import { join } from 'node:path';
|
|
10
10
|
import { recordCreatedDir, snapshotFile, } from '../../core/furnace-rollback.js';
|
|
11
11
|
import { getLicenseHeader } from '../../core/license-headers.js';
|
|
12
|
-
import { registerTestManifest } from '../../core/manifest-register.js';
|
|
12
|
+
import { registerTestManifest } from '../../core/moz-manifest-register.js';
|
|
13
13
|
import { InvalidArgumentError } from '../../errors/base.js';
|
|
14
14
|
import { toError } from '../../utils/errors.js';
|
|
15
15
|
import { ensureDir, pathExists, readText, writeText } from '../../utils/fs.js';
|
|
@@ -74,9 +74,9 @@ export async function scaffoldTestFiles(componentName, license, forgeConfig, pat
|
|
|
74
74
|
: strippedName;
|
|
75
75
|
const underscored = withoutBinaryPrefix.replace(/-/g, '_');
|
|
76
76
|
const testFileName = `browser_${binaryName}_${underscored}.js`;
|
|
77
|
-
// --test-dir redirects the scaffold
|
|
78
|
-
//
|
|
79
|
-
// different patch
|
|
77
|
+
// --test-dir redirects the scaffold: the hardcoded
|
|
78
|
+
// `.../test/<binaryName>/` target can collide with a test suite owned by a
|
|
79
|
+
// different patch. The manifest-registration name is the path below
|
|
80
80
|
// browser/base/content/test/ (nested manifests are supported).
|
|
81
81
|
const testDirRel = testDirOverride ?? `${TEST_SCAFFOLD_ROOT}${binaryName}`;
|
|
82
82
|
const testDirName = testDirRel.slice(TEST_SCAFFOLD_ROOT.length);
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
* MochiKit (chrome://mochikit) test-harness scaffolder for
|
|
3
3
|
* `fireforge furnace create --test-style=mochikit`.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* manifest tree — including those without a tabbrowser.
|
|
5
|
+
* Browser-chrome mochitests require a `tabbrowser` in the top-level chrome
|
|
6
|
+
* document, so forks with a bespoke chrome document that deliberately omits
|
|
7
|
+
* one cannot run them. MochiKit tests load the component module directly via
|
|
8
|
+
* `chrome://global/` and assert against `customElements`, so they work
|
|
9
|
+
* against any fork that registers the upstream toolkit test manifest tree —
|
|
10
|
+
* including those without a tabbrowser.
|
|
12
11
|
*/
|
|
13
12
|
import { type RollbackJournal } from '../../core/furnace-rollback.js';
|
|
14
13
|
import type { ProjectLicense } from '../../types/config.js';
|