@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,142 @@
1
+ import { hashSemanticValue } from '@shapeshift-labs/frontier-lang-kernel';
2
+ import { spanFromTypeScriptNode } from './spanFromTypeScriptNode.js';
3
+
4
+ function compilerTypeReferenceTargets(checker, identitySymbol, location, ts) {
5
+ const declarations = Array.isArray(identitySymbol?.declarations) ? identitySymbol.declarations : [];
6
+ const records = [];
7
+ for (const declaration of declarations) {
8
+ visitTypeNodes(ts, declaration, (node) => {
9
+ if (!isSyntaxKind(ts, node, 'TypeReference')) return;
10
+ const record = typeReferenceTargetRecord(checker, node, location, ts);
11
+ if (record) records.push(record);
12
+ });
13
+ }
14
+ return uniqueRecords(records, (record) => [
15
+ record.typeReferenceName,
16
+ record.nodeText,
17
+ record.targetFullyQualifiedName,
18
+ record.targetDeclarationTextHash
19
+ ].join('\0'));
20
+ }
21
+
22
+ function typeReferenceTargetRecord(checker, node, location, ts) {
23
+ const symbol = safeCall(checker?.getSymbolAtLocation, checker, node.typeName);
24
+ const aliasedSymbol = safeCall(checker?.getAliasedSymbol, checker, symbol);
25
+ const targetSymbol = aliasedSymbol && aliasedSymbol !== symbol ? aliasedSymbol : symbol;
26
+ const declaration = targetDeclaration(targetSymbol);
27
+ if (!targetSymbol || !declaration) return undefined;
28
+ const referenceSpan = spanForNode(node, location);
29
+ const declarationSpan = spanForNode(declaration, location);
30
+ const declarationTextHash = declarationSourceHash(declaration, declarationSpan);
31
+ const targetSymbolIdentityHash = targetSymbol ? hashSemanticValue({
32
+ kind: 'frontier.lang.typescript.compilerTypeReferenceTargetSymbol.v1',
33
+ name: stringValue(targetSymbol.escapedName ?? targetSymbol.name),
34
+ fullyQualifiedName: stringValue(safeCall(checker?.getFullyQualifiedName, checker, targetSymbol)),
35
+ flags: numberValue(targetSymbol.flags),
36
+ declarationKind: syntaxKindName(ts, declaration?.kind),
37
+ declarationSpan,
38
+ declarationTextHash
39
+ }) : undefined;
40
+ const targetProof = compactRecord({
41
+ kind: 'frontier.lang.typescript.compilerPublicApiTypeReferenceTargetProof.v1',
42
+ typeReferenceName: nodeText(node.typeName),
43
+ targetSymbolName: stringValue(targetSymbol?.escapedName ?? targetSymbol?.name),
44
+ targetFullyQualifiedName: stringValue(targetSymbol ? safeCall(checker?.getFullyQualifiedName, checker, targetSymbol) : undefined),
45
+ targetSymbolFlags: numberValue(targetSymbol?.flags),
46
+ targetDeclarationKind: syntaxKindName(ts, declaration?.kind),
47
+ targetDeclarationSourcePath: declarationSpan?.path ?? sourcePathForNode(declaration),
48
+ targetDeclarationSpan: declarationSpan,
49
+ targetDeclarationTextHash: declarationTextHash,
50
+ targetSymbolIdentityHash
51
+ });
52
+ return compactRecord({
53
+ kind: 'type-reference-target',
54
+ syntaxKind: syntaxKindName(ts, node.kind),
55
+ nodeText: nodeText(node),
56
+ typeText: typeTextFromTypeNode(checker, node, location),
57
+ typeReferenceName: nodeText(node.typeName),
58
+ sourceSpan: referenceSpan,
59
+ typeArgumentCount: arrayValue(node.typeArguments).length || undefined,
60
+ targetStatus: 'resolved',
61
+ targetAliased: aliasedSymbol && aliasedSymbol !== symbol ? true : undefined,
62
+ targetSymbolName: targetProof.targetSymbolName,
63
+ targetFullyQualifiedName: targetProof.targetFullyQualifiedName,
64
+ targetSymbolFlags: targetProof.targetSymbolFlags,
65
+ targetSymbolIdentityHash,
66
+ targetDeclarationKind: targetProof.targetDeclarationKind,
67
+ targetDeclarationSourcePath: targetProof.targetDeclarationSourcePath,
68
+ targetDeclarationSpan: declarationSpan,
69
+ targetDeclarationTextHash: declarationTextHash,
70
+ typeReferenceTargetProofHash: hashSemanticValue(targetProof),
71
+ autoMergeClaim: false,
72
+ semanticEquivalenceClaim: false,
73
+ runtimeEquivalenceClaim: false
74
+ });
75
+ }
76
+
77
+ function targetDeclaration(symbol) {
78
+ return symbol?.valueDeclaration ?? arrayValue(symbol?.declarations)[0];
79
+ }
80
+
81
+ function declarationSourceHash(node, span) {
82
+ const text = nodeText(node);
83
+ if (!text) return undefined;
84
+ return hashSemanticValue({
85
+ kind: 'frontier.lang.typescript.compilerTypeReferenceTargetDeclarationSource.v1',
86
+ sourcePath: span?.path ?? sourcePathForNode(node),
87
+ span,
88
+ text
89
+ });
90
+ }
91
+
92
+ function spanForNode(node, fallback) {
93
+ if (!node || typeof node !== 'object') return undefined;
94
+ const sourceFile = safeCall(node.getSourceFile, node) ?? safeCall(fallback?.getSourceFile, fallback);
95
+ return sourceFile ? spanFromTypeScriptNode(node, sourceFile) : undefined;
96
+ }
97
+
98
+ function sourcePathForNode(node) {
99
+ return stringValue(safeCall(node?.getSourceFile, node)?.fileName);
100
+ }
101
+
102
+ function visitTypeNodes(ts, node, visit) {
103
+ if (!node || typeof node !== 'object') return;
104
+ visit(node);
105
+ if (typeof ts?.forEachChild === 'function') {
106
+ ts.forEachChild(node, (child) => visitTypeNodes(ts, child, visit));
107
+ return;
108
+ }
109
+ for (const value of Object.values(node)) {
110
+ if (Array.isArray(value)) value.forEach((child) => visitTypeNodes(ts, child, visit));
111
+ else if (value && typeof value === 'object' && Number.isFinite(value.kind)) visitTypeNodes(ts, value, visit);
112
+ }
113
+ }
114
+
115
+ function typeTextFromTypeNode(checker, node, location) {
116
+ const type = safeCall(checker?.getTypeFromTypeNode, checker, node) ?? safeCall(checker?.getTypeAtLocation, checker, node ?? location);
117
+ return type ? stringValue(safeCall(checker?.typeToString, checker, type)) : nodeText(node);
118
+ }
119
+
120
+ function syntaxKind(ts, name) { return numberValue(ts?.SyntaxKind?.[name]); }
121
+ function isSyntaxKind(ts, node, name) { return node?.kind === syntaxKind(ts, name); }
122
+ function syntaxKindName(ts, kind) { return stringValue(ts?.SyntaxKind?.[kind]) ?? (Number.isFinite(kind) ? String(kind) : undefined); }
123
+ function nodeText(node) { return stringValue(safeCall(node?.getText, node)); }
124
+ function safeCall(fn, receiver, ...args) {
125
+ if (typeof fn !== 'function') return undefined;
126
+ try { return fn.apply(receiver, args); } catch { return undefined; }
127
+ }
128
+ function stringValue(value) { return value === undefined || value === null || value === '' ? undefined : String(value); }
129
+ function numberValue(value) { return Number.isFinite(value) ? value : undefined; }
130
+ function arrayValue(value) { return Array.isArray(value) ? value : []; }
131
+ function compactRecord(record) { return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined)); }
132
+ function uniqueRecords(records, keyFn) {
133
+ const seen = new Set();
134
+ return records.filter((record) => {
135
+ const key = keyFn(record);
136
+ if (seen.has(key)) return false;
137
+ seen.add(key);
138
+ return true;
139
+ });
140
+ }
141
+
142
+ export { compilerTypeReferenceTargets };
@@ -1,5 +1,6 @@
1
- import{hashSemanticValue}from'@shapeshift-labs/frontier-lang-kernel';import{idFragment}from'../../native-import-utils.js';
1
+ import{hashSemanticValue}from'@shapeshift-labs/frontier-lang-kernel';
2
2
  import{declarationRecord}from'./declarationRecord.js';import{namedDeclaration}from'./namedDeclaration.js';import{stringFromTsExpression}from'./stringFromTsExpression.js';import{typeScriptExportedDeclarationEntries}from'./typeScriptExportedDeclarationEntries.js';import{typeScriptModuleDeclarationEntries}from'./typeScriptModuleDeclarationEntries.js';
