@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.
Files changed (276) hide show
  1. package/README.md +315 -9
  2. package/bench/real-repo-corpus-checkout-identity.mjs +134 -0
  3. package/bench/real-repo-corpus-checkout-proof.mjs +263 -0
  4. package/bench/real-repo-corpus-command-execution.mjs +314 -0
  5. package/bench/real-repo-corpus-evidence.mjs +165 -0
  6. package/bench/real-repo-corpus-suite.mjs +273 -0
  7. package/bench/smoke.mjs +109 -7
  8. package/dist/declarations/import-adapter-core.d.ts +4 -3
  9. package/dist/declarations/import-adapter-options-native.d.ts +21 -0
  10. package/dist/declarations/js-ts-project-merge-admission-routes.d.ts +35 -0
  11. package/dist/declarations/js-ts-project-merge-commonjs-interop.d.ts +29 -0
  12. package/dist/declarations/js-ts-project-merge-confidence.d.ts +64 -0
  13. package/dist/declarations/js-ts-project-merge-declaration-emit-parity.d.ts +37 -0
  14. package/dist/declarations/js-ts-project-merge-declarations.d.ts +65 -0
  15. package/dist/declarations/js-ts-project-merge-diagnostics.d.ts +97 -0
  16. package/dist/declarations/js-ts-project-merge-global-augmentation.d.ts +30 -0
  17. package/dist/declarations/js-ts-project-merge-jsx-render-branch.d.ts +48 -0
  18. package/dist/declarations/js-ts-project-merge-proof-levels.d.ts +109 -0
  19. package/dist/declarations/js-ts-project-merge-quality-gates.d.ts +38 -0
  20. package/dist/declarations/js-ts-project-merge-semantic-equivalence-proof.d.ts +45 -0
  21. package/dist/declarations/js-ts-project-merge-tsconfig.d.ts +43 -0
  22. package/dist/declarations/js-ts-safe-merge.d.ts +47 -0
  23. package/dist/declarations/js-ts-safe-project-merge.d.ts +120 -38
  24. package/dist/declarations/native-project-compiler-assignability-oracle.d.ts +41 -0
  25. package/dist/declarations/native-project-compiler-callable-signatures.d.ts +31 -0
  26. package/dist/declarations/native-project-compiler-class-member-runtime-proof.d.ts +87 -0
  27. package/dist/declarations/native-project-compiler-composite-types.d.ts +23 -0
  28. package/dist/declarations/native-project-compiler-enum-proof.d.ts +58 -0
  29. package/dist/declarations/native-project-compiler-index-signature.d.ts +7 -0
  30. package/dist/declarations/native-project-compiler-public-api-source-binding.d.ts +8 -0
  31. package/dist/declarations/native-project-compiler-scope.d.ts +37 -0
  32. package/dist/declarations/native-project-compiler-type-reference-targets.d.ts +38 -0
  33. package/dist/declarations/native-project-css-modules.d.ts +90 -0
  34. package/dist/declarations/native-project-decorator-metadata.d.ts +126 -0
  35. package/dist/declarations/native-project-jsx-graph.d.ts +313 -0
  36. package/dist/declarations/native-project-module-declarations.d.ts +52 -0
  37. package/dist/declarations/native-project-module-resolution.d.ts +76 -1
  38. package/dist/declarations/native-project-runtime-effect-target.d.ts +29 -0
  39. package/dist/declarations/native-project-runtime-executable-effect-evidence.d.ts +107 -0
  40. package/dist/declarations/native-project-runtime-mutation-target.d.ts +33 -0
  41. package/dist/declarations/native-project-runtime-promise-chain.d.ts +30 -0
  42. package/dist/declarations/native-project-runtime-promise-combinator.d.ts +22 -0
  43. package/dist/declarations/native-project-runtime-reachability.d.ts +30 -0
  44. package/dist/declarations/native-project-runtime-resource-management.d.ts +27 -0
  45. package/dist/declarations/native-project-runtime-yield-delegation.d.ts +10 -0
  46. package/dist/declarations/native-project-scope-template-reference.d.ts +13 -0
  47. package/dist/declarations/native-project-source-evidence.d.ts +8 -0
  48. package/dist/declarations/native-project.d.ts +40 -39
  49. package/dist/declarations/semantic-edit-script.d.ts +10 -8
  50. package/dist/declarations/semantic-graph-layers.d.ts +79 -0
  51. package/dist/declarations/semantic-sidecar.d.ts +3 -2
  52. package/dist/declarations/semantic-structural-diff.d.ts +94 -0
  53. package/dist/declarations/source-preservation.d.ts +32 -1
  54. package/dist/declarations/target-adapters.d.ts +22 -2
  55. package/dist/index.d.ts +31 -0
  56. package/dist/index.js +5 -0
  57. package/dist/internal/index-impl/compileNativeSource.js +53 -5
  58. package/dist/internal/index-impl/createLightweightNativeImport.js +58 -4
  59. package/dist/internal/index-impl/createNativeImportFromSyntaxAst.js +17 -1
  60. package/dist/internal/index-impl/createNativeImportFromTypeScriptAst.js +28 -4
  61. package/dist/internal/index-impl/createNativeProjectImportResult.js +31 -27
  62. package/dist/internal/index-impl/createNativeProjectModuleResolutionFromPackageManifests.js +145 -0
  63. package/dist/internal/index-impl/createNativeSourcePreservation.js +34 -7
  64. package/dist/internal/index-impl/createSemanticImportSidecar.js +27 -1
  65. package/dist/internal/index-impl/createTypeScriptCompilerNativeImporterAdapter.js +16 -5
  66. package/dist/internal/index-impl/dynamicImportExpressionMetadata.js +80 -0
  67. package/dist/internal/index-impl/importMetaUrlDependencyMetadata.js +176 -0
  68. package/dist/internal/index-impl/importNativeSource.js +2 -3
  69. package/dist/internal/index-impl/moduleImportAttributeMetadata.js +232 -0
  70. package/dist/internal/index-impl/projectSemanticEditScriptToSource.js +8 -1
  71. package/dist/internal/index-impl/projectSymbolGraphClassStaticBlocks.js +148 -0
  72. package/dist/internal/index-impl/projectSymbolGraphCompilerAdvancedTypeMetadata.js +45 -0
  73. package/dist/internal/index-impl/projectSymbolGraphCompilerCallableSignatureEquivalence.js +107 -0
  74. package/dist/internal/index-impl/projectSymbolGraphCompilerClassPrivateAccessorRuntimeProof.js +280 -0
  75. package/dist/internal/index-impl/projectSymbolGraphCompilerClassShapeEquivalence.js +103 -0
  76. package/dist/internal/index-impl/projectSymbolGraphCompilerConditionalTypeEquivalence.js +242 -0
  77. package/dist/internal/index-impl/projectSymbolGraphCompilerDecoratorRuntimeProof.js +197 -0
  78. package/dist/internal/index-impl/projectSymbolGraphCompilerEnumEquivalence.js +188 -0
  79. package/dist/internal/index-impl/projectSymbolGraphCompilerFacts.js +244 -0
  80. package/dist/internal/index-impl/projectSymbolGraphCompilerIndexSignatureEquivalence.js +58 -0
  81. package/dist/internal/index-impl/projectSymbolGraphCompilerMetadata.js +168 -0
  82. package/dist/internal/index-impl/projectSymbolGraphCompilerTypeEquivalence.js +199 -0
  83. package/dist/internal/index-impl/projectSymbolGraphCompilerTypeEquivalenceProof.js +204 -0
  84. package/dist/internal/index-impl/projectSymbolGraphCompilerTypeReferenceTargetEquivalence.js +99 -0
  85. package/dist/internal/index-impl/projectSymbolGraphCssModuleRecords.js +264 -0
  86. package/dist/internal/index-impl/projectSymbolGraphCssModuleScanners.js +242 -0
  87. package/dist/internal/index-impl/projectSymbolGraphCssModuleUtils.js +152 -0
  88. package/dist/internal/index-impl/projectSymbolGraphCssModules.js +82 -0
  89. package/dist/internal/index-impl/projectSymbolGraphJsxComponentImports.js +170 -0
  90. package/dist/internal/index-impl/projectSymbolGraphJsxComponentProviderLookup.js +167 -0
  91. package/dist/internal/index-impl/projectSymbolGraphJsxComponentWrappers.js +150 -0
  92. package/dist/internal/index-impl/projectSymbolGraphJsxContextTargets.js +71 -0
  93. package/dist/internal/index-impl/projectSymbolGraphJsxContextValues.js +212 -0
  94. package/dist/internal/index-impl/projectSymbolGraphJsxEventHandlers.js +172 -0
  95. package/dist/internal/index-impl/projectSymbolGraphJsxHookEffects.js +124 -0
  96. package/dist/internal/index-impl/projectSymbolGraphJsxHooks.js +281 -0
  97. package/dist/internal/index-impl/projectSymbolGraphJsxMemberComponents.js +139 -0
  98. package/dist/internal/index-impl/projectSymbolGraphJsxPropFlows.js +320 -0
  99. package/dist/internal/index-impl/projectSymbolGraphJsxPropValues.js +145 -0
  100. package/dist/internal/index-impl/projectSymbolGraphJsxProviderFlows.js +133 -0
  101. package/dist/internal/index-impl/projectSymbolGraphJsxRecords.js +315 -0
  102. package/dist/internal/index-impl/projectSymbolGraphJsxRenderCollections.js +155 -0
  103. package/dist/internal/index-impl/projectSymbolGraphJsxRenderReturns.js +291 -0
  104. package/dist/internal/index-impl/projectSymbolGraphJsxRenderRisk.js +279 -0
  105. package/dist/internal/index-impl/projectSymbolGraphModuleDeclarationShapes.js +138 -0
  106. package/dist/internal/index-impl/projectSymbolGraphModuleResolution.js +89 -87
  107. package/dist/internal/index-impl/projectSymbolGraphPackageConditions.js +314 -0
  108. package/dist/internal/index-impl/projectSymbolGraphReExportImportTargets.js +43 -0
  109. package/dist/internal/index-impl/projectSymbolGraphReExports.js +55 -1
  110. package/dist/internal/index-impl/projectSymbolGraphRuntimeRegions.js +108 -0
  111. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefAliases.js +307 -0
  112. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefLexical.js +320 -0
  113. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefOwners.js +50 -0
  114. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefRecordBuilders.js +112 -0
  115. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefRecords.js +238 -0
  116. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefStructural.js +104 -0
  117. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefStructuralNormalize.js +242 -0
  118. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefUseHashes.js +107 -0
  119. package/dist/internal/index-impl/projectSymbolGraphSourceMapGeneratedBoundary.js +111 -0
  120. package/dist/internal/index-impl/projectSymbolGraphSourceRecords.js +268 -0
  121. package/dist/internal/index-impl/projectSymbolGraphSourceRecordsOwnership.js +309 -0
  122. package/dist/internal/index-impl/replaySemanticEditProjection.js +53 -39
  123. package/dist/internal/index-impl/runtimeOrderEvidenceBinding.js +151 -0
  124. package/dist/internal/index-impl/runtimeOrderProofSurfaces.js +253 -0
  125. package/dist/internal/index-impl/semanticEditCallsiteArgumentMerge.js +319 -0
  126. package/dist/internal/index-impl/semanticEditExplicitSourceReplacement.js +7 -2
  127. package/dist/internal/index-impl/semanticEditProjectionRecord.js +8 -0
  128. package/dist/internal/index-impl/semanticEditReplayDiagnostics.js +7 -2
  129. package/dist/internal/index-impl/semanticEditReplayOutputBinding.js +61 -0
  130. package/dist/internal/index-impl/semanticEditReplayRerunRoute.js +27 -0
  131. package/dist/internal/index-impl/semanticEditReplaySourceReplacement.js +6 -1
  132. package/dist/internal/index-impl/semanticEditRuntimeOrderReasons.js +320 -0
  133. package/dist/internal/index-impl/semanticEditScriptClassification.js +90 -5
  134. package/dist/internal/index-impl/semanticEditScripts.js +42 -5
  135. package/dist/internal/index-impl/semanticEditTypeSyntaxReasons.js +134 -0
  136. package/dist/internal/index-impl/semanticIndexFromNativeDeclarations.js +11 -5
  137. package/dist/internal/index-impl/semanticStructuralDiffRecords.js +150 -0
  138. package/dist/internal/index-impl/sourceMapGeneratedBoundaryGate.js +185 -0
  139. package/dist/internal/index-impl/staticMemberLiteral.js +31 -0
  140. package/dist/internal/index-impl/staticOptionalMemberReference.js +22 -0
  141. package/dist/internal/index-impl/syntaxAstSourcePreservation.js +273 -0
  142. package/dist/internal/index-impl/syntaxCommonJsModuleDeclarationEntries.js +297 -0
  143. package/dist/internal/index-impl/syntaxModuleDeclarationEntries.js +56 -132
  144. package/dist/internal/index-impl/syntaxModuleEntryRecords.js +160 -0
  145. package/dist/internal/index-impl/typeScriptCompilerAdvancedTypeShapes.js +160 -0
  146. package/dist/internal/index-impl/typeScriptCompilerAssignabilityOracle.js +97 -0
  147. package/dist/internal/index-impl/typeScriptCompilerClassApi.js +238 -0
  148. package/dist/internal/index-impl/typeScriptCompilerDecoratorMetadata.js +290 -0
  149. package/dist/internal/index-impl/typeScriptCompilerEnumShape.js +279 -0
  150. package/dist/internal/index-impl/typeScriptCompilerFacts.js +294 -0
  151. package/dist/internal/index-impl/typeScriptCompilerInferenceSyntax.js +170 -0
  152. package/dist/internal/index-impl/typeScriptCompilerReferenceGraph.js +186 -0
  153. package/dist/internal/index-impl/typeScriptCompilerSymbolIdentity.js +294 -0
  154. package/dist/internal/index-impl/typeScriptCompilerTypeReferenceTargets.js +142 -0
  155. package/dist/internal/index-impl/typeScriptDeclaration.js +10 -38
  156. package/dist/internal/index-impl/typeScriptModuleDeclarationEntries.js +52 -15
  157. package/dist/internal/index-impl/typeScriptSourceFilePreservation.js +296 -0
  158. package/dist/js-ts-safe-member-class-invariants.js +247 -0
  159. package/dist/js-ts-safe-member-merge-result.js +23 -3
  160. package/dist/js-ts-safe-member-merge.js +28 -4
  161. package/dist/js-ts-safe-merge-binding-patterns.js +170 -0
  162. package/dist/js-ts-safe-merge-jsx-attribute-fallback.js +151 -157
  163. package/dist/js-ts-safe-merge-jsx-attribute-parser.js +277 -0
  164. package/dist/js-ts-safe-merge-jsx-child-expression-fallback.js +161 -0
  165. package/dist/js-ts-safe-merge-jsx-child-expression-merge.js +319 -0
  166. package/dist/js-ts-safe-merge-jsx-child-expression-parser.js +300 -0
  167. package/dist/js-ts-safe-merge-parse-declarations.js +46 -2
  168. package/dist/js-ts-safe-merge-parse-statements.js +8 -0
  169. package/dist/js-ts-safe-merge-semantic-edit-fallback.js +13 -5
  170. package/dist/js-ts-safe-merge-source-shape-fallbacks.js +3 -1
  171. package/dist/js-ts-safe-merge-top-level-rename-fallback.js +31 -5
  172. package/dist/js-ts-safe-merge-top-level-rename-result.js +7 -2
  173. package/dist/js-ts-safe-merge-variable-declarator-fallback.js +124 -6
  174. package/dist/js-ts-safe-merge-variable-declarator-parser.js +34 -4
  175. package/dist/js-ts-safe-merge.js +136 -0
  176. package/dist/js-ts-safe-project-merge-admission-routes.js +216 -0
  177. package/dist/js-ts-safe-project-merge-admission.js +161 -0
  178. package/dist/js-ts-safe-project-merge-ambient.js +110 -0
  179. package/dist/js-ts-safe-project-merge-core.js +85 -0
  180. package/dist/js-ts-safe-project-merge-css-module-conflicts.js +60 -0
  181. package/dist/js-ts-safe-project-merge-declaration-emit-parity.js +186 -0
  182. package/dist/js-ts-safe-project-merge-declarations.js +227 -0
  183. package/dist/js-ts-safe-project-merge-diagnostics-metadata.js +42 -0
  184. package/dist/js-ts-safe-project-merge-diagnostics-ts.js +73 -0
  185. package/dist/js-ts-safe-project-merge-diagnostics.js +283 -0
  186. package/dist/js-ts-safe-project-merge-evidence-routing.js +38 -0
  187. package/dist/js-ts-safe-project-merge-files.js +70 -0
  188. package/dist/js-ts-safe-project-merge-global-augmentation-compatibility.js +99 -0
  189. package/dist/js-ts-safe-project-merge-graph-conflicts.js +90 -2
  190. package/dist/js-ts-safe-project-merge-graph-delta-commonjs-interop.js +108 -0
  191. package/dist/js-ts-safe-project-merge-graph-delta-compiler-conflicts.js +179 -0
  192. package/dist/js-ts-safe-project-merge-graph-delta-compiler-details.js +189 -0
  193. package/dist/js-ts-safe-project-merge-graph-delta-conflicts.js +51 -184
  194. package/dist/js-ts-safe-project-merge-graph-delta-identity-conflicts.js +202 -0
  195. package/dist/js-ts-safe-project-merge-graph-delta-inference-syntax.js +80 -0
  196. package/dist/js-ts-safe-project-merge-graph-delta-module-declarations.js +155 -0
  197. package/dist/js-ts-safe-project-merge-graph-limits.js +16 -1
  198. package/dist/js-ts-safe-project-merge-graph.js +37 -5
  199. package/dist/js-ts-safe-project-merge-import-removal.js +292 -0
  200. package/dist/js-ts-safe-project-merge-jsx-graph-conflict-details.js +235 -0
  201. package/dist/js-ts-safe-project-merge-jsx-graph-conflicts.js +173 -0
  202. package/dist/js-ts-safe-project-merge-jsx-prop-contracts.js +86 -0
  203. package/dist/js-ts-safe-project-merge-jsx-render-branch-proof.js +189 -0
  204. package/dist/js-ts-safe-project-merge-missing-evidence.js +310 -0
  205. package/dist/js-ts-safe-project-merge-move-rename.js +209 -0
  206. package/dist/js-ts-safe-project-merge-proof-conflicts.js +44 -0
  207. package/dist/js-ts-safe-project-merge-proof-levels.js +320 -0
  208. package/dist/js-ts-safe-project-merge-quality-gates.js +140 -0
  209. package/dist/js-ts-safe-project-merge-routing-calibration.js +125 -0
  210. package/dist/js-ts-safe-project-merge-runtime-region-conflicts.js +156 -0
  211. package/dist/js-ts-safe-project-merge-scope-use-def-conflicts.js +292 -0
  212. package/dist/js-ts-safe-project-merge-semantic-equivalence-proof.js +175 -0
  213. package/dist/js-ts-safe-project-merge-semantic-replay-proof.js +311 -0
  214. package/dist/js-ts-safe-project-merge-semantic-replay-routes.js +179 -0
  215. package/dist/js-ts-safe-project-merge-source-span-conflicts.js +310 -0
  216. package/dist/js-ts-safe-project-merge-source-span-roundtrip-proof.js +172 -0
  217. package/dist/js-ts-safe-project-merge-split-merge-admission.js +96 -0
  218. package/dist/js-ts-safe-project-merge-split-merge-records.js +320 -0
  219. package/dist/js-ts-safe-project-merge-split-merge-shapes.js +234 -0
  220. package/dist/js-ts-safe-project-merge-split-merge.js +218 -0
  221. package/dist/js-ts-safe-project-merge-summary.js +320 -0
  222. package/dist/js-ts-safe-project-merge-symbol-move-admission.js +63 -0
  223. package/dist/js-ts-safe-project-merge-symbol-move-default-admission.js +143 -0
  224. package/dist/js-ts-safe-project-merge-symbol-move-risks.js +213 -0
  225. package/dist/js-ts-safe-project-merge-symbol-move.js +316 -0
  226. package/dist/js-ts-safe-project-merge-symbol-rename-admission.js +59 -0
  227. package/dist/js-ts-safe-project-merge-symbol-rename-default-admission.js +111 -0
  228. package/dist/js-ts-safe-project-merge-symbol-rename.js +319 -0
  229. package/dist/js-ts-safe-project-merge-ts-options.js +205 -0
  230. package/dist/js-ts-safe-project-merge-ts-program.js +268 -0
  231. package/dist/js-ts-safe-project-merge-typed-property-rename-rebase-utils.js +69 -0
  232. package/dist/js-ts-safe-project-merge-typed-property-rename-rebase.js +317 -0
  233. package/dist/js-ts-safe-project-merge-unsupported-surfaces.js +319 -0
  234. package/dist/js-ts-safe-project-merge.js +170 -171
  235. package/dist/js-ts-semantic-scope-use-def-bindings.js +287 -0
  236. package/dist/js-ts-semantic-scope-use-def-scan.js +241 -0
  237. package/dist/js-ts-semantic-scope-use-def-utils.js +132 -0
  238. package/dist/js-ts-semantic-scope-use-def.js +217 -0
  239. package/dist/lightweight-dependency-effects.js +28 -4
  240. package/dist/lightweight-dependency-relations.js +13 -7
  241. package/dist/lightweight-dependency-top-level.js +63 -0
  242. package/dist/native-import-language-profiles.js +27 -1
  243. package/dist/native-js-ts-importers.js +9 -5
  244. package/dist/native-parser-ast-format-profiles.js +12 -0
  245. package/dist/native-parser-html-css-format-profiles.js +85 -0
  246. package/dist/native-region-scanner-core.js +5 -3
  247. package/dist/native-region-scanner-js-commonjs.js +155 -0
  248. package/dist/native-region-scanner-js-imports.js +51 -13
  249. package/dist/native-region-scanner-js-reexports.js +79 -0
  250. package/dist/native-region-scanner-js-ts-helpers.js +23 -0
  251. package/dist/native-source-ledger-helpers.js +1 -1
  252. package/dist/native-source-ledger.js +24 -10
  253. package/dist/native-source-maps-ecma426.js +316 -0
  254. package/dist/native-source-maps.js +36 -6
  255. package/dist/native-source-preservation-ownership.js +292 -0
  256. package/dist/native-source-preservation-scanner.js +63 -25
  257. package/dist/native-source-preservation-types.d.ts +3 -0
  258. package/dist/semantic-import-effect-occurrences.js +242 -0
  259. package/dist/semantic-import-effect-regions.js +95 -58
  260. package/dist/semantic-import-graph-layers.js +224 -0
  261. package/dist/semantic-import-runtime-conditional-evidence.js +135 -0
  262. package/dist/semantic-import-runtime-effect-target-evidence.js +145 -0
  263. package/dist/semantic-import-runtime-exit-evidence.js +32 -0
  264. package/dist/semantic-import-runtime-import-meta-evidence.js +33 -0
  265. package/dist/semantic-import-runtime-mutation-evidence.js +155 -0
  266. package/dist/semantic-import-runtime-order-evidence.js +318 -0
  267. package/dist/semantic-import-runtime-promise-chain-evidence.js +103 -0
  268. package/dist/semantic-import-runtime-promise-combinator-evidence.js +166 -0
  269. package/dist/semantic-import-runtime-reachability-evidence.js +269 -0
  270. package/dist/semantic-import-runtime-resource-management-evidence.js +293 -0
  271. package/dist/semantic-import-runtime-switch-evidence.js +304 -0
  272. package/dist/semantic-import-runtime-throw-evidence.js +44 -0
  273. package/dist/semantic-import-runtime-try-finally-evidence.js +172 -0
  274. package/dist/semantic-import-sidecar-entry.js +4 -0
  275. package/dist/semantic-import-source-preservation.js +6 -2
  276. package/package.json +1 -1
