@hominis/fireforge 0.43.0 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +127 -0
- package/README.md +10 -1
- package/dist/bin/fireforge.d.ts +4 -9
- package/dist/bin/fireforge.js +42 -40
- package/dist/build-info.json +4 -4
- package/dist/src/cli.js +74 -8
- package/dist/src/commands/bootstrap.js +17 -20
- package/dist/src/commands/build.js +25 -32
- package/dist/src/commands/config.js +34 -41
- package/dist/src/commands/discard.js +8 -9
- package/dist/src/commands/doctor-check-core.d.ts +4 -18
- package/dist/src/commands/doctor-check-core.js +8 -35
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
- package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
- package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
- package/dist/src/commands/doctor-furnace-jar.js +7 -9
- package/dist/src/commands/doctor-furnace.js +21 -24
- package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
- package/dist/src/commands/doctor-orphaned-harness.js +18 -44
- package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
- package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
- package/dist/src/commands/doctor-working-tree.d.ts +10 -12
- package/dist/src/commands/doctor-working-tree.js +11 -18
- package/dist/src/commands/doctor.js +35 -53
- package/dist/src/commands/download.js +32 -48
- package/dist/src/commands/export-all.js +29 -33
- package/dist/src/commands/export-flow.js +6 -6
- package/dist/src/commands/export-placement-conflicts.js +10 -9
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-shared.d.ts +30 -33
- package/dist/src/commands/export-shared.js +45 -43
- package/dist/src/commands/export.js +21 -27
- package/dist/src/commands/furnace/apply.js +14 -23
- package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
- package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
- package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
- package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
- package/dist/src/commands/furnace/chrome-doc.js +31 -41
- package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
- package/dist/src/commands/furnace/create-browser-test.js +8 -8
- package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
- package/dist/src/commands/furnace/create-mochikit.js +8 -9
- package/dist/src/commands/furnace/create-readback.d.ts +12 -13
- package/dist/src/commands/furnace/create-readback.js +12 -13
- package/dist/src/commands/furnace/create-templates.d.ts +22 -28
- package/dist/src/commands/furnace/create-templates.js +35 -30
- package/dist/src/commands/furnace/create-xpcshell.js +2 -2
- package/dist/src/commands/furnace/create.js +33 -23
- package/dist/src/commands/furnace/deploy.js +16 -24
- package/dist/src/commands/furnace/diff.js +9 -9
- package/dist/src/commands/furnace/init.js +33 -36
- package/dist/src/commands/furnace/override.js +23 -25
- package/dist/src/commands/furnace/preview.js +47 -67
- package/dist/src/commands/furnace/refresh.js +12 -16
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
- package/dist/src/commands/furnace/remove-mutations.js +9 -16
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +33 -38
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
- package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
- package/dist/src/commands/furnace/rename.js +59 -69
- package/dist/src/commands/furnace/scan.js +19 -33
- package/dist/src/commands/furnace/status.js +12 -9
- package/dist/src/commands/furnace/sync.js +9 -16
- package/dist/src/commands/furnace/validate.js +20 -20
- package/dist/src/commands/import.js +42 -35
- package/dist/src/commands/lint-per-patch.js +15 -10
- package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
- package/dist/src/commands/lint-per-run-checkjs.js +13 -13
- package/dist/src/commands/lint-report.js +6 -7
- package/dist/src/commands/lint.d.ts +15 -16
- package/dist/src/commands/lint.js +86 -102
- package/dist/src/commands/package.js +6 -11
- package/dist/src/commands/patch/compact.js +1 -1
- package/dist/src/commands/patch/delete.js +24 -33
- package/dist/src/commands/patch/index.d.ts +5 -6
- package/dist/src/commands/patch/index.js +10 -12
- package/dist/src/commands/patch/lint-ignore.js +14 -13
- package/dist/src/commands/patch/move-files-create.d.ts +6 -6
- package/dist/src/commands/patch/move-files-create.js +8 -8
- package/dist/src/commands/patch/move-files-into.d.ts +6 -6
- package/dist/src/commands/patch/move-files-into.js +8 -8
- package/dist/src/commands/patch/patch-context.d.ts +2 -3
- package/dist/src/commands/patch/patch-context.js +2 -3
- package/dist/src/commands/patch/rename.d.ts +10 -11
- package/dist/src/commands/patch/rename.js +11 -12
- package/dist/src/commands/patch/reorder.js +8 -9
- package/dist/src/commands/patch/split-plan.js +1 -1
- package/dist/src/commands/patch/split.d.ts +8 -10
- package/dist/src/commands/patch/split.js +9 -11
- package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
- package/dist/src/commands/patch/staged-dependency.js +7 -3
- package/dist/src/commands/patch/tier.d.ts +9 -9
- package/dist/src/commands/patch/tier.js +18 -15
- package/dist/src/commands/re-export-adjacent.js +9 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
- package/dist/src/commands/re-export-bulk-scan.js +22 -21
- package/dist/src/commands/re-export-drift.js +10 -10
- package/dist/src/commands/re-export-files.d.ts +6 -7
- package/dist/src/commands/re-export-files.js +34 -44
- package/dist/src/commands/re-export-lint.d.ts +10 -13
- package/dist/src/commands/re-export-lint.js +16 -14
- package/dist/src/commands/re-export-options.d.ts +6 -6
- package/dist/src/commands/re-export-options.js +6 -6
- package/dist/src/commands/re-export-register.d.ts +4 -10
- package/dist/src/commands/re-export-register.js +5 -11
- package/dist/src/commands/re-export-scan.js +1 -1
- package/dist/src/commands/re-export-single.d.ts +3 -3
- package/dist/src/commands/re-export-single.js +33 -25
- package/dist/src/commands/re-export.js +13 -21
- package/dist/src/commands/rebase/abort.js +3 -3
- package/dist/src/commands/rebase/confirm.js +2 -1
- package/dist/src/commands/rebase/continue.d.ts +1 -1
- package/dist/src/commands/rebase/continue.js +14 -9
- package/dist/src/commands/rebase/index.js +11 -11
- package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
- package/dist/src/commands/rebase/patch-loop.js +60 -39
- package/dist/src/commands/rebase/summary.js +1 -1
- package/dist/src/commands/register.js +5 -7
- package/dist/src/commands/reset.js +2 -1
- package/dist/src/commands/resolve.d.ts +16 -13
- package/dist/src/commands/resolve.js +30 -33
- package/dist/src/commands/run.js +33 -35
- package/dist/src/commands/setup-support.js +15 -19
- package/dist/src/commands/setup.js +13 -9
- package/dist/src/commands/status-check.d.ts +6 -6
- package/dist/src/commands/status-json.d.ts +6 -6
- package/dist/src/commands/status-json.js +5 -0
- package/dist/src/commands/status-output.d.ts +5 -5
- package/dist/src/commands/status-output.js +6 -6
- package/dist/src/commands/status-ownership.d.ts +16 -14
- package/dist/src/commands/status-ownership.js +16 -14
- package/dist/src/commands/status.js +42 -34
- package/dist/src/commands/test-build-phase.js +26 -13
- package/dist/src/commands/test-diagnose.js +44 -44
- package/dist/src/commands/test-register.js +1 -0
- package/dist/src/commands/test-run.d.ts +14 -16
- package/dist/src/commands/test-run.js +21 -13
- package/dist/src/commands/test-stale-gate.d.ts +15 -16
- package/dist/src/commands/test-stale-gate.js +15 -16
- package/dist/src/commands/test-verdict.d.ts +20 -3
- package/dist/src/commands/test-verdict.js +30 -0
- package/dist/src/commands/test.js +83 -76
- package/dist/src/commands/token-coverage.js +3 -4
- package/dist/src/commands/token.js +16 -18
- package/dist/src/commands/tree.js +47 -31
- package/dist/src/commands/typecheck.d.ts +10 -12
- package/dist/src/commands/typecheck.js +24 -27
- package/dist/src/commands/verify.js +13 -15
- package/dist/src/commands/watch.js +21 -23
- package/dist/src/commands/wire.js +52 -62
- package/dist/src/core/ast-utils.d.ts +8 -7
- package/dist/src/core/ast-utils.js +8 -7
- package/dist/src/core/branding.d.ts +9 -14
- package/dist/src/core/branding.js +7 -11
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +14 -19
- package/dist/src/core/build-audit-platform.js +25 -33
- package/dist/src/core/build-audit-registration.js +17 -25
- package/dist/src/core/build-audit-resolve.d.ts +15 -17
- package/dist/src/core/build-audit-resolve.js +27 -33
- package/dist/src/core/build-audit-transforms.js +18 -19
- package/dist/src/core/build-audit.js +28 -42
- package/dist/src/core/build-baseline-types.d.ts +29 -35
- package/dist/src/core/build-baseline.d.ts +5 -4
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-overwrite-guard.d.ts +7 -14
- package/dist/src/core/build-overwrite-guard.js +62 -19
- package/dist/src/core/build-prepare.d.ts +2 -2
- package/dist/src/core/build-prepare.js +8 -9
- package/dist/src/core/config-state.js +12 -4
- package/dist/src/core/config-validate.js +8 -5
- package/dist/src/core/config.d.ts +5 -8
- package/dist/src/core/config.js +7 -16
- package/dist/src/core/coverage-extend.d.ts +15 -13
- package/dist/src/core/coverage-extend.js +15 -13
- package/dist/src/core/destructive.d.ts +31 -9
- package/dist/src/core/destructive.js +29 -26
- package/dist/src/core/diff-hunks.js +10 -12
- package/dist/src/core/discard-baseline.d.ts +8 -8
- package/dist/src/core/discard-baseline.js +16 -15
- package/dist/src/core/display-state.d.ts +12 -14
- package/dist/src/core/display-state.js +12 -14
- package/dist/src/core/engine-changes.d.ts +2 -4
- package/dist/src/core/engine-changes.js +2 -4
- package/dist/src/core/engine-precondition.d.ts +28 -13
- package/dist/src/core/engine-precondition.js +25 -10
- package/dist/src/core/engine-session-lock.d.ts +47 -21
- package/dist/src/core/engine-session-lock.js +168 -33
- package/dist/src/core/export-moved-code-shape.d.ts +10 -10
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock.d.ts +62 -5
- package/dist/src/core/file-lock.js +196 -59
- package/dist/src/core/firefox-cache.js +1 -3
- package/dist/src/core/firefox-extract.js +10 -14
- package/dist/src/core/firefox.d.ts +7 -5
- package/dist/src/core/firefox.js +4 -5
- package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
- package/dist/src/core/furnace-apply-dry-run.js +3 -2
- package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
- package/dist/src/core/furnace-apply-ftl.js +12 -12
- package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
- package/dist/src/core/furnace-apply-helpers.js +19 -16
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
- package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
- package/dist/src/core/furnace-apply.d.ts +5 -8
- package/dist/src/core/furnace-apply.js +19 -24
- package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
- package/dist/src/core/furnace-checksum-utils.js +16 -0
- package/dist/src/core/furnace-config.d.ts +21 -30
- package/dist/src/core/furnace-config.js +32 -54
- package/dist/src/core/furnace-constants.d.ts +8 -0
- package/dist/src/core/furnace-constants.js +10 -2
- package/dist/src/core/furnace-css-fragments.d.ts +5 -5
- package/dist/src/core/furnace-css-fragments.js +5 -5
- package/dist/src/core/furnace-jsconfig.d.ts +11 -12
- package/dist/src/core/furnace-jsconfig.js +11 -12
- package/dist/src/core/furnace-marker.d.ts +7 -8
- package/dist/src/core/furnace-marker.js +7 -8
- package/dist/src/core/furnace-operation.d.ts +31 -0
- package/dist/src/core/furnace-operation.js +54 -17
- package/dist/src/core/furnace-precondition.d.ts +61 -0
- package/dist/src/core/furnace-precondition.js +67 -0
- package/dist/src/core/furnace-registration-remove.d.ts +5 -6
- package/dist/src/core/furnace-registration-remove.js +6 -7
- package/dist/src/core/furnace-registration-validate.d.ts +13 -0
- package/dist/src/core/furnace-registration-validate.js +20 -1
- package/dist/src/core/furnace-registration.d.ts +5 -6
- package/dist/src/core/furnace-registration.js +10 -12
- package/dist/src/core/furnace-rollback.js +7 -7
- package/dist/src/core/furnace-scanner.d.ts +1 -0
- package/dist/src/core/furnace-scanner.js +1 -2
- package/dist/src/core/furnace-stale-export.d.ts +10 -10
- package/dist/src/core/furnace-stale-export.js +10 -10
- package/dist/src/core/furnace-state-persist.d.ts +6 -8
- package/dist/src/core/furnace-state-persist.js +6 -8
- package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
- package/dist/src/core/furnace-validate-accessibility.js +310 -1
- package/dist/src/core/furnace-validate-compatibility.js +141 -1
- package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
- package/dist/src/core/furnace-validate-helpers.js +0 -491
- package/dist/src/core/furnace-validate-registration.d.ts +7 -0
- package/dist/src/core/furnace-validate-registration.js +115 -41
- package/dist/src/core/furnace-validate.d.ts +16 -0
- package/dist/src/core/furnace-validate.js +188 -145
- package/dist/src/core/furnace-version-drift.d.ts +10 -11
- package/dist/src/core/furnace-version-drift.js +10 -11
- package/dist/src/core/git-base.d.ts +7 -9
- package/dist/src/core/git-base.js +7 -9
- package/dist/src/core/git-diff.d.ts +20 -9
- package/dist/src/core/git-diff.js +148 -63
- package/dist/src/core/git-file-ops.d.ts +19 -19
- package/dist/src/core/git-file-ops.js +19 -19
- package/dist/src/core/git-readonly-index.d.ts +53 -19
- package/dist/src/core/git-readonly-index.js +75 -31
- package/dist/src/core/git-status.d.ts +5 -6
- package/dist/src/core/git-status.js +5 -6
- package/dist/src/core/git.d.ts +9 -10
- package/dist/src/core/git.js +54 -70
- package/dist/src/core/license-headers.d.ts +17 -23
- package/dist/src/core/license-headers.js +17 -23
- package/dist/src/core/mach-build-artifacts.d.ts +9 -9
- package/dist/src/core/mach-build-artifacts.js +57 -19
- package/dist/src/core/mach-error-hints.js +42 -29
- package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
- package/dist/src/core/mach-known-noise-filter.js +18 -20
- package/dist/src/core/mach-mozconfig.d.ts +14 -0
- package/dist/src/core/mach-mozconfig.js +30 -0
- package/dist/src/core/mach-resource-shim.d.ts +43 -58
- package/dist/src/core/mach-resource-shim.js +50 -67
- package/dist/src/core/mach.d.ts +37 -41
- package/dist/src/core/mach.js +50 -51
- package/dist/src/core/marionette-port.d.ts +36 -1
- package/dist/src/core/marionette-port.js +96 -31
- package/dist/src/core/marionette-preflight.d.ts +8 -12
- package/dist/src/core/marionette-preflight.js +86 -52
- package/dist/src/core/mochitest-server-port.d.ts +42 -0
- package/dist/src/core/mochitest-server-port.js +119 -0
- package/dist/src/core/module-resolution-preflight.d.ts +9 -11
- package/dist/src/core/module-resolution-preflight.js +9 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
- package/dist/src/core/moz-manifest-helpers.js +163 -0
- package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
- package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
- package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
- package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
- package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
- package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
- package/dist/src/core/ownership-table.d.ts +14 -16
- package/dist/src/core/ownership-table.js +14 -16
- package/dist/src/core/parser-fallback.d.ts +15 -1
- package/dist/src/core/parser-fallback.js +22 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
- package/dist/src/core/patch-apply-fuzz.js +15 -18
- package/dist/src/core/patch-apply.d.ts +13 -34
- package/dist/src/core/patch-apply.js +16 -76
- package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
- package/dist/src/core/patch-artifact-normalize.js +13 -15
- package/dist/src/core/patch-export-metadata.d.ts +12 -2
- package/dist/src/core/patch-export-metadata.js +13 -4
- package/dist/src/core/patch-export-update.d.ts +13 -1
- package/dist/src/core/patch-export-update.js +25 -8
- package/dist/src/core/patch-export.d.ts +15 -8
- package/dist/src/core/patch-export.js +10 -11
- package/dist/src/core/patch-files.d.ts +5 -6
- package/dist/src/core/patch-files.js +5 -6
- package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
- package/dist/src/core/patch-identifier-suggest.js +14 -19
- package/dist/src/core/patch-lint-binary.d.ts +51 -0
- package/dist/src/core/patch-lint-binary.js +39 -0
- package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
- package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
- package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
- package/dist/src/core/patch-lint-checkjs.js +16 -16
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
- package/dist/src/core/patch-lint-creators.d.ts +8 -8
- package/dist/src/core/patch-lint-creators.js +8 -8
- package/dist/src/core/patch-lint-cross.d.ts +17 -20
- package/dist/src/core/patch-lint-cross.js +16 -16
- package/dist/src/core/patch-lint-css.d.ts +3 -5
- package/dist/src/core/patch-lint-css.js +17 -22
- package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
- package/dist/src/core/patch-lint-diff-tag.js +14 -16
- package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
- package/dist/src/core/patch-lint-jsdoc.js +26 -19
- package/dist/src/core/patch-lint-mozbuild.js +20 -20
- package/dist/src/core/patch-lint-observer.d.ts +7 -7
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint.d.ts +38 -29
- package/dist/src/core/patch-lint.js +89 -121
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +45 -9
- package/dist/src/core/patch-manifest-consistency.d.ts +2 -1
- package/dist/src/core/patch-manifest-consistency.js +25 -27
- package/dist/src/core/patch-manifest-io.js +14 -18
- package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
- package/dist/src/core/patch-manifest-resolve.js +9 -12
- package/dist/src/core/patch-manifest-validate.d.ts +6 -1
- package/dist/src/core/patch-manifest-validate.js +25 -13
- package/dist/src/core/patch-parse.d.ts +24 -13
- package/dist/src/core/patch-parse.js +19 -14
- package/dist/src/core/patch-policy.d.ts +2 -2
- package/dist/src/core/patch-policy.js +2 -2
- package/dist/src/core/patch-registration-refs.d.ts +7 -8
- package/dist/src/core/patch-registration-refs.js +9 -9
- package/dist/src/core/process-cpu-time.d.ts +12 -0
- package/dist/src/core/process-cpu-time.js +52 -0
- package/dist/src/core/rebase-session.d.ts +38 -26
- package/dist/src/core/rebase-session.js +55 -28
- package/dist/src/core/register-browser-content.js +9 -74
- package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
- package/dist/src/core/register-module.js +10 -43
- package/dist/src/core/register-scaffold.d.ts +8 -8
- package/dist/src/core/register-scaffold.js +10 -10
- package/dist/src/core/register-shared-css.d.ts +9 -12
- package/dist/src/core/register-shared-css.js +17 -87
- package/dist/src/core/register-xpcshell-test.d.ts +6 -7
- package/dist/src/core/register-xpcshell-test.js +7 -8
- package/dist/src/core/shared-ftl.js +12 -4
- package/dist/src/core/state-file.d.ts +45 -0
- package/dist/src/core/state-file.js +34 -0
- package/dist/src/core/status-binary.d.ts +18 -11
- package/dist/src/core/status-binary.js +19 -12
- package/dist/src/core/status-classify.d.ts +30 -36
- package/dist/src/core/status-classify.js +21 -26
- package/dist/src/core/test-changed-prefs.d.ts +30 -0
- package/dist/src/core/test-changed-prefs.js +78 -0
- package/dist/src/core/test-harness-crash.d.ts +25 -63
- package/dist/src/core/test-harness-crash.js +121 -142
- package/dist/src/core/test-harness-signature.d.ts +18 -0
- package/dist/src/core/test-harness-signature.js +13 -0
- package/dist/src/core/test-path-scope.d.ts +12 -15
- package/dist/src/core/test-path-scope.js +15 -18
- package/dist/src/core/test-stale-check.d.ts +17 -17
- package/dist/src/core/test-stale-check.js +50 -43
- package/dist/src/core/test-stall-triage.d.ts +51 -0
- package/dist/src/core/test-stall-triage.js +126 -0
- package/dist/src/core/token-category.js +5 -7
- package/dist/src/core/token-coverage.js +9 -9
- package/dist/src/core/token-dark-mode.d.ts +9 -11
- package/dist/src/core/token-dark-mode.js +9 -11
- package/dist/src/core/token-docs.d.ts +2 -0
- package/dist/src/core/token-docs.js +2 -0
- package/dist/src/core/token-manager.d.ts +10 -2
- package/dist/src/core/token-manager.js +17 -8
- package/dist/src/core/token-scaffold.d.ts +7 -7
- package/dist/src/core/token-scaffold.js +7 -7
- package/dist/src/core/token-variant.d.ts +4 -4
- package/dist/src/core/token-variant.js +4 -4
- package/dist/src/core/toolchain-preflight.d.ts +20 -21
- package/dist/src/core/toolchain-preflight.js +28 -31
- package/dist/src/core/tree-guard.js +12 -2
- package/dist/src/core/tree-store.d.ts +41 -27
- package/dist/src/core/tree-store.js +63 -42
- package/dist/src/core/typecheck-shim.d.ts +23 -24
- package/dist/src/core/typecheck-shim.js +23 -24
- package/dist/src/core/typecheck.js +8 -8
- package/dist/src/core/wire-destroy.d.ts +3 -3
- package/dist/src/core/wire-destroy.js +7 -15
- package/dist/src/core/wire-dom-fragment.d.ts +9 -17
- package/dist/src/core/wire-dom-fragment.js +11 -44
- package/dist/src/core/wire-init.d.ts +2 -3
- package/dist/src/core/wire-init.js +8 -19
- package/dist/src/core/wire-subscript.d.ts +2 -3
- package/dist/src/core/wire-subscript.js +4 -13
- package/dist/src/core/wire-utils.d.ts +7 -8
- package/dist/src/core/wire-utils.js +7 -8
- package/dist/src/core/xpcshell-appdir.d.ts +38 -45
- package/dist/src/core/xpcshell-appdir.js +38 -45
- package/dist/src/errors/base.d.ts +37 -16
- package/dist/src/errors/base.js +37 -16
- package/dist/src/errors/build.d.ts +13 -1
- package/dist/src/errors/build.js +14 -2
- package/dist/src/errors/codes.d.ts +16 -0
- package/dist/src/errors/codes.js +16 -0
- package/dist/src/errors/furnace.d.ts +4 -4
- package/dist/src/errors/git.d.ts +6 -10
- package/dist/src/errors/git.js +6 -10
- package/dist/src/errors/patch.d.ts +7 -7
- package/dist/src/errors/patch.js +7 -7
- package/dist/src/errors/rebase.d.ts +4 -4
- package/dist/src/errors/rebase.js +4 -4
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.js +5 -0
- package/dist/src/types/commands/index.d.ts +2 -2
- package/dist/src/types/commands/options.d.ts +88 -70
- package/dist/src/types/commands/patches.d.ts +24 -34
- package/dist/src/types/commands/project.d.ts +5 -34
- package/dist/src/types/config.d.ts +25 -23
- package/dist/src/types/config.js +6 -1
- package/dist/src/types/furnace.d.ts +37 -13
- package/dist/src/types/furnace.js +19 -1
- package/dist/src/types/index.d.ts +3 -3
- package/dist/src/utils/build-info.d.ts +7 -8
- package/dist/src/utils/build-info.js +12 -11
- package/dist/src/utils/errors.d.ts +6 -8
- package/dist/src/utils/errors.js +6 -8
- package/dist/src/utils/logger.d.ts +27 -10
- package/dist/src/utils/logger.js +28 -16
- package/dist/src/utils/machine-output.d.ts +12 -0
- package/dist/src/utils/machine-output.js +33 -0
- package/dist/src/utils/options.d.ts +31 -14
- package/dist/src/utils/options.js +86 -30
- package/dist/src/utils/paths.d.ts +10 -8
- package/dist/src/utils/paths.js +10 -8
- package/dist/src/utils/platform.d.ts +0 -25
- package/dist/src/utils/platform.js +1 -42
- package/dist/src/utils/process-group.d.ts +9 -4
- package/dist/src/utils/process-group.js +19 -5
- package/dist/src/utils/process.d.ts +42 -7
- package/dist/src/utils/process.js +44 -17
- package/dist/src/utils/ps-duration.d.ts +31 -0
- package/dist/src/utils/ps-duration.js +70 -0
- package/dist/src/utils/regex.d.ts +9 -10
- package/dist/src/utils/regex.js +9 -10
- package/dist/src/utils/validation.d.ts +58 -28
- package/dist/src/utils/validation.js +60 -33
- package/package.json +2 -2
- package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
- package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
- package/dist/src/core/manifest-helpers.d.ts +0 -38
- package/dist/src/core/manifest-helpers.js +0 -120
- /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
- /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
- /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
|
@@ -4,34 +4,29 @@
|
|
|
4
4
|
*
|
|
5
5
|
* `moz.build` files commonly wrap entries in conditional blocks like
|
|
6
6
|
* `if CONFIG["MAKENSISU"]:` (Windows-only stubinstaller) or
|
|
7
|
-
* `if CONFIG["OS_TARGET"] == "Darwin":` (macOS-only artwork). On a host
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* every gated file on every off-platform build — pure noise.
|
|
7
|
+
* `if CONFIG["OS_TARGET"] == "Darwin":` (macOS-only artwork). On a host that
|
|
8
|
+
* does not match the gate, the wrapped files are never processed by the
|
|
9
|
+
* build, so they cannot appear under `dist/` — without this detection the
|
|
10
|
+
* audit warns about every gated file on every off-platform build.
|
|
12
11
|
*
|
|
13
12
|
* Two gate sources are consulted, in order:
|
|
14
13
|
* 1. Python-style `if CONFIG[...]:` blocks in the owning `moz.build`.
|
|
15
|
-
* 2. Path-convention gates — certain directory fragments are packaged
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* is the motivating case: referenced from
|
|
21
|
-
* `browser/installer/windows/Makefile.in` / `nsis/stub.nsh` with no
|
|
22
|
-
* `if CONFIG[…]:` in any moz.build ancestor.)
|
|
14
|
+
* 2. Path-convention gates — certain directory fragments are packaged by
|
|
15
|
+
* platform-specific Makefile.in / NSIS recipes that FireForge does not
|
|
16
|
+
* parse, so a file under `browser/installer/windows/` or any
|
|
17
|
+
* `/stubinstaller/` subtree is Windows-only regardless of what its
|
|
18
|
+
* nearest moz.build says.
|
|
23
19
|
*
|
|
24
|
-
* The detection is intentionally lightweight:
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* found, so an explicit moz.build gate always wins.
|
|
20
|
+
* The detection is intentionally lightweight: walk up from the source file
|
|
21
|
+
* to the closest `moz.build`, scan it for the source basename inside an
|
|
22
|
+
* `if CONFIG[...]:` block, and check whether the gate matches the host. The
|
|
23
|
+
* path-convention pass runs only when no moz.build gate is found, so an
|
|
24
|
+
* explicit gate always wins.
|
|
30
25
|
*
|
|
31
|
-
*
|
|
32
|
-
* are tolerable — the audit is warn-only. False positives (
|
|
33
|
-
*
|
|
34
|
-
*
|
|
26
|
+
* Best-effort by design. False negatives (missing a gate and warning anyway)
|
|
27
|
+
* are tolerable — the audit is warn-only. False positives (skipping a file
|
|
28
|
+
* that should ship on this host) are not, so it errs toward NOT skipping
|
|
29
|
+
* when uncertain.
|
|
35
30
|
*/
|
|
36
31
|
import { dirname, join } from 'node:path';
|
|
37
32
|
import { pathExists, readText } from '../utils/fs.js';
|
|
@@ -144,17 +139,14 @@ export function findEnclosingGate(content, basename) {
|
|
|
144
139
|
}
|
|
145
140
|
/**
|
|
146
141
|
* Path-convention gates: directories whose files are packaged by
|
|
147
|
-
* platform-specific build recipes (NSIS stub installer, DMG creation,
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
142
|
+
* platform-specific build recipes (NSIS stub installer, DMG creation, Linux
|
|
143
|
+
* installer scripts) that live outside the moz.build graph. A file under any
|
|
144
|
+
* of these fragments is platform-restricted regardless of what its nearest
|
|
145
|
+
* `moz.build` says.
|
|
151
146
|
*
|
|
152
|
-
* `stubinstaller/` is the Windows NSIS stub installer asset tree
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
* an `if CONFIG[…]:` block an ancestor moz.build exposes. Without
|
|
156
|
-
* this path-level gate, the audit warns on every touched branding
|
|
157
|
-
* stubinstaller CSS on every non-Windows build.
|
|
147
|
+
* `stubinstaller/` is the Windows NSIS stub installer asset tree, referenced
|
|
148
|
+
* from `browser/installer/windows/Makefile.in` and `nsis/stub.nsh` rather
|
|
149
|
+
* than through any `if CONFIG[…]:` block an ancestor moz.build exposes.
|
|
158
150
|
*/
|
|
159
151
|
const PATH_GATES = [
|
|
160
152
|
{ fragment: '/stubinstaller/', platform: 'win32', label: 'path convention: /stubinstaller/' },
|
|
@@ -3,33 +3,25 @@
|
|
|
3
3
|
* Registration-aware artifact resolution for the post-build dist-tree audit.
|
|
4
4
|
*
|
|
5
5
|
* The basename-plus-similarity heuristic in `build-audit-resolve.ts` cannot
|
|
6
|
-
* distinguish two unrelated files that share a source basename
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* (basename only, no meaningful mid-path match), and whichever the
|
|
13
|
-
* directory walk hits first wins — frequently the wrong one.
|
|
6
|
+
* distinguish two unrelated files that share a source basename: one fork
|
|
7
|
+
* registers `content/mybrowser.js` in `browser/base/jar.mn` (packaged under
|
|
8
|
+
* `chrome/browser/content/browser/mybrowser.js`) while an unrelated patch
|
|
9
|
+
* registers a `mybrowser.js` pref file under `browser/defaults/preferences/`.
|
|
10
|
+
* The basename walker surfaces both, `scoreCandidate` awards them an equal
|
|
11
|
+
* trailing-overlap score, and whichever the directory walk hits first wins.
|
|
14
12
|
*
|
|
15
|
-
* This module anchors resolution to the `(source)` reference inside
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* report an unambiguous "registered but not packaged" miss when no such
|
|
22
|
-
* candidate exists — rather than falling through to the heuristic which
|
|
23
|
-
* would pick an unrelated same-basename file.
|
|
13
|
+
* This module anchors resolution to the `(source)` reference inside `jar.mn`.
|
|
14
|
+
* For a source under audit it walks the ancestor directories for an owning
|
|
15
|
+
* `jar.mn`, finds the entry whose `(source)` resolves to that path, and
|
|
16
|
+
* exposes both the registered target and the manifest that owns it. Callers
|
|
17
|
+
* prefer candidates whose dist-tree path ends with the registered target and
|
|
18
|
+
* report an unambiguous "registered but not packaged" miss when none exists.
|
|
24
19
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* not parse — supporting every Firefox registration surface would bloat
|
|
31
|
-
* the audit, and the heuristic's remaining weak case (unrelated same-
|
|
32
|
-
* basename hits) is surfaced to the operator in the warning copy.
|
|
20
|
+
* When no jar.mn registration is found, the caller falls back to the
|
|
21
|
+
* similarity heuristic — which covers sources registered through moz.build
|
|
22
|
+
* (`FINAL_TARGET_FILES`, `JS_PREFERENCE_FILES`) or `package-manifest.in`.
|
|
23
|
+
* Parsing every Firefox registration surface would bloat the audit, and the
|
|
24
|
+
* heuristic's weak case is surfaced to the operator in the warning copy.
|
|
33
25
|
*/
|
|
34
26
|
import { basename, dirname, join, relative, sep } from 'node:path';
|
|
35
27
|
import { pathExists, readText } from '../utils/fs.js';
|
|
@@ -27,29 +27,27 @@ 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 deliberately: this set governs two halves of ONE decision
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* must apply to both halves, which is now automatic.
|
|
30
|
+
* Shared deliberately: this set governs two halves of ONE decision —
|
|
31
|
+
* `scoreCandidate` (selection) and `isConfidentMatch` (confirmation, in
|
|
32
|
+
* `build-audit.ts`). When the halves kept separate copies they disagreed,
|
|
33
|
+
* so a source path could earn a selection bonus for a segment that
|
|
34
|
+
* confirmation then rejected as meaningless, leaving the chosen artifact
|
|
35
|
+
* unconfirmable. Any addition must apply to both halves, which is now
|
|
36
|
+
* automatic.
|
|
38
37
|
*/
|
|
39
38
|
export declare const GENERIC_PATH_SEGMENTS: ReadonlySet<string>;
|
|
40
39
|
/**
|
|
41
40
|
* Computes a score for `candidatePath` relative to `sourcePath`. Higher
|
|
42
|
-
* scores win. Score = trailing-segment match count, with a bonus when
|
|
43
|
-
*
|
|
44
|
-
*
|
|
41
|
+
* scores win. Score = trailing-segment match count, with a bonus when the
|
|
42
|
+
* candidate's path contains a meaningful intermediate segment from the
|
|
43
|
+
* source (e.g. `branding`, or the branding dir name itself).
|
|
45
44
|
*
|
|
46
|
-
* The bonus exists because Firefox packaging often re-roots files: a
|
|
47
|
-
*
|
|
45
|
+
* The bonus exists because Firefox packaging often re-roots files: a source
|
|
46
|
+
* `branding/<name>/content/aboutDialog.css` lands at
|
|
48
47
|
* `chrome/browser/content/branding/aboutDialog.css` — only the basename
|
|
49
|
-
* trails-match, but the `branding` segment moved into the middle of
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* the audit would pick whichever the directory walk hit first.
|
|
48
|
+
* trails-match, but the `branding` segment moved into the middle of the
|
|
49
|
+
* candidate path. Without the bonus that candidate ties with the unrelated
|
|
50
|
+
* `chrome/browser/content/browser/aboutDialog.css`.
|
|
53
51
|
*
|
|
54
52
|
* @param sourcePath Engine-relative POSIX path
|
|
55
53
|
* @param candidatePath Absolute path under the dist tree
|
|
@@ -2,24 +2,20 @@
|
|
|
2
2
|
/*
|
|
3
3
|
* Path-resolution helpers for the post-build dist-tree audit.
|
|
4
4
|
*
|
|
5
|
-
* Resolves the expected on-disk artifact location for a given engine
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Resolves the expected on-disk artifact location for a given engine source
|
|
6
|
+
* path. Matching purely by basename produces three classes of false
|
|
7
|
+
* positive, each of which these helpers exist to avoid:
|
|
8
8
|
*
|
|
9
|
-
* 1. A branding override (
|
|
10
|
-
* shipped at `chrome/browser/content/branding/
|
|
11
|
-
*
|
|
12
|
-
* `chrome/browser/content/browser/aboutDialog.css`.
|
|
13
|
-
*
|
|
14
|
-
*
|
|
9
|
+
* 1. A branding override (`engine/browser/branding/<name>/content/
|
|
10
|
+
* aboutDialog.css`, shipped at `chrome/browser/content/branding/
|
|
11
|
+
* aboutDialog.css`) matching the unrelated upstream
|
|
12
|
+
* `chrome/browser/content/browser/aboutDialog.css`. Handled by ranking
|
|
13
|
+
* same-basename candidates on shared trailing path segments.
|
|
14
|
+
* 2. Test files (`browser_*.js`, `test_*.js`) living under `_tests/`, not
|
|
15
|
+
* `dist/`. Handled by routing test paths to a separate resolver.
|
|
15
16
|
* 3. Build inputs (`jar.mn`, `moz.build`, `Makefile.in`, `moz.configure`)
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* The helpers below address (1) by ranking same-basename candidates by
|
|
19
|
-
* how many trailing path segments they share with the source, and (2) by
|
|
20
|
-
* routing test paths to a separate `_tests/`-aware resolver.
|
|
21
|
-
*
|
|
22
|
-
* (3) is handled in `build-audit.ts` via `isPackageablePath`.
|
|
17
|
+
* that are consumed rather than packaged. Handled in `build-audit.ts`
|
|
18
|
+
* via `isPackageablePath`.
|
|
23
19
|
*/
|
|
24
20
|
import { readdir } from 'node:fs/promises';
|
|
25
21
|
import { basename, join } from 'node:path';
|
|
@@ -89,14 +85,13 @@ export function countTrailingSegmentMatches(a, b) {
|
|
|
89
85
|
/**
|
|
90
86
|
* Path segments too common to identify an artifact on their own.
|
|
91
87
|
*
|
|
92
|
-
* Shared deliberately: this set governs two halves of ONE decision
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* must apply to both halves, which is now automatic.
|
|
88
|
+
* Shared deliberately: this set governs two halves of ONE decision —
|
|
89
|
+
* `scoreCandidate` (selection) and `isConfidentMatch` (confirmation, in
|
|
90
|
+
* `build-audit.ts`). When the halves kept separate copies they disagreed,
|
|
91
|
+
* so a source path could earn a selection bonus for a segment that
|
|
92
|
+
* confirmation then rejected as meaningless, leaving the chosen artifact
|
|
93
|
+
* unconfirmable. Any addition must apply to both halves, which is now
|
|
94
|
+
* automatic.
|
|
100
95
|
*/
|
|
101
96
|
export const GENERIC_PATH_SEGMENTS = new Set([
|
|
102
97
|
'content',
|
|
@@ -119,17 +114,16 @@ export const GENERIC_PATH_SEGMENTS = new Set([
|
|
|
119
114
|
]);
|
|
120
115
|
/**
|
|
121
116
|
* Computes a score for `candidatePath` relative to `sourcePath`. Higher
|
|
122
|
-
* scores win. Score = trailing-segment match count, with a bonus when
|
|
123
|
-
*
|
|
124
|
-
*
|
|
117
|
+
* scores win. Score = trailing-segment match count, with a bonus when the
|
|
118
|
+
* candidate's path contains a meaningful intermediate segment from the
|
|
119
|
+
* source (e.g. `branding`, or the branding dir name itself).
|
|
125
120
|
*
|
|
126
|
-
* The bonus exists because Firefox packaging often re-roots files: a
|
|
127
|
-
*
|
|
121
|
+
* The bonus exists because Firefox packaging often re-roots files: a source
|
|
122
|
+
* `branding/<name>/content/aboutDialog.css` lands at
|
|
128
123
|
* `chrome/browser/content/branding/aboutDialog.css` — only the basename
|
|
129
|
-
* trails-match, but the `branding` segment moved into the middle of
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* the audit would pick whichever the directory walk hit first.
|
|
124
|
+
* trails-match, but the `branding` segment moved into the middle of the
|
|
125
|
+
* candidate path. Without the bonus that candidate ties with the unrelated
|
|
126
|
+
* `chrome/browser/content/browser/aboutDialog.css`.
|
|
133
127
|
*
|
|
134
128
|
* @param sourcePath Engine-relative POSIX path
|
|
135
129
|
* @param candidatePath Absolute path under the dist tree
|
|
@@ -2,29 +2,28 @@
|
|
|
2
2
|
/*
|
|
3
3
|
* Known source→packaging path transforms for the post-build dist-tree audit.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* related" and reports the correctly-packaged chrome resource as missing.
|
|
5
|
+
* A source at `engine/browser/base/content/foo.js` ships under
|
|
6
|
+
* `chrome/browser/content/browser/foo.js`. If an unrelated patch registers a
|
|
7
|
+
* different `foo.js` elsewhere (say a pref file under
|
|
8
|
+
* `browser/defaults/preferences/`), the basename walker surfaces both, and
|
|
9
|
+
* `scoreCandidate` awards them an identical trailing-overlap score because
|
|
10
|
+
* every intermediate segment is in the generic list. The heuristic then
|
|
11
|
+
* declares the winner "not structurally related" and reports the
|
|
12
|
+
* correctly-packaged chrome resource as missing.
|
|
14
13
|
*
|
|
15
|
-
* The transforms below anchor resolution to the
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* scorer never runs and the structural-relation check is bypassed.
|
|
14
|
+
* The transforms below anchor resolution to the subtree→chrome conventions
|
|
15
|
+
* upstream mozilla-central jar.mn uses. A candidate whose path ends with the
|
|
16
|
+
* implied chrome suffix is a confident match: the scorer never runs and the
|
|
17
|
+
* structural-relation check is bypassed.
|
|
20
18
|
*
|
|
21
|
-
* Scope is intentionally narrow
|
|
22
|
-
* stable across
|
|
23
|
-
*
|
|
24
|
-
* `
|
|
19
|
+
* Scope is intentionally narrow — only subtrees whose packaging target is
|
|
20
|
+
* stable across forks. A fork that reroutes a known subtree can still win by
|
|
21
|
+
* adding `(source)` annotations in its own `jar.mn`, which
|
|
22
|
+
* `resolveArtifactByRegistration` consults first.
|
|
25
23
|
*/
|
|
26
24
|
import { basename, sep } from 'node:path';
|
|
27
25
|
import { findAllByBasename } from './build-audit-resolve.js';
|
|
26
|
+
import { WIDGETS_DIR } from './furnace-constants.js';
|
|
28
27
|
/**
|
|
29
28
|
* Table of `prefix → chrome-suffix` transforms. Each rule names an
|
|
30
29
|
* engine-relative subtree prefix and produces the expected dist-tree
|
|
@@ -38,7 +37,7 @@ const KNOWN_TRANSFORMS = [
|
|
|
38
37
|
build: (rest) => `chrome/browser/content/browser/${rest}`,
|
|
39
38
|
},
|
|
40
39
|
{
|
|
41
|
-
prefix:
|
|
40
|
+
prefix: `${WIDGETS_DIR}/`,
|
|
42
41
|
build: (rest) => `chrome/toolkit/content/global/elements/${rest}`,
|
|
43
42
|
},
|
|
44
43
|
{
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* but never registered in moz.build, jar.mn, or package-manifest.in, so
|
|
7
7
|
* the mach build reports success but the packaged bundle carries stale
|
|
8
8
|
* or missing content. A fork-specific pref file that was never registered
|
|
9
|
-
* for packaging is the
|
|
9
|
+
* for packaging is the canonical case.
|
|
10
10
|
*
|
|
11
11
|
* The audit is best-effort and warn-only:
|
|
12
12
|
* - It enumerates engine files changed since the previous build baseline
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
* segment overlap so a branding override does not get matched
|
|
34
34
|
* against an unrelated upstream file with the same basename.
|
|
35
35
|
*/
|
|
36
|
-
import { stat } from 'node:fs/promises';
|
|
36
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
37
37
|
import { basename, join } from 'node:path';
|
|
38
38
|
import { pathExists } from '../utils/fs.js';
|
|
39
39
|
import { info, verbose, warn } from '../utils/logger.js';
|
|
@@ -59,13 +59,11 @@ const PACKAGEABLE_PATH_FRAGMENTS = ['/app/profile/', '/chrome/', '/locales/'];
|
|
|
59
59
|
/** Directories that are build artifacts, not source — never audited. */
|
|
60
60
|
const IGNORE_PATH_FRAGMENTS = ['obj-', 'node_modules/', '.git/', '.cargo/', '.mozbuild/'];
|
|
61
61
|
/**
|
|
62
|
-
* Basenames that are build-system inputs, not packaged artifacts.
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* and a worse failure mode when an unrelated upstream `moz.build`
|
|
68
|
-
* coincidentally exists at e.g. `MyBrowser.app/Contents/moz.build` and
|
|
62
|
+
* Basenames that are build-system inputs, not packaged artifacts. `jar.mn`
|
|
63
|
+
* is consumed to produce chrome registrations; `moz.build` / `moz.configure`
|
|
64
|
+
* / `Makefile.in` feed the build backend; none ship in the bundle. Auditing
|
|
65
|
+
* them guarantees a false positive on every edit, and worse, an unrelated
|
|
66
|
+
* upstream `moz.build` sitting at e.g. `MyBrowser.app/Contents/moz.build`
|
|
69
67
|
* gets matched as a "stale artifact" of an entirely different file.
|
|
70
68
|
*/
|
|
71
69
|
const BUILD_INPUT_BASENAMES = new Set([
|
|
@@ -92,13 +90,11 @@ export function isPackageablePath(sourcePath) {
|
|
|
92
90
|
if (BUILD_INPUT_BASENAMES.has(basename(sourcePath)))
|
|
93
91
|
return false;
|
|
94
92
|
// `.inc.xhtml` fragments are consumed via `#include` from a registered
|
|
95
|
-
// chrome document and resolved at packaging time — they never ship as
|
|
96
|
-
//
|
|
97
|
-
// `
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
// followed the documented workflow. Mirror the same carve-out the
|
|
101
|
-
// register rules apply.
|
|
93
|
+
// chrome document and resolved at packaging time — they never ship as a
|
|
94
|
+
// standalone packaged artifact, so auditing them flags a wired
|
|
95
|
+
// `*.inc.xhtml` as "missing packaged artifact" even though `register`
|
|
96
|
+
// correctly refuses to register it. Mirror the carve-out the register
|
|
97
|
+
// rules apply.
|
|
102
98
|
if (sourcePath.endsWith('.inc.xhtml'))
|
|
103
99
|
return false;
|
|
104
100
|
for (const ext of PACKAGEABLE_EXTENSIONS) {
|
|
@@ -132,7 +128,6 @@ export function isXpcomManifestPath(sourcePath) {
|
|
|
132
128
|
* one-or-none.
|
|
133
129
|
*/
|
|
134
130
|
async function resolveDistRoot(engineDir) {
|
|
135
|
-
const { readdir } = await import('node:fs/promises');
|
|
136
131
|
let entries;
|
|
137
132
|
try {
|
|
138
133
|
entries = await readdir(engineDir);
|
|
@@ -156,7 +151,6 @@ async function resolveDistRoot(engineDir) {
|
|
|
156
151
|
* Returns undefined when no obj dir exists yet.
|
|
157
152
|
*/
|
|
158
153
|
async function resolveTestsRoot(engineDir) {
|
|
159
|
-
const { readdir } = await import('node:fs/promises');
|
|
160
154
|
let entries;
|
|
161
155
|
try {
|
|
162
156
|
entries = await readdir(engineDir);
|
|
@@ -207,18 +201,17 @@ function searchRootsFor(source, distRoot, testsRoot) {
|
|
|
207
201
|
}
|
|
208
202
|
/**
|
|
209
203
|
* Minimum trailing-segment overlap required for a same-basename dist/
|
|
210
|
-
* candidate to count as "the packaged artifact" of a source. The
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
204
|
+
* candidate to count as "the packaged artifact" of a source. The basename
|
|
205
|
+
* always trail-matches (count 1), so a threshold of 2 requires the immediate
|
|
206
|
+
* parent directory to agree too. Candidates sharing only the basename are
|
|
207
|
+
* classified as missing — warning the operator to check registration —
|
|
208
|
+
* rather than emitting a misleading stale comparison against an unrelated
|
|
209
|
+
* file of the same name.
|
|
216
210
|
*
|
|
217
|
-
* Cross-tree re-rooting
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
* detected below in `isConfidentMatch`.
|
|
211
|
+
* Cross-tree re-rooting (e.g. `branding/<name>/content/foo.css` landing at
|
|
212
|
+
* `chrome/<area>/content/branding/foo.css`) bypasses this floor:
|
|
213
|
+
* `scoreCandidate` awards a non-generic-segment bonus that lifts confidence
|
|
214
|
+
* regardless of trailing overlap. See `isConfidentMatch` below.
|
|
222
215
|
*/
|
|
223
216
|
const MIN_TRAILING_SEGMENT_OVERLAP = 2;
|
|
224
217
|
/**
|
|
@@ -285,11 +278,8 @@ async function auditSinglePath(source, ctx) {
|
|
|
285
278
|
const roots = searchRootsFor(source, ctx.distRoot, ctx.testsRoot);
|
|
286
279
|
// Registration-aware resolution first: a `jar.mn` entry whose `(source)`
|
|
287
280
|
// references this file is authoritative over the basename-similarity
|
|
288
|
-
// heuristic
|
|
289
|
-
//
|
|
290
|
-
// file of the same basename elsewhere — the heuristic cannot
|
|
291
|
-
// distinguish them, so the audit falsely reports "missing" against the
|
|
292
|
-
// correctly-packaged file.
|
|
281
|
+
// heuristic, which cannot distinguish a fork's `content/foo.js` from an
|
|
282
|
+
// unrelated pref file of the same basename elsewhere in the tree.
|
|
293
283
|
const registered = await resolveArtifactByRegistration(ctx.engineDir, source, roots);
|
|
294
284
|
if (registered) {
|
|
295
285
|
return evaluateArtifactMtime(source, registered.artifact, sourceMtime, { registered: true });
|
|
@@ -305,14 +295,10 @@ async function auditSinglePath(source, ctx) {
|
|
|
305
295
|
// source under `browser/base/content/` (or another prefix whose chrome
|
|
306
296
|
// target is stable across forks) is matched against its expected
|
|
307
297
|
// `chrome/...` suffix rather than whichever same-basename candidate the
|
|
308
|
-
// directory walk happened to hit first.
|
|
309
|
-
// `
|
|
310
|
-
//
|
|
311
|
-
//
|
|
312
|
-
// intermediate segment of the source is in the scorer's generic list,
|
|
313
|
-
// so `resolveBestArtifact` picks whichever hit first and `isConfidentMatch`
|
|
314
|
-
// rejects every candidate, classifying the correctly-packaged file as
|
|
315
|
-
// "missing" even though packaging had landed it.
|
|
298
|
+
// directory walk happened to hit first. Every intermediate segment of such
|
|
299
|
+
// a source is in the scorer's generic list, so `resolveBestArtifact` picks
|
|
300
|
+
// arbitrarily and `isConfidentMatch` then rejects every candidate,
|
|
301
|
+
// classifying a correctly-packaged file as "missing".
|
|
316
302
|
const byTransform = await resolveArtifactByKnownTransform(source, roots);
|
|
317
303
|
if (byTransform) {
|
|
318
304
|
return evaluateArtifactMtime(source, byTransform, sourceMtime, { registered: true });
|
|
@@ -23,18 +23,16 @@ export interface BuildBaseline {
|
|
|
23
23
|
*/
|
|
24
24
|
binaryName: string;
|
|
25
25
|
/**
|
|
26
|
-
* Content hash per packageable engine path that was dirty at build
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* stale-check falls back to the path-only comparison in that case,
|
|
32
|
-
* so older baselines retain their existing behavior.
|
|
26
|
+
* Content hash per packageable engine path that was dirty at build time
|
|
27
|
+
* (modified-against-HEAD or untracked). Used by `checkStaleBuildForTest`
|
|
28
|
+
* to distinguish "this file's content was already in `dist/` when the
|
|
29
|
+
* build completed" from "this file has been edited since". When absent,
|
|
30
|
+
* the stale-check falls back to a path-only comparison.
|
|
33
31
|
*
|
|
34
|
-
* Keys are engine-relative POSIX paths. Values are hex-encoded
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
32
|
+
* Keys are engine-relative POSIX paths. Values are hex-encoded SHA-256
|
|
33
|
+
* digests of the file contents at the moment the baseline was recorded,
|
|
34
|
+
* or {@link DELETED_FILE_FINGERPRINT} when the successful build observed
|
|
35
|
+
* a tracked deletion.
|
|
38
36
|
*/
|
|
39
37
|
packageableFingerprints?: Record<string, string>;
|
|
40
38
|
/**
|
|
@@ -50,9 +48,7 @@ export interface BuildBaseline {
|
|
|
50
48
|
* an `--allow-stale-build` run over uncovered paths is refused rather
|
|
51
49
|
* than dispatched into a hang.
|
|
52
50
|
*
|
|
53
|
-
*
|
|
54
|
-
* wrote baselines then, so "full" is the honest historical value and the
|
|
55
|
-
* stale-check treats an absent field as full coverage.
|
|
51
|
+
* An absent field is treated as full coverage.
|
|
56
52
|
*
|
|
57
53
|
* The record is project-scoped, which is also per-obj-dir: multi-objdir
|
|
58
54
|
* checkouts are refused up-front (`AmbiguousBuildArtifactsError`), so at
|
|
@@ -62,26 +58,25 @@ export interface BuildBaseline {
|
|
|
62
58
|
* general — every baseline write refreshes `packageableFingerprints` for
|
|
63
59
|
* ALL dirty packageable paths, so a blind union would whitewash an
|
|
64
60
|
* earlier scope's edited fixtures while `obj-*`/`_tests/` still holds its
|
|
65
|
-
* stale staging
|
|
61
|
+
* stale staging. Coverage therefore REPLACES by default.
|
|
66
62
|
*
|
|
67
|
-
* The one exception is `test --build --extend-coverage`, which
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
63
|
+
* The one exception is `test --build --extend-coverage`, which unions only
|
|
64
|
+
* after proving the previous record's anchor still holds: same engine
|
|
65
|
+
* HEAD, same {@link BuildBaseline.mozconfigHash}, and every previously
|
|
66
|
+
* fingerprinted path byte-identical — i.e. the wholesale fingerprint
|
|
67
|
+
* refresh is a no-op for everything the earlier scope's staging depended
|
|
68
|
+
* on. Any divergence refuses fail-closed. See `src/core/coverage-extend.ts`
|
|
69
|
+
* for the one boundary that guard does not cover (dirty non-packageable
|
|
70
|
+
* fixtures).
|
|
75
71
|
*/
|
|
76
72
|
testPackagingCoverage?: TestPackagingCoverage;
|
|
77
73
|
/**
|
|
78
74
|
* Hex-encoded SHA-256 of `engine/mozconfig` as it stood for this build.
|
|
79
75
|
* Recorded because the mozconfig is REGENERATED from project-side
|
|
80
|
-
* `configs/*.mozconfig` templates plus `fireforge.json` on every build,
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* (one plain build re-records it).
|
|
76
|
+
* `configs/*.mozconfig` templates plus `fireforge.json` on every build, so
|
|
77
|
+
* `engineHeadSha` does not cover it: two builds at the same engine SHA can
|
|
78
|
+
* configure differently. Consumed by the `--extend-coverage` anchor, which
|
|
79
|
+
* refuses when the field is absent (one plain build re-records it).
|
|
85
80
|
*/
|
|
86
81
|
mozconfigHash?: string;
|
|
87
82
|
/**
|
|
@@ -89,18 +84,17 @@ export interface BuildBaseline {
|
|
|
89
84
|
* the last FULL-coverage build plus content fingerprints of the
|
|
90
85
|
* `components.conf` manifests that were dirty at that moment. Written
|
|
91
86
|
* fresh only on FULL-coverage baseline writes (`fireforge build`,
|
|
92
|
-
* `build --ui`, path-less `test --build`); a scoped `test --build`
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
* static-components stale check degrades to "fresh" in that case.
|
|
87
|
+
* `build --ui`, path-less `test --build`); a scoped `test --build` carries
|
|
88
|
+
* the previous record forward verbatim, because `mach build faster` does
|
|
89
|
+
* not rebake `components.conf` registrations into the compiled table. When
|
|
90
|
+
* absent, the static-components stale check degrades to "fresh".
|
|
97
91
|
*/
|
|
98
92
|
staticComponentsBaseline?: StaticComponentsBaseline;
|
|
99
93
|
/**
|
|
100
94
|
* Invocation shape that recorded this baseline (`'fireforge build'`,
|
|
101
95
|
* `'fireforge build --ui'`, `'fireforge test --build [paths]'`).
|
|
102
|
-
* Informational — surfaced by `fireforge status --test-coverage`.
|
|
103
|
-
*
|
|
96
|
+
* Informational — surfaced by `fireforge status --test-coverage`. Render
|
|
97
|
+
* as "unknown" when absent.
|
|
104
98
|
*/
|
|
105
99
|
recordedBy?: string;
|
|
106
100
|
}
|
|
@@ -36,6 +36,7 @@ export declare function readBuildBaseline(projectRoot: string): Promise<BuildBas
|
|
|
36
36
|
* engine HEAD SHA (or an empty string when the engine has no HEAD yet) and
|
|
37
37
|
* the current binaryName. Caller is responsible for only invoking this
|
|
38
38
|
* after the build exit code was zero.
|
|
39
|
+
*
|
|
39
40
|
* @param projectRoot - Root directory of the project
|
|
40
41
|
* @param engineDir - Path to the engine directory
|
|
41
42
|
* @param binaryName - Current `binaryName` from fireforge.json
|
|
@@ -51,9 +52,9 @@ export declare function readBuildBaseline(projectRoot: string): Promise<BuildBas
|
|
|
51
52
|
* @param staticComponentsHandling - `'auto'` (default) refreshes the
|
|
52
53
|
* static-components anchor whenever the coverage claim is `'full'` or
|
|
53
54
|
* absent. `'refresh'` records it even for a scoped coverage claim whose
|
|
54
|
-
* implementation escalated to a full build. `'carry-forward'` always
|
|
55
|
-
* `--extend-coverage`, whose union
|
|
56
|
-
* while the build that produced it was still a
|
|
57
|
-
* faster` that did not rebake the compiled table.
|
|
55
|
+
* implementation escalated to a full build. `'carry-forward'` always
|
|
56
|
+
* keeps the previous anchor: needed by `--extend-coverage`, whose union
|
|
57
|
+
* can EVALUATE to `'full'` while the build that produced it was still a
|
|
58
|
+
* scoped `mach build faster` that did not rebake the compiled table.
|
|
58
59
|
*/
|
|
59
60
|
export declare function writeBuildBaseline(projectRoot: string, engineDir: string, binaryName: string, testPackagingCoverage?: TestPackagingCoverage, previousBaseline?: BuildBaseline, recordedBy?: string, staticComponentsHandling?: 'auto' | 'refresh' | 'carry-forward'): Promise<void>;
|