3
+ import{typeScriptCompilerSymbolRecordForNode}from'./typeScriptCompilerSymbolIdentity.js';
3
4
  export function typeScriptDeclaration(node, kind, nativeNodeId, input, options = {}) {
4
5
  const enrich = (declaration, symbolNode = node.name ?? node) => enrichTypeScriptDeclaration(node, symbolNode, declaration, input, options);
5
6
  const moduleEntries = typeScriptModuleDeclarationEntries(node, kind, nativeNodeId, input);
@@ -41,51 +42,22 @@ function moduleDeclaration(input, nativeNodeId, node) {
41
42
 
42
43
  function enrichTypeScriptDeclaration(node, symbolNode, declaration, input, options) {
43
44
  if (!declaration) return declaration;
44
- const checker = options.typeChecker ?? options.checker ?? options.program?.getTypeChecker?.();
45
- const symbol = safeCall(checker?.getSymbolAtLocation, checker, symbolNode) ?? safeCall(checker?.getSymbolAtLocation, checker, node.name);
46
- if (!symbol) return declaration;
47
- const aliasedSymbol = safeCall(checker?.getAliasedSymbol, checker, symbol);
48
- const targetSymbol = aliasedSymbol && aliasedSymbol !== symbol ? aliasedSymbol : undefined;
49
- const identitySymbol = targetSymbol ?? symbol;
50
- const fullyQualifiedName = stringValue(safeCall(checker?.getFullyQualifiedName, checker, identitySymbol));
51
- const localName = stringValue(symbol.escapedName ?? symbol.name) ?? declaration.name;
52
- const targetName = targetSymbol ? stringValue(targetSymbol.escapedName ?? targetSymbol.name) : undefined;
53
- const identity = fullyQualifiedName ?? targetName ?? localName;
54
- const compilerSymbol = compactRecord({
55
- parser: options.parser,
56
- localName,
57
- targetName,
58
- fullyQualifiedName,
59
- flags: numberValue(symbol.flags),
60
- targetFlags: numberValue(targetSymbol?.flags),
61
- declarations: Array.isArray(identitySymbol.declarations) ? identitySymbol.declarations.length : undefined,
62
- aliased: Boolean(targetSymbol)
63
- });
45
+ const compiler = typeScriptCompilerSymbolRecordForNode(symbolNode, input, options, node.name, { importRole: declaration.role === 'import' });
46
+ if (!compiler) return declaration;
64
47
  return {
65
48
  ...declaration,
66
- symbolId: `symbol:${input.language}:compiler:${declaration.role === 'import' ? 'import:' : ''}${idFragment(identity)}`,
67
- signatureHash: hashSemanticValue([input.language, declaration.symbolKind, identity, compilerSymbol]),
49
+ symbolId: compiler.symbolId,
50
+ signatureHash: hashSemanticValue([input.language, declaration.symbolKind, compiler.identity, compiler.compilerSymbol, compiler.compilerType]),
68
51
  metadata: {
69
52
  ...declaration.metadata,
70
- compilerSymbol,
71
- compilerSymbolIdentityHash: hashSemanticValue(compilerSymbol)
53
+ compilerSymbol: compiler.compilerSymbol,
54
+ compilerSymbolIdentityHash: compiler.compilerSymbolIdentityHash,
55
+ compilerType: compiler.compilerType,
56
+ compilerTypeIdentityHash: compiler.compilerTypeIdentityHash
72
57
  }
73
58
  };
74
59
  }
75
60
 
76
- function safeCall(fn, receiver, ...args) {
77
- if (typeof fn !== 'function') return undefined;
78
- try { return fn.apply(receiver, args); } catch { return undefined; }
79
- }
80
-
81
- function stringValue(value) {
82
- return value === undefined || value === null || value === '' ? undefined : String(value);
83
- }
84
-
85
- function numberValue(value) {
86
- return Number.isFinite(value) ? value : undefined;
87
- }
88
-
89
61
  function compactRecord(record) {
90
62
  return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
91
63
  }
@@ -1,10 +1,11 @@
1
1
  import{idFragment}from'../../native-import-utils.js';
2
- import{declarationRecord}from'./declarationRecord.js';import{identifierName}from'./identifierName.js';import{stringFromTsExpression}from'./stringFromTsExpression.js';
2
+ import{declarationRecord}from'./declarationRecord.js';import{dynamicImportExpressionMetadata}from'./dynamicImportExpressionMetadata.js';import{identifierName}from'./identifierName.js';import{hostModuleDependencyMetadata}from'./importMetaUrlDependencyMetadata.js';import{moduleImportAttributeMetadata}from'./moduleImportAttributeMetadata.js';import{stringFromTsExpression}from'./stringFromTsExpression.js';
3
3
  export function typeScriptModuleDeclarationEntries(node, kind, nativeNodeId, input) {
4
4
  if (kind === 'ImportDeclaration') return importDeclarationEntries(node, nativeNodeId, input);
5
5
  if (kind === 'ImportEqualsDeclaration') return importEqualsDeclarationEntries(node, nativeNodeId, input);
6
- if (kind === 'ExportDeclaration') return exportDeclarationEntries(node, nativeNodeId, input);
7
- if (kind === 'ExportAssignment') return exportAssignmentEntries(node, nativeNodeId, input);
6
+ if (kind === 'CallExpression' && isDynamicImportCall(node)) return dynamicImportExpressionEntries(node, nativeNodeId, input);
7
+ if (kind === 'CallExpression' || kind === 'NewExpression') { const dependencies = hostModuleDependencyMetadata(node, { kind }); if (dependencies.length) return dependencies.flatMap((dependency) => importModuleEntries(input, nativeNodeId, dependency.moduleSpecifier, 'HostModuleDependency', [], dependency.metadata)); }
8
+ if (kind === 'ExportDeclaration') return exportDeclarationEntries(node, nativeNodeId, input); if (kind === 'ExportAssignment') return exportAssignmentEntries(node, nativeNodeId, input);
8
9
  return undefined;
9
10
  }
10
11
 
@@ -16,7 +17,8 @@ function importDeclarationEntries(node, nativeNodeId, input) {
16
17
  return importModuleEntries(input, nativeNodeId, moduleSpecifier, 'ImportDeclaration', bindings, {
17
18
  typeOnly,
18
19
  sideEffectOnly: bindings.length === 0,
19
- importKind: bindings.length === 0 ? 'side-effect' : 'module'
20
+ importKind: bindings.length === 0 ? 'side-effect' : 'module',
21
+ ...moduleImportAttributeMetadata(node)
20
22
  });
21
23
  }
22
24
 
@@ -34,6 +36,16 @@ function importEqualsDeclarationEntries(node, nativeNodeId, input) {
34
36
  }], { typeOnly, importKind: 'commonjs-require' });