@@ -0,0 +1,291 @@
1
+ import { hashSemanticValue } from '@shapeshift-labs/frontier-lang-kernel';
2
+ import { jsxRenderReturnCollectionRecord } from './projectSymbolGraphJsxRenderCollections.js';
3
+
4
+ function jsxRenderReturnRecords(sourceText) {
5
+ const statements = returnStatements(sourceText);
6
+ const implicitArrows = statements.length ? [] : implicitArrowReturnStatements(sourceText);
7
+ return [...statements, ...implicitArrows]
8
+ .filter((statement) => isRenderableReturnExpression(statement.expressionText))
9
+ .map((statement, index) => renderReturnRecord(statement, index));
10
+ }
11
+
12
+ function jsxRenderReturnRiskEvidence(owner) {
13
+ const records = Array.isArray(owner?.renderReturnRecords) ? owner.renderReturnRecords : [];
14
+ if (!records.length) return {};
15
+ const branchCount = records.filter((record) => record.branchControlKind !== 'return-statement' || record.ifConditionHash).length;
16
+ const branched = records.length > 1 || branchCount > 0;
17
+ const hasConditionalBranchEvidence = records.some((record) => record.conditionalBranchRecord);
18
+ const hasLogicalBranchEvidence = records.some((record) => record.logicalBranchRecord);
19
+ const hasArrayCollectionEvidence = records.some((record) => record.collectionRecord?.collectionKind === 'array-literal');
20
+ const hasFragmentCollectionEvidence = records.some((record) => String(record.collectionRecord?.collectionKind ?? '').startsWith('fragment-'));
21
+ const renderRiskKinds = ['render-return-boundary', branched ? 'render-return-branch-control-flow' : undefined].filter(Boolean);
22
+ const hasImplicitArrow = records.some((record) => record.returnKind === 'implicit-arrow-expression');
23
+ const renderRiskReasonCodes = [
24
+ 'jsx-render-return-static-evidence',
25
+ hasImplicitArrow ? 'jsx-render-return-implicit-arrow-static-evidence' : undefined,
26
+ hasConditionalBranchEvidence ? 'jsx-render-return-conditional-branch-static-evidence' : undefined,
27
+ hasLogicalBranchEvidence ? 'jsx-render-return-logical-branch-static-evidence' : undefined,
28
+ hasArrayCollectionEvidence ? 'jsx-render-return-array-static-evidence' : undefined,
29
+ hasFragmentCollectionEvidence ? 'jsx-render-return-fragment-static-evidence' : undefined,
30
+ branched ? 'jsx-render-return-branch-unsupported' : undefined
31
+ ].filter(Boolean);
32
+ const record = compactRecord({
33
+ renderReturnRecords: records,
34
+ renderReturnCount: records.length,
35
+ renderReturnBranchCount: branchCount || undefined,
36
+ renderReturnSignatureHash: hashSemanticValue({
37
+ kind: 'frontier.lang.projectJsxRenderReturns',
38
+ publicOwnerName: owner?.name,
39
+ records
40
+ })
41
+ });
42
+ return { renderRiskKinds, renderRiskReasonCodes, record };
43
+ }
44
+
45
+ function returnStatements(sourceText) {
46
+ const text = String(sourceText ?? '');
47
+ const statements = [];
48
+ for (const match of text.matchAll(/\breturn\b/g)) {
49
+ const start = match.index;
50
+ const expressionStart = start + match[0].length;
51
+ const expressionEnd = statementEnd(text, expressionStart);
52
+ if (expressionEnd <= expressionStart) continue;
53
+ statements.push({
54
+ start,
55
+ end: expressionEnd,
56
+ expressionText: normalizedReturnExpression(text.slice(expressionStart, expressionEnd).replace(/;$/, '')),
57
+ returnKind: 'return-statement',
58
+ ifConditionText: nearestIfConditionText(text, start)
59
+ });
60
+ }
61
+ return statements;
62
+ }
63
+
64
+ function implicitArrowReturnStatements(sourceText) {
65
+ const text = String(sourceText ?? '');
66
+ const statements = [];
67
+ for (const match of text.matchAll(/=>/g)) {
68
+ if (braceDepthBefore(text, match.index) > 0) continue;
69
+ const expressionStart = skipWhitespace(text, match.index + match[0].length);
70
+ if (text[expressionStart] === '{') continue;
71
+ const expressionEnd = statementEnd(text, expressionStart);
72
+ if (expressionEnd <= expressionStart) continue;
73
+ statements.push({
74
+ start: match.index,
75
+ end: expressionEnd,
76
+ expressionText: normalizedReturnExpression(text.slice(expressionStart, expressionEnd).replace(/;$/, '')),
77
+ returnKind: 'implicit-arrow-expression'
78
+ });
79
+ }
80
+ return statements;
81
+ }
82
+
83
+ function renderReturnRecord(statement, index) {
84
+ const expressionText = normalizedText(statement.expressionText);
85
+ const ifConditionText = normalizedText(statement.ifConditionText);
86
+ const conditionalBranch = conditionalBranchRecord(expressionText);
87
+ const logicalBranch = logicalBranchRecord(expressionText);
88
+ const collectionRecord = jsxRenderReturnCollectionRecord(expressionText);
89
+ return compactRecord({
90
+ ordinal: index + 1,
91
+ proofStatus: 'static-render-return-evidence',
92
+ returnKind: statement.returnKind,
93
+ branchControlKind: branchControlKind(expressionText),
94
+ expressionText,
95
+ expressionHash: hashSemanticValue({ kind: 'frontier.lang.projectJsxRenderReturnExpression', expressionText }),
96
+ conditionalBranchRecord: conditionalBranch,
97
+ logicalBranchRecord: logicalBranch,
98
+ collectionRecord,
99
+ ifConditionText,
100
+ ifConditionHash: ifConditionText ? hashSemanticValue({ kind: 'frontier.lang.projectJsxRenderReturnIfCondition', ifConditionText }) : undefined,
101
+ signatureHash: hashSemanticValue({
102
+ kind: 'frontier.lang.projectJsxRenderReturn',
103
+ ordinal: index + 1,
104
+ returnKind: statement.returnKind,
105
+ branchControlKind: branchControlKind(expressionText),
106
+ expressionText,
107
+ conditionalBranch,
108
+ logicalBranch,
109
+ collectionRecord,
110
+ ifConditionText
111
+ })
112
+ });
113
+ }
114
+
115
+ function isRenderableReturnExpression(text) {
116
+ const value = normalizedText(text).replace(/^\(([\s\S]*)\)$/, '$1').trim();
117
+ if (/^(?:null|false|undefined)$/.test(value)) return true;
118
+ if (/^(?:<|\[?\s*<|React\s*\.\s*createElement\s*\()/.test(value)) return true;
119
+ return topLevelConditionalOperator(value) || /(?:^|\s)(?:&&|\|\|)\s*</.test(value) || /[?:]\s*(?:<|null|false|undefined)\b/.test(value);
120
+ }
121
+
122
+ function branchControlKind(expressionText) {
123
+ if (topLevelConditionalOperator(expressionText)) return 'conditional-expression';
124
+ if (topLevelLogicalOperator(expressionText)) return 'logical-expression';
125
+ return 'return-statement';
126
+ }
127
+
128
+ function nearestIfConditionText(text, returnIndex) {
129
+ const prefix = String(text ?? '').slice(Math.max(0, returnIndex - 180), returnIndex);
130
+ const match = /if\s*\(([\s\S]*?)\)\s*(?:\{\s*)?$/.exec(prefix);
131
+ return match ? match[1] : undefined;
132
+ }
133
+
134
+ function statementEnd(text, start) {
135
+ const value = String(text ?? '');
136
+ let quote;
137
+ let depth = 0;
138
+ let escaped = false;
139
+ for (let index = start; index < value.length; index += 1) {
140
+ const char = value[index];
141
+ if (quote) {
142
+ if (escaped) escaped = false;
143
+ else if (char === '\\') escaped = true;
144
+ else if (char === quote) quote = undefined;
145
+ continue;
146
+ }
147
+ if (char === '"' || char === "'" || char === '`') quote = char;
148
+ else if (char === '(' || char === '[' || char === '{') depth += 1;
149
+ else if (char === ')' || char === ']' || char === '}') depth = Math.max(0, depth - 1);
150
+ else if (char === ';' && depth === 0) return index + 1;
151
+ }
152
+ return value.length;
153
+ }
154
+
155
+ function topLevelConditionalOperator(text) {
156
+ return topLevelOperator(text, '?');
157
+ }
158
+ function topLevelLogicalOperator(text) {
159
+ return topLevelOperator(text, '&&') || topLevelOperator(text, '||');
160
+ }
161
+ function topLevelOperator(text, operator) {
162
+ const value = String(text ?? '');
163
+ let quote;
164
+ let depth = 0;
165
+ for (let index = 0; index < value.length; index += 1) {
166
+ const char = value[index];
167
+ if (quote) {
168
+ if (char === '\\') index += 1;
169
+ else if (char === quote) quote = undefined;
170
+ continue;
171
+ }
172
+ if (char === '"' || char === "'" || char === '`') quote = char;
173
+ else if (char === '(' || char === '[' || char === '{') depth += 1;
174
+ else if (char === ')' || char === ']' || char === '}') depth = Math.max(0, depth - 1);
175
+ else if (depth === 0 && value.slice(index, index + operator.length) === operator) return true;
176
+ }
177
+ return false;
178
+ }
179
+
180
+ function conditionalBranchRecord(expressionText) {
181
+ const split = splitTopLevelConditional(expressionText);
182
+ if (!split) return undefined;
183
+ return compactRecord({
184
+ proofStatus: 'static-conditional-render-branch-evidence',
185
+ conditionText: split.conditionText,
186
+ consequentText: split.consequentText,
187
+ alternateText: split.alternateText,
188
+ conditionHash: hashSemanticValue({ kind: 'frontier.lang.projectJsxRenderConditionalCondition', text: split.conditionText }),
189
+ consequentHash: hashSemanticValue({ kind: 'frontier.lang.projectJsxRenderConditionalConsequent', text: split.consequentText }),
190
+ alternateHash: hashSemanticValue({ kind: 'frontier.lang.projectJsxRenderConditionalAlternate', text: split.alternateText }),
191
+ signatureHash: hashSemanticValue({ kind: 'frontier.lang.projectJsxRenderConditionalBranch', ...split })
192
+ });
193
+ }
194
+
195
+ function logicalBranchRecord(expressionText) {
196
+ const split = splitTopLevelLogical(expressionText);
197
+ if (!split) return undefined;
198
+ return compactRecord({
199
+ proofStatus: 'static-logical-render-branch-evidence',
200
+ operator: split.operator,
201
+ leftText: split.leftText,
202
+ rightText: split.rightText,
203
+ leftHash: hashSemanticValue({ kind: 'frontier.lang.projectJsxRenderLogicalLeft', text: split.leftText }),
204
+ rightHash: hashSemanticValue({ kind: 'frontier.lang.projectJsxRenderLogicalRight', text: split.rightText }),
205
+ signatureHash: hashSemanticValue({ kind: 'frontier.lang.projectJsxRenderLogicalBranch', ...split })
206
+ });
207
+ }
208
+
209
+ function splitTopLevelConditional(text) {
210
+ const value = String(text ?? '');
211
+ let quote;
212
+ let depth = 0;
213
+ let question = -1;
214
+ let nested = 0;
215
+ for (let index = 0; index < value.length; index += 1) {
216
+ const char = value[index];
217
+ if (quote) {
218
+ if (char === '\\') index += 1;
219
+ else if (char === quote) quote = undefined;
220
+ continue;
221
+ }
222
+ if (char === '"' || char === "'" || char === '`') quote = char;
223
+ else if (char === '(' || char === '[' || char === '{') depth += 1;
224
+ else if (char === ')' || char === ']' || char === '}') depth = Math.max(0, depth - 1);
225
+ else if (depth === 0 && char === '?') {
226
+ if (question < 0) question = index;
227
+ else nested += 1;
228
+ } else if (depth === 0 && char === ':' && question >= 0) {
229
+ if (nested > 0) nested -= 1;
230
+ else return {
231
+ conditionText: normalizedText(value.slice(0, question)),
232
+ consequentText: normalizedReturnExpression(value.slice(question + 1, index)),
233
+ alternateText: normalizedReturnExpression(value.slice(index + 1))
234
+ };
235
+ }
236
+ }
237
+ return undefined;
238
+ }
239
+
240
+ function splitTopLevelLogical(text) {
241
+ const value = String(text ?? '');
242
+ let quote;
243
+ let depth = 0;
244
+ for (let index = 0; index < value.length - 1; index += 1) {
245
+ const char = value[index];
246
+ if (quote) {
247
+ if (char === '\\') index += 1;
248
+ else if (char === quote) quote = undefined;
249
+ continue;
250
+ }
251
+ if (char === '"' || char === "'" || char === '`') quote = char;
252
+ else if (char === '(' || char === '[' || char === '{') depth += 1;
253
+ else if (char === ')' || char === ']' || char === '}') depth = Math.max(0, depth - 1);
254
+ else if (depth === 0 && (value.slice(index, index + 2) === '&&' || value.slice(index, index + 2) === '||')) {
255
+ return {
256
+ operator: value.slice(index, index + 2),
257
+ leftText: normalizedReturnExpression(value.slice(0, index)),
258
+ rightText: normalizedReturnExpression(value.slice(index + 2))
259
+ };
260
+ }
261
+ }
262
+ return undefined;
263
+ }
264
+
265
+ function normalizedText(text) { return String(text ?? '').trim().replace(/\s+/g, ' '); }
266
+ function normalizedReturnExpression(text) {
267
+ const value = normalizedText(text);
268
+ const wrapped = /^\(([\s\S]*)\)$/.exec(value);
269
+ return wrapped ? normalizedText(wrapped[1]) : value;
270
+ }
271
+ function compactRecord(record) { return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined)); }
272
+ function skipWhitespace(text, start) { let index = start; while (/\s/.test(String(text ?? '')[index] ?? '')) index += 1; return index; }
273
+ function braceDepthBefore(text, offset) {
274
+ const value = String(text ?? '').slice(0, offset);
275
+ let depth = 0;
276
+ let quote;
277
+ for (let index = 0; index < value.length; index += 1) {
278
+ const char = value[index];
279
+ if (quote) {
280
+ if (char === '\\') index += 1;
281
+ else if (char === quote) quote = undefined;
282
+ continue;
283
+ }
284
+ if (char === '"' || char === "'" || char === '`') quote = char;
285
+ else if (char === '{') depth += 1;
286
+ else if (char === '}') depth = Math.max(0, depth - 1);
287
+ }
288
+ return depth;
289
+ }
290
+
291
+ export { jsxRenderReturnRecords, jsxRenderReturnRiskEvidence };
@@ -0,0 +1,279 @@
1
+ import { hashSemanticValue } from '@shapeshift-labs/frontier-lang-kernel';
2
+ import { uniqueStrings } from '../../native-import-utils.js';
3
+ import { jsxContextProviderBoundary } from '../../js-ts-safe-merge-jsx-attribute-parser.js';
4
+ import { jsxContextProviderValueReasonCode, jsxContextProviderValueRecord } from './projectSymbolGraphJsxContextValues.js';
5
+ import { jsxEventHandlerReasonCodes } from './projectSymbolGraphJsxEventHandlers.js';
6
+ import { jsxRenderReturnRiskEvidence } from './projectSymbolGraphJsxRenderReturns.js';
7
+ function jsxRenderRiskEvidence(tag, owner, contextProviderAncestors = [], eventHandlerProps = [], componentContextConsumerRecords = []) {
8
+ const contextBoundary = jsxContextProviderBoundary(tag.tagName);
9
+ const contextValueRecord = contextBoundary ? jsxContextProviderValueRecord(tag.attributes) : undefined;
10
+ const contextProviderPath = contextProviderAncestors.map((provider) => provider.contextName).filter(Boolean);
11
+ const contextProviderAncestorTags = contextProviderAncestors.map((provider) => provider.tagName).filter(Boolean);
12
+ const contextProviderNestingSignatureHash = contextProviderPath.length ? hashSemanticValue({
13
+ kind: 'frontier.lang.projectJsxContextProviderNesting',
14
+ tagName: tag.tagName,
15
+ tagKey: tag.key,
16
+ publicOwnerName: owner?.name,
17
+ contextProviderPath,
18
+ contextProviderAncestorTags
19
+ }) : undefined;
20
+ const hookCalls = Array.isArray(owner?.hookCalls) ? owner.hookCalls : [];
21
+ const hookCallOrder = hookCalls.map((call) => call.name).filter(Boolean);
22
+ const hookNames = uniqueStrings(hookCallOrder.length ? hookCallOrder : owner?.hookNames ?? []);
23
+ const hookDependencyRecords = hookCalls.filter((call) => call?.dependencyArrayHash).map(hookDependencyRecord);
24
+ const hookEffectRecords = hookCalls.filter((call) => call?.effectCallbackHash).map(hookEffectRecord);
25
+ const contextConsumerRecords = [...hookCalls.filter((call) => call?.contextExpressionHash).map((call) => contextConsumerRecord(call, contextProviderAncestors)), ...componentContextConsumerRecords];
26
+ const contextConsumerNames = uniqueStrings(contextConsumerRecords.map((record) => record.contextName));
27
+ const hookCallOrderSignatureHash = hookCallOrder.length > 1 ? hashSemanticValue({
28
+ kind: 'frontier.lang.projectJsxHookCallOrder',
29
+ publicOwnerName: owner?.name,
30
+ hookCallOrder
31
+ }) : undefined;
32
+ const hookDependencySignatureHash = hookDependencyRecords.length ? hashSemanticValue({
33
+ kind: 'frontier.lang.projectJsxHookDependencyArrays',
34
+ publicOwnerName: owner?.name,
35
+ hookDependencyRecords
36
+ }) : undefined;
37
+ const hookEffectSignatureHash = hookEffectRecords.length ? hashSemanticValue({
38
+ kind: 'frontier.lang.projectJsxHookEffects',
39
+ publicOwnerName: owner?.name,
40
+ hookEffectRecords
41
+ }) : undefined;
42
+ const contextConsumerSignatureHash = contextConsumerRecords.length ? hashSemanticValue({
43
+ kind: 'frontier.lang.projectJsxContextConsumers',
44
+ publicOwnerName: owner?.name,
45
+ contextConsumerRecords
46
+ }) : undefined;
47
+ const contextConsumerReasonCodes = jsxContextConsumerReasonCodes(contextConsumerRecords);
48
+ const renderReturnRisk = jsxRenderReturnRiskEvidence(owner);
49
+ const eventHandlerSignatureHash = eventHandlerProps.length ? hashSemanticValue({
50
+ kind: 'frontier.lang.projectJsxEventHandlerProps',
51
+ tagName: tag.tagName,
52
+ tagKey: tag.key,
53
+ publicOwnerName: owner?.name,
54
+ eventHandlerProps
55
+ }) : undefined;
56
+ const renderRiskKinds = uniqueStrings([
57
+ contextBoundary ? 'context-provider-boundary' : undefined,
58
+ contextValueRecord ? 'context-provider-value-boundary' : undefined,
59
+ contextProviderNestingSignatureHash ? 'context-provider-nesting' : undefined,
60
+ hookNames.length ? 'hook-owner-render-scope' : undefined,
61
+ hookCallOrderSignatureHash ? 'hook-call-order-boundary' : undefined,
62
+ hookDependencySignatureHash ? 'hook-dependency-boundary' : undefined,
63
+ hookEffectSignatureHash ? 'hook-effect-boundary' : undefined,
64
+ contextConsumerSignatureHash ? 'context-consumer-boundary' : undefined,
65
+ ...(renderReturnRisk.renderRiskKinds ?? []),
66
+ eventHandlerSignatureHash ? 'event-handler-prop-boundary' : undefined
67
+ ]);
68
+ if (!renderRiskKinds.length) return {};
69
+ const renderRiskReasonCodes = uniqueStrings([
70
+ contextBoundary ? 'jsx-render-context-provider-boundary' : undefined,
71
+ contextValueRecord ? jsxContextProviderValueReasonCode(contextValueRecord) : undefined,
72
+ contextProviderNestingSignatureHash ? 'jsx-render-context-provider-nesting-unsupported' : undefined,
73
+ hookNames.length ? 'jsx-render-public-owner-hooks' : undefined,
74
+ hookCallOrderSignatureHash ? 'jsx-render-hook-call-order-unsupported' : undefined,
75
+ ...jsxHookDependencyReasonCodes(hookDependencyRecords),
76
+ ...jsxHookEffectReasonCodes(hookEffectRecords),
77
+ ...contextConsumerReasonCodes,
78
+ ...(renderReturnRisk.renderRiskReasonCodes ?? []),
79
+ ...jsxEventHandlerReasonCodes(eventHandlerProps)
80
+ ]);
81
+ return compactRecord({
82
+ renderRiskKinds,
83
+ renderRiskReasonCodes,
84
+ contextBoundaryKind: contextBoundary?.kind,
85
+ contextName: contextBoundary?.contextName,
86
+ contextValuePropName: contextValueRecord?.propName,
87
+ contextValueExpressionHash: contextValueRecord?.expressionHash,
88
+ contextValueSignatureHash: contextValueRecord?.signatureHash,
89
+ contextValueRecord,
90
+ contextProviderPath: contextProviderPath.length ? contextProviderPath : undefined,
91
+ contextProviderAncestorTags: contextProviderAncestorTags.length ? contextProviderAncestorTags : undefined,
92
+ contextProviderAncestorCount: contextProviderPath.length || undefined,
93
+ contextProviderNestingSignatureHash,
94
+ hookNames: hookNames.length ? hookNames : undefined,
95
+ hookCallOrder: hookCallOrder.length ? hookCallOrder : undefined,
96
+ hookCallCount: hookCallOrder.length || undefined,
97
+ hookCallOrderSignatureHash,
98
+ hookDependencyRecords: hookDependencyRecords.length ? hookDependencyRecords : undefined,
99
+ hookDependencyCount: hookDependencyRecords.length || undefined,
100
+ hookDependencySignatureHash,
101
+ hookEffectRecords: hookEffectRecords.length ? hookEffectRecords : undefined,
102
+ hookEffectCount: hookEffectRecords.length || undefined,
103
+ hookEffectSignatureHash,
104
+ contextConsumerNames: contextConsumerNames.length ? contextConsumerNames : undefined,
105
+ contextConsumerRecords: contextConsumerRecords.length ? contextConsumerRecords : undefined,
106
+ contextConsumerCount: contextConsumerRecords.length || undefined,
107
+ contextConsumerSignatureHash,
108
+ ...renderReturnRisk.record,
109
+ eventHandlerPropNames: eventHandlerProps.length ? uniqueStrings(eventHandlerProps.map((record) => record.propName)) : undefined,
110
+ eventHandlerPropRecords: eventHandlerProps.length ? eventHandlerProps : undefined,
111
+ eventHandlerPropCount: eventHandlerProps.length || undefined,
112
+ eventHandlerSignatureHash,
113
+ renderRiskSignatureHash: hashSemanticValue({
114
+ kind: 'frontier.lang.projectJsxRenderRiskSignature',
115
+ tagName: tag.tagName,
116
+ tagKey: tag.key,
117
+ publicOwnerName: owner?.name,
118
+ renderRiskKinds,
119
+ renderRiskReasonCodes,
120
+ contextBoundaryKind: contextBoundary?.kind,
121
+ contextName: contextBoundary?.contextName,
122
+ contextValueRecord,
123
+ contextProviderPath,
124
+ contextProviderAncestorTags,
125
+ contextProviderNestingSignatureHash,
126
+ hookNames,
127
+ hookCallOrder,
128
+ hookCallOrderSignatureHash,
129
+ hookDependencyRecords,
130
+ hookDependencySignatureHash,
131
+ hookEffectRecords,
132
+ hookEffectSignatureHash,
133
+ contextConsumerNames,
134
+ contextConsumerRecords,
135
+ contextConsumerSignatureHash,
136
+ renderReturnRisk: renderReturnRisk.record,
137
+ eventHandlerProps,
138
+ eventHandlerSignatureHash
139
+ })
140
+ });
141
+ }
142
+ function hookDependencyRecord(call) {
143
+ return compactRecord({
144
+ hookName: call.name,
145
+ ordinal: call.ordinal,
146
+ dependencyCount: call.dependencyCount,
147
+ dependencyTexts: call.dependencyTexts,
148
+ dependencyRecords: call.dependencyRecords,
149
+ proofStatus: call.dependencyProofStatus,
150
+ dynamicDependencyTexts: call.dynamicDependencyTexts,
151
+ dynamicDependencyReasonCodes: call.dynamicDependencyReasonCodes,
152
+ dependencyArrayHash: call.dependencyArrayHash,
153
+ dependencySignatureHash: call.dependencySignatureHash
154
+ });
155
+ }
156
+ function jsxHookDependencyReasonCodes(records = []) {
157
+ if (!records.length) return [];
158
+ const hasStatic = records.some((record) => record.proofStatus === 'static-dependency-array-evidence');
159
+ const hasDynamic = records.some((record) => record.proofStatus === 'dynamic-dependency-array-unsupported');
160
+ return [
161
+ hasStatic ? 'jsx-render-hook-dependency-array-static-evidence' : undefined,
162
+ hasDynamic ? 'jsx-render-hook-dependency-array-unsupported' : undefined
163
+ ];
164
+ }
165
+ function hookEffectRecord(call) {
166
+ return compactRecord({
167
+ hookName: call.name,
168
+ ordinal: call.ordinal,
169
+ proofStatus: call.effectProofStatus,
170
+ callbackKind: call.effectCallbackKind,
171
+ callbackText: call.effectCallbackText,
172
+ dynamicCallbackText: call.effectDynamicCallbackText,
173
+ callbackHash: call.effectCallbackHash,
174
+ callbackReferenceRoot: call.effectCallbackReferenceRoot,
175
+ callbackReferencePath: call.effectCallbackReferencePath,
176
+ callbackReferenceMemberPath: call.effectCallbackReferenceMemberPath,
177
+ callbackOptionalReference: call.effectCallbackOptionalReference,
178
+ callbackOptionalReferenceSegments: call.effectCallbackOptionalReferenceSegments,
179
+ callbackOptionalReferenceSegmentIndexes: call.effectCallbackOptionalReferenceSegmentIndexes,
180
+ callbackOptionalNullishBoundaryCount: call.effectCallbackOptionalNullishBoundaryCount,
181
+ dynamicCallbackKind: call.effectDynamicCallbackKind,
182
+ dynamicCallbackBlockerReasonCode: call.effectDynamicCallbackBlockerReasonCode,
183
+ cleanupProofStatus: call.effectCleanupProofStatus,
184
+ cleanupReturnKind: call.effectCleanupReturnKind,
185
+ cleanupReturnText: call.effectCleanupReturnText,
186
+ dynamicCleanupReturnText: call.effectDynamicCleanupReturnText,
187
+ cleanupReturnHash: call.effectCleanupReturnHash,
188
+ cleanupReturnReferenceRoot: call.effectCleanupReturnReferenceRoot,
189
+ cleanupReturnReferencePath: call.effectCleanupReturnReferencePath,
190
+ cleanupReturnReferenceMemberPath: call.effectCleanupReturnReferenceMemberPath,
191
+ cleanupReturnOptionalReference: call.effectCleanupReturnOptionalReference,
192
+ cleanupReturnOptionalReferenceSegments: call.effectCleanupReturnOptionalReferenceSegments,
193
+ cleanupReturnOptionalReferenceSegmentIndexes: call.effectCleanupReturnOptionalReferenceSegmentIndexes,
194
+ cleanupReturnOptionalNullishBoundaryCount: call.effectCleanupReturnOptionalNullishBoundaryCount,
195
+ dynamicCleanupReturnKind: call.effectDynamicCleanupReturnKind,
196
+ dynamicCleanupReturnBlockerReasonCode: call.effectDynamicCleanupReturnBlockerReasonCode,
197
+ cleanupReturnPresent: call.effectCleanupReturnPresent,
198
+ runtimeEquivalenceClaim: call.effectRuntimeEquivalenceClaim,
199
+ signatureHash: call.effectSignatureHash
200
+ });
201
+ }
202
+ function jsxHookEffectReasonCodes(records = []) {
203
+ if (!records.length) return [];
204
+ const hasStaticCallback = records.some((record) => record.proofStatus === 'static-effect-callback-source-evidence');
205
+ const hasStaticCleanup = records.some((record) => record.cleanupProofStatus === 'static-effect-cleanup-source-evidence');
206
+ const hasDynamic = records.some((record) => record.proofStatus === 'dynamic-effect-callback-unsupported' || record.cleanupProofStatus === 'dynamic-effect-cleanup-unsupported');
207
+ return [
208
+ hasStaticCallback ? 'jsx-render-hook-effect-static-callback-evidence' : undefined,
209
+ records.some((record) => record.callbackOptionalReference) ? 'jsx-render-hook-effect-static-optional-callback-evidence' : undefined,
210
+ hasStaticCleanup ? 'jsx-render-hook-effect-static-cleanup-evidence' : undefined,
211
+ records.some((record) => record.cleanupReturnOptionalReference) ? 'jsx-render-hook-effect-static-optional-cleanup-evidence' : undefined,
212
+ records.some((record) => record.runtimeEquivalenceClaim === false) ? 'jsx-render-hook-effect-runtime-equivalence-unproved' : undefined,
213
+ hasDynamic ? 'jsx-render-hook-effect-unsupported' : undefined,
214
+ ...records.map((record) => record.dynamicCallbackBlockerReasonCode),
215
+ ...records.map((record) => record.dynamicCleanupReturnBlockerReasonCode)
216
+ ];
217
+ }
218
+ function contextConsumerRecord(call, contextProviderAncestors = []) {
219
+ const proofStatus = call.contextConsumerProofStatus ?? (call.contextConsumerDynamicTarget
220
+ ? 'dynamic-context-target-unsupported'
221
+ : 'static-context-target-evidence');
222
+ const provider = nearestContextProvider(contextProviderAncestors, call.contextName);
223
+ const lookupHash = provider ? hashSemanticValue({
224
+ kind: 'frontier.lang.projectJsxContextProviderLookup',
225
+ contextName: call.contextName,
226
+ tagName: provider.tagName,
227
+ depth: provider.depth
228
+ }) : undefined;
229
+ const signatureHash = provider ? hashSemanticValue({
230
+ kind: 'frontier.lang.projectJsxContextConsumerWithProviderLookup',
231
+ baseSignatureHash: call.contextConsumerSignatureHash,
232
+ contextName: call.contextName,
233
+ provider
234
+ }) : call.contextConsumerSignatureHash;
235
+ return compactRecord({
236
+ hookName: call.name,
237
+ ordinal: call.ordinal,
238
+ contextName: call.contextName,
239
+ contextExpressionText: call.contextExpressionText,
240
+ contextExpressionHash: call.contextExpressionHash,
241
+ contextTargetKind: call.contextTargetKind,
242
+ contextTargetReasonCode: call.contextTargetReasonCode,
243
+ contextTargetReferenceRoot: call.contextTargetReferenceRoot,
244
+ contextTargetReferencePath: call.contextTargetReferencePath,
245
+ contextTargetReferenceMemberPath: call.contextTargetReferenceMemberPath,
246
+ optionalReference: call.contextTargetOptionalReference,
247
+ optionalReferenceSegments: call.contextTargetOptionalReferenceSegments,
248
+ optionalReferenceSegmentIndexes: call.contextTargetOptionalReferenceSegmentIndexes,
249
+ optionalNullishBoundaryCount: call.contextTargetOptionalNullishBoundaryCount,
250
+ contextProviderLookupStatus: provider ? 'static-provider-ancestor-evidence' : undefined,
251
+ contextProviderLookupName: provider?.contextName,
252
+ contextProviderLookupTagName: provider?.tagName,
253
+ contextProviderLookupDepth: provider?.depth,
254
+ contextProviderLookupHash: lookupHash,
255
+ signatureHash,
256
+ proofStatus,
257
+ dynamicTargetKind: call.contextTargetDynamicKind,
258
+ dynamicBlockerReasonCode: call.contextTargetDynamicBlockerReasonCode,
259
+ dynamicTarget: call.contextConsumerDynamicTarget
260
+ });
261
+ }
262
+ function nearestContextProvider(providers = [], contextName) {
263
+ if (!contextName) return undefined;
264
+ const index = providers.map((provider, depth) => ({ ...provider, depth: depth + 1 })).reverse()
265
+ .find((provider) => provider.contextName === contextName);
266
+ return index ? compactRecord(index) : undefined;
267
+ }
268
+ function jsxContextConsumerReasonCodes(records = []) {
269
+ if (!records.length) return [];
270
+ const hasStatic = records.some((record) => record.proofStatus === 'static-context-target-evidence'); const hasStaticOptional = records.some((record) => record.proofStatus === 'static-optional-context-target-evidence' || record.optionalReference); const hasDynamic = records.some((record) => record.dynamicTarget);
271
+ const hasProviderLookup = records.some((record) => record.contextProviderLookupStatus === 'static-provider-ancestor-evidence'); const hasComponentLookup = records.some((record) => record.contextProviderLookupStatus === 'static-same-file-component-provider-evidence');
272
+ const hasComponentFlow = records.some((record) => record.contextProviderLookupStatus === 'static-same-file-component-provider-flow-evidence');
273
+ const hasProjectComponentLookup = records.some((record) => record.contextProviderLookupStatus === 'static-project-import-component-provider-evidence');
274
+ const hasProjectComponentFlow = records.some((record) => record.contextProviderLookupStatus === 'static-project-import-component-provider-flow-evidence');
275
+ const hasUnsupportedComponentTarget = records.some((record) => record.componentCallLookupStatus === 'component-target-unsupported');
276
+ return uniqueStrings([hasStatic ? 'jsx-render-context-consumer-target-static-evidence' : undefined, hasStaticOptional ? 'jsx-render-context-consumer-target-static-optional-reference-evidence' : undefined, hasProviderLookup ? 'jsx-render-context-consumer-provider-lookup-static-evidence' : undefined, hasComponentLookup ? 'jsx-render-context-consumer-provider-component-lookup-static-evidence' : undefined, hasComponentFlow ? 'jsx-render-context-consumer-provider-component-flow-static-evidence' : undefined, hasProjectComponentLookup ? 'jsx-render-context-consumer-provider-project-component-lookup-static-evidence' : undefined, hasProjectComponentFlow ? 'jsx-render-context-consumer-provider-project-component-flow-static-evidence' : undefined, hasUnsupportedComponentTarget ? 'jsx-render-context-consumer-provider-component-target-unsupported' : undefined, hasDynamic ? 'jsx-render-context-consumer-target-unsupported' : undefined, hasDynamic ? 'jsx-render-context-consumer-dynamic-target-unsupported' : undefined, ...records.map((record) => record.dynamicBlockerReasonCode)]);
277
+ }
278
+ function compactRecord(record) { return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined)); }
279
+ export { jsxRenderRiskEvidence };