@shapeshift-labs/frontier-lang-compiler 0.2.150 → 0.2.151
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/README.md +315 -9
- package/bench/real-repo-corpus-checkout-identity.mjs +134 -0
- package/bench/real-repo-corpus-checkout-proof.mjs +263 -0
- package/bench/real-repo-corpus-command-execution.mjs +314 -0
- package/bench/real-repo-corpus-evidence.mjs +165 -0
- package/bench/real-repo-corpus-suite.mjs +273 -0
- package/bench/smoke.mjs +109 -7
- package/dist/declarations/import-adapter-core.d.ts +4 -3
- package/dist/declarations/import-adapter-options-native.d.ts +21 -0
- package/dist/declarations/js-ts-project-merge-admission-routes.d.ts +35 -0
- package/dist/declarations/js-ts-project-merge-commonjs-interop.d.ts +29 -0
- package/dist/declarations/js-ts-project-merge-confidence.d.ts +64 -0
- package/dist/declarations/js-ts-project-merge-declaration-emit-parity.d.ts +37 -0
- package/dist/declarations/js-ts-project-merge-declarations.d.ts +65 -0
- package/dist/declarations/js-ts-project-merge-diagnostics.d.ts +97 -0
- package/dist/declarations/js-ts-project-merge-global-augmentation.d.ts +30 -0
- package/dist/declarations/js-ts-project-merge-jsx-render-branch.d.ts +48 -0
- package/dist/declarations/js-ts-project-merge-proof-levels.d.ts +109 -0
- package/dist/declarations/js-ts-project-merge-quality-gates.d.ts +38 -0
- package/dist/declarations/js-ts-project-merge-semantic-equivalence-proof.d.ts +45 -0
- package/dist/declarations/js-ts-project-merge-tsconfig.d.ts +43 -0
- package/dist/declarations/js-ts-safe-merge.d.ts +47 -0
- package/dist/declarations/js-ts-safe-project-merge.d.ts +120 -38
- package/dist/declarations/native-project-compiler-assignability-oracle.d.ts +41 -0
- package/dist/declarations/native-project-compiler-callable-signatures.d.ts +31 -0
- package/dist/declarations/native-project-compiler-class-member-runtime-proof.d.ts +87 -0
- package/dist/declarations/native-project-compiler-composite-types.d.ts +23 -0
- package/dist/declarations/native-project-compiler-enum-proof.d.ts +58 -0
- package/dist/declarations/native-project-compiler-index-signature.d.ts +7 -0
- package/dist/declarations/native-project-compiler-public-api-source-binding.d.ts +8 -0
- package/dist/declarations/native-project-compiler-scope.d.ts +37 -0
- package/dist/declarations/native-project-compiler-type-reference-targets.d.ts +38 -0
- package/dist/declarations/native-project-css-modules.d.ts +90 -0
- package/dist/declarations/native-project-decorator-metadata.d.ts +126 -0
- package/dist/declarations/native-project-jsx-graph.d.ts +313 -0
- package/dist/declarations/native-project-module-declarations.d.ts +52 -0
- package/dist/declarations/native-project-module-resolution.d.ts +76 -1
- package/dist/declarations/native-project-runtime-effect-target.d.ts +29 -0
- package/dist/declarations/native-project-runtime-executable-effect-evidence.d.ts +107 -0
- package/dist/declarations/native-project-runtime-mutation-target.d.ts +33 -0
- package/dist/declarations/native-project-runtime-promise-chain.d.ts +30 -0
- package/dist/declarations/native-project-runtime-promise-combinator.d.ts +22 -0
- package/dist/declarations/native-project-runtime-reachability.d.ts +30 -0
- package/dist/declarations/native-project-runtime-resource-management.d.ts +27 -0
- package/dist/declarations/native-project-runtime-yield-delegation.d.ts +10 -0
- package/dist/declarations/native-project-scope-template-reference.d.ts +13 -0
- package/dist/declarations/native-project-source-evidence.d.ts +8 -0
- package/dist/declarations/native-project.d.ts +40 -39
- package/dist/declarations/semantic-edit-script.d.ts +10 -8
- package/dist/declarations/semantic-graph-layers.d.ts +79 -0
- package/dist/declarations/semantic-sidecar.d.ts +3 -2
- package/dist/declarations/semantic-structural-diff.d.ts +94 -0
- package/dist/declarations/source-preservation.d.ts +32 -1
- package/dist/declarations/target-adapters.d.ts +22 -2
- package/dist/index.d.ts +31 -0
- package/dist/index.js +5 -0
- package/dist/internal/index-impl/compileNativeSource.js +53 -5
- package/dist/internal/index-impl/createLightweightNativeImport.js +58 -4
- package/dist/internal/index-impl/createNativeImportFromSyntaxAst.js +17 -1
- package/dist/internal/index-impl/createNativeImportFromTypeScriptAst.js +28 -4
- package/dist/internal/index-impl/createNativeProjectImportResult.js +31 -27
- package/dist/internal/index-impl/createNativeProjectModuleResolutionFromPackageManifests.js +145 -0
- package/dist/internal/index-impl/createNativeSourcePreservation.js +34 -7
- package/dist/internal/index-impl/createSemanticImportSidecar.js +27 -1
- package/dist/internal/index-impl/createTypeScriptCompilerNativeImporterAdapter.js +16 -5
- package/dist/internal/index-impl/dynamicImportExpressionMetadata.js +80 -0
- package/dist/internal/index-impl/importMetaUrlDependencyMetadata.js +176 -0
- package/dist/internal/index-impl/importNativeSource.js +2 -3
- package/dist/internal/index-impl/moduleImportAttributeMetadata.js +232 -0
- package/dist/internal/index-impl/projectSemanticEditScriptToSource.js +8 -1
- package/dist/internal/index-impl/projectSymbolGraphClassStaticBlocks.js +148 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerAdvancedTypeMetadata.js +45 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerCallableSignatureEquivalence.js +107 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerClassPrivateAccessorRuntimeProof.js +280 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerClassShapeEquivalence.js +103 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerConditionalTypeEquivalence.js +242 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerDecoratorRuntimeProof.js +197 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerEnumEquivalence.js +188 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerFacts.js +244 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerIndexSignatureEquivalence.js +58 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerMetadata.js +168 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerTypeEquivalence.js +199 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerTypeEquivalenceProof.js +204 -0
- package/dist/internal/index-impl/projectSymbolGraphCompilerTypeReferenceTargetEquivalence.js +99 -0
- package/dist/internal/index-impl/projectSymbolGraphCssModuleRecords.js +264 -0
- package/dist/internal/index-impl/projectSymbolGraphCssModuleScanners.js +242 -0
- package/dist/internal/index-impl/projectSymbolGraphCssModuleUtils.js +152 -0
- package/dist/internal/index-impl/projectSymbolGraphCssModules.js +82 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxComponentImports.js +170 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxComponentProviderLookup.js +167 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxComponentWrappers.js +150 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxContextTargets.js +71 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxContextValues.js +212 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxEventHandlers.js +172 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxHookEffects.js +124 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxHooks.js +281 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxMemberComponents.js +139 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxPropFlows.js +320 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxPropValues.js +145 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxProviderFlows.js +133 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxRecords.js +315 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxRenderCollections.js +155 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxRenderReturns.js +291 -0
- package/dist/internal/index-impl/projectSymbolGraphJsxRenderRisk.js +279 -0
- package/dist/internal/index-impl/projectSymbolGraphModuleDeclarationShapes.js +138 -0
- package/dist/internal/index-impl/projectSymbolGraphModuleResolution.js +89 -87
- package/dist/internal/index-impl/projectSymbolGraphPackageConditions.js +314 -0
- package/dist/internal/index-impl/projectSymbolGraphReExportImportTargets.js +43 -0
- package/dist/internal/index-impl/projectSymbolGraphReExports.js +55 -1
- package/dist/internal/index-impl/projectSymbolGraphRuntimeRegions.js +108 -0
- package/dist/internal/index-impl/projectSymbolGraphScopeUseDefAliases.js +307 -0
- package/dist/internal/index-impl/projectSymbolGraphScopeUseDefLexical.js +320 -0
- package/dist/internal/index-impl/projectSymbolGraphScopeUseDefOwners.js +50 -0
- package/dist/internal/index-impl/projectSymbolGraphScopeUseDefRecordBuilders.js +112 -0
- package/dist/internal/index-impl/projectSymbolGraphScopeUseDefRecords.js +238 -0
- package/dist/internal/index-impl/projectSymbolGraphScopeUseDefStructural.js +104 -0
- package/dist/internal/index-impl/projectSymbolGraphScopeUseDefStructuralNormalize.js +242 -0
- package/dist/internal/index-impl/projectSymbolGraphScopeUseDefUseHashes.js +107 -0
- package/dist/internal/index-impl/projectSymbolGraphSourceMapGeneratedBoundary.js +111 -0
- package/dist/internal/index-impl/projectSymbolGraphSourceRecords.js +268 -0
- package/dist/internal/index-impl/projectSymbolGraphSourceRecordsOwnership.js +309 -0
- package/dist/internal/index-impl/replaySemanticEditProjection.js +53 -39
- package/dist/internal/index-impl/runtimeOrderEvidenceBinding.js +151 -0
- package/dist/internal/index-impl/runtimeOrderProofSurfaces.js +253 -0
- package/dist/internal/index-impl/semanticEditCallsiteArgumentMerge.js +319 -0
- package/dist/internal/index-impl/semanticEditExplicitSourceReplacement.js +7 -2
- package/dist/internal/index-impl/semanticEditProjectionRecord.js +8 -0
- package/dist/internal/index-impl/semanticEditReplayDiagnostics.js +7 -2
- package/dist/internal/index-impl/semanticEditReplayOutputBinding.js +61 -0
- package/dist/internal/index-impl/semanticEditReplayRerunRoute.js +27 -0
- package/dist/internal/index-impl/semanticEditReplaySourceReplacement.js +6 -1
- package/dist/internal/index-impl/semanticEditRuntimeOrderReasons.js +320 -0
- package/dist/internal/index-impl/semanticEditScriptClassification.js +90 -5
- package/dist/internal/index-impl/semanticEditScripts.js +42 -5
- package/dist/internal/index-impl/semanticEditTypeSyntaxReasons.js +134 -0
- package/dist/internal/index-impl/semanticIndexFromNativeDeclarations.js +11 -5
- package/dist/internal/index-impl/semanticStructuralDiffRecords.js +150 -0
- package/dist/internal/index-impl/sourceMapGeneratedBoundaryGate.js +185 -0
- package/dist/internal/index-impl/staticMemberLiteral.js +31 -0
- package/dist/internal/index-impl/staticOptionalMemberReference.js +22 -0
- package/dist/internal/index-impl/syntaxAstSourcePreservation.js +273 -0
- package/dist/internal/index-impl/syntaxCommonJsModuleDeclarationEntries.js +297 -0
- package/dist/internal/index-impl/syntaxModuleDeclarationEntries.js +56 -132
- package/dist/internal/index-impl/syntaxModuleEntryRecords.js +160 -0
- package/dist/internal/index-impl/typeScriptCompilerAdvancedTypeShapes.js +160 -0
- package/dist/internal/index-impl/typeScriptCompilerAssignabilityOracle.js +97 -0
- package/dist/internal/index-impl/typeScriptCompilerClassApi.js +238 -0
- package/dist/internal/index-impl/typeScriptCompilerDecoratorMetadata.js +290 -0
- package/dist/internal/index-impl/typeScriptCompilerEnumShape.js +279 -0
- package/dist/internal/index-impl/typeScriptCompilerFacts.js +294 -0
- package/dist/internal/index-impl/typeScriptCompilerInferenceSyntax.js +170 -0
- package/dist/internal/index-impl/typeScriptCompilerReferenceGraph.js +186 -0
- package/dist/internal/index-impl/typeScriptCompilerSymbolIdentity.js +294 -0
- package/dist/internal/index-impl/typeScriptCompilerTypeReferenceTargets.js +142 -0
- package/dist/internal/index-impl/typeScriptDeclaration.js +10 -38
- package/dist/internal/index-impl/typeScriptModuleDeclarationEntries.js +52 -15
- package/dist/internal/index-impl/typeScriptSourceFilePreservation.js +296 -0
- package/dist/js-ts-safe-member-class-invariants.js +247 -0
- package/dist/js-ts-safe-member-merge-result.js +23 -3
- package/dist/js-ts-safe-member-merge.js +28 -4
- package/dist/js-ts-safe-merge-binding-patterns.js +170 -0
- package/dist/js-ts-safe-merge-jsx-attribute-fallback.js +151 -157
- package/dist/js-ts-safe-merge-jsx-attribute-parser.js +277 -0
- package/dist/js-ts-safe-merge-jsx-child-expression-fallback.js +161 -0
- package/dist/js-ts-safe-merge-jsx-child-expression-merge.js +319 -0
- package/dist/js-ts-safe-merge-jsx-child-expression-parser.js +300 -0
- package/dist/js-ts-safe-merge-parse-declarations.js +46 -2
- package/dist/js-ts-safe-merge-parse-statements.js +8 -0
- package/dist/js-ts-safe-merge-semantic-edit-fallback.js +13 -5
- package/dist/js-ts-safe-merge-source-shape-fallbacks.js +3 -1
- package/dist/js-ts-safe-merge-top-level-rename-fallback.js +31 -5
- package/dist/js-ts-safe-merge-top-level-rename-result.js +7 -2
- package/dist/js-ts-safe-merge-variable-declarator-fallback.js +124 -6
- package/dist/js-ts-safe-merge-variable-declarator-parser.js +34 -4
- package/dist/js-ts-safe-merge.js +136 -0
- package/dist/js-ts-safe-project-merge-admission-routes.js +216 -0
- package/dist/js-ts-safe-project-merge-admission.js +161 -0
- package/dist/js-ts-safe-project-merge-ambient.js +110 -0
- package/dist/js-ts-safe-project-merge-core.js +85 -0
- package/dist/js-ts-safe-project-merge-css-module-conflicts.js +60 -0
- package/dist/js-ts-safe-project-merge-declaration-emit-parity.js +186 -0
- package/dist/js-ts-safe-project-merge-declarations.js +227 -0
- package/dist/js-ts-safe-project-merge-diagnostics-metadata.js +42 -0
- package/dist/js-ts-safe-project-merge-diagnostics-ts.js +73 -0
- package/dist/js-ts-safe-project-merge-diagnostics.js +283 -0
- package/dist/js-ts-safe-project-merge-evidence-routing.js +38 -0
- package/dist/js-ts-safe-project-merge-files.js +70 -0
- package/dist/js-ts-safe-project-merge-global-augmentation-compatibility.js +99 -0
- package/dist/js-ts-safe-project-merge-graph-conflicts.js +90 -2
- package/dist/js-ts-safe-project-merge-graph-delta-commonjs-interop.js +108 -0
- package/dist/js-ts-safe-project-merge-graph-delta-compiler-conflicts.js +179 -0
- package/dist/js-ts-safe-project-merge-graph-delta-compiler-details.js +189 -0
- package/dist/js-ts-safe-project-merge-graph-delta-conflicts.js +51 -184
- package/dist/js-ts-safe-project-merge-graph-delta-identity-conflicts.js +202 -0
- package/dist/js-ts-safe-project-merge-graph-delta-inference-syntax.js +80 -0
- package/dist/js-ts-safe-project-merge-graph-delta-module-declarations.js +155 -0
- package/dist/js-ts-safe-project-merge-graph-limits.js +16 -1
- package/dist/js-ts-safe-project-merge-graph.js +37 -5
- package/dist/js-ts-safe-project-merge-import-removal.js +292 -0
- package/dist/js-ts-safe-project-merge-jsx-graph-conflict-details.js +235 -0
- package/dist/js-ts-safe-project-merge-jsx-graph-conflicts.js +173 -0
- package/dist/js-ts-safe-project-merge-jsx-prop-contracts.js +86 -0
- package/dist/js-ts-safe-project-merge-jsx-render-branch-proof.js +189 -0
- package/dist/js-ts-safe-project-merge-missing-evidence.js +310 -0
- package/dist/js-ts-safe-project-merge-move-rename.js +209 -0
- package/dist/js-ts-safe-project-merge-proof-conflicts.js +44 -0
- package/dist/js-ts-safe-project-merge-proof-levels.js +320 -0
- package/dist/js-ts-safe-project-merge-quality-gates.js +140 -0
- package/dist/js-ts-safe-project-merge-routing-calibration.js +125 -0
- package/dist/js-ts-safe-project-merge-runtime-region-conflicts.js +156 -0
- package/dist/js-ts-safe-project-merge-scope-use-def-conflicts.js +292 -0
- package/dist/js-ts-safe-project-merge-semantic-equivalence-proof.js +175 -0
- package/dist/js-ts-safe-project-merge-semantic-replay-proof.js +311 -0
- package/dist/js-ts-safe-project-merge-semantic-replay-routes.js +179 -0
- package/dist/js-ts-safe-project-merge-source-span-conflicts.js +310 -0
- package/dist/js-ts-safe-project-merge-source-span-roundtrip-proof.js +172 -0
- package/dist/js-ts-safe-project-merge-split-merge-admission.js +96 -0
- package/dist/js-ts-safe-project-merge-split-merge-records.js +320 -0
- package/dist/js-ts-safe-project-merge-split-merge-shapes.js +234 -0
- package/dist/js-ts-safe-project-merge-split-merge.js +218 -0
- package/dist/js-ts-safe-project-merge-summary.js +320 -0
- package/dist/js-ts-safe-project-merge-symbol-move-admission.js +63 -0
- package/dist/js-ts-safe-project-merge-symbol-move-default-admission.js +143 -0
- package/dist/js-ts-safe-project-merge-symbol-move-risks.js +213 -0
- package/dist/js-ts-safe-project-merge-symbol-move.js +316 -0
- package/dist/js-ts-safe-project-merge-symbol-rename-admission.js +59 -0
- package/dist/js-ts-safe-project-merge-symbol-rename-default-admission.js +111 -0
- package/dist/js-ts-safe-project-merge-symbol-rename.js +319 -0
- package/dist/js-ts-safe-project-merge-ts-options.js +205 -0
- package/dist/js-ts-safe-project-merge-ts-program.js +268 -0
- package/dist/js-ts-safe-project-merge-typed-property-rename-rebase-utils.js +69 -0
- package/dist/js-ts-safe-project-merge-typed-property-rename-rebase.js +317 -0
- package/dist/js-ts-safe-project-merge-unsupported-surfaces.js +319 -0
- package/dist/js-ts-safe-project-merge.js +170 -171
- package/dist/js-ts-semantic-scope-use-def-bindings.js +287 -0
- package/dist/js-ts-semantic-scope-use-def-scan.js +241 -0
- package/dist/js-ts-semantic-scope-use-def-utils.js +132 -0
- package/dist/js-ts-semantic-scope-use-def.js +217 -0
- package/dist/lightweight-dependency-effects.js +28 -4
- package/dist/lightweight-dependency-relations.js +13 -7
- package/dist/lightweight-dependency-top-level.js +63 -0
- package/dist/native-import-language-profiles.js +27 -1
- package/dist/native-js-ts-importers.js +9 -5
- package/dist/native-parser-ast-format-profiles.js +12 -0
- package/dist/native-parser-html-css-format-profiles.js +85 -0
- package/dist/native-region-scanner-core.js +5 -3
- package/dist/native-region-scanner-js-commonjs.js +155 -0
- package/dist/native-region-scanner-js-imports.js +51 -13
- package/dist/native-region-scanner-js-reexports.js +79 -0
- package/dist/native-region-scanner-js-ts-helpers.js +23 -0
- package/dist/native-source-ledger-helpers.js +1 -1
- package/dist/native-source-ledger.js +24 -10
- package/dist/native-source-maps-ecma426.js +316 -0
- package/dist/native-source-maps.js +36 -6
- package/dist/native-source-preservation-ownership.js +292 -0
- package/dist/native-source-preservation-scanner.js +63 -25
- package/dist/native-source-preservation-types.d.ts +3 -0
- package/dist/semantic-import-effect-occurrences.js +242 -0
- package/dist/semantic-import-effect-regions.js +95 -58
- package/dist/semantic-import-graph-layers.js +224 -0
- package/dist/semantic-import-runtime-conditional-evidence.js +135 -0
- package/dist/semantic-import-runtime-effect-target-evidence.js +145 -0
- package/dist/semantic-import-runtime-exit-evidence.js +32 -0
- package/dist/semantic-import-runtime-import-meta-evidence.js +33 -0
- package/dist/semantic-import-runtime-mutation-evidence.js +155 -0
- package/dist/semantic-import-runtime-order-evidence.js +318 -0
- package/dist/semantic-import-runtime-promise-chain-evidence.js +103 -0
- package/dist/semantic-import-runtime-promise-combinator-evidence.js +166 -0
- package/dist/semantic-import-runtime-reachability-evidence.js +269 -0
- package/dist/semantic-import-runtime-resource-management-evidence.js +293 -0
- package/dist/semantic-import-runtime-switch-evidence.js +304 -0
- package/dist/semantic-import-runtime-throw-evidence.js +44 -0
- package/dist/semantic-import-runtime-try-finally-evidence.js +172 -0
- package/dist/semantic-import-sidecar-entry.js +4 -0
- package/dist/semantic-import-source-preservation.js +6 -2
- package/package.json +1 -1
package/dist/internal/index-impl/projectSymbolGraphCompilerClassPrivateAccessorRuntimeProof.js
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { hashSemanticValue } from '@shapeshift-labs/frontier-lang-kernel';
|
|
2
|
+
|
|
3
|
+
const ClassPrivateAccessorRuntimeProofSchema = 'frontier.lang.typescript.classPrivateAccessorRuntimeProof.v1';
|
|
4
|
+
const ClassPrivateAccessorRuntimeProofKind = 'frontier.lang.typescript.classPrivateAccessorRuntimeProof';
|
|
5
|
+
const ClassPrivateAccessorRuntimeBoundCode = 'class-private-accessor-runtime-proof-bound';
|
|
6
|
+
const ClassPrivateAccessorRuntimeRouteId = 'prove-class-private-accessor-runtime-equivalence';
|
|
7
|
+
const ClassPrivateAccessorRuntimeRouteLane = 'class-private-accessor-runtime-boundaries';
|
|
8
|
+
const ClassPrivateAccessorRuntimeRouteNext = 'supply-class-private-accessor-runtime-proof';
|
|
9
|
+
const PassedStatuses = new Set(['passed', 'verified']);
|
|
10
|
+
const TraceHashSignalsByKey = Object.freeze({
|
|
11
|
+
classConstructionOrderTraceHash: 'typescript-class-construction-order-trace',
|
|
12
|
+
privateMemberInitializationTraceHash: 'typescript-private-member-initialization-trace',
|
|
13
|
+
privateMemberAccessTraceHash: 'typescript-private-member-access-trace',
|
|
14
|
+
privateBrandCheckTraceHash: 'typescript-private-brand-check-trace',
|
|
15
|
+
privateMethodCallTraceHash: 'typescript-private-method-call-trace',
|
|
16
|
+
privateAccessorGetSetTraceHash: 'typescript-private-accessor-get-set-trace',
|
|
17
|
+
staticPrivateMemberAccessTraceHash: 'typescript-static-private-member-access-trace',
|
|
18
|
+
subclassPrivateBrandBoundaryTraceHash: 'typescript-subclass-private-brand-boundary-trace',
|
|
19
|
+
accessorInitializationTraceHash: 'typescript-accessor-field-initialization-trace',
|
|
20
|
+
accessorGetSetTraceHash: 'typescript-accessor-field-get-set-trace',
|
|
21
|
+
accessorDescriptorTraceHash: 'typescript-accessor-field-descriptor-trace'
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
function classPrivateAccessorRuntimeProjection(value, counts, source = {}) {
|
|
25
|
+
const shapeProof = objectRecord(value.classMemberShapeProof);
|
|
26
|
+
if (!shapeProof || !classPrivateAccessorRuntimeRequired(counts)) return { record: {} };
|
|
27
|
+
const binding = classPrivateAccessorRuntimeProofBinding(value, counts, source);
|
|
28
|
+
return {
|
|
29
|
+
binding,
|
|
30
|
+
record: compactRecord({
|
|
31
|
+
classMemberShapeProof: boundClassMemberShapeProof(shapeProof, binding),
|
|
32
|
+
classPrivateAccessorRuntimeHash: binding.classPrivateAccessorRuntimeHash,
|
|
33
|
+
classPrivateAccessorRuntimeProof: binding.proof,
|
|
34
|
+
classPrivateAccessorRuntimeProofReasonCodes: binding.passed ? undefined : nonEmptyArray(binding.reasonCodes)
|
|
35
|
+
})
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function classPrivateAccessorRuntimeProofBinding(value, counts, source = {}) {
|
|
40
|
+
if (!classPrivateAccessorRuntimeRequired(counts)) return { passed: false, evidenceIds: [], reasonCodes: [] };
|
|
41
|
+
const proof = classPrivateAccessorRuntimeProofCandidate(value);
|
|
42
|
+
if (!proof) return {
|
|
43
|
+
passed: false,
|
|
44
|
+
evidenceIds: [],
|
|
45
|
+
reasonCodes: ['typescript-class-private-accessor-runtime-proof-missing']
|
|
46
|
+
};
|
|
47
|
+
const expectedHash = classPrivateAccessorRuntimeHash(value, counts, source, proof);
|
|
48
|
+
const requiredSignals = classPrivateAccessorRuntimeRequiredSignals(value, counts);
|
|
49
|
+
const reasonCodes = [];
|
|
50
|
+
reasonCodes.push(...missingClassPrivateAccessorRuntimeTraceHashReasonCodes(proof, value, counts));
|
|
51
|
+
if (!PassedStatuses.has(String(proof.status ?? ''))) reasonCodes.push('typescript-class-private-accessor-runtime-proof-status-not-passed');
|
|
52
|
+
if (proof.schema !== ClassPrivateAccessorRuntimeProofSchema) reasonCodes.push('typescript-class-private-accessor-runtime-proof-schema-missing');
|
|
53
|
+
if (proof.kind !== ClassPrivateAccessorRuntimeProofKind) reasonCodes.push('typescript-class-private-accessor-runtime-proof-kind-missing');
|
|
54
|
+
if (!containsAllStrings(proof.requiredSignals, requiredSignals)) reasonCodes.push('typescript-class-private-accessor-runtime-proof-required-signals-missing');
|
|
55
|
+
if (proof.sourcePath !== source.sourcePath) reasonCodes.push('typescript-class-private-accessor-runtime-proof-source-path-mismatch');
|
|
56
|
+
if (proof.sourceHash !== source.sourceHash) reasonCodes.push('typescript-class-private-accessor-runtime-proof-source-hash-mismatch');
|
|
57
|
+
if (counts.privateClassMemberCount > 0 && proof.privateClassMemberShapeHash !== value.privateClassMemberShapeHash) {
|
|
58
|
+
reasonCodes.push('typescript-class-private-accessor-runtime-proof-private-shape-hash-mismatch');
|
|
59
|
+
}
|
|
60
|
+
if (counts.accessorFieldCount > 0 && proof.accessorFieldShapeHash !== value.accessorFieldShapeHash) {
|
|
61
|
+
reasonCodes.push('typescript-class-private-accessor-runtime-proof-accessor-shape-hash-mismatch');
|
|
62
|
+
}
|
|
63
|
+
if (Number(proof.privateClassMemberCount ?? 0) !== Number(counts.privateClassMemberCount ?? 0)) {
|
|
64
|
+
reasonCodes.push('typescript-class-private-accessor-runtime-proof-private-count-mismatch');
|
|
65
|
+
}
|
|
66
|
+
if (Number(proof.accessorFieldCount ?? 0) !== Number(counts.accessorFieldCount ?? 0)) {
|
|
67
|
+
reasonCodes.push('typescript-class-private-accessor-runtime-proof-accessor-count-mismatch');
|
|
68
|
+
}
|
|
69
|
+
if (!proof.classPrivateAccessorRuntimeHash) {
|
|
70
|
+
reasonCodes.push('typescript-class-private-accessor-runtime-proof-runtime-hash-missing');
|
|
71
|
+
} else if (expectedHash && proof.classPrivateAccessorRuntimeHash !== expectedHash) {
|
|
72
|
+
reasonCodes.push('typescript-class-private-accessor-runtime-proof-runtime-hash-mismatch');
|
|
73
|
+
}
|
|
74
|
+
if (!stringValue(proof.command)) reasonCodes.push('typescript-class-private-accessor-runtime-proof-command-missing');
|
|
75
|
+
if (!stringValue(proof.traceHash)) reasonCodes.push('typescript-class-private-accessor-runtime-proof-trace-hash-missing');
|
|
76
|
+
if (!stringValue(proof.evidenceHash)) reasonCodes.push('typescript-class-private-accessor-runtime-proof-evidence-hash-missing');
|
|
77
|
+
if (proof.autoMergeClaim !== false || proof.semanticEquivalenceClaim !== false || proof.runtimeEquivalenceClaim !== false
|
|
78
|
+
|| proof.privateMemberRuntimeEquivalenceClaim !== false || proof.accessorRuntimeEquivalenceClaim !== false) {
|
|
79
|
+
reasonCodes.push('typescript-class-private-accessor-runtime-proof-claim-flags-missing');
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
passed: reasonCodes.length === 0,
|
|
83
|
+
evidenceIds: uniqueStrings([proof.id, proof.evidenceId, ...arrayValue(proof.evidenceIds)]),
|
|
84
|
+
reasonCodes: uniqueStrings(reasonCodes),
|
|
85
|
+
classPrivateAccessorRuntimeHash: expectedHash,
|
|
86
|
+
proof: compactRecord({
|
|
87
|
+
id: proof.id,
|
|
88
|
+
evidenceId: proof.evidenceId,
|
|
89
|
+
schema: proof.schema,
|
|
90
|
+
kind: proof.kind,
|
|
91
|
+
status: proof.status,
|
|
92
|
+
sourcePath: proof.sourcePath,
|
|
93
|
+
sourceHash: proof.sourceHash,
|
|
94
|
+
privateClassMemberShapeHash: proof.privateClassMemberShapeHash,
|
|
95
|
+
accessorFieldShapeHash: proof.accessorFieldShapeHash,
|
|
96
|
+
privateClassMemberCount: proof.privateClassMemberCount,
|
|
97
|
+
accessorFieldCount: proof.accessorFieldCount,
|
|
98
|
+
requiredSignals,
|
|
99
|
+
classPrivateAccessorRuntimeHash: proof.classPrivateAccessorRuntimeHash,
|
|
100
|
+
...classPrivateAccessorRuntimeTraceHashes(proof, value, counts),
|
|
101
|
+
command: proof.command,
|
|
102
|
+
traceHash: proof.traceHash,
|
|
103
|
+
evidenceHash: proof.evidenceHash,
|
|
104
|
+
autoMergeClaim: false,
|
|
105
|
+
semanticEquivalenceClaim: false,
|
|
106
|
+
runtimeEquivalenceClaim: false,
|
|
107
|
+
privateMemberRuntimeEquivalenceClaim: false,
|
|
108
|
+
accessorRuntimeEquivalenceClaim: false
|
|
109
|
+
})
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function classPrivateAccessorRuntimeHash(value, counts, source = {}, proof = {}) {
|
|
114
|
+
const traceHashes = classPrivateAccessorRuntimeTraceHashes(proof, value, counts);
|
|
115
|
+
if (requiredClassPrivateAccessorRuntimeTraceHashKeys(value, counts).some((key) => !traceHashes[key])) return undefined;
|
|
116
|
+
return hashSemanticValue({
|
|
117
|
+
kind: 'frontier.lang.typescript.classPrivateAccessorRuntimeProof.values',
|
|
118
|
+
sourcePath: source.sourcePath,
|
|
119
|
+
sourceHash: source.sourceHash,
|
|
120
|
+
privateClassMemberShapeHash: counts.privateClassMemberCount > 0 ? value.privateClassMemberShapeHash : undefined,
|
|
121
|
+
accessorFieldShapeHash: counts.accessorFieldCount > 0 ? value.accessorFieldShapeHash : undefined,
|
|
122
|
+
privateClassMemberCount: counts.privateClassMemberCount || undefined,
|
|
123
|
+
accessorFieldCount: counts.accessorFieldCount || undefined,
|
|
124
|
+
requiredSignals: classPrivateAccessorRuntimeRequiredSignals(value, counts),
|
|
125
|
+
traceHashes
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function boundClassMemberShapeProof(shapeProof, binding) {
|
|
130
|
+
if (!binding.passed) return compactRecord({
|
|
131
|
+
...shapeProof,
|
|
132
|
+
proofScope: shapeProof.proofScope ?? 'static-private-accessor-shape-only',
|
|
133
|
+
classPrivateAccessorRuntimeHash: binding.classPrivateAccessorRuntimeHash,
|
|
134
|
+
classPrivateAccessorRuntimeProof: binding.proof,
|
|
135
|
+
classPrivateAccessorRuntimeProofReasonCodes: nonEmptyArray(binding.reasonCodes),
|
|
136
|
+
runtimeEquivalenceGap: boundClassPrivateAccessorRuntimeGap(shapeProof.runtimeEquivalenceGap, binding)
|
|
137
|
+
});
|
|
138
|
+
const { runtimeEquivalenceGap: _gap, conflictRouting: _routing, ...baseProof } = shapeProof;
|
|
139
|
+
return compactRecord({
|
|
140
|
+
...baseProof,
|
|
141
|
+
proofScope: 'static-private-accessor-shape-and-source-bound-runtime',
|
|
142
|
+
classPrivateAccessorRuntimeHash: binding.classPrivateAccessorRuntimeHash,
|
|
143
|
+
classPrivateAccessorRuntimeProof: binding.proof,
|
|
144
|
+
conflictRouting: classPrivateAccessorRuntimeProofRouting(binding, baseProof),
|
|
145
|
+
autoMergeClaim: false,
|
|
146
|
+
semanticEquivalenceClaim: false,
|
|
147
|
+
runtimeEquivalenceClaim: false
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function boundClassPrivateAccessorRuntimeGap(gap, binding) {
|
|
152
|
+
return compactRecord({
|
|
153
|
+
...(gap ?? {
|
|
154
|
+
code: 'class-private-accessor-runtime-equivalence-not-claimed',
|
|
155
|
+
status: 'not-claimed',
|
|
156
|
+
summary: 'Private member initialization/access and accessor getter/setter runtime behavior remain unproved.',
|
|
157
|
+
routeId: ClassPrivateAccessorRuntimeRouteId,
|
|
158
|
+
routeLane: ClassPrivateAccessorRuntimeRouteLane,
|
|
159
|
+
routeNext: ClassPrivateAccessorRuntimeRouteNext,
|
|
160
|
+
failClosed: true,
|
|
161
|
+
blocksSemanticEquivalence: true
|
|
162
|
+
}),
|
|
163
|
+
classPrivateAccessorRuntimeHash: binding.classPrivateAccessorRuntimeHash,
|
|
164
|
+
proofReasonCodes: nonEmptyArray(binding.reasonCodes),
|
|
165
|
+
proofEvidenceIds: nonEmptyArray(binding.evidenceIds)
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function classPrivateAccessorRuntimeProofRouting(binding, shapeProof = {}) {
|
|
170
|
+
return {
|
|
171
|
+
status: 'proof-bound',
|
|
172
|
+
conflictCode: 'project-public-compiler-type-delta-conflict',
|
|
173
|
+
reasonCode: ClassPrivateAccessorRuntimeBoundCode,
|
|
174
|
+
branchDivergenceSignal: 'classPrivateAccessorRuntimeHash',
|
|
175
|
+
routeId: ClassPrivateAccessorRuntimeRouteId,
|
|
176
|
+
routeLane: ClassPrivateAccessorRuntimeRouteLane,
|
|
177
|
+
routeNext: ClassPrivateAccessorRuntimeRouteNext,
|
|
178
|
+
privateClassMemberShapeHash: shapeProof.privateClassMemberShapeHash,
|
|
179
|
+
accessorFieldShapeHash: shapeProof.accessorFieldShapeHash,
|
|
180
|
+
classPrivateAccessorRuntimeHash: binding.classPrivateAccessorRuntimeHash,
|
|
181
|
+
proofEvidenceIds: nonEmptyArray(binding.evidenceIds),
|
|
182
|
+
failClosed: false,
|
|
183
|
+
autoMergeClaim: false,
|
|
184
|
+
semanticEquivalenceClaim: false,
|
|
185
|
+
runtimeEquivalenceClaim: false
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function classPrivateAccessorRuntimeProofCandidate(value) {
|
|
190
|
+
return objectRecord(value.classPrivateAccessorRuntimeProof)
|
|
191
|
+
?? objectRecord(value.classPrivateAccessorRuntimeEvidence)
|
|
192
|
+
?? objectRecord(value.classMemberShapeProof?.classPrivateAccessorRuntimeProof)
|
|
193
|
+
?? objectRecord(value.classMemberShapeProof?.runtimeProof);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function missingClassPrivateAccessorRuntimeTraceHashReasonCodes(proof, value, counts) {
|
|
197
|
+
const hashes = classPrivateAccessorRuntimeTraceHashes(proof, value, counts);
|
|
198
|
+
return requiredClassPrivateAccessorRuntimeTraceHashKeys(value, counts)
|
|
199
|
+
.filter((key) => !hashes[key])
|
|
200
|
+
.map((key) => `typescript-class-private-accessor-runtime-proof-${key.replace(/Hash$/, '').replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)}-hash-missing`);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function requiredClassPrivateAccessorRuntimeTraceHashKeys(value, counts) {
|
|
204
|
+
const privateMembers = privateClassMembers(value);
|
|
205
|
+
const hasPrivateMembers = counts.privateClassMemberCount > 0;
|
|
206
|
+
const hasPrivateIdentifier = privateMembers.some((member) => member.privateIdentifier === true || stringValue(member.name)?.startsWith('#'));
|
|
207
|
+
const hasPrivateMethod = privateMembers.some((member) => member.kind === 'private-method');
|
|
208
|
+
const hasPrivateAccessor = privateMembers.some((member) => member.kind === 'private-get-accessor' || member.kind === 'private-set-accessor' || member.kind === 'private-accessor-field');
|
|
209
|
+
const hasStaticPrivate = privateMembers.some((member) => member.static === true);
|
|
210
|
+
const hasClassHeritage = (numberValue(value.classHeritageCount) ?? arrayValue(value.classHeritage).length) > 0;
|
|
211
|
+
return [
|
|
212
|
+
'classConstructionOrderTraceHash',
|
|
213
|
+
hasPrivateMembers ? 'privateMemberInitializationTraceHash' : undefined,
|
|
214
|
+
hasPrivateMembers ? 'privateMemberAccessTraceHash' : undefined,
|
|
215
|
+
hasPrivateIdentifier ? 'privateBrandCheckTraceHash' : undefined,
|
|
216
|
+
hasPrivateMethod ? 'privateMethodCallTraceHash' : undefined,
|
|
217
|
+
hasPrivateAccessor ? 'privateAccessorGetSetTraceHash' : undefined,
|
|
218
|
+
hasStaticPrivate ? 'staticPrivateMemberAccessTraceHash' : undefined,
|
|
219
|
+
hasPrivateIdentifier && hasClassHeritage ? 'subclassPrivateBrandBoundaryTraceHash' : undefined,
|
|
220
|
+
counts.accessorFieldCount > 0 ? 'accessorInitializationTraceHash' : undefined,
|
|
221
|
+
counts.accessorFieldCount > 0 ? 'accessorGetSetTraceHash' : undefined,
|
|
222
|
+
counts.accessorFieldCount > 0 ? 'accessorDescriptorTraceHash' : undefined
|
|
223
|
+
].filter(Boolean);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function classPrivateAccessorRuntimeTraceHashes(proof, value, counts) {
|
|
227
|
+
const required = new Set(requiredClassPrivateAccessorRuntimeTraceHashKeys(value, counts));
|
|
228
|
+
return compactRecord({
|
|
229
|
+
classConstructionOrderTraceHash: proof.classConstructionOrderTraceHash,
|
|
230
|
+
privateMemberInitializationTraceHash: required.has('privateMemberInitializationTraceHash') ? proof.privateMemberInitializationTraceHash : undefined,
|
|
231
|
+
privateMemberAccessTraceHash: required.has('privateMemberAccessTraceHash') ? proof.privateMemberAccessTraceHash : undefined,
|
|
232
|
+
privateBrandCheckTraceHash: required.has('privateBrandCheckTraceHash') ? proof.privateBrandCheckTraceHash : undefined,
|
|
233
|
+
privateMethodCallTraceHash: required.has('privateMethodCallTraceHash') ? proof.privateMethodCallTraceHash : undefined,
|
|
234
|
+
privateAccessorGetSetTraceHash: required.has('privateAccessorGetSetTraceHash') ? proof.privateAccessorGetSetTraceHash : undefined,
|
|
235
|
+
staticPrivateMemberAccessTraceHash: required.has('staticPrivateMemberAccessTraceHash') ? proof.staticPrivateMemberAccessTraceHash : undefined,
|
|
236
|
+
subclassPrivateBrandBoundaryTraceHash: required.has('subclassPrivateBrandBoundaryTraceHash') ? proof.subclassPrivateBrandBoundaryTraceHash : undefined,
|
|
237
|
+
accessorInitializationTraceHash: required.has('accessorInitializationTraceHash') ? proof.accessorInitializationTraceHash : undefined,
|
|
238
|
+
accessorGetSetTraceHash: required.has('accessorGetSetTraceHash') ? proof.accessorGetSetTraceHash : undefined,
|
|
239
|
+
accessorDescriptorTraceHash: required.has('accessorDescriptorTraceHash') ? proof.accessorDescriptorTraceHash : undefined
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function classPrivateAccessorRuntimeRequiredSignals(value, counts) {
|
|
244
|
+
return uniqueStrings([
|
|
245
|
+
'compiler-public-api-source-path',
|
|
246
|
+
'compiler-public-api-source-hash',
|
|
247
|
+
counts.privateClassMemberCount > 0 ? 'compiler-private-class-member-count' : undefined,
|
|
248
|
+
counts.privateClassMemberCount > 0 ? 'compiler-private-class-member-shape-hash' : undefined,
|
|
249
|
+
counts.accessorFieldCount > 0 ? 'compiler-accessor-field-count' : undefined,
|
|
250
|
+
counts.accessorFieldCount > 0 ? 'compiler-accessor-field-shape-hash' : undefined,
|
|
251
|
+
...requiredClassPrivateAccessorRuntimeTraceHashKeys(value, counts).map((key) => TraceHashSignalsByKey[key]),
|
|
252
|
+
'runtime-command',
|
|
253
|
+
'runtime-trace-hash',
|
|
254
|
+
'runtime-evidence-hash'
|
|
255
|
+
]);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function classPrivateAccessorRuntimeRequired(counts) {
|
|
259
|
+
return counts.privateClassMemberCount > 0 || counts.accessorFieldCount > 0;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function privateClassMembers(value) { return arrayValue(value.privateClassMembers); }
|
|
263
|
+
function arrayValue(value) { return Array.isArray(value) ? value : []; }
|
|
264
|
+
function objectRecord(value) { return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined; }
|
|
265
|
+
function compactRecord(record) { return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined)); }
|
|
266
|
+
function nonEmptyArray(value) { return Array.isArray(value) && value.length ? value : undefined; }
|
|
267
|
+
function uniqueStrings(values) { return [...new Set(values.filter((value) => typeof value === 'string' && value.length > 0))]; }
|
|
268
|
+
function numberValue(value) { return Number.isFinite(value) ? value : undefined; }
|
|
269
|
+
function stringValue(value) { return value === undefined || value === null || value === '' ? undefined : String(value); }
|
|
270
|
+
function containsAllStrings(actual, expected) {
|
|
271
|
+
const actualSet = new Set(arrayValue(actual).filter((value) => typeof value === 'string' && value.length > 0));
|
|
272
|
+
return expected.every((value) => actualSet.has(value));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export {
|
|
276
|
+
classPrivateAccessorRuntimeHash,
|
|
277
|
+
classPrivateAccessorRuntimeProjection,
|
|
278
|
+
classPrivateAccessorRuntimeProofBinding,
|
|
279
|
+
classPrivateAccessorRuntimeRequiredSignals
|
|
280
|
+
};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { hashSemanticValue } from '@shapeshift-labs/frontier-lang-kernel';
|
|
2
|
+
|
|
3
|
+
const ClassPrivateAccessorShapeProofKind = 'typescript-checker-public-api-class-private-accessor-shape-equivalence';
|
|
4
|
+
|
|
5
|
+
function classShapeSetHashes(value, counts) {
|
|
6
|
+
return compactRecord({
|
|
7
|
+
privateClassMemberSetHash: counts.privateClassMemberCount > 0
|
|
8
|
+
? hashSemanticValue({ kind: 'frontier.lang.typescript.compilerPrivateClassMemberSetEquivalence.v1', privateClassMembers: canonicalMemberRecords(value.privateClassMembers) })
|
|
9
|
+
: undefined,
|
|
10
|
+
accessorFieldSetHash: counts.accessorFieldCount > 0
|
|
11
|
+
? hashSemanticValue({ kind: 'frontier.lang.typescript.compilerAccessorFieldSetEquivalence.v1', accessorFieldMembers: canonicalMemberRecords(value.accessorFieldMembers) })
|
|
12
|
+
: undefined
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function classShapeUnsupportedReasonCodes(counts) {
|
|
17
|
+
return [
|
|
18
|
+
counts.privateClassMemberCount > 0 ? 'typescript-private-class-member-shape-equivalence-unproven' : undefined,
|
|
19
|
+
counts.accessorFieldCount > 0 ? 'typescript-accessor-field-shape-equivalence-unproven' : undefined
|
|
20
|
+
].filter(Boolean);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function classShapeProofKind(counts) {
|
|
24
|
+
return counts.privateClassMemberCount > 0 || counts.accessorFieldCount > 0 ? ClassPrivateAccessorShapeProofKind : undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function classShapeProofLevel(counts) {
|
|
28
|
+
const levels = [];
|
|
29
|
+
if (counts.privateClassMemberCount > 0) levels.push('private-class-member-set');
|
|
30
|
+
if (counts.accessorFieldCount > 0) levels.push('accessor-field-set');
|
|
31
|
+
return levels.length ? levels.join('-and-') : undefined;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function classShapeCheckerInvariant(counts) {
|
|
35
|
+
const invariants = [];
|
|
36
|
+
if (counts.privateClassMemberCount > 0) invariants.push('private class member names/kinds/types complete');
|
|
37
|
+
if (counts.accessorFieldCount > 0) invariants.push('accessor field names/types/modifiers complete');
|
|
38
|
+
return invariants.join('; ');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function classShapeRequiredSignals(counts) {
|
|
42
|
+
return [
|
|
43
|
+
counts.privateClassMemberCount > 0 ? 'compiler-private-class-member-count' : undefined,
|
|
44
|
+
counts.privateClassMemberCount > 0 ? 'compiler-private-class-member-names' : undefined,
|
|
45
|
+
counts.privateClassMemberCount > 0 ? 'compiler-private-class-member-type-or-signature-texts' : undefined,
|
|
46
|
+
counts.privateClassMemberCount > 0 ? 'compiler-private-class-member-shape-hash' : undefined,
|
|
47
|
+
counts.accessorFieldCount > 0 ? 'compiler-accessor-field-count' : undefined,
|
|
48
|
+
counts.accessorFieldCount > 0 ? 'compiler-accessor-field-names' : undefined,
|
|
49
|
+
counts.accessorFieldCount > 0 ? 'compiler-accessor-field-type-texts' : undefined,
|
|
50
|
+
counts.accessorFieldCount > 0 ? 'compiler-accessor-field-shape-hash' : undefined
|
|
51
|
+
].filter(Boolean);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function missingClassShapeEquivalenceSignals(value, counts, checkerEvidence) {
|
|
55
|
+
const missing = [];
|
|
56
|
+
if (counts.privateClassMemberCount > 0 && checkerEvidence.privateClassMemberNames.length !== counts.privateClassMemberCount) missing.push('compiler-private-class-member-count');
|
|
57
|
+
if (counts.privateClassMemberCount > 0 && checkerEvidence.privateClassMemberNames.some((text) => !text)) missing.push('compiler-private-class-member-names');
|
|
58
|
+
if (counts.privateClassMemberCount > 0 && checkerEvidence.privateClassMemberTypeOrSignatureTexts.some((text) => !text)) missing.push('compiler-private-class-member-type-or-signature-texts');
|
|
59
|
+
if (counts.privateClassMemberCount > 0 && !value.privateClassMemberShapeHash) missing.push('compiler-private-class-member-shape-hash');
|
|
60
|
+
if (counts.accessorFieldCount > 0 && checkerEvidence.accessorFieldNames.length !== counts.accessorFieldCount) missing.push('compiler-accessor-field-count');
|
|
61
|
+
if (counts.accessorFieldCount > 0 && checkerEvidence.accessorFieldNames.some((text) => !text)) missing.push('compiler-accessor-field-names');
|
|
62
|
+
if (counts.accessorFieldCount > 0 && checkerEvidence.accessorFieldTypeTexts.some((text) => !text)) missing.push('compiler-accessor-field-type-texts');
|
|
63
|
+
if (counts.accessorFieldCount > 0 && !value.accessorFieldShapeHash) missing.push('compiler-accessor-field-shape-hash');
|
|
64
|
+
return uniqueStrings(missing);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function classShapeCheckerEvidence(value, counts) {
|
|
68
|
+
const privateClassMembers = arrayValue(value.privateClassMembers);
|
|
69
|
+
const accessorFieldMembers = arrayValue(value.accessorFieldMembers);
|
|
70
|
+
return compactRecord({
|
|
71
|
+
privateClassMemberCount: counts.privateClassMemberCount || undefined,
|
|
72
|
+
privateClassMemberNames: privateClassMembers.map((member) => member.name),
|
|
73
|
+
privateClassMemberKinds: privateClassMembers.map((member) => member.kind),
|
|
74
|
+
privateClassMemberTypeOrSignatureTexts: privateClassMembers.map((member) => member.typeText ?? member.signatureText),
|
|
75
|
+
privateClassMemberShapeHash: value.privateClassMemberShapeHash,
|
|
76
|
+
accessorFieldCount: counts.accessorFieldCount || undefined,
|
|
77
|
+
accessorFieldNames: accessorFieldMembers.map((member) => member.name),
|
|
78
|
+
accessorFieldTypeTexts: accessorFieldMembers.map((member) => member.typeText),
|
|
79
|
+
accessorFieldShapeHash: value.accessorFieldShapeHash,
|
|
80
|
+
privateClassMembers: nonEmptyArray(privateClassMembers),
|
|
81
|
+
accessorFieldMembers: nonEmptyArray(accessorFieldMembers)
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function canonicalMemberRecords(records) {
|
|
86
|
+
return arrayValue(records).map(({ memberText: _memberText, ...record }) => record);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function arrayValue(value) { return Array.isArray(value) ? value : []; }
|
|
90
|
+
function compactRecord(record) { return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined)); }
|
|
91
|
+
function nonEmptyArray(value) { return Array.isArray(value) && value.length ? value : undefined; }
|
|
92
|
+
function uniqueStrings(values) { return [...new Set(values.filter((value) => typeof value === 'string' && value.length > 0))]; }
|
|
93
|
+
|
|
94
|
+
export {
|
|
95
|
+
classShapeCheckerEvidence,
|
|
96
|
+
classShapeCheckerInvariant,
|
|
97
|
+
classShapeProofKind,
|
|
98
|
+
classShapeProofLevel,
|
|
99
|
+
classShapeRequiredSignals,
|
|
100
|
+
classShapeSetHashes,
|
|
101
|
+
classShapeUnsupportedReasonCodes,
|
|
102
|
+
missingClassShapeEquivalenceSignals
|
|
103
|
+
};
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { hashSemanticValue } from '@shapeshift-labs/frontier-lang-kernel';
|
|
2
|
+
|
|
3
|
+
const AdvancedTypeShapeEquivalenceProofKind = 'typescript-checker-public-api-advanced-type-shape-unsupported';
|
|
4
|
+
const AdvancedTypeShapeSetEquivalenceProofKind = 'typescript-checker-public-api-advanced-type-shape-set-equivalence';
|
|
5
|
+
const ConditionalTypeEquivalenceProofKind = 'typescript-checker-public-api-conditional-type-shape-equivalence';
|
|
6
|
+
const IndexedAccessTypeEquivalenceProofKind = 'typescript-checker-public-api-indexed-access-type-shape-equivalence';
|
|
7
|
+
const InferTypeEquivalenceProofKind = 'typescript-checker-public-api-infer-type-shape-equivalence';
|
|
8
|
+
const KeyofTypeOperatorEquivalenceProofKind = 'typescript-checker-public-api-keyof-type-operator-shape-equivalence';
|
|
9
|
+
const MappedTypeEquivalenceProofKind = 'typescript-checker-public-api-mapped-type-shape-equivalence';
|
|
10
|
+
const TemplateLiteralTypeEquivalenceProofKind = 'typescript-checker-public-api-template-literal-type-shape-equivalence';
|
|
11
|
+
const UnionTypeEquivalenceProofKind = 'typescript-checker-public-api-union-type-shape-equivalence';
|
|
12
|
+
const IntersectionTypeEquivalenceProofKind = 'typescript-checker-public-api-intersection-type-shape-equivalence';
|
|
13
|
+
const TupleTypeEquivalenceProofKind = 'typescript-checker-public-api-tuple-type-shape-equivalence';
|
|
14
|
+
|
|
15
|
+
const ShapeSpecs = [
|
|
16
|
+
shapeSpec('conditional-type', 'conditionalType', 'conditionalTypeCount', ConditionalTypeEquivalenceProofKind, 'conditional-type-set', 'conditional branch texts complete', 'conditionalTypeSetHash', 'frontier.lang.typescript.compilerConditionalTypeSetEquivalence.v1', 'conditionalTypes', [
|
|
17
|
+
field('nodeText', 'NodeTexts', 'compiler-conditional-type-node-texts'),
|
|
18
|
+
field('typeText', 'TypeTexts', 'compiler-conditional-type-type-texts'),
|
|
19
|
+
field('checkTypeText', 'CheckTypeTexts', 'compiler-conditional-type-check-type-texts'),
|
|
20
|
+
field('extendsTypeText', 'ExtendsTypeTexts', 'compiler-conditional-type-extends-type-texts'),
|
|
21
|
+
field('trueTypeText', 'TrueTypeTexts', 'compiler-conditional-type-true-type-texts'),
|
|
22
|
+
field('falseTypeText', 'FalseTypeTexts', 'compiler-conditional-type-false-type-texts')
|
|
23
|
+
]),
|
|
24
|
+
shapeSpec('indexed-access-type', 'indexedAccessType', 'indexedAccessTypeCount', IndexedAccessTypeEquivalenceProofKind, 'indexed-access-type-set', 'indexed access texts complete', 'indexedAccessTypeSetHash', 'frontier.lang.typescript.compilerIndexedAccessTypeSetEquivalence.v1', 'indexedAccessTypes', [
|
|
25
|
+
field('nodeText', 'NodeTexts', 'compiler-indexed-access-type-node-texts'),
|
|
26
|
+
field('typeText', 'TypeTexts', 'compiler-indexed-access-type-type-texts'),
|
|
27
|
+
field('objectTypeText', 'ObjectTypeTexts', 'compiler-indexed-access-type-object-type-texts'),
|
|
28
|
+
field('indexTypeText', 'IndexTypeTexts', 'compiler-indexed-access-type-index-type-texts')
|
|
29
|
+
]),
|
|
30
|
+
shapeSpec('mapped-type', 'mappedType', 'mappedTypeCount', MappedTypeEquivalenceProofKind, 'mapped-type-set', 'mapped type texts complete', 'mappedTypeSetHash', 'frontier.lang.typescript.compilerMappedTypeSetEquivalence.v1', 'mappedTypes', [
|
|
31
|
+
field('nodeText', 'NodeTexts', 'compiler-mapped-type-node-texts'),
|
|
32
|
+
field('typeText', 'TypeTexts', 'compiler-mapped-type-type-texts'),
|
|
33
|
+
field('mappedConstraintTypeText', 'ConstraintTypeTexts', 'compiler-mapped-type-constraint-type-texts'),
|
|
34
|
+
field('mappedValueTypeText', 'ValueTypeTexts', 'compiler-mapped-type-value-type-texts')
|
|
35
|
+
]),
|
|
36
|
+
shapeSpec('keyof-type-operator', 'keyofTypeOperator', 'keyofTypeOperatorCount', KeyofTypeOperatorEquivalenceProofKind, 'keyof-type-operator-set', 'keyof target texts complete', 'keyofTypeOperatorSetHash', 'frontier.lang.typescript.compilerKeyofTypeOperatorSetEquivalence.v1', 'keyofTypeOperators', [
|
|
37
|
+
field('nodeText', 'NodeTexts', 'compiler-keyof-type-operator-node-texts'),
|
|
38
|
+
field('typeText', 'TypeTexts', 'compiler-keyof-type-operator-type-texts'),
|
|
39
|
+
field('keyofTargetTypeText', 'TargetTypeTexts', 'compiler-keyof-type-operator-target-type-texts')
|
|
40
|
+
]),
|
|
41
|
+
shapeSpec('template-literal-type', 'templateLiteralType', 'templateLiteralTypeCount', TemplateLiteralTypeEquivalenceProofKind, 'template-literal-type-set', 'template literal type span texts complete', 'templateLiteralTypeSetHash', 'frontier.lang.typescript.compilerTemplateLiteralTypeSetEquivalence.v1', 'templateLiteralTypes', [
|
|
42
|
+
field('nodeText', 'NodeTexts', 'compiler-template-literal-type-node-texts'),
|
|
43
|
+
field('typeText', 'TypeTexts', 'compiler-template-literal-type-type-texts'),
|
|
44
|
+
field('templateHeadText', 'HeadTexts', 'compiler-template-literal-type-head-texts'),
|
|
45
|
+
field('templateSpanTexts', 'SpanTexts', 'compiler-template-literal-type-span-texts'),
|
|
46
|
+
field('templateSpanTypeTexts', 'SpanTypeTexts', 'compiler-template-literal-type-span-type-texts'),
|
|
47
|
+
field('templateLiteralTexts', 'LiteralTexts', 'compiler-template-literal-type-literal-texts')
|
|
48
|
+
]),
|
|
49
|
+
shapeSpec('infer-type', 'inferType', 'inferTypeCount', InferTypeEquivalenceProofKind, 'infer-type-set', 'infer type parameter texts complete', 'inferTypeSetHash', 'frontier.lang.typescript.compilerInferTypeSetEquivalence.v1', 'inferTypes', [
|
|
50
|
+
field('nodeText', 'NodeTexts', 'compiler-infer-type-node-texts'),
|
|
51
|
+
field('typeText', 'TypeTexts', 'compiler-infer-type-type-texts'),
|
|
52
|
+
field('typeParameterText', 'TypeParameterTexts', 'compiler-infer-type-type-parameter-texts'),
|
|
53
|
+
field('typeParameterName', 'TypeParameterNames', 'compiler-infer-type-type-parameter-names')
|
|
54
|
+
]),
|
|
55
|
+
shapeSpec('union-type', 'unionType', 'unionTypeCount', UnionTypeEquivalenceProofKind, 'union-type-set', 'union member type texts complete', 'unionTypeSetHash', 'frontier.lang.typescript.compilerUnionTypeSetEquivalence.v1', 'unionTypes', [
|
|
56
|
+
field('nodeText', 'NodeTexts', 'compiler-union-type-node-texts'),
|
|
57
|
+
field('typeText', 'TypeTexts', 'compiler-union-type-type-texts'),
|
|
58
|
+
field('memberTypeTexts', 'MemberTypeTexts', 'compiler-union-type-member-type-texts')
|
|
59
|
+
]),
|
|
60
|
+
shapeSpec('intersection-type', 'intersectionType', 'intersectionTypeCount', IntersectionTypeEquivalenceProofKind, 'intersection-type-set', 'intersection member type texts complete', 'intersectionTypeSetHash', 'frontier.lang.typescript.compilerIntersectionTypeSetEquivalence.v1', 'intersectionTypes', [
|
|
61
|
+
field('nodeText', 'NodeTexts', 'compiler-intersection-type-node-texts'),
|
|
62
|
+
field('typeText', 'TypeTexts', 'compiler-intersection-type-type-texts'),
|
|
63
|
+
field('memberTypeTexts', 'MemberTypeTexts', 'compiler-intersection-type-member-type-texts')
|
|
64
|
+
]),
|
|
65
|
+
shapeSpec('tuple-type', 'tupleType', 'tupleTypeCount', TupleTypeEquivalenceProofKind, 'tuple-type-set', 'tuple element texts complete', 'tupleTypeSetHash', 'frontier.lang.typescript.compilerTupleTypeSetEquivalence.v1', 'tupleTypes', [
|
|
66
|
+
field('nodeText', 'NodeTexts', 'compiler-tuple-type-node-texts'),
|
|
67
|
+
field('typeText', 'TypeTexts', 'compiler-tuple-type-type-texts'),
|
|
68
|
+
field('tupleElementTexts', 'ElementTexts', 'compiler-tuple-type-element-texts'),
|
|
69
|
+
field('tupleElementTypeTexts', 'ElementTypeTexts', 'compiler-tuple-type-element-type-texts')
|
|
70
|
+
])
|
|
71
|
+
];
|
|
72
|
+
const ShapeSpecByKind = new Map(ShapeSpecs.map((spec) => [spec.kind, spec]));
|
|
73
|
+
|
|
74
|
+
function advancedTypeSetHashes(value, counts) {
|
|
75
|
+
return compactRecord(Object.fromEntries(ShapeSpecs.map((spec) => [spec.hashKey, shapeSetHash(value, counts, spec)])));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function advancedTypeProofKind(counts) {
|
|
79
|
+
const spec = soleEligibleSpec(counts);
|
|
80
|
+
if (spec) return spec.proofKind;
|
|
81
|
+
if (counts.advancedTypeShapeCount > 0 && !advancedTypeUnsupportedReasonCodes(counts).length) return AdvancedTypeShapeSetEquivalenceProofKind;
|
|
82
|
+
return counts.advancedTypeShapeCount > 0 ? AdvancedTypeShapeEquivalenceProofKind : undefined;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function advancedTypeProofLevel(counts) {
|
|
86
|
+
const spec = soleEligibleSpec(counts);
|
|
87
|
+
if (spec) return spec.proofLevel;
|
|
88
|
+
if (counts.advancedTypeShapeCount > 0 && !advancedTypeUnsupportedReasonCodes(counts).length) return 'advanced-type-shape-set';
|
|
89
|
+
return counts.advancedTypeShapeCount > 0 ? 'advanced-type-shape-fail-closed' : undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function advancedTypeCheckerInvariant(counts) {
|
|
93
|
+
const spec = soleEligibleSpec(counts);
|
|
94
|
+
if (spec) return spec.invariant;
|
|
95
|
+
if (counts.advancedTypeShapeCount > 0 && !advancedTypeUnsupportedReasonCodes(counts).length) return 'advanced type shape texts complete';
|
|
96
|
+
return counts.advancedTypeShapeCount > 0 ? 'unsupported shapes fail closed' : undefined;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function advancedTypeRequiredSignals(counts) { return ShapeSpecs.flatMap((spec) => shapeRequiredSignals(counts, spec)); }
|
|
100
|
+
function missingAdvancedTypeEquivalenceSignals(value, counts) { return uniqueStrings(ShapeSpecs.flatMap((spec) => missingShapeEquivalenceSignals(value, counts, spec))); }
|
|
101
|
+
function advancedTypeCheckerEvidence(value) { return compactRecord(Object.assign({}, ...ShapeSpecs.map((spec) => shapeEvidenceForSpec(value, spec)))); }
|
|
102
|
+
function advancedTypeUnsupportedReasonCodes(counts) {
|
|
103
|
+
return counts.advancedTypeShapeCount > knownAdvancedTypeShapeCount(counts)
|
|
104
|
+
? ['typescript-unknown-advanced-type-shape-public-api-equivalence-unsupported']
|
|
105
|
+
: [];
|
|
106
|
+
}
|
|
107
|
+
function advancedTypeUnsupportedSignals(counts) {
|
|
108
|
+
return advancedTypeUnsupportedReasonCodes(counts).map((reasonCode) => reasonCode.replace(/^typescript-/, '').replace(/-unsupported$/, ''));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function isConditionalTypeEquivalenceEligible(counts) { return soleEligibleKind(counts, 'conditional-type'); }
|
|
112
|
+
function isIndexedAccessTypeEquivalenceEligible(counts) { return soleEligibleKind(counts, 'indexed-access-type'); }
|
|
113
|
+
function isMappedTypeEquivalenceEligible(counts) { return soleEligibleKind(counts, 'mapped-type'); }
|
|
114
|
+
function isKeyofTypeOperatorEquivalenceEligible(counts) { return soleEligibleKind(counts, 'keyof-type-operator'); }
|
|
115
|
+
function isTemplateLiteralTypeEquivalenceEligible(counts) { return soleEligibleKind(counts, 'template-literal-type'); }
|
|
116
|
+
function isInferTypeEquivalenceEligible(counts) { return soleEligibleKind(counts, 'infer-type'); }
|
|
117
|
+
|
|
118
|
+
function conditionalTypeSetHash(value, counts) { return shapeSetHash(value, counts, specFor('conditional-type')); }
|
|
119
|
+
function indexedAccessTypeSetHash(value, counts) { return shapeSetHash(value, counts, specFor('indexed-access-type')); }
|
|
120
|
+
function mappedTypeSetHash(value, counts) { return shapeSetHash(value, counts, specFor('mapped-type')); }
|
|
121
|
+
function keyofTypeOperatorSetHash(value, counts) { return shapeSetHash(value, counts, specFor('keyof-type-operator')); }
|
|
122
|
+
function templateLiteralTypeSetHash(value, counts) { return shapeSetHash(value, counts, specFor('template-literal-type')); }
|
|
123
|
+
function inferTypeSetHash(value, counts) { return shapeSetHash(value, counts, specFor('infer-type')); }
|
|
124
|
+
|
|
125
|
+
function conditionalTypeRequiredSignals(counts) { return shapeRequiredSignals(counts, specFor('conditional-type')); }
|
|
126
|
+
function indexedAccessTypeRequiredSignals(counts) { return shapeRequiredSignals(counts, specFor('indexed-access-type')); }
|
|
127
|
+
function mappedTypeRequiredSignals(counts) { return shapeRequiredSignals(counts, specFor('mapped-type')); }
|
|
128
|
+
function keyofTypeOperatorRequiredSignals(counts) { return shapeRequiredSignals(counts, specFor('keyof-type-operator')); }
|
|
129
|
+
function templateLiteralTypeRequiredSignals(counts) { return shapeRequiredSignals(counts, specFor('template-literal-type')); }
|
|
130
|
+
function inferTypeRequiredSignals(counts) { return shapeRequiredSignals(counts, specFor('infer-type')); }
|
|
131
|
+
|
|
132
|
+
function missingConditionalTypeEquivalenceSignals(value, counts) { return missingShapeEquivalenceSignals(value, counts, specFor('conditional-type')); }
|
|
133
|
+
function missingIndexedAccessTypeEquivalenceSignals(value, counts) { return missingShapeEquivalenceSignals(value, counts, specFor('indexed-access-type')); }
|
|
134
|
+
function missingMappedTypeEquivalenceSignals(value, counts) { return missingShapeEquivalenceSignals(value, counts, specFor('mapped-type')); }
|
|
135
|
+
function missingKeyofTypeOperatorEquivalenceSignals(value, counts) { return missingShapeEquivalenceSignals(value, counts, specFor('keyof-type-operator')); }
|
|
136
|
+
function missingTemplateLiteralTypeEquivalenceSignals(value, counts) { return missingShapeEquivalenceSignals(value, counts, specFor('template-literal-type')); }
|
|
137
|
+
function missingInferTypeEquivalenceSignals(value, counts) { return missingShapeEquivalenceSignals(value, counts, specFor('infer-type')); }
|
|
138
|
+
|
|
139
|
+
function conditionalTypeCheckerEvidence(value) { return shapeEvidenceForSpec(value, specFor('conditional-type')); }
|
|
140
|
+
function indexedAccessTypeCheckerEvidence(value) { return shapeEvidenceForSpec(value, specFor('indexed-access-type')); }
|
|
141
|
+
function mappedTypeCheckerEvidence(value) { return shapeEvidenceForSpec(value, specFor('mapped-type')); }
|
|
142
|
+
function keyofTypeOperatorCheckerEvidence(value) { return shapeEvidenceForSpec(value, specFor('keyof-type-operator')); }
|
|
143
|
+
function templateLiteralTypeCheckerEvidence(value) { return shapeEvidenceForSpec(value, specFor('template-literal-type')); }
|
|
144
|
+
function inferTypeCheckerEvidence(value) { return shapeEvidenceForSpec(value, specFor('infer-type')); }
|
|
145
|
+
|
|
146
|
+
function shapeSetHash(value, counts, spec) {
|
|
147
|
+
if (!counts[spec.countKey] || missingShapeEquivalenceSignals(value, counts, spec).length) return undefined;
|
|
148
|
+
return hashSemanticValue({ kind: spec.hashKind, [spec.hashArrayKey]: shapesOfKind(value, spec.kind).map((shape) => canonicalShape(shape, spec)) });
|
|
149
|
+
}
|
|
150
|
+
function shapeRequiredSignals(counts, spec) { return counts[spec.countKey] ? [spec.countSignal, ...spec.fields.map((item) => item.signal)] : []; }
|
|
151
|
+
function missingShapeEquivalenceSignals(value, counts, spec) {
|
|
152
|
+
if (!counts[spec.countKey]) return [];
|
|
153
|
+
return missingShapeSignals(shapesOfKind(value, spec.kind), counts[spec.countKey], spec.fields, spec.countSignal);
|
|
154
|
+
}
|
|
155
|
+
function missingShapeSignals(shapes, count, fields, countSignal) {
|
|
156
|
+
const missing = [];
|
|
157
|
+
if (shapes.length !== count) missing.push(countSignal);
|
|
158
|
+
for (const item of fields) if (shapes.some((shape) => fieldMissing(shape?.[item.key]))) missing.push(item.signal);
|
|
159
|
+
return uniqueStrings(missing);
|
|
160
|
+
}
|
|
161
|
+
function fieldMissing(value) {
|
|
162
|
+
if (Array.isArray(value)) return !value.length || value.some((item) => item === undefined || item === null);
|
|
163
|
+
return value === undefined || value === null;
|
|
164
|
+
}
|
|
165
|
+
function shapeEvidenceForSpec(value, spec) {
|
|
166
|
+
const shapes = shapesOfKind(value, spec.kind);
|
|
167
|
+
if (!shapes.length) return {};
|
|
168
|
+
return Object.fromEntries(spec.fields.map((item) => [
|
|
169
|
+
`${spec.evidencePrefix}${item.evidenceSuffix}`,
|
|
170
|
+
shapes.map((shape) => shape[item.key]).filter((fieldValue) => fieldValue !== undefined && fieldValue !== null)
|
|
171
|
+
]));
|
|
172
|
+
}
|
|
173
|
+
function canonicalShape(shape, spec) { return Object.fromEntries(['kind', ...spec.fields.map((item) => item.key)].map((key) => [key, shape?.[key]])); }
|
|
174
|
+
function soleEligibleSpec(counts) {
|
|
175
|
+
if (!counts.advancedTypeShapeCount) return undefined;
|
|
176
|
+
return ShapeSpecs.find((spec) => counts[spec.countKey] === counts.advancedTypeShapeCount && ShapeSpecs.every((other) => other === spec || !counts[other.countKey]));
|
|
177
|
+
}
|
|
178
|
+
function soleEligibleKind(counts, kind) { return soleEligibleSpec(counts)?.kind === kind; }
|
|
179
|
+
function shapesOfKind(value, kind) { return arrayValue(value.advancedTypeShapes).filter((shape) => shape?.kind === kind); }
|
|
180
|
+
function knownAdvancedTypeShapeCount(counts) { return ShapeSpecs.reduce((sum, spec) => sum + (counts[spec.countKey] || 0), 0); }
|
|
181
|
+
function specFor(kind) { return ShapeSpecByKind.get(kind); }
|
|
182
|
+
function shapeSpec(kind, evidencePrefix, countKey, proofKind, proofLevel, invariant, hashKey, hashKind, hashArrayKey, fields) {
|
|
183
|
+
return { kind, evidencePrefix, countKey, countSignal: countSignal(kind), proofKind, proofLevel, invariant, hashKey, hashKind, hashArrayKey, fields };
|
|
184
|
+
}
|
|
185
|
+
function countSignal(kind) { return `compiler-${kind}-count`; }
|
|
186
|
+
function field(key, evidenceSuffix, signal) { return { key, evidenceSuffix, signal }; }
|
|
187
|
+
function arrayValue(value) { return Array.isArray(value) ? value : []; }
|
|
188
|
+
function compactRecord(record) { return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined)); }
|
|
189
|
+
function uniqueStrings(values) { return [...new Set(values.filter((value) => typeof value === 'string' && value.length > 0))]; }
|
|
190
|
+
|
|
191
|
+
export {
|
|
192
|
+
AdvancedTypeShapeEquivalenceProofKind,
|
|
193
|
+
AdvancedTypeShapeSetEquivalenceProofKind,
|
|
194
|
+
ConditionalTypeEquivalenceProofKind,
|
|
195
|
+
IndexedAccessTypeEquivalenceProofKind,
|
|
196
|
+
InferTypeEquivalenceProofKind,
|
|
197
|
+
KeyofTypeOperatorEquivalenceProofKind,
|
|
198
|
+
MappedTypeEquivalenceProofKind,
|
|
199
|
+
TemplateLiteralTypeEquivalenceProofKind,
|
|
200
|
+
TupleTypeEquivalenceProofKind,
|
|
201
|
+
UnionTypeEquivalenceProofKind,
|
|
202
|
+
IntersectionTypeEquivalenceProofKind,
|
|
203
|
+
advancedTypeCheckerEvidence,
|
|
204
|
+
advancedTypeCheckerInvariant,
|
|
205
|
+
advancedTypeProofKind,
|
|
206
|
+
advancedTypeProofLevel,
|
|
207
|
+
advancedTypeRequiredSignals,
|
|
208
|
+
advancedTypeSetHashes,
|
|
209
|
+
advancedTypeUnsupportedReasonCodes,
|
|
210
|
+
advancedTypeUnsupportedSignals,
|
|
211
|
+
conditionalTypeCheckerEvidence,
|
|
212
|
+
conditionalTypeRequiredSignals,
|
|
213
|
+
conditionalTypeSetHash,
|
|
214
|
+
indexedAccessTypeCheckerEvidence,
|
|
215
|
+
indexedAccessTypeRequiredSignals,
|
|
216
|
+
indexedAccessTypeSetHash,
|
|
217
|
+
inferTypeCheckerEvidence,
|
|
218
|
+
inferTypeRequiredSignals,
|
|
219
|
+
inferTypeSetHash,
|
|
220
|
+
isConditionalTypeEquivalenceEligible,
|
|
221
|
+
isIndexedAccessTypeEquivalenceEligible,
|
|
222
|
+
isInferTypeEquivalenceEligible,
|
|
223
|
+
isKeyofTypeOperatorEquivalenceEligible,
|
|
224
|
+
isMappedTypeEquivalenceEligible,
|
|
225
|
+
isTemplateLiteralTypeEquivalenceEligible,
|
|
226
|
+
keyofTypeOperatorCheckerEvidence,
|
|
227
|
+
keyofTypeOperatorRequiredSignals,
|
|
228
|
+
keyofTypeOperatorSetHash,
|
|
229
|
+
mappedTypeCheckerEvidence,
|
|
230
|
+
mappedTypeRequiredSignals,
|
|
231
|
+
mappedTypeSetHash,
|
|
232
|
+
missingAdvancedTypeEquivalenceSignals,
|
|
233
|
+
missingConditionalTypeEquivalenceSignals,
|
|
234
|
+
missingIndexedAccessTypeEquivalenceSignals,
|
|
235
|
+
missingInferTypeEquivalenceSignals,
|
|
236
|
+
missingKeyofTypeOperatorEquivalenceSignals,
|
|
237
|
+
missingMappedTypeEquivalenceSignals,
|
|
238
|
+
missingTemplateLiteralTypeEquivalenceSignals,
|
|
239
|
+
templateLiteralTypeCheckerEvidence,
|
|
240
|
+
templateLiteralTypeRequiredSignals,
|
|
241
|
+
templateLiteralTypeSetHash
|
|
242
|
+
};
|