@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
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Why a changed engine path was not audited.
|
|
3
|
+
*
|
|
4
|
+
* The first four name skips that already existed as unstructured
|
|
5
|
+
* `verbose()` strings. The last four are the 0.46.0 classifiers.
|
|
6
|
+
*/
|
|
7
|
+
export type AuditSkipReason = 'not-packageable' | 'platform-gated' | 'platform-gated-ancestor' | 'tests-not-packaged' | 'source-unreadable' | 'branding-not-selected' | 'storybook-story' | 'declared-unpackaged';
|
|
8
|
+
/** Render order for the `Packaged:` summary's per-class breakdown. */
|
|
9
|
+
export declare const AUDIT_SKIP_REASONS: readonly AuditSkipReason[];
|
|
10
|
+
/** True for a Storybook story module. */
|
|
11
|
+
export declare function isStorybookStoryPath(sourcePath: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Reads the branding directory this objdir was configured with.
|
|
14
|
+
*
|
|
15
|
+
* FireForge generates `engine/mozconfig` and writes the
|
|
16
|
+
* `ac_add_options --with-branding=…` line into it, so the selected branding
|
|
17
|
+
* is knowable from the tree. Returns undefined when the mozconfig cannot be
|
|
18
|
+
* read or carries no directive. The caller must then keep warning, because
|
|
19
|
+
* a skip that cannot name its evidence is a masked warning.
|
|
20
|
+
*
|
|
21
|
+
* @param engineDir - Absolute path to the engine root
|
|
22
|
+
* @returns Engine-relative branding path, or undefined
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveSelectedBranding(engineDir: string): Promise<string | undefined>;
|
|
25
|
+
/**
|
|
26
|
+
* True when `sourcePath` lives under a branding tree that is not the one
|
|
27
|
+
* this objdir was configured with.
|
|
28
|
+
*
|
|
29
|
+
* An unselected branding directory is not an input to this build at all, so
|
|
30
|
+
* its files can never appear in `dist/`. Worse, the basename walker matched
|
|
31
|
+
* them against the selected branding's same-named artifact and reported the
|
|
32
|
+
* unselected file as "newer than its packaged artifact", a stale warning
|
|
33
|
+
* about a comparison that has no meaning.
|
|
34
|
+
*
|
|
35
|
+
* @param sourcePath - Engine-relative POSIX path
|
|
36
|
+
* @param selectedBranding - Engine-relative selected branding path
|
|
37
|
+
*/
|
|
38
|
+
export declare function isUnselectedBrandingPath(sourcePath: string, selectedBranding: string | undefined): boolean;
|
|
39
|
+
/** One `buildAudit.unpackaged` carve-out from `fireforge.json`. */
|
|
40
|
+
export interface UnpackagedDeclaration {
|
|
41
|
+
/** Engine-relative path or glob. */
|
|
42
|
+
path: string;
|
|
43
|
+
/** Why this file is deliberately never packaged. Required, non-empty. */
|
|
44
|
+
reason: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Finds the declaration admitting `sourcePath`, if any.
|
|
48
|
+
*
|
|
49
|
+
* Exact match or a `*`-within-one-segment glob, matching the
|
|
50
|
+
* `support-files` matcher's narrowness: `**` and other cross-directory
|
|
51
|
+
* shapes are not accepted, because a carve-out that silently widens is the
|
|
52
|
+
* failure this feature is warned against.
|
|
53
|
+
*
|
|
54
|
+
* @param sourcePath - Engine-relative POSIX path
|
|
55
|
+
* @param declarations - The project's `buildAudit.unpackaged` entries
|
|
56
|
+
*/
|
|
57
|
+
export declare function matchUnpackagedDeclaration(sourcePath: string, declarations: readonly UnpackagedDeclaration[]): UnpackagedDeclaration | undefined;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* Skip classification for the post-build packaging audit.
|
|
4
|
+
*
|
|
5
|
+
* The audit is warn-only, which makes a false positive cheap individually
|
|
6
|
+
* and expensive in aggregate: an operator who learns that `Audit:` lines are
|
|
7
|
+
* usually wrong stops reading the one that is right. Every classifier here
|
|
8
|
+
* exists to remove a warning whose "missing packaged artifact" claim is
|
|
9
|
+
* structurally impossible, and each carries its own reason so the
|
|
10
|
+
* `Packaged:` summary can say what it skipped and why. This replaces a run
|
|
11
|
+
* reporting `4 missing` with zero real misses.
|
|
12
|
+
*/
|
|
13
|
+
import { readText } from '../utils/fs.js';
|
|
14
|
+
import { normalizePathSlashes } from '../utils/paths.js';
|
|
15
|
+
import { escapeRegex } from '../utils/regex.js';
|
|
16
|
+
import { extractWithBrandingPath } from './mach-mozconfig.js';
|
|
17
|
+
/** Render order for the `Packaged:` summary's per-class breakdown. */
|
|
18
|
+
export const AUDIT_SKIP_REASONS = [
|
|
19
|
+
'not-packageable',
|
|
20
|
+
'platform-gated',
|
|
21
|
+
'platform-gated-ancestor',
|
|
22
|
+
'tests-not-packaged',
|
|
23
|
+
'source-unreadable',
|
|
24
|
+
'branding-not-selected',
|
|
25
|
+
'storybook-story',
|
|
26
|
+
'declared-unpackaged',
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Suffixes of Storybook story modules.
|
|
30
|
+
*
|
|
31
|
+
* Firefox's in-tree Storybook renders these through its own Vite config.
|
|
32
|
+
* No `jar.mn` or `moz.build` entry packages one, so "no packaged artifact"
|
|
33
|
+
* is the expected state rather than a missing registration. Kept as a
|
|
34
|
+
* closed list on purpose: generalising to "anything with a dotted infix"
|
|
35
|
+
* would swallow `*.worker.js` and `*.sys.mjs`, which are packaged.
|
|
36
|
+
*/
|
|
37
|
+
const STORYBOOK_SUFFIXES = ['.stories.mjs', '.stories.js'];
|
|
38
|
+
/** True for a Storybook story module. */
|
|
39
|
+
export function isStorybookStoryPath(sourcePath) {
|
|
40
|
+
const normalised = normalizePathSlashes(sourcePath);
|
|
41
|
+
return STORYBOOK_SUFFIXES.some((suffix) => normalised.endsWith(suffix));
|
|
42
|
+
}
|
|
43
|
+
/** Prefix under which every branding tree lives. */
|
|
44
|
+
const BRANDING_ROOT = 'browser/branding/';
|
|
45
|
+
/**
|
|
46
|
+
* Reads the branding directory this objdir was configured with.
|
|
47
|
+
*
|
|
48
|
+
* FireForge generates `engine/mozconfig` and writes the
|
|
49
|
+
* `ac_add_options --with-branding=…` line into it, so the selected branding
|
|
50
|
+
* is knowable from the tree. Returns undefined when the mozconfig cannot be
|
|
51
|
+
* read or carries no directive. The caller must then keep warning, because
|
|
52
|
+
* a skip that cannot name its evidence is a masked warning.
|
|
53
|
+
*
|
|
54
|
+
* @param engineDir - Absolute path to the engine root
|
|
55
|
+
* @returns Engine-relative branding path, or undefined
|
|
56
|
+
*/
|
|
57
|
+
export async function resolveSelectedBranding(engineDir) {
|
|
58
|
+
try {
|
|
59
|
+
const content = await readText(`${engineDir.replace(/[/\\]+$/, '')}/mozconfig`);
|
|
60
|
+
const selected = extractWithBrandingPath(content);
|
|
61
|
+
return selected === undefined ? undefined : normalizePathSlashes(selected).replace(/\/+$/, '');
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* True when `sourcePath` lives under a branding tree that is not the one
|
|
69
|
+
* this objdir was configured with.
|
|
70
|
+
*
|
|
71
|
+
* An unselected branding directory is not an input to this build at all, so
|
|
72
|
+
* its files can never appear in `dist/`. Worse, the basename walker matched
|
|
73
|
+
* them against the selected branding's same-named artifact and reported the
|
|
74
|
+
* unselected file as "newer than its packaged artifact", a stale warning
|
|
75
|
+
* about a comparison that has no meaning.
|
|
76
|
+
*
|
|
77
|
+
* @param sourcePath - Engine-relative POSIX path
|
|
78
|
+
* @param selectedBranding - Engine-relative selected branding path
|
|
79
|
+
*/
|
|
80
|
+
export function isUnselectedBrandingPath(sourcePath, selectedBranding) {
|
|
81
|
+
if (selectedBranding === undefined)
|
|
82
|
+
return false;
|
|
83
|
+
const normalised = normalizePathSlashes(sourcePath);
|
|
84
|
+
if (!normalised.startsWith(BRANDING_ROOT))
|
|
85
|
+
return false;
|
|
86
|
+
const selected = `${selectedBranding}/`;
|
|
87
|
+
return !normalised.startsWith(selected);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Finds the declaration admitting `sourcePath`, if any.
|
|
91
|
+
*
|
|
92
|
+
* Exact match or a `*`-within-one-segment glob, matching the
|
|
93
|
+
* `support-files` matcher's narrowness: `**` and other cross-directory
|
|
94
|
+
* shapes are not accepted, because a carve-out that silently widens is the
|
|
95
|
+
* failure this feature is warned against.
|
|
96
|
+
*
|
|
97
|
+
* @param sourcePath - Engine-relative POSIX path
|
|
98
|
+
* @param declarations - The project's `buildAudit.unpackaged` entries
|
|
99
|
+
*/
|
|
100
|
+
export function matchUnpackagedDeclaration(sourcePath, declarations) {
|
|
101
|
+
const normalised = normalizePathSlashes(sourcePath);
|
|
102
|
+
return declarations.find((declaration) => {
|
|
103
|
+
const pattern = normalizePathSlashes(declaration.path);
|
|
104
|
+
if (!pattern.includes('*'))
|
|
105
|
+
return pattern === normalised;
|
|
106
|
+
const regex = new RegExp(`^${pattern
|
|
107
|
+
.split('*')
|
|
108
|
+
.map((part) => escapeRegex(part))
|
|
109
|
+
.join('[^/]*')}$`);
|
|
110
|
+
return regex.test(normalised);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Returns the expected chrome-tree suffix for an engine-relative POSIX
|
|
3
|
-
* source path when the path falls under a known transform prefix
|
|
4
|
-
* undefined otherwise.
|
|
3
|
+
* source path when the path falls under a known transform prefix.
|
|
4
|
+
* Returns undefined otherwise.
|
|
5
5
|
*
|
|
6
6
|
* @param source Engine-relative POSIX source path.
|
|
7
7
|
*/
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* implied chrome suffix is a confident match: the scorer never runs and the
|
|
17
17
|
* structural-relation check is bypassed.
|
|
18
18
|
*
|
|
19
|
-
* Scope is
|
|
19
|
+
* Scope is narrow: only subtrees whose packaging target is
|
|
20
20
|
* stable across forks. A fork that reroutes a known subtree can still win by
|
|
21
21
|
* adding `(source)` annotations in its own `jar.mn`, which
|
|
22
22
|
* `resolveArtifactByRegistration` consults first.
|
|
@@ -47,8 +47,8 @@ const KNOWN_TRANSFORMS = [
|
|
|
47
47
|
];
|
|
48
48
|
/**
|
|
49
49
|
* Returns the expected chrome-tree suffix for an engine-relative POSIX
|
|
50
|
-
* source path when the path falls under a known transform prefix
|
|
51
|
-
* undefined otherwise.
|
|
50
|
+
* source path when the path falls under a known transform prefix.
|
|
51
|
+
* Returns undefined otherwise.
|
|
52
52
|
*
|
|
53
53
|
* @param source Engine-relative POSIX source path.
|
|
54
54
|
*/
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { type AuditSkipReason, type UnpackagedDeclaration } from './build-audit-skip.js';
|
|
1
2
|
import type { BuildBaseline } from './build-baseline-types.js';
|
|
2
3
|
/**
|
|
3
4
|
* True for the build-input manifests the build consumes but never packages
|
|
4
5
|
* (`jar.mn`, `moz.build`, `moz.configure`, `Makefile.in`, `mozbuild.in`).
|
|
5
|
-
* Excluded from the packaging audit and from `packageableFingerprints
|
|
6
|
-
*
|
|
6
|
+
* Excluded from the packaging audit and from `packageableFingerprints`.
|
|
7
|
+
* Fingerprinted separately as `buildInputFingerprints` so `build-prepare`
|
|
7
8
|
* can tell "dirty against HEAD" from "changed since the last successful
|
|
8
9
|
* build".
|
|
9
10
|
*
|
|
@@ -34,9 +35,17 @@ export interface AuditEntry {
|
|
|
34
35
|
* updated: an artifact exists and is at least as new as the source.
|
|
35
36
|
* stale: artifact exists but is older than the source (probable packaging drop).
|
|
36
37
|
* missing: no artifact with a matching basename was found anywhere under dist/.
|
|
37
|
-
* skipped: the file
|
|
38
|
+
* skipped: the file was not audited. `skipReason` says why.
|
|
38
39
|
*/
|
|
39
40
|
status: 'updated' | 'stale' | 'missing' | 'skipped';
|
|
41
|
+
/**
|
|
42
|
+
* Why a `skipped` entry was skipped. Present only for `skipped`. The
|
|
43
|
+
* reasons used to exist only as verbose log strings, so the summary line
|
|
44
|
+
* could report `4 missing` on a run with zero real misses and nothing in
|
|
45
|
+
* the counts distinguished a structural non-input from an unregistered
|
|
46
|
+
* file an operator must act on.
|
|
47
|
+
*/
|
|
48
|
+
skipReason?: AuditSkipReason;
|
|
40
49
|
}
|
|
41
50
|
/** Summary counts for the "Packaged:" end-of-build line. */
|
|
42
51
|
export interface AuditSummary {
|
|
@@ -44,6 +53,8 @@ export interface AuditSummary {
|
|
|
44
53
|
stale: number;
|
|
45
54
|
missing: number;
|
|
46
55
|
skipped: number;
|
|
56
|
+
/** Per-class skip counts, so the summary can name what it dismissed. */
|
|
57
|
+
skippedByReason: Record<AuditSkipReason, number>;
|
|
47
58
|
entries: AuditEntry[];
|
|
48
59
|
}
|
|
49
60
|
/**
|
|
@@ -57,11 +68,11 @@ export interface AuditSummary {
|
|
|
57
68
|
*/
|
|
58
69
|
export declare function isPackageablePath(sourcePath: string): boolean;
|
|
59
70
|
/**
|
|
60
|
-
* Decides whether a source path is an XPCOM static-component manifest
|
|
71
|
+
* Decides whether a source path is an XPCOM static-component manifest,
|
|
61
72
|
* i.e. a file whose registrations are baked into the compiled
|
|
62
|
-
* StaticComponents table at
|
|
73
|
+
* StaticComponents table at full-build time rather than packaged into
|
|
63
74
|
* `dist/`. This basename check is the single extension point for that
|
|
64
|
-
* classification
|
|
75
|
+
* classification. Parsing `moz.build` `XPCOM_MANIFESTS` entries to follow
|
|
65
76
|
* renamed manifests is out of scope.
|
|
66
77
|
*
|
|
67
78
|
* @param sourcePath Engine-relative POSIX path.
|
|
@@ -71,11 +82,13 @@ export declare function isXpcomManifestPath(sourcePath: string): boolean;
|
|
|
71
82
|
/**
|
|
72
83
|
* Runs the post-build audit. Emits per-file warnings for missing or
|
|
73
84
|
* stale artifacts and a summary info line at the end. Always returns
|
|
74
|
-
* the summary
|
|
85
|
+
* the summary. Never throws on audit failure (the audit itself must
|
|
75
86
|
* never fail a successful build).
|
|
76
87
|
* @param projectRoot Root of the project (reserved for future fork-specific rules).
|
|
77
88
|
* @param engineDir Path to the engine directory.
|
|
78
89
|
* @param baseline Optional previous-build baseline marker.
|
|
79
90
|
* @returns Summary of artifact status counts.
|
|
80
91
|
*/
|
|
81
|
-
export declare function auditBuildArtifacts(projectRoot: string, engineDir: string, baseline: BuildBaseline | undefined
|
|
92
|
+
export declare function auditBuildArtifacts(projectRoot: string, engineDir: string, baseline: BuildBaseline | undefined, options?: {
|
|
93
|
+
unpackaged?: readonly UnpackagedDeclaration[];
|
|
94
|
+
}): Promise<AuditSummary>;
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* (git-tracked diff + workdir modifications).
|
|
14
14
|
* - For each file whose path pattern implies packaging, it resolves
|
|
15
15
|
* the expected dist artifact under obj-star/dist/binary-name-star.
|
|
16
|
-
* - A warning fires when the expected artifact is missing
|
|
16
|
+
* - A warning fires when the expected artifact is missing or when its
|
|
17
17
|
* mtime is older than the engine source (the build was reported
|
|
18
18
|
* successful but that file's path never flowed through packaging).
|
|
19
19
|
* - False positives are acceptable at this stage: fork-specific packaging
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
*
|
|
23
23
|
* Routing rules:
|
|
24
24
|
* - Build inputs (jar.mn, moz.build, Makefile.in, moz.configure) are
|
|
25
|
-
* skipped
|
|
25
|
+
* skipped. They are consumed, not packaged.
|
|
26
26
|
* - Test sources (anything under /test(s)/, browser_*.js, test_*.js)
|
|
27
|
-
* are looked up under _tests/, not dist
|
|
27
|
+
* are looked up under _tests/, not dist/, which is where mach copies
|
|
28
28
|
* them.
|
|
29
29
|
* - Files inside an `if CONFIG[...]:` block in moz.build that gates
|
|
30
30
|
* off on the current host are skipped (Windows stubinstaller CSS on
|
|
@@ -39,9 +39,10 @@ import { toError } from '../utils/errors.js';
|
|
|
39
39
|
import { pathExists } from '../utils/fs.js';
|
|
40
40
|
import { info, verbose, warn } from '../utils/logger.js';
|
|
41
41
|
import { normalizePathSlashes } from '../utils/paths.js';
|
|
42
|
-
import { detectPlatformGate } from './build-audit-platform.js';
|
|
42
|
+
import { detectAncestorDirsGate, detectPlatformGate } from './build-audit-platform.js';
|
|
43
43
|
import { collectSameBasenameCandidates, findRegisteredTarget, resolveArtifactByRegistration, } from './build-audit-registration.js';
|
|
44
44
|
import { countTrailingSegmentMatches, GENERIC_PATH_SEGMENTS, isTestPath, resolveBestArtifact, } from './build-audit-resolve.js';
|
|
45
|
+
import { AUDIT_SKIP_REASONS, isStorybookStoryPath, isUnselectedBrandingPath, matchUnpackagedDeclaration, resolveSelectedBranding, } from './build-audit-skip.js';
|
|
45
46
|
import { resolveArtifactByKnownTransform } from './build-audit-transforms.js';
|
|
46
47
|
import { collectChangedEnginePaths } from './engine-changes.js';
|
|
47
48
|
import { loadPatchesManifest } from './patch-manifest-io.js';
|
|
@@ -60,12 +61,12 @@ const PACKAGEABLE_EXTENSIONS = [
|
|
|
60
61
|
];
|
|
61
62
|
/** Path fragments whose contents are packaged regardless of extension. */
|
|
62
63
|
const PACKAGEABLE_PATH_FRAGMENTS = ['/app/profile/', '/chrome/', '/locales/'];
|
|
63
|
-
/** Directories that are build artifacts, not source
|
|
64
|
+
/** Directories that are build artifacts, not source. Never audited. */
|
|
64
65
|
const IGNORE_PATH_FRAGMENTS = ['obj-', 'node_modules/', '.git/', '.cargo/', '.mozbuild/'];
|
|
65
66
|
/**
|
|
66
67
|
* Basenames that are build-system inputs, not packaged artifacts. `jar.mn`
|
|
67
|
-
* is consumed to produce chrome registrations
|
|
68
|
-
* / `Makefile.in` feed the build backend
|
|
68
|
+
* is consumed to produce chrome registrations. `moz.build` / `moz.configure`
|
|
69
|
+
* / `Makefile.in` feed the build backend. None ship in the bundle. Auditing
|
|
69
70
|
* them guarantees a false positive on every edit, and worse, an unrelated
|
|
70
71
|
* upstream `moz.build` sitting at e.g. `MyBrowser.app/Contents/moz.build`
|
|
71
72
|
* gets matched as a "stale artifact" of an entirely different file.
|
|
@@ -80,8 +81,8 @@ const BUILD_INPUT_BASENAMES = new Set([
|
|
|
80
81
|
/**
|
|
81
82
|
* True for the build-input manifests the build consumes but never packages
|
|
82
83
|
* (`jar.mn`, `moz.build`, `moz.configure`, `Makefile.in`, `mozbuild.in`).
|
|
83
|
-
* Excluded from the packaging audit and from `packageableFingerprints
|
|
84
|
-
*
|
|
84
|
+
* Excluded from the packaging audit and from `packageableFingerprints`.
|
|
85
|
+
* Fingerprinted separately as `buildInputFingerprints` so `build-prepare`
|
|
85
86
|
* can tell "dirty against HEAD" from "changed since the last successful
|
|
86
87
|
* build".
|
|
87
88
|
*
|
|
@@ -101,6 +102,10 @@ export function isBuildInputPath(sourcePath) {
|
|
|
101
102
|
export function isJarManifestPath(sourcePath) {
|
|
102
103
|
return sourcePath === 'jar.mn' || sourcePath.endsWith('/jar.mn');
|
|
103
104
|
}
|
|
105
|
+
/** Zeroed per-class skip counters. */
|
|
106
|
+
function emptySkipCounts() {
|
|
107
|
+
return Object.fromEntries(AUDIT_SKIP_REASONS.map((reason) => [reason, 0]));
|
|
108
|
+
}
|
|
104
109
|
/**
|
|
105
110
|
* Decides whether a source path should be packaged. Returns true for paths
|
|
106
111
|
* whose extension or directory fragment matches a known-packaged pattern,
|
|
@@ -118,7 +123,7 @@ export function isPackageablePath(sourcePath) {
|
|
|
118
123
|
if (isBuildInputPath(sourcePath))
|
|
119
124
|
return false;
|
|
120
125
|
// `.inc.xhtml` fragments are consumed via `#include` from a registered
|
|
121
|
-
// chrome document and resolved at packaging time
|
|
126
|
+
// chrome document and resolved at packaging time. They never ship as a
|
|
122
127
|
// standalone packaged artifact, so auditing them flags a wired
|
|
123
128
|
// `*.inc.xhtml` as "missing packaged artifact" even though `register`
|
|
124
129
|
// correctly refuses to register it. Mirror the carve-out the register
|
|
@@ -136,18 +141,18 @@ export function isPackageablePath(sourcePath) {
|
|
|
136
141
|
return false;
|
|
137
142
|
}
|
|
138
143
|
/**
|
|
139
|
-
* Decides whether a source path is an XPCOM static-component manifest
|
|
144
|
+
* Decides whether a source path is an XPCOM static-component manifest,
|
|
140
145
|
* i.e. a file whose registrations are baked into the compiled
|
|
141
|
-
* StaticComponents table at
|
|
146
|
+
* StaticComponents table at full-build time rather than packaged into
|
|
142
147
|
* `dist/`. This basename check is the single extension point for that
|
|
143
|
-
* classification
|
|
148
|
+
* classification. Parsing `moz.build` `XPCOM_MANIFESTS` entries to follow
|
|
144
149
|
* renamed manifests is out of scope.
|
|
145
150
|
*
|
|
146
151
|
* @param sourcePath Engine-relative POSIX path.
|
|
147
152
|
* @returns True when the path is a `components.conf` manifest.
|
|
148
153
|
*/
|
|
149
154
|
export function isXpcomManifestPath(sourcePath) {
|
|
150
|
-
return basename(sourcePath
|
|
155
|
+
return basename(normalizePathSlashes(sourcePath)) === 'components.conf';
|
|
151
156
|
}
|
|
152
157
|
/*
|
|
153
158
|
* Finds the unique obj-star directory with a dist subtree, or undefined
|
|
@@ -199,8 +204,8 @@ async function resolveTestsRoot(engineDir) {
|
|
|
199
204
|
/**
|
|
200
205
|
* Marker file the `package-tests` make target writes after copying the
|
|
201
206
|
* full test-source tree under `_tests/`. Its presence is the most reliable
|
|
202
|
-
* signal that test packaging has actually run for the current obj-dir
|
|
203
|
-
*
|
|
207
|
+
* signal that test packaging has actually run for the current obj-dir.
|
|
208
|
+
* Plain `mach build` populates a partial `_tests/` subtree and then stops,
|
|
204
209
|
* so registered tests are absent even when registration is correct.
|
|
205
210
|
*/
|
|
206
211
|
const PACKAGED_TESTS_MARKER = 'all-tests.json';
|
|
@@ -219,7 +224,7 @@ async function hasPackagedTestsMarker(testsRoot) {
|
|
|
219
224
|
}
|
|
220
225
|
/**
|
|
221
226
|
* Resolves the search roots an individual source path should be looked
|
|
222
|
-
* up under. Test-shaped paths get `_tests
|
|
227
|
+
* up under. Test-shaped paths get `_tests/`. Everything else gets `dist/`.
|
|
223
228
|
*/
|
|
224
229
|
function searchRootsFor(source, distRoot, testsRoot) {
|
|
225
230
|
if (isTestPath(source)) {
|
|
@@ -232,7 +237,7 @@ function searchRootsFor(source, distRoot, testsRoot) {
|
|
|
232
237
|
* candidate to count as "the packaged artifact" of a source. The basename
|
|
233
238
|
* always trail-matches (count 1), so a threshold of 2 requires the immediate
|
|
234
239
|
* parent directory to agree too. Candidates sharing only the basename are
|
|
235
|
-
* classified as missing
|
|
240
|
+
* classified as missing (warning the operator to check registration)
|
|
236
241
|
* rather than emitting a misleading stale comparison against an unrelated
|
|
237
242
|
* file of the same name.
|
|
238
243
|
*
|
|
@@ -244,21 +249,21 @@ function searchRootsFor(source, distRoot, testsRoot) {
|
|
|
244
249
|
const MIN_TRAILING_SEGMENT_OVERLAP = 2;
|
|
245
250
|
/**
|
|
246
251
|
* Returns true when the chosen artifact is structurally related to the
|
|
247
|
-
* source path
|
|
252
|
+
* source path: either its immediate parent directory trail-matches, or
|
|
248
253
|
* a non-generic intermediate source segment appears in the candidate
|
|
249
254
|
* path (the branding-re-root signal already used by the scorer).
|
|
250
255
|
*
|
|
251
256
|
* Used to avoid emitting `stale` warnings that point at an unrelated
|
|
252
|
-
* same-basename file picked up by the basename walker
|
|
253
|
-
* warning
|
|
254
|
-
* dropped this file" when
|
|
257
|
+
* same-basename file picked up by the basename walker. That class of
|
|
258
|
+
* warning is worse than `missing` because it reads as "your build
|
|
259
|
+
* dropped this file" when the match is spurious.
|
|
255
260
|
*/
|
|
256
261
|
function isConfidentMatch(source, candidate) {
|
|
257
262
|
if (countTrailingSegmentMatches(source, candidate) >= MIN_TRAILING_SEGMENT_OVERLAP) {
|
|
258
263
|
return true;
|
|
259
264
|
}
|
|
260
265
|
// The candidate is an absolute path built by `join` over a dist/ walk, so on
|
|
261
|
-
// Windows it arrives backslash-separated
|
|
266
|
+
// Windows it arrives backslash-separated. A `/`-only split collapses it into
|
|
262
267
|
// one segment and the non-generic-segment bonus can never fire.
|
|
263
268
|
const sourceSegs = normalizePathSlashes(source).split('/').filter(Boolean);
|
|
264
269
|
const candSegs = normalizePathSlashes(candidate).split('/').filter(Boolean);
|
|
@@ -273,6 +278,56 @@ function isConfidentMatch(source, candidate) {
|
|
|
273
278
|
}
|
|
274
279
|
return false;
|
|
275
280
|
}
|
|
281
|
+
/**
|
|
282
|
+
* Applies a `buildAudit.unpackaged` carve-out to a classified result.
|
|
283
|
+
*
|
|
284
|
+
* Two behaviours, both mirroring the `--expect-unmanaged` model:
|
|
285
|
+
*
|
|
286
|
+
* - An admitted path is listed, not silenced. A carve-out nobody can see
|
|
287
|
+
* is how one quietly widens, so the run says which paths it admitted and
|
|
288
|
+
* on what stated reason.
|
|
289
|
+
* - An admitted path that does resolve to a packaged artifact is a stale
|
|
290
|
+
* carve-out: the declaration asserts a fact about the tree that is no
|
|
291
|
+
* longer true, and suppressing on it would hide a real packaging change.
|
|
292
|
+
* That is reported as a warning, not accepted.
|
|
293
|
+
*
|
|
294
|
+
* A declaration matching nothing that changed this run says nothing,
|
|
295
|
+
* unlike `--expect-unmanaged`, whose unseen entries are reported. The
|
|
296
|
+
* difference is intended: `--expect-unmanaged` is a per-invocation flag
|
|
297
|
+
* list, where an unmet entry is probably a typo in the command just typed.
|
|
298
|
+
* This is a
|
|
299
|
+
* standing config list checked against only the files that happened to
|
|
300
|
+
* change, so "not met" is the normal case and reporting it would put a
|
|
301
|
+
* warning on every build.
|
|
302
|
+
*/
|
|
303
|
+
function applyUnpackagedCarveOut(result, ctx) {
|
|
304
|
+
// Already skipped for a more specific structural reason. The carve-out
|
|
305
|
+
// is redundant there and reporting it would be noise.
|
|
306
|
+
if (result.status === 'skipped')
|
|
307
|
+
return result;
|
|
308
|
+
const declaration = matchUnpackagedDeclaration(result.source, ctx.unpackaged);
|
|
309
|
+
if (declaration === undefined)
|
|
310
|
+
return result;
|
|
311
|
+
if (result.artifact !== undefined) {
|
|
312
|
+
return {
|
|
313
|
+
source: result.source,
|
|
314
|
+
artifact: result.artifact,
|
|
315
|
+
status: 'skipped',
|
|
316
|
+
skipReason: 'declared-unpackaged',
|
|
317
|
+
warning: `Audit: engine/${result.source} is declared unpackaged in fireforge.json ` +
|
|
318
|
+
`("${declaration.reason}") but a packaged artifact exists at ${result.artifact}. ` +
|
|
319
|
+
'The declaration is stale — remove it, or correct its path.',
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
return {
|
|
323
|
+
source: result.source,
|
|
324
|
+
artifact: undefined,
|
|
325
|
+
status: 'skipped',
|
|
326
|
+
skipReason: 'declared-unpackaged',
|
|
327
|
+
notice: `Audit: engine/${result.source} admitted as unpackaged by ` +
|
|
328
|
+
`buildAudit.unpackaged "${declaration.path}" — ${declaration.reason}`,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
276
331
|
/**
|
|
277
332
|
* Audits one engine source path and returns its entry. Pure orchestration
|
|
278
333
|
* helper kept separate so `auditBuildArtifacts` stays under the per-function
|
|
@@ -280,12 +335,30 @@ function isConfidentMatch(source, candidate) {
|
|
|
280
335
|
*/
|
|
281
336
|
async function auditSinglePath(source, ctx) {
|
|
282
337
|
if (!isPackageablePath(source)) {
|
|
283
|
-
return { source, artifact: undefined, status: 'skipped' };
|
|
338
|
+
return { source, artifact: undefined, status: 'skipped', skipReason: 'not-packageable' };
|
|
339
|
+
}
|
|
340
|
+
if (isStorybookStoryPath(source)) {
|
|
341
|
+
verbose(`Audit: skipping engine/${source} — Storybook story, never packaged.`);
|
|
342
|
+
return { source, artifact: undefined, status: 'skipped', skipReason: 'storybook-story' };
|
|
343
|
+
}
|
|
344
|
+
if (isUnselectedBrandingPath(source, ctx.selectedBranding)) {
|
|
345
|
+
verbose(`Audit: skipping engine/${source} — branding tree is not the selected ${ctx.selectedBranding ?? '?'}, so it is not an input to this objdir.`);
|
|
346
|
+
return { source, artifact: undefined, status: 'skipped', skipReason: 'branding-not-selected' };
|
|
284
347
|
}
|
|
285
348
|
const gate = await detectPlatformGate(ctx.engineDir, source);
|
|
286
349
|
if (gate.gatedOff) {
|
|
287
350
|
verbose(`Audit: skipping engine/${source} — gated off by "${gate.gateExpression ?? '?'}".`);
|
|
288
|
-
return { source, artifact: undefined, status: 'skipped' };
|
|
351
|
+
return { source, artifact: undefined, status: 'skipped', skipReason: 'platform-gated' };
|
|
352
|
+
}
|
|
353
|
+
const ancestorGate = await detectAncestorDirsGate(ctx.engineDir, source);
|
|
354
|
+
if (ancestorGate.gatedOff) {
|
|
355
|
+
verbose(`Audit: skipping engine/${source} — its directory is reached through a DIRS entry in engine/${ancestorGate.gateFile ?? '?'} gated by "${ancestorGate.gateExpression ?? '?'}".`);
|
|
356
|
+
return {
|
|
357
|
+
source,
|
|
358
|
+
artifact: undefined,
|
|
359
|
+
status: 'skipped',
|
|
360
|
+
skipReason: 'platform-gated-ancestor',
|
|
361
|
+
};
|
|
289
362
|
}
|
|
290
363
|
// Tests only end up under `_tests/` after `mach package-tests` (or a
|
|
291
364
|
// test-run that invokes the target) has executed. A plain `mach build`
|
|
@@ -294,7 +367,7 @@ async function auditSinglePath(source, ctx) {
|
|
|
294
367
|
// Skip audit for test sources when no packaged-tests marker is present.
|
|
295
368
|
if (isTestPath(source) && !ctx.testsPackaged) {
|
|
296
369
|
verbose(`Audit: skipping engine/${source} — _tests/${PACKAGED_TESTS_MARKER} not present; full test packaging has not run for this build.`);
|
|
297
|
-
return { source, artifact: undefined, status: 'skipped' };
|
|
370
|
+
return { source, artifact: undefined, status: 'skipped', skipReason: 'tests-not-packaged' };
|
|
298
371
|
}
|
|
299
372
|
const sourcePath = join(ctx.engineDir, source);
|
|
300
373
|
let sourceMtime;
|
|
@@ -303,8 +376,8 @@ async function auditSinglePath(source, ctx) {
|
|
|
303
376
|
sourceMtime = sourceStat.mtimeMs;
|
|
304
377
|
}
|
|
305
378
|
catch {
|
|
306
|
-
// Deletion that didn't propagate
|
|
307
|
-
return { source, artifact: undefined, status: 'skipped' };
|
|
379
|
+
// Deletion that didn't propagate. Distinct class of bug, not audited yet.
|
|
380
|
+
return { source, artifact: undefined, status: 'skipped', skipReason: 'source-unreadable' };
|
|
308
381
|
}
|
|
309
382
|
const roots = searchRootsFor(source, ctx.distRoot, ctx.testsRoot);
|
|
310
383
|
// Registration-aware resolution first: a `jar.mn` entry whose `(source)`
|
|
@@ -350,7 +423,7 @@ async function auditSinglePath(source, ctx) {
|
|
|
350
423
|
* Short-circuits the audit for sources that are registered in a jar.mn
|
|
351
424
|
* but whose target path is absent from every search root. Returns the
|
|
352
425
|
* miss entry when the registration lookup saw a `(source)` claim but
|
|
353
|
-
* no dist candidate endswith the target
|
|
426
|
+
* no dist candidate endswith the target. Undefined otherwise.
|
|
354
427
|
*/
|
|
355
428
|
async function reportRegistrationMiss(engineDir, source, roots) {
|
|
356
429
|
const hit = await findRegisteredTarget(engineDir, source);
|
|
@@ -375,7 +448,7 @@ async function reportRegistrationMiss(engineDir, source, roots) {
|
|
|
375
448
|
/**
|
|
376
449
|
* Renders packaged-artifact mtime classification (updated / stale / missing-
|
|
377
450
|
* via-disappearance) for a resolved candidate. Shared by the registration-
|
|
378
|
-
* anchored path (confident
|
|
451
|
+
* anchored path (already confident) and the heuristic fallback
|
|
379
452
|
* (which still applies the structural-relatedness check before claiming
|
|
380
453
|
* `stale`).
|
|
381
454
|
*/
|
|
@@ -466,8 +539,9 @@ async function resolveAuditOwnership(projectRoot) {
|
|
|
466
539
|
/**
|
|
467
540
|
* Renders the ownership suffix for one audit notice: the owning patch, or
|
|
468
541
|
* an explicit `unmanaged` mark. An empty map (no queue, unreadable
|
|
469
|
-
* manifest) renders nothing rather than claiming everything is unmanaged
|
|
470
|
-
* "unmanaged" must mean "checked and unowned", never "could not
|
|
542
|
+
* manifest) renders nothing rather than claiming everything is unmanaged,
|
|
543
|
+
* since "unmanaged" must mean "checked and unowned", never "could not
|
|
544
|
+
* check".
|
|
471
545
|
*/
|
|
472
546
|
function describeOwnership(ownersByPath, source) {
|
|
473
547
|
if (ownersByPath.size === 0)
|
|
@@ -481,19 +555,20 @@ function describeOwnership(ownersByPath, source) {
|
|
|
481
555
|
/**
|
|
482
556
|
* Runs the post-build audit. Emits per-file warnings for missing or
|
|
483
557
|
* stale artifacts and a summary info line at the end. Always returns
|
|
484
|
-
* the summary
|
|
558
|
+
* the summary. Never throws on audit failure (the audit itself must
|
|
485
559
|
* never fail a successful build).
|
|
486
560
|
* @param projectRoot Root of the project (reserved for future fork-specific rules).
|
|
487
561
|
* @param engineDir Path to the engine directory.
|
|
488
562
|
* @param baseline Optional previous-build baseline marker.
|
|
489
563
|
* @returns Summary of artifact status counts.
|
|
490
564
|
*/
|
|
491
|
-
export async function auditBuildArtifacts(projectRoot, engineDir, baseline) {
|
|
565
|
+
export async function auditBuildArtifacts(projectRoot, engineDir, baseline, options = {}) {
|
|
492
566
|
const summary = {
|
|
493
567
|
updated: 0,
|
|
494
568
|
stale: 0,
|
|
495
569
|
missing: 0,
|
|
496
570
|
skipped: 0,
|
|
571
|
+
skippedByReason: emptySkipCounts(),
|
|
497
572
|
entries: [],
|
|
498
573
|
};
|
|
499
574
|
const distRoot = await resolveDistRoot(engineDir);
|
|
@@ -509,23 +584,50 @@ export async function auditBuildArtifacts(projectRoot, engineDir, baseline) {
|
|
|
509
584
|
}
|
|
510
585
|
// Ownership, resolved once for the whole audit. The notices key on "was
|
|
511
586
|
// touched", which on a shared checkout means any concurrent session's
|
|
512
|
-
// dirty files
|
|
587
|
+
// dirty files, so an operator gets a registration-shaped warning about a
|
|
513
588
|
// file they never edited and has to census ownership by hand to dismiss
|
|
514
|
-
// it. FireForge already resolves this for `status --ownership
|
|
515
|
-
// it here
|
|
589
|
+
// it. FireForge already resolves this for `status --ownership`. Carrying
|
|
590
|
+
// it here lets the operator dismiss those lines directly.
|
|
516
591
|
const ownersByPath = await resolveAuditOwnership(projectRoot);
|
|
517
|
-
const ctx = {
|
|
592
|
+
const ctx = {
|
|
593
|
+
engineDir,
|
|
594
|
+
distRoot,
|
|
595
|
+
testsRoot,
|
|
596
|
+
testsPackaged,
|
|
597
|
+
selectedBranding: await resolveSelectedBranding(engineDir),
|
|
598
|
+
unpackaged: options.unpackaged ?? [],
|
|
599
|
+
};
|
|
518
600
|
for (const source of changed) {
|
|
519
|
-
const result = await auditSinglePath(source, ctx);
|
|
601
|
+
const result = applyUnpackagedCarveOut(await auditSinglePath(source, ctx), ctx);
|
|
520
602
|
summary[result.status] += 1;
|
|
603
|
+
if (result.status === 'skipped' && result.skipReason !== undefined) {
|
|
604
|
+
summary.skippedByReason[result.skipReason] += 1;
|
|
605
|
+
}
|
|
521
606
|
summary.entries.push({
|
|
522
607
|
source: result.source,
|
|
523
608
|
artifact: result.artifact,
|
|
524
609
|
status: result.status,
|
|
610
|
+
...(result.skipReason === undefined ? {} : { skipReason: result.skipReason }),
|
|
525
611
|
});
|
|
526
612
|
if (result.warning)
|
|
527
613
|
warn(`${result.warning}${describeOwnership(ownersByPath, result.source)}`);
|
|
614
|
+
if (result.notice)
|
|
615
|
+
info(result.notice);
|
|
528
616
|
}
|
|
529
|
-
info(`Packaged: ${summary.updated} updated, ${summary.stale} stale, ${summary.missing} missing,
|
|
617
|
+
info(`Packaged: ${summary.updated} updated, ${summary.stale} stale, ${summary.missing} missing, ` +
|
|
618
|
+
`${summary.skipped} skipped${describeSkipBreakdown(summary)}`);
|
|
530
619
|
return summary;
|
|
531
620
|
}
|
|
621
|
+
/**
|
|
622
|
+
* Renders the per-class skip breakdown appended to the `Packaged:` line.
|
|
623
|
+
*
|
|
624
|
+
* Without it the summary reported one undifferentiated `skipped` count, so
|
|
625
|
+
* a run that dismissed four unselected-branding files and one
|
|
626
|
+
* ancestor-gated directory looked identical to one that dismissed five
|
|
627
|
+
* unregistered sources, and the four false `missing` entries downstream
|
|
628
|
+
* reported had no counterpart in the counts an operator could check.
|
|
629
|
+
*/
|
|
630
|
+
function describeSkipBreakdown(summary) {
|
|
631
|
+
const parts = AUDIT_SKIP_REASONS.filter((reason) => summary.skippedByReason[reason] > 0).map((reason) => `${reason} ${String(summary.skippedByReason[reason])}`);
|
|
632
|
+
return parts.length === 0 ? '' : ` (${parts.join(', ')})`;
|
|
633
|
+
}
|