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.
- package/build/api/builder/ssg/generate.d.ts.map +1 -1
- package/build/api/builder/ssg/generate.js +5 -5
- package/build/api/builder/ssg/generate.js.map +1 -1
- package/build/api/builder/ssg/page-generator.worker.js +13 -3
- package/build/api/builder/ssg/page-generator.worker.js.map +1 -1
- package/build/api/config/input.d.ts +88 -3
- package/build/api/config/input.d.ts.map +1 -1
- package/build/api/config/normalized.d.ts +92 -7
- package/build/api/config/normalized.d.ts.map +1 -1
- package/build/api/config/normalized.js +11 -3
- package/build/api/config/normalized.js.map +1 -1
- package/build/api/config-template/template.js +2 -2
- package/build/api/config-template/template.js.map +1 -1
- package/build/api/content/sidebar.d.ts.map +1 -1
- package/build/api/content/sidebar.js +2 -1
- package/build/api/content/sidebar.js.map +1 -1
- package/build/api/errors.d.ts +278 -0
- package/build/api/errors.d.ts.map +1 -0
- package/build/api/errors.js +153 -0
- package/build/api/errors.js.map +1 -0
- package/build/api/examples/config.d.ts +366 -3
- package/build/api/examples/config.d.ts.map +1 -1
- package/build/api/examples/config.js +25 -3
- package/build/api/examples/config.js.map +1 -1
- package/build/api/examples/diagnostic/diagnostic.d.ts +1 -1
- package/build/api/examples/diagnostic/validation-error.d.ts +3 -2
- package/build/api/examples/diagnostic/validation-error.d.ts.map +1 -1
- package/build/api/examples/diagnostic/validation-error.js +9 -3
- package/build/api/examples/diagnostic/validation-error.js.map +1 -1
- package/build/api/examples/diagnostic/validator.d.ts.map +1 -1
- package/build/api/examples/diagnostic/validator.js +115 -68
- package/build/api/examples/diagnostic/validator.js.map +1 -1
- package/build/api/examples/filter.d.ts.map +1 -1
- package/build/api/examples/filter.js +9 -6
- package/build/api/examples/filter.js.map +1 -1
- package/build/api/examples/scanner.d.ts.map +1 -1
- package/build/api/examples/scanner.js +89 -103
- package/build/api/examples/scanner.js.map +1 -1
- package/build/api/examples/type-usage-indexer.d.ts.map +1 -1
- package/build/api/examples/type-usage-indexer.js +17 -30
- package/build/api/examples/type-usage-indexer.js.map +1 -1
- package/build/api/iso/schema/routing.d.ts.map +1 -1
- package/build/api/iso/schema/routing.js +8 -8
- package/build/api/iso/schema/routing.js.map +1 -1
- package/build/api/iso/schema/validation.d.ts.map +1 -1
- package/build/api/iso/schema/validation.js +3 -2
- package/build/api/iso/schema/validation.js.map +1 -1
- package/build/api/schema/input-source/$$.d.ts +1 -0
- package/build/api/schema/input-source/$$.d.ts.map +1 -1
- package/build/api/schema/input-source/$$.js +1 -0
- package/build/api/schema/input-source/$$.js.map +1 -1
- package/build/api/schema/input-source/errors.d.ts +36 -0
- package/build/api/schema/input-source/errors.d.ts.map +1 -0
- package/build/api/schema/input-source/errors.js +17 -0
- package/build/api/schema/input-source/errors.js.map +1 -0
- package/build/api/schema/input-source/input-source.d.ts +1 -7
- package/build/api/schema/input-source/input-source.d.ts.map +1 -1
- package/build/api/schema/input-source/input-source.js +0 -6
- package/build/api/schema/input-source/input-source.js.map +1 -1
- package/build/api/schema/input-sources/directory.d.ts.map +1 -1
- package/build/api/schema/input-sources/directory.js +19 -6
- package/build/api/schema/input-sources/directory.js.map +1 -1
- package/build/api/schema/input-sources/file.d.ts.map +1 -1
- package/build/api/schema/input-sources/file.js +15 -4
- package/build/api/schema/input-sources/file.js.map +1 -1
- package/build/api/schema/input-sources/introspection-file.d.ts.map +1 -1
- package/build/api/schema/input-sources/introspection-file.js +28 -6
- package/build/api/schema/input-sources/introspection-file.js.map +1 -1
- package/build/api/schema/input-sources/introspection.d.ts.map +1 -1
- package/build/api/schema/input-sources/introspection.js +35 -7
- package/build/api/schema/input-sources/introspection.js.map +1 -1
- package/build/api/schema/input-sources/memory.d.ts.map +1 -1
- package/build/api/schema/input-sources/memory.js +15 -3
- package/build/api/schema/input-sources/memory.js.map +1 -1
- package/build/api/schema/input-sources/versioned-directory.d.ts.map +1 -1
- package/build/api/schema/input-sources/versioned-directory.js +23 -7
- package/build/api/schema/input-sources/versioned-directory.js.map +1 -1
- package/build/api/schema/load.d.ts +1 -1
- package/build/api/schema/load.d.ts.map +1 -1
- package/build/api/schema/load.js.map +1 -1
- package/build/cli/commands/hero-image.d.ts +1 -2
- package/build/cli/commands/hero-image.d.ts.map +1 -1
- package/build/cli/index.d.ts +1 -1
- package/build/lib/catalog/catalog.d.ts +43 -3
- package/build/lib/catalog/catalog.d.ts.map +1 -1
- package/build/lib/catalog/catalog.js +67 -5
- package/build/lib/catalog/catalog.js.map +1 -1
- package/build/lib/catalog/versioned.d.ts +11 -1
- package/build/lib/catalog/versioned.d.ts.map +1 -1
- package/build/lib/catalog/versioned.js +23 -5
- package/build/lib/catalog/versioned.js.map +1 -1
- package/build/lib/document/document.d.ts +55 -5
- package/build/lib/document/document.d.ts.map +1 -1
- package/build/lib/document/document.js +96 -2
- package/build/lib/document/document.js.map +1 -1
- package/build/lib/document/versioned.d.ts +2 -2
- package/build/lib/document/versioned.d.ts.map +1 -1
- package/build/lib/document/versioned.js +7 -7
- package/build/lib/document/versioned.js.map +1 -1
- package/build/lib/lifecycles/lifecycles.d.ts +5 -4
- package/build/lib/lifecycles/lifecycles.d.ts.map +1 -1
- package/build/lib/lifecycles/lifecycles.js +14 -12
- package/build/lib/lifecycles/lifecycles.js.map +1 -1
- package/build/lib/version-coverage/$$.d.ts +2 -0
- package/build/lib/version-coverage/$$.d.ts.map +1 -0
- package/build/lib/version-coverage/$$.js +2 -0
- package/build/lib/version-coverage/$$.js.map +1 -0
- package/build/lib/version-coverage/$.d.ts.map +1 -0
- package/build/lib/version-coverage/$.js.map +1 -0
- package/build/lib/{version-selection/version-selection.d.ts → version-coverage/version-coverage.d.ts} +1 -1
- package/build/lib/version-coverage/version-coverage.d.ts.map +1 -0
- package/build/lib/{version-selection/version-selection.js → version-coverage/version-coverage.js} +2 -2
- package/build/lib/version-coverage/version-coverage.js.map +1 -0
- package/build/template/components/GraphQLDocument.d.ts +1 -1
- package/build/template/components/GraphQLDocument.d.ts.map +1 -1
- package/build/template/components/GraphQLDocument.js +10 -39
- package/build/template/components/GraphQLDocument.js.map +1 -1
- package/build/template/components/GraphQLInteractive/lib/parser.d.ts +28 -0
- package/build/template/components/GraphQLInteractive/lib/parser.d.ts.map +1 -1
- package/build/template/components/GraphQLInteractive/lib/parser.js +60 -27
- package/build/template/components/GraphQLInteractive/lib/parser.js.map +1 -1
- package/build/template/components/ReferenceVersionPicker.d.ts +9 -0
- package/build/template/components/ReferenceVersionPicker.d.ts.map +1 -0
- package/build/template/components/ReferenceVersionPicker.js +79 -0
- package/build/template/components/ReferenceVersionPicker.js.map +1 -0
- package/build/template/components/VersionCoveragePicker.d.ts +1 -1
- package/build/template/components/VersionCoveragePicker.d.ts.map +1 -1
- package/build/template/components/VersionCoveragePicker.js +4 -6
- package/build/template/components/VersionCoveragePicker.js.map +1 -1
- package/build/template/components/VersionPicker.d.ts +8 -3
- package/build/template/components/VersionPicker.d.ts.map +1 -1
- package/build/template/components/VersionPicker.js +12 -77
- package/build/template/components/VersionPicker.js.map +1 -1
- package/build/template/components/home/QuickStart.d.ts.map +1 -1
- package/build/template/components/home/QuickStart.js +8 -4
- package/build/template/components/home/QuickStart.js.map +1 -1
- package/build/template/hooks/use-highlighted.d.ts.map +1 -1
- package/build/template/hooks/use-highlighted.js +19 -13
- package/build/template/hooks/use-highlighted.js.map +1 -1
- package/build/template/lib/fetch-text.d.ts +18 -0
- package/build/template/lib/fetch-text.d.ts.map +1 -1
- package/build/template/lib/fetch-text.js +32 -4
- package/build/template/lib/fetch-text.js.map +1 -1
- package/build/template/routes/changelog/ChangelogBody.d.ts +6 -0
- package/build/template/routes/changelog/ChangelogBody.d.ts.map +1 -0
- package/build/template/{components/Changelog/Changelog.js → routes/changelog/ChangelogBody.js} +8 -58
- package/build/template/routes/changelog/ChangelogBody.js.map +1 -0
- package/build/template/routes/changelog/ChangelogSidebar.d.ts +7 -0
- package/build/template/routes/changelog/ChangelogSidebar.d.ts.map +1 -0
- package/build/template/routes/changelog/ChangelogSidebar.js +46 -0
- package/build/template/routes/changelog/ChangelogSidebar.js.map +1 -0
- package/build/template/routes/changelog/ChangelogSidebarItem.d.ts +11 -0
- package/build/template/routes/changelog/ChangelogSidebarItem.d.ts.map +1 -0
- package/build/template/routes/changelog/ChangelogSidebarItem.js +35 -0
- package/build/template/routes/changelog/ChangelogSidebarItem.js.map +1 -0
- package/build/template/routes/changelog/_.d.ts +3264 -0
- package/build/template/routes/changelog/_.d.ts.map +1 -0
- package/build/template/routes/changelog/_.js +111 -0
- package/build/template/routes/changelog/_.js.map +1 -0
- package/build/template/routes/changelog/utils.d.ts +3 -0
- package/build/template/routes/changelog/utils.d.ts.map +1 -0
- package/build/template/routes/changelog/utils.js +11 -0
- package/build/template/routes/changelog/utils.js.map +1 -0
- package/build/template/routes/examples/name.d.ts.map +1 -1
- package/build/template/routes/examples/name.js +4 -2
- package/build/template/routes/examples/name.js.map +1 -1
- package/build/template/routes/reference.js +2 -2
- package/build/template/routes/reference.js.map +1 -1
- package/build/template/routes/root.js +1 -1
- package/build/template/routes/root.js.map +1 -1
- package/build/template/stores/toast.d.ts.map +1 -1
- package/build/template/stores/toast.js +5 -3
- package/build/template/stores/toast.js.map +1 -1
- package/build/template/theme/swiss-sharp.css +14 -14
- package/build/vite/plugins/schemas.d.ts +1 -2
- package/build/vite/plugins/schemas.d.ts.map +1 -1
- package/build/vite/plugins/schemas.js +0 -1
- package/build/vite/plugins/schemas.js.map +1 -1
- package/package.json +7 -7
- package/src/api/builder/ssg/generate.ts +10 -5
- package/src/api/builder/ssg/page-generator.worker.ts +18 -3
- package/src/api/config/normalized.ts +12 -3
- package/src/api/config-template/template.ts +2 -2
- package/src/api/content/sidebar.ts +3 -3
- package/src/api/errors.ts +227 -0
- package/src/api/examples/config.test.ts +10 -0
- package/src/api/examples/config.ts +33 -4
- package/src/api/examples/diagnostic/validation-error.ts +9 -3
- package/src/api/examples/diagnostic/validator.test.ts +30 -0
- package/src/api/examples/diagnostic/validator.ts +148 -103
- package/src/api/examples/filter.ts +9 -6
- package/src/api/examples/scanner.ts +136 -117
- package/src/api/examples/type-usage-indexer.ts +24 -36
- package/src/api/iso/schema/routing.ts +10 -10
- package/src/api/iso/schema/validation.ts +3 -2
- package/src/api/schema/input-source/$$.ts +1 -0
- package/src/api/schema/input-source/errors.ts +26 -0
- package/src/api/schema/input-source/input-source.ts +1 -22
- package/src/api/schema/input-sources/directory.ts +20 -15
- package/src/api/schema/input-sources/file.ts +17 -4
- package/src/api/schema/input-sources/introspection-file.ts +30 -15
- package/src/api/schema/input-sources/introspection.ts +38 -7
- package/src/api/schema/input-sources/memory.ts +19 -3
- package/src/api/schema/input-sources/versioned-directory.ts +25 -27
- package/src/api/schema/load.ts +2 -1
- package/src/lib/catalog/catalog.ts +89 -6
- package/src/lib/catalog/versioned.ts +26 -5
- package/src/lib/document/document.ts +135 -2
- package/src/lib/document/versioned.ts +8 -8
- package/src/lib/lifecycles/lifecycles.ts +32 -27
- package/src/lib/version-coverage/$$.ts +1 -0
- package/src/lib/{version-selection/version-selection.ts → version-coverage/version-coverage.ts} +1 -1
- package/src/template/components/GraphQLDocument.tsx +11 -69
- package/src/template/components/GraphQLInteractive/lib/parser.ts +81 -29
- package/src/template/components/ReferenceVersionPicker.tsx +107 -0
- package/src/template/components/VersionCoveragePicker.tsx +4 -5
- package/src/template/components/VersionPicker.tsx +32 -98
- package/src/template/components/home/QuickStart.tsx +16 -7
- package/src/template/hooks/use-highlighted.ts +31 -19
- package/src/template/lib/fetch-text.ts +45 -4
- package/src/template/{components/Changelog/Changelog.tsx → routes/changelog/ChangelogBody.tsx} +7 -64
- package/src/template/routes/changelog/ChangelogSidebar.tsx +80 -0
- package/src/template/routes/changelog/ChangelogSidebarItem.tsx +68 -0
- package/src/template/routes/changelog/_.tsx +129 -0
- package/src/template/routes/changelog/utils.ts +13 -0
- package/src/template/routes/examples/name.tsx +4 -2
- package/src/template/routes/reference.tsx +2 -2
- package/src/template/routes/root.tsx +1 -1
- package/src/template/stores/toast.ts +6 -3
- package/src/template/theme/swiss-sharp.css +14 -14
- package/src/vite/plugins/schemas.ts +0 -1
- package/build/lib/graph/$$.d.ts +0 -2
- package/build/lib/graph/$$.d.ts.map +0 -1
- package/build/lib/graph/$$.js +0 -2
- package/build/lib/graph/$$.js.map +0 -1
- package/build/lib/graph/$.d.ts +0 -2
- package/build/lib/graph/$.d.ts.map +0 -1
- package/build/lib/graph/$.js +0 -2
- package/build/lib/graph/$.js.map +0 -1
- package/build/lib/graph/graph.d.ts +0 -127
- package/build/lib/graph/graph.d.ts.map +0 -1
- package/build/lib/graph/graph.js +0 -152
- package/build/lib/graph/graph.js.map +0 -1
- package/build/lib/mask/$$.d.ts +0 -3
- package/build/lib/mask/$$.d.ts.map +0 -1
- package/build/lib/mask/$$.js +0 -3
- package/build/lib/mask/$$.js.map +0 -1
- package/build/lib/mask/$.d.ts +0 -2
- package/build/lib/mask/$.d.ts.map +0 -1
- package/build/lib/mask/$.js +0 -2
- package/build/lib/mask/$.js.map +0 -1
- package/build/lib/mask/apply.d.ts +0 -86
- package/build/lib/mask/apply.d.ts.map +0 -1
- package/build/lib/mask/apply.js +0 -86
- package/build/lib/mask/apply.js.map +0 -1
- package/build/lib/mask/mask.d.ts +0 -124
- package/build/lib/mask/mask.d.ts.map +0 -1
- package/build/lib/mask/mask.js +0 -137
- package/build/lib/mask/mask.js.map +0 -1
- package/build/lib/mask/mask.test-d.d.ts +0 -2
- package/build/lib/mask/mask.test-d.d.ts.map +0 -1
- package/build/lib/mask/mask.test-d.js +0 -102
- package/build/lib/mask/mask.test-d.js.map +0 -1
- package/build/lib/version-selection/$$.d.ts +0 -2
- package/build/lib/version-selection/$$.d.ts.map +0 -1
- package/build/lib/version-selection/$$.js +0 -2
- package/build/lib/version-selection/$$.js.map +0 -1
- package/build/lib/version-selection/$.d.ts.map +0 -1
- package/build/lib/version-selection/$.js.map +0 -1
- package/build/lib/version-selection/version-selection.d.ts.map +0 -1
- package/build/lib/version-selection/version-selection.js.map +0 -1
- package/build/sandbox.d.ts +0 -2
- package/build/sandbox.d.ts.map +0 -1
- package/build/sandbox.js +0 -17
- package/build/sandbox.js.map +0 -1
- package/build/template/components/Changelog/Changelog.d.ts +0 -8
- package/build/template/components/Changelog/Changelog.d.ts.map +0 -1
- package/build/template/components/Changelog/Changelog.js.map +0 -1
- package/build/template/components/Changelog/ChangelogVersionPicker.d.ts +0 -8
- package/build/template/components/Changelog/ChangelogVersionPicker.d.ts.map +0 -1
- package/build/template/components/Changelog/ChangelogVersionPicker.js +0 -16
- package/build/template/components/Changelog/ChangelogVersionPicker.js.map +0 -1
- package/build/template/components/SimpleVersionPicker.d.ts +0 -15
- package/build/template/components/SimpleVersionPicker.d.ts.map +0 -1
- package/build/template/components/SimpleVersionPicker.js +0 -15
- package/build/template/components/SimpleVersionPicker.js.map +0 -1
- package/build/template/routes/changelog.d.ts +0 -1635
- package/build/template/routes/changelog.d.ts.map +0 -1
- package/build/template/routes/changelog.js +0 -168
- package/build/template/routes/changelog.js.map +0 -1
- package/src/lib/graph/$$.ts +0 -1
- package/src/lib/graph/$.ts +0 -1
- package/src/lib/graph/graph.ts +0 -197
- package/src/lib/mask/$$.ts +0 -2
- package/src/lib/mask/$.test.ts +0 -226
- package/src/lib/mask/$.ts +0 -1
- package/src/lib/mask/apply.ts +0 -134
- package/src/lib/mask/mask.test-d.ts +0 -156
- package/src/lib/mask/mask.ts +0 -244
- package/src/lib/version-selection/$$.ts +0 -1
- package/src/sandbox.ts +0 -15
- package/src/template/components/Changelog/ChangelogVersionPicker.tsx +0 -36
- package/src/template/components/SimpleVersionPicker.tsx +0 -48
- package/src/template/routes/changelog.tsx +0 -267
- /package/build/lib/{version-selection → version-coverage}/$.d.ts +0 -0
- /package/build/lib/{version-selection → version-coverage}/$.js +0 -0
- /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(
|
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) =>
|
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(
|
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(
|
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
|
-
|
95
|
-
|
96
|
-
|
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
|
-
|
101
|
-
|
102
|
-
|
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(
|
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(
|
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) =>
|
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(
|
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) =>
|
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(
|
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(
|
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) =>
|
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(
|
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) =>
|
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) =>
|
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(
|
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
|
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
|
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')
|
package/src/api/schema/load.ts
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import type { Config } from '#api/config/normalized'
|
2
2
|
import { Augmentations } from '#api/schema/augmentations/$'
|
3
|
-
import type {
|
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
|
110
|
+
* Returns the version for versioned catalogs, or none for unversioned catalogs.
|
91
111
|
*/
|
92
|
-
export const getLatestVersion = (catalog?: Catalog): Version.Version
|
93
|
-
if (!catalog) return
|
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: () =>
|
97
|
-
CatalogVersioned: (cat) =>
|
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
|
63
|
-
if (
|
64
|
-
throw new Error(
|
83
|
+
const result = getLatest(catalog)
|
84
|
+
if (Either.isLeft(result)) {
|
85
|
+
throw new Error(result.left.reason)
|
65
86
|
}
|
66
|
-
return
|
87
|
+
return result.right
|
67
88
|
}
|
68
89
|
|
69
90
|
/**
|