35
37
  }
36
38
 
39
+ function dynamicImportExpressionEntries(node, nativeNodeId, input) {
40
+ const firstArgument = node.arguments?.[0], moduleSpecifier = firstArgument ? stringLiteralFromTsExpression(firstArgument) ?? '<dynamic-import>' : undefined;
41
+ if (!moduleSpecifier) return [];
42
+ return importModuleEntries(input, nativeNodeId, moduleSpecifier, 'DynamicImportExpression', [], {
43
+ importKind: 'dynamic-import',
44
+ dynamicImport: true, ...dynamicImportExpressionMetadata(firstArgument, moduleSpecifier),
45
+ ...moduleImportAttributeMetadata(node)
46
+ });
47
+ }
48
+
37
49
  function exportDeclarationEntries(node, nativeNodeId, input) {
38
50
  const moduleSpecifier = stringFromTsExpression(node.moduleSpecifier);
39
51
  const typeOnly = Boolean(node.isTypeOnly);
@@ -46,14 +58,16 @@ function exportDeclarationEntries(node, nativeNodeId, input) {
46
58
  reexport: true,
47
59
  exportStar,
48
60
  namespaceReExport,
49
- importKind: exportStar ? 'reexport' : 'reexport'
61
+ importKind: exportStar ? 'reexport' : 'reexport',
62
+ ...moduleImportAttributeMetadata(node)
50
63
  }) : []),
