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
@@ -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 {
|
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
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
-
|
91
|
-
|
92
|
-
|
128
|
+
},
|
129
|
+
})
|
130
|
+
}
|
131
|
+
})
|
93
132
|
|
94
|
-
|
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
|
-
|
109
|
-
|
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
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
}
|
131
|
-
|
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:
|
134
|
-
example: { name:
|
171
|
+
message: formatValidationMessage(example.name, version, errors),
|
172
|
+
example: { name: example.name, path: example.path },
|
135
173
|
version,
|
136
|
-
errors:
|
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:
|
147
|
-
errors:
|
195
|
+
version: Version.Version | undefined,
|
196
|
+
errors: Array.NonEmptyReadonlyArray<GraphQLError>,
|
148
197
|
): string => {
|
149
|
-
const versionStr = 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
|
155
|
-
const preview =
|
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
|
-
|
165
|
-
|
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 =
|
32
|
-
return examples.filter(example =>
|
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 =
|
38
|
-
return examples.filter(example => !
|
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
|
-
|
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
|
-
|
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
|