@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
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* AST-based implementation: finds onUnload()/uninit() method body and
|
|
6
6
|
* inserts the destroy block at the top (LIFO ordering).
|
|
7
7
|
*
|
|
8
|
-
* `marker` is prefixed to the generated comment so wire-generated
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* `marker` is prefixed to the generated comment so wire-generated edits
|
|
9
|
+
* carry the patch-lint `// <MARKER>:` signature `lintModificationComments`
|
|
10
|
+
* looks for.
|
|
11
11
|
*/
|
|
12
12
|
export declare function addDestroyAST(content: string, expression: string, marker?: string): string;
|
|
13
13
|
/**
|
|
@@ -9,7 +9,7 @@ import { BuildError } from '../errors/build.js';
|
|
|
9
9
|
import { pathExists, readText, writeText } from '../utils/fs.js';
|
|
10
10
|
import { escapeRegex } from '../utils/regex.js';
|
|
11
11
|
import { asEstree, detectIndent, parseScript } from './ast-utils.js';
|
|
12
|
-
import { withParserFallback } from './parser-fallback.js';
|
|
12
|
+
import { isInternalInvariantFailure, withParserFallback } from './parser-fallback.js';
|
|
13
13
|
import { assertBraceBalancePreserved, coerceToCall, extractNameFromExpression, findMethodBody, findMethodBraceIndex, validateWireName, } from './wire-utils.js';
|
|
14
14
|
const BROWSER_INIT_JS = 'browser/base/content/browser-init.js';
|
|
15
15
|
const DEFAULT_MARKER = 'FIREFORGE:';
|
|
@@ -17,9 +17,9 @@ const DEFAULT_MARKER = 'FIREFORGE:';
|
|
|
17
17
|
* AST-based implementation: finds onUnload()/uninit() method body and
|
|
18
18
|
* inserts the destroy block at the top (LIFO ordering).
|
|
19
19
|
*
|
|
20
|
-
* `marker` is prefixed to the generated comment so wire-generated
|
|
21
|
-
*
|
|
22
|
-
*
|
|
20
|
+
* `marker` is prefixed to the generated comment so wire-generated edits
|
|
21
|
+
* carry the patch-lint `// <MARKER>:` signature `lintModificationComments`
|
|
22
|
+
* looks for.
|
|
23
23
|
*/
|
|
24
24
|
export function addDestroyAST(content, expression, marker = DEFAULT_MARKER) {
|
|
25
25
|
const name = extractNameFromExpression(expression);
|
|
@@ -110,22 +110,14 @@ export async function addDestroyToBrowserInit(engineDir, expression, marker = DE
|
|
|
110
110
|
const content = await readText(filePath);
|
|
111
111
|
// Idempotency check — look for the coerced (call) form because that is
|
|
112
112
|
// what the emitter writes. Matching against the raw input would miss a
|
|
113
|
-
//
|
|
114
|
-
//
|
|
113
|
+
// bare `X.destroy` invocation that coercion already persisted as
|
|
114
|
+
// `X.destroy()`.
|
|
115
115
|
const callExpression = coerceToCall(expression);
|
|
116
116
|
const destroyPattern = new RegExp(`(?:^|\\W)${escapeRegex(callExpression)}\\s*;?\\s*$`, 'm');
|
|
117
117
|
if (destroyPattern.test(content)) {
|
|
118
118
|
return false;
|
|
119
119
|
}
|
|
120
|
-
const { value, usedFallback } = withParserFallback(() => addDestroyAST(content, expression, marker), () => legacyAddDestroy(content, expression, marker), BROWSER_INIT_JS,
|
|
121
|
-
// Rethrow only the internal-invariant GeneralErrors ("Unexpected empty
|
|
122
|
-
// …array"): those are programming bugs, and retrying the legacy scanner
|
|
123
|
-
// cannot fix a broken invariant — it just buries the stack. Everything
|
|
124
|
-
// else still falls back, which is load-bearing: the AST path raises a raw
|
|
125
|
-
// acorn SyntaxError on chrome sources acorn cannot parse (preprocessor
|
|
126
|
-
// directives), and BuildError when the file's shape is unexpected. Both
|
|
127
|
-
// are exactly what the legacy scanner is here to handle.
|
|
128
|
-
(error) => error instanceof GeneralError);
|
|
120
|
+
const { value, usedFallback } = withParserFallback(() => addDestroyAST(content, expression, marker), () => legacyAddDestroy(content, expression, marker), BROWSER_INIT_JS, isInternalInvariantFailure);
|
|
129
121
|
if (usedFallback) {
|
|
130
122
|
assertBraceBalancePreserved(content, value, BROWSER_INIT_JS);
|
|
131
123
|
}
|
|
@@ -13,24 +13,16 @@ export declare const DEFAULT_DOM_TARGET = "browser/base/content/browser.xhtml";
|
|
|
13
13
|
*/
|
|
14
14
|
export declare function addDomFragmentTokenized(content: string, includeDirective: string): string;
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* directive (the idempotent-skip case) OR offers a locatable insertion
|
|
23
|
-
* point via {@link addDomFragmentTokenized} / {@link legacyAddDomFragment}.
|
|
24
|
-
* Throws the same `Could not find insertion point in chrome document`
|
|
25
|
-
* error the real run would throw when neither condition holds.
|
|
16
|
+
* Dry-run precheck for `addDomFragment`. Reads the resolved chrome document
|
|
17
|
+
* and verifies it either already contains the `#include` directive (the
|
|
18
|
+
* idempotent-skip case) OR offers a locatable insertion point via
|
|
19
|
+
* {@link addDomFragmentTokenized} / {@link legacyAddDomFragment}. Throws the
|
|
20
|
+
* same `Could not find insertion point in chrome document` error the real
|
|
21
|
+
* run would throw when neither condition holds.
|
|
26
22
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* `--dry-run` threw `Could not find insertion point in chrome document`
|
|
31
|
-
* on the same arguments. The real run had always called the insertion
|
|
32
|
-
* helpers; dry-run did not. This helper runs the same check in the
|
|
33
|
-
* preview pass so plan and execution disagree less.
|
|
23
|
+
* Without it, `wire --dry-run` previews a plausible mutation plan while the
|
|
24
|
+
* real run throws on the same arguments, because only the real run called
|
|
25
|
+
* the insertion helpers.
|
|
34
26
|
*/
|
|
35
27
|
export declare function probeDomFragmentInsertionPoint(engineDir: string, domFilePath: string, targetPath?: string): Promise<void>;
|
|
36
28
|
/**
|
|
@@ -13,7 +13,6 @@ import { GeneralError } from '../errors/base.js';
|
|
|
13
13
|
import { pathExists, readText, writeText } from '../utils/fs.js';
|
|
14
14
|
import { toRootRelativePath } from '../utils/paths.js';
|
|
15
15
|
import { escapeRegex } from '../utils/regex.js';
|
|
16
|
-
import { withParserFallback } from './parser-fallback.js';
|
|
17
16
|
import { tokenizeXhtml } from './wire-utils.js';
|
|
18
17
|
export const DEFAULT_DOM_TARGET = 'browser/base/content/browser.xhtml';
|
|
19
18
|
/**
|
|
@@ -48,48 +47,16 @@ export function addDomFragmentTokenized(content, includeDirective) {
|
|
|
48
47
|
return lines.join('\n');
|
|
49
48
|
}
|
|
50
49
|
/**
|
|
51
|
-
*
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const line = lines[i] ?? '';
|
|
58
|
-
if (/browser-sets\.inc/.test(line)) {
|
|
59
|
-
insertIndex = i;
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (insertIndex === -1) {
|
|
64
|
-
for (let i = 0; i < lines.length; i++) {
|
|
65
|
-
const line = lines[i] ?? '';
|
|
66
|
-
if (/<html:body/.test(line)) {
|
|
67
|
-
insertIndex = i + 1;
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
if (insertIndex === -1) {
|
|
73
|
-
throw new GeneralError('Could not find insertion point in chrome document');
|
|
74
|
-
}
|
|
75
|
-
lines.splice(insertIndex, 0, includeDirective);
|
|
76
|
-
return lines.join('\n');
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Dry-run precheck for `addDomFragment`. Reads the resolved chrome
|
|
80
|
-
* document and verifies it either already contains the `#include`
|
|
81
|
-
* directive (the idempotent-skip case) OR offers a locatable insertion
|
|
82
|
-
* point via {@link addDomFragmentTokenized} / {@link legacyAddDomFragment}.
|
|
83
|
-
* Throws the same `Could not find insertion point in chrome document`
|
|
84
|
-
* error the real run would throw when neither condition holds.
|
|
50
|
+
* Dry-run precheck for `addDomFragment`. Reads the resolved chrome document
|
|
51
|
+
* and verifies it either already contains the `#include` directive (the
|
|
52
|
+
* idempotent-skip case) OR offers a locatable insertion point via
|
|
53
|
+
* {@link addDomFragmentTokenized} / {@link legacyAddDomFragment}. Throws the
|
|
54
|
+
* same `Could not find insertion point in chrome document` error the real
|
|
55
|
+
* run would throw when neither condition holds.
|
|
85
56
|
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* `--dry-run` threw `Could not find insertion point in chrome document`
|
|
90
|
-
* on the same arguments. The real run had always called the insertion
|
|
91
|
-
* helpers; dry-run did not. This helper runs the same check in the
|
|
92
|
-
* preview pass so plan and execution disagree less.
|
|
57
|
+
* Without it, `wire --dry-run` previews a plausible mutation plan while the
|
|
58
|
+
* real run throws on the same arguments, because only the real run called
|
|
59
|
+
* the insertion helpers.
|
|
93
60
|
*/
|
|
94
61
|
export async function probeDomFragmentInsertionPoint(engineDir, domFilePath, targetPath = DEFAULT_DOM_TARGET) {
|
|
95
62
|
const targetAbsPath = join(engineDir, targetPath);
|
|
@@ -113,7 +80,7 @@ export async function probeDomFragmentInsertionPoint(engineDir, domFilePath, tar
|
|
|
113
80
|
// Check the tokenised and legacy insertion paths symmetrically with
|
|
114
81
|
// the real run. Either helper returning without throwing is sufficient
|
|
115
82
|
// evidence that the real run can land the directive.
|
|
116
|
-
|
|
83
|
+
addDomFragmentTokenized(content, includeDirective);
|
|
117
84
|
}
|
|
118
85
|
/**
|
|
119
86
|
* Inserts a `#include` directive for an `.inc.xhtml` file into the top-level
|
|
@@ -177,7 +144,7 @@ export async function addDomFragment(engineDir, domFilePath, targetPath = DEFAUL
|
|
|
177
144
|
}
|
|
178
145
|
}
|
|
179
146
|
// Normal insertion
|
|
180
|
-
const
|
|
147
|
+
const value = addDomFragmentTokenized(content, includeDirective);
|
|
181
148
|
await writeText(targetAbsPath, value);
|
|
182
149
|
return true;
|
|
183
150
|
}
|
|
@@ -8,9 +8,8 @@
|
|
|
8
8
|
*
|
|
9
9
|
* `marker` is prepended (uppercased) to the generated comment line so the
|
|
10
10
|
* emitted block carries the patch-lint `// <MARKER>:` signature that
|
|
11
|
-
* `lintModificationComments` looks for
|
|
12
|
-
* `wire` trips `missing-modification-comment` on wire-generated edits
|
|
13
|
-
* exactly the eval 1 Finding #9 regression.
|
|
11
|
+
* `lintModificationComments` looks for; otherwise the first export after
|
|
12
|
+
* `wire` trips `missing-modification-comment` on wire-generated edits.
|
|
14
13
|
*/
|
|
15
14
|
export declare function addInitAST(content: string, expression: string, after?: string, marker?: string): string;
|
|
16
15
|
/**
|
|
@@ -9,7 +9,7 @@ import { BuildError } from '../errors/build.js';
|
|
|
9
9
|
import { pathExists, readText, writeText } from '../utils/fs.js';
|
|
10
10
|
import { escapeRegex } from '../utils/regex.js';
|
|
11
11
|
import { asEstree, detectIndent, getNodeSource, parseScript, } from './ast-utils.js';
|
|
12
|
-
import { withParserFallback } from './parser-fallback.js';
|
|
12
|
+
import { isInternalInvariantFailure, withParserFallback } from './parser-fallback.js';
|
|
13
13
|
import { assertBraceBalancePreserved, coerceToCall, extractNameFromExpression, findInsertionAfterFireforgeBlocks, findMethodBody, findMethodBraceIndex, validateWireName, walkToTryBlockEnd, } from './wire-utils.js';
|
|
14
14
|
const BROWSER_INIT_JS = 'browser/base/content/browser-init.js';
|
|
15
15
|
/**
|
|
@@ -23,10 +23,9 @@ const DEFAULT_MARKER = 'FIREFORGE:';
|
|
|
23
23
|
* the top of the method body when there is none.
|
|
24
24
|
*
|
|
25
25
|
* Both callers below — the `--after`-target-not-found fallthrough and the
|
|
26
|
-
* no-`--after` default —
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* implementation enforces the invariant rather than merely tidying.
|
|
26
|
+
* no-`--after` default — must emit identical blocks, since `browser-init.js`
|
|
27
|
+
* is written through both paths. One implementation enforces that invariant
|
|
28
|
+
* rather than merely tidying.
|
|
30
29
|
*/
|
|
31
30
|
function resolveDefaultInsertion(content, body, fireforgeBlocks) {
|
|
32
31
|
if (fireforgeBlocks.length > 0) {
|
|
@@ -49,9 +48,8 @@ function resolveDefaultInsertion(content, body, fireforgeBlocks) {
|
|
|
49
48
|
*
|
|
50
49
|
* `marker` is prepended (uppercased) to the generated comment line so the
|
|
51
50
|
* emitted block carries the patch-lint `// <MARKER>:` signature that
|
|
52
|
-
* `lintModificationComments` looks for
|
|
53
|
-
* `wire` trips `missing-modification-comment` on wire-generated edits
|
|
54
|
-
* exactly the eval 1 Finding #9 regression.
|
|
51
|
+
* `lintModificationComments` looks for; otherwise the first export after
|
|
52
|
+
* `wire` trips `missing-modification-comment` on wire-generated edits.
|
|
55
53
|
*/
|
|
56
54
|
export function addInitAST(content, expression, after, marker = DEFAULT_MARKER) {
|
|
57
55
|
const name = extractNameFromExpression(expression);
|
|
@@ -206,22 +204,13 @@ export async function addInitToBrowserInit(engineDir, expression, after, marker
|
|
|
206
204
|
const content = await readText(filePath);
|
|
207
205
|
// Idempotency check — look for the coerced (call) form because that is
|
|
208
206
|
// what the emitter writes. Matching against the raw input would miss a
|
|
209
|
-
//
|
|
210
|
-
// already persisted as `EvalStartup.init()`.
|
|
207
|
+
// bare `X.init` invocation that coercion already persisted as `X.init()`.
|
|
211
208
|
const callExpression = coerceToCall(expression);
|
|
212
209
|
const initPattern = new RegExp(`(?:^|\\W)${escapeRegex(callExpression)}\\s*;?\\s*$`, 'm');
|
|
213
210
|
if (initPattern.test(content)) {
|
|
214
211
|
return false;
|
|
215
212
|
}
|
|
216
|
-
const { value, usedFallback } = withParserFallback(() => addInitAST(content, expression, after, marker), () => legacyAddInit(content, expression, after, marker), BROWSER_INIT_JS,
|
|
217
|
-
// Rethrow only the internal-invariant GeneralErrors ("Unexpected empty
|
|
218
|
-
// …array"): those are programming bugs, and retrying the legacy scanner
|
|
219
|
-
// cannot fix a broken invariant — it just buries the stack. Everything
|
|
220
|
-
// else still falls back, which is load-bearing: the AST path raises a raw
|
|
221
|
-
// acorn SyntaxError on chrome sources acorn cannot parse (preprocessor
|
|
222
|
-
// directives), and BuildError when the file's shape is unexpected. Both
|
|
223
|
-
// are exactly what the legacy scanner is here to handle.
|
|
224
|
-
(error) => error instanceof GeneralError);
|
|
213
|
+
const { value, usedFallback } = withParserFallback(() => addInitAST(content, expression, after, marker), () => legacyAddInit(content, expression, after, marker), BROWSER_INIT_JS, isInternalInvariantFailure);
|
|
225
214
|
if (usedFallback) {
|
|
226
215
|
assertBraceBalancePreserved(content, value, BROWSER_INIT_JS);
|
|
227
216
|
}
|
|
@@ -5,9 +5,8 @@
|
|
|
5
5
|
* AST-based implementation: finds the last try/catch containing
|
|
6
6
|
* `loadSubScript` and inserts a new try/catch block after it.
|
|
7
7
|
*
|
|
8
|
-
* The inserted block carries a `// <MARKER>: wire-subscript ...` comment
|
|
9
|
-
*
|
|
10
|
-
* Finding #9).
|
|
8
|
+
* The inserted block carries a `// <MARKER>: wire-subscript ...` comment so
|
|
9
|
+
* the emitted edit satisfies `lintModificationComments`.
|
|
11
10
|
*/
|
|
12
11
|
export declare function addSubscriptAST(content: string, name: string, marker?: string): string;
|
|
13
12
|
/**
|
|
@@ -8,7 +8,7 @@ import { GeneralError } from '../errors/base.js';
|
|
|
8
8
|
import { BuildError } from '../errors/build.js';
|
|
9
9
|
import { pathExists, readText, writeText } from '../utils/fs.js';
|
|
10
10
|
import { asEstree, detectIndent, getNodeSource, parseScript, walkAST, } from './ast-utils.js';
|
|
11
|
-
import { withParserFallback } from './parser-fallback.js';
|
|
11
|
+
import { isInternalInvariantFailure, withParserFallback } from './parser-fallback.js';
|
|
12
12
|
import { assertBraceBalancePreserved, findNearestTryLine, validateWireName, walkToTryBlockEnd, } from './wire-utils.js';
|
|
13
13
|
const BROWSER_MAIN_JS = 'browser/base/content/browser-main.js';
|
|
14
14
|
const DEFAULT_MARKER = 'FIREFORGE:';
|
|
@@ -16,9 +16,8 @@ const DEFAULT_MARKER = 'FIREFORGE:';
|
|
|
16
16
|
* AST-based implementation: finds the last try/catch containing
|
|
17
17
|
* `loadSubScript` and inserts a new try/catch block after it.
|
|
18
18
|
*
|
|
19
|
-
* The inserted block carries a `// <MARKER>: wire-subscript ...` comment
|
|
20
|
-
*
|
|
21
|
-
* Finding #9).
|
|
19
|
+
* The inserted block carries a `// <MARKER>: wire-subscript ...` comment so
|
|
20
|
+
* the emitted edit satisfies `lintModificationComments`.
|
|
22
21
|
*/
|
|
23
22
|
export function addSubscriptAST(content, name, marker = DEFAULT_MARKER) {
|
|
24
23
|
const ast = parseScript(content);
|
|
@@ -137,15 +136,7 @@ export async function addSubscriptToBrowserMain(engineDir, name, marker = DEFAUL
|
|
|
137
136
|
if (content.includes(`content/${name}.js"`)) {
|
|
138
137
|
return false;
|
|
139
138
|
}
|
|
140
|
-
const { value, usedFallback } = withParserFallback(() => addSubscriptAST(content, name, marker), () => legacyAddSubscript(content, name, marker), BROWSER_MAIN_JS,
|
|
141
|
-
// Rethrow only the internal-invariant GeneralErrors ("Unexpected empty
|
|
142
|
-
// …array"): those are programming bugs, and retrying the legacy scanner
|
|
143
|
-
// cannot fix a broken invariant — it just buries the stack. Everything
|
|
144
|
-
// else still falls back, which is load-bearing: the AST path raises a raw
|
|
145
|
-
// acorn SyntaxError on chrome sources acorn cannot parse (preprocessor
|
|
146
|
-
// directives), and BuildError when the file's shape is unexpected. Both
|
|
147
|
-
// are exactly what the legacy scanner is here to handle.
|
|
148
|
-
(error) => error instanceof GeneralError);
|
|
139
|
+
const { value, usedFallback } = withParserFallback(() => addSubscriptAST(content, name, marker), () => legacyAddSubscript(content, name, marker), BROWSER_MAIN_JS, isInternalInvariantFailure);
|
|
149
140
|
if (usedFallback) {
|
|
150
141
|
assertBraceBalancePreserved(content, value, BROWSER_MAIN_JS);
|
|
151
142
|
}
|
|
@@ -9,15 +9,14 @@ export declare function validateWireName(value: string, label: string): void;
|
|
|
9
9
|
* Coerces an init/destroy expression into a function call by appending `()`
|
|
10
10
|
* when the caller passed a bare property chain. Idempotent: an expression
|
|
11
11
|
* already ending in `()` is returned unchanged, so operators can pass either
|
|
12
|
-
* `
|
|
12
|
+
* `Startup.init` or `Startup.init()` and get the same wired output.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
* the
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* never fired at runtime. Coercion at the template site closes that gap.
|
|
14
|
+
* `validateWireName` accepts both shapes, but the generated block
|
|
15
|
+
* interpolates the expression verbatim inside `${expression};` — so a bare
|
|
16
|
+
* `Startup.init` emits `Startup.init;`, a plain property reference that
|
|
17
|
+
* never invokes the lifecycle hook. The symptom is silent: `wire` reports
|
|
18
|
+
* success and the browser-init block looks plausible, but the hook never
|
|
19
|
+
* fires at runtime.
|
|
21
20
|
*/
|
|
22
21
|
export declare function coerceToCall(expression: string): string;
|
|
23
22
|
/**
|
|
@@ -21,15 +21,14 @@ export function validateWireName(value, label) {
|
|
|
21
21
|
* Coerces an init/destroy expression into a function call by appending `()`
|
|
22
22
|
* when the caller passed a bare property chain. Idempotent: an expression
|
|
23
23
|
* already ending in `()` is returned unchanged, so operators can pass either
|
|
24
|
-
* `
|
|
24
|
+
* `Startup.init` or `Startup.init()` and get the same wired output.
|
|
25
25
|
*
|
|
26
|
-
*
|
|
27
|
-
* the
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* never fired at runtime. Coercion at the template site closes that gap.
|
|
26
|
+
* `validateWireName` accepts both shapes, but the generated block
|
|
27
|
+
* interpolates the expression verbatim inside `${expression};` — so a bare
|
|
28
|
+
* `Startup.init` emits `Startup.init;`, a plain property reference that
|
|
29
|
+
* never invokes the lifecycle hook. The symptom is silent: `wire` reports
|
|
30
|
+
* success and the browser-init block looks plausible, but the hook never
|
|
31
|
+
* fires at runtime.
|
|
33
32
|
*/
|
|
34
33
|
export function coerceToCall(expression) {
|
|
35
34
|
return expression.endsWith('()') ? expression : `${expression}()`;
|
|
@@ -8,33 +8,32 @@
|
|
|
8
8
|
* The upstream xpcshell harness computes the manifest key for the appdir
|
|
9
9
|
* override as `mozInfo["appname"] + "-appdir"`. On a stock Firefox build the
|
|
10
10
|
* key is `firefox-appdir`, so the very common `firefox-appdir = "browser"`
|
|
11
|
-
* directive is honoured. On a rebranded fork (appname=`mybrowser
|
|
12
|
-
* harness looks for `mybrowser-appdir`
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
11
|
+
* directive is honoured. On a rebranded fork (appname=`mybrowser`) the
|
|
12
|
+
* harness looks for `mybrowser-appdir` — the literal `firefox-appdir` line
|
|
13
|
+
* is silently ignored, `appPath` falls back to `xrePath`, and every
|
|
14
|
+
* `resource:///modules/…` import throws `Failed to load
|
|
15
|
+
* resource:///modules/<name>.sys.mjs` because xpcshell resolves the
|
|
16
|
+
* `resource:///` prefix one level above the real app root.
|
|
17
17
|
*
|
|
18
18
|
* ## Strategy
|
|
19
19
|
*
|
|
20
20
|
* 1. For each test path the operator handed us, find the nearest
|
|
21
21
|
* `xpcshell.toml`. If none exists, the test is not an xpcshell test and
|
|
22
|
-
* nothing to inject.
|
|
22
|
+
* there is nothing to inject.
|
|
23
23
|
* 2. Read the manifest's `[DEFAULT]` section. Look for `<appname>-appdir`
|
|
24
|
-
* first — if present, the harness already finds it
|
|
25
|
-
*
|
|
26
|
-
*
|
|
24
|
+
* first — if present, the harness already finds it. Fall back to
|
|
25
|
+
* `firefox-appdir`. This ordering matches upstream precedence and avoids
|
|
26
|
+
* overriding an operator who already migrated.
|
|
27
27
|
* 3. If only `firefox-appdir` is present and `appname != "firefox"`, compute
|
|
28
|
-
* the absolute app dir path against the active `obj-X/dist` tree
|
|
29
|
-
*
|
|
30
|
-
* Resources/<value>` for the macOS packaged
|
|
31
|
-
* the value to pass to `--app-path`.
|
|
32
|
-
* 4. If multiple test paths disagree on the resolved value
|
|
33
|
-
* manifest sets `browser`, another sets `xulrunner`), refuse injection
|
|
28
|
+
* the absolute app dir path against the active `obj-X/dist` tree (probing
|
|
29
|
+
* `dist/bin/<value>` first, then any
|
|
30
|
+
* `dist/<bundle>.app/Contents/Resources/<value>` for the macOS packaged
|
|
31
|
+
* layout) and return it as the value to pass to `--app-path`.
|
|
32
|
+
* 4. If multiple test paths disagree on the resolved value, refuse injection
|
|
34
33
|
* and return null — the operator can drop down to `--mach-arg`.
|
|
35
34
|
*
|
|
36
|
-
* Operator escape
|
|
37
|
-
* test.ts
|
|
35
|
+
* Operator escape hatch: `--mach-arg=--app-path=…` always wins (handled in
|
|
36
|
+
* test.ts, which skips injection when `--app-path=` already appears in the
|
|
38
37
|
* forwarded args).
|
|
39
38
|
*/
|
|
40
39
|
/**
|
|
@@ -75,15 +74,14 @@ export declare function parseAppdirFromToml(tomlText: string, key: string): {
|
|
|
75
74
|
* returns the absolute path of the first sibling `xpcshell.toml` found.
|
|
76
75
|
* Stops at `engineDir` (inclusive) and returns null on miss.
|
|
77
76
|
*
|
|
78
|
-
* Special-cases `startPath` itself when it already ends with
|
|
79
|
-
*
|
|
77
|
+
* Special-cases `startPath` itself when it already ends with `xpcshell.toml`
|
|
78
|
+
* — operators sometimes pass a manifest path directly.
|
|
80
79
|
*
|
|
81
80
|
* When `startPath` is a DIRECTORY, the walk starts at the directory itself
|
|
82
|
-
* (checking `<dir>/xpcshell.toml` first) rather than at its parent.
|
|
83
|
-
*
|
|
84
|
-
* `
|
|
85
|
-
*
|
|
86
|
-
* the mochitest runner, which found no mochitests.
|
|
81
|
+
* (checking `<dir>/xpcshell.toml` first) rather than at its parent.
|
|
82
|
+
* Starting at the parent misses a directory's own manifest, so
|
|
83
|
+
* `fireforge test <dir>` classifies it non-xpcshell and dispatches to the
|
|
84
|
+
* mochitest runner, which finds no mochitests.
|
|
87
85
|
*/
|
|
88
86
|
export declare function findNearestXpcshellManifest(engineDir: string, startPath: string): Promise<string | null>;
|
|
89
87
|
/**
|
|
@@ -96,32 +94,27 @@ export declare function findNearestXpcshellManifest(engineDir: string, startPath
|
|
|
96
94
|
*/
|
|
97
95
|
export declare function readMozinfoAppname(objDirPath: string): Promise<string>;
|
|
98
96
|
/**
|
|
99
|
-
* Probes the obj-dir's `dist/` subtree for the absolute path
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* symptom and confuses triage).
|
|
97
|
+
* Probes the obj-dir's `dist/` subtree for the absolute path the harness
|
|
98
|
+
* would have computed if the manifest key had been honoured. Returns null
|
|
99
|
+
* when no candidate exists — better to skip injection silently than to point
|
|
100
|
+
* the harness at a path that does not exist, which fails with a different
|
|
101
|
+
* error than the original symptom and confuses triage.
|
|
105
102
|
*
|
|
106
103
|
* Probe order differs by host platform:
|
|
107
104
|
*
|
|
108
|
-
* - **macOS (`darwin`)**: prefer
|
|
109
|
-
*
|
|
110
|
-
*
|
|
105
|
+
* - **macOS (`darwin`)**: prefer
|
|
106
|
+
* `<objDir>/dist/<App>.app/Contents/Resources/<value>` FIRST, then fall
|
|
107
|
+
* back to `<objDir>/dist/bin/<value>`. On macOS `dist/bin` is symlinked to
|
|
111
108
|
* `dist/<App>.app/Contents/MacOS/` (the *binaries* directory), so
|
|
112
|
-
* `dist/bin/browser`
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* successful (the info log showed it) but pointed at a directory
|
|
118
|
-
* without the modules tree, so every `resource:///modules/…` import
|
|
119
|
-
* still threw.
|
|
120
|
-
* - **non-macOS**: keep the historical order — `dist/bin/<value>` first,
|
|
109
|
+
* `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser/` —
|
|
110
|
+
* NOT where `resource:///modules/` is rooted. Injecting that path looks
|
|
111
|
+
* successful in the log but points at a directory with no modules tree, so
|
|
112
|
+
* every `resource:///modules/…` import still throws.
|
|
113
|
+
* - **non-macOS**: `dist/bin/<value>` first,
|
|
121
114
|
* `.app/Contents/Resources/<value>` as fallback.
|
|
122
115
|
*
|
|
123
|
-
* On both platforms the final `.app` fallback iterates every `*.app`
|
|
124
|
-
*
|
|
116
|
+
* On both platforms the final `.app` fallback iterates every `*.app` entry
|
|
117
|
+
* because a rebranded fork may pick an arbitrary app name.
|
|
125
118
|
*/
|
|
126
119
|
export declare function resolveAbsoluteAppPath(objDirAbs: string, relativeAppdir: string): Promise<string | null>;
|
|
127
120
|
/**
|
|
@@ -9,33 +9,32 @@
|
|
|
9
9
|
* The upstream xpcshell harness computes the manifest key for the appdir
|
|
10
10
|
* override as `mozInfo["appname"] + "-appdir"`. On a stock Firefox build the
|
|
11
11
|
* key is `firefox-appdir`, so the very common `firefox-appdir = "browser"`
|
|
12
|
-
* directive is honoured. On a rebranded fork (appname=`mybrowser
|
|
13
|
-
* harness looks for `mybrowser-appdir`
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
12
|
+
* directive is honoured. On a rebranded fork (appname=`mybrowser`) the
|
|
13
|
+
* harness looks for `mybrowser-appdir` — the literal `firefox-appdir` line
|
|
14
|
+
* is silently ignored, `appPath` falls back to `xrePath`, and every
|
|
15
|
+
* `resource:///modules/…` import throws `Failed to load
|
|
16
|
+
* resource:///modules/<name>.sys.mjs` because xpcshell resolves the
|
|
17
|
+
* `resource:///` prefix one level above the real app root.
|
|
18
18
|
*
|
|
19
19
|
* ## Strategy
|
|
20
20
|
*
|
|
21
21
|
* 1. For each test path the operator handed us, find the nearest
|
|
22
22
|
* `xpcshell.toml`. If none exists, the test is not an xpcshell test and
|
|
23
|
-
* nothing to inject.
|
|
23
|
+
* there is nothing to inject.
|
|
24
24
|
* 2. Read the manifest's `[DEFAULT]` section. Look for `<appname>-appdir`
|
|
25
|
-
* first — if present, the harness already finds it
|
|
26
|
-
*
|
|
27
|
-
*
|
|
25
|
+
* first — if present, the harness already finds it. Fall back to
|
|
26
|
+
* `firefox-appdir`. This ordering matches upstream precedence and avoids
|
|
27
|
+
* overriding an operator who already migrated.
|
|
28
28
|
* 3. If only `firefox-appdir` is present and `appname != "firefox"`, compute
|
|
29
|
-
* the absolute app dir path against the active `obj-X/dist` tree
|
|
30
|
-
*
|
|
31
|
-
* Resources/<value>` for the macOS packaged
|
|
32
|
-
* the value to pass to `--app-path`.
|
|
33
|
-
* 4. If multiple test paths disagree on the resolved value
|
|
34
|
-
* manifest sets `browser`, another sets `xulrunner`), refuse injection
|
|
29
|
+
* the absolute app dir path against the active `obj-X/dist` tree (probing
|
|
30
|
+
* `dist/bin/<value>` first, then any
|
|
31
|
+
* `dist/<bundle>.app/Contents/Resources/<value>` for the macOS packaged
|
|
32
|
+
* layout) and return it as the value to pass to `--app-path`.
|
|
33
|
+
* 4. If multiple test paths disagree on the resolved value, refuse injection
|
|
35
34
|
* and return null — the operator can drop down to `--mach-arg`.
|
|
36
35
|
*
|
|
37
|
-
* Operator escape
|
|
38
|
-
* test.ts
|
|
36
|
+
* Operator escape hatch: `--mach-arg=--app-path=…` always wins (handled in
|
|
37
|
+
* test.ts, which skips injection when `--app-path=` already appears in the
|
|
39
38
|
* forwarded args).
|
|
40
39
|
*/
|
|
41
40
|
import { readdir, stat } from 'node:fs/promises';
|
|
@@ -106,15 +105,14 @@ function stripQuotes(raw) {
|
|
|
106
105
|
* returns the absolute path of the first sibling `xpcshell.toml` found.
|
|
107
106
|
* Stops at `engineDir` (inclusive) and returns null on miss.
|
|
108
107
|
*
|
|
109
|
-
* Special-cases `startPath` itself when it already ends with
|
|
110
|
-
*
|
|
108
|
+
* Special-cases `startPath` itself when it already ends with `xpcshell.toml`
|
|
109
|
+
* — operators sometimes pass a manifest path directly.
|
|
111
110
|
*
|
|
112
111
|
* When `startPath` is a DIRECTORY, the walk starts at the directory itself
|
|
113
|
-
* (checking `<dir>/xpcshell.toml` first) rather than at its parent.
|
|
114
|
-
*
|
|
115
|
-
* `
|
|
116
|
-
*
|
|
117
|
-
* the mochitest runner, which found no mochitests.
|
|
112
|
+
* (checking `<dir>/xpcshell.toml` first) rather than at its parent.
|
|
113
|
+
* Starting at the parent misses a directory's own manifest, so
|
|
114
|
+
* `fireforge test <dir>` classifies it non-xpcshell and dispatches to the
|
|
115
|
+
* mochitest runner, which finds no mochitests.
|
|
118
116
|
*/
|
|
119
117
|
export async function findNearestXpcshellManifest(engineDir, startPath) {
|
|
120
118
|
const absStart = resolve(engineDir, startPath);
|
|
@@ -164,32 +162,27 @@ export async function readMozinfoAppname(objDirPath) {
|
|
|
164
162
|
return 'firefox';
|
|
165
163
|
}
|
|
166
164
|
/**
|
|
167
|
-
* Probes the obj-dir's `dist/` subtree for the absolute path
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
* symptom and confuses triage).
|
|
165
|
+
* Probes the obj-dir's `dist/` subtree for the absolute path the harness
|
|
166
|
+
* would have computed if the manifest key had been honoured. Returns null
|
|
167
|
+
* when no candidate exists — better to skip injection silently than to point
|
|
168
|
+
* the harness at a path that does not exist, which fails with a different
|
|
169
|
+
* error than the original symptom and confuses triage.
|
|
173
170
|
*
|
|
174
171
|
* Probe order differs by host platform:
|
|
175
172
|
*
|
|
176
|
-
* - **macOS (`darwin`)**: prefer
|
|
177
|
-
*
|
|
178
|
-
*
|
|
173
|
+
* - **macOS (`darwin`)**: prefer
|
|
174
|
+
* `<objDir>/dist/<App>.app/Contents/Resources/<value>` FIRST, then fall
|
|
175
|
+
* back to `<objDir>/dist/bin/<value>`. On macOS `dist/bin` is symlinked to
|
|
179
176
|
* `dist/<App>.app/Contents/MacOS/` (the *binaries* directory), so
|
|
180
|
-
* `dist/bin/browser`
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
* successful (the info log showed it) but pointed at a directory
|
|
186
|
-
* without the modules tree, so every `resource:///modules/…` import
|
|
187
|
-
* still threw.
|
|
188
|
-
* - **non-macOS**: keep the historical order — `dist/bin/<value>` first,
|
|
177
|
+
* `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser/` —
|
|
178
|
+
* NOT where `resource:///modules/` is rooted. Injecting that path looks
|
|
179
|
+
* successful in the log but points at a directory with no modules tree, so
|
|
180
|
+
* every `resource:///modules/…` import still throws.
|
|
181
|
+
* - **non-macOS**: `dist/bin/<value>` first,
|
|
189
182
|
* `.app/Contents/Resources/<value>` as fallback.
|
|
190
183
|
*
|
|
191
|
-
* On both platforms the final `.app` fallback iterates every `*.app`
|
|
192
|
-
*
|
|
184
|
+
* On both platforms the final `.app` fallback iterates every `*.app` entry
|
|
185
|
+
* because a rebranded fork may pick an arbitrary app name.
|
|
193
186
|
*/
|
|
194
187
|
export async function resolveAbsoluteAppPath(objDirAbs, relativeAppdir) {
|
|
195
188
|
const distBinCandidate = join(objDirAbs, 'dist', 'bin', relativeAppdir);
|