polen 0.11.0-next.17 → 0.11.0-next.19

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 (307) hide show
  1. package/build/api/builder/ssg/generate.d.ts.map +1 -1
  2. package/build/api/builder/ssg/generate.js +5 -5
  3. package/build/api/builder/ssg/generate.js.map +1 -1
  4. package/build/api/builder/ssg/page-generator.worker.js +13 -3
  5. package/build/api/builder/ssg/page-generator.worker.js.map +1 -1
  6. package/build/api/config/input.d.ts +88 -3
  7. package/build/api/config/input.d.ts.map +1 -1
  8. package/build/api/config/normalized.d.ts +92 -7
  9. package/build/api/config/normalized.d.ts.map +1 -1
  10. package/build/api/config/normalized.js +11 -3
  11. package/build/api/config/normalized.js.map +1 -1
  12. package/build/api/config-template/template.js +2 -2
  13. package/build/api/config-template/template.js.map +1 -1
  14. package/build/api/content/sidebar.d.ts.map +1 -1
  15. package/build/api/content/sidebar.js +2 -1
  16. package/build/api/content/sidebar.js.map +1 -1
  17. package/build/api/errors.d.ts +278 -0
  18. package/build/api/errors.d.ts.map +1 -0
  19. package/build/api/errors.js +153 -0
  20. package/build/api/errors.js.map +1 -0
  21. package/build/api/examples/config.d.ts +366 -3
  22. package/build/api/examples/config.d.ts.map +1 -1
  23. package/build/api/examples/config.js +25 -3
  24. package/build/api/examples/config.js.map +1 -1
  25. package/build/api/examples/diagnostic/diagnostic.d.ts +1 -1
  26. package/build/api/examples/diagnostic/validation-error.d.ts +3 -2
  27. package/build/api/examples/diagnostic/validation-error.d.ts.map +1 -1
  28. package/build/api/examples/diagnostic/validation-error.js +9 -3
  29. package/build/api/examples/diagnostic/validation-error.js.map +1 -1
  30. package/build/api/examples/diagnostic/validator.d.ts.map +1 -1
  31. package/build/api/examples/diagnostic/validator.js +115 -68
  32. package/build/api/examples/diagnostic/validator.js.map +1 -1
  33. package/build/api/examples/filter.d.ts.map +1 -1
  34. package/build/api/examples/filter.js +9 -6
  35. package/build/api/examples/filter.js.map +1 -1
  36. package/build/api/examples/scanner.d.ts.map +1 -1
  37. package/build/api/examples/scanner.js +89 -103
  38. package/build/api/examples/scanner.js.map +1 -1
  39. package/build/api/examples/type-usage-indexer.d.ts.map +1 -1
  40. package/build/api/examples/type-usage-indexer.js +17 -30
  41. package/build/api/examples/type-usage-indexer.js.map +1 -1
  42. package/build/api/iso/schema/routing.d.ts.map +1 -1
  43. package/build/api/iso/schema/routing.js +8 -8
  44. package/build/api/iso/schema/routing.js.map +1 -1
  45. package/build/api/iso/schema/validation.d.ts.map +1 -1
  46. package/build/api/iso/schema/validation.js +3 -2
  47. package/build/api/iso/schema/validation.js.map +1 -1
  48. package/build/api/schema/input-source/$$.d.ts +1 -0
  49. package/build/api/schema/input-source/$$.d.ts.map +1 -1
  50. package/build/api/schema/input-source/$$.js +1 -0
  51. package/build/api/schema/input-source/$$.js.map +1 -1
  52. package/build/api/schema/input-source/errors.d.ts +36 -0
  53. package/build/api/schema/input-source/errors.d.ts.map +1 -0
  54. package/build/api/schema/input-source/errors.js +17 -0
  55. package/build/api/schema/input-source/errors.js.map +1 -0
  56. package/build/api/schema/input-source/input-source.d.ts +1 -7
  57. package/build/api/schema/input-source/input-source.d.ts.map +1 -1
  58. package/build/api/schema/input-source/input-source.js +0 -6
  59. package/build/api/schema/input-source/input-source.js.map +1 -1
  60. package/build/api/schema/input-sources/directory.d.ts.map +1 -1
  61. package/build/api/schema/input-sources/directory.js +19 -6
  62. package/build/api/schema/input-sources/directory.js.map +1 -1
  63. package/build/api/schema/input-sources/file.d.ts.map +1 -1
  64. package/build/api/schema/input-sources/file.js +15 -4
  65. package/build/api/schema/input-sources/file.js.map +1 -1
  66. package/build/api/schema/input-sources/introspection-file.d.ts.map +1 -1
  67. package/build/api/schema/input-sources/introspection-file.js +28 -6
  68. package/build/api/schema/input-sources/introspection-file.js.map +1 -1
  69. package/build/api/schema/input-sources/introspection.d.ts.map +1 -1
  70. package/build/api/schema/input-sources/introspection.js +35 -7
  71. package/build/api/schema/input-sources/introspection.js.map +1 -1
  72. package/build/api/schema/input-sources/memory.d.ts.map +1 -1
  73. package/build/api/schema/input-sources/memory.js +15 -3
  74. package/build/api/schema/input-sources/memory.js.map +1 -1
  75. package/build/api/schema/input-sources/versioned-directory.d.ts.map +1 -1
  76. package/build/api/schema/input-sources/versioned-directory.js +23 -7
  77. package/build/api/schema/input-sources/versioned-directory.js.map +1 -1
  78. package/build/api/schema/load.d.ts +1 -1
  79. package/build/api/schema/load.d.ts.map +1 -1
  80. package/build/api/schema/load.js.map +1 -1
  81. package/build/cli/commands/hero-image.d.ts +1 -2
  82. package/build/cli/commands/hero-image.d.ts.map +1 -1
  83. package/build/cli/index.d.ts +1 -1
  84. package/build/lib/catalog/catalog.d.ts +43 -3
  85. package/build/lib/catalog/catalog.d.ts.map +1 -1
  86. package/build/lib/catalog/catalog.js +67 -5
  87. package/build/lib/catalog/catalog.js.map +1 -1
  88. package/build/lib/catalog/versioned.d.ts +11 -1
  89. package/build/lib/catalog/versioned.d.ts.map +1 -1
  90. package/build/lib/catalog/versioned.js +23 -5
  91. package/build/lib/catalog/versioned.js.map +1 -1
  92. package/build/lib/document/document.d.ts +55 -5
  93. package/build/lib/document/document.d.ts.map +1 -1
  94. package/build/lib/document/document.js +96 -2
  95. package/build/lib/document/document.js.map +1 -1
  96. package/build/lib/document/versioned.d.ts +2 -2
  97. package/build/lib/document/versioned.d.ts.map +1 -1
  98. package/build/lib/document/versioned.js +7 -7
  99. package/build/lib/document/versioned.js.map +1 -1
  100. package/build/lib/lifecycles/lifecycles.d.ts +5 -4
  101. package/build/lib/lifecycles/lifecycles.d.ts.map +1 -1
  102. package/build/lib/lifecycles/lifecycles.js +14 -12
  103. package/build/lib/lifecycles/lifecycles.js.map +1 -1
  104. package/build/lib/version-coverage/$$.d.ts +2 -0
  105. package/build/lib/version-coverage/$$.d.ts.map +1 -0
  106. package/build/lib/version-coverage/$$.js +2 -0
  107. package/build/lib/version-coverage/$$.js.map +1 -0
  108. package/build/lib/version-coverage/$.d.ts.map +1 -0
  109. package/build/lib/version-coverage/$.js.map +1 -0
  110. package/build/lib/{version-selection/version-selection.d.ts → version-coverage/version-coverage.d.ts} +1 -1
  111. package/build/lib/version-coverage/version-coverage.d.ts.map +1 -0
  112. package/build/lib/{version-selection/version-selection.js → version-coverage/version-coverage.js} +2 -2
  113. package/build/lib/version-coverage/version-coverage.js.map +1 -0
  114. package/build/template/components/GraphQLDocument.d.ts +1 -1
  115. package/build/template/components/GraphQLDocument.d.ts.map +1 -1
  116. package/build/template/components/GraphQLDocument.js +10 -39
  117. package/build/template/components/GraphQLDocument.js.map +1 -1
  118. package/build/template/components/GraphQLInteractive/lib/parser.d.ts +28 -0
  119. package/build/template/components/GraphQLInteractive/lib/parser.d.ts.map +1 -1
  120. package/build/template/components/GraphQLInteractive/lib/parser.js +60 -27
  121. package/build/template/components/GraphQLInteractive/lib/parser.js.map +1 -1
  122. package/build/template/components/ReferenceVersionPicker.d.ts +9 -0
  123. package/build/template/components/ReferenceVersionPicker.d.ts.map +1 -0
  124. package/build/template/components/ReferenceVersionPicker.js +79 -0
  125. package/build/template/components/ReferenceVersionPicker.js.map +1 -0
  126. package/build/template/components/VersionCoveragePicker.d.ts +1 -1
  127. package/build/template/components/VersionCoveragePicker.d.ts.map +1 -1
  128. package/build/template/components/VersionCoveragePicker.js +4 -6
  129. package/build/template/components/VersionCoveragePicker.js.map +1 -1
  130. package/build/template/components/VersionPicker.d.ts +8 -3
  131. package/build/template/components/VersionPicker.d.ts.map +1 -1
  132. package/build/template/components/VersionPicker.js +12 -77
  133. package/build/template/components/VersionPicker.js.map +1 -1
  134. package/build/template/components/home/QuickStart.d.ts.map +1 -1
  135. package/build/template/components/home/QuickStart.js +8 -4
  136. package/build/template/components/home/QuickStart.js.map +1 -1
  137. package/build/template/hooks/use-highlighted.d.ts.map +1 -1
  138. package/build/template/hooks/use-highlighted.js +19 -13
  139. package/build/template/hooks/use-highlighted.js.map +1 -1
  140. package/build/template/lib/fetch-text.d.ts +18 -0
  141. package/build/template/lib/fetch-text.d.ts.map +1 -1
  142. package/build/template/lib/fetch-text.js +32 -4
  143. package/build/template/lib/fetch-text.js.map +1 -1
  144. package/build/template/routes/changelog/ChangelogBody.d.ts +6 -0
  145. package/build/template/routes/changelog/ChangelogBody.d.ts.map +1 -0
  146. package/build/template/{components/Changelog/Changelog.js → routes/changelog/ChangelogBody.js} +8 -58
  147. package/build/template/routes/changelog/ChangelogBody.js.map +1 -0
  148. package/build/template/routes/changelog/ChangelogSidebar.d.ts +7 -0
  149. package/build/template/routes/changelog/ChangelogSidebar.d.ts.map +1 -0
  150. package/build/template/routes/changelog/ChangelogSidebar.js +46 -0
  151. package/build/template/routes/changelog/ChangelogSidebar.js.map +1 -0
  152. package/build/template/routes/changelog/ChangelogSidebarItem.d.ts +11 -0
  153. package/build/template/routes/changelog/ChangelogSidebarItem.d.ts.map +1 -0
  154. package/build/template/routes/changelog/ChangelogSidebarItem.js +35 -0
  155. package/build/template/routes/changelog/ChangelogSidebarItem.js.map +1 -0
  156. package/build/template/routes/changelog/_.d.ts +3264 -0
  157. package/build/template/routes/changelog/_.d.ts.map +1 -0
  158. package/build/template/routes/changelog/_.js +111 -0
  159. package/build/template/routes/changelog/_.js.map +1 -0
  160. package/build/template/routes/changelog/utils.d.ts +3 -0
  161. package/build/template/routes/changelog/utils.d.ts.map +1 -0
  162. package/build/template/routes/changelog/utils.js +11 -0
  163. package/build/template/routes/changelog/utils.js.map +1 -0
  164. package/build/template/routes/examples/name.d.ts.map +1 -1
  165. package/build/template/routes/examples/name.js +4 -2
  166. package/build/template/routes/examples/name.js.map +1 -1
  167. package/build/template/routes/reference.js +2 -2
  168. package/build/template/routes/reference.js.map +1 -1
  169. package/build/template/routes/root.js +1 -1
  170. package/build/template/routes/root.js.map +1 -1
  171. package/build/template/stores/toast.d.ts.map +1 -1
  172. package/build/template/stores/toast.js +5 -3
  173. package/build/template/stores/toast.js.map +1 -1
  174. package/build/template/theme/swiss-sharp.css +14 -14
  175. package/build/vite/plugins/schemas.d.ts +1 -2
  176. package/build/vite/plugins/schemas.d.ts.map +1 -1
  177. package/build/vite/plugins/schemas.js +0 -1
  178. package/build/vite/plugins/schemas.js.map +1 -1
  179. package/package.json +7 -7
  180. package/src/api/builder/ssg/generate.ts +10 -5
  181. package/src/api/builder/ssg/page-generator.worker.ts +18 -3
  182. package/src/api/config/normalized.ts +12 -3
  183. package/src/api/config-template/template.ts +2 -2
  184. package/src/api/content/sidebar.ts +3 -3
  185. package/src/api/errors.ts +227 -0
  186. package/src/api/examples/config.test.ts +10 -0
  187. package/src/api/examples/config.ts +33 -4
  188. package/src/api/examples/diagnostic/validation-error.ts +9 -3
  189. package/src/api/examples/diagnostic/validator.test.ts +30 -0
  190. package/src/api/examples/diagnostic/validator.ts +148 -103
  191. package/src/api/examples/filter.ts +9 -6
  192. package/src/api/examples/scanner.ts +136 -117
  193. package/src/api/examples/type-usage-indexer.ts +24 -36
  194. package/src/api/iso/schema/routing.ts +10 -10
  195. package/src/api/iso/schema/validation.ts +3 -2
  196. package/src/api/schema/input-source/$$.ts +1 -0
  197. package/src/api/schema/input-source/errors.ts +26 -0
  198. package/src/api/schema/input-source/input-source.ts +1 -22
  199. package/src/api/schema/input-sources/directory.ts +20 -15
  200. package/src/api/schema/input-sources/file.ts +17 -4
  201. package/src/api/schema/input-sources/introspection-file.ts +30 -15
  202. package/src/api/schema/input-sources/introspection.ts +38 -7
  203. package/src/api/schema/input-sources/memory.ts +19 -3
  204. package/src/api/schema/input-sources/versioned-directory.ts +25 -27
  205. package/src/api/schema/load.ts +2 -1
  206. package/src/lib/catalog/catalog.ts +89 -6
  207. package/src/lib/catalog/versioned.ts +26 -5
  208. package/src/lib/document/document.ts +135 -2
  209. package/src/lib/document/versioned.ts +8 -8
  210. package/src/lib/lifecycles/lifecycles.ts +32 -27
  211. package/src/lib/version-coverage/$$.ts +1 -0
  212. package/src/lib/{version-selection/version-selection.ts → version-coverage/version-coverage.ts} +1 -1
  213. package/src/template/components/GraphQLDocument.tsx +11 -69
  214. package/src/template/components/GraphQLInteractive/lib/parser.ts +81 -29
  215. package/src/template/components/ReferenceVersionPicker.tsx +107 -0
  216. package/src/template/components/VersionCoveragePicker.tsx +4 -5
  217. package/src/template/components/VersionPicker.tsx +32 -98
  218. package/src/template/components/home/QuickStart.tsx +16 -7
  219. package/src/template/hooks/use-highlighted.ts +31 -19
  220. package/src/template/lib/fetch-text.ts +45 -4
  221. package/src/template/{components/Changelog/Changelog.tsx → routes/changelog/ChangelogBody.tsx} +7 -64
  222. package/src/template/routes/changelog/ChangelogSidebar.tsx +80 -0
  223. package/src/template/routes/changelog/ChangelogSidebarItem.tsx +68 -0
  224. package/src/template/routes/changelog/_.tsx +129 -0
  225. package/src/template/routes/changelog/utils.ts +13 -0
  226. package/src/template/routes/examples/name.tsx +4 -2
  227. package/src/template/routes/reference.tsx +2 -2
  228. package/src/template/routes/root.tsx +1 -1
  229. package/src/template/stores/toast.ts +6 -3
  230. package/src/template/theme/swiss-sharp.css +14 -14
  231. package/src/vite/plugins/schemas.ts +0 -1
  232. package/build/lib/graph/$$.d.ts +0 -2
  233. package/build/lib/graph/$$.d.ts.map +0 -1
  234. package/build/lib/graph/$$.js +0 -2
  235. package/build/lib/graph/$$.js.map +0 -1
  236. package/build/lib/graph/$.d.ts +0 -2
  237. package/build/lib/graph/$.d.ts.map +0 -1
  238. package/build/lib/graph/$.js +0 -2
  239. package/build/lib/graph/$.js.map +0 -1
  240. package/build/lib/graph/graph.d.ts +0 -127
  241. package/build/lib/graph/graph.d.ts.map +0 -1
  242. package/build/lib/graph/graph.js +0 -152
  243. package/build/lib/graph/graph.js.map +0 -1
  244. package/build/lib/mask/$$.d.ts +0 -3
  245. package/build/lib/mask/$$.d.ts.map +0 -1
  246. package/build/lib/mask/$$.js +0 -3
  247. package/build/lib/mask/$$.js.map +0 -1
  248. package/build/lib/mask/$.d.ts +0 -2
  249. package/build/lib/mask/$.d.ts.map +0 -1
  250. package/build/lib/mask/$.js +0 -2
  251. package/build/lib/mask/$.js.map +0 -1
  252. package/build/lib/mask/apply.d.ts +0 -86
  253. package/build/lib/mask/apply.d.ts.map +0 -1
  254. package/build/lib/mask/apply.js +0 -86
  255. package/build/lib/mask/apply.js.map +0 -1
  256. package/build/lib/mask/mask.d.ts +0 -124
  257. package/build/lib/mask/mask.d.ts.map +0 -1
  258. package/build/lib/mask/mask.js +0 -137
  259. package/build/lib/mask/mask.js.map +0 -1
  260. package/build/lib/mask/mask.test-d.d.ts +0 -2
  261. package/build/lib/mask/mask.test-d.d.ts.map +0 -1
  262. package/build/lib/mask/mask.test-d.js +0 -102
  263. package/build/lib/mask/mask.test-d.js.map +0 -1
  264. package/build/lib/version-selection/$$.d.ts +0 -2
  265. package/build/lib/version-selection/$$.d.ts.map +0 -1
  266. package/build/lib/version-selection/$$.js +0 -2
  267. package/build/lib/version-selection/$$.js.map +0 -1
  268. package/build/lib/version-selection/$.d.ts.map +0 -1
  269. package/build/lib/version-selection/$.js.map +0 -1
  270. package/build/lib/version-selection/version-selection.d.ts.map +0 -1
  271. package/build/lib/version-selection/version-selection.js.map +0 -1
  272. package/build/sandbox.d.ts +0 -2
  273. package/build/sandbox.d.ts.map +0 -1
  274. package/build/sandbox.js +0 -17
  275. package/build/sandbox.js.map +0 -1
  276. package/build/template/components/Changelog/Changelog.d.ts +0 -8
  277. package/build/template/components/Changelog/Changelog.d.ts.map +0 -1
  278. package/build/template/components/Changelog/Changelog.js.map +0 -1
  279. package/build/template/components/Changelog/ChangelogVersionPicker.d.ts +0 -8
  280. package/build/template/components/Changelog/ChangelogVersionPicker.d.ts.map +0 -1
  281. package/build/template/components/Changelog/ChangelogVersionPicker.js +0 -16
  282. package/build/template/components/Changelog/ChangelogVersionPicker.js.map +0 -1
  283. package/build/template/components/SimpleVersionPicker.d.ts +0 -15
  284. package/build/template/components/SimpleVersionPicker.d.ts.map +0 -1
  285. package/build/template/components/SimpleVersionPicker.js +0 -15
  286. package/build/template/components/SimpleVersionPicker.js.map +0 -1
  287. package/build/template/routes/changelog.d.ts +0 -1635
  288. package/build/template/routes/changelog.d.ts.map +0 -1
  289. package/build/template/routes/changelog.js +0 -168
  290. package/build/template/routes/changelog.js.map +0 -1
  291. package/src/lib/graph/$$.ts +0 -1
  292. package/src/lib/graph/$.ts +0 -1
  293. package/src/lib/graph/graph.ts +0 -197
  294. package/src/lib/mask/$$.ts +0 -2
  295. package/src/lib/mask/$.test.ts +0 -226
  296. package/src/lib/mask/$.ts +0 -1
  297. package/src/lib/mask/apply.ts +0 -134
  298. package/src/lib/mask/mask.test-d.ts +0 -156
  299. package/src/lib/mask/mask.ts +0 -244
  300. package/src/lib/version-selection/$$.ts +0 -1
  301. package/src/sandbox.ts +0 -15
  302. package/src/template/components/Changelog/ChangelogVersionPicker.tsx +0 -36
  303. package/src/template/components/SimpleVersionPicker.tsx +0 -48
  304. package/src/template/routes/changelog.tsx +0 -267
  305. /package/build/lib/{version-selection → version-coverage}/$.d.ts +0 -0
  306. /package/build/lib/{version-selection → version-coverage}/$.js +0 -0
  307. /package/src/lib/{version-selection → version-coverage}/$.ts +0 -0