51
64
  ...exportModuleEntries(input, nativeNodeId, moduleSpecifier, bindings, {
52
65
  typeOnly,
53
66
  exportStar,
54
67
  reExport: Boolean(moduleSpecifier),
55
68
  namespaceReExport,
56
- exportKind: exportStar ? 'export-star' : 'named'
69
+ exportKind: exportStar ? 'export-star' : 'named',
70
+ ...moduleImportAttributeMetadata(node)
57
71
  })
58
72
  ];
59
73
  }
@@ -177,10 +191,10 @@ function importModuleEntries(input, nativeNodeId, moduleSpecifier, _languageKind
177
191
  metadata: moduleMetadata('typescript-import', bindings, metadata)
178
192
  })
179
193
  };
180
- return [moduleEntry, ...bindings.map((binding) => importBindingEntry(input, nativeNodeId, moduleSpecifier, binding))];
194
+ return [moduleEntry, ...bindings.map((binding) => importBindingEntry(input, nativeNodeId, moduleSpecifier, binding, metadata))];
181
195
  }
182
196
 
183
- function importBindingEntry(input, nativeNodeId, moduleSpecifier, binding) {
197
+ function importBindingEntry(input, nativeNodeId, moduleSpecifier, binding, metadata = {}) {
184
198
  const declaration = compactRecord({
185
199
  ...declarationRecord(input, nativeNodeId, binding.localName, 'import', 'import'),
186
200
  symbolId: `symbol:${input.language}:import:${idFragment(`${moduleSpecifier}:${binding.localName}:${binding.importedName}`)}`,
@@ -202,7 +216,7 @@ function importBindingEntry(input, nativeNodeId, moduleSpecifier, binding) {
202
216
  namespace: binding.namespace,
203
217
  importKind: binding.importKind,
204
218
  isTypeOnly: binding.isTypeOnly,
205
- typeOnly: binding.isTypeOnly
219
+ typeOnly: binding.isTypeOnly, hasImportAttributes: metadata.hasImportAttributes, importAttributeCount: metadata.importAttributeCount, importAttributeKeys: metadata.importAttributeKeys, importAttributeHash: metadata.importAttributeHash, importAttributes: metadata.importAttributes
206
220
  })
207
221
  });
208
222
  return { declaration, symbolNode: binding.symbolNode };
@@ -225,10 +239,10 @@ function exportModuleEntries(input, nativeNodeId, moduleSpecifier, bindings, met
225
239
  metadata: moduleMetadata('typescript-export', bindings, metadata)
226
240
  })
227
241
  };
228
- return [statement, ...bindings.map((binding) => exportBindingEntry(input, nativeNodeId, moduleSpecifier, binding))];
242
+ return [statement, ...bindings.map((binding) => exportBindingEntry(input, nativeNodeId, moduleSpecifier, binding, metadata))];
229
243
  }
230
244
 
