@hominis/fireforge 0.45.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +409 -446
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +21 -15
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +46 -0
- package/dist/src/cli-usage-error.js +81 -0
- package/dist/src/cli.d.ts +7 -2
- package/dist/src/cli.js +47 -47
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +3 -4
- package/dist/src/commands/build.js +27 -17
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +19 -0
- package/dist/src/commands/destructive-decision.js +31 -0
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -10
- package/dist/src/commands/doctor-check-core.js +0 -8
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
- package/dist/src/commands/doctor-orphaned-harness.js +14 -23
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +3 -1
- package/dist/src/commands/doctor.js +15 -16
- package/dist/src/commands/download.js +50 -37
- package/dist/src/commands/export-all.js +29 -12
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +29 -59
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +12 -12
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +7 -13
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +4 -6
- package/dist/src/commands/export-shared.d.ts +51 -32
- package/dist/src/commands/export-shared.js +17 -32
- package/dist/src/commands/export.js +14 -5
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
- package/dist/src/commands/furnace/authoring-config.js +19 -0
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +7 -12
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +6 -9
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +31 -15
- package/dist/src/commands/furnace/create-templates.js +20 -19
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +35 -29
- package/dist/src/commands/furnace/deploy.js +15 -6
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +17 -16
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +43 -34
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +15 -7
- package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
- package/dist/src/commands/furnace/remove-mutations.js +19 -19
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +4 -8
- package/dist/src/commands/furnace/rename-browser-test.js +10 -15
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +36 -36
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +19 -16
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
- package/dist/src/commands/furnace/test-file-name.js +39 -0
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/furnace/validation-output.d.ts +21 -9
- package/dist/src/commands/furnace/validation-output.js +3 -8
- package/dist/src/commands/import.js +22 -29
- package/dist/src/commands/lint-per-patch.d.ts +2 -2
- package/dist/src/commands/lint-per-patch.js +27 -12
- package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +5 -4
- package/dist/src/commands/lint.js +36 -36
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/manifest.js +1 -1
- package/dist/src/commands/package.js +4 -6
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +19 -20
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +23 -33
- package/dist/src/commands/patch/entry-projection.d.ts +13 -0
- package/dist/src/commands/patch/entry-projection.js +24 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
- package/dist/src/commands/patch/lint-ignore.js +33 -44
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +29 -15
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +41 -37
- package/dist/src/commands/patch/move-files.js +5 -14
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +35 -49
- package/dist/src/commands/patch/reorder.js +35 -48
- package/dist/src/commands/patch/split-plan.d.ts +7 -8
- package/dist/src/commands/patch/split-plan.js +10 -13
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +50 -48
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +22 -28
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +20 -30
- package/dist/src/commands/patch-rename-map.d.ts +19 -0
- package/dist/src/commands/patch-rename-map.js +36 -0
- package/dist/src/commands/pending-resolution.d.ts +15 -0
- package/dist/src/commands/pending-resolution.js +25 -0
- package/dist/src/commands/re-export-adjacent.d.ts +25 -3
- package/dist/src/commands/re-export-adjacent.js +40 -24
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +23 -27
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +33 -33
- package/dist/src/commands/re-export-files.d.ts +2 -3
- package/dist/src/commands/re-export-files.js +52 -44
- package/dist/src/commands/re-export-lint.d.ts +29 -30
- package/dist/src/commands/re-export-lint.js +36 -29
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +12 -9
- package/dist/src/commands/re-export-single.d.ts +23 -4
- package/dist/src/commands/re-export-single.js +39 -31
- package/dist/src/commands/re-export.js +35 -17
- package/dist/src/commands/rebase/abort.js +9 -14
- package/dist/src/commands/rebase/continue.js +20 -19
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +5 -5
- package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
- package/dist/src/commands/rebase/patch-loop.js +20 -24
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +21 -13
- package/dist/src/commands/run.d.ts +0 -13
- package/dist/src/commands/run.js +38 -51
- package/dist/src/commands/setup-support.d.ts +16 -4
- package/dist/src/commands/setup-support.js +20 -20
- package/dist/src/commands/setup.js +4 -10
- package/dist/src/commands/source.js +9 -2
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +6 -6
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +5 -5
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +25 -26
- package/dist/src/commands/test-build-phase.d.ts +3 -3
- package/dist/src/commands/test-build-phase.js +48 -24
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +4 -4
- package/dist/src/commands/test-modes.js +4 -5
- package/dist/src/commands/test-register.js +5 -3
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +40 -33
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +17 -17
- package/dist/src/commands/test-verdict.d.ts +19 -5
- package/dist/src/commands/test-verdict.js +26 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +73 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.d.ts +26 -0
- package/dist/src/commands/token-list.js +153 -0
- package/dist/src/commands/token.js +26 -10
- package/dist/src/commands/tree.js +26 -21
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +16 -16
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +17 -16
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -12
- package/dist/src/core/branding.js +6 -5
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +10 -7
- package/dist/src/core/build-audit-platform.d.ts +32 -3
- package/dist/src/core/build-audit-platform.js +153 -13
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +10 -9
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +57 -0
- package/dist/src/core/build-audit-skip.js +112 -0
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +21 -8
- package/dist/src/core/build-audit.js +142 -40
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +48 -31
- package/dist/src/core/build-baseline.js +20 -43
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +18 -17
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +14 -14
- package/dist/src/core/build-prepare.d.ts +4 -12
- package/dist/src/core/build-prepare.js +22 -26
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-paths.d.ts +2 -6
- package/dist/src/core/config-paths.js +4 -2
- package/dist/src/core/config-state.d.ts +0 -6
- package/dist/src/core/config-state.js +3 -21
- package/dist/src/core/config-validate-build-audit.d.ts +8 -0
- package/dist/src/core/config-validate-build-audit.js +80 -0
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +3 -3
- package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
- package/dist/src/core/config-validate-patch-policy.js +3 -3
- package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
- package/dist/src/core/config-validate-test-toolchains.js +4 -5
- package/dist/src/core/config-validate.js +22 -12
- package/dist/src/core/config.d.ts +12 -12
- package/dist/src/core/config.js +21 -25
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +20 -20
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +22 -23
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +5 -13
- package/dist/src/core/engine-precondition.js +5 -10
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +50 -54
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock-owner.d.ts +103 -0
- package/dist/src/core/file-lock-owner.js +259 -0
- package/dist/src/core/file-lock.d.ts +14 -19
- package/dist/src/core/file-lock.js +90 -128
- package/dist/src/core/firefox-cache.d.ts +13 -1
- package/dist/src/core/firefox-cache.js +61 -36
- package/dist/src/core/firefox-download.d.ts +15 -0
- package/dist/src/core/firefox-download.js +38 -22
- package/dist/src/core/firefox-extract.d.ts +8 -7
- package/dist/src/core/firefox-extract.js +45 -27
- package/dist/src/core/firefox.d.ts +34 -36
- package/dist/src/core/firefox.js +13 -44
- package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
- package/dist/src/core/furnace-apply-dry-run.js +2 -8
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
- package/dist/src/core/furnace-apply-helpers.js +28 -39
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +4 -4
- package/dist/src/core/furnace-apply.js +50 -29
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +5 -5
- package/dist/src/core/furnace-config.js +40 -53
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +9 -8
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +20 -0
- package/dist/src/core/furnace-dir-entry.js +21 -0
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +22 -19
- package/dist/src/core/furnace-operation.js +38 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.d.ts +18 -6
- package/dist/src/core/furnace-refresh.js +5 -8
- package/dist/src/core/furnace-registration-ast.d.ts +2 -3
- package/dist/src/core/furnace-registration-ast.js +9 -12
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +7 -6
- package/dist/src/core/furnace-registration.js +29 -36
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-scanner.js +3 -6
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +12 -12
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +18 -20
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +6 -4
- package/dist/src/core/git-base.js +29 -7
- package/dist/src/core/git-diff-new-file.d.ts +40 -0
- package/dist/src/core/git-diff-new-file.js +119 -0
- package/dist/src/core/git-diff.d.ts +13 -13
- package/dist/src/core/git-diff.js +121 -189
- package/dist/src/core/git-file-ops.d.ts +6 -13
- package/dist/src/core/git-file-ops.js +11 -35
- package/dist/src/core/git-readonly-index.d.ts +12 -14
- package/dist/src/core/git-readonly-index.js +12 -16
- package/dist/src/core/git-status.d.ts +9 -2
- package/dist/src/core/git-status.js +23 -11
- package/dist/src/core/git.d.ts +3 -9
- package/dist/src/core/git.js +28 -57
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +28 -27
- package/dist/src/core/history-log.d.ts +19 -0
- package/dist/src/core/history-log.js +29 -0
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -10
- package/dist/src/core/mach-error-hints.js +14 -14
- package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
- package/dist/src/core/mach-known-noise-filter.js +57 -56
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +17 -16
- package/dist/src/core/mach-python.d.ts +3 -0
- package/dist/src/core/mach-python.js +13 -7
- package/dist/src/core/mach-resource-shim.d.ts +24 -12
- package/dist/src/core/mach-resource-shim.js +124 -21
- package/dist/src/core/mach.d.ts +59 -73
- package/dist/src/core/mach.js +47 -115
- package/dist/src/core/marionette-port.d.ts +15 -30
- package/dist/src/core/marionette-port.js +46 -89
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +32 -50
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +17 -17
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +46 -42
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +13 -13
- package/dist/src/core/patch-apply.d.ts +13 -14
- package/dist/src/core/patch-apply.js +36 -42
- package/dist/src/core/patch-export-coverage.d.ts +0 -9
- package/dist/src/core/patch-export-coverage.js +1 -30
- package/dist/src/core/patch-export-update.d.ts +21 -4
- package/dist/src/core/patch-export-update.js +7 -6
- package/dist/src/core/patch-export.d.ts +20 -30
- package/dist/src/core/patch-export.js +55 -77
- package/dist/src/core/patch-files.d.ts +0 -4
- package/dist/src/core/patch-files.js +0 -11
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +12 -18
- package/dist/src/core/patch-lint-cache.d.ts +18 -2
- package/dist/src/core/patch-lint-cache.js +16 -19
- package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
- package/dist/src/core/patch-lint-checkjs.js +78 -64
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +5 -9
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +27 -19
- package/dist/src/core/patch-lint-cross.js +67 -110
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +15 -11
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +6 -6
- package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
- package/dist/src/core/patch-lint-forward-registration.js +210 -0
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +46 -46
- package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +7 -7
- package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
- package/dist/src/core/patch-lint-queue-types.js +12 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
- package/dist/src/core/patch-lint-staged-registration.js +90 -0
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +41 -35
- package/dist/src/core/patch-lint.js +52 -49
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +11 -11
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +35 -34
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +32 -21
- package/dist/src/core/patch-parse.js +40 -15
- package/dist/src/core/patch-policy.js +15 -27
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-source-metadata.d.ts +1 -3
- package/dist/src/core/patch-source-metadata.js +0 -4
- package/dist/src/core/patch-transform.d.ts +8 -16
- package/dist/src/core/patch-transform.js +13 -23
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +6 -6
- package/dist/src/core/rebase-session.d.ts +9 -15
- package/dist/src/core/rebase-session.js +13 -25
- package/dist/src/core/register-browser-content.js +3 -2
- package/dist/src/core/register-browser-test.js +2 -1
- package/dist/src/core/register-module.js +2 -1
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +8 -7
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +6 -5
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +38 -0
- package/dist/src/core/run-log-redact.js +69 -0
- package/dist/src/core/run-log.d.ts +21 -10
- package/dist/src/core/run-log.js +76 -27
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +4 -6
- package/dist/src/core/smoke-patterns.d.ts +5 -6
- package/dist/src/core/smoke-patterns.js +15 -20
- package/dist/src/core/state-file.d.ts +15 -4
- package/dist/src/core/state-file.js +14 -1
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +13 -12
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +40 -25
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +69 -69
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -23
- package/dist/src/core/test-stale-check.js +31 -30
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
- package/dist/src/core/test-xpcshell-retry.js +14 -11
- package/dist/src/core/token-category.d.ts +35 -2
- package/dist/src/core/token-category.js +67 -58
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +13 -25
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +56 -0
- package/dist/src/core/token-inventory.js +109 -0
- package/dist/src/core/token-manager.d.ts +4 -4
- package/dist/src/core/token-manager.js +22 -22
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +52 -53
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +23 -23
- package/dist/src/core/tree-cow.d.ts +3 -5
- package/dist/src/core/tree-cow.js +8 -8
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +39 -38
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +33 -33
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +12 -23
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +16 -28
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +28 -30
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +69 -16
- package/dist/src/errors/base.js +95 -26
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +26 -34
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/config.d.ts +0 -14
- package/dist/src/errors/config.js +13 -34
- package/dist/src/errors/download.d.ts +13 -0
- package/dist/src/errors/download.js +53 -24
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/furnace.js +8 -9
- package/dist/src/errors/git.d.ts +9 -9
- package/dist/src/errors/git.js +21 -31
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +11 -13
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +8 -8
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +155 -200
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +52 -19
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/index.d.ts +0 -1
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +4 -16
- package/dist/src/utils/assert.js +7 -24
- package/dist/src/utils/build-info.d.ts +6 -6
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +7 -6
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +10 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +15 -20
- package/dist/src/utils/hash.d.ts +12 -0
- package/dist/src/utils/hash.js +16 -0
- package/dist/src/utils/line-dispatch.d.ts +15 -0
- package/dist/src/utils/line-dispatch.js +48 -0
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +14 -20
- package/dist/src/utils/options.js +26 -27
- package/dist/src/utils/package-root.js +5 -14
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/platform.d.ts +0 -4
- package/dist/src/utils/process-group.d.ts +10 -9
- package/dist/src/utils/process-group.js +37 -36
- package/dist/src/utils/process.d.ts +70 -55
- package/dist/src/utils/process.js +129 -179
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +9 -9
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +26 -0
- package/dist/src/utils/sleep.js +31 -0
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +12 -49
- package/dist/src/utils/validation.js +26 -36
- package/docs/README.md +2 -2
- package/docs/configuration.md +163 -69
- package/docs/exit-codes.md +66 -49
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +414 -247
- package/docs/machine-output.md +58 -34
- package/docs/patch-workflow.md +48 -44
- package/docs/run-logs.md +72 -28
- package/docs/testing.md +105 -98
- package/docs/verification-trees.md +23 -22
- package/package.json +7 -6
- package/dist/src/commands/rebase.d.ts +0 -4
- package/dist/src/commands/rebase.js +0 -5
- package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
- package/dist/src/core/patch-artifact-normalize.js +0 -24
- package/dist/src/core/patch-lint-reexports.d.ts +0 -7
- package/dist/src/core/patch-lint-reexports.js +0 -8
- package/dist/src/core/wire-targets.d.ts +0 -7
- package/dist/src/core/wire-targets.js +0 -8
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* browser-init.js
|
|
3
|
+
* browser-init.js: init expression in onLoad().
|
|
4
4
|
*/
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import MagicString from 'magic-string';
|
|
@@ -22,8 +22,8 @@ const DEFAULT_MARKER = 'FIREFORGE:';
|
|
|
22
22
|
* Default insertion point: after the last consecutive fireforge block, or at
|
|
23
23
|
* the top of the method body when there is none.
|
|
24
24
|
*
|
|
25
|
-
* Both callers below
|
|
26
|
-
* no-`--after` default
|
|
25
|
+
* Both callers below (the `--after`-target-not-found fallthrough and the
|
|
26
|
+
* no-`--after` default) must emit identical blocks, since `browser-init.js`
|
|
27
27
|
* is written through both paths. One implementation enforces that invariant
|
|
28
28
|
* rather than merely tidying.
|
|
29
29
|
*/
|
|
@@ -48,14 +48,14 @@ function resolveDefaultInsertion(content, body, fireforgeBlocks) {
|
|
|
48
48
|
*
|
|
49
49
|
* `marker` is prepended (uppercased) to the generated comment line so the
|
|
50
50
|
* emitted block carries the patch-lint `// <MARKER>:` signature that
|
|
51
|
-
* `lintModificationComments` looks for
|
|
51
|
+
* `lintModificationComments` looks for. Otherwise the first export after
|
|
52
52
|
* `wire` trips `missing-modification-comment` on wire-generated edits.
|
|
53
53
|
*/
|
|
54
54
|
export function addInitAST(content, expression, after, marker = DEFAULT_MARKER) {
|
|
55
55
|
const name = extractNameFromExpression(expression);
|
|
56
56
|
// `validateWireName` accepts both `Foo.bar` and `Foo.bar()` shapes. The
|
|
57
57
|
// template below interpolates the value verbatim, so a bare property
|
|
58
|
-
// path compiles to `Foo.bar
|
|
58
|
+
// path compiles to `Foo.bar;`, a silent no-op rather than a lifecycle
|
|
59
59
|
// invocation. `coerceToCall` normalises to the function-call form so
|
|
60
60
|
// the emitted block always invokes the hook the operator asked for.
|
|
61
61
|
const callExpression = coerceToCall(expression);
|
|
@@ -116,7 +116,7 @@ export function addInitAST(content, expression, after, marker = DEFAULT_MARKER)
|
|
|
116
116
|
*/
|
|
117
117
|
export function legacyAddInit(content, expression, after, marker = DEFAULT_MARKER) {
|
|
118
118
|
const name = extractNameFromExpression(expression);
|
|
119
|
-
// See `addInitAST` for the rationale
|
|
119
|
+
// See `addInitAST` for the rationale: the AST and fallback paths must
|
|
120
120
|
// agree on whether the emitted block is a function call, otherwise
|
|
121
121
|
// operators would see different behaviour depending on which parser
|
|
122
122
|
// happened to handle their browser-init.js layout.
|
|
@@ -202,7 +202,7 @@ export async function addInitToBrowserInit(engineDir, expression, after, marker
|
|
|
202
202
|
throw new GeneralError(`${BROWSER_INIT_JS} not found in engine`);
|
|
203
203
|
}
|
|
204
204
|
const content = await readText(filePath);
|
|
205
|
-
// Idempotency check
|
|
205
|
+
// Idempotency check: look for the coerced (call) form because that is
|
|
206
206
|
// what the emitter writes. Matching against the raw input would miss a
|
|
207
207
|
// bare `X.init` invocation that coercion already persisted as `X.init()`.
|
|
208
208
|
const callExpression = coerceToCall(expression);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* browser-main.js
|
|
3
|
+
* browser-main.js: loadSubScript registration.
|
|
4
4
|
*/
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import MagicString from 'magic-string';
|
|
@@ -45,7 +45,7 @@ export function addSubscriptAST(content, name, marker = DEFAULT_MARKER) {
|
|
|
45
45
|
indent = detectIndent(content, lastTry.start);
|
|
46
46
|
}
|
|
47
47
|
else {
|
|
48
|
-
// No existing loadSubScript
|
|
48
|
+
// No existing loadSubScript: insert before last standalone closing brace
|
|
49
49
|
// Use line-based search to avoid matching braces inside strings/comments
|
|
50
50
|
const allLines = content.split('\n');
|
|
51
51
|
let lastBrace = -1;
|
|
@@ -132,7 +132,7 @@ export async function addSubscriptToBrowserMain(engineDir, name, marker = DEFAUL
|
|
|
132
132
|
throw new GeneralError(`${BROWSER_MAIN_JS} not found in engine`);
|
|
133
133
|
}
|
|
134
134
|
const content = await readText(filePath);
|
|
135
|
-
// Idempotency check
|
|
135
|
+
// Idempotency check. Include the closing quote to avoid substring false positives
|
|
136
136
|
if (content.includes(`content/${name}.js"`)) {
|
|
137
137
|
return false;
|
|
138
138
|
}
|
|
@@ -12,7 +12,7 @@ export declare function validateWireName(value: string, label: string): void;
|
|
|
12
12
|
* `Startup.init` or `Startup.init()` and get the same wired output.
|
|
13
13
|
*
|
|
14
14
|
* `validateWireName` accepts both shapes, but the generated block
|
|
15
|
-
* interpolates the expression verbatim inside `${expression}
|
|
15
|
+
* interpolates the expression verbatim inside `${expression};`, so a bare
|
|
16
16
|
* `Startup.init` emits `Startup.init;`, a plain property reference that
|
|
17
17
|
* never invokes the lifecycle hook. The symptom is silent: `wire` reports
|
|
18
18
|
* success and the browser-init block looks plausible, but the hook never
|
|
@@ -27,7 +27,7 @@ export declare function coerceToCall(expression: string): string;
|
|
|
27
27
|
* Tracks multi-line block comment state across calls via the `inBlockComment`
|
|
28
28
|
* parameter, allowing callers to iterate over lines while preserving context.
|
|
29
29
|
*
|
|
30
|
-
*
|
|
30
|
+
* Regex literal heuristic: when a `/` follows an operator or keyword-boundary
|
|
31
31
|
* character (one of `= ( : , ! | & ? ; ~ ^ { [ \n + - * % < >`), it is treated
|
|
32
32
|
* as a regex literal opener and characters are skipped until the closing `/`.
|
|
33
33
|
* This heuristic can misfire on:
|
|
@@ -36,7 +36,7 @@ export declare function coerceToCall(expression: string): string;
|
|
|
36
36
|
* - Tagged template literals or unusual formatting.
|
|
37
37
|
*
|
|
38
38
|
* For Firefox source files this heuristic is sufficient because the AST-based
|
|
39
|
-
* parser (via `withParserFallback`) is tried first
|
|
39
|
+
* parser (via `withParserFallback`) is tried first. This function is only
|
|
40
40
|
* used in the regex-based fallback path.
|
|
41
41
|
*
|
|
42
42
|
* @param line - A single line of source text
|
|
@@ -66,10 +66,10 @@ export declare function tokenizeXhtml(lines: string[]): XhtmlToken[];
|
|
|
66
66
|
* advances to the line containing the opening brace.
|
|
67
67
|
*
|
|
68
68
|
* By default this helper is tolerant: when no `{` is found anywhere after
|
|
69
|
-
* the signature, it still returns `braceIndex: methodLine
|
|
69
|
+
* the signature, it still returns `braceIndex: methodLine`, which is the
|
|
70
70
|
* correct answer when the signature and body brace live on the same line,
|
|
71
71
|
* but is ambiguous when the method is abstract or truncated. Opt into
|
|
72
|
-
* stricter behaviour by passing `requireBrace: true
|
|
72
|
+
* stricter behaviour by passing `requireBrace: true`. The function will
|
|
73
73
|
* return `null` instead of guessing, letting the caller surface a clean
|
|
74
74
|
* {@link ParserFallbackError} rather than inserting into a wrong offset.
|
|
75
75
|
*
|
|
@@ -86,10 +86,10 @@ export declare function findMethodBraceIndex(lines: string[], pattern: RegExp, o
|
|
|
86
86
|
* Starting from `startLine`, walks lines using {@link countBraceDepth}
|
|
87
87
|
* until the brace depth returns to zero (i.e., the enclosing block closes).
|
|
88
88
|
*
|
|
89
|
-
* Default behaviour is defensive
|
|
89
|
+
* Default behaviour is defensive: if the block never closes, the helper
|
|
90
90
|
* returns `startLine + 1` so a single malformed file does not stop the
|
|
91
91
|
* entire fallback path. Pass `{ strict: true }` to opt into failing loudly
|
|
92
|
-
* with a {@link ParserFallbackError} instead
|
|
92
|
+
* with a {@link ParserFallbackError} instead. New callers should prefer
|
|
93
93
|
* strict mode so silent mis-insertions surface as the fallback refusing
|
|
94
94
|
* to touch the file.
|
|
95
95
|
*
|
|
@@ -120,7 +120,7 @@ export declare function computeFileBraceBalance(content: string): {
|
|
|
120
120
|
* Round-trip guard used after a legacy fallback mutation: if the file's
|
|
121
121
|
* net brace balance drifts between `before` and `after`, something went
|
|
122
122
|
* wrong and the fallback is refusing to write a corrupted file. Expects
|
|
123
|
-
* the delta to be exactly zero
|
|
123
|
+
* the delta to be exactly zero, since wire fallbacks only insert whole
|
|
124
124
|
* try/catch blocks, which always contribute equal opens and closes.
|
|
125
125
|
*
|
|
126
126
|
* @throws {@link ParserFallbackError} when the balance delta is non-zero.
|
|
@@ -136,7 +136,7 @@ export declare function findNearestTryLine(lines: string[], fromLine: number, lo
|
|
|
136
136
|
/**
|
|
137
137
|
* Scans lines starting from `startLine` for consecutive fireforge try-catch
|
|
138
138
|
* blocks (identified by init comments or typeof guards) and returns the
|
|
139
|
-
* line index just after the last such block
|
|
139
|
+
* line index just after the last such block, i.e. where a new block should
|
|
140
140
|
* be inserted.
|
|
141
141
|
*
|
|
142
142
|
* Non-fireforge, non-blank, non-comment lines terminate the scan.
|
|
@@ -24,7 +24,7 @@ export function validateWireName(value, label) {
|
|
|
24
24
|
* `Startup.init` or `Startup.init()` and get the same wired output.
|
|
25
25
|
*
|
|
26
26
|
* `validateWireName` accepts both shapes, but the generated block
|
|
27
|
-
* interpolates the expression verbatim inside `${expression}
|
|
27
|
+
* interpolates the expression verbatim inside `${expression};`, so a bare
|
|
28
28
|
* `Startup.init` emits `Startup.init;`, a plain property reference that
|
|
29
29
|
* never invokes the lifecycle hook. The symptom is silent: `wire` reports
|
|
30
30
|
* success and the browser-init block looks plausible, but the hook never
|
|
@@ -41,7 +41,7 @@ export function coerceToCall(expression) {
|
|
|
41
41
|
* Tracks multi-line block comment state across calls via the `inBlockComment`
|
|
42
42
|
* parameter, allowing callers to iterate over lines while preserving context.
|
|
43
43
|
*
|
|
44
|
-
*
|
|
44
|
+
* Regex literal heuristic: when a `/` follows an operator or keyword-boundary
|
|
45
45
|
* character (one of `= ( : , ! | & ? ; ~ ^ { [ \n + - * % < >`), it is treated
|
|
46
46
|
* as a regex literal opener and characters are skipped until the closing `/`.
|
|
47
47
|
* This heuristic can misfire on:
|
|
@@ -50,7 +50,7 @@ export function coerceToCall(expression) {
|
|
|
50
50
|
* - Tagged template literals or unusual formatting.
|
|
51
51
|
*
|
|
52
52
|
* For Firefox source files this heuristic is sufficient because the AST-based
|
|
53
|
-
* parser (via `withParserFallback`) is tried first
|
|
53
|
+
* parser (via `withParserFallback`) is tried first. This function is only
|
|
54
54
|
* used in the regex-based fallback path.
|
|
55
55
|
*
|
|
56
56
|
* @param line - A single line of source text
|
|
@@ -119,7 +119,7 @@ function isRegexLiteralStart(line, i) {
|
|
|
119
119
|
}
|
|
120
120
|
/**
|
|
121
121
|
* Scans from the opening `/` of a regex literal to its closing `/`
|
|
122
|
-
* (honouring escapes), returning the index of the closing slash
|
|
122
|
+
* (honouring escapes), returning the index of the closing slash, or the
|
|
123
123
|
* end of the line when the literal never closes.
|
|
124
124
|
*/
|
|
125
125
|
function scanToRegexLiteralEnd(line, start) {
|
|
@@ -159,8 +159,8 @@ export function tokenizeXhtml(lines) {
|
|
|
159
159
|
});
|
|
160
160
|
}
|
|
161
161
|
// ---------------------------------------------------------------------------
|
|
162
|
-
// Legacy (line-based) helpers
|
|
163
|
-
// wire
|
|
162
|
+
// Legacy (line-based) helpers, shared by fallback implementations in
|
|
163
|
+
// the wire target modules. Extracted to reduce duplication and make the brace-
|
|
164
164
|
// walking logic independently testable.
|
|
165
165
|
// ---------------------------------------------------------------------------
|
|
166
166
|
/**
|
|
@@ -168,10 +168,10 @@ export function tokenizeXhtml(lines) {
|
|
|
168
168
|
* advances to the line containing the opening brace.
|
|
169
169
|
*
|
|
170
170
|
* By default this helper is tolerant: when no `{` is found anywhere after
|
|
171
|
-
* the signature, it still returns `braceIndex: methodLine
|
|
171
|
+
* the signature, it still returns `braceIndex: methodLine`, which is the
|
|
172
172
|
* correct answer when the signature and body brace live on the same line,
|
|
173
173
|
* but is ambiguous when the method is abstract or truncated. Opt into
|
|
174
|
-
* stricter behaviour by passing `requireBrace: true
|
|
174
|
+
* stricter behaviour by passing `requireBrace: true`. The function will
|
|
175
175
|
* return `null` instead of guessing, letting the caller surface a clean
|
|
176
176
|
* {@link ParserFallbackError} rather than inserting into a wrong offset.
|
|
177
177
|
*
|
|
@@ -179,24 +179,12 @@ export function tokenizeXhtml(lines) {
|
|
|
179
179
|
* found (or, under `requireBrace`, no brace follows the signature).
|
|
180
180
|
*/
|
|
181
181
|
export function findMethodBraceIndex(lines, pattern, options) {
|
|
182
|
-
|
|
183
|
-
for (let i = 0; i < lines.length; i++) {
|
|
184
|
-
if (pattern.test(lines[i] ?? '')) {
|
|
185
|
-
methodLine = i;
|
|
186
|
-
break;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
182
|
+
const methodLine = lines.findIndex((line) => pattern.test(line));
|
|
189
183
|
if (methodLine === -1)
|
|
190
184
|
return null;
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
if (lines[i]?.includes('{')) {
|
|
195
|
-
braceIndex = i;
|
|
196
|
-
braceFound = true;
|
|
197
|
-
break;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
185
|
+
const braceOffset = lines.slice(methodLine).findIndex((line) => line.includes('{'));
|
|
186
|
+
const braceFound = braceOffset !== -1;
|
|
187
|
+
const braceIndex = braceFound ? methodLine + braceOffset : methodLine;
|
|
200
188
|
if (!braceFound && options?.requireBrace) {
|
|
201
189
|
return null;
|
|
202
190
|
}
|
|
@@ -206,10 +194,10 @@ export function findMethodBraceIndex(lines, pattern, options) {
|
|
|
206
194
|
* Starting from `startLine`, walks lines using {@link countBraceDepth}
|
|
207
195
|
* until the brace depth returns to zero (i.e., the enclosing block closes).
|
|
208
196
|
*
|
|
209
|
-
* Default behaviour is defensive
|
|
197
|
+
* Default behaviour is defensive: if the block never closes, the helper
|
|
210
198
|
* returns `startLine + 1` so a single malformed file does not stop the
|
|
211
199
|
* entire fallback path. Pass `{ strict: true }` to opt into failing loudly
|
|
212
|
-
* with a {@link ParserFallbackError} instead
|
|
200
|
+
* with a {@link ParserFallbackError} instead. New callers should prefer
|
|
213
201
|
* strict mode so silent mis-insertions surface as the fallback refusing
|
|
214
202
|
* to touch the file.
|
|
215
203
|
*
|
|
@@ -259,7 +247,7 @@ export function computeFileBraceBalance(content) {
|
|
|
259
247
|
* Round-trip guard used after a legacy fallback mutation: if the file's
|
|
260
248
|
* net brace balance drifts between `before` and `after`, something went
|
|
261
249
|
* wrong and the fallback is refusing to write a corrupted file. Expects
|
|
262
|
-
* the delta to be exactly zero
|
|
250
|
+
* the delta to be exactly zero, since wire fallbacks only insert whole
|
|
263
251
|
* try/catch blocks, which always contribute equal opens and closes.
|
|
264
252
|
*
|
|
265
253
|
* @throws {@link ParserFallbackError} when the balance delta is non-zero.
|
|
@@ -295,7 +283,7 @@ const FIREFORGE_BLOCK_PATTERN = /\/\/\s*.*init\s*—|typeof\s+\w+\s*!==\s*"undef
|
|
|
295
283
|
/**
|
|
296
284
|
* Scans lines starting from `startLine` for consecutive fireforge try-catch
|
|
297
285
|
* blocks (identified by init comments or typeof guards) and returns the
|
|
298
|
-
* line index just after the last such block
|
|
286
|
+
* line index just after the last such block, i.e. where a new block should
|
|
299
287
|
* be inserted.
|
|
300
288
|
*
|
|
301
289
|
* Non-fireforge, non-blank, non-comment lines terminate the scan.
|
|
@@ -9,7 +9,7 @@
|
|
|
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
11
|
* directive is honoured. On a rebranded fork (appname=`mybrowser`) the
|
|
12
|
-
* harness looks for `mybrowser-appdir
|
|
12
|
+
* harness looks for `mybrowser-appdir`, so the literal `firefox-appdir` line
|
|
13
13
|
* is silently ignored, `appPath` falls back to `xrePath`, and every
|
|
14
14
|
* `resource:///modules/…` import throws `Failed to load
|
|
15
15
|
* resource:///modules/<name>.sys.mjs` because xpcshell resolves the
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* `xpcshell.toml`. If none exists, the test is not an xpcshell test and
|
|
22
22
|
* there is nothing to inject.
|
|
23
23
|
* 2. Read the manifest's `[DEFAULT]` section. Look for `<appname>-appdir`
|
|
24
|
-
* first
|
|
24
|
+
* first. If present, the harness already finds it. Fall back to
|
|
25
25
|
* `firefox-appdir`. This ordering matches upstream precedence and avoids
|
|
26
26
|
* overriding an operator who already migrated.
|
|
27
27
|
* 3. If only `firefox-appdir` is present and `appname != "firefox"`, compute
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
* `dist/<bundle>.app/Contents/Resources/<value>` for the macOS packaged
|
|
31
31
|
* layout) and return it as the value to pass to `--app-path`.
|
|
32
32
|
* 4. If multiple test paths disagree on the resolved value, refuse injection
|
|
33
|
-
* and return null
|
|
33
|
+
* and return null. The operator can drop down to `--mach-arg`.
|
|
34
34
|
*
|
|
35
35
|
* Operator escape hatch: `--mach-arg=--app-path=…` always wins (handled in
|
|
36
36
|
* test.ts, which skips injection when `--app-path=` already appears in the
|
|
@@ -60,7 +60,7 @@ export interface AppdirResolveResult {
|
|
|
60
60
|
* - Single- or double-quoted values
|
|
61
61
|
* - Whitespace either side of `=`
|
|
62
62
|
* - Continuation comments (`#` or `;`) at the end of the line
|
|
63
|
-
* - Bare unquoted bareword values (e.g. `firefox-appdir = browser`)
|
|
63
|
+
* - Bare unquoted bareword values (e.g. `firefox-appdir = browser`). Some
|
|
64
64
|
* operators omit the quotes and the harness honours either form.
|
|
65
65
|
*
|
|
66
66
|
* Returns `undefined` when the key is absent or sits outside `[DEFAULT]`.
|
|
@@ -74,10 +74,10 @@ export declare function parseAppdirFromToml(tomlText: string, key: string): {
|
|
|
74
74
|
* returns the absolute path of the first sibling `xpcshell.toml` found.
|
|
75
75
|
* Stops at `engineDir` (inclusive) and returns null on miss.
|
|
76
76
|
*
|
|
77
|
-
* Special-cases `startPath` itself when it already ends with
|
|
78
|
-
*
|
|
77
|
+
* Special-cases `startPath` itself when it already ends with
|
|
78
|
+
* `xpcshell.toml`, since operators sometimes pass a manifest path directly.
|
|
79
79
|
*
|
|
80
|
-
* When `startPath` is a
|
|
80
|
+
* When `startPath` is a directory, the walk starts at the directory itself
|
|
81
81
|
* (checking `<dir>/xpcshell.toml` first) rather than at its parent.
|
|
82
82
|
* Starting at the parent misses a directory's own manifest, so
|
|
83
83
|
* `fireforge test <dir>` classifies it non-xpcshell and dispatches to the
|
|
@@ -86,31 +86,31 @@ export declare function parseAppdirFromToml(tomlText: string, key: string): {
|
|
|
86
86
|
export declare function findNearestXpcshellManifest(engineDir: string, startPath: string): Promise<string | null>;
|
|
87
87
|
/**
|
|
88
88
|
* Reads `<objDir>/mozinfo.json` for the active app name. Returns
|
|
89
|
-
* `"firefox"` when mozinfo cannot be read or the field is missing
|
|
89
|
+
* `"firefox"` when mozinfo cannot be read or the field is missing. That
|
|
90
90
|
* is the safe default because it matches stock Firefox behaviour and
|
|
91
91
|
* means the resolver will not inject anything (the manifest's
|
|
92
|
-
* `firefox-appdir` value
|
|
92
|
+
* `firefox-appdir` value is honoured by the upstream harness when
|
|
93
93
|
* appname is firefox).
|
|
94
94
|
*/
|
|
95
95
|
export declare function readMozinfoAppname(objDirPath: string): Promise<string>;
|
|
96
96
|
/**
|
|
97
97
|
* Probes the obj-dir's `dist/` subtree for the absolute path the harness
|
|
98
98
|
* would have computed if the manifest key had been honoured. Returns null
|
|
99
|
-
* when no candidate exists
|
|
99
|
+
* when no candidate exists: better to skip injection silently than to point
|
|
100
100
|
* the harness at a path that does not exist, which fails with a different
|
|
101
101
|
* error than the original symptom and confuses triage.
|
|
102
102
|
*
|
|
103
103
|
* Probe order differs by host platform:
|
|
104
104
|
*
|
|
105
|
-
* -
|
|
106
|
-
* `<objDir>/dist/<App>.app/Contents/Resources/<value>`
|
|
105
|
+
* - macOS (`darwin`): prefer
|
|
106
|
+
* `<objDir>/dist/<App>.app/Contents/Resources/<value>` first, then fall
|
|
107
107
|
* back to `<objDir>/dist/bin/<value>`. On macOS `dist/bin` is symlinked to
|
|
108
|
-
* `dist/<App>.app/Contents/MacOS/` (the
|
|
109
|
-
* `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser
|
|
110
|
-
*
|
|
111
|
-
* successful in the log but points at a directory with no modules
|
|
112
|
-
* every `resource:///modules/…` import still throws.
|
|
113
|
-
* -
|
|
108
|
+
* `dist/<App>.app/Contents/MacOS/` (the binaries directory), so
|
|
109
|
+
* `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser/`,
|
|
110
|
+
* which is not where `resource:///modules/` is rooted. Injecting that path
|
|
111
|
+
* looks successful in the log but points at a directory with no modules
|
|
112
|
+
* tree, so every `resource:///modules/…` import still throws.
|
|
113
|
+
* - non-macOS: `dist/bin/<value>` first,
|
|
114
114
|
* `.app/Contents/Resources/<value>` as fallback.
|
|
115
115
|
*
|
|
116
116
|
* On both platforms the final `.app` fallback iterates every `*.app` entry
|
|
@@ -121,7 +121,7 @@ export declare function resolveAbsoluteAppPath(objDirAbs: string, relativeAppdir
|
|
|
121
121
|
* Outcome carrier for {@link resolveXpcshellAppdirArg}. Distinguishes the
|
|
122
122
|
* three "did nothing" cases so callers can shape diagnostics:
|
|
123
123
|
* - `none`: no manifest under any test path needs injection.
|
|
124
|
-
* - `mismatch`: at least two manifests resolved to different values
|
|
124
|
+
* - `mismatch`: at least two manifests resolved to different values. We
|
|
125
125
|
* refuse to guess which one the operator meant.
|
|
126
126
|
* - `unresolved`: the manifest asks for `firefox-appdir = "<value>"` but
|
|
127
127
|
* no `dist/` candidate exists for that value.
|
|
@@ -143,7 +143,7 @@ export type XpcshellAppdirOutcome = {
|
|
|
143
143
|
/**
|
|
144
144
|
* Top-level resolver. Walks every test path, reads the nearest
|
|
145
145
|
* xpcshell.toml, and returns the single absolute path to inject (or a
|
|
146
|
-
* structured "no injection" outcome). Never throws
|
|
146
|
+
* structured "no injection" outcome). Never throws: every fs / parse
|
|
147
147
|
* error is folded into a `none` outcome so the test command always falls
|
|
148
148
|
* through to the diagnostic hint instead of dying inside a helper.
|
|
149
149
|
*/
|
|
@@ -10,7 +10,7 @@
|
|
|
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
12
|
* directive is honoured. On a rebranded fork (appname=`mybrowser`) the
|
|
13
|
-
* harness looks for `mybrowser-appdir
|
|
13
|
+
* harness looks for `mybrowser-appdir`, so the literal `firefox-appdir` line
|
|
14
14
|
* is silently ignored, `appPath` falls back to `xrePath`, and every
|
|
15
15
|
* `resource:///modules/…` import throws `Failed to load
|
|
16
16
|
* resource:///modules/<name>.sys.mjs` because xpcshell resolves the
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* `xpcshell.toml`. If none exists, the test is not an xpcshell test and
|
|
23
23
|
* there is nothing to inject.
|
|
24
24
|
* 2. Read the manifest's `[DEFAULT]` section. Look for `<appname>-appdir`
|
|
25
|
-
* first
|
|
25
|
+
* first. If present, the harness already finds it. Fall back to
|
|
26
26
|
* `firefox-appdir`. This ordering matches upstream precedence and avoids
|
|
27
27
|
* overriding an operator who already migrated.
|
|
28
28
|
* 3. If only `firefox-appdir` is present and `appname != "firefox"`, compute
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
* `dist/<bundle>.app/Contents/Resources/<value>` for the macOS packaged
|
|
32
32
|
* layout) and return it as the value to pass to `--app-path`.
|
|
33
33
|
* 4. If multiple test paths disagree on the resolved value, refuse injection
|
|
34
|
-
* and return null
|
|
34
|
+
* and return null. The operator can drop down to `--mach-arg`.
|
|
35
35
|
*
|
|
36
36
|
* Operator escape hatch: `--mach-arg=--app-path=…` always wins (handled in
|
|
37
37
|
* test.ts, which skips injection when `--app-path=` already appears in the
|
|
@@ -51,7 +51,7 @@ import { isObject, isString } from '../utils/validation.js';
|
|
|
51
51
|
* - Single- or double-quoted values
|
|
52
52
|
* - Whitespace either side of `=`
|
|
53
53
|
* - Continuation comments (`#` or `;`) at the end of the line
|
|
54
|
-
* - Bare unquoted bareword values (e.g. `firefox-appdir = browser`)
|
|
54
|
+
* - Bare unquoted bareword values (e.g. `firefox-appdir = browser`). Some
|
|
55
55
|
* operators omit the quotes and the harness honours either form.
|
|
56
56
|
*
|
|
57
57
|
* Returns `undefined` when the key is absent or sits outside `[DEFAULT]`.
|
|
@@ -64,8 +64,7 @@ export function parseAppdirFromToml(tomlText, key) {
|
|
|
64
64
|
// comment further along the file is not mistaken for the directive.
|
|
65
65
|
const escapedKey = escapeRegex(key);
|
|
66
66
|
const keyPattern = new RegExp('^\\s*' + escapedKey + '\\s*=\\s*(.+?)\\s*(?:[#;].*)?$');
|
|
67
|
-
for (
|
|
68
|
-
const line = lines[i] ?? '';
|
|
67
|
+
for (const [i, line] of lines.entries()) {
|
|
69
68
|
const sectionMatch = /^\s*\[([^\]]+)\]\s*$/.exec(line);
|
|
70
69
|
if (sectionMatch) {
|
|
71
70
|
sectionSeen = true;
|
|
@@ -94,7 +93,7 @@ function stripQuotes(raw) {
|
|
|
94
93
|
if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
|
|
95
94
|
return raw.slice(1, -1);
|
|
96
95
|
}
|
|
97
|
-
// Bareword: must not contain whitespace
|
|
96
|
+
// Bareword: must not contain whitespace. Otherwise we are looking at
|
|
98
97
|
// commentary that the regex's optional comment tail did not strip.
|
|
99
98
|
if (/\s/.test(raw))
|
|
100
99
|
return undefined;
|
|
@@ -105,10 +104,10 @@ function stripQuotes(raw) {
|
|
|
105
104
|
* returns the absolute path of the first sibling `xpcshell.toml` found.
|
|
106
105
|
* Stops at `engineDir` (inclusive) and returns null on miss.
|
|
107
106
|
*
|
|
108
|
-
* Special-cases `startPath` itself when it already ends with
|
|
109
|
-
*
|
|
107
|
+
* Special-cases `startPath` itself when it already ends with
|
|
108
|
+
* `xpcshell.toml`, since operators sometimes pass a manifest path directly.
|
|
110
109
|
*
|
|
111
|
-
* When `startPath` is a
|
|
110
|
+
* When `startPath` is a directory, the walk starts at the directory itself
|
|
112
111
|
* (checking `<dir>/xpcshell.toml` first) rather than at its parent.
|
|
113
112
|
* Starting at the parent misses a directory's own manifest, so
|
|
114
113
|
* `fireforge test <dir>` classifies it non-xpcshell and dispatches to the
|
|
@@ -123,8 +122,8 @@ export async function findNearestXpcshellManifest(engineDir, startPath) {
|
|
|
123
122
|
const engineAbs = resolve(engineDir);
|
|
124
123
|
let current = absStart;
|
|
125
124
|
// First iteration resolves the starting directory (the path itself for a
|
|
126
|
-
// directory argument, its parent for a file)
|
|
127
|
-
// Cap iterations defensively
|
|
125
|
+
// directory argument, its parent for a file). Subsequent ones walk up.
|
|
126
|
+
// Cap iterations defensively: a pathological symlink loop would
|
|
128
127
|
// otherwise spin until the call stack overflows.
|
|
129
128
|
for (let i = 0; i < 64; i += 1) {
|
|
130
129
|
const dir = i === 0 ? (startIsDirectory ? absStart : dirname(absStart)) : dirname(current);
|
|
@@ -139,10 +138,10 @@ export async function findNearestXpcshellManifest(engineDir, startPath) {
|
|
|
139
138
|
}
|
|
140
139
|
/**
|
|
141
140
|
* Reads `<objDir>/mozinfo.json` for the active app name. Returns
|
|
142
|
-
* `"firefox"` when mozinfo cannot be read or the field is missing
|
|
141
|
+
* `"firefox"` when mozinfo cannot be read or the field is missing. That
|
|
143
142
|
* is the safe default because it matches stock Firefox behaviour and
|
|
144
143
|
* means the resolver will not inject anything (the manifest's
|
|
145
|
-
* `firefox-appdir` value
|
|
144
|
+
* `firefox-appdir` value is honoured by the upstream harness when
|
|
146
145
|
* appname is firefox).
|
|
147
146
|
*/
|
|
148
147
|
export async function readMozinfoAppname(objDirPath) {
|
|
@@ -157,28 +156,28 @@ export async function readMozinfoAppname(objDirPath) {
|
|
|
157
156
|
}
|
|
158
157
|
catch {
|
|
159
158
|
// Malformed mozinfo is a build-system problem out of scope for the
|
|
160
|
-
// appdir resolver
|
|
159
|
+
// appdir resolver. Treat as if appname were missing.
|
|
161
160
|
}
|
|
162
161
|
return 'firefox';
|
|
163
162
|
}
|
|
164
163
|
/**
|
|
165
164
|
* Probes the obj-dir's `dist/` subtree for the absolute path the harness
|
|
166
165
|
* would have computed if the manifest key had been honoured. Returns null
|
|
167
|
-
* when no candidate exists
|
|
166
|
+
* when no candidate exists: better to skip injection silently than to point
|
|
168
167
|
* the harness at a path that does not exist, which fails with a different
|
|
169
168
|
* error than the original symptom and confuses triage.
|
|
170
169
|
*
|
|
171
170
|
* Probe order differs by host platform:
|
|
172
171
|
*
|
|
173
|
-
* -
|
|
174
|
-
* `<objDir>/dist/<App>.app/Contents/Resources/<value>`
|
|
172
|
+
* - macOS (`darwin`): prefer
|
|
173
|
+
* `<objDir>/dist/<App>.app/Contents/Resources/<value>` first, then fall
|
|
175
174
|
* back to `<objDir>/dist/bin/<value>`. On macOS `dist/bin` is symlinked to
|
|
176
|
-
* `dist/<App>.app/Contents/MacOS/` (the
|
|
177
|
-
* `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser
|
|
178
|
-
*
|
|
179
|
-
* successful in the log but points at a directory with no modules
|
|
180
|
-
* every `resource:///modules/…` import still throws.
|
|
181
|
-
* -
|
|
175
|
+
* `dist/<App>.app/Contents/MacOS/` (the binaries directory), so
|
|
176
|
+
* `dist/bin/browser` resolves to `<App>.app/Contents/MacOS/browser/`,
|
|
177
|
+
* which is not where `resource:///modules/` is rooted. Injecting that path
|
|
178
|
+
* looks successful in the log but points at a directory with no modules
|
|
179
|
+
* tree, so every `resource:///modules/…` import still throws.
|
|
180
|
+
* - non-macOS: `dist/bin/<value>` first,
|
|
182
181
|
* `.app/Contents/Resources/<value>` as fallback.
|
|
183
182
|
*
|
|
184
183
|
* On both platforms the final `.app` fallback iterates every `*.app` entry
|
|
@@ -223,7 +222,7 @@ export async function resolveAbsoluteAppPath(objDirAbs, relativeAppdir) {
|
|
|
223
222
|
/**
|
|
224
223
|
* Top-level resolver. Walks every test path, reads the nearest
|
|
225
224
|
* xpcshell.toml, and returns the single absolute path to inject (or a
|
|
226
|
-
* structured "no injection" outcome). Never throws
|
|
225
|
+
* structured "no injection" outcome). Never throws: every fs / parse
|
|
227
226
|
* error is folded into a `none` outcome so the test command always falls
|
|
228
227
|
* through to the diagnostic hint instead of dying inside a helper.
|
|
229
228
|
*/
|
|
@@ -232,7 +231,7 @@ export async function resolveXpcshellAppdirArg(engineDir, testPaths, objDirName)
|
|
|
232
231
|
return { kind: 'none' };
|
|
233
232
|
const objDirAbs = resolve(engineDir, objDirName);
|
|
234
233
|
const appname = await readMozinfoAppname(objDirAbs);
|
|
235
|
-
// When appname
|
|
234
|
+
// When appname is "firefox" the upstream harness reads `firefox-appdir`
|
|
236
235
|
// natively. Injecting in that case would be a no-op at best and an
|
|
237
236
|
// override at worst, so bail out before doing any IO per-path.
|
|
238
237
|
if (appname === 'firefox')
|
|
@@ -248,11 +247,11 @@ export async function resolveXpcshellAppdirArg(engineDir, testPaths, objDirName)
|
|
|
248
247
|
body = await readText(manifestPath);
|
|
249
248
|
}
|
|
250
249
|
catch {
|
|
251
|
-
// An unreadable manifest cannot declare an appdir
|
|
250
|
+
// An unreadable manifest cannot declare an appdir. Skip it and keep
|
|
252
251
|
// walking the remaining candidates.
|
|
253
252
|
continue;
|
|
254
253
|
}
|
|
255
|
-
// Operator already migrated
|
|
254
|
+
// Operator already migrated. The harness will read the appname-keyed
|
|
256
255
|
// value directly. Nothing to do.
|
|
257
256
|
if (parseAppdirFromToml(body, appnameKey) !== undefined)
|
|
258
257
|
continue;
|
|
@@ -290,8 +289,7 @@ export async function resolveXpcshellAppdirArg(engineDir, testPaths, objDirName)
|
|
|
290
289
|
* wins.
|
|
291
290
|
*/
|
|
292
291
|
export function operatorAlreadySetAppPath(extraArgs) {
|
|
293
|
-
for (
|
|
294
|
-
const arg = extraArgs[i] ?? '';
|
|
292
|
+
for (const [i, arg] of extraArgs.entries()) {
|
|
295
293
|
if (arg === '--app-path' && i + 1 < extraArgs.length)
|
|
296
294
|
return true;
|
|
297
295
|
if (arg.startsWith('--app-path='))
|
|
@@ -2,11 +2,11 @@ export declare const XPCSHELL_PROFILE_ENV_VAR = "XPCSHELL_TEST_PROFILE_DIR";
|
|
|
2
2
|
/**
|
|
3
3
|
* Runs `fn` with a fresh per-invocation xpcshell profile directory
|
|
4
4
|
* injected into the environment, removing the directory afterwards
|
|
5
|
-
* (best-effort
|
|
6
|
-
* for the OS tmp reaper
|
|
5
|
+
* (best-effort: a failure to clean up warns and leaves the mkdtemp dir
|
|
6
|
+
* for the OS tmp reaper, and the harness may still hold files briefly).
|
|
7
7
|
*
|
|
8
8
|
* An operator-provided `XPCSHELL_TEST_PROFILE_DIR` (in `baseEnv` or the
|
|
9
9
|
* process environment) is respected verbatim: no directory is minted and
|
|
10
|
-
*
|
|
10
|
+
* nothing is deleted, because we never remove a directory we did not create.
|
|
11
11
|
*/
|
|
12
12
|
export declare function withXpcshellProfileDir<T>(baseEnv: Record<string, string> | undefined, fn: (env: Record<string, string>) => Promise<T>): Promise<T>;
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* Per-invocation xpcshell profile directory.
|
|
4
4
|
*
|
|
5
5
|
* Firefox's xpcshell harness defaults `XPCSHELL_TEST_PROFILE_DIR` to a
|
|
6
|
-
*
|
|
7
|
-
* harness invocations
|
|
8
|
-
* verification-tree shards
|
|
9
|
-
* never set the variable
|
|
6
|
+
* fixed path (`$TMPDIR/firefox/xpcshellprofile`), so two overlapping
|
|
7
|
+
* harness invocations (concurrent `fireforge test` processes, or future
|
|
8
|
+
* verification-tree shards) corrupt each other's profiles. FireForge
|
|
9
|
+
* never set the variable. This helper mints a fresh `mkdtemp` directory
|
|
10
10
|
* per harness invocation and exports it through the mach env channel.
|
|
11
11
|
*/
|
|
12
12
|
import { mkdtemp, rm } from 'node:fs/promises';
|
|
@@ -18,12 +18,12 @@ export const XPCSHELL_PROFILE_ENV_VAR = 'XPCSHELL_TEST_PROFILE_DIR';
|
|
|
18
18
|
/**
|
|
19
19
|
* Runs `fn` with a fresh per-invocation xpcshell profile directory
|
|
20
20
|
* injected into the environment, removing the directory afterwards
|
|
21
|
-
* (best-effort
|
|
22
|
-
* for the OS tmp reaper
|
|
21
|
+
* (best-effort: a failure to clean up warns and leaves the mkdtemp dir
|
|
22
|
+
* for the OS tmp reaper, and the harness may still hold files briefly).
|
|
23
23
|
*
|
|
24
24
|
* An operator-provided `XPCSHELL_TEST_PROFILE_DIR` (in `baseEnv` or the
|
|
25
25
|
* process environment) is respected verbatim: no directory is minted and
|
|
26
|
-
*
|
|
26
|
+
* nothing is deleted, because we never remove a directory we did not create.
|
|
27
27
|
*/
|
|
28
28
|
export async function withXpcshellProfileDir(baseEnv, fn) {
|
|
29
29
|
const operatorProvided = baseEnv?.[XPCSHELL_PROFILE_ENV_VAR] ?? process.env[XPCSHELL_PROFILE_ENV_VAR];
|