@@ -1,9 +1,9 @@
1
1
  import { Catalog as SchemaCatalog } from '#lib/catalog/$'
2
2
  import { Document } from '#lib/document/$'
3
+ import { Schema } from '#lib/schema/$'
3
4
  import { Version } from '#lib/version/$'
4
- import { Match } from 'effect'
5
- import { HashMap } from 'effect/Schema'
6
- import type { GraphQLError, GraphQLSchema } from 'graphql'
5
+ import { Array, Either, Match, Schema as S } from 'effect'
6
+ import type { DocumentNode, GraphQLError } from 'graphql'
7
7
  import { parse, specifiedRules, validate } from 'graphql'
8
8
  import { Example } from '../schemas/example/$.js'
9
9
  import type { DiagnosticValidationError } from './diagnostic.js'
@@ -15,6 +15,35 @@ import { makeDiagnosticValidationError } from './diagnostic.js'
15
15
 
16
16
  export type ValidationDiagnostic = DiagnosticValidationError
17
17
 
18
+ // ============================================================================
19
+ // Schemas
20
+ // ============================================================================
21
+
22
+ const GraphQLErrorData = S.Struct({
23
+ message: S.String,
24
+ locations: S.optional(S.Array(S.Struct({
25
+ line: S.Number,
26
+ column: S.Number,
27
+ }))),
28
+ })
29
+
30
+ type GraphQLErrorData = S.Schema.Type<typeof GraphQLErrorData>
31
+
32
+ // ============================================================================
33
+ // Safe Parsing
34
+ // ============================================================================
35
+
36
+ /**
37
+ * Safely parse a GraphQL document without throwing.
38
+ * Returns an Either with the document on success or error on failure.
39
+ */
40
+ const parseDocumentSafe = (content: string): Either.Either<DocumentNode, GraphQLError> => {
41
+ return Either.try({
42
+ try: () => parse(content),
43
+ catch: (error) => error as GraphQLError,
44
+ })
45
+ }
46
+
18
47
  // ============================================================================
