@hominis/fireforge 0.46.0 → 0.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +17 -9
- package/dist/src/core/token-dark-mode.js +41 -28
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* command.
|
|
6
6
|
*
|
|
7
7
|
* Distinct from `patch-lint-checkjs.ts` (patch-hygiene): patchLint is
|
|
8
|
-
* scoped, fireforge-controlled, and runs as part of `fireforge lint
|
|
9
|
-
*
|
|
8
|
+
* scoped, fireforge-controlled, and runs as part of `fireforge lint`.
|
|
9
|
+
* This command runs whole projects with user-controlled compiler
|
|
10
10
|
* options and is intended as a CI gate. The two share the Firefox
|
|
11
11
|
* globals shim and suppressed-code list (via `typecheck-shim.ts`) so
|
|
12
12
|
* a file that lints clean cannot fail typecheck for a reason the
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*
|
|
15
15
|
* Loads the TypeScript compiler API via dynamic import so it is only
|
|
16
16
|
* required when `typecheck.projects` is configured. TypeScript
|
|
17
|
-
* remains a dev-dependency
|
|
17
|
+
* remains a dev-dependency. If a user invokes `fireforge typecheck`
|
|
18
18
|
* without installing it, the function returns a clear error pointing
|
|
19
19
|
* at `npm install typescript`.
|
|
20
20
|
*/
|
|
@@ -27,7 +27,7 @@ import { composeShimSource, SHIM_FILENAME, SUPPRESSED_DIAGNOSTIC_CODES, UNDEFINE
|
|
|
27
27
|
/**
|
|
28
28
|
* Sentinel string surfaced as a `TypecheckIssue.message` when the
|
|
29
29
|
* project's jsconfig sets `checkJs: false`. Exported so tests can
|
|
30
|
-
* pin the contract
|
|
30
|
+
* pin the contract, since operators rely on it to spot opted-out projects
|
|
31
31
|
* in CI logs.
|
|
32
32
|
*/
|
|
33
33
|
export const CHECK_JS_DISABLED_NOTICE = 'Project sets "checkJs: false" — skipping (override the jsconfig to enable typecheck).';
|
|
@@ -36,20 +36,20 @@ export const CHECK_JS_DISABLED_NOTICE = 'Project sets "checkJs: false" — skipp
|
|
|
36
36
|
*
|
|
37
37
|
* Per-project flow:
|
|
38
38
|
* 1. Read the jsconfig via the TS API. JSON parse / config-spec
|
|
39
|
-
* errors are surfaced as issues
|
|
40
|
-
* project must not abort the rest of the run.
|
|
39
|
+
* errors are surfaced as issues rather than thrown, because a single
|
|
40
|
+
* broken project must not abort the rest of the run.
|
|
41
41
|
* 2. Compute final compiler options from the user's options. We
|
|
42
|
-
* only force `noEmit: true` (this is a typecheck, not a build)
|
|
43
|
-
*
|
|
42
|
+
* only force `noEmit: true` (this is a typecheck, not a build).
|
|
43
|
+
* We honour `strict`, `target`, `lib`, `module`, `paths`,
|
|
44
44
|
* `include`, `exclude`. `allowJs` and `checkJs` default to
|
|
45
|
-
* `true` only when the user has not set them
|
|
45
|
+
* `true` only when the user has not set them. If the user set
|
|
46
46
|
* `checkJs: false` we treat that as an explicit opt-out and
|
|
47
47
|
* skip the project with a single notice (see {@link CHECK_JS_DISABLED_NOTICE}).
|
|
48
48
|
* 3. Inject the synthetic shim (built-in + optional extraShim) as
|
|
49
49
|
* a virtual root file that the custom CompilerHost serves.
|
|
50
|
-
* 4. Build the program
|
|
51
|
-
* global diagnostics. The patchLint flow only reads semantic +
|
|
52
|
-
* syntactic
|
|
50
|
+
* 4. Build the program and collect semantic, syntactic, options,
|
|
51
|
+
* and global diagnostics. The patchLint flow only reads semantic +
|
|
52
|
+
* syntactic, which is fine for hygiene, but a CI gate needs the full
|
|
53
53
|
* set so misconfigured `lib`/`paths` entries fail loudly.
|
|
54
54
|
* 5. Drop diagnostics whose code is in `SUPPRESSED_DIAGNOSTIC_CODES`
|
|
55
55
|
* and any diagnostic originating in the synthetic shim itself.
|
|
@@ -61,8 +61,8 @@ export const CHECK_JS_DISABLED_NOTICE = 'Project sets "checkJs: false" — skipp
|
|
|
61
61
|
* and computing the exit code.
|
|
62
62
|
*/
|
|
63
63
|
export async function runTypecheck(projectRoot, cfg) {
|
|
64
|
-
// Dynamic import
|
|
65
|
-
// as `patch-lint-checkjs.ts
|
|
64
|
+
// Dynamic import, so typescript stays a dev dependency. Same pattern
|
|
65
|
+
// as `patch-lint-checkjs.ts`. The empty-projects-array case is
|
|
66
66
|
// already rejected by config-validate, so we don't gate the import
|
|
67
67
|
// on `cfg.projects.length`.
|
|
68
68
|
let ts;
|
|
@@ -86,7 +86,7 @@ export async function runTypecheck(projectRoot, cfg) {
|
|
|
86
86
|
filesChecked: 0,
|
|
87
87
|
}));
|
|
88
88
|
}
|
|
89
|
-
// Compose the shim
|
|
89
|
+
// Compose the shim per project: the effective extraShim is the per-project
|
|
90
90
|
// override (a path, or `null` to opt out) when present, else the shared
|
|
91
91
|
// top-level extraShim. A project that narrows `lib`/`types` can opt out of
|
|
92
92
|
// a Gecko-lib shim hub that another project needs, so the composed shim is
|
|
@@ -114,7 +114,7 @@ export async function runTypecheck(projectRoot, cfg) {
|
|
|
114
114
|
}
|
|
115
115
|
catch (err) {
|
|
116
116
|
// A missing or unreadable shim fails only the project(s) that use it,
|
|
117
|
-
// not the whole run
|
|
117
|
+
// not the whole run. Projects with a different (or no) shim still run.
|
|
118
118
|
const message = toError(err).message;
|
|
119
119
|
results.push({
|
|
120
120
|
project: projectPath,
|
|
@@ -139,7 +139,7 @@ export async function runTypecheck(projectRoot, cfg) {
|
|
|
139
139
|
}
|
|
140
140
|
/**
|
|
141
141
|
* Resolves the effective extra shim for a single project: a `projectOverrides`
|
|
142
|
-
* entry wins (a string path overrides
|
|
142
|
+
* entry wins (a string path overrides, `null` opts out → `undefined`), else
|
|
143
143
|
* the shared top-level `extraShim` applies.
|
|
144
144
|
*/
|
|
145
145
|
function resolveProjectExtraShim(cfg, projectPath) {
|
|
@@ -171,7 +171,7 @@ async function runTypecheckForProject(ts, projectRoot, projectPath, shimSource,
|
|
|
171
171
|
};
|
|
172
172
|
}
|
|
173
173
|
// 1) Read the JSON config. ts.readConfigFile reports JSON-shape
|
|
174
|
-
// errors via the returned diagnostic
|
|
174
|
+
// errors via the returned diagnostic. Missing files fall back to
|
|
175
175
|
// pathExists above, which gives a more directly actionable message.
|
|
176
176
|
const readResult = ts.readConfigFile(absConfig, (path) => ts.sys.readFile(path));
|
|
177
177
|
if (readResult.error) {
|
|
@@ -183,7 +183,7 @@ async function runTypecheckForProject(ts, projectRoot, projectPath, shimSource,
|
|
|
183
183
|
}
|
|
184
184
|
// 2) Parse the config content. This is what surfaces config-spec
|
|
185
185
|
// errors (unknown options, mismatched types in `compilerOptions`,
|
|
186
|
-
// bad `include` patterns, etc.)
|
|
186
|
+
// bad `include` patterns, etc.), the TS5xxx codes. We surface them
|
|
187
187
|
// alongside semantic diagnostics so the operator sees the same
|
|
188
188
|
// output `tsc -p` would have produced.
|
|
189
189
|
const parsed = ts.parseJsonConfigFileContent(readResult.config, ts.sys, dirname(absConfig),
|
|
@@ -196,7 +196,7 @@ async function runTypecheckForProject(ts, projectRoot, projectPath, shimSource,
|
|
|
196
196
|
}
|
|
197
197
|
// 3) Honour explicit `checkJs: false`. The user has opted out for
|
|
198
198
|
// an IDE reason (likely "checkJs floods my workflow with non-actionable
|
|
199
|
-
// notes")
|
|
199
|
+
// notes"). Flipping it on here would surface ~hundreds of issues that
|
|
200
200
|
// the operator already evaluated and rejected. Surface a single
|
|
201
201
|
// notice so it is visible in CI logs rather than silently passing.
|
|
202
202
|
const rawConfig = readResult.config;
|
|
@@ -212,10 +212,10 @@ async function runTypecheckForProject(ts, projectRoot, projectPath, shimSource,
|
|
|
212
212
|
});
|
|
213
213
|
return { project: projectPath, issues, filesChecked: parsed.fileNames.length };
|
|
214
214
|
}
|
|
215
|
-
// 4) Compute final compiler options. `noEmit: true` is forced
|
|
215
|
+
// 4) Compute final compiler options. `noEmit: true` is forced, so we
|
|
216
216
|
// never write artifacts. `allowJs` / `checkJs` default to true
|
|
217
217
|
// *only* when unset (so a user can flip them off without us
|
|
218
|
-
// overriding)
|
|
218
|
+
// overriding). If the user set `allowJs: false` they're saying
|
|
219
219
|
// "don't even include JS in this typecheck", which is rare but
|
|
220
220
|
// legitimate (e.g. an isolated `.d.ts`-only project).
|
|
221
221
|
const options = {
|
|
@@ -225,26 +225,26 @@ async function runTypecheckForProject(ts, projectRoot, projectPath, shimSource,
|
|
|
225
225
|
checkJs: parsed.options.checkJs ?? true,
|
|
226
226
|
// No incremental sidecar, ever. A user jsconfig under `engine/` that sets
|
|
227
227
|
// `incremental` (or names a `tsBuildInfoFile`) would have this command
|
|
228
|
-
// drop a `.tsbuildinfo` inside the primary engine checkout
|
|
228
|
+
// drop a `.tsbuildinfo` inside the primary engine checkout: a second
|
|
229
229
|
// writer that invalidates a concurrent `fireforge test`'s engine
|
|
230
230
|
// fingerprint. This command emits nothing, so the sidecar buys nothing
|
|
231
231
|
// either.
|
|
232
232
|
incremental: false,
|
|
233
|
-
// skipLibCheck is not forced
|
|
233
|
+
// skipLibCheck is not forced. The user owns it via their jsconfig.
|
|
234
234
|
};
|
|
235
235
|
// `exactOptionalPropertyTypes` forbids assigning `undefined` to an
|
|
236
236
|
// optional `string`, so the sidecar path is dropped rather than unset.
|
|
237
237
|
delete options.tsBuildInfoFile;
|
|
238
238
|
// 5) The synthetic shim file. Use a project-rooted path with a
|
|
239
239
|
// hidden-style prefix so it is unlikely to collide with any real
|
|
240
|
-
// file
|
|
240
|
+
// file, and never write it to disk. The CompilerHost below serves
|
|
241
241
|
// it from `shimSource` for `fileExists`/`readFile`/`getSourceFile`.
|
|
242
242
|
const projectDir = dirname(absConfig);
|
|
243
|
-
// Forward slashes
|
|
243
|
+
// Forward slashes on purpose: TypeScript normalizes every `fileName` it
|
|
244
244
|
// hands a CompilerHost, on every platform. A shim path carrying Windows
|
|
245
245
|
// separators never matches those callbacks, so the shim is not served (its
|
|
246
246
|
// globals report as undefined identifiers) and its own diagnostics are not
|
|
247
|
-
// filtered out below
|
|
247
|
+
// filtered out below, so the pass reports failures that do not exist.
|
|
248
248
|
const shimPath = normalizePathSlashes(resolve(projectDir, `.fireforge-${SHIM_FILENAME}`));
|
|
249
249
|
const rootFiles = [...parsed.fileNames, shimPath];
|
|
250
250
|
const defaultHost = ts.createCompilerHost(options);
|
|
@@ -269,7 +269,7 @@ async function runTypecheckForProject(ts, projectRoot, projectPath, shimSource,
|
|
|
269
269
|
};
|
|
270
270
|
const program = ts.createProgram(rootFiles, options, host);
|
|
271
271
|
// Collect the full diagnostic set. patchLint reads only semantic +
|
|
272
|
-
// syntactic
|
|
272
|
+
// syntactic, which is fine for hygiene but wrong for CI: a misconfigured
|
|
273
273
|
// `lib: ["es2015"]` or a missing `paths` target should fail
|
|
274
274
|
// typecheck loudly via getOptionsDiagnostics / getGlobalDiagnostics.
|
|
275
275
|
const allDiagnostics = [
|
|
@@ -281,7 +281,7 @@ async function runTypecheckForProject(ts, projectRoot, projectPath, shimSource,
|
|
|
281
281
|
for (const diag of allDiagnostics) {
|
|
282
282
|
if (SUPPRESSED_DIAGNOSTIC_CODES.has(diag.code))
|
|
283
283
|
continue;
|
|
284
|
-
// Drop diagnostics that originate in the synthetic shim
|
|
284
|
+
// Drop diagnostics that originate in the synthetic shim. Operators
|
|
285
285
|
// can't act on them and they would clutter CI logs.
|
|
286
286
|
if (diag.file?.fileName === shimPath)
|
|
287
287
|
continue;
|
|
@@ -308,7 +308,7 @@ async function runTypecheckForProject(ts, projectRoot, projectPath, shimSource,
|
|
|
308
308
|
/**
|
|
309
309
|
* Converts a TS Diagnostic to a TypecheckIssue. The `fallbackFile`
|
|
310
310
|
* is used when the diagnostic carries no source file (typical for
|
|
311
|
-
* options diagnostics)
|
|
311
|
+
* options diagnostics). It is typically the absolute jsconfig path or
|
|
312
312
|
* the project-relative form for surface-level errors. `project` is
|
|
313
313
|
* threaded through so the CLI can group issues by project without
|
|
314
314
|
* a second pass.
|
|
@@ -328,7 +328,7 @@ function diagnosticToIssue(ts, diag, fallbackFile, project) {
|
|
|
328
328
|
const message = typeof diag.messageText === 'string'
|
|
329
329
|
? diag.messageText
|
|
330
330
|
: ts.flattenDiagnosticMessageText(diag.messageText, '\n');
|
|
331
|
-
// Suggestion + Message categories collapse to 'warning'
|
|
331
|
+
// Suggestion + Message categories collapse to 'warning'. Only
|
|
332
332
|
// Error stays an error. This matches what the CLI then displays.
|
|
333
333
|
const category = diag.category === ts.DiagnosticCategory.Error ? 'error' : 'warning';
|
|
334
334
|
return {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* browser-init.js
|
|
2
|
+
* browser-init.js: destroy expression in onUnload()/uninit().
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
5
|
* AST-based implementation: finds onUnload()/uninit() method body and
|
|
@@ -16,7 +16,7 @@ export declare function addDestroyAST(content: string, expression: string, marke
|
|
|
16
16
|
export declare function legacyAddDestroy(content: string, expression: string, marker?: string): string;
|
|
17
17
|
/**
|
|
18
18
|
* Adds a destroy expression to the top of onUnload() or uninit() in
|
|
19
|
-
* browser-init.js (LIFO ordering
|
|
19
|
+
* browser-init.js (LIFO ordering, newest first).
|
|
20
20
|
*
|
|
21
21
|
* @param engineDir - Engine source root
|
|
22
22
|
* @param expression - The destroy expression (e.g., "MyComponent.destroy()")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* browser-init.js
|
|
3
|
+
* browser-init.js: destroy expression in onUnload()/uninit().
|
|
4
4
|
*/
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import MagicString from 'magic-string';
|
|
@@ -36,7 +36,7 @@ export function addDestroyAST(content, expression, marker = DEFAULT_MARKER) {
|
|
|
36
36
|
throw new BuildError('Could not find onUnload/uninit method body via AST');
|
|
37
37
|
}
|
|
38
38
|
// Insert at top of method body (LIFO ordering)
|
|
39
|
-
// `noUncheckedIndexedAccess` makes this `Statement | undefined
|
|
39
|
+
// `noUncheckedIndexedAccess` makes this `Statement | undefined`. Narrow
|
|
40
40
|
// before casting rather than laundering the undefined through the cast.
|
|
41
41
|
const firstRaw = body.body[0];
|
|
42
42
|
const firstStmt = firstRaw ? asEstree(firstRaw) : undefined;
|
|
@@ -47,7 +47,7 @@ export function addDestroyAST(content, expression, marker = DEFAULT_MARKER) {
|
|
|
47
47
|
indent = detectIndent(content, firstStmt.start);
|
|
48
48
|
}
|
|
49
49
|
else {
|
|
50
|
-
// Empty method body
|
|
50
|
+
// Empty method body: insert after opening {
|
|
51
51
|
insertPos = body.start + 1;
|
|
52
52
|
indent = ' ';
|
|
53
53
|
}
|
|
@@ -95,7 +95,7 @@ export function legacyAddDestroy(content, expression, marker = DEFAULT_MARKER) {
|
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
97
97
|
* Adds a destroy expression to the top of onUnload() or uninit() in
|
|
98
|
-
* browser-init.js (LIFO ordering
|
|
98
|
+
* browser-init.js (LIFO ordering, newest first).
|
|
99
99
|
*
|
|
100
100
|
* @param engineDir - Engine source root
|
|
101
101
|
* @param expression - The destroy expression (e.g., "MyComponent.destroy()")
|
|
@@ -108,7 +108,7 @@ export async function addDestroyToBrowserInit(engineDir, expression, marker = DE
|
|
|
108
108
|
throw new GeneralError(`${BROWSER_INIT_JS} not found in engine`);
|
|
109
109
|
}
|
|
110
110
|
const content = await readText(filePath);
|
|
111
|
-
// Idempotency check
|
|
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
113
|
// bare `X.destroy` invocation that coercion already persisted as
|
|
114
114
|
// `X.destroy()`.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Top-level chrome document
|
|
2
|
+
* Top-level chrome document: DOM fragment insertion.
|
|
3
3
|
*
|
|
4
4
|
* Default target is `browser/base/content/browser.xhtml`. Forks that replace
|
|
5
5
|
* browser.xhtml with a custom top-level chrome document pass the replacement
|
|
6
|
-
* path in via `targetPath
|
|
6
|
+
* path in via `targetPath`. The insertion logic is shape-agnostic (looks for
|
|
7
7
|
* `#include browser-sets.inc`, then falls back to `<html:body>`), so any
|
|
8
8
|
* browser.xhtml-shaped xhtml works.
|
|
9
9
|
*/
|
|
@@ -15,7 +15,7 @@ export declare function addDomFragmentTokenized(content: string, includeDirectiv
|
|
|
15
15
|
/**
|
|
16
16
|
* Dry-run precheck for `addDomFragment`. Reads the resolved chrome document
|
|
17
17
|
* and verifies it either already contains the `#include` directive (the
|
|
18
|
-
* idempotent-skip case)
|
|
18
|
+
* idempotent-skip case) or offers a locatable insertion point via
|
|
19
19
|
* {@link addDomFragmentTokenized} / {@link legacyAddDomFragment}. Throws the
|
|
20
20
|
* same `Could not find insertion point in chrome document` error the real
|
|
21
21
|
* run would throw when neither condition holds.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* Top-level chrome document
|
|
3
|
+
* Top-level chrome document: DOM fragment insertion.
|
|
4
4
|
*
|
|
5
5
|
* Default target is `browser/base/content/browser.xhtml`. Forks that replace
|
|
6
6
|
* browser.xhtml with a custom top-level chrome document pass the replacement
|
|
7
|
-
* path in via `targetPath
|
|
7
|
+
* path in via `targetPath`. The insertion logic is shape-agnostic (looks for
|
|
8
8
|
* `#include browser-sets.inc`, then falls back to `<html:body>`), so any
|
|
9
9
|
* browser.xhtml-shaped xhtml works.
|
|
10
10
|
*/
|
|
@@ -38,7 +38,7 @@ export function addDomFragmentTokenized(content, includeDirective) {
|
|
|
38
38
|
/**
|
|
39
39
|
* Dry-run precheck for `addDomFragment`. Reads the resolved chrome document
|
|
40
40
|
* and verifies it either already contains the `#include` directive (the
|
|
41
|
-
* idempotent-skip case)
|
|
41
|
+
* idempotent-skip case) or offers a locatable insertion point via
|
|
42
42
|
* {@link addDomFragmentTokenized} / {@link legacyAddDomFragment}. Throws the
|
|
43
43
|
* same `Could not find insertion point in chrome document` error the real
|
|
44
44
|
* run would throw when neither condition holds.
|
|
@@ -51,7 +51,7 @@ export async function probeDomFragmentInsertionPoint(engineDir, domFilePath, tar
|
|
|
51
51
|
const targetAbsPath = join(engineDir, targetPath);
|
|
52
52
|
if (!(await pathExists(targetAbsPath))) {
|
|
53
53
|
// The callers in `wire.ts` run their own existence probe before
|
|
54
|
-
// invoking this helper, but a well-behaved probe is
|
|
54
|
+
// invoking this helper, but a well-behaved probe is careful: if
|
|
55
55
|
// something changed between the two checks, fail with the same
|
|
56
56
|
// error the real run would surface.
|
|
57
57
|
throw new GeneralError(`${targetPath} not found in engine`);
|
|
@@ -62,7 +62,7 @@ export async function probeDomFragmentInsertionPoint(engineDir, domFilePath, tar
|
|
|
62
62
|
const includeDirective = `#include ${includePath}`;
|
|
63
63
|
const content = await readText(targetAbsPath);
|
|
64
64
|
if (new RegExp(`^${escapeRegex(includeDirective)}$`, 'm').test(content)) {
|
|
65
|
-
// Already wired
|
|
65
|
+
// Already wired. The real run would idempotent-skip here, so
|
|
66
66
|
// dry-run is allowed to proceed too.
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
@@ -93,7 +93,7 @@ export async function addDomFragment(engineDir, domFilePath, targetPath = DEFAUL
|
|
|
93
93
|
if (!(await pathExists(targetAbsPath))) {
|
|
94
94
|
throw new GeneralError(`${targetPath} not found in engine`);
|
|
95
95
|
}
|
|
96
|
-
// Compute include path relative to the target's directory
|
|
96
|
+
// Compute include path relative to the target's directory. The `#include`
|
|
97
97
|
// directive is resolved by the preprocessor relative to the file that
|
|
98
98
|
// contains it, so this must track the chrome doc's location, not a
|
|
99
99
|
// hardcoded `browser/base/content/`.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* browser-init.js
|
|
2
|
+
* browser-init.js: init expression in onLoad().
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
5
|
* AST-based implementation: finds onLoad() method body, locates existing
|
|
@@ -8,7 +8,7 @@
|
|
|
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
|
|
11
|
+
* `lintModificationComments` looks for. Otherwise the first export after
|
|
12
12
|
* `wire` trips `missing-modification-comment` on wire-generated edits.
|
|
13
13
|
*/
|
|
14
14
|
export declare function addInitAST(content: string, expression: string, after?: string, marker?: string): string;
|
|
@@ -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,7 +159,7 @@ export function tokenizeXhtml(lines) {
|
|
|
159
159
|
});
|
|
160
160
|
}
|
|
161
161
|
// ---------------------------------------------------------------------------
|
|
162
|
-
// Legacy (line-based) helpers
|
|
162
|
+
// Legacy (line-based) helpers, shared by fallback implementations in
|
|
163
163
|
// the wire target modules. Extracted to reduce duplication and make the brace-
|
|
164
164
|
// walking logic independently testable.
|
|
165
165
|
// ---------------------------------------------------------------------------
|
|
@@ -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
|
*
|
|
@@ -194,10 +194,10 @@ export function findMethodBraceIndex(lines, pattern, options) {
|
|
|
194
194
|
* Starting from `startLine`, walks lines using {@link countBraceDepth}
|
|
195
195
|
* until the brace depth returns to zero (i.e., the enclosing block closes).
|
|
196
196
|
*
|
|
197
|
-
* Default behaviour is defensive
|
|
197
|
+
* Default behaviour is defensive: if the block never closes, the helper
|
|
198
198
|
* returns `startLine + 1` so a single malformed file does not stop the
|
|
199
199
|
* entire fallback path. Pass `{ strict: true }` to opt into failing loudly
|
|
200
|
-
* with a {@link ParserFallbackError} instead
|
|
200
|
+
* with a {@link ParserFallbackError} instead. New callers should prefer
|
|
201
201
|
* strict mode so silent mis-insertions surface as the fallback refusing
|
|
202
202
|
* to touch the file.
|
|
203
203
|
*
|
|
@@ -247,7 +247,7 @@ export function computeFileBraceBalance(content) {
|
|
|
247
247
|
* Round-trip guard used after a legacy fallback mutation: if the file's
|
|
248
248
|
* net brace balance drifts between `before` and `after`, something went
|
|
249
249
|
* wrong and the fallback is refusing to write a corrupted file. Expects
|
|
250
|
-
* the delta to be exactly zero
|
|
250
|
+
* the delta to be exactly zero, since wire fallbacks only insert whole
|
|
251
251
|
* try/catch blocks, which always contribute equal opens and closes.
|
|
252
252
|
*
|
|
253
253
|
* @throws {@link ParserFallbackError} when the balance delta is non-zero.
|
|
@@ -283,7 +283,7 @@ const FIREFORGE_BLOCK_PATTERN = /\/\/\s*.*init\s*—|typeof\s+\w+\s*!==\s*"undef
|
|
|
283
283
|
/**
|
|
284
284
|
* Scans lines starting from `startLine` for consecutive fireforge try-catch
|
|
285
285
|
* blocks (identified by init comments or typeof guards) and returns the
|
|
286
|
-
* line index just after the last such block
|
|
286
|
+
* line index just after the last such block, i.e. where a new block should
|
|
287
287
|
* be inserted.
|
|
288
288
|
*
|
|
289
289
|
* Non-fireforge, non-blank, non-comment lines terminate the scan.
|