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
@@ -5,7 +5,6 @@ import { DateOnly } from '#lib/date-only/$'
5
5
  import { Grafaid } from '#lib/grafaid'
6
6
  import { Revision } from '#lib/revision/$'
7
7
  import { Schema } from '#lib/schema/$'
8
- import { PlatformError } from '@effect/platform/Error'
9
8
  import { FileSystem } from '@effect/platform/FileSystem'
10
9
  import { Path } from '@wollybeard/kit'
11
10
  import { Effect } from 'effect'
@@ -76,18 +75,32 @@ export const loader = InputSource.createEffect({
76
75
 
77
76
  const ast = yield* Grafaid.Schema.AST.parse(content).pipe(
78
77
  Effect.mapError((error) =>
79
- InputSource.InputSourceError('file', `Failed to parse schema file: ${error}`, error)
78
+ new InputSource.InputSourceError({
79
+ source: 'file',
80
+ message: `Failed to parse schema file: ${error}`,
81
+ cause: error,
82
+ })
80
83
  ),
81
84
  )
82
85
  const after = yield* Grafaid.Schema.fromAST(ast).pipe(
83
- Effect.mapError((error) => InputSource.InputSourceError('file', `Failed to build schema: ${error}`, error)),
86
+ Effect.mapError((error) =>
87
+ new InputSource.InputSourceError({
88
+ source: 'file',
89
+ message: `Failed to build schema: ${error}`,
90
+ cause: error,
91
+ })
92
+ ),
84
93
  )
85
94
 
86
95
  const date = new Date()
87
96
  const before = Grafaid.Schema.empty
88
97
  const changes = yield* Change.calcChangeset({ before, after }).pipe(
89
98
  Effect.mapError((error) =>
90
- InputSource.InputSourceError('file', `Failed to calculate changeset: ${error}`, error)
99
+ new InputSource.InputSourceError({
100
+ source: 'file',
101
+ message: `Failed to calculate changeset: ${error}`,
102
+ cause: error,
103
+ })
91
104
  ),
92
105
  )
93
106
 
@@ -80,7 +80,11 @@ export const read = (
80
80
 
81
81
  const introspectionFileContent = yield* fs.readFileString(config.path).pipe(
82
82
  Effect.mapError((error) =>
83
- InputSource.InputSourceError('introspectionFile', `Failed to read file ${config.path}: ${error}`, error)
83
+ new InputSource.InputSourceError({
84
+ source: 'introspectionFile',
85
+ message: `Failed to read file ${config.path}: ${error}`,
86
+ cause: error,
87
+ })
84
88
  ),
85
89
  )
86
90
 
@@ -90,16 +94,20 @@ export const read = (
90
94
  try: () => Json.codec.decode(introspectionFileContent),
91
95
  catch: (error) => {
92
96
  if (error instanceof SyntaxError) {
93
- return InputSource.InputSourceError(
94
- 'introspectionFile',
95
- `Invalid JSON in ${config.path}: ${error.message}`,
96
- error,
97
+ return new InputSource.InputSourceError(
98
+ {
99
+ source: 'introspectionFile',
100
+ message: `Invalid JSON in ${config.path}: ${error.message}`,
101
+ cause: error,
102
+ },
97
103
  )
98
104
  }
99
- return InputSource.InputSourceError(
100
- 'introspectionFile',
101
- `Failed to parse JSON in ${config.path}: ${error}`,
102
- error,
105
+ return new InputSource.InputSourceError(
106
+ {
107
+ source: 'introspectionFile',
108
+ message: `Failed to parse JSON in ${config.path}: ${error}`,
109
+ cause: error,
110
+ },
103
111
  )
104
112
  },
105
113
  })
@@ -107,7 +115,10 @@ export const read = (
107
115
  // Validate introspection data structure before passing to fromIntrospectionQuery
108
116
  if (!introspectionData || typeof introspectionData !== 'object') {
109
117
  return yield* Effect.fail(
110
- InputSource.InputSourceError('introspectionFile', 'Introspection data must be a valid JSON object'),
118
+ new InputSource.InputSourceError({
119
+ source: 'introspectionFile',
120
+ message: 'Introspection data must be a valid JSON object',
121
+ }),
111
122
  )
112
123
  }
113
124
 
@@ -115,10 +126,10 @@ export const read = (
115
126
  // It will provide more specific GraphQL-related error messages
116
127
  if (!('data' in introspectionData)) {
117
128
  return yield* Effect.fail(
118
- InputSource.InputSourceError(
119
- 'introspectionFile',
120
- 'Introspection data missing required "data" property (expected GraphQL introspection result format)',
121
- ),
129
+ new InputSource.InputSourceError({
130
+ source: 'introspectionFile',
131
+ message: 'Introspection data missing required "data" property (expected GraphQL introspection result format)',
132
+ }),
122
133
  )
123
134
  }
124
135
 
@@ -144,7 +155,11 @@ const createCatalogFromSchema = (
144
155
  after,
145
156
  }).pipe(
146
157
  Effect.mapError((error) =>
147
- InputSource.InputSourceError('introspectionFile', `Failed to calculate changeset: ${error}`, error)
158
+ new InputSource.InputSourceError({
159
+ source: 'introspectionFile',
160
+ message: `Failed to calculate changeset: ${error}`,
161
+ cause: error,
162
+ })
148
163
  ),
149
164
  )
150
165
 
@@ -150,7 +150,12 @@ export const loader = InputSource.createEffect({
150
150
  // Try to read from cache
151
151
  const cacheEntry = yield* Effect.tryPromise({
152
152
  try: () => readCache(cachePath),
153
- catch: (error) => InputSource.InputSourceError('introspection', `Failed to read cache: ${error}`, error),
153
+ catch: (error) =>
154
+ new InputSource.InputSourceError({
155
+ source: 'introspection',
156
+ message: `Failed to read cache: ${error}`,
157
+ cause: error,
158
+ }),
154
159
  })
155
160
 
156
161
  let schema: Grafaid.Schema.Schema
@@ -162,7 +167,11 @@ export const loader = InputSource.createEffect({
162
167
  // Fetch fresh introspection
163
168
  schema = yield* fetchIntrospection(options).pipe(
164
169
  Effect.mapError((error) =>
165
- InputSource.InputSourceError('introspection', `Failed to fetch introspection: ${error}`, error)
170
+ new InputSource.InputSourceError({
171
+ source: 'introspection',
172
+ message: `Failed to fetch introspection: ${error}`,
173
+ cause: error,
174
+ })
166
175
  ),
167
176
  )
168
177
 
@@ -176,13 +185,22 @@ export const loader = InputSource.createEffect({
176
185
 
177
186
  yield* Effect.tryPromise({
178
187
  try: () => writeCache(cachePath, newCacheEntry),
179
- catch: (error) => InputSource.InputSourceError('introspection', `Failed to write cache: ${error}`, error),
188
+ catch: (error) =>
189
+ new InputSource.InputSourceError({
190
+ source: 'introspection',
191
+ message: `Failed to write cache: ${error}`,
192
+ cause: error,
193
+ }),
180
194
  })
181
195
  }
182
196
 
183
197
  return yield* createCatalogFromSchema(schema).pipe(
184
198
  Effect.mapError((error) =>
185
- InputSource.InputSourceError('introspection', `Failed to create catalog: ${error}`, error)
199
+ new InputSource.InputSourceError({
200
+ source: 'introspection',
201
+ message: `Failed to create catalog: ${error}`,
202
+ cause: error,
203
+ })
186
204
  ),
187
205
  )
188
206
  }),
@@ -196,7 +214,11 @@ export const loader = InputSource.createEffect({
196
214
  // Force fresh introspection
197
215
  const schema = yield* fetchIntrospection(options).pipe(
198
216
  Effect.mapError((error) =>
199
- InputSource.InputSourceError('introspection', `Failed to fetch introspection: ${error}`, error)
217
+ new InputSource.InputSourceError({
218
+ source: 'introspection',
219
+ message: `Failed to fetch introspection: ${error}`,
220
+ cause: error,
221
+ })
200
222
  ),
201
223
  )
202
224
 
@@ -210,12 +232,21 @@ export const loader = InputSource.createEffect({
210
232
 
211
233
  yield* Effect.tryPromise({
212
234
  try: () => writeCache(cachePath, newCacheEntry),
213
- catch: (error) => InputSource.InputSourceError('introspection', `Failed to write cache: ${error}`, error),
235
+ catch: (error) =>
236
+ new InputSource.InputSourceError({
237
+ source: 'introspection',
238
+ message: `Failed to write cache: ${error}`,
239
+ cause: error,
240
+ }),
214
241
  })
215
242
 
216
243
  return yield* createCatalogFromSchema(schema).pipe(
217
244
  Effect.mapError((error) =>
218
- InputSource.InputSourceError('introspection', `Failed to create catalog: ${error}`, error)
245
+ new InputSource.InputSourceError({
246
+ source: 'introspection',
247
+ message: `Failed to create catalog: ${error}`,
248
+ cause: error,
249
+ })
219
250
  ),
220
251
  )
221
252
  }),
@@ -122,10 +122,22 @@ const parseSchema = (value: string | GraphQLSchema): Effect.Effect<GraphQLSchema
122
122
  Effect.gen(function*() {
123
123
  if (typeof value === 'string') {
124
124
  const ast = yield* Grafaid.Schema.AST.parse(value).pipe(
125
- Effect.mapError((error) => InputSource.InputSourceError('memory', `Failed to parse schema: ${error}`, error)),
125
+ Effect.mapError((error) =>
126
+ new InputSource.InputSourceError({
127
+ source: 'memory',
128
+ message: `Failed to parse schema: ${error}`,
129
+ cause: error,
130
+ })
131
+ ),
126
132
  )
127
133
  return yield* Grafaid.Schema.fromAST(ast).pipe(
128
- Effect.mapError((error) => InputSource.InputSourceError('memory', `Failed to build schema: ${error}`, error)),
134
+ Effect.mapError((error) =>
135
+ new InputSource.InputSourceError({
136
+ source: 'memory',
137
+ message: `Failed to build schema: ${error}`,
138
+ cause: error,
139
+ })
140
+ ),
129
141
  )
130
142
  }
131
143
  return value // Already a GraphQLSchema
@@ -186,7 +198,11 @@ export const read = (
186
198
 
187
199
  changes = yield* Change.calcChangeset({ before, after }).pipe(
188
200
  Effect.mapError((error) =>
189
- InputSource.InputSourceError('memory', `Failed to calculate changeset: ${error}`, error)
201
+ new InputSource.InputSourceError({
202
+ source: 'memory',
203
+ message: `Failed to calculate changeset: ${error}`,
204
+ cause: error,
205
+ })
190
206
  ),
191
207
  )
192
208
  }
@@ -10,7 +10,7 @@ import { debugPolen } from '#singletons/debug'
10
10
  import { PlatformError } from '@effect/platform/Error'
11
11
  import { FileSystem } from '@effect/platform/FileSystem'
12
12
  import { Arr, Path } from '@wollybeard/kit'
13
- import { Effect, HashMap } from 'effect'
13
+ import { Array, Effect, HashMap } from 'effect'
14
14
  import type { GraphQLSchema } from 'graphql'
15
15
 
16
16
  const debug = debugPolen.sub(`schema:data-source-versioned-schema-directory`)
@@ -203,20 +203,20 @@ export const readOrThrow = (
203
203
  const content = yield* fs.readFileString(filePath)
204
204
  const ast = yield* Grafaid.Schema.AST.parse(content).pipe(
205
205
  Effect.mapError((error) =>
206
- InputSource.InputSourceError(
207
- 'versionedDirectory',
208
- `Failed to parse schema from ${filePath}: ${error}`,
209
- error,
210
- )
206
+ new InputSource.InputSourceError({
207
+ source: 'versionedDirectory',
208
+ message: `Failed to parse schema from ${filePath}: ${error}`,
209
+ cause: error,
210
+ })
211
211
  ),
212
212
  )
213
213
  const schema = yield* Grafaid.Schema.fromAST(ast).pipe(
214
214
  Effect.mapError((error) =>
215
- InputSource.InputSourceError(
216
- 'versionedDirectory',
217
- `Failed to build schema from ${filePath}: ${error}`,
218
- error,
219
- )
215
+ new InputSource.InputSourceError({
216
+ source: 'versionedDirectory',
217
+ message: `Failed to build schema from ${filePath}: ${error}`,
218
+ cause: error,
219
+ })
220
220
  ),
221
221
  )
222
222
 
@@ -285,11 +285,11 @@ export const readOrThrow = (
285
285
 
286
286
  const changes = yield* Change.calcChangeset({ before, after }).pipe(
287
287
  Effect.mapError((error) =>
288
- InputSource.InputSourceError(
289
- 'versionedDirectory',
290
- `Failed to calculate changeset for ${version.name}: ${error}`,
291
- error,
292
- )
288
+ new InputSource.InputSourceError({
289
+ source: 'versionedDirectory',
290
+ message: `Failed to calculate changeset for ${version.name}: ${error}`,
291
+ cause: error,
292
+ })
293
293
  ),
294
294
  )
295
295
 
@@ -330,11 +330,11 @@ export const readOrThrow = (
330
330
 
331
331
  const changes = yield* Change.calcChangeset({ before, after }).pipe(
332
332
  Effect.mapError((error) =>
333
- InputSource.InputSourceError(
334
- 'versionedDirectory',
335
- `Failed to calculate parent changeset: ${error}`,
336
- error,
337
- )
333
+ new InputSource.InputSourceError({
334
+ source: 'versionedDirectory',
335
+ message: `Failed to calculate parent changeset: ${error}`,
336
+ cause: error,
337
+ })
338
338
  ),
339
339
  )
340
340
 
@@ -452,9 +452,8 @@ export const loader = InputSource.createEffect({
452
452
  // Check for revision files or schema.graphql
453
453
  const dirFiles = yield* Effect.either(fs.readDirectory(versionPath))
454
454
  if (dirFiles._tag === 'Right') {
455
- const hasRevisions = dirFiles.right.some(file =>
456
- /^\d{4}-\d{2}-\d{2}\.graphql$/.test(file) || file === 'schema.graphql'
457
- )
455
+ const hasRevisions = Array.some(dirFiles.right, file =>
456
+ /^\d{4}-\d{2}-\d{2}\.graphql$/.test(file) || file === 'schema.graphql')
458
457
  if (hasRevisions) {
459
458
  return true
460
459
  }
@@ -520,9 +519,8 @@ export const loader = InputSource.createEffect({
520
519
  // Check for schema files
521
520
  const dirFiles = yield* Effect.either(fs.readDirectory(versionPath))
522
521
  if (dirFiles._tag === 'Right') {
523
- const hasSchemaFiles = dirFiles.right.some(file =>
524
- /^\d{4}-\d{2}-\d{2}\.graphql$/.test(file) || file === 'schema.graphql'
525
- )
522
+ const hasSchemaFiles = Array.some(dirFiles.right, file =>
523
+ /^\d{4}-\d{2}-\d{2}\.graphql$/.test(file) || file === 'schema.graphql')
526
524
 
527
525
  if (hasSchemaFiles) {
528
526
  debug('found valid schema files, proceeding with full read')
@@ -1,6 +1,7 @@
1
1
  import type { Config } from '#api/config/normalized'
2
2
  import { Augmentations } from '#api/schema/augmentations/$'
3
- import type { EffectInputSource, InputSource, InputSourceError } from '#api/schema/input-source/input-source'
3
+ import type { InputSourceError } from '#api/schema/input-source/errors'
4
+ import type { EffectInputSource, InputSource } from '#api/schema/input-source/input-source'
4
5
  import * as InputSourceLoader from '#api/schema/input-source/load'
5
6
  import { InputSources } from '#api/schema/input-sources/$'
6
7
  import { Catalog } from '#lib/catalog/$'
@@ -1,13 +1,33 @@
1
1
  import { S } from '#lib/kit-temp/effect'
2
2
  import { Schema } from '#lib/schema/$'
3
+ import { VersionCoverage } from '#lib/version-coverage'
3
4
  import { Version } from '#lib/version/$'
4
- import { HashMap, Match } from 'effect'
5
+ import { Data, Either, HashMap, Match, Option } from 'effect'
5
6
  import * as Unversioned from './unversioned.js'
6
7
  import * as Versioned from './versioned.js'
7
8
 
8
9
  export * as Unversioned from './unversioned.js'
9
10
  export * as Versioned from './versioned.js'
10
11
 
12
+ // ============================================================================
13
+ // Error Types
14
+ // ============================================================================
15
+
16
+ /**
17
+ * Error thrown when a version is not found in the catalog
18
+ */
19
+ export class VersionNotFoundInCatalogError extends Data.TaggedError('VersionNotFoundInCatalogError')<{
20
+ readonly version: string
21
+ readonly reason: string
22
+ }> {}
23
+
24
+ /**
25
+ * Error thrown when a catalog has no entries
26
+ */
27
+ export class EmptyCatalogError extends Data.TaggedError('EmptyCatalogError')<{
28
+ readonly reason: string
29
+ }> {}
30
+
11
31
  // ============================================================================
12
32
  // Schema
13
33
  // ============================================================================
@@ -87,14 +107,77 @@ export const getLatest = (catalog: Catalog): Schema.Schema =>
87
107
 
88
108
  /**
89
109
  * Get the latest version identifier from a catalog.
90
- * Returns the version for versioned catalogs, or null for unversioned catalogs.
110
+ * Returns the version for versioned catalogs, or none for unversioned catalogs.
91
111
  */
92
- export const getLatestVersion = (catalog?: Catalog): Version.Version | null => {
93
- if (!catalog) return null
112
+ export const getLatestVersion = (catalog?: Catalog): Option.Option<Version.Version> => {
113
+ if (!catalog) return Option.none()
94
114
  return Match.value(catalog).pipe(
95
115
  Match.tagsExhaustive({
96
- CatalogUnversioned: () => null,
97
- CatalogVersioned: (cat) => Versioned.getVersions(cat)[0] ?? null,
116
+ CatalogUnversioned: () => Option.none(),
117
+ CatalogVersioned: (cat) => {
118
+ const versions = Versioned.getVersions(cat)
119
+ return versions[0] ? Option.some(versions[0]) : Option.none()
120
+ },
98
121
  }),
99
122
  )
100
123
  }
124
+
125
+ // ============================================================================
126
+ // Resolution Functions
127
+ // ============================================================================
128
+
129
+ /**
130
+ * Resolve schema from catalog for a given version coverage.
131
+ *
132
+ * @param catalog - The schema catalog
133
+ * @param versionCoverage - The version coverage to use (optional, defaults to latest)
134
+ * @returns Either with the resolved schema or error
135
+ */
136
+ export const resolveCatalogSchemaEither = (
137
+ catalog: Catalog,
138
+ versionCoverage?: VersionCoverage.VersionCoverage | null,
139
+ ): Either.Either<Schema.Schema, VersionNotFoundInCatalogError | EmptyCatalogError> => {
140
+ if (Unversioned.is(catalog)) {
141
+ return Either.right(catalog.schema)
142
+ }
143
+
144
+ // If no version coverage specified, use latest
145
+ if (!versionCoverage) {
146
+ return Versioned.getLatest(catalog)
147
+ }
148
+
149
+ // Get the latest version from the coverage
150
+ const version = VersionCoverage.getLatest(versionCoverage)
151
+
152
+ const schemaOption = HashMap.get(catalog.entries, version)
153
+ if (Option.isNone(schemaOption)) {
154
+ return Either.left(
155
+ new VersionNotFoundInCatalogError({
156
+ version: Version.encodeSync(version),
157
+ reason: `Version ${Version.encodeSync(version)} not found in catalog`,
158
+ }),
159
+ )
160
+ }
161
+
162
+ return Either.right(Option.getOrThrow(schemaOption))
163
+ }
164
+
165
+ /**
166
+ * Resolve schema from catalog for a given version coverage.
167
+ *
168
+ * @param catalog - The schema catalog
169
+ * @param versionCoverage - The version coverage to use (optional, defaults to latest)
170
+ * @returns The resolved schema
171
+ * @throws {Error} If catalog is versioned but version is not found
172
+ * @deprecated Use resolveCatalogSchemaEither which returns Either
173
+ */
174
+ export const resolveCatalogSchema = (
175
+ catalog: Catalog,
176
+ versionCoverage?: VersionCoverage.VersionCoverage | null,
177
+ ): Schema.Schema => {
178
+ const result = resolveCatalogSchemaEither(catalog, versionCoverage)
179
+ if (Either.isLeft(result)) {
180
+ throw new Error(result.left.reason)
181
+ }
182
+ return result.right
183
+ }
@@ -1,7 +1,8 @@
1
1
  import { S } from '#lib/kit-temp/effect'
2
- import { Array, HashMap, Iterable, Order, pipe } from 'effect'
2
+ import { Array, Either, HashMap, Iterable, Order, pipe } from 'effect'
3
3
  import { Schema } from '../schema/$.js'
4
4
  import { Version } from '../version/$.js'
5
+ import { EmptyCatalogError } from './catalog.js'
5
6
 
6
7
  // ============================================================================
7
8
  // Schema
@@ -50,6 +51,25 @@ export const equivalence = S.equivalence(Versioned)
50
51
  // Domain Logic
51
52
  // ============================================================================
52
53
 
54
+ /**
55
+ * Get the latest schema from a versioned catalog.
56
+ * The latest version is determined by Version.max comparison.
57
+ *
58
+ * @param catalog - The versioned catalog
59
+ * @returns Either with the latest schema or EmptyCatalogError
60
+ */
61
+ export const getLatest = (catalog: Versioned): Either.Either<Schema.Versioned.Versioned, EmptyCatalogError> => {
62
+ const schema = getAll(catalog)[0]
63
+ if (!schema) {
64
+ return Either.left(
65
+ new EmptyCatalogError({
66
+ reason: 'Versioned catalog has no entries - cannot get latest schema',
67
+ }),
68
+ )
69
+ }
70
+ return Either.right(schema)
71
+ }
72
+
53
73
  /**
54
74
  * Get the latest schema definition from a versioned catalog.
55
75
  * The latest version is determined by Version.max comparison.
@@ -57,13 +77,14 @@ export const equivalence = S.equivalence(Versioned)
57
77
  * @param catalog - The versioned catalog
58
78
  * @returns The GraphQL schema definition of the latest version
59
79
  * @throws {Error} If the catalog has no entries
80
+ * @deprecated Use getLatest which returns Either
60
81
  */
61
82
  export const getLatestOrThrow = (catalog: Versioned): Schema.Versioned.Versioned => {
62
- const schema = getAll(catalog)[0]
63
- if (!schema) {
64
- throw new Error('Versioned catalog has no entries - cannot get latest schema')
83
+ const result = getLatest(catalog)
84
+ if (Either.isLeft(result)) {
85
+ throw new Error(result.left.reason)
65
86
  }
66
- return schema
87
+ return result.right
67
88
  }
68
89
 
69
90
  /**