19
48
  // Validation
20
49
  // ============================================================================
@@ -32,69 +61,76 @@ export const validateExamples = (
32
61
  ): ValidationDiagnostic[] => {
33
62
  const diagnostics: ValidationDiagnostic[] = []
34
63
 
35
- return Match.value(catalog).pipe(
36
- Match.tagsExhaustive({
37
- CatalogVersioned: (versioned) => {
38
- for (const example of examples) {
39
- Match.value(example.document).pipe(
40
- Match.tagsExhaustive({
41
- DocumentVersioned: (doc) => {
42
- // Validate each version against its corresponding schema
43
- for (const schema of SchemaCatalog.Versioned.getAll(versioned)) {
44
- const content = Document.Versioned.getContentForVersion(doc, schema.version)
45
- if (content) {
46
- const versionStr = Version.encodeSync(schema.version)
47
- validateDocument(
48
- example.name,
49
- example.path,
50
- versionStr,
51
- content,
52
- schema.definition,
53
- diagnostics,
54
- )
55
- }
56
- }
57
- return undefined
58
- },
59
- DocumentUnversioned: (doc) => {
60
- const latestEntry = SchemaCatalog.Versioned.getLatestOrThrow(versioned)
61
- validateDocument(
62
- example.name,
63
- example.path,
64
- 'default',
65
- doc.document,
66
- latestEntry.definition,
67
- diagnostics,
68
- )
69
- return undefined
70
- },
71
- }),
72
- )
73
- }
74
-
75
- return diagnostics
76
- },
77
- CatalogUnversioned: (unversioned) => {
78
- // For unversioned catalog, only unversioned documents make sense
79
- for (const example of examples) {
80
- if (example.document._tag === 'DocumentUnversioned') {
81
- validateDocument(
82
- example.name,
83
- example.path,
84
- 'default',
85
- example.document.document,
86
- unversioned.schema.definition,
87
- diagnostics,
64
+ Array.forEach(examples, (example) => {
65
+ if (example.document._tag === 'DocumentVersioned') {
66
+ // Versioned document: iterate all versions and let utility handle compatibility
67
+ const documentVersions = Document.Versioned.getAllVersions(example.document)
68
+ let versionMismatchDetected = false
69
+
70
+ Array.forEach(documentVersions, (version) => {
71
+ // Skip remaining versions if we already detected a version mismatch
72
+ if (versionMismatchDetected) return
73
+
74
+ const result = Document.resolveDocumentAndSchema(
75
+ example.document,
76
+ catalog,
77
+ version, // Pass each version as VersionCoverage
78
+ )
79
+
80
+ Either.match(result, {
81
+ onLeft: (error) => {
82
+ // Pattern match on error types - all errors are now tagged
83
+ Match.value(error).pipe(
84
+ Match.when({ _tag: 'VersionCoverageMismatchError' }, (err) => {
85
+ diagnostics.push(makeDiagnosticValidationError({
86
+ message: `Example "${example.name}" has versioned content but catalog is unversioned`,
87
+ example: { name: example.name, path: example.path },
88
+ version: undefined,
89
+ errors: [{ message: err.reason }],
90
+ }))
91
+ // Set flag to skip remaining versions - all will have same error
92
+ versionMismatchDetected = true
93
+ }),
94
+ Match.when({ _tag: 'VersionNotFoundInDocumentError' }, () => {
95
+ // Skip silently - version not found in document
96
+ }),
97
+ Match.when({ _tag: 'VersionNotFoundInCatalogError' }, () => {
98
+ // Skip silently - version not found in catalog
99
+ }),
100
+ Match.when({ _tag: 'EmptyCatalogError' }, () => {
101
+ // Skip silently - catalog has no entries
102
+ }),
103
+ Match.exhaustive,
88
104
  )
105
+ },
106
+ onRight: ({ content, schema }) => {
107
+ if (schema) {
108
+ validateDocument(example, schema, content, diagnostics)
109
+ }
110
+ },
111
+ })
112
+ })
113
+ } else {
114
+ // Unversioned document: call without version coverage
115
+ const result = Document.resolveDocumentAndSchema(
116
+ example.document,
117
+ catalog,
118
+ )
119
+
120
+ Either.match(result, {
121
+ onLeft: () => {
122
+ // Resolution failed - skip silently
123
+ },
124
+ onRight: ({ content, schema }) => {
125
+ if (schema) {
126
+ validateDocument(example, schema, content, diagnostics)
89
127
  }
90
- // Versioned/PartiallyVersioned documents with unversioned catalog don't make sense
91
- // These should be caught by other diagnostics
92
- }
128
+ },
129
+ })
130
+ }
131
+ })
93
132
 
94
- return diagnostics
95
- },
96
- }),
97
- )
133
+ return diagnostics
98
134
  }
99
135
 
100
136
  // ============================================================================
@@ -105,54 +141,67 @@ export const validateExamples = (
105
141
  * Validate a single document and add diagnostics if needed.
106
142
  */
107
143
  const validateDocument = (
108
- exampleName: string,
109
- examplePath: string,
110
- version: string,
144
+ example: Example.Example,
145
+ schema: Schema.Schema,
111
146
  content: string,
112
- schema: GraphQLSchema,
113
147
  diagnostics: ValidationDiagnostic[],
114
148
  ): void => {
115
- try {
116
- // Parse the GraphQL document
117
- const document = parse(content)
118
-
119
- // Validate against the schema
120
- const errors = validate(schema, document, specifiedRules)
121
-
122
- if (errors.length > 0) {
123
- diagnostics.push(makeDiagnosticValidationError({
124
- message: formatValidationMessage(exampleName, version, errors),
125
- example: { name: exampleName, path: examplePath },
126
- version,
127
- errors: errors.map(formatGraphQLError),
128
- }))
129
- }
130
- } catch (parseError) {
131
- // Parse errors are also validation errors
149
+ // Extract version from schema (undefined for unversioned)
150
+ const version = Schema.getVersion(schema)
151
+
152
+ // Parse the document safely
153
+ const parseResult = parseDocumentSafe(content)
154
+
155
+ if (Either.isLeft(parseResult)) {
156
+ // Handle parse errors
157
+ diagnostics.push(makeDiagnosticValidationError({
158
+ message: formatParseError(example.name, version),
159
+ example: { name: example.name, path: example.path },
160
+ version,
161
+ errors: [{ message: parseResult.left.message }],
162
+ }))
163
+ return
164
+ }
165
+
166
+ // Validate the parsed document against the schema
167
+ const errors = validate(schema.definition, parseResult.right, specifiedRules)
168
+
169
+ if (Array.isNonEmptyReadonlyArray(errors)) {
132
170
  diagnostics.push(makeDiagnosticValidationError({
133
- message: `Example "${exampleName}" (${version}) has invalid GraphQL syntax`,
134
- example: { name: exampleName, path: examplePath },
171
+ message: formatValidationMessage(example.name, version, errors),
172
+ example: { name: example.name, path: example.path },
135
173
  version,
136
- errors: [{ message: String(parseError) }],
174
+ errors: errors.map(formatGraphQLError),
137
175
  }))
138
176
  }
139
177
  }
140
178
 
179
+ /**
180
+ * Format a parse error message for an example.
181
+ */
182
+ const formatParseError = (
183
+ exampleId: string,
184
+ version: Version.Version | undefined,
185
+ ): string => {
186
+ const versionStr = version ? ` (${Version.encodeSync(version)})` : ''
187
+ return `Example "${exampleId}"${versionStr} has invalid GraphQL syntax`
188
+ }
189
+
141
190
  /**
142
191
  * Format a validation message for an example.
143
192
  */
144
193
  const formatValidationMessage = (
145
194
  exampleId: string,
146
- version: string,
147
- errors: readonly GraphQLError[],
195
+ version: Version.Version | undefined,
196
+ errors: Array.NonEmptyReadonlyArray<GraphQLError>,
148
197
  ): string => {
149
- const versionStr = version === 'default' ? '' : ` (${version})`
198
+ const versionStr = version ? ` (${Version.encodeSync(version)})` : ''
150
199
  const errorCount = errors.length
151
200
  const errorWord = errorCount === 1 ? 'error' : 'errors'
152
201
 
153
- // Include the first error message for context
154
- const firstError = errors[0]
155
- const preview = firstError ? `: ${firstError.message}` : ''
202
+ // Include the first error message for context - always safe with NonEmptyArray
203
+ const firstError = Array.headNonEmpty(errors)
204
+ const preview = `: ${firstError.message}`
156
205
 
157
206
  return `Example "${exampleId}"${versionStr} has ${errorCount} validation ${errorWord}${preview}`
158
207
  }
@@ -160,17 +209,13 @@ const formatValidationMessage = (
160
209
  /**
161
210
  * Format a GraphQL error for diagnostic reporting.
162
211
  */
163
- const formatGraphQLError = (error: GraphQLError): {
164
- message: string
165
- locations?: Array<{ line: number; column: number }>
166
- } => ({
167
- message: error.message,
168
- ...(error.locations
169
- ? {
212
+ const formatGraphQLError = (error: GraphQLError): GraphQLErrorData =>
213
+ GraphQLErrorData.make({
214
+ message: error.message,
215
+ ...(error.locations && {
170
216
  locations: error.locations.map(loc => ({
171
217
  line: loc.line,
172
218
  column: loc.column,
173
219
  })),
174
- }
175
- : {}),
176
- })
220
+ }),
221
+ })
@@ -1,3 +1,4 @@
1
+ import { HashSet } from 'effect'
1
2
  import type { ExampleName, ExampleSelection } from './config.js'
2
3
  import { Example } from './schemas/example/$.js'
3
4
 
@@ -28,14 +29,14 @@ export const filterExamplesBySelection = (
28
29
 
29
30
  // Handle include pattern
30
31
  if ('include' in selection) {
31
- const includeSet = new Set<ExampleName>(selection.include)
32
- return examples.filter(example => includeSet.has(example.name as ExampleName))
32
+ const includeSet = HashSet.fromIterable(selection.include)
33
+ return examples.filter(example => HashSet.has(includeSet, example.name as ExampleName))
33
34
  }
34
35
 
35
36
  // Handle exclude pattern
36
37
  if ('exclude' in selection) {
37
- const excludeSet = new Set<ExampleName>(selection.exclude)
38
- return examples.filter(example => !excludeSet.has(example.name as ExampleName))
38
+ const excludeSet = HashSet.fromIterable(selection.exclude)
39
+ return examples.filter(example => !HashSet.has(excludeSet, example.name as ExampleName))
39
40
  }
40
41
 
41
42
  // Fallback to all examples if selection pattern is not recognized
@@ -69,12 +70,14 @@ export const shouldDisplayExample = (
69
70
 
70
71
  // Handle include pattern
71
72
  if ('include' in selection) {
72
- return selection.include.includes(exampleName)
73
+ const includeSet = HashSet.fromIterable(selection.include)
74
+ return HashSet.has(includeSet, exampleName)
73
75
  }
74
76
 
75
77
  // Handle exclude pattern
76
78
  if ('exclude' in selection) {
77
- return !selection.exclude.includes(exampleName)
79
+ const excludeSet = HashSet.fromIterable(selection.exclude)
80
+ return !HashSet.has(excludeSet, exampleName)
78
81
  }
79
82
 
80
83
  // Fallback to show if selection pattern is not recognized