231
- function exportBindingEntry(input, nativeNodeId, moduleSpecifier, binding) {
245
+ function exportBindingEntry(input, nativeNodeId, moduleSpecifier, binding, metadata = {}) {
232
246
  const declaration = compactRecord({
233
247
  ...declarationRecord(input, nativeNodeId, binding.exportedName, 'export', 'export'),
234
248
  symbolId: `symbol:${input.language}:export:${idFragment(`${moduleSpecifier ?? 'local'}:${binding.exportedName}:${binding.localName}`)}`,
@@ -254,7 +268,7 @@ function exportBindingEntry(input, nativeNodeId, moduleSpecifier, binding) {
254
268
  isTypeOnly: binding.isTypeOnly,
255
269
  typeOnly: binding.isTypeOnly,
256
270
  reExport: binding.reExport,
257
- publicContract: true
271
+ publicContract: true, hasImportAttributes: metadata.hasImportAttributes, importAttributeCount: metadata.importAttributeCount, importAttributeKeys: metadata.importAttributeKeys, importAttributeHash: metadata.importAttributeHash, importAttributes: metadata.importAttributes
258
272
  })
259
273
  });
260
274
  return { declaration, symbolNode: binding.symbolNode };
@@ -269,7 +283,13 @@ function moduleMetadata(scan, bindings, metadata) {
269
283
  exportKind: metadata.exportKind,
270
284
  isTypeOnly: metadata.typeOnly,
271
285
  typeOnly: metadata.typeOnly,
272
- sideEffectOnly: metadata.sideEffectOnly,
286
+ sideEffectOnly: metadata.sideEffectOnly, dynamicImport: metadata.dynamicImport,
287
+ dynamicImportSpecifierKind: metadata.dynamicImportSpecifierKind, dynamicImportExpressionText: metadata.dynamicImportExpressionText, dynamicImportExpressionHash: metadata.dynamicImportExpressionHash, dynamicImportStaticSpecifierEvidence: metadata.dynamicImportStaticSpecifierEvidence, dynamicImportRuntimeResolutionClaim: metadata.dynamicImportRuntimeResolutionClaim, dynamicImportResolutionProofRequired: metadata.dynamicImportResolutionProofRequired, hostDependency: metadata.hostDependency, hostDependencyKind: metadata.hostDependencyKind, hostDependencyBase: metadata.hostDependencyBase, hostDependencyExpressionText: metadata.hostDependencyExpressionText, hostDependencyExpressionHash: metadata.hostDependencyExpressionHash, hostDependencyStaticSpecifierEvidence: metadata.hostDependencyStaticSpecifierEvidence, hostDependencyRuntimeResolutionClaim: metadata.hostDependencyRuntimeResolutionClaim, hostDependencyResolutionProofRequired: metadata.hostDependencyResolutionProofRequired,
288
+ hasImportAttributes: metadata.hasImportAttributes,
289
+ importAttributeCount: metadata.importAttributeCount,
290
+ importAttributeKeys: metadata.importAttributeKeys,
291
+ importAttributeHash: metadata.importAttributeHash,
292
+ importAttributes: metadata.importAttributes,
273
293
  reexport: metadata.reexport,
274
294
  reExport: metadata.reExport,
275
295
  namespaceReExport: metadata.namespaceReExport,
@@ -278,6 +298,23 @@ function moduleMetadata(scan, bindings, metadata) {
278
298
  });
279
299
  }
280
300
 
