@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,21 +1,14 @@
|
|
|
1
1
|
import { FireForgeError } from '../errors/base.js';
|
|
2
2
|
import type { ProjectLicense } from '../types/config.js';
|
|
3
|
-
/**
|
|
4
|
-
* Error thrown when branding operations fail.
|
|
5
|
-
*/
|
|
6
|
-
export declare class BrandingError extends FireForgeError {
|
|
7
|
-
readonly code: 6;
|
|
8
|
-
get userMessage(): string;
|
|
9
|
-
}
|
|
10
3
|
/**
|
|
11
4
|
* Error thrown when the generated `mozconfig` references a `--with-branding`
|
|
12
5
|
* directory that does not match the branding tree FireForge set up. The
|
|
13
|
-
* mismatch is a silent-corruption hazard
|
|
6
|
+
* mismatch is a silent-corruption hazard: `mach configure` picks the value
|
|
14
7
|
* from mozconfig but the scaffolded branding lives elsewhere, so the build
|
|
15
8
|
* fails deep inside moz.build resolution with a confusing "path does not
|
|
16
9
|
* exist" message. Surface it as an actionable preflight instead.
|
|
17
10
|
*
|
|
18
|
-
* Setup renders templates under `configs/` with `${binaryName}` baked in
|
|
11
|
+
* Setup renders templates under `configs/` with `${binaryName}` baked in. A
|
|
19
12
|
* later edit to `fireforge.json`'s `binaryName` (or a re-setup without
|
|
20
13
|
* re-templating) leaves those names stale while `setupBranding` keeps using
|
|
21
14
|
* the current value. Both directions produce the same class of build break.
|
|
@@ -44,8 +37,8 @@ export interface BrandingConfig {
|
|
|
44
37
|
* Project license (from fireforge.json). Used to stamp the generated
|
|
45
38
|
* `configure.sh`, `brand.properties`, and `brand.ftl` files with the
|
|
46
39
|
* matching header so `patch-lint` does not flag them for
|
|
47
|
-
* `missing-license-header` when the project is not MPL-2.0. Optional
|
|
48
|
-
*
|
|
40
|
+
* `missing-license-header` when the project is not MPL-2.0. Optional.
|
|
41
|
+
* Falls back to {@link DEFAULT_LICENSE}.
|
|
49
42
|
*/
|
|
50
43
|
license?: ProjectLicense;
|
|
51
44
|
}
|
|
@@ -54,7 +47,7 @@ export interface BrandingConfig {
|
|
|
54
47
|
* `toolkit/moz.configure` composes `CFBundleIdentifier` as
|
|
55
48
|
* `<--with-distribution-id>.<MOZ_MACBUNDLE_ID>` (the distribution id
|
|
56
49
|
* defaults to `org.mozilla`), so branding `configure.sh` must carry only the
|
|
57
|
-
*
|
|
50
|
+
* leaf segment while the generated mozconfig carries the remainder as
|
|
58
51
|
* `--with-distribution-id`. Writing the full appId into `MOZ_MACBUNDLE_ID`
|
|
59
52
|
* double-prefixes the shipped bundle id. Config validation guarantees a
|
|
60
53
|
* reverse-domain id, so the split always has both halves.
|
|
@@ -4,11 +4,12 @@ import { FireForgeError } from '../errors/base.js';
|
|
|
4
4
|
import { ExitCode } from '../errors/codes.js';
|
|
5
5
|
import { copyDir, pathExists, readText, writeTextIfChanged } from '../utils/fs.js';
|
|
6
6
|
import { warn } from '../utils/logger.js';
|
|
7
|
+
import { normalizePathSlashes } from '../utils/paths.js';
|
|
7
8
|
import { DEFAULT_LICENSE, getLicenseHeader } from './license-headers.js';
|
|
8
9
|
/**
|
|
9
10
|
* Error thrown when branding operations fail.
|
|
10
11
|
*/
|
|
11
|
-
|
|
12
|
+
class BrandingError extends FireForgeError {
|
|
12
13
|
code = ExitCode.PATCH_ERROR;
|
|
13
14
|
get userMessage() {
|
|
14
15
|
return `Branding Error: ${this.message}\n\nBranding is required to set MOZ_APP_VENDOR, MOZ_MACBUNDLE_ID, and other Firefox identity values.`;
|
|
@@ -17,12 +18,12 @@ export class BrandingError extends FireForgeError {
|
|
|
17
18
|
/**
|
|
18
19
|
* Error thrown when the generated `mozconfig` references a `--with-branding`
|
|
19
20
|
* directory that does not match the branding tree FireForge set up. The
|
|
20
|
-
* mismatch is a silent-corruption hazard
|
|
21
|
+
* mismatch is a silent-corruption hazard: `mach configure` picks the value
|
|
21
22
|
* from mozconfig but the scaffolded branding lives elsewhere, so the build
|
|
22
23
|
* fails deep inside moz.build resolution with a confusing "path does not
|
|
23
24
|
* exist" message. Surface it as an actionable preflight instead.
|
|
24
25
|
*
|
|
25
|
-
* Setup renders templates under `configs/` with `${binaryName}` baked in
|
|
26
|
+
* Setup renders templates under `configs/` with `${binaryName}` baked in. A
|
|
26
27
|
* later edit to `fireforge.json`'s `binaryName` (or a re-setup without
|
|
27
28
|
* re-templating) leaves those names stale while `setupBranding` keeps using
|
|
28
29
|
* the current value. Both directions produce the same class of build break.
|
|
@@ -56,7 +57,7 @@ export class BrandingMozconfigMismatchError extends FireForgeError {
|
|
|
56
57
|
* `toolkit/moz.configure` composes `CFBundleIdentifier` as
|
|
57
58
|
* `<--with-distribution-id>.<MOZ_MACBUNDLE_ID>` (the distribution id
|
|
58
59
|
* defaults to `org.mozilla`), so branding `configure.sh` must carry only the
|
|
59
|
-
*
|
|
60
|
+
* leaf segment while the generated mozconfig carries the remainder as
|
|
60
61
|
* `--with-distribution-id`. Writing the full appId into `MOZ_MACBUNDLE_ID`
|
|
61
62
|
* double-prefixes the shipped bundle id. Config validation guarantees a
|
|
62
63
|
* reverse-domain id, so the split always has both halves.
|
|
@@ -361,7 +362,7 @@ export async function isBrandingSetup(engineDir, config) {
|
|
|
361
362
|
* @returns true if the path is managed by branding tooling
|
|
362
363
|
*/
|
|
363
364
|
export function isBrandingManagedPath(file, binaryName) {
|
|
364
|
-
const normalized = file
|
|
365
|
+
const normalized = normalizePathSlashes(file);
|
|
365
366
|
const brandingRoot = `browser/branding/${binaryName}`;
|
|
366
367
|
return (normalized === 'browser/moz.configure' ||
|
|
367
368
|
normalized === brandingRoot ||
|
|
@@ -30,7 +30,7 @@ export interface WireOptions {
|
|
|
30
30
|
* replacement path here.
|
|
31
31
|
*/
|
|
32
32
|
domTargetPath?: string | undefined;
|
|
33
|
-
/** Dry run
|
|
33
|
+
/** Dry run: don't write any files */
|
|
34
34
|
dryRun?: boolean | undefined;
|
|
35
35
|
/** Insert init block after the block containing this name */
|
|
36
36
|
after?: string | undefined;
|
|
@@ -4,11 +4,14 @@ import { GeneralError } from '../errors/base.js';
|
|
|
4
4
|
import { toError } from '../utils/errors.js';
|
|
5
5
|
import { verbose } from '../utils/logger.js';
|
|
6
6
|
import { toRootRelativePath } from '../utils/paths.js';
|
|
7
|
+
import { normalizePathSlashes } from '../utils/paths.js';
|
|
7
8
|
import { getProjectPaths, loadConfig } from './config.js';
|
|
8
9
|
import { assertSnapshotted, createRollbackJournal, restoreRollbackJournal, snapshotFile, } from './furnace-rollback.js';
|
|
9
10
|
import { registerBrowserContent } from './moz-manifest-register.js';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
11
|
+
import { addDestroyToBrowserInit } from './wire-destroy.js';
|
|
12
|
+
import { addDomFragment, DEFAULT_DOM_TARGET } from './wire-dom-fragment.js';
|
|
13
|
+
import { addInitToBrowserInit } from './wire-init.js';
|
|
14
|
+
import { addSubscriptToBrowserMain } from './wire-subscript.js';
|
|
12
15
|
export const DEFAULT_BROWSER_SUBSCRIPT_DIR = 'browser/base/content';
|
|
13
16
|
const BROWSER_BASE_DIR = 'browser/base';
|
|
14
17
|
/**
|
|
@@ -25,7 +28,7 @@ export async function wireSubscript(root, name, options = {}) {
|
|
|
25
28
|
// Compute jar.mn source path relative to browser/base/
|
|
26
29
|
let jarMnSourcePath;
|
|
27
30
|
if (subscriptDir !== DEFAULT_BROWSER_SUBSCRIPT_DIR) {
|
|
28
|
-
const relPath = relative(join(engineDir, BROWSER_BASE_DIR), join(engineDir, subscriptDir))
|
|
31
|
+
const relPath = normalizePathSlashes(relative(join(engineDir, BROWSER_BASE_DIR), join(engineDir, subscriptDir)));
|
|
29
32
|
jarMnSourcePath = `${relPath}/${name}.js`;
|
|
30
33
|
}
|
|
31
34
|
if (options.dryRun) {
|
|
@@ -83,9 +86,9 @@ export async function wireSubscript(root, name, options = {}) {
|
|
|
83
86
|
let initAdded = false;
|
|
84
87
|
if (options.init) {
|
|
85
88
|
// The snapshot above is taken when init or destroy is `!== undefined`
|
|
86
|
-
// while these writes fire on truthiness
|
|
87
|
-
// conditions over the same file,
|
|
88
|
-
//
|
|
89
|
+
// while these writes fire on truthiness. Close, but two separate
|
|
90
|
+
// conditions over the same file, and that kind of pairing drifts when
|
|
91
|
+
// a third writer is added later.
|
|
89
92
|
assertSnapshotted(journal, join(engineDir, 'browser/base/content/browser-init.js'), 'browser wire init');
|
|
90
93
|
initAdded = await addInitToBrowserInit(engineDir, options.init, options.after, marker);
|
|
91
94
|
}
|
|
@@ -116,7 +119,7 @@ export async function wireSubscript(root, name, options = {}) {
|
|
|
116
119
|
// original wire failure and the rollback failure so the operator knows
|
|
117
120
|
// the engine may be in a partially-wired state that needs manual
|
|
118
121
|
// attention. The original error's message is preserved so the user sees
|
|
119
|
-
//
|
|
122
|
+
// why the wire failed (e.g. "Could not find insertion point in chrome
|
|
120
123
|
// document") alongside any rollback diagnosis.
|
|
121
124
|
const originalMessage = toError(error).message;
|
|
122
125
|
try {
|
|
@@ -25,10 +25,10 @@ export declare function findEnclosingGate(content: string, basename: string): st
|
|
|
25
25
|
/**
|
|
26
26
|
* Determines whether the given source file is gated off on the current
|
|
27
27
|
* host by an enclosing `if CONFIG[...]:` block in its owning moz.build,
|
|
28
|
-
*
|
|
28
|
+
* or by a path-convention rule for installer-tree subdirectories that
|
|
29
29
|
* are packaged via Makefile.in recipes the audit does not parse.
|
|
30
|
-
* Returns `gatedOff: false` and no expression when no gate is found
|
|
31
|
-
*
|
|
30
|
+
* Returns `gatedOff: false` and no expression when no gate is found. The
|
|
31
|
+
* file is not platform-restricted, so the caller should audit it
|
|
32
32
|
* normally.
|
|
33
33
|
*
|
|
34
34
|
* @param engineDir Absolute path to the engine root
|
|
@@ -36,3 +36,32 @@ export declare function findEnclosingGate(content: string, basename: string): st
|
|
|
36
36
|
* @returns Detection result
|
|
37
37
|
*/
|
|
38
38
|
export declare function detectPlatformGate(engineDir: string, sourcePath: string): Promise<PlatformGateResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Result of an ancestor `DIRS +=` gate lookup.
|
|
41
|
+
*/
|
|
42
|
+
export interface AncestorDirsGateResult {
|
|
43
|
+
/** True when an ancestor's `DIRS` entry is gated off on this host. */
|
|
44
|
+
gatedOff: boolean;
|
|
45
|
+
/** The gate expression that excluded the directory. */
|
|
46
|
+
gateExpression?: string;
|
|
47
|
+
/** Engine-relative path of the `moz.build` carrying the gate. */
|
|
48
|
+
gateFile?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Determines whether the source file's directory is excluded from this
|
|
52
|
+
* build by a gate in an ancestor `moz.build`.
|
|
53
|
+
*
|
|
54
|
+
* `detectPlatformGate` reads only the file's own nearest `moz.build`, which
|
|
55
|
+
* misses the common Firefox shape where the whole subtree is reached
|
|
56
|
+
* through a conditional `DIRS +=` one or more levels up: nothing in
|
|
57
|
+
* `toolkit/mozapps/defaultagent/moz.build` says "Windows only", yet none of
|
|
58
|
+
* it is built on macOS.
|
|
59
|
+
*
|
|
60
|
+
* Errs toward not skipping, like the rest of this module: an unreadable or
|
|
61
|
+
* oversized ancestor, or a directory no `DIRS` entry names, yields
|
|
62
|
+
* `gatedOff: false`.
|
|
63
|
+
*
|
|
64
|
+
* @param engineDir - Absolute path to the engine root
|
|
65
|
+
* @param sourcePath - Engine-relative POSIX path of the source file
|
|
66
|
+
*/
|
|
67
|
+
export declare function detectAncestorDirsGate(engineDir: string, sourcePath: string): Promise<AncestorDirsGateResult>;
|
|
@@ -6,35 +6,36 @@
|
|
|
6
6
|
* `if CONFIG["MAKENSISU"]:` (Windows-only stubinstaller) or
|
|
7
7
|
* `if CONFIG["OS_TARGET"] == "Darwin":` (macOS-only artwork). On a host that
|
|
8
8
|
* does not match the gate, the wrapped files are never processed by the
|
|
9
|
-
* build, so they cannot appear under `dist
|
|
9
|
+
* build, so they cannot appear under `dist/`. Without this detection the
|
|
10
10
|
* audit warns about every gated file on every off-platform build.
|
|
11
11
|
*
|
|
12
12
|
* Two gate sources are consulted, in order:
|
|
13
13
|
* 1. Python-style `if CONFIG[...]:` blocks in the owning `moz.build`.
|
|
14
|
-
* 2. Path-convention gates
|
|
14
|
+
* 2. Path-convention gates: certain directory fragments are packaged by
|
|
15
15
|
* platform-specific Makefile.in / NSIS recipes that FireForge does not
|
|
16
16
|
* parse, so a file under `browser/installer/windows/` or any
|
|
17
17
|
* `/stubinstaller/` subtree is Windows-only regardless of what its
|
|
18
18
|
* nearest moz.build says.
|
|
19
19
|
*
|
|
20
|
-
* The detection is
|
|
20
|
+
* The detection is lightweight: walk up from the source file
|
|
21
21
|
* to the closest `moz.build`, scan it for the source basename inside an
|
|
22
22
|
* `if CONFIG[...]:` block, and check whether the gate matches the host. The
|
|
23
23
|
* path-convention pass runs only when no moz.build gate is found, so an
|
|
24
24
|
* explicit gate always wins.
|
|
25
25
|
*
|
|
26
|
-
* Best-effort
|
|
27
|
-
*
|
|
28
|
-
* that should ship on this host) are not, so it errs toward
|
|
29
|
-
* when uncertain.
|
|
26
|
+
* Best-effort. False negatives (missing a gate and warning anyway) are
|
|
27
|
+
* tolerable because the audit is warn-only. False positives (skipping a file
|
|
28
|
+
* that should ship on this host) are not tolerable, so it errs toward not
|
|
29
|
+
* skipping when uncertain.
|
|
30
30
|
*/
|
|
31
|
+
import { stat } from 'node:fs/promises';
|
|
31
32
|
import { dirname, join } from 'node:path';
|
|
32
33
|
import { pathExists, readText } from '../utils/fs.js';
|
|
33
34
|
import { getPlatform } from '../utils/platform.js';
|
|
34
35
|
import { escapeRegex } from '../utils/regex.js';
|
|
35
36
|
/**
|
|
36
37
|
* Tokens that uniquely identify a Windows-only `if CONFIG[...]:` block.
|
|
37
|
-
* `MAKENSISU` is the Windows stubinstaller compiler
|
|
38
|
+
* `MAKENSISU` is the Windows stubinstaller compiler. `OS_TARGET ==
|
|
38
39
|
* "WINNT"` and `MOZ_WIDGET_TOOLKIT == "windows"` are the conventional
|
|
39
40
|
* platform discriminators.
|
|
40
41
|
*/
|
|
@@ -52,7 +53,7 @@ function isGateOffHost(expression, host) {
|
|
|
52
53
|
const matchesDarwin = DARWIN_ONLY_GATE_TOKENS.some((t) => expression.includes(t));
|
|
53
54
|
const matchesLinux = LINUX_ONLY_GATE_TOKENS.some((t) => expression.includes(t));
|
|
54
55
|
// Negation gates (`!= "WINNT"`, `not CONFIG["MAKENSISU"]`) flip the
|
|
55
|
-
// semantics. Keep this conservative
|
|
56
|
+
// semantics. Keep this conservative: if we cannot confidently parse
|
|
56
57
|
// a negation, return false so we don't wrongly suppress a warning.
|
|
57
58
|
const negated = /\bnot\b|!=/.test(expression);
|
|
58
59
|
if (negated)
|
|
@@ -68,7 +69,7 @@ function isGateOffHost(expression, host) {
|
|
|
68
69
|
/**
|
|
69
70
|
* Walks from a starting directory up to (but not above) the engine root,
|
|
70
71
|
* yielding the first `moz.build` encountered. Returns undefined when no
|
|
71
|
-
* ancestor has one
|
|
72
|
+
* ancestor has one, typically only for files that live above any
|
|
72
73
|
* moz.build entry point, which would not be packageable anyway.
|
|
73
74
|
*/
|
|
74
75
|
async function findOwningMozBuild(engineDir, sourceDir) {
|
|
@@ -184,10 +185,10 @@ function findPathConventionGate(sourcePath) {
|
|
|
184
185
|
/**
|
|
185
186
|
* Determines whether the given source file is gated off on the current
|
|
186
187
|
* host by an enclosing `if CONFIG[...]:` block in its owning moz.build,
|
|
187
|
-
*
|
|
188
|
+
* or by a path-convention rule for installer-tree subdirectories that
|
|
188
189
|
* are packaged via Makefile.in recipes the audit does not parse.
|
|
189
|
-
* Returns `gatedOff: false` and no expression when no gate is found
|
|
190
|
-
*
|
|
190
|
+
* Returns `gatedOff: false` and no expression when no gate is found. The
|
|
191
|
+
* file is not platform-restricted, so the caller should audit it
|
|
191
192
|
* normally.
|
|
192
193
|
*
|
|
193
194
|
* @param engineDir Absolute path to the engine root
|
|
@@ -231,3 +232,142 @@ export async function detectPlatformGate(engineDir, sourcePath) {
|
|
|
231
232
|
}
|
|
232
233
|
return { gatedOff: false };
|
|
233
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Maximum ancestor levels walked looking for a gating `DIRS` entry, and the
|
|
237
|
+
* largest `moz.build` read while doing it. The audit runs on every build, so
|
|
238
|
+
* a pathological tree must not be able to make it slow. Beyond these bounds
|
|
239
|
+
* the walk gives up and the caller keeps today's behaviour (warn).
|
|
240
|
+
*/
|
|
241
|
+
const MAX_ANCESTOR_DEPTH = 12;
|
|
242
|
+
const MAX_MOZ_BUILD_BYTES = 256 * 1024;
|
|
243
|
+
/** Matches a line that begins a `DIRS` assignment. */
|
|
244
|
+
const DIRS_ASSIGNMENT_PATTERN = /^\s*DIRS\s*\+?=/;
|
|
245
|
+
/**
|
|
246
|
+
* Collects the full stack of `if CONFIG[…]:` expressions enclosing the
|
|
247
|
+
* `DIRS` entry whose value equals `relDir`.
|
|
248
|
+
*
|
|
249
|
+
* Two differences from {@link findEnclosingGate}, both load-bearing here:
|
|
250
|
+
* only quoted values inside a `DIRS` assignment are considered (an
|
|
251
|
+
* unrelated string literal elsewhere in the file must not gate a
|
|
252
|
+
* directory), and every enclosing expression is returned rather than the
|
|
253
|
+
* innermost. Firefox nests these: `toolkit/moz.build` reaches
|
|
254
|
+
* `mozapps/defaultagent` inside `OS_ARCH == "WINNT"`, then a `CC_TYPE`
|
|
255
|
+
* test, then `MOZ_DEFAULT_BROWSER_AGENT`, and it is the outermost one that
|
|
256
|
+
* excludes the directory on a macOS host.
|
|
257
|
+
*
|
|
258
|
+
* @param content - `moz.build` file content
|
|
259
|
+
* @param relDir - Directory path relative to the `moz.build`, POSIX-separated
|
|
260
|
+
* @returns Enclosing gate expressions, outermost first. Empty when ungated
|
|
261
|
+
* or when no `DIRS` entry reaches `relDir`
|
|
262
|
+
*/
|
|
263
|
+
function findDirsEntryGates(content, relDir) {
|
|
264
|
+
const lines = content.split('\n');
|
|
265
|
+
const stack = [];
|
|
266
|
+
let inDirs = false;
|
|
267
|
+
for (const line of lines) {
|
|
268
|
+
if (line.trim() === '')
|
|
269
|
+
continue;
|
|
270
|
+
const indent = (/^(\s*)/.exec(line)?.[1] ?? '').length;
|
|
271
|
+
while (stack.length > 0) {
|
|
272
|
+
const top = stack[stack.length - 1];
|
|
273
|
+
if (top && indent <= top.indent) {
|
|
274
|
+
stack.pop();
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
const ifMatch = /^\s*if\s+(.+?):\s*(?:#.*)?$/.exec(line);
|
|
280
|
+
if (ifMatch?.[1]) {
|
|
281
|
+
stack.push({ indent, expression: ifMatch[1] });
|
|
282
|
+
inDirs = false;
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
if (DIRS_ASSIGNMENT_PATTERN.test(line)) {
|
|
286
|
+
// A `DIRS += [` list body continues on later lines. A single-line
|
|
287
|
+
// `DIRS += ["x"]` is fully handled by the match below.
|
|
288
|
+
inDirs = !line.includes(']');
|
|
289
|
+
if (dirsLineNames(line, relDir))
|
|
290
|
+
return stack.map((entry) => entry.expression);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
if (inDirs) {
|
|
294
|
+
if (dirsLineNames(line, relDir))
|
|
295
|
+
return stack.map((entry) => entry.expression);
|
|
296
|
+
if (line.includes(']'))
|
|
297
|
+
inDirs = false;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
/** True when `line` carries `relDir` as a quoted value. */
|
|
303
|
+
function dirsLineNames(line, relDir) {
|
|
304
|
+
const escaped = escapeRegex(relDir.replace(/\/+$/, ''));
|
|
305
|
+
return new RegExp(`["']${escaped}\\/?["']`).test(line);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Determines whether the source file's directory is excluded from this
|
|
309
|
+
* build by a gate in an ancestor `moz.build`.
|
|
310
|
+
*
|
|
311
|
+
* `detectPlatformGate` reads only the file's own nearest `moz.build`, which
|
|
312
|
+
* misses the common Firefox shape where the whole subtree is reached
|
|
313
|
+
* through a conditional `DIRS +=` one or more levels up: nothing in
|
|
314
|
+
* `toolkit/mozapps/defaultagent/moz.build` says "Windows only", yet none of
|
|
315
|
+
* it is built on macOS.
|
|
316
|
+
*
|
|
317
|
+
* Errs toward not skipping, like the rest of this module: an unreadable or
|
|
318
|
+
* oversized ancestor, or a directory no `DIRS` entry names, yields
|
|
319
|
+
* `gatedOff: false`.
|
|
320
|
+
*
|
|
321
|
+
* @param engineDir - Absolute path to the engine root
|
|
322
|
+
* @param sourcePath - Engine-relative POSIX path of the source file
|
|
323
|
+
*/
|
|
324
|
+
export async function detectAncestorDirsGate(engineDir, sourcePath) {
|
|
325
|
+
let host;
|
|
326
|
+
try {
|
|
327
|
+
host = getPlatform();
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return { gatedOff: false };
|
|
331
|
+
}
|
|
332
|
+
const segments = sourcePath.split('/').filter(Boolean);
|
|
333
|
+
// Drop the basename: the walk is over directories.
|
|
334
|
+
segments.pop();
|
|
335
|
+
const root = engineDir.replace(/[/\\]+$/, '');
|
|
336
|
+
const depth = Math.min(segments.length, MAX_ANCESTOR_DEPTH);
|
|
337
|
+
// Start at the immediate parent of the file's directory and walk up, so
|
|
338
|
+
// the nearest gating ancestor is found first.
|
|
339
|
+
for (let cut = segments.length - 1; cut >= segments.length - depth; cut -= 1) {
|
|
340
|
+
const ancestorSegments = segments.slice(0, cut);
|
|
341
|
+
const relDir = segments.slice(cut).join('/');
|
|
342
|
+
if (relDir === '')
|
|
343
|
+
continue;
|
|
344
|
+
const mozBuild = join(root, ...ancestorSegments, 'moz.build');
|
|
345
|
+
if (!(await pathExists(mozBuild)))
|
|
346
|
+
continue;
|
|
347
|
+
let content;
|
|
348
|
+
try {
|
|
349
|
+
const stats = await stat(mozBuild);
|
|
350
|
+
if (stats.size > MAX_MOZ_BUILD_BYTES)
|
|
351
|
+
continue;
|
|
352
|
+
content = await readText(mozBuild);
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
const gates = findDirsEntryGates(content, relDir);
|
|
358
|
+
if (gates === undefined)
|
|
359
|
+
continue;
|
|
360
|
+
const offHost = gates.find((expression) => isGateOffHost(expression, host));
|
|
361
|
+
if (offHost !== undefined) {
|
|
362
|
+
return {
|
|
363
|
+
gatedOff: true,
|
|
364
|
+
gateExpression: offHost,
|
|
365
|
+
gateFile: [...ancestorSegments, 'moz.build'].join('/'),
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
// The directory is reached from here and this host passes every gate.
|
|
369
|
+
// A further ancestor cannot un-reach it.
|
|
370
|
+
return { gatedOff: false };
|
|
371
|
+
}
|
|
372
|
+
return { gatedOff: false };
|
|
373
|
+
}
|
|
@@ -32,7 +32,7 @@ export declare function parseJarMnEntry(line: string): {
|
|
|
32
32
|
/**
|
|
33
33
|
* Scans a jar.mn file's contents for an entry whose source reference
|
|
34
34
|
* matches `relativeSource` (POSIX, relative to the jar.mn directory).
|
|
35
|
-
* Returns the first match
|
|
35
|
+
* Returns the first match. jar.mn enforces uniqueness of `(source)` in
|
|
36
36
|
* practice, so a first-match wins behaviour is adequate.
|
|
37
37
|
*/
|
|
38
38
|
export declare function findJarMnEntryForSource(content: string, relativeSource: string): {
|
|
@@ -44,14 +44,14 @@ export declare function findJarMnEntryForSource(content: string, relativeSource:
|
|
|
44
44
|
* the first jar.mn entry that registers the given source. Returns undefined
|
|
45
45
|
* when no ancestor jar.mn claims the source.
|
|
46
46
|
*
|
|
47
|
-
* @param engineDir Absolute engine root
|
|
47
|
+
* @param engineDir Absolute engine root. The walk halts here.
|
|
48
48
|
* @param source Engine-relative POSIX source path.
|
|
49
49
|
*/
|
|
50
50
|
export declare function findRegisteredTarget(engineDir: string, source: string): Promise<RegistrationHit | undefined>;
|
|
51
51
|
/**
|
|
52
52
|
* Probes the dist tree for the artifact registered against the given
|
|
53
53
|
* source. Returns the matched candidate and the registration hit that
|
|
54
|
-
* anchored it
|
|
54
|
+
* anchored it. Undefined when the source has no owning jar.mn or when
|
|
55
55
|
* no same-basename candidate under the search roots ends with the
|
|
56
56
|
* registered target path.
|
|
57
57
|
*
|
|
@@ -69,8 +69,8 @@ export declare function findRegisteredTarget(engineDir: string, source: string):
|
|
|
69
69
|
export declare function resolveArtifactByRegistration(engineDir: string, source: string, searchRoots: readonly string[]): Promise<RegistrationProbeResult | undefined>;
|
|
70
70
|
/**
|
|
71
71
|
* Returns the absolute paths of every same-basename candidate under the
|
|
72
|
-
* given search roots. Used by the audit to enumerate
|
|
73
|
-
* candidates when the heuristic fallback downgrades to "missing"
|
|
72
|
+
* given search roots. Used by the audit to enumerate all false-match
|
|
73
|
+
* candidates when the heuristic fallback downgrades to "missing". The
|
|
74
74
|
* operator needs to see the full set, not just the scorer's pick, to
|
|
75
75
|
* distinguish a registration bug from a genuine packaging drop.
|
|
76
76
|
*
|
|
@@ -18,13 +18,14 @@
|
|
|
18
18
|
* report an unambiguous "registered but not packaged" miss when none exists.
|
|
19
19
|
*
|
|
20
20
|
* When no jar.mn registration is found, the caller falls back to the
|
|
21
|
-
* similarity heuristic
|
|
21
|
+
* similarity heuristic, which covers sources registered through moz.build
|
|
22
22
|
* (`FINAL_TARGET_FILES`, `JS_PREFERENCE_FILES`) or `package-manifest.in`.
|
|
23
23
|
* Parsing every Firefox registration surface would bloat the audit, and the
|
|
24
24
|
* heuristic's weak case is surfaced to the operator in the warning copy.
|
|
25
25
|
*/
|
|
26
26
|
import { basename, dirname, join, relative, sep } from 'node:path';
|
|
27
27
|
import { pathExists, readText } from '../utils/fs.js';
|
|
28
|
+
import { normalizePathSlashes } from '../utils/paths.js';
|
|
28
29
|
import { findAllByBasename } from './build-audit-resolve.js';
|
|
29
30
|
/** Ceiling on ancestor-directory hops when searching for an owning jar.mn. */
|
|
30
31
|
const MAX_JAR_MN_SCAN_DEPTH = 8;
|
|
@@ -61,11 +62,11 @@ export function parseJarMnEntry(line) {
|
|
|
61
62
|
/**
|
|
62
63
|
* Scans a jar.mn file's contents for an entry whose source reference
|
|
63
64
|
* matches `relativeSource` (POSIX, relative to the jar.mn directory).
|
|
64
|
-
* Returns the first match
|
|
65
|
+
* Returns the first match. jar.mn enforces uniqueness of `(source)` in
|
|
65
66
|
* practice, so a first-match wins behaviour is adequate.
|
|
66
67
|
*/
|
|
67
68
|
export function findJarMnEntryForSource(content, relativeSource) {
|
|
68
|
-
const normalized = relativeSource
|
|
69
|
+
const normalized = normalizePathSlashes(relativeSource);
|
|
69
70
|
for (const line of content.split('\n')) {
|
|
70
71
|
const parsed = parseJarMnEntry(line);
|
|
71
72
|
if (!parsed)
|
|
@@ -80,7 +81,7 @@ export function findJarMnEntryForSource(content, relativeSource) {
|
|
|
80
81
|
* the first jar.mn entry that registers the given source. Returns undefined
|
|
81
82
|
* when no ancestor jar.mn claims the source.
|
|
82
83
|
*
|
|
83
|
-
* @param engineDir Absolute engine root
|
|
84
|
+
* @param engineDir Absolute engine root. The walk halts here.
|
|
84
85
|
* @param source Engine-relative POSIX source path.
|
|
85
86
|
*/
|
|
86
87
|
export async function findRegisteredTarget(engineDir, source) {
|
|
@@ -97,7 +98,7 @@ export async function findRegisteredTarget(engineDir, source) {
|
|
|
97
98
|
content = await readText(jarMn);
|
|
98
99
|
}
|
|
99
100
|
catch {
|
|
100
|
-
// An unreadable jar.mn contributes no registration hints
|
|
101
|
+
// An unreadable jar.mn contributes no registration hints. The resolver falls
|
|
101
102
|
// through to its other strategies.
|
|
102
103
|
content = '';
|
|
103
104
|
}
|
|
@@ -121,12 +122,12 @@ export async function findRegisteredTarget(engineDir, source) {
|
|
|
121
122
|
* independent.
|
|
122
123
|
*/
|
|
123
124
|
function toPosix(path) {
|
|
124
|
-
return path
|
|
125
|
+
return normalizePathSlashes(path);
|
|
125
126
|
}
|
|
126
127
|
/**
|
|
127
128
|
* Probes the dist tree for the artifact registered against the given
|
|
128
129
|
* source. Returns the matched candidate and the registration hit that
|
|
129
|
-
* anchored it
|
|
130
|
+
* anchored it. Undefined when the source has no owning jar.mn or when
|
|
130
131
|
* no same-basename candidate under the search roots ends with the
|
|
131
132
|
* registered target path.
|
|
132
133
|
*
|
|
@@ -161,8 +162,8 @@ export async function resolveArtifactByRegistration(engineDir, source, searchRoo
|
|
|
161
162
|
}
|
|
162
163
|
/**
|
|
163
164
|
* Returns the absolute paths of every same-basename candidate under the
|
|
164
|
-
* given search roots. Used by the audit to enumerate
|
|
165
|
-
* candidates when the heuristic fallback downgrades to "missing"
|
|
165
|
+
* given search roots. Used by the audit to enumerate all false-match
|
|
166
|
+
* candidates when the heuristic fallback downgrades to "missing". The
|
|
166
167
|
* operator needs to see the full set, not just the scorer's pick, to
|
|
167
168
|
* distinguish a registration bug from a genuine packaging drop.
|
|
168
169
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Heuristic test for "this looks like a packaged-test source file"
|
|
2
|
+
* Heuristic test for "this looks like a packaged-test source file". The
|
|
3
3
|
* audit routes such paths to `_tests/` instead of `dist/`. Matches
|
|
4
4
|
* mochitest / xpcshell / browser-chrome conventions: any source under a
|
|
5
5
|
* `/test/` or `/tests/` directory, anywhere under a `testing/` subtree
|
|
@@ -27,7 +27,7 @@ export declare function countTrailingSegmentMatches(a: string, b: string): numbe
|
|
|
27
27
|
/**
|
|
28
28
|
* Path segments too common to identify an artifact on their own.
|
|
29
29
|
*
|
|
30
|
-
* Shared
|
|
30
|
+
* Shared on purpose: this set governs two halves of one decision,
|
|
31
31
|
* `scoreCandidate` (selection) and `isConfidentMatch` (confirmation, in
|
|
32
32
|
* `build-audit.ts`). When the halves kept separate copies they disagreed,
|
|
33
33
|
* so a source path could earn a selection bonus for a segment that
|
|
@@ -44,14 +44,14 @@ export declare const GENERIC_PATH_SEGMENTS: ReadonlySet<string>;
|
|
|
44
44
|
*
|
|
45
45
|
* The bonus exists because Firefox packaging often re-roots files: a source
|
|
46
46
|
* `branding/<name>/content/aboutDialog.css` lands at
|
|
47
|
-
* `chrome/browser/content/branding/aboutDialog.css
|
|
47
|
+
* `chrome/browser/content/branding/aboutDialog.css`. Only the basename
|
|
48
48
|
* trails-match, but the `branding` segment moved into the middle of the
|
|
49
49
|
* candidate path. Without the bonus that candidate ties with the unrelated
|
|
50
50
|
* `chrome/browser/content/browser/aboutDialog.css`.
|
|
51
51
|
*
|
|
52
52
|
* @param sourcePath Engine-relative POSIX path
|
|
53
53
|
* @param candidatePath Absolute path under the dist tree
|
|
54
|
-
* @returns Numeric score
|
|
54
|
+
* @returns Numeric score, where higher means better match
|
|
55
55
|
*/
|
|
56
56
|
export declare function scoreCandidate(sourcePath: string, candidatePath: string): number;
|
|
57
57
|
/**
|
|
@@ -69,7 +69,7 @@ export declare function findAllByBasename(root: string, name: string, maxDepth?:
|
|
|
69
69
|
/**
|
|
70
70
|
* Resolves the best-matching artifact for a source path under one or
|
|
71
71
|
* more search roots. Returns the highest-scoring candidate by trailing
|
|
72
|
-
* segment overlap
|
|
72
|
+
* segment overlap. Ties go to the first-found path (deterministic via
|
|
73
73
|
* the directory-walk order). Returns undefined when no candidate exists.
|
|
74
74
|
*
|
|
75
75
|
* @param sourcePath Engine-relative POSIX source path
|
|
@@ -24,7 +24,7 @@ import { normalizePathSlashes } from '../utils/paths.js';
|
|
|
24
24
|
/** Maximum directory depth to traverse when scanning a tree root. */
|
|
25
25
|
const MAX_SCAN_DEPTH = 12;
|
|
26
26
|
/**
|
|
27
|
-
* Heuristic test for "this looks like a packaged-test source file"
|
|
27
|
+
* Heuristic test for "this looks like a packaged-test source file". The
|
|
28
28
|
* audit routes such paths to `_tests/` instead of `dist/`. Matches
|
|
29
29
|
* mochitest / xpcshell / browser-chrome conventions: any source under a
|
|
30
30
|
* `/test/` or `/tests/` directory, anywhere under a `testing/` subtree
|
|
@@ -59,7 +59,7 @@ export function isTestPath(sourcePath) {
|
|
|
59
59
|
*
|
|
60
60
|
* Separators are normalized first because the candidates come from `join()`
|
|
61
61
|
* over a `readdir` walk of the dist tree: on Windows those carry backslashes,
|
|
62
|
-
* which a `/`-only split collapses into a
|
|
62
|
+
* which a `/`-only split collapses into a single segment. Every candidate then
|
|
63
63
|
* scores the same, so the trailing-overlap heuristic that disambiguates
|
|
64
64
|
* same-basename artifacts (`branding/…/aboutDialog.css` versus
|
|
65
65
|
* `browser/…/aboutDialog.css`) silently picks an arbitrary one.
|
|
@@ -94,7 +94,7 @@ export function countTrailingSegmentMatches(a, b) {
|
|
|
94
94
|
/**
|
|
95
95
|
* Path segments too common to identify an artifact on their own.
|
|
96
96
|
*
|
|
97
|
-
* Shared
|
|
97
|
+
* Shared on purpose: this set governs two halves of one decision,
|
|
98
98
|
* `scoreCandidate` (selection) and `isConfidentMatch` (confirmation, in
|
|
99
99
|
* `build-audit.ts`). When the halves kept separate copies they disagreed,
|
|
100
100
|
* so a source path could earn a selection bonus for a segment that
|
|
@@ -129,14 +129,14 @@ export const GENERIC_PATH_SEGMENTS = new Set([
|
|
|
129
129
|
*
|
|
130
130
|
* The bonus exists because Firefox packaging often re-roots files: a source
|
|
131
131
|
* `branding/<name>/content/aboutDialog.css` lands at
|
|
132
|
-
* `chrome/browser/content/branding/aboutDialog.css
|
|
132
|
+
* `chrome/browser/content/branding/aboutDialog.css`. Only the basename
|
|
133
133
|
* trails-match, but the `branding` segment moved into the middle of the
|
|
134
134
|
* candidate path. Without the bonus that candidate ties with the unrelated
|
|
135
135
|
* `chrome/browser/content/browser/aboutDialog.css`.
|
|
136
136
|
*
|
|
137
137
|
* @param sourcePath Engine-relative POSIX path
|
|
138
138
|
* @param candidatePath Absolute path under the dist tree
|
|
139
|
-
* @returns Numeric score
|
|
139
|
+
* @returns Numeric score, where higher means better match
|
|
140
140
|
*/
|
|
141
141
|
export function scoreCandidate(sourcePath, candidatePath) {
|
|
142
142
|
const trailing = countTrailingSegmentMatches(sourcePath, candidatePath);
|
|
@@ -210,7 +210,7 @@ export async function findAllByBasename(root, name, maxDepth = MAX_SCAN_DEPTH) {
|
|
|
210
210
|
/**
|
|
211
211
|
* Resolves the best-matching artifact for a source path under one or
|
|
212
212
|
* more search roots. Returns the highest-scoring candidate by trailing
|
|
213
|
-
* segment overlap
|
|
213
|
+
* segment overlap. Ties go to the first-found path (deterministic via
|
|
214
214
|
* the directory-walk order). Returns undefined when no candidate exists.
|
|
215
215
|
*
|
|
216
216
|
* @param sourcePath Engine-relative POSIX source path
|