polen 0.10.0-next.11 → 0.10.0-next.12

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 (324) hide show
  1. package/build/api/builder/builder.js +1 -1
  2. package/build/api/builder/builder.js.map +1 -1
  3. package/build/api/config/load.js +1 -1
  4. package/build/api/config/load.js.map +1 -1
  5. package/build/api/vite/plugins/build.js +1 -1
  6. package/build/api/vite/plugins/build.js.map +1 -1
  7. package/build/api/vite/plugins/core.d.ts.map +1 -1
  8. package/build/api/vite/plugins/core.js +0 -2
  9. package/build/api/vite/plugins/core.js.map +1 -1
  10. package/build/api/vite/plugins/pages.js +1 -1
  11. package/build/api/vite/plugins/pages.js.map +1 -1
  12. package/build/exports/components.d.ts +4 -1
  13. package/build/exports/components.d.ts.map +1 -1
  14. package/build/exports/components.js +4 -1
  15. package/build/exports/components.js.map +1 -1
  16. package/build/lib/demos/config-schema.d.ts +6 -6
  17. package/build/lib/github-actions/runner.js +2 -2
  18. package/build/lib/github-actions/runner.js.map +1 -1
  19. package/build/lib/graphql-document/$$.d.ts +5 -0
  20. package/build/lib/graphql-document/$$.d.ts.map +1 -0
  21. package/build/lib/graphql-document/$$.js +5 -0
  22. package/build/lib/graphql-document/$$.js.map +1 -0
  23. package/build/lib/graphql-document/$.d.ts +2 -0
  24. package/build/lib/graphql-document/$.d.ts.map +1 -0
  25. package/build/lib/graphql-document/$.js +2 -0
  26. package/build/lib/graphql-document/$.js.map +1 -0
  27. package/build/lib/graphql-document/analysis.d.ts +44 -0
  28. package/build/lib/graphql-document/analysis.d.ts.map +1 -0
  29. package/build/lib/graphql-document/analysis.js +361 -0
  30. package/build/lib/graphql-document/analysis.js.map +1 -0
  31. package/build/lib/graphql-document/components/GraphQLDocument.d.ts +42 -0
  32. package/build/lib/graphql-document/components/GraphQLDocument.d.ts.map +1 -0
  33. package/build/lib/graphql-document/components/GraphQLDocument.js +173 -0
  34. package/build/lib/graphql-document/components/GraphQLDocument.js.map +1 -0
  35. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.d.ts +7 -0
  36. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.d.ts.map +1 -0
  37. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.js +45 -0
  38. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.js.map +1 -0
  39. package/build/lib/graphql-document/components/HoverTooltip.d.ts +35 -0
  40. package/build/lib/graphql-document/components/HoverTooltip.d.ts.map +1 -0
  41. package/build/lib/graphql-document/components/HoverTooltip.js +132 -0
  42. package/build/lib/graphql-document/components/HoverTooltip.js.map +1 -0
  43. package/build/lib/graphql-document/components/IdentifierLink.d.ts +37 -0
  44. package/build/lib/graphql-document/components/IdentifierLink.d.ts.map +1 -0
  45. package/build/lib/graphql-document/components/IdentifierLink.js +141 -0
  46. package/build/lib/graphql-document/components/IdentifierLink.js.map +1 -0
  47. package/build/lib/graphql-document/components/index.d.ts +5 -0
  48. package/build/lib/graphql-document/components/index.d.ts.map +1 -0
  49. package/build/lib/graphql-document/components/index.js +5 -0
  50. package/build/lib/graphql-document/components/index.js.map +1 -0
  51. package/build/lib/graphql-document/example.d.ts +25 -0
  52. package/build/lib/graphql-document/example.d.ts.map +1 -0
  53. package/build/lib/graphql-document/example.js +140 -0
  54. package/build/lib/graphql-document/example.js.map +1 -0
  55. package/build/lib/graphql-document/graphql-document.d.ts +35 -0
  56. package/build/lib/graphql-document/graphql-document.d.ts.map +1 -0
  57. package/build/lib/graphql-document/graphql-document.js +36 -0
  58. package/build/lib/graphql-document/graphql-document.js.map +1 -0
  59. package/build/lib/graphql-document/positioning-simple.d.ts +68 -0
  60. package/build/lib/graphql-document/positioning-simple.d.ts.map +1 -0
  61. package/build/lib/graphql-document/positioning-simple.js +197 -0
  62. package/build/lib/graphql-document/positioning-simple.js.map +1 -0
  63. package/build/lib/graphql-document/schema-context.d.ts +8 -0
  64. package/build/lib/graphql-document/schema-context.d.ts.map +1 -0
  65. package/build/lib/graphql-document/schema-context.js +11 -0
  66. package/build/lib/graphql-document/schema-context.js.map +1 -0
  67. package/build/lib/graphql-document/schema-integration-example.d.ts +27 -0
  68. package/build/lib/graphql-document/schema-integration-example.d.ts.map +1 -0
  69. package/build/lib/graphql-document/schema-integration-example.js +297 -0
  70. package/build/lib/graphql-document/schema-integration-example.js.map +1 -0
  71. package/build/lib/graphql-document/schema-integration.d.ts +135 -0
  72. package/build/lib/graphql-document/schema-integration.d.ts.map +1 -0
  73. package/build/lib/graphql-document/schema-integration.js +328 -0
  74. package/build/lib/graphql-document/schema-integration.js.map +1 -0
  75. package/build/lib/graphql-document/types.d.ts +117 -0
  76. package/build/lib/graphql-document/types.d.ts.map +1 -0
  77. package/build/lib/graphql-document/types.js +2 -0
  78. package/build/lib/graphql-document/types.js.map +1 -0
  79. package/build/template/components/ArgumentAnnotation.js +10 -0
  80. package/build/template/components/ArgumentAnnotation.js.map +1 -0
  81. package/build/template/components/ArgumentList.js +9 -0
  82. package/build/template/components/ArgumentList.js.map +1 -0
  83. package/build/template/components/ArgumentListAnnotation.js +15 -0
  84. package/build/template/components/ArgumentListAnnotation.js.map +1 -0
  85. package/build/template/components/Changelog.js +44 -0
  86. package/build/template/components/Changelog.js.map +1 -0
  87. package/build/template/components/{CodeBlock.jsx → CodeBlock.js} +4 -5
  88. package/build/template/components/{CodeBlock.jsx.map → CodeBlock.js.map} +1 -1
  89. package/build/template/components/{CodeBlockEnhancer.jsx → CodeBlockEnhancer.js} +4 -4
  90. package/build/template/components/CodeBlockEnhancer.js.map +1 -0
  91. package/build/template/components/DeprecationReason.js +9 -0
  92. package/build/template/components/DeprecationReason.js.map +1 -0
  93. package/build/template/components/Description.js +9 -0
  94. package/build/template/components/Description.js.map +1 -0
  95. package/build/template/components/Field.js +14 -0
  96. package/build/template/components/Field.js.map +1 -0
  97. package/build/template/components/{FieldList.jsx → FieldList.js} +4 -5
  98. package/build/template/components/FieldList.js.map +1 -0
  99. package/build/template/components/{FieldListSection.jsx → FieldListSection.js} +4 -6
  100. package/build/template/components/FieldListSection.js.map +1 -0
  101. package/build/template/components/HamburgerMenu.js +30 -0
  102. package/build/template/components/HamburgerMenu.js.map +1 -0
  103. package/build/template/components/Link.d.ts +1 -1
  104. package/build/template/components/{Link.jsx → Link.js} +4 -5
  105. package/build/template/components/Link.js.map +1 -0
  106. package/build/template/components/Logo.js +20 -0
  107. package/build/template/components/Logo.js.map +1 -0
  108. package/build/template/components/MDXComponents.d.ts +11 -0
  109. package/build/template/components/MDXComponents.d.ts.map +1 -0
  110. package/build/template/components/MDXComponents.js +70 -0
  111. package/build/template/components/MDXComponents.js.map +1 -0
  112. package/build/template/components/{Markdown.jsx → Markdown.js} +3 -2
  113. package/build/template/components/Markdown.js.map +1 -0
  114. package/build/template/components/MissingSchema.d.ts +1 -1
  115. package/build/template/components/MissingSchema.d.ts.map +1 -1
  116. package/build/template/components/MissingSchema.js +5 -0
  117. package/build/template/components/MissingSchema.js.map +1 -0
  118. package/build/template/components/NamedType.js +12 -0
  119. package/build/template/components/NamedType.js.map +1 -0
  120. package/build/template/components/NotFound.js +7 -0
  121. package/build/template/components/NotFound.js.map +1 -0
  122. package/build/template/components/{RadixLink.jsx → RadixLink.js} +1 -1
  123. package/build/template/components/RadixLink.js.map +1 -0
  124. package/build/template/components/TestComponent.d.ts +5 -0
  125. package/build/template/components/TestComponent.d.ts.map +1 -0
  126. package/build/template/components/TestComponent.js +7 -0
  127. package/build/template/components/TestComponent.js.map +1 -0
  128. package/build/template/components/Texts/{MinorHeading.jsx → MinorHeading.js} +4 -3
  129. package/build/template/components/Texts/MinorHeading.js.map +1 -0
  130. package/build/template/components/Texts/texts.js +1 -1
  131. package/build/template/components/Texts/texts.js.map +1 -1
  132. package/build/template/components/ThemeToggle.js +9 -0
  133. package/build/template/components/ThemeToggle.js.map +1 -0
  134. package/build/template/components/{TypeAnnotation.jsx → TypeAnnotation.js} +8 -18
  135. package/build/template/components/TypeAnnotation.js.map +1 -0
  136. package/build/template/components/TypeFieldsLinkList.js +9 -0
  137. package/build/template/components/TypeFieldsLinkList.js.map +1 -0
  138. package/build/template/components/TypeIndex.js +17 -0
  139. package/build/template/components/TypeIndex.js.map +1 -0
  140. package/build/template/components/content/$$.d.ts +1 -0
  141. package/build/template/components/content/$$.d.ts.map +1 -1
  142. package/build/template/components/content/$$.js +1 -0
  143. package/build/template/components/content/$$.js.map +1 -1
  144. package/build/template/components/content/GraphQLDocumentWithSchema.d.ts +8 -0
  145. package/build/template/components/content/GraphQLDocumentWithSchema.d.ts.map +1 -0
  146. package/build/template/components/content/GraphQLDocumentWithSchema.js +16 -0
  147. package/build/template/components/content/GraphQLDocumentWithSchema.js.map +1 -0
  148. package/build/template/components/content/GraphQLDocumentWrapper.d.ts +7 -0
  149. package/build/template/components/content/GraphQLDocumentWrapper.d.ts.map +1 -0
  150. package/build/template/components/content/GraphQLDocumentWrapper.js +62 -0
  151. package/build/template/components/content/GraphQLDocumentWrapper.js.map +1 -0
  152. package/build/template/components/graphql/graphql.d.ts +2 -2
  153. package/build/template/components/graphql/graphql.js +3 -0
  154. package/build/template/components/graphql/graphql.js.map +1 -0
  155. package/build/template/components/graphql/index.d.ts +1 -1
  156. package/build/template/components/graphql/index.js +1 -1
  157. package/build/template/components/graphql/index.js.map +1 -1
  158. package/build/template/components/graphql/{type-kind-icon.jsx → type-kind-icon.js} +3 -2
  159. package/build/template/components/graphql/type-kind-icon.js.map +1 -0
  160. package/build/template/components/graphql/type-link.js +11 -0
  161. package/build/template/components/graphql/type-link.js.map +1 -0
  162. package/build/template/components/sidebar/Sidebar.d.ts +1 -1
  163. package/build/template/components/sidebar/Sidebar.d.ts.map +1 -1
  164. package/build/template/components/sidebar/Sidebar.js +11 -0
  165. package/build/template/components/sidebar/Sidebar.js.map +1 -0
  166. package/build/template/components/sidebar/{SidebarItem.jsx → SidebarItem.js} +15 -32
  167. package/build/template/components/sidebar/SidebarItem.js.map +1 -0
  168. package/build/template/components/sidebar/ToggleButton.d.ts +1 -1
  169. package/build/template/components/sidebar/ToggleButton.d.ts.map +1 -1
  170. package/build/template/components/sidebar/ToggleButton.js +5 -0
  171. package/build/template/components/sidebar/ToggleButton.js.map +1 -0
  172. package/build/template/contexts/{ThemeContext.jsx → ThemeContext.js} +3 -4
  173. package/build/template/contexts/{ThemeContext.jsx.map → ThemeContext.js.map} +1 -1
  174. package/build/template/entry.client.d.ts +1 -0
  175. package/build/template/entry.client.d.ts.map +1 -1
  176. package/build/template/{entry.client.jsx → entry.client.js} +5 -6
  177. package/build/template/entry.client.js.map +1 -0
  178. package/build/template/routes/changelog.d.ts +1 -1
  179. package/build/template/routes/{changelog.jsx → changelog.js} +5 -4
  180. package/build/template/routes/changelog.js.map +1 -0
  181. package/build/template/routes/{index.jsx → index.js} +3 -2
  182. package/build/template/routes/index.js.map +1 -0
  183. package/build/template/routes/reference.$type.$field.d.ts +1 -1
  184. package/build/template/routes/{reference.$type.$field.jsx → reference.$type.$field.js} +6 -5
  185. package/build/template/routes/reference.$type.$field.js.map +1 -0
  186. package/build/template/routes/reference.$type.d.ts +1 -1
  187. package/build/template/routes/{reference.$type.jsx → reference.$type.js} +6 -5
  188. package/build/template/routes/reference.$type.js.map +1 -0
  189. package/build/template/routes/reference.d.ts +2 -2
  190. package/build/template/routes/{reference.jsx → reference.js} +6 -7
  191. package/build/template/routes/reference.js.map +1 -0
  192. package/build/template/routes/root.d.ts +2 -2
  193. package/build/template/routes/root.d.ts.map +1 -1
  194. package/build/template/routes/{root.jsx → root.js} +46 -88
  195. package/build/template/routes/root.js.map +1 -0
  196. package/build/template/routes.js +5 -0
  197. package/build/template/routes.js.map +1 -0
  198. package/build/template/server/app.js +1 -1
  199. package/build/template/server/app.js.map +1 -1
  200. package/build/template/server/{render-page.jsx → render-page.js} +3 -4
  201. package/build/template/server/render-page.js.map +1 -0
  202. package/build/template/server/ssg/generate.js +1 -1
  203. package/build/template/server/ssg/generate.js.map +1 -1
  204. package/build/template/server/ssg/get-route-paths.js +1 -1
  205. package/build/template/server/ssg/get-route-paths.js.map +1 -1
  206. package/build/template/server/view.js +1 -1
  207. package/build/template/server/view.js.map +1 -1
  208. package/package.json +56 -8
  209. package/src/api/vite/plugins/core.ts +0 -3
  210. package/src/api/vite/plugins/pages.ts +1 -1
  211. package/src/exports/components.ts +4 -1
  212. package/src/lib/graphql-document/$$.ts +4 -0
  213. package/src/lib/graphql-document/$.test.ts +132 -0
  214. package/src/lib/graphql-document/$.ts +1 -0
  215. package/src/lib/graphql-document/README.md +102 -0
  216. package/src/lib/graphql-document/analysis.ts +415 -0
  217. package/src/lib/graphql-document/components/GraphQLDocument.tsx +284 -0
  218. package/src/lib/graphql-document/components/GraphQLDocument.unit.test.ts +188 -0
  219. package/src/lib/graphql-document/components/GraphQLDocumentWithSchema.tsx +70 -0
  220. package/src/lib/graphql-document/components/HoverTooltip.tsx +282 -0
  221. package/src/lib/graphql-document/components/IdentifierLink.tsx +221 -0
  222. package/src/lib/graphql-document/components/index.ts +4 -0
  223. package/src/lib/graphql-document/demo.md +155 -0
  224. package/src/lib/graphql-document/example.ts +163 -0
  225. package/src/lib/graphql-document/graphql-document.ts +37 -0
  226. package/src/lib/graphql-document/positioning-simple.test.ts +252 -0
  227. package/src/lib/graphql-document/positioning-simple.ts +271 -0
  228. package/src/lib/graphql-document/schema-context.tsx +20 -0
  229. package/src/lib/graphql-document/schema-integration-example.ts +341 -0
  230. package/src/lib/graphql-document/schema-integration.test.ts +365 -0
  231. package/src/lib/graphql-document/schema-integration.ts +497 -0
  232. package/src/lib/graphql-document/types.ts +129 -0
  233. package/src/template/components/ArgumentAnnotation.tsx +1 -1
  234. package/src/template/components/ArgumentList.tsx +1 -1
  235. package/src/template/components/ArgumentListAnnotation.tsx +2 -2
  236. package/src/template/components/CodeBlockEnhancer.tsx +21 -21
  237. package/src/template/components/DeprecationReason.tsx +1 -1
  238. package/src/template/components/Description.tsx +1 -1
  239. package/src/template/components/Field.tsx +4 -4
  240. package/src/template/components/FieldList.tsx +1 -1
  241. package/src/template/components/FieldListSection.tsx +1 -1
  242. package/src/template/components/Link.tsx +2 -2
  243. package/src/template/components/MDXComponents.tsx +101 -0
  244. package/src/template/components/NamedType.tsx +2 -2
  245. package/src/template/components/TestComponent.tsx +6 -0
  246. package/src/template/components/TypeAnnotation.tsx +1 -1
  247. package/src/template/components/TypeFieldsLinkList.tsx +1 -1
  248. package/src/template/components/TypeIndex.tsx +1 -1
  249. package/src/template/components/content/$$.ts +1 -0
  250. package/src/template/components/content/GraphQLDocumentWithSchema.tsx +18 -0
  251. package/src/template/components/content/GraphQLDocumentWrapper.tsx +82 -0
  252. package/src/template/components/graphql/graphql.tsx +2 -2
  253. package/src/template/components/graphql/index.ts +1 -1
  254. package/src/template/components/graphql/type-link.tsx +2 -2
  255. package/src/template/entry.client.tsx +2 -2
  256. package/src/template/routes/changelog.tsx +1 -1
  257. package/src/template/routes/reference.$type.$field.tsx +3 -3
  258. package/src/template/routes/reference.$type.tsx +3 -3
  259. package/src/template/routes/reference.tsx +3 -3
  260. package/src/template/routes/root.tsx +36 -25
  261. package/src/template/routes.tsx +1 -1
  262. package/src/template/server/app.ts +1 -1
  263. package/src/template/server/ssg/generate.ts +1 -1
  264. package/src/template/server/ssg/get-route-paths.ts +1 -1
  265. package/src/template/server/view.ts +1 -1
  266. package/src/template/styles/code-block.css +32 -0
  267. package/build/template/components/ArgumentAnnotation.jsx +0 -16
  268. package/build/template/components/ArgumentAnnotation.jsx.map +0 -1
  269. package/build/template/components/ArgumentList.jsx +0 -16
  270. package/build/template/components/ArgumentList.jsx.map +0 -1
  271. package/build/template/components/ArgumentListAnnotation.jsx +0 -23
  272. package/build/template/components/ArgumentListAnnotation.jsx.map +0 -1
  273. package/build/template/components/Changelog.jsx +0 -68
  274. package/build/template/components/Changelog.jsx.map +0 -1
  275. package/build/template/components/CodeBlockEnhancer.jsx.map +0 -1
  276. package/build/template/components/DeprecationReason.jsx +0 -10
  277. package/build/template/components/DeprecationReason.jsx.map +0 -1
  278. package/build/template/components/Description.jsx +0 -10
  279. package/build/template/components/Description.jsx.map +0 -1
  280. package/build/template/components/Field.jsx +0 -22
  281. package/build/template/components/Field.jsx.map +0 -1
  282. package/build/template/components/FieldList.jsx.map +0 -1
  283. package/build/template/components/FieldListSection.jsx.map +0 -1
  284. package/build/template/components/HamburgerMenu.jsx +0 -53
  285. package/build/template/components/HamburgerMenu.jsx.map +0 -1
  286. package/build/template/components/Link.jsx.map +0 -1
  287. package/build/template/components/Logo.jsx +0 -29
  288. package/build/template/components/Logo.jsx.map +0 -1
  289. package/build/template/components/Markdown.jsx.map +0 -1
  290. package/build/template/components/MissingSchema.jsx +0 -4
  291. package/build/template/components/MissingSchema.jsx.map +0 -1
  292. package/build/template/components/NamedType.jsx +0 -17
  293. package/build/template/components/NamedType.jsx.map +0 -1
  294. package/build/template/components/NotFound.jsx +0 -26
  295. package/build/template/components/NotFound.jsx.map +0 -1
  296. package/build/template/components/RadixLink.jsx.map +0 -1
  297. package/build/template/components/Texts/MinorHeading.jsx.map +0 -1
  298. package/build/template/components/ThemeToggle.jsx +0 -10
  299. package/build/template/components/ThemeToggle.jsx.map +0 -1
  300. package/build/template/components/TypeAnnotation.jsx.map +0 -1
  301. package/build/template/components/TypeFieldsLinkList.jsx +0 -17
  302. package/build/template/components/TypeFieldsLinkList.jsx.map +0 -1
  303. package/build/template/components/TypeIndex.jsx +0 -27
  304. package/build/template/components/TypeIndex.jsx.map +0 -1
  305. package/build/template/components/graphql/graphql.jsx +0 -3
  306. package/build/template/components/graphql/graphql.jsx.map +0 -1
  307. package/build/template/components/graphql/type-kind-icon.jsx.map +0 -1
  308. package/build/template/components/graphql/type-link.jsx +0 -16
  309. package/build/template/components/graphql/type-link.jsx.map +0 -1
  310. package/build/template/components/sidebar/Sidebar.jsx +0 -15
  311. package/build/template/components/sidebar/Sidebar.jsx.map +0 -1
  312. package/build/template/components/sidebar/SidebarItem.jsx.map +0 -1
  313. package/build/template/components/sidebar/ToggleButton.jsx +0 -6
  314. package/build/template/components/sidebar/ToggleButton.jsx.map +0 -1
  315. package/build/template/entry.client.jsx.map +0 -1
  316. package/build/template/routes/changelog.jsx.map +0 -1
  317. package/build/template/routes/index.jsx.map +0 -1
  318. package/build/template/routes/reference.$type.$field.jsx.map +0 -1
  319. package/build/template/routes/reference.$type.jsx.map +0 -1
  320. package/build/template/routes/reference.jsx.map +0 -1
  321. package/build/template/routes/root.jsx.map +0 -1
  322. package/build/template/routes.jsx +0 -5
  323. package/build/template/routes.jsx.map +0 -1
  324. package/build/template/server/render-page.jsx.map +0 -1
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Example usage of the GraphQL Document Analysis library
3
+ *
4
+ * This demonstrates how to use the foundational layer for extracting
5
+ * identifiers and context from GraphQL documents - the building block
6
+ * for the interactive GraphQL Document Component.
7
+ */
8
+
9
+ import { GraphQLDocument } from './$.ts'
10
+
11
+ // Example GraphQL query with various constructs
12
+ const exampleQuery = `
13
+ query GetPokemonWithAbilities($id: ID!, $limit: Int = 10) {
14
+ pokemon(id: $id) {
15
+ name
16
+ abilities(first: $limit) {
17
+ name
18
+ isHidden
19
+ pokemon {
20
+ name
21
+ }
22
+ }
23
+ ... on ElectricPokemon {
24
+ voltage
25
+ }
26
+ }
27
+ }
28
+
29
+ fragment PokemonBasics on Pokemon {
30
+ name
31
+ type
32
+ level
33
+ }
34
+ `
35
+
36
+ /**
37
+ * Demonstrate basic analysis
38
+ */
39
+ export const analyzeExample = () => {
40
+ console.log('🔍 Analyzing GraphQL Document...\n')
41
+
42
+ const result = GraphQLDocument.analyze(exampleQuery)
43
+
44
+ console.log(`✅ Valid: ${result.isValid}`)
45
+ console.log(`📊 Total identifiers: ${result.identifiers.all.length}`)
46
+ console.log(`🚨 Errors: ${result.errors.length}\n`)
47
+
48
+ // Show identifiers by kind
49
+ for (const [kind, identifiers] of result.identifiers.byKind) {
50
+ console.log(`${getKindEmoji(kind)} ${kind} (${identifiers.length}):`)
51
+ for (const identifier of identifiers) {
52
+ const pos = `${identifier.position.line}:${identifier.position.column}`
53
+ const path = identifier.schemaPath.join(' → ')
54
+ const parent = identifier.parentType ? ` (in ${identifier.parentType})` : ''
55
+ console.log(` • ${identifier.name}${parent} → ${path} @ ${pos}`)
56
+ }
57
+ console.log()
58
+ }
59
+
60
+ return result
61
+ }
62
+
63
+ /**
64
+ * Demonstrate identifier lookup by position
65
+ */
66
+ export const demonstratePositionLookup = () => {
67
+ console.log('📍 Position-based Identifier Lookup...\n')
68
+
69
+ const identifiers = GraphQLDocument.extractIdentifiers(exampleQuery)
70
+
71
+ // Find identifier at a specific position (e.g., cursor position in an editor)
72
+ const targetPosition = 180 // Approximate position of "abilities" field
73
+
74
+ // Find the closest identifier to this position
75
+ let closestIdentifier = null
76
+ let closestDistance = Infinity
77
+
78
+ for (const identifier of identifiers.all) {
79
+ const distance = Math.abs(identifier.position.start - targetPosition)
80
+ if (distance < closestDistance) {
81
+ closestDistance = distance
82
+ closestIdentifier = identifier
83
+ }
84
+ }
85
+
86
+ if (closestIdentifier) {
87
+ console.log(`🎯 Identifier near position ${targetPosition}:`)
88
+ console.log(` Name: ${closestIdentifier.name}`)
89
+ console.log(` Kind: ${closestIdentifier.kind}`)
90
+ console.log(` Schema Path: ${closestIdentifier.schemaPath.join(' → ')}`)
91
+ console.log(` Context: ${JSON.stringify(closestIdentifier.context, null, 2)}`)
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Demonstrate how this enables hyperlink generation
97
+ */
98
+ export const demonstrateHyperlinkGeneration = () => {
99
+ console.log('🔗 Hyperlink Generation Preview...\n')
100
+
101
+ const identifiers = GraphQLDocument.extractIdentifiers(exampleQuery)
102
+
103
+ // Show how each identifier could become a hyperlink
104
+ const typeIdentifiers = identifiers.byKind.get('Type') || []
105
+ const fieldIdentifiers = identifiers.byKind.get('Field') || []
106
+
107
+ console.log('📝 Type References → Schema Links:')
108
+ for (const identifier of typeIdentifiers) {
109
+ const referenceUrl = `/reference/${identifier.name}`
110
+ console.log(` ${identifier.name} → ${referenceUrl}`)
111
+ }
112
+
113
+ console.log('\n📝 Field References → Schema Links:')
114
+ for (const identifier of fieldIdentifiers.slice(0, 5)) { // Show first 5
115
+ const referenceUrl = identifier.parentType
116
+ ? `/reference/${identifier.parentType}#${identifier.name}`
117
+ : `/reference/${identifier.name}`
118
+ console.log(` ${identifier.name} → ${referenceUrl}`)
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Show the foundation for hover tooltips
124
+ */
125
+ export const demonstrateTooltipFoundation = () => {
126
+ console.log('💬 Tooltip Foundation...\n')
127
+
128
+ const identifiers = GraphQLDocument.extractIdentifiers(exampleQuery)
129
+
130
+ // Show context information that would be displayed in tooltips
131
+ const fieldIdentifiers = identifiers.byKind.get('Field') || []
132
+
133
+ for (const identifier of fieldIdentifiers.slice(0, 3)) { // Show first 3
134
+ console.log(`🏷️ ${identifier.name}:`)
135
+ console.log(` Position: Line ${identifier.position.line}, Column ${identifier.position.column}`)
136
+ console.log(` Schema Path: ${identifier.schemaPath.join(' → ')}`)
137
+ console.log(` Parent Type: ${identifier.parentType || 'Root'}`)
138
+ console.log(` Operation: ${identifier.context.operationType || 'None'}`)
139
+ console.log(` Selection Path: ${identifier.context.selectionPath.join(' → ')}`)
140
+ console.log()
141
+ }
142
+ }
143
+
144
+ // Helper function
145
+ function getKindEmoji(kind: string): string {
146
+ const emojis: Record<string, string> = {
147
+ 'Type': '🏷️',
148
+ 'Field': '📋',
149
+ 'Argument': '⚙️',
150
+ 'Variable': '💰',
151
+ 'Directive': '🎯',
152
+ 'Fragment': '🧩',
153
+ }
154
+ return emojis[kind] || '❓'
155
+ }
156
+
157
+ // Run example if executed directly
158
+ if (import.meta.url === `file://${process.argv[1]}`) {
159
+ analyzeExample()
160
+ demonstratePositionLookup()
161
+ demonstrateHyperlinkGeneration()
162
+ demonstrateTooltipFoundation()
163
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * GraphQL Document Component Library
3
+ *
4
+ * Transform static GraphQL code blocks into interactive documentation with
5
+ * hyperlinks, tooltips, and schema validation.
6
+ *
7
+ * ## Features
8
+ * - Hyperlinked identifiers that navigate to reference documentation
9
+ * - Hover tooltips showing type information and descriptions
10
+ * - Schema validation with error highlighting
11
+ * - Build-time GraphQL validation
12
+ * - Support for all GraphQL operations (queries, mutations, subscriptions, fragments)
13
+ *
14
+ * ## Usage
15
+ * ```typescript
16
+ * import { GraphQLDocument } from 'polen/lib/graphql-document'
17
+ *
18
+ * <GraphQLDocument schema={schema}>
19
+ * {`query { user { name } }`}
20
+ * </GraphQLDocument>
21
+ * ```
22
+ *
23
+ * @see {@link GraphQLDocumentWithSchema} for MDX integration
24
+ * @see {@link GraphQLDocument} for the main React component
25
+ */
26
+
27
+ export * from './analysis.ts'
28
+ export * from './components/index.ts'
29
+ export * from './positioning-simple.ts'
30
+ export * from './schema-integration.ts'
31
+ export * from './types.ts'
32
+
33
+ // Re-export key functions for convenience
34
+ export { analyze, analyzer, extractIdentifiers } from './analysis.ts'
35
+ export { GraphQLDocument } from './components/GraphQLDocument.tsx'
36
+ export { createSimpleOverlay, createSimplePositionCalculator } from './positioning-simple.ts'
37
+ export { analyzeWithSchema, createPolenSchemaResolver } from './schema-integration.ts'
@@ -0,0 +1,252 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+
5
+ import { beforeEach, describe, expect, it } from 'vitest'
6
+ import { createSimpleOverlay, createSimplePositionCalculator } from './positioning-simple.ts'
7
+ import type { Identifier } from './types.ts'
8
+
9
+ // Helper to create test identifier
10
+ const createTestIdentifier = (
11
+ name: string,
12
+ line: number,
13
+ column: number,
14
+ kind: Identifier['kind'] = 'Field',
15
+ ): Identifier => ({
16
+ name,
17
+ kind,
18
+ position: {
19
+ start: column - 1,
20
+ end: column - 1 + name.length,
21
+ line,
22
+ column,
23
+ },
24
+ schemaPath: [name],
25
+ context: { selectionPath: [] },
26
+ })
27
+
28
+ describe('Simple Positioning Engine', () => {
29
+ describe('SimplePositionCalculator', () => {
30
+ const calculator = createSimplePositionCalculator()
31
+
32
+ it('should wrap identifiers in spans', () => {
33
+ const container = document.createElement('div')
34
+ container.innerHTML = `
35
+ <pre class="shiki">
36
+ <code>
37
+ <span class="line">query GetUser {</span>
38
+ <span class="line"> user {</span>
39
+ <span class="line"> name</span>
40
+ <span class="line"> }</span>
41
+ <span class="line">}</span>
42
+ </code>
43
+ </pre>
44
+ `
45
+
46
+ const identifiers = [
47
+ createTestIdentifier('query', 1, 1),
48
+ createTestIdentifier('user', 2, 3, 'Field'),
49
+ createTestIdentifier('name', 3, 5, 'Field'),
50
+ ]
51
+
52
+ calculator.prepareCodeBlock(container, identifiers)
53
+
54
+ // Check that identifiers were wrapped
55
+ const wrappedElements = container.querySelectorAll('[data-graphql-id]')
56
+ expect(wrappedElements.length).toBe(3)
57
+
58
+ // Check first wrapped element
59
+ const firstWrapped = wrappedElements[0] as HTMLElement
60
+ expect(firstWrapped.textContent).toBe('query')
61
+ expect(firstWrapped.getAttribute('data-graphql-name')).toBe('query')
62
+ expect(firstWrapped.getAttribute('data-graphql-kind')).toBe('Field')
63
+ })
64
+
65
+ it('should handle multiple identifiers in same line', () => {
66
+ const container = document.createElement('div')
67
+ container.innerHTML = `
68
+ <pre class="shiki">
69
+ <code>
70
+ <span class="line">query GetUserById($id: ID!) {</span>
71
+ </code>
72
+ </pre>
73
+ `
74
+
75
+ const identifiers = [
76
+ createTestIdentifier('query', 1, 1),
77
+ createTestIdentifier('GetUserById', 1, 7),
78
+ createTestIdentifier('$id', 1, 19, 'Variable'),
79
+ createTestIdentifier('ID', 1, 24, 'Type'),
80
+ ]
81
+
82
+ calculator.prepareCodeBlock(container, identifiers)
83
+
84
+ const wrappedElements = container.querySelectorAll('[data-graphql-id]')
85
+ expect(wrappedElements.length).toBe(4)
86
+ })
87
+
88
+ it('should get positions of wrapped identifiers', () => {
89
+ const container = document.createElement('div')
90
+ container.innerHTML = `
91
+ <pre class="shiki">
92
+ <code>
93
+ <span class="line"><span data-graphql-id="0-user-Field" data-graphql-name="user" data-graphql-kind="Field" data-graphql-start="0" data-graphql-end="4" data-graphql-line="1" data-graphql-column="1" data-graphql-path="user">user</span> {</span>
94
+ </code>
95
+ </pre>
96
+ `
97
+
98
+ // Mock getBoundingClientRect
99
+ container.getBoundingClientRect = () => ({
100
+ top: 0,
101
+ left: 0,
102
+ right: 100,
103
+ bottom: 100,
104
+ width: 100,
105
+ height: 100,
106
+ x: 0,
107
+ y: 0,
108
+ toJSON: () => ({}),
109
+ })
110
+
111
+ const userSpan = container.querySelector('[data-graphql-id]') as HTMLElement
112
+ userSpan.getBoundingClientRect = () => ({
113
+ top: 10,
114
+ left: 20,
115
+ right: 60,
116
+ bottom: 30,
117
+ width: 40,
118
+ height: 20,
119
+ x: 20,
120
+ y: 10,
121
+ toJSON: () => ({}),
122
+ })
123
+
124
+ const positions = calculator.getIdentifierPositions(container)
125
+
126
+ expect(positions.size).toBe(1)
127
+ const result = positions.get('0-user-Field')
128
+ expect(result).toBeDefined()
129
+ expect(result!.position).toEqual({
130
+ top: 10,
131
+ left: 20,
132
+ width: 40,
133
+ height: 20,
134
+ })
135
+ expect(result!.identifier.name).toBe('user')
136
+ expect(result!.identifier.kind).toBe('Field')
137
+ })
138
+
139
+ it('should skip already wrapped identifiers', () => {
140
+ const container = document.createElement('div')
141
+ container.innerHTML = `
142
+ <pre class="shiki">
143
+ <code>
144
+ <span class="line"><span data-graphql-id="existing">user</span> {</span>
145
+ </code>
146
+ </pre>
147
+ `
148
+
149
+ const identifiers = [
150
+ createTestIdentifier('user', 1, 1),
151
+ ]
152
+
153
+ calculator.prepareCodeBlock(container, identifiers)
154
+
155
+ // Should still only have one wrapped element
156
+ const wrappedElements = container.querySelectorAll('[data-graphql-id]')
157
+ expect(wrappedElements.length).toBe(1)
158
+ expect(wrappedElements[0]!.getAttribute('data-graphql-id')).toBe('existing')
159
+ })
160
+
161
+ it('should handle empty lines gracefully', () => {
162
+ const container = document.createElement('div')
163
+ container.innerHTML = `
164
+ <pre class="shiki">
165
+ <code>
166
+ <span class="line">query {</span>
167
+ <span class="line"></span>
168
+ <span class="line"> user</span>
169
+ </code>
170
+ </pre>
171
+ `
172
+
173
+ const identifiers = [
174
+ createTestIdentifier('query', 1, 1),
175
+ createTestIdentifier('user', 3, 3),
176
+ ]
177
+
178
+ expect(() => {
179
+ calculator.prepareCodeBlock(container, identifiers)
180
+ }).not.toThrow()
181
+
182
+ const wrappedElements = container.querySelectorAll('[data-graphql-id]')
183
+ expect(wrappedElements.length).toBe(2)
184
+ })
185
+ })
186
+
187
+ describe('createSimpleOverlay', () => {
188
+ it('should create positioned overlay element', () => {
189
+ const position = { top: 10, left: 20, width: 40, height: 20 }
190
+ const identifier = createTestIdentifier('user', 1, 1)
191
+
192
+ const overlay = createSimpleOverlay(position, identifier)
193
+
194
+ expect(overlay.style.position).toBe('absolute')
195
+ expect(overlay.style.top).toBe('10px')
196
+ expect(overlay.style.left).toBe('20px')
197
+ expect(overlay.style.width).toBe('40px')
198
+ expect(overlay.style.height).toBe('20px')
199
+ expect(overlay.style.cursor).toBe('pointer')
200
+ expect(overlay.getAttribute('data-graphql-overlay')).toBe('true')
201
+ expect(overlay.getAttribute('data-graphql-name')).toBe('user')
202
+ expect(overlay.getAttribute('data-graphql-kind')).toBe('Field')
203
+ })
204
+
205
+ it('should handle click events', () => {
206
+ const position = { top: 10, left: 20, width: 40, height: 20 }
207
+ const identifier = createTestIdentifier('user', 1, 1)
208
+ let clickedIdentifier: Identifier | null = null
209
+
210
+ const overlay = createSimpleOverlay(position, identifier, {
211
+ onClick: (id) => {
212
+ clickedIdentifier = id
213
+ },
214
+ })
215
+
216
+ // Simulate click
217
+ const event = new MouseEvent('click')
218
+ overlay.dispatchEvent(event)
219
+
220
+ expect(clickedIdentifier).toBe(identifier)
221
+ })
222
+
223
+ it('should handle hover events', () => {
224
+ const position = { top: 10, left: 20, width: 40, height: 20 }
225
+ const identifier = createTestIdentifier('user', 1, 1)
226
+ let hoveredIdentifier: Identifier | null = null
227
+
228
+ const overlay = createSimpleOverlay(position, identifier, {
229
+ onHover: (id) => {
230
+ hoveredIdentifier = id
231
+ },
232
+ })
233
+
234
+ // Simulate hover
235
+ const event = new MouseEvent('mouseenter')
236
+ overlay.dispatchEvent(event)
237
+
238
+ expect(hoveredIdentifier).toBe(identifier)
239
+ })
240
+
241
+ it('should apply custom className', () => {
242
+ const position = { top: 10, left: 20, width: 40, height: 20 }
243
+ const identifier = createTestIdentifier('user', 1, 1)
244
+
245
+ const overlay = createSimpleOverlay(position, identifier, {
246
+ className: 'custom-overlay-class',
247
+ })
248
+
249
+ expect(overlay.className).toBe('custom-overlay-class')
250
+ })
251
+ })
252
+ })