281
- function compactRecord(record) {
282
- return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
301
+ function compactRecord(record) { return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined)); }
302
+
303
+ function isDynamicImportCall(node) {
304
+ return Array.isArray(node?.arguments) && node.arguments.length > 0 && typeScriptExpressionText(node.expression) === 'import';
305
+ }
306
+
307
+ function typeScriptExpressionText(node) {
308
+ if (!node) return undefined;
309
+ if (typeof node.getText === 'function') {
310
+ try { return node.getText(); } catch {}
311
+ }
312
+ if (typeof node.kindName === 'string') return node.kindName === 'ImportKeyword' ? 'import' : node.kindName;
313
+ if (node.kind === 'ImportKeyword') return 'import';
314
+ return undefined;
315
+ }
316
+
317
+ function stringLiteralFromTsExpression(node) {
318
+ if (!node) return undefined; if (typeof node.value === 'string') return node.value;
319
+ const rawText = typeof node.text === 'string' && typeof node.escapedText !== 'string' ? typeScriptExpressionText(node) : undefined; return rawText && /^['"`]/.test(rawText) ? node.text : undefined;
283
320
  }
@@ -0,0 +1,296 @@
1
+ import { hashSemanticValue } from '@shapeshift-labs/frontier-lang-kernel';
2
+ import { idFragment } from '../../native-import-utils.js';
3
+ import {
4
+ createParserSpanCoverageProof,
5
+ createPreservedSourceOwnershipAnchor,
6
+ preservedOwnershipAnchorKind,
7
+ preservedSourceSegmentRole
8
+ } from '../../native-source-preservation-ownership.js';
9
+ import { createNativeSourcePreservation } from './createNativeSourcePreservation.js';
10
+
11
+ const PARSER_EVIDENCE = 'typescript-compiler-api-source-file-scanner';
12
+
13
+ export function createTypeScriptSourceFilePreservation(sourceFile, input, options = {}) {
14
+ const ts = options.ts;
15
+ const sourceText = sourceFileText(sourceFile, input);
16
+ if (!sourceText || !ts || typeof ts.createScanner !== 'function') return undefined;
17
+ const sourceHash = hashSemanticValue(sourceText);
18
+ const tokensAndTrivia = scanTypeScriptSourceFileTokens(sourceFile, input, { ...options, sourceHash, sourceText });
19
+ if (!tokensAndTrivia) return undefined;
20
+ return createNativeSourcePreservation({
21
+ language: input.language ?? options.language ?? 'typescript',
22
+ sourcePath: input.sourcePath,
23
+ sourceHash: input.sourceHash,
24
+ sourceText,
25
+ tokensAndTrivia,
26
+ includeTokens: options.includeTokens !== false,
27
+ includeTrivia: options.includeTrivia !== false,
28
+ parserSpanCoverageProof: tokensAndTrivia.parserSpanCoverageProof,
29
+ parserTriviaEvidence: tokensAndTrivia.parserTriviaEvidence,
30
+ metadata: {
31
+ parserTokenTriviaEvidence: PARSER_EVIDENCE,
32
+ parserTokenTriviaSource: 'typescript-source-file',
33
+ parserSpanCoverageProof: tokensAndTrivia.parserSpanCoverageProof,
34
+ ...(options.sourcePreservationMetadata ?? {})
35
+ }
36
+ });
37
+ }
38
+
39
+ function scanTypeScriptSourceFileTokens(sourceFile, input, options) {
40
+ const ts = options.ts;
41
+ const sourceText = options.sourceText;
42
+ const scanner = ts.createScanner(
43
+ options.scriptTarget ?? ts.ScriptTarget?.Latest ?? ts.ScriptTarget?.ESNext ?? 99,
44
+ false,
45
+ languageVariant(ts, input, options),
46
+ sourceText,
47
+ undefined,
48
+ 0,
49
+ sourceText.length
50
+ );
51
+ const lineStarts = sourceLineStarts(sourceFile, sourceText);
52
+ const tokens = [];
53
+ const trivia = [];
54
+ const maxTokens = Number.isFinite(options.maxTokens) ? Math.max(0, options.maxTokens) : 20000;
55
+ const maxTrivia = Number.isFinite(options.maxTrivia) ? Math.max(0, options.maxTrivia) : 20000;
56
+ let truncated = false;
57
+ for (let kind = scanner.scan(); !isEndOfFile(ts, kind); kind = scanner.scan()) {
58
+ const start = scanner.getTokenPos();
59
+ const end = scanner.getTextPos();
60
+ if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) continue;
61
+ const text = sourceText.slice(start, end);
62
+ const mappedKind = sourceSegmentKind(ts, kind, text, input, options);
63
+ const target = preservedSourceSegmentRole(mappedKind) === 'trivia' ? trivia : tokens;
64
+ const max = target === tokens ? maxTokens : maxTrivia;
65
+ if (target.length >= max) {
66
+ truncated = true;
67
+ continue;
68
+ }
69
+ target.push(preservedParserSegment({
70
+ index: target.length,
71
+ kind: mappedKind,
72
+ text,
73
+ start,
74
+ end,
75
+ lineStarts,
76
+ sourceHash: options.sourceHash,
77
+ sourcePath: input.sourcePath,
78
+ syntaxKind: syntaxKindName(ts, kind)
79
+ }));
80
+ }
81
+ const parserSpanCoverageProof = createParserSpanCoverageProof({
82
+ sourceText,
83
+ sourcePath: input.sourcePath,
84
+ sourceHash: options.sourceHash,
85
+ segments: [...tokens, ...trivia],
86
+ tokenCount: tokens.length,
87
+ triviaCount: trivia.length,
88
+ commentCount: trivia.filter((entry) => isCommentKind(entry.kind)).length,
89
+ parserEvidence: PARSER_EVIDENCE,
90
+ adapterId: input.adapterId ?? options.adapterId ?? 'frontier.typescript-compiler-native-importer',
91
+ evidenceId: `${input.adapterId ?? options.adapterId ?? 'frontier.typescript-compiler-native-importer'}:parser-span-coverage:${idFragment(input.sourcePath ?? options.sourceHash)}`,
92
+ languageMode: sourceLanguageMode(ts, input, options),
93
+ boundedLanguages: ['javascript', 'typescript', 'jsx', 'tsx'],
94
+ truncated
95
+ });
96
+ const parserTriviaEvidence = parserTriviaEvidenceForSpanCoverage(parserSpanCoverageProof, {
97
+ sourceHash: options.sourceHash,
98
+ sourcePath: input.sourcePath,
99
+ adapterId: input.adapterId ?? options.adapterId ?? 'frontier.typescript-compiler-native-importer',
100
+ truncated
101
+ });
102
+ return {
103
+ tokens: tokens.map((entry) => withParserTriviaEvidence(entry, parserTriviaEvidence)),
104
+ trivia: trivia.map((entry) => withParserTriviaEvidence(entry, parserTriviaEvidence)),
105
+ truncated,
106
+ parserEvidence: PARSER_EVIDENCE,
107
+ parserSpanCoverageProof,
108
+ parserTriviaEvidence
109
+ };
110
+ }
111
+
112
+ function preservedParserSegment(input) {
113
+ const role = preservedSourceSegmentRole(input.kind);
114
+ const textHash = hashSemanticValue(input.text);
115
+ const span = {
116
+ sourceId: input.sourceHash,
117
+ path: input.sourcePath,
118
+ ...sourceSpanPositions(input.start, input.end, input.lineStarts)
119
+ };
120
+ return {
121
+ id: `${input.kind}_${input.index + 1}_${idFragment(input.start)}`,
122
+ kind: input.kind,
123
+ text: input.text,
124
+ textHash,
125
+ span,
126
+ ownershipAnchor: createPreservedSourceOwnershipAnchor({
127
+ kind: input.kind,
128
+ role,
129
+ text: input.text,
130
+ textHash,
131
+ sourcePath: input.sourcePath,
132
+ sourceHash: input.sourceHash,
133
+ span,
134
+ anchorKind: preservedOwnershipAnchorKind(input.kind, role),
135
+ parserEvidence: PARSER_EVIDENCE,
136
+ parserTriviaEvidence: {
137
+ status: 'exact',
138
+ exactParserTrivia: true,
139
+ losslessCst: true,
140
+ sourceHash: input.sourceHash,
141
+ parserEvidence: PARSER_EVIDENCE,
142
+ adapterId: 'typescript-compiler-api'
143
+ }
144
+ }),
145
+ metadata: { syntaxKind: input.syntaxKind, parserEvidence: PARSER_EVIDENCE }
146
+ };
147
+ }
148
+
149
+ function withParserTriviaEvidence(record, parserTriviaEvidence) {
150
+ const role = preservedSourceSegmentRole(record.kind);
151
+ return {
152
+ ...record,
153
+ ownershipAnchor: createPreservedSourceOwnershipAnchor({
154
+ kind: record.kind,
155
+ role,
156
+ text: record.text,
157
+ textHash: record.textHash,
158
+ sourcePath: record.span.path,
159
+ sourceHash: record.span.sourceId,
160
+ span: record.span,
161
+ anchorKind: preservedOwnershipAnchorKind(record.kind, role),
162
+ parserEvidence: PARSER_EVIDENCE,
163
+ parserTriviaEvidence
164
+ }),
165
+ metadata: {
166
+ ...record.metadata,
167
+ parserSpanCoverageStatus: parserTriviaEvidence.parserSpanCoverageProof?.status
168
+ }
169
+ };
170
+ }
171
+
172
+ function sourceSpanPositions(start, end, lineStarts) {
173
+ const startLine = lineForOffset(lineStarts, start);
174
+ const endLine = lineForOffset(lineStarts, end);
175
+ return {
176
+ start,
177
+ end,
178
+ startLine: startLine + 1,
179
+ startColumn: start - lineStarts[startLine] + 1,
180
+ endLine: endLine + 1,
181
+ endColumn: end - lineStarts[endLine] + 1
182
+ };
183
+ }
184
+
185
+ function sourceLineStarts(sourceFile, sourceText) {
186
+ const starts = typeof sourceFile.getLineStarts === 'function' ? [...sourceFile.getLineStarts()] : [0];
187
+ if (starts.length > 1 || sourceText.length === 0) return starts;
188
+ for (let index = 0; index < sourceText.length; index += 1) {
189
+ const char = sourceText[index];
190
+ if (char === '\r' || char === '\n') {
191
+ if (char === '\r' && sourceText[index + 1] === '\n') index += 1;
192
+ starts.push(index + 1);
193
+ }
194
+ }
195
+ return starts;
196
+ }
197
+
198
+ function lineForOffset(lineStarts, offset) {
199
+ let low = 0;
200
+ let high = lineStarts.length - 1;
201
+ while (low <= high) {
202
+ const mid = (low + high) >> 1;
203
+ if (lineStarts[mid] <= offset && (mid === lineStarts.length - 1 || lineStarts[mid + 1] > offset)) return mid;
204
+ if (lineStarts[mid] > offset) high = mid - 1;
205
+ else low = mid + 1;
206
+ }
207
+ return 0;
208
+ }
209
+
210
+ function sourceSegmentKind(ts, kind, text, input, options) {
211
+ const name = syntaxKindName(ts, kind);
212
+ if (text === '\r' || text === '\n' || text === '\r\n') return 'newline';
213
+ if (/^[ \t\v\f]+$/.test(text)) return 'whitespace';
214
+ if (String(text).startsWith('//') || String(text).startsWith('/*')) return preservedCommentKind(text);
215
+ if (/^[0-9]/.test(text)) return 'number';
216
+ if (String(text).startsWith('`')) return 'template';
217
+ if (String(text).startsWith('"') || String(text).startsWith("'")) return 'string';
218
+ if (isJsxSource(ts, input, options) && (text === '<' || text === '</' || text === '/>')) return 'jsx';
219
+ if (name === 'WhitespaceTrivia') return 'whitespace';
220
+ if (name === 'NewLineTrivia') return 'newline';
221
+ if (name === 'ShebangTrivia') return 'shebang';
222
+ if (name === 'SingleLineCommentTrivia' || name === 'MultiLineCommentTrivia') return preservedCommentKind(text);
223
+ if (name === 'Identifier' || name === 'PrivateIdentifier') return 'identifier';
224
+ if (name.endsWith('Keyword')) return 'keyword';
225
+ if (name.includes('StringLiteral')) return 'string';
226
+ if (name.includes('Template')) return 'template';
227
+ if (name === 'NumericLiteral' || name === 'BigIntLiteral') return 'number';
228
+ if (name === 'RegularExpressionLiteral') return 'regex-like';
229
+ if (name.includes('Jsx')) return 'jsx';
230
+ if (/^[()[\]{};,]$/.test(text)) return 'punctuation';
231
+ if (/^[=+\-*/%&|^!<>?:.]+$/.test(text)) return 'operator';
232
+ return 'unknown';
233
+ }
234
+
235
+ function sourceFileText(sourceFile, input) {
236
+ return typeof sourceFile?.getFullText === 'function'
237
+ ? sourceFile.getFullText()
238
+ : typeof sourceFile?.text === 'string' ? sourceFile.text : input.sourceText;
239
+ }
240
+
241
+ function languageVariant(ts, input, options) {
242
+ return isJsxSource(ts, input, options) ? ts.LanguageVariant?.JSX ?? 1 : ts.LanguageVariant?.Standard ?? 0;
243
+ }
244
+
245
+ function parserTriviaEvidenceForSpanCoverage(parserSpanCoverageProof, input) {
246
+ const exact = parserSpanCoverageProof?.status === 'exact';
247
+ const blockReasonCodes = exact ? [] : [
248
+ 'exact-parser-trivia-span-coverage-blocked',
249
+ ...(parserSpanCoverageProof?.blockReasonCodes ?? []),
250
+ input.truncated ? 'source-preservation-truncated' : undefined
251
+ ].filter(Boolean);
252
+ return {
253
+ status: exact ? 'exact' : 'blocked',
254
+ exactParserTrivia: exact,
255
+ losslessCst: exact,
256
+ sourceHash: input.sourceHash,
257
+ adapterId: input.adapterId,
258
+ evidenceId: `${input.adapterId}:parser-trivia:${idFragment(input.sourcePath ?? input.sourceHash)}`,
259
+ parserEvidence: PARSER_EVIDENCE,
260
+ parserSpanCoverageProof,
261
+ ...(exact ? {} : { blockReasonCodes })
262
+ };
263
+ }
264
+
265
+ function sourceLanguageMode(ts, input, options) {
266
+ const sourcePath = String(input.sourcePath ?? '').toLowerCase();
267
+ if (sourcePath.endsWith('.tsx') || options.scriptKind === ts.ScriptKind?.TSX) return 'tsx';
268
+ if (sourcePath.endsWith('.jsx') || options.scriptKind === ts.ScriptKind?.JSX) return 'jsx';
269
+ if (sourcePath.endsWith('.js') || sourcePath.endsWith('.mjs') || sourcePath.endsWith('.cjs') || options.scriptKind === ts.ScriptKind?.JS) return 'javascript';
270
+ return 'typescript';
271
+ }
272
+
273
+ function isJsxSource(ts, input, options) {
274
+ const sourcePath = String(input.sourcePath ?? '').toLowerCase();
275
+ return sourcePath.endsWith('.tsx') || sourcePath.endsWith('.jsx') || options.scriptKind === ts.ScriptKind?.TSX || options.scriptKind === ts.ScriptKind?.JSX;
276
+ }
277
+
278
+ function isEndOfFile(ts, kind) {
279
+ return kind === ts.SyntaxKind?.EndOfFileToken || syntaxKindName(ts, kind) === 'EndOfFileToken';
280
+ }
281
+
282
+ function syntaxKindName(ts, kind) {
283
+ return ts?.SyntaxKind?.[kind] ?? String(kind);
284
+ }
285
+
286
+ function preservedCommentKind(text) {
287
+ const value = String(text ?? '');
288
+ if (/[#@]\s*sourceMappingURL=|[#@]\s*sourceURL=/.test(value)) return 'source-map-comment';
289
+ if (value.startsWith('/**') && value[3] !== '/') return 'jsdoc-comment';
290
+ if (value.startsWith('/*')) return 'block-comment';
291
+ return 'comment';
292
+ }
293
+
294
+ function isCommentKind(kind) {
295
+ return kind === 'comment' || kind === 'jsdoc-comment' || kind === 'block-comment' || kind === 'source-map-comment';
296
+ }