@hominis/fireforge 0.49.2 → 0.51.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 +87 -1
- package/README.md +1 -1
- package/dist/bin/fireforge.js +6 -0
- package/dist/build-info.json +4 -4
- package/dist/src/commands/build-prelock.d.ts +20 -0
- package/dist/src/commands/build-prelock.js +50 -0
- package/dist/src/commands/build.d.ts +3 -1
- package/dist/src/commands/build.js +13 -6
- package/dist/src/commands/check-report.d.ts +41 -0
- package/dist/src/commands/check-report.js +91 -0
- package/dist/src/commands/check-run.d.ts +33 -0
- package/dist/src/commands/check-run.js +112 -0
- package/dist/src/commands/check-steps.d.ts +75 -0
- package/dist/src/commands/check-steps.js +200 -0
- package/dist/src/commands/check.d.ts +32 -0
- package/dist/src/commands/check.js +160 -0
- package/dist/src/commands/config.js +5 -6
- package/dist/src/commands/declarations-report.d.ts +43 -0
- package/dist/src/commands/declarations-report.js +76 -0
- package/dist/src/commands/doctor-engine-eslint.js +6 -1
- package/dist/src/commands/doctor-source-pin.js +4 -1
- package/dist/src/commands/export-adopt-check.d.ts +38 -0
- package/dist/src/commands/export-adopt-check.js +98 -0
- package/dist/src/commands/export-flow.js +29 -14
- package/dist/src/commands/export-placement-gate.d.ts +6 -2
- package/dist/src/commands/export-placement-gate.js +8 -0
- package/dist/src/commands/export-shared.d.ts +2 -1
- package/dist/src/commands/export-staged-registration.d.ts +46 -0
- package/dist/src/commands/export-staged-registration.js +91 -0
- package/dist/src/commands/forward-import-remedy.d.ts +32 -0
- package/dist/src/commands/forward-import-remedy.js +63 -0
- package/dist/src/commands/furnace/apply.js +3 -3
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +2 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
- package/dist/src/commands/furnace/chrome-doc.d.ts +2 -1
- package/dist/src/commands/furnace/chrome-doc.js +2 -2
- package/dist/src/commands/furnace/create.js +2 -2
- package/dist/src/commands/furnace/deploy-named.d.ts +48 -0
- package/dist/src/commands/furnace/deploy-named.js +107 -0
- package/dist/src/commands/furnace/deploy.d.ts +3 -2
- package/dist/src/commands/furnace/deploy.js +50 -86
- package/dist/src/commands/furnace/diff.js +26 -3
- package/dist/src/commands/furnace/index.js +66 -41
- package/dist/src/commands/furnace/init.js +13 -6
- package/dist/src/commands/furnace/override.js +4 -2
- package/dist/src/commands/furnace/preview.js +4 -3
- package/dist/src/commands/furnace/refresh.js +2 -2
- package/dist/src/commands/furnace/remove.js +4 -3
- package/dist/src/commands/furnace/rename-dry-run.d.ts +29 -0
- package/dist/src/commands/furnace/rename-dry-run.js +127 -0
- package/dist/src/commands/furnace/rename-helpers.d.ts +7 -0
- package/dist/src/commands/furnace/rename-helpers.js +15 -1
- package/dist/src/commands/furnace/rename-registrations.d.ts +41 -0
- package/dist/src/commands/furnace/rename-registrations.js +98 -0
- package/dist/src/commands/furnace/rename.d.ts +2 -1
- package/dist/src/commands/furnace/rename.js +28 -66
- package/dist/src/commands/furnace/scan.d.ts +9 -4
- package/dist/src/commands/furnace/scan.js +11 -9
- package/dist/src/commands/furnace/sync.js +3 -2
- package/dist/src/commands/furnace/validate-report.d.ts +45 -0
- package/dist/src/commands/furnace/validate-report.js +91 -0
- package/dist/src/commands/furnace/validate.d.ts +1 -1
- package/dist/src/commands/furnace/validate.js +151 -113
- package/dist/src/commands/furnace/validation-output.js +14 -3
- package/dist/src/commands/lint-per-patch.js +36 -61
- package/dist/src/commands/lint-per-run-checkjs.js +2 -2
- package/dist/src/commands/lint-report.d.ts +8 -4
- package/dist/src/commands/lint-report.js +20 -5
- package/dist/src/commands/lint.js +15 -34
- package/dist/src/commands/manifest.js +4 -0
- package/dist/src/commands/park.d.ts +22 -0
- package/dist/src/commands/park.js +232 -0
- package/dist/src/commands/patch/delete-gap-notice.js +3 -1
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +24 -104
- package/dist/src/commands/patch/index.d.ts +3 -3
- package/dist/src/commands/patch/index.js +10 -4
- package/dist/src/commands/patch/lint-ignore-from.d.ts +44 -0
- package/dist/src/commands/patch/lint-ignore-from.js +142 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +5 -1
- package/dist/src/commands/patch/lint-ignore.js +78 -31
- package/dist/src/commands/patch/move-files-create.js +34 -18
- package/dist/src/commands/patch/move-files-into.js +15 -7
- package/dist/src/commands/patch/move-files.js +6 -2
- package/dist/src/commands/patch/removal-created-files.d.ts +48 -0
- package/dist/src/commands/patch/removal-created-files.js +83 -0
- package/dist/src/commands/patch/removal-dependents.d.ts +63 -0
- package/dist/src/commands/patch/removal-dependents.js +133 -0
- package/dist/src/commands/patch/rename.js +20 -1
- package/dist/src/commands/patch/reserve.d.ts +33 -0
- package/dist/src/commands/patch/reserve.js +152 -0
- package/dist/src/commands/patch/retire.d.ts +34 -0
- package/dist/src/commands/patch/retire.js +133 -0
- package/dist/src/commands/patch/split-plan.d.ts +17 -8
- package/dist/src/commands/patch/split-plan.js +60 -28
- package/dist/src/commands/patch/split-staged.d.ts +108 -0
- package/dist/src/commands/patch/split-staged.js +202 -0
- package/dist/src/commands/patch/split.d.ts +5 -0
- package/dist/src/commands/patch/split.js +62 -17
- package/dist/src/commands/patch/stage.d.ts +34 -0
- package/dist/src/commands/patch/stage.js +153 -0
- package/dist/src/commands/patch/staged-dependency-batch.d.ts +48 -0
- package/dist/src/commands/patch/staged-dependency-batch.js +176 -0
- package/dist/src/commands/patch/staged-dependency-entries.d.ts +36 -0
- package/dist/src/commands/patch/staged-dependency-entries.js +52 -0
- package/dist/src/commands/patch/staged-dependency-from.d.ts +14 -0
- package/dist/src/commands/patch/staged-dependency-from.js +108 -0
- package/dist/src/commands/patch/staged-dependency-remove.d.ts +31 -0
- package/dist/src/commands/patch/staged-dependency-remove.js +80 -0
- package/dist/src/commands/patch/staged-dependency.js +54 -139
- package/dist/src/commands/re-export-adjacent-registrations.d.ts +20 -0
- package/dist/src/commands/re-export-adjacent-registrations.js +75 -0
- package/dist/src/commands/re-export-adjacent.d.ts +50 -2
- package/dist/src/commands/re-export-adjacent.js +160 -40
- package/dist/src/commands/re-export-bulk-scan.d.ts +2 -1
- package/dist/src/commands/re-export-bulk-scan.js +22 -7
- package/dist/src/commands/re-export-drift.d.ts +36 -8
- package/dist/src/commands/re-export-drift.js +73 -49
- package/dist/src/commands/re-export-files.js +11 -8
- package/dist/src/commands/re-export-hunks.d.ts +35 -0
- package/dist/src/commands/re-export-hunks.js +220 -0
- package/dist/src/commands/re-export-lint.d.ts +2 -1
- package/dist/src/commands/re-export-lint.js +23 -10
- package/dist/src/commands/re-export-options.js +74 -6
- package/dist/src/commands/re-export-preflight.d.ts +23 -0
- package/dist/src/commands/re-export-preflight.js +160 -0
- package/dist/src/commands/re-export-purity-scope.d.ts +18 -0
- package/dist/src/commands/re-export-purity-scope.js +131 -0
- package/dist/src/commands/re-export-register.js +56 -17
- package/dist/src/commands/re-export-removed.d.ts +13 -2
- package/dist/src/commands/re-export-removed.js +57 -12
- package/dist/src/commands/re-export-scan-owner.d.ts +44 -0
- package/dist/src/commands/re-export-scan-owner.js +116 -0
- package/dist/src/commands/re-export-scan.d.ts +19 -9
- package/dist/src/commands/re-export-scan.js +60 -24
- package/dist/src/commands/re-export-single.js +122 -46
- package/dist/src/commands/re-export-stale-registrations.d.ts +18 -0
- package/dist/src/commands/re-export-stale-registrations.js +62 -0
- package/dist/src/commands/re-export-summary.d.ts +28 -0
- package/dist/src/commands/re-export-summary.js +36 -0
- package/dist/src/commands/re-export.js +71 -57
- package/dist/src/commands/rebase/index.js +17 -17
- package/dist/src/commands/run.js +16 -2
- package/dist/src/commands/status-check.d.ts +55 -16
- package/dist/src/commands/status-check.js +92 -37
- package/dist/src/commands/status-json.d.ts +22 -9
- package/dist/src/commands/status-json.js +47 -32
- package/dist/src/commands/status-output.js +3 -1
- package/dist/src/commands/status-scope.d.ts +37 -0
- package/dist/src/commands/status-scope.js +54 -0
- package/dist/src/commands/status.js +66 -23
- package/dist/src/commands/test-browser-preflight.js +19 -3
- package/dist/src/commands/test-build-furnace.d.ts +22 -0
- package/dist/src/commands/test-build-furnace.js +54 -0
- package/dist/src/commands/test-build-phase.js +64 -41
- package/dist/src/commands/test-checkjs.js +10 -2
- package/dist/src/commands/test-diagnose.js +7 -0
- package/dist/src/commands/test-dispatch.d.ts +39 -0
- package/dist/src/commands/test-dispatch.js +211 -0
- package/dist/src/commands/test-furnace-reach.d.ts +37 -0
- package/dist/src/commands/test-furnace-reach.js +132 -0
- package/dist/src/commands/test-modes.d.ts +16 -1
- package/dist/src/commands/test-modes.js +24 -1
- package/dist/src/commands/test-multi-verdict.d.ts +61 -0
- package/dist/src/commands/test-multi-verdict.js +111 -0
- package/dist/src/commands/test-orchestrate.d.ts +52 -0
- package/dist/src/commands/test-orchestrate.js +240 -0
- package/dist/src/commands/test-perf-scope.d.ts +50 -0
- package/dist/src/commands/test-perf-scope.js +138 -0
- package/dist/src/commands/test-prelock.d.ts +51 -0
- package/dist/src/commands/test-prelock.js +273 -0
- package/dist/src/commands/test-register.js +69 -10
- package/dist/src/commands/test-results.d.ts +62 -0
- package/dist/src/commands/test-results.js +62 -0
- package/dist/src/commands/test-run.d.ts +13 -55
- package/dist/src/commands/test-run.js +74 -99
- package/dist/src/commands/test-shards.d.ts +110 -0
- package/dist/src/commands/test-shards.js +255 -0
- package/dist/src/commands/test-stale-gate.d.ts +5 -1
- package/dist/src/commands/test-stale-gate.js +60 -28
- package/dist/src/commands/test-verdict.d.ts +11 -1
- package/dist/src/commands/test-verdict.js +28 -1
- package/dist/src/commands/test.d.ts +6 -1
- package/dist/src/commands/test.js +120 -124
- package/dist/src/commands/token-lint.d.ts +14 -0
- package/dist/src/commands/token-lint.js +151 -0
- package/dist/src/commands/token.js +10 -0
- package/dist/src/commands/verify-scope.d.ts +28 -0
- package/dist/src/commands/verify-scope.js +67 -0
- package/dist/src/commands/verify.d.ts +10 -2
- package/dist/src/commands/verify.js +67 -36
- package/dist/src/core/build-baseline-types.d.ts +46 -0
- package/dist/src/core/build-baseline-validate.js +19 -0
- package/dist/src/core/build-baseline.d.ts +5 -1
- package/dist/src/core/build-baseline.js +3 -1
- package/dist/src/core/build-overwrite-guard.d.ts +50 -0
- package/dist/src/core/build-overwrite-guard.js +84 -4
- package/dist/src/core/build-prepare.d.ts +13 -0
- package/dist/src/core/build-prepare.js +42 -10
- package/dist/src/core/build-run-record.d.ts +74 -0
- package/dist/src/core/build-run-record.js +136 -0
- package/dist/src/core/checkjs-support-heads.d.ts +41 -0
- package/dist/src/core/checkjs-support-heads.js +104 -0
- package/dist/src/core/config-paths.d.ts +2 -2
- package/dist/src/core/config-paths.js +10 -0
- package/dist/src/core/config-validate-check.d.ts +8 -0
- package/dist/src/core/config-validate-check.js +219 -0
- package/dist/src/core/config-validate-file-size.d.ts +9 -6
- package/dist/src/core/config-validate-file-size.js +91 -2
- package/dist/src/core/config-validate-history.d.ts +11 -0
- package/dist/src/core/config-validate-history.js +38 -0
- package/dist/src/core/config-validate-patch-policy.js +100 -0
- package/dist/src/core/config-validate-test-toolchains.js +21 -0
- package/dist/src/core/config-validate-token-scales.d.ts +9 -0
- package/dist/src/core/config-validate-token-scales.js +92 -0
- package/dist/src/core/config-validate.js +20 -5
- package/dist/src/core/config.d.ts +5 -0
- package/dist/src/core/config.js +16 -0
- package/dist/src/core/coverage-dispatch.d.ts +24 -0
- package/dist/src/core/coverage-dispatch.js +44 -0
- package/dist/src/core/coverage-extend.d.ts +70 -45
- package/dist/src/core/coverage-extend.js +199 -144
- package/dist/src/core/coverage-records.d.ts +108 -0
- package/dist/src/core/coverage-records.js +384 -0
- package/dist/src/core/destructive.d.ts +7 -4
- package/dist/src/core/destructive.js +10 -10
- package/dist/src/core/engine-session-lock.d.ts +16 -1
- package/dist/src/core/engine-session-lock.js +38 -10
- package/dist/src/core/export-moved-code-shape.d.ts +49 -11
- package/dist/src/core/export-moved-code-shape.js +135 -44
- package/dist/src/core/file-lock-queue.d.ts +67 -0
- package/dist/src/core/file-lock-queue.js +221 -0
- package/dist/src/core/file-lock-shared.d.ts +57 -0
- package/dist/src/core/file-lock-shared.js +117 -0
- package/dist/src/core/file-lock.d.ts +13 -25
- package/dist/src/core/file-lock.js +163 -140
- package/dist/src/core/furnace-apply-output.d.ts +10 -0
- package/dist/src/core/furnace-apply-output.js +31 -1
- package/dist/src/core/furnace-apply.js +22 -12
- package/dist/src/core/furnace-composed-source.d.ts +76 -0
- package/dist/src/core/furnace-composed-source.js +167 -0
- package/dist/src/core/furnace-config-validate-exceptions.d.ts +16 -0
- package/dist/src/core/furnace-config-validate-exceptions.js +102 -0
- package/dist/src/core/furnace-config-validate.js +14 -0
- package/dist/src/core/furnace-css-fragments.d.ts +10 -0
- package/dist/src/core/furnace-css-fragments.js +26 -0
- package/dist/src/core/furnace-operation.d.ts +3 -3
- package/dist/src/core/furnace-registration-jar-inplace.d.ts +12 -0
- package/dist/src/core/furnace-registration-jar-inplace.js +80 -0
- package/dist/src/core/furnace-registration-remove.d.ts +22 -1
- package/dist/src/core/furnace-registration-remove.js +53 -17
- package/dist/src/core/furnace-registration-rename.d.ts +26 -0
- package/dist/src/core/furnace-registration-rename.js +77 -0
- package/dist/src/core/furnace-registration.d.ts +14 -4
- package/dist/src/core/furnace-registration.js +44 -10
- package/dist/src/core/furnace-staleness.d.ts +7 -0
- package/dist/src/core/furnace-staleness.js +34 -24
- package/dist/src/core/furnace-validate-accessibility.d.ts +8 -4
- package/dist/src/core/furnace-validate-accessibility.js +71 -28
- package/dist/src/core/furnace-validate-exceptions.d.ts +48 -0
- package/dist/src/core/furnace-validate-exceptions.js +80 -0
- package/dist/src/core/furnace-validate-icon-button.d.ts +7 -0
- package/dist/src/core/furnace-validate-icon-button.js +78 -0
- package/dist/src/core/furnace-validate.js +1 -1
- package/dist/src/core/harness-port-fallback.d.ts +60 -0
- package/dist/src/core/harness-port-fallback.js +96 -0
- package/dist/src/core/history-log-file.d.ts +61 -0
- package/dist/src/core/history-log-file.js +164 -0
- package/dist/src/core/history-log.d.ts +2 -1
- package/dist/src/core/history-log.js +2 -1
- package/dist/src/core/json-preserving-edit.d.ts +22 -0
- package/dist/src/core/json-preserving-edit.js +199 -0
- package/dist/src/core/line-prefixer.d.ts +18 -0
- package/dist/src/core/line-prefixer.js +34 -0
- package/dist/src/core/mach.d.ts +7 -0
- package/dist/src/core/mach.js +32 -10
- package/dist/src/core/module-resolution-preflight.d.ts +19 -3
- package/dist/src/core/module-resolution-preflight.js +24 -6
- package/dist/src/core/negative-control-compiled.d.ts +27 -0
- package/dist/src/core/negative-control-compiled.js +73 -0
- package/dist/src/core/negative-control-diff.d.ts +51 -0
- package/dist/src/core/negative-control-diff.js +179 -0
- package/dist/src/core/negative-control.d.ts +150 -0
- package/dist/src/core/negative-control.js +399 -0
- package/dist/src/core/objdir-install-manifests.d.ts +73 -0
- package/dist/src/core/objdir-install-manifests.js +226 -0
- package/dist/src/core/park-store.d.ts +63 -0
- package/dist/src/core/park-store.js +216 -0
- package/dist/src/core/patch-export-update.d.ts +6 -0
- package/dist/src/core/patch-export-update.js +13 -3
- package/dist/src/core/patch-export.d.ts +3 -2
- package/dist/src/core/patch-export.js +22 -16
- package/dist/src/core/patch-files.js +26 -8
- package/dist/src/core/patch-lint-checkjs-any-import.d.ts +39 -0
- package/dist/src/core/patch-lint-checkjs-any-import.js +63 -0
- package/dist/src/core/patch-lint-checkjs-diagnostics.d.ts +17 -0
- package/dist/src/core/patch-lint-checkjs-diagnostics.js +32 -0
- package/dist/src/core/patch-lint-checkjs.d.ts +10 -1
- package/dist/src/core/patch-lint-checkjs.js +20 -13
- package/dist/src/core/patch-lint-code-lines.d.ts +59 -0
- package/dist/src/core/patch-lint-code-lines.js +105 -0
- package/dist/src/core/patch-lint-cross.d.ts +3 -1
- package/dist/src/core/patch-lint-cross.js +17 -4
- package/dist/src/core/patch-lint-css.d.ts +8 -2
- package/dist/src/core/patch-lint-css.js +24 -14
- package/dist/src/core/patch-lint-file-size.d.ts +12 -5
- package/dist/src/core/patch-lint-file-size.js +22 -11
- package/dist/src/core/patch-lint-forward-registration-extended.d.ts +23 -0
- package/dist/src/core/patch-lint-forward-registration-extended.js +36 -11
- package/dist/src/core/patch-lint-forward-registration.js +10 -0
- package/dist/src/core/patch-lint-ignore.d.ts +196 -0
- package/dist/src/core/patch-lint-ignore.js +429 -0
- package/dist/src/core/patch-lint-ownership.d.ts +10 -0
- package/dist/src/core/patch-lint-ownership.js +26 -0
- package/dist/src/core/patch-lint-size-thresholds.d.ts +52 -0
- package/dist/src/core/patch-lint-size-thresholds.js +110 -0
- package/dist/src/core/patch-lint-size.d.ts +117 -0
- package/dist/src/core/patch-lint-size.js +331 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +18 -1
- package/dist/src/core/patch-lint-staged-registration.js +20 -0
- package/dist/src/core/patch-lint-token-scale.d.ts +57 -0
- package/dist/src/core/patch-lint-token-scale.js +286 -0
- package/dist/src/core/patch-lint.d.ts +11 -83
- package/dist/src/core/patch-lint.js +66 -288
- package/dist/src/core/patch-lock.js +7 -6
- package/dist/src/core/patch-manifest-consistency.js +7 -6
- package/dist/src/core/patch-manifest-io.d.ts +6 -3
- package/dist/src/core/patch-manifest-io.js +27 -9
- package/dist/src/core/patch-manifest-key-order.d.ts +24 -0
- package/dist/src/core/patch-manifest-key-order.js +61 -0
- package/dist/src/core/patch-manifest-stage.d.ts +46 -0
- package/dist/src/core/patch-manifest-stage.js +96 -0
- package/dist/src/core/patch-manifest-validate.js +61 -3
- package/dist/src/core/patch-order-legal.d.ts +26 -0
- package/dist/src/core/patch-order-legal.js +88 -0
- package/dist/src/core/patch-policy-content.d.ts +40 -0
- package/dist/src/core/patch-policy-content.js +216 -0
- package/dist/src/core/patch-policy.d.ts +22 -5
- package/dist/src/core/patch-policy.js +26 -12
- package/dist/src/core/patch-retired.d.ts +57 -0
- package/dist/src/core/patch-retired.js +92 -0
- package/dist/src/core/patch-subset.d.ts +16 -0
- package/dist/src/core/patch-subset.js +66 -0
- package/dist/src/core/preflight-wait.d.ts +20 -0
- package/dist/src/core/preflight-wait.js +38 -0
- package/dist/src/core/rebase-from-version.d.ts +46 -0
- package/dist/src/core/rebase-from-version.js +71 -0
- package/dist/src/core/run-log.d.ts +26 -0
- package/dist/src/core/run-log.js +106 -4
- package/dist/src/core/run-profile.d.ts +7 -0
- package/dist/src/core/run-profile.js +7 -1
- package/dist/src/core/smoke-patterns.d.ts +5 -0
- package/dist/src/core/smoke-patterns.js +13 -0
- package/dist/src/core/test-harness-crash.d.ts +19 -1
- package/dist/src/core/test-harness-crash.js +8 -9
- package/dist/src/core/test-harness-signature.d.ts +33 -0
- package/dist/src/core/test-harness-signature.js +23 -1
- package/dist/src/core/test-raw-log.d.ts +66 -0
- package/dist/src/core/test-raw-log.js +122 -0
- package/dist/src/core/test-run-completeness.d.ts +90 -0
- package/dist/src/core/test-run-completeness.js +184 -0
- package/dist/src/core/test-stale-check.d.ts +27 -1
- package/dist/src/core/test-stale-check.js +39 -49
- package/dist/src/core/test-stale-exempt.d.ts +40 -0
- package/dist/src/core/test-stale-exempt.js +70 -0
- package/dist/src/core/test-xpcshell-retry.d.ts +2 -0
- package/dist/src/core/test-xpcshell-retry.js +2 -1
- package/dist/src/core/token-lint.d.ts +53 -0
- package/dist/src/core/token-lint.js +131 -0
- package/dist/src/core/token-sibling-sheets.d.ts +46 -0
- package/dist/src/core/token-sibling-sheets.js +119 -0
- package/dist/src/core/tree-guard.js +5 -0
- package/dist/src/core/typecheck-shim.d.ts +6 -2
- package/dist/src/core/typecheck-shim.js +205 -4
- package/dist/src/core/typecheck.js +3 -1
- package/dist/src/index.d.ts +14 -3
- package/dist/src/index.js +6 -1
- package/dist/src/types/commands/index.d.ts +2 -2
- package/dist/src/types/commands/options.d.ts +212 -24
- package/dist/src/types/commands/patches.d.ts +118 -1
- package/dist/src/types/config.d.ts +264 -0
- package/dist/src/types/config.js +9 -0
- package/dist/src/types/furnace.d.ts +63 -1
- package/dist/src/types/furnace.js +7 -0
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/utils/options.d.ts +36 -7
- package/dist/src/utils/options.js +94 -8
- package/dist/src/utils/path-glob.d.ts +15 -0
- package/dist/src/utils/path-glob.js +47 -0
- package/dist/src/utils/regex.d.ts +15 -3
- package/dist/src/utils/regex.js +37 -16
- package/docs/configuration.md +369 -11
- package/docs/exit-codes.md +18 -1
- package/docs/furnace.md +139 -3
- package/docs/lifecycle-invariants.md +65 -30
- package/docs/machine-output.md +120 -12
- package/docs/patch-workflow.md +458 -22
- package/docs/run-logs.md +20 -1
- package/docs/testing.md +346 -21
- package/package.json +3 -3
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `fireforge token lint`: structural checks over the design-token system.
|
|
3
|
+
*
|
|
4
|
+
* - `token-lockstep`: a themed override block (the dark `@media` mirror, a
|
|
5
|
+
* `:root[variant]` block) declares only tokens the base `:root` declares.
|
|
6
|
+
* An override with no base is a token that exists only in one theme, so
|
|
7
|
+
* every other theme resolves it to nothing.
|
|
8
|
+
* - `token-undeclared`: a `var(--<prefix>…)` reference in the tokens CSS or
|
|
9
|
+
* in a CSS file the patch queue touches names a token no block of the
|
|
10
|
+
* tokens CSS declares. Same-file declarations, declarations of a sheet
|
|
11
|
+
* that loads beside it (see `token-sibling-sheets.ts`), `furnace.json`
|
|
12
|
+
* `tokenAllowlist` and `runtimeVariables` are exempt, matching the
|
|
13
|
+
* `token-prefix-violation` rule's notion of a runtime channel. A
|
|
14
|
+
* reference with a fallback (`var(--x, 0)`) is optional by construction
|
|
15
|
+
* (a host hook, a channel set from JS) and is not reported.
|
|
16
|
+
*
|
|
17
|
+
* Built on `token-category.ts`'s base-block and comment-mask primitives, so
|
|
18
|
+
* this report and `token add` agree on which block is the base.
|
|
19
|
+
*/
|
|
20
|
+
/** One `token lint` finding. */
|
|
21
|
+
export interface TokenLintFinding {
|
|
22
|
+
check: 'token-lockstep' | 'token-undeclared';
|
|
23
|
+
/** Engine-relative file. */
|
|
24
|
+
file: string;
|
|
25
|
+
/** 1-based line. */
|
|
26
|
+
line: number;
|
|
27
|
+
/** The custom property at fault. */
|
|
28
|
+
token: string;
|
|
29
|
+
message: string;
|
|
30
|
+
}
|
|
31
|
+
/** Every custom property the tokens CSS declares, in any block. */
|
|
32
|
+
export declare function collectDeclaredTokenNames(lines: string[]): Set<string>;
|
|
33
|
+
/**
|
|
34
|
+
* Themed override declarations of `tokenPrefix` tokens that the base
|
|
35
|
+
* `:root` block does not declare.
|
|
36
|
+
*
|
|
37
|
+
* @param lines - Tokens CSS split into lines
|
|
38
|
+
* @param tokensCssPath - Engine-relative path, for the findings
|
|
39
|
+
* @param tokenPrefix - Only tokens with this prefix are held to lockstep;
|
|
40
|
+
* a themed block may still override platform properties
|
|
41
|
+
*/
|
|
42
|
+
export declare function lintTokenLockstep(lines: string[], tokensCssPath: string, tokenPrefix: string): TokenLintFinding[];
|
|
43
|
+
/**
|
|
44
|
+
* `var(--<prefix>…)` references naming a token the tokens CSS never
|
|
45
|
+
* declares.
|
|
46
|
+
*
|
|
47
|
+
* @param file - Engine-relative path, for the findings
|
|
48
|
+
* @param css - The file's content
|
|
49
|
+
* @param tokenPrefix - Only references with this prefix are checked
|
|
50
|
+
* @param declared - {@link collectDeclaredTokenNames} of the tokens CSS
|
|
51
|
+
* @param exempt - `tokenAllowlist` and `runtimeVariables` names
|
|
52
|
+
*/
|
|
53
|
+
export declare function lintUndeclaredTokenReferences(file: string, css: string, tokenPrefix: string, declared: ReadonlySet<string>, exempt: ReadonlySet<string>): TokenLintFinding[];
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* `fireforge token lint`: structural checks over the design-token system.
|
|
4
|
+
*
|
|
5
|
+
* - `token-lockstep`: a themed override block (the dark `@media` mirror, a
|
|
6
|
+
* `:root[variant]` block) declares only tokens the base `:root` declares.
|
|
7
|
+
* An override with no base is a token that exists only in one theme, so
|
|
8
|
+
* every other theme resolves it to nothing.
|
|
9
|
+
* - `token-undeclared`: a `var(--<prefix>…)` reference in the tokens CSS or
|
|
10
|
+
* in a CSS file the patch queue touches names a token no block of the
|
|
11
|
+
* tokens CSS declares. Same-file declarations, declarations of a sheet
|
|
12
|
+
* that loads beside it (see `token-sibling-sheets.ts`), `furnace.json`
|
|
13
|
+
* `tokenAllowlist` and `runtimeVariables` are exempt, matching the
|
|
14
|
+
* `token-prefix-violation` rule's notion of a runtime channel. A
|
|
15
|
+
* reference with a fallback (`var(--x, 0)`) is optional by construction
|
|
16
|
+
* (a host hook, a channel set from JS) and is not reported.
|
|
17
|
+
*
|
|
18
|
+
* Built on `token-category.ts`'s base-block and comment-mask primitives, so
|
|
19
|
+
* this report and `token add` agree on which block is the base.
|
|
20
|
+
*/
|
|
21
|
+
import { findBaseRootBounds, maskCommentLines } from './token-category.js';
|
|
22
|
+
const DECLARATION = /(?:^|[{;\s])(--[A-Za-z0-9_-]+)\s*:/g;
|
|
23
|
+
function selectorBefore(text) {
|
|
24
|
+
const selector = text.slice(Math.max(text.lastIndexOf('}'), text.lastIndexOf(';')) + 1).trim();
|
|
25
|
+
return selector.length > 0 ? selector.replace(/\s+/g, ' ') : '(block)';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Every custom-property declaration in a CSS file with the selector trail
|
|
29
|
+
* of the block holding it, outermost first, joined with ` > `.
|
|
30
|
+
*/
|
|
31
|
+
function collectDeclarations(lines) {
|
|
32
|
+
const masked = maskCommentLines(lines);
|
|
33
|
+
const trail = [];
|
|
34
|
+
const found = [];
|
|
35
|
+
let pending = '';
|
|
36
|
+
for (const [index, line] of masked.entries()) {
|
|
37
|
+
for (const match of line.matchAll(DECLARATION)) {
|
|
38
|
+
found.push({
|
|
39
|
+
name: match[1] ?? '',
|
|
40
|
+
line: index + 1,
|
|
41
|
+
block: trail.length > 0 ? trail.join(' > ') : '(file scope)',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
for (const char of line) {
|
|
45
|
+
if (char === '{') {
|
|
46
|
+
trail.push(selectorBefore(pending));
|
|
47
|
+
pending = '';
|
|
48
|
+
}
|
|
49
|
+
else if (char === '}') {
|
|
50
|
+
trail.pop();
|
|
51
|
+
pending = '';
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
pending += char;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
pending += '\n';
|
|
58
|
+
}
|
|
59
|
+
return found;
|
|
60
|
+
}
|
|
61
|
+
/** Every custom property the tokens CSS declares, in any block. */
|
|
62
|
+
export function collectDeclaredTokenNames(lines) {
|
|
63
|
+
return new Set(collectDeclarations(lines).map((declaration) => declaration.name));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Themed override declarations of `tokenPrefix` tokens that the base
|
|
67
|
+
* `:root` block does not declare.
|
|
68
|
+
*
|
|
69
|
+
* @param lines - Tokens CSS split into lines
|
|
70
|
+
* @param tokensCssPath - Engine-relative path, for the findings
|
|
71
|
+
* @param tokenPrefix - Only tokens with this prefix are held to lockstep;
|
|
72
|
+
* a themed block may still override platform properties
|
|
73
|
+
*/
|
|
74
|
+
export function lintTokenLockstep(lines, tokensCssPath, tokenPrefix) {
|
|
75
|
+
const bounds = findBaseRootBounds(lines);
|
|
76
|
+
if (bounds === undefined)
|
|
77
|
+
return [];
|
|
78
|
+
const close = bounds.close === -1 ? lines.length : bounds.close;
|
|
79
|
+
const declarations = collectDeclarations(lines);
|
|
80
|
+
const inBase = (line) => line - 1 >= bounds.open && line - 1 <= close;
|
|
81
|
+
const base = new Set(declarations.filter((d) => inBase(d.line)).map((d) => d.name));
|
|
82
|
+
return declarations
|
|
83
|
+
.filter((d) => !inBase(d.line) && d.name.startsWith(tokenPrefix) && !base.has(d.name))
|
|
84
|
+
.map((d) => ({
|
|
85
|
+
check: 'token-lockstep',
|
|
86
|
+
file: tokensCssPath,
|
|
87
|
+
line: d.line,
|
|
88
|
+
token: d.name,
|
|
89
|
+
message: `${d.name} is declared in ${d.block} but not in the base :root block, so every other ` +
|
|
90
|
+
'theme resolves it to nothing. Declare the base value first (fireforge token add), ' +
|
|
91
|
+
'or drop the override.',
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* `var(--<prefix>…)` references naming a token the tokens CSS never
|
|
96
|
+
* declares.
|
|
97
|
+
*
|
|
98
|
+
* @param file - Engine-relative path, for the findings
|
|
99
|
+
* @param css - The file's content
|
|
100
|
+
* @param tokenPrefix - Only references with this prefix are checked
|
|
101
|
+
* @param declared - {@link collectDeclaredTokenNames} of the tokens CSS
|
|
102
|
+
* @param exempt - `tokenAllowlist` and `runtimeVariables` names
|
|
103
|
+
*/
|
|
104
|
+
export function lintUndeclaredTokenReferences(file, css, tokenPrefix, declared, exempt) {
|
|
105
|
+
const lines = css.split('\n');
|
|
106
|
+
const local = collectDeclaredTokenNames(lines);
|
|
107
|
+
const findings = [];
|
|
108
|
+
const seen = new Set();
|
|
109
|
+
for (const [index, line] of maskCommentLines(lines).entries()) {
|
|
110
|
+
for (const match of line.matchAll(/var\(\s*(--[A-Za-z0-9_-]+)\s*(,)?/g)) {
|
|
111
|
+
const name = match[1] ?? '';
|
|
112
|
+
if (match[2] !== undefined)
|
|
113
|
+
continue;
|
|
114
|
+
if (!name.startsWith(tokenPrefix) || declared.has(name) || local.has(name))
|
|
115
|
+
continue;
|
|
116
|
+
if (exempt.has(name) || seen.has(name))
|
|
117
|
+
continue;
|
|
118
|
+
seen.add(name);
|
|
119
|
+
findings.push({
|
|
120
|
+
check: 'token-undeclared',
|
|
121
|
+
file,
|
|
122
|
+
line: index + 1,
|
|
123
|
+
token: name,
|
|
124
|
+
message: `var(${name}) names a token the tokens CSS does not declare, so it resolves to ` +
|
|
125
|
+
'nothing. Add the token, fix the name, or list a runtime channel in furnace.json ' +
|
|
126
|
+
'runtimeVariables.',
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return findings;
|
|
131
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which stylesheets load together, so `token lint` can resolve a token one
|
|
3
|
+
* sheet references against the declarations of the sheets beside it.
|
|
4
|
+
*
|
|
5
|
+
* A widget sheet may read a token its host document's other sheet
|
|
6
|
+
* declares; judged alone it looks undeclared. Two sources say which sheets
|
|
7
|
+
* share a document:
|
|
8
|
+
*
|
|
9
|
+
* - links the queue's documents make: `<link rel="stylesheet">` (and
|
|
10
|
+
* `<html:link>`) and `<?xml-stylesheet?>` in markup and Lit templates,
|
|
11
|
+
* and CSS `@import`. A `chrome://` URL resolves through the jar.mn lines
|
|
12
|
+
* the queue adds; a relative URL resolves beside the document, and only
|
|
13
|
+
* to a sheet the queue touches.
|
|
14
|
+
* - `furnace.json#tokenSiblingSheets`: `{ "<glob>": ["<path or glob>"] }`,
|
|
15
|
+
* for pairings no link in the queue shows (an upstream host document).
|
|
16
|
+
*
|
|
17
|
+
* Sheets linked from one document are siblings of each other; an
|
|
18
|
+
* `@import` makes the importing and the imported sheet siblings.
|
|
19
|
+
*/
|
|
20
|
+
/** The stylesheet URLs one document or sheet loads, in order. */
|
|
21
|
+
export declare function collectStylesheetUrls(file: string, content: string): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Resolves a stylesheet URL to an engine-relative path, or undefined.
|
|
24
|
+
*
|
|
25
|
+
* @param url - The URL as written
|
|
26
|
+
* @param from - Engine-relative path of the document or sheet holding it
|
|
27
|
+
* @param jarTargets - jar target (`content/<pkg>/<path>`) → packaged source
|
|
28
|
+
* @param knownSheets - Sheets a relative URL may resolve to
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveStylesheetUrl(url: string, from: string, jarTargets: ReadonlyMap<string, string>, knownSheets: ReadonlySet<string>): string | undefined;
|
|
31
|
+
/** Inputs of {@link buildSiblingSheetMap}. */
|
|
32
|
+
export interface SiblingSheetInputs {
|
|
33
|
+
/** Documents and sheets to read links from: engine-relative path and content. */
|
|
34
|
+
documents: Iterable<readonly [string, string]>;
|
|
35
|
+
/** jar target → packaged source, from the queue's jar.mn lines. */
|
|
36
|
+
jarTargets: ReadonlyMap<string, string>;
|
|
37
|
+
/** The sheets `token lint` judges. */
|
|
38
|
+
sheets: readonly string[];
|
|
39
|
+
/** `furnace.json#tokenSiblingSheets`. */
|
|
40
|
+
explicit?: Readonly<Record<string, readonly string[]>> | undefined;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Maps each sheet to the other sheets that load beside it. A sheet with no
|
|
44
|
+
* siblings is absent.
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildSiblingSheetMap(inputs: SiblingSheetInputs): Map<string, Set<string>>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* Which stylesheets load together, so `token lint` can resolve a token one
|
|
4
|
+
* sheet references against the declarations of the sheets beside it.
|
|
5
|
+
*
|
|
6
|
+
* A widget sheet may read a token its host document's other sheet
|
|
7
|
+
* declares; judged alone it looks undeclared. Two sources say which sheets
|
|
8
|
+
* share a document:
|
|
9
|
+
*
|
|
10
|
+
* - links the queue's documents make: `<link rel="stylesheet">` (and
|
|
11
|
+
* `<html:link>`) and `<?xml-stylesheet?>` in markup and Lit templates,
|
|
12
|
+
* and CSS `@import`. A `chrome://` URL resolves through the jar.mn lines
|
|
13
|
+
* the queue adds; a relative URL resolves beside the document, and only
|
|
14
|
+
* to a sheet the queue touches.
|
|
15
|
+
* - `furnace.json#tokenSiblingSheets`: `{ "<glob>": ["<path or glob>"] }`,
|
|
16
|
+
* for pairings no link in the queue shows (an upstream host document).
|
|
17
|
+
*
|
|
18
|
+
* Sheets linked from one document are siblings of each other; an
|
|
19
|
+
* `@import` makes the importing and the imported sheet siblings.
|
|
20
|
+
*/
|
|
21
|
+
import { dirname, posix } from 'node:path';
|
|
22
|
+
import { matchesAnyGlob } from '../utils/path-glob.js';
|
|
23
|
+
import { normalizePathSlashes } from '../utils/paths.js';
|
|
24
|
+
const LINK_TAG = /<(?:html:)?link\b[^>]*>/gi;
|
|
25
|
+
const STYLESHEET_PI = /<\?xml-stylesheet\b[^?]*?href\s*=\s*["']([^"']+)["']/gi;
|
|
26
|
+
const CSS_IMPORT = /@import\s+(?:url\(\s*)?["']([^"']+)["']/gi;
|
|
27
|
+
/** The stylesheet URLs one document or sheet loads, in order. */
|
|
28
|
+
export function collectStylesheetUrls(file, content) {
|
|
29
|
+
const urls = [];
|
|
30
|
+
if (file.endsWith('.css')) {
|
|
31
|
+
for (const match of content.matchAll(CSS_IMPORT))
|
|
32
|
+
urls.push(match[1] ?? '');
|
|
33
|
+
return urls.filter((url) => url !== '');
|
|
34
|
+
}
|
|
35
|
+
for (const match of content.matchAll(LINK_TAG)) {
|
|
36
|
+
const tag = match[0];
|
|
37
|
+
if (!/\brel\s*=\s*["']stylesheet["']/i.test(tag))
|
|
38
|
+
continue;
|
|
39
|
+
const href = /\bhref\s*=\s*["']([^"'$]+)["']/i.exec(tag)?.[1];
|
|
40
|
+
if (href !== undefined)
|
|
41
|
+
urls.push(href);
|
|
42
|
+
}
|
|
43
|
+
for (const match of content.matchAll(STYLESHEET_PI))
|
|
44
|
+
urls.push(match[1] ?? '');
|
|
45
|
+
return urls.filter((url) => url.endsWith('.css'));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolves a stylesheet URL to an engine-relative path, or undefined.
|
|
49
|
+
*
|
|
50
|
+
* @param url - The URL as written
|
|
51
|
+
* @param from - Engine-relative path of the document or sheet holding it
|
|
52
|
+
* @param jarTargets - jar target (`content/<pkg>/<path>`) → packaged source
|
|
53
|
+
* @param knownSheets - Sheets a relative URL may resolve to
|
|
54
|
+
*/
|
|
55
|
+
export function resolveStylesheetUrl(url, from, jarTargets, knownSheets) {
|
|
56
|
+
const chrome = /^chrome:\/\/([\w.-]+)\/(content|skin|locale)\/(.+)$/.exec(url);
|
|
57
|
+
if (chrome !== null) {
|
|
58
|
+
const [, pkg = '', kind = '', path = ''] = chrome;
|
|
59
|
+
const candidates = kind === 'skin'
|
|
60
|
+
? [`skin/classic/${pkg}/${path}`, `skin/${pkg}/${path}`]
|
|
61
|
+
: [`${kind}/${pkg}/${path}`];
|
|
62
|
+
for (const target of candidates) {
|
|
63
|
+
const source = jarTargets.get(target);
|
|
64
|
+
if (source !== undefined)
|
|
65
|
+
return source;
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
if (/^[a-z][\w+.-]*:/i.test(url))
|
|
70
|
+
return undefined;
|
|
71
|
+
const base = normalizePathSlashes(dirname(from));
|
|
72
|
+
const resolved = posix.normalize(posix.join(base === '.' ? '' : base, url));
|
|
73
|
+
return knownSheets.has(resolved) ? resolved : undefined;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Maps each sheet to the other sheets that load beside it. A sheet with no
|
|
77
|
+
* siblings is absent.
|
|
78
|
+
*/
|
|
79
|
+
export function buildSiblingSheetMap(inputs) {
|
|
80
|
+
const known = new Set(inputs.sheets);
|
|
81
|
+
const siblings = new Map();
|
|
82
|
+
const link = (group) => {
|
|
83
|
+
for (const sheet of group) {
|
|
84
|
+
const set = siblings.get(sheet) ?? new Set();
|
|
85
|
+
for (const other of group)
|
|
86
|
+
if (other !== sheet)
|
|
87
|
+
set.add(other);
|
|
88
|
+
if (set.size > 0)
|
|
89
|
+
siblings.set(sheet, set);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
for (const [file, content] of inputs.documents) {
|
|
93
|
+
const linked = collectStylesheetUrls(file, content)
|
|
94
|
+
.map((url) => resolveStylesheetUrl(url, file, inputs.jarTargets, known))
|
|
95
|
+
.filter((sheet) => sheet !== undefined);
|
|
96
|
+
// An @import pairs the importing sheet with what it imports.
|
|
97
|
+
link(file.endsWith('.css') ? [file, ...linked] : linked);
|
|
98
|
+
}
|
|
99
|
+
for (const [pattern, partners] of Object.entries(inputs.explicit ?? {})) {
|
|
100
|
+
const owners = inputs.sheets.filter((sheet) => matchesAnyGlob(sheet, [pattern]));
|
|
101
|
+
for (const owner of owners) {
|
|
102
|
+
const set = siblings.get(owner) ?? new Set();
|
|
103
|
+
for (const partner of partners) {
|
|
104
|
+
if (/[*?]/.test(partner)) {
|
|
105
|
+
for (const sheet of inputs.sheets) {
|
|
106
|
+
if (sheet !== owner && matchesAnyGlob(sheet, [partner]))
|
|
107
|
+
set.add(sheet);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else if (partner !== owner) {
|
|
111
|
+
set.add(partner);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (set.size > 0)
|
|
115
|
+
siblings.set(owner, set);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return siblings;
|
|
119
|
+
}
|
|
@@ -36,6 +36,8 @@ export const TREE_COMMAND_VERDICTS = {
|
|
|
36
36
|
export: 'conditional',
|
|
37
37
|
'export-all': 'conditional',
|
|
38
38
|
're-export': 'conditional',
|
|
39
|
+
// Parks live in the primary tree's .fireforge/ and rewrite engine files.
|
|
40
|
+
park: 'refused',
|
|
39
41
|
patch: 'refused',
|
|
40
42
|
rebase: 'refused',
|
|
41
43
|
package: 'refused',
|
|
@@ -51,6 +53,9 @@ export const TREE_COMMAND_VERDICTS = {
|
|
|
51
53
|
lint: 'allowed',
|
|
52
54
|
typecheck: 'allowed',
|
|
53
55
|
verify: 'allowed',
|
|
56
|
+
// Its furnace-validate and token-coverage steps are commands a tree
|
|
57
|
+
// refuses. Run the allowed gates one by one in a tree.
|
|
58
|
+
check: 'refused',
|
|
54
59
|
furnace: 'refused',
|
|
55
60
|
// No nesting. `tree list` inside a tree is pointless but harmless, and
|
|
56
61
|
// the subcommand check below allows only `list`.
|
|
@@ -24,7 +24,7 @@ export declare const SHIM_FILENAME = "__fireforge_firefox_globals.d.ts";
|
|
|
24
24
|
* `declare var` redeclarations to the first declaration, the typed
|
|
25
25
|
* consumer declaration wins over the loose fallback here.
|
|
26
26
|
*/
|
|
27
|
-
export declare const TEST_HARNESS_SHIM = "\n// \u2500\u2500 FireForge test-harness shim (loose baseline) \u2500\u2500\ndeclare var TestUtils: any;\ndeclare var BrowserTestUtils: any;\ndeclare var SpecialPowers: any;\ndeclare var EventUtils: any;\ndeclare var SimpleTest: any;\ndeclare var Assert: any;\ndeclare var gTestPath: string;\ndeclare var content: any;\ndeclare function add_task(task: (...args: any[]) => any): any;\ndeclare function add_setup(task: (...args: any[]) => any): any;\ndeclare function ok(condition: any, message?: string): void;\ndeclare function is(actual: any, expected: any, message?: string): void;\ndeclare function isnot(actual: any, expected: any, message?: string): void;\ndeclare function todo(condition: any, message?: string): void;\ndeclare function todo_is(actual: any, expected: any, message?: string): void;\ndeclare function info(message: string): void;\ndeclare function registerCleanupFunction(callback: (...args: any[]) => any): void;\ndeclare function waitForExplicitFinish(): void;\ndeclare function finish(): void;\ndeclare function do_get_profile(): any;\ndeclare function run_test(): any;\n\n";
|
|
27
|
+
export declare const TEST_HARNESS_SHIM = "\n// \u2500\u2500 FireForge test-harness shim (loose baseline) \u2500\u2500\ndeclare var TestUtils: any;\ndeclare var BrowserTestUtils: any;\ndeclare var SpecialPowers: any;\ndeclare var EventUtils: any;\ndeclare var SimpleTest: any;\ndeclare var Assert: any;\ndeclare var gTestPath: string;\ndeclare var content: any;\ndeclare function add_task(task: (...args: any[]) => any): any;\ndeclare function add_setup(task: (...args: any[]) => any): any;\ndeclare function ok(condition: any, message?: string): void;\ndeclare function is(actual: any, expected: any, message?: string): void;\ndeclare function isnot(actual: any, expected: any, message?: string): void;\ndeclare function todo(condition: any, message?: string): void;\ndeclare function todo_is(actual: any, expected: any, message?: string): void;\ndeclare function todo_isnot(actual: any, expected: any, message?: string): void;\ndeclare function info(message: string): void;\ndeclare function registerCleanupFunction(callback: (...args: any[]) => any): void;\ndeclare function waitForExplicitFinish(): void;\ndeclare function finish(): void;\ndeclare function do_get_profile(): any;\ndeclare function run_test(): any;\n\n";
|
|
28
28
|
/**
|
|
29
29
|
* TS diagnostic codes suppressed by both the patch-lint checkJs pass
|
|
30
30
|
* and the whole-project typecheck command. Each is a known false
|
|
@@ -81,5 +81,9 @@ export interface ComposedShim {
|
|
|
81
81
|
* @param projectRoot - Absolute project root, used to resolve the relative
|
|
82
82
|
* shim path
|
|
83
83
|
* @param extraShimPath - Optional project-relative path to an extra `.d.ts`
|
|
84
|
+
* @param options - `litTypes` appends {@link LIT_TYPES_SHIM} after the
|
|
85
|
+
* built-in shim (before the extra shim, which can still merge into it)
|
|
84
86
|
*/
|
|
85
|
-
export declare function composeShimSource(projectRoot: string, extraShimPath: string | undefined
|
|
87
|
+
export declare function composeShimSource(projectRoot: string, extraShimPath: string | undefined, options?: {
|
|
88
|
+
litTypes?: boolean | undefined;
|
|
89
|
+
}): Promise<ComposedShim>;
|
|
@@ -43,7 +43,9 @@ export const SHIM_FILENAME = '__fireforge_firefox_globals.d.ts';
|
|
|
43
43
|
* - `const lazy = {};` + `ChromeUtils.defineESModuleGetters(lazy, { ... })`
|
|
44
44
|
* populates `lazy` at runtime, so we declare it as `Record<string, any>`.
|
|
45
45
|
* - `Services.obs`, `Services.prefs`, etc. are XPCOM service accessors.
|
|
46
|
-
* - `Ci`, `Cc`, `Cr`, `Cu` are XPCOM component shortcuts.
|
|
46
|
+
* - `Ci`, `Cc`, `Cr`, `Cu` are XPCOM component shortcuts. `Cu` alone is
|
|
47
|
+
* typed (`CuShim`, the members of `nsIXPCComponents_Utils`), so an
|
|
48
|
+
* unknown `Cu.*` member is an error rather than a runtime TypeError.
|
|
47
49
|
* - Browser chrome globals like `gBrowser`, `gURLBar` are common in
|
|
48
50
|
* content scripts wired via `browser.js`.
|
|
49
51
|
* - Dynamic `import("resource:-…")` / `import("chrome:-…")` under patch
|
|
@@ -72,7 +74,92 @@ interface ChromeUtilsShim {
|
|
|
72
74
|
predictRemoteTypeForURI(uri: string | object | null, options?: object): string | null;
|
|
73
75
|
}
|
|
74
76
|
declare var ChromeUtils: ChromeUtilsShim;
|
|
75
|
-
|
|
77
|
+
// Components.utils (js/xpconnect/idl/xpccomponents.idl, nsIXPCComponents_Utils,
|
|
78
|
+
// Firefox 153). Every member is listed with loose (any) jsval parameters and
|
|
79
|
+
// results, so Xray-waived and cloned objects keep their expandos, but the
|
|
80
|
+
// member set is closed: a call to a member Cu does not have (Cu.now() is
|
|
81
|
+
// ChromeUtils.now()) is a typecheck error instead of a runtime TypeError.
|
|
82
|
+
// Extensible via interface merging, same as ChromeUtilsShim.
|
|
83
|
+
interface CuShim {
|
|
84
|
+
QueryInterface(iid: any): any;
|
|
85
|
+
printStderr(message: string): void;
|
|
86
|
+
reportError(error: any, stack?: any): void;
|
|
87
|
+
readonly Sandbox: { new (principal: any, options?: any): any; (principal: any, options?: any): any };
|
|
88
|
+
evalInSandbox(
|
|
89
|
+
source: string,
|
|
90
|
+
sandbox: any,
|
|
91
|
+
version?: any,
|
|
92
|
+
filename?: string,
|
|
93
|
+
lineNo?: number,
|
|
94
|
+
enforceFilenameRestrictions?: boolean
|
|
95
|
+
): any;
|
|
96
|
+
getUAWidgetScope(principal: any): any;
|
|
97
|
+
getSandboxMetadata(sandbox: any): any;
|
|
98
|
+
setSandboxMetadata(sandbox: any, metadata: any): void;
|
|
99
|
+
setSandboxLocaleOverride(sandbox: any, locale: string): void;
|
|
100
|
+
setSandboxTimezoneOverride(sandbox: any, timezone: string): void;
|
|
101
|
+
isESModuleLoaded(resourceURI: string): boolean;
|
|
102
|
+
importGlobalProperties(propertyList: any): void;
|
|
103
|
+
getWeakReference(obj: any): { get(): any };
|
|
104
|
+
forceGC(): void;
|
|
105
|
+
forceCC(listener?: any): void;
|
|
106
|
+
createCCLogger(): any;
|
|
107
|
+
finishCC(): void;
|
|
108
|
+
ccSlice(budget: number): void;
|
|
109
|
+
getMaxCCSliceTimeSinceClear(): number;
|
|
110
|
+
clearMaxCCTime(): void;
|
|
111
|
+
forceShrinkingGC(): void;
|
|
112
|
+
schedulePreciseGC(callback: any): void;
|
|
113
|
+
schedulePreciseShrinkingGC(callback: any): void;
|
|
114
|
+
unlinkGhostWindows(): void;
|
|
115
|
+
intentionallyLeak(): void;
|
|
116
|
+
getJSTestingFunctions(): any;
|
|
117
|
+
getFunctionSourceLocation(func: any): any;
|
|
118
|
+
callFunctionWithAsyncStack(func: any, stack: any, asyncCause: string): any;
|
|
119
|
+
getGlobalForObject(obj: any): any;
|
|
120
|
+
isProxy(obj: any): boolean;
|
|
121
|
+
exportFunction(func: any, scope: any, options?: any): any;
|
|
122
|
+
createObjectIn(scope: any, options?: any): any;
|
|
123
|
+
makeObjectPropsNormal(obj: any): void;
|
|
124
|
+
isDeadWrapper(obj: any): boolean;
|
|
125
|
+
isRemoteProxy(val: any): boolean;
|
|
126
|
+
recomputeWrappers(obj?: any): void;
|
|
127
|
+
setWantXrays(scope: any): void;
|
|
128
|
+
dispatch(runnable: any, scope?: any): void;
|
|
129
|
+
readonly isInAutomation: boolean;
|
|
130
|
+
exitIfInAutomation(): void;
|
|
131
|
+
crashIfNotInAutomation(): void;
|
|
132
|
+
setGCZeal(zeal: number): void;
|
|
133
|
+
nukeSandbox(obj: any): void;
|
|
134
|
+
blockScriptForGlobal(global: any): void;
|
|
135
|
+
unblockScriptForGlobal(global: any): void;
|
|
136
|
+
isOpaqueWrapper(obj: any): boolean;
|
|
137
|
+
isXrayWrapper(obj: any): boolean;
|
|
138
|
+
waiveXrays(val: any): any;
|
|
139
|
+
unwaiveXrays(val: any): any;
|
|
140
|
+
getClassName(obj: any, unwrap: boolean): string;
|
|
141
|
+
getIncumbentGlobal(callback?: any): any;
|
|
142
|
+
getDebugName(obj: any): string;
|
|
143
|
+
getWatchdogTimestamp(category: string): number;
|
|
144
|
+
getJSEngineTelemetryValue(): any;
|
|
145
|
+
cloneInto(value: any, scope: any, options?: any): any;
|
|
146
|
+
getWebIDLCallerPrincipal(): any;
|
|
147
|
+
getObjectPrincipal(obj: any): any;
|
|
148
|
+
getRealmLocation(obj: any): string;
|
|
149
|
+
readUTF8File(file: any): string;
|
|
150
|
+
readUTF8URI(url: any): string;
|
|
151
|
+
createSpellChecker(): any;
|
|
152
|
+
createCommandLine(args: string[], workingDir: any, state: number): any;
|
|
153
|
+
createCommandParams(): any;
|
|
154
|
+
createLoadContext(): any;
|
|
155
|
+
createPrivateLoadContext(): any;
|
|
156
|
+
createPersistentProperties(): any;
|
|
157
|
+
createDocumentEncoder(contentType: string): any;
|
|
158
|
+
createHTMLCopyEncoder(): any;
|
|
159
|
+
readonly loadedESModules: string[];
|
|
160
|
+
getModuleImportStack(location: string): string;
|
|
161
|
+
}
|
|
162
|
+
declare var Cu: CuShim;
|
|
76
163
|
declare var Ci: any;
|
|
77
164
|
declare var Cc: any;
|
|
78
165
|
declare var Cr: any;
|
|
@@ -159,6 +246,7 @@ declare function is(actual: any, expected: any, message?: string): void;
|
|
|
159
246
|
declare function isnot(actual: any, expected: any, message?: string): void;
|
|
160
247
|
declare function todo(condition: any, message?: string): void;
|
|
161
248
|
declare function todo_is(actual: any, expected: any, message?: string): void;
|
|
249
|
+
declare function todo_isnot(actual: any, expected: any, message?: string): void;
|
|
162
250
|
declare function info(message: string): void;
|
|
163
251
|
declare function registerCleanupFunction(callback: (...args: any[]) => any): void;
|
|
164
252
|
declare function waitForExplicitFinish(): void;
|
|
@@ -201,6 +289,117 @@ export const UNDEFINED_IDENTIFIER_CODES = new Set([
|
|
|
201
289
|
2304, // Cannot find name '{0}'.
|
|
202
290
|
2552, // Cannot find name '{0}'. Did you mean '{1}'?
|
|
203
291
|
]);
|
|
292
|
+
/**
|
|
293
|
+
* Typed Lit, opt-in through `typecheck.litTypes`. Declares the two chrome
|
|
294
|
+
* modules widgets import Lit from, so they no longer fall to the
|
|
295
|
+
* `chrome:*` wildcard as `any`: `LitElement` (with `ReactiveElement`'s
|
|
296
|
+
* lifecycle) and `MozLitElement` carry closed member lists, so a misspelt
|
|
297
|
+
* member of a widget host is TS2339, as `Cu` is in the built-in shim.
|
|
298
|
+
* Template helpers and directives stay loose. A project shim can merge
|
|
299
|
+
* members into `LitElementShimMembers`; a project whose jsconfig `paths`
|
|
300
|
+
* maps these URLs to the real sources gets those instead, since a resolved
|
|
301
|
+
* file wins over an ambient module.
|
|
302
|
+
*/
|
|
303
|
+
const LIT_TYPES_SHIM = `
|
|
304
|
+
// ── FireForge typed Lit (typecheck.litTypes) ──
|
|
305
|
+
interface LitPropertyDeclarationShim {
|
|
306
|
+
type?: unknown;
|
|
307
|
+
attribute?: boolean | string;
|
|
308
|
+
reflect?: boolean;
|
|
309
|
+
state?: boolean;
|
|
310
|
+
noAccessor?: boolean;
|
|
311
|
+
converter?: unknown;
|
|
312
|
+
hasChanged?(value: unknown, oldValue: unknown): boolean;
|
|
313
|
+
fluent?: boolean;
|
|
314
|
+
}
|
|
315
|
+
interface LitElementShimMembers {
|
|
316
|
+
readonly renderRoot: HTMLElement | DocumentFragment;
|
|
317
|
+
readonly isUpdatePending: boolean;
|
|
318
|
+
readonly hasUpdated: boolean;
|
|
319
|
+
readonly updateComplete: Promise<boolean>;
|
|
320
|
+
renderOptions: any;
|
|
321
|
+
requestUpdate(name?: PropertyKey, oldValue?: unknown, options?: LitPropertyDeclarationShim): void;
|
|
322
|
+
addController(controller: any): void;
|
|
323
|
+
removeController(controller: any): void;
|
|
324
|
+
connectedCallback(): void;
|
|
325
|
+
disconnectedCallback(): void;
|
|
326
|
+
attributeChangedCallback(name: string, oldValue: string | null, value: string | null): void;
|
|
327
|
+
createRenderRoot(): HTMLElement | DocumentFragment;
|
|
328
|
+
enableUpdating(requestedUpdate: boolean): void;
|
|
329
|
+
scheduleUpdate(): void | Promise<unknown>;
|
|
330
|
+
performUpdate(): void;
|
|
331
|
+
getUpdateComplete(): Promise<boolean>;
|
|
332
|
+
shouldUpdate(changedProperties: Map<PropertyKey, unknown>): boolean;
|
|
333
|
+
willUpdate(changedProperties: Map<PropertyKey, unknown>): void;
|
|
334
|
+
update(changedProperties: Map<PropertyKey, unknown>): void;
|
|
335
|
+
render(): unknown;
|
|
336
|
+
firstUpdated(changedProperties: Map<PropertyKey, unknown>): void;
|
|
337
|
+
updated(changedProperties: Map<PropertyKey, unknown>): void;
|
|
338
|
+
}
|
|
339
|
+
declare module 'chrome://global/content/vendor/lit.all.mjs' {
|
|
340
|
+
export class ReactiveElement extends HTMLElement {
|
|
341
|
+
static properties: Record<string, LitPropertyDeclarationShim>;
|
|
342
|
+
static styles: any;
|
|
343
|
+
static shadowRootOptions: ShadowRootInit;
|
|
344
|
+
static readonly observedAttributes: string[];
|
|
345
|
+
static createProperty(name: PropertyKey, options?: LitPropertyDeclarationShim): void;
|
|
346
|
+
static addInitializer(initializer: (element: ReactiveElement) => void): void;
|
|
347
|
+
}
|
|
348
|
+
export interface ReactiveElement extends LitElementShimMembers {}
|
|
349
|
+
export class LitElement extends ReactiveElement {}
|
|
350
|
+
export const html: (strings: TemplateStringsArray, ...values: unknown[]) => any;
|
|
351
|
+
export const svg: (strings: TemplateStringsArray, ...values: unknown[]) => any;
|
|
352
|
+
export const css: (strings: TemplateStringsArray, ...values: unknown[]) => any;
|
|
353
|
+
export const nothing: any;
|
|
354
|
+
export const noChange: any;
|
|
355
|
+
export const render: any;
|
|
356
|
+
export const unsafeCSS: any;
|
|
357
|
+
export const classMap: any;
|
|
358
|
+
export const styleMap: any;
|
|
359
|
+
export const ifDefined: any;
|
|
360
|
+
export const repeat: any;
|
|
361
|
+
export const when: any;
|
|
362
|
+
export const map: any;
|
|
363
|
+
export const live: any;
|
|
364
|
+
export const ref: any;
|
|
365
|
+
export const createRef: any;
|
|
366
|
+
export const until: any;
|
|
367
|
+
export const guard: any;
|
|
368
|
+
export const choose: any;
|
|
369
|
+
export const keyed: any;
|
|
370
|
+
export const cache: any;
|
|
371
|
+
export const join: any;
|
|
372
|
+
export const range: any;
|
|
373
|
+
export const unsafeHTML: any;
|
|
374
|
+
export const unsafeSVG: any;
|
|
375
|
+
export const literal: any;
|
|
376
|
+
export const unsafeStatic: any;
|
|
377
|
+
export const staticHtml: any;
|
|
378
|
+
export const staticSvg: any;
|
|
379
|
+
export const directive: any;
|
|
380
|
+
export const Directive: any;
|
|
381
|
+
export const AsyncDirective: any;
|
|
382
|
+
export const PartType: any;
|
|
383
|
+
export const defaultConverter: any;
|
|
384
|
+
export const notEqual: any;
|
|
385
|
+
export const adoptStyles: any;
|
|
386
|
+
export const supportsAdoptingStyleSheets: boolean;
|
|
387
|
+
export const CSSResult: any;
|
|
388
|
+
export const isServer: boolean;
|
|
389
|
+
}
|
|
390
|
+
declare module 'chrome://global/content/lit-utils.mjs' {
|
|
391
|
+
import { LitElement } from 'chrome://global/content/vendor/lit.all.mjs';
|
|
392
|
+
export class MozLitElement extends LitElement {
|
|
393
|
+
static queries: Record<string, string | Record<string, unknown>>;
|
|
394
|
+
static fragment: unknown;
|
|
395
|
+
dispatchOnUpdateComplete(event: Event): Promise<void>;
|
|
396
|
+
}
|
|
397
|
+
export const MozBaseInputElement: any;
|
|
398
|
+
export const MozBoolInputElement: any;
|
|
399
|
+
export const SelectControlBaseElement: any;
|
|
400
|
+
export const SelectControlItemMixin: any;
|
|
401
|
+
}
|
|
402
|
+
`;
|
|
204
403
|
/** Hint appended to reported undefined-identifier diagnostics. */
|
|
205
404
|
export const UNDEFINED_IDENTIFIER_HINT = '(undefined identifier — import or declare it, add the global to the extra shim, ' +
|
|
206
405
|
'or tune the "undefinedIdentifiers" setting)';
|
|
@@ -262,9 +461,11 @@ async function inlineTripleSlashReferences(source, baseDir, seen) {
|
|
|
262
461
|
* @param projectRoot - Absolute project root, used to resolve the relative
|
|
263
462
|
* shim path
|
|
264
463
|
* @param extraShimPath - Optional project-relative path to an extra `.d.ts`
|
|
464
|
+
* @param options - `litTypes` appends {@link LIT_TYPES_SHIM} after the
|
|
465
|
+
* built-in shim (before the extra shim, which can still merge into it)
|
|
265
466
|
*/
|
|
266
|
-
export async function composeShimSource(projectRoot, extraShimPath) {
|
|
267
|
-
const base = FIREFOX_GLOBALS_SHIM;
|
|
467
|
+
export async function composeShimSource(projectRoot, extraShimPath, options = {}) {
|
|
468
|
+
const base = options.litTypes === true ? `${FIREFOX_GLOBALS_SHIM}\n${LIT_TYPES_SHIM}` : FIREFOX_GLOBALS_SHIM;
|
|
268
469
|
if (!extraShimPath) {
|
|
269
470
|
return { source: base, extraShimAppended: false };
|
|
270
471
|
}
|
|
@@ -102,7 +102,9 @@ export async function runTypecheck(projectRoot, cfg, runOptions = {}) {
|
|
|
102
102
|
const cached = shimCache.get(key);
|
|
103
103
|
if (cached !== undefined)
|
|
104
104
|
return cached;
|
|
105
|
-
const composed = await composeShimSource(projectRoot, extraShim
|
|
105
|
+
const composed = await composeShimSource(projectRoot, extraShim, {
|
|
106
|
+
litTypes: cfg.litTypes,
|
|
107
|
+
});
|
|
106
108
|
if (composed.extraShimAppended) {
|
|
107
109
|
verbose(`typecheck: extra shim ${extraShim ?? ''} appended to Firefox globals shim`);
|
|
108
110
|
}
|