polen 0.10.0-next.11 → 0.10.0-next.13
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/builder.js +1 -1
- package/build/api/builder/builder.js.map +1 -1
- package/build/api/config/load.js +1 -1
- package/build/api/config/load.js.map +1 -1
- package/build/api/vite/plugins/build.js +1 -1
- package/build/api/vite/plugins/build.js.map +1 -1
- package/build/api/vite/plugins/core.d.ts.map +1 -1
- package/build/api/vite/plugins/core.js +0 -2
- package/build/api/vite/plugins/core.js.map +1 -1
- package/build/api/vite/plugins/pages.js +1 -1
- package/build/api/vite/plugins/pages.js.map +1 -1
- package/build/exports/components.d.ts +4 -1
- package/build/exports/components.d.ts.map +1 -1
- package/build/exports/components.js +4 -1
- package/build/exports/components.js.map +1 -1
- package/build/lib/demos/config-schema.d.ts +6 -6
- package/build/lib/github-actions/runner.js +2 -2
- package/build/lib/github-actions/runner.js.map +1 -1
- package/build/lib/graphql-document/$$.d.ts +5 -0
- package/build/lib/graphql-document/$$.d.ts.map +1 -0
- package/build/lib/graphql-document/$$.js +5 -0
- package/build/lib/graphql-document/$$.js.map +1 -0
- package/build/lib/graphql-document/$.d.ts +2 -0
- package/build/lib/graphql-document/$.d.ts.map +1 -0
- package/build/lib/graphql-document/$.js +2 -0
- package/build/lib/graphql-document/$.js.map +1 -0
- package/build/lib/graphql-document/analysis.d.ts +44 -0
- package/build/lib/graphql-document/analysis.d.ts.map +1 -0
- package/build/lib/graphql-document/analysis.js +361 -0
- package/build/lib/graphql-document/analysis.js.map +1 -0
- package/build/lib/graphql-document/components/CopyButton.d.ts +19 -0
- package/build/lib/graphql-document/components/CopyButton.d.ts.map +1 -0
- package/build/lib/graphql-document/components/CopyButton.js +43 -0
- package/build/lib/graphql-document/components/CopyButton.js.map +1 -0
- package/build/lib/graphql-document/components/GraphQLDocument.d.ts +38 -0
- package/build/lib/graphql-document/components/GraphQLDocument.d.ts.map +1 -0
- package/build/lib/graphql-document/components/GraphQLDocument.js +130 -0
- package/build/lib/graphql-document/components/GraphQLDocument.js.map +1 -0
- package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.d.ts +7 -0
- package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.d.ts.map +1 -0
- package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.js +45 -0
- package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.js.map +1 -0
- package/build/lib/graphql-document/components/GraphQLIdentifierPopover.d.ts +33 -0
- package/build/lib/graphql-document/components/GraphQLIdentifierPopover.d.ts.map +1 -0
- package/build/lib/graphql-document/components/GraphQLIdentifierPopover.js +48 -0
- package/build/lib/graphql-document/components/GraphQLIdentifierPopover.js.map +1 -0
- package/build/lib/graphql-document/components/IdentifierLink.d.ts +39 -0
- package/build/lib/graphql-document/components/IdentifierLink.d.ts.map +1 -0
- package/build/lib/graphql-document/components/IdentifierLink.js +75 -0
- package/build/lib/graphql-document/components/IdentifierLink.js.map +1 -0
- package/build/lib/graphql-document/components/graphql-document-styles.d.ts +5 -0
- package/build/lib/graphql-document/components/graphql-document-styles.d.ts.map +1 -0
- package/build/lib/graphql-document/components/graphql-document-styles.js +167 -0
- package/build/lib/graphql-document/components/graphql-document-styles.js.map +1 -0
- package/build/lib/graphql-document/components/index.d.ts +6 -0
- package/build/lib/graphql-document/components/index.d.ts.map +1 -0
- package/build/lib/graphql-document/components/index.js +6 -0
- package/build/lib/graphql-document/components/index.js.map +1 -0
- package/build/lib/graphql-document/example.d.ts +25 -0
- package/build/lib/graphql-document/example.d.ts.map +1 -0
- package/build/lib/graphql-document/example.js +140 -0
- package/build/lib/graphql-document/example.js.map +1 -0
- package/build/lib/graphql-document/graphql-document.d.ts +35 -0
- package/build/lib/graphql-document/graphql-document.d.ts.map +1 -0
- package/build/lib/graphql-document/graphql-document.js +36 -0
- package/build/lib/graphql-document/graphql-document.js.map +1 -0
- package/build/lib/graphql-document/hooks/use-tooltip-state.d.ts +43 -0
- package/build/lib/graphql-document/hooks/use-tooltip-state.d.ts.map +1 -0
- package/build/lib/graphql-document/hooks/use-tooltip-state.js +132 -0
- package/build/lib/graphql-document/hooks/use-tooltip-state.js.map +1 -0
- package/build/lib/graphql-document/positioning-simple.d.ts +68 -0
- package/build/lib/graphql-document/positioning-simple.d.ts.map +1 -0
- package/build/lib/graphql-document/positioning-simple.js +197 -0
- package/build/lib/graphql-document/positioning-simple.js.map +1 -0
- package/build/lib/graphql-document/schema-context.d.ts +8 -0
- package/build/lib/graphql-document/schema-context.d.ts.map +1 -0
- package/build/lib/graphql-document/schema-context.js +11 -0
- package/build/lib/graphql-document/schema-context.js.map +1 -0
- package/build/lib/graphql-document/schema-integration-example.d.ts +27 -0
- package/build/lib/graphql-document/schema-integration-example.d.ts.map +1 -0
- package/build/lib/graphql-document/schema-integration-example.js +297 -0
- package/build/lib/graphql-document/schema-integration-example.js.map +1 -0
- package/build/lib/graphql-document/schema-integration.d.ts +135 -0
- package/build/lib/graphql-document/schema-integration.d.ts.map +1 -0
- package/build/lib/graphql-document/schema-integration.js +328 -0
- package/build/lib/graphql-document/schema-integration.js.map +1 -0
- package/build/lib/graphql-document/types.d.ts +117 -0
- package/build/lib/graphql-document/types.d.ts.map +1 -0
- package/build/lib/graphql-document/types.js +2 -0
- package/build/lib/graphql-document/types.js.map +1 -0
- package/build/template/components/ArgumentAnnotation.js +10 -0
- package/build/template/components/ArgumentAnnotation.js.map +1 -0
- package/build/template/components/ArgumentList.js +9 -0
- package/build/template/components/ArgumentList.js.map +1 -0
- package/build/template/components/ArgumentListAnnotation.js +15 -0
- package/build/template/components/ArgumentListAnnotation.js.map +1 -0
- package/build/template/components/Changelog.js +44 -0
- package/build/template/components/Changelog.js.map +1 -0
- package/build/template/components/{CodeBlock.jsx → CodeBlock.js} +4 -5
- package/build/template/components/{CodeBlock.jsx.map → CodeBlock.js.map} +1 -1
- package/build/template/components/{CodeBlockEnhancer.jsx → CodeBlockEnhancer.js} +4 -4
- package/build/template/components/CodeBlockEnhancer.js.map +1 -0
- package/build/template/components/DeprecationReason.js +9 -0
- package/build/template/components/DeprecationReason.js.map +1 -0
- package/build/template/components/Description.js +9 -0
- package/build/template/components/Description.js.map +1 -0
- package/build/template/components/Field.js +14 -0
- package/build/template/components/Field.js.map +1 -0
- package/build/template/components/{FieldList.jsx → FieldList.js} +4 -5
- package/build/template/components/FieldList.js.map +1 -0
- package/build/template/components/{FieldListSection.jsx → FieldListSection.js} +4 -6
- package/build/template/components/FieldListSection.js.map +1 -0
- package/build/template/components/HamburgerMenu.js +30 -0
- package/build/template/components/HamburgerMenu.js.map +1 -0
- package/build/template/components/Link.d.ts +1 -1
- package/build/template/components/{Link.jsx → Link.js} +4 -5
- package/build/template/components/Link.js.map +1 -0
- package/build/template/components/Logo.js +20 -0
- package/build/template/components/Logo.js.map +1 -0
- package/build/template/components/MDXComponents.d.ts +11 -0
- package/build/template/components/MDXComponents.d.ts.map +1 -0
- package/build/template/components/MDXComponents.js +70 -0
- package/build/template/components/MDXComponents.js.map +1 -0
- package/build/template/components/{Markdown.jsx → Markdown.js} +3 -2
- package/build/template/components/Markdown.js.map +1 -0
- package/build/template/components/MissingSchema.d.ts +1 -1
- package/build/template/components/MissingSchema.d.ts.map +1 -1
- package/build/template/components/MissingSchema.js +5 -0
- package/build/template/components/MissingSchema.js.map +1 -0
- package/build/template/components/NamedType.js +12 -0
- package/build/template/components/NamedType.js.map +1 -0
- package/build/template/components/NotFound.js +7 -0
- package/build/template/components/NotFound.js.map +1 -0
- package/build/template/components/{RadixLink.jsx → RadixLink.js} +1 -1
- package/build/template/components/RadixLink.js.map +1 -0
- package/build/template/components/TestComponent.d.ts +5 -0
- package/build/template/components/TestComponent.d.ts.map +1 -0
- package/build/template/components/TestComponent.js +7 -0
- package/build/template/components/TestComponent.js.map +1 -0
- package/build/template/components/Texts/{MinorHeading.jsx → MinorHeading.js} +4 -3
- package/build/template/components/Texts/MinorHeading.js.map +1 -0
- package/build/template/components/Texts/texts.js +1 -1
- package/build/template/components/Texts/texts.js.map +1 -1
- package/build/template/components/ThemeToggle.js +9 -0
- package/build/template/components/ThemeToggle.js.map +1 -0
- package/build/template/components/{TypeAnnotation.jsx → TypeAnnotation.js} +8 -18
- package/build/template/components/TypeAnnotation.js.map +1 -0
- package/build/template/components/TypeFieldsLinkList.js +9 -0
- package/build/template/components/TypeFieldsLinkList.js.map +1 -0
- package/build/template/components/TypeIndex.js +17 -0
- package/build/template/components/TypeIndex.js.map +1 -0
- package/build/template/components/content/$$.d.ts +1 -0
- package/build/template/components/content/$$.d.ts.map +1 -1
- package/build/template/components/content/$$.js +1 -0
- package/build/template/components/content/$$.js.map +1 -1
- package/build/template/components/content/GraphQLDocumentWithSchema.d.ts +8 -0
- package/build/template/components/content/GraphQLDocumentWithSchema.d.ts.map +1 -0
- package/build/template/components/content/GraphQLDocumentWithSchema.js +16 -0
- package/build/template/components/content/GraphQLDocumentWithSchema.js.map +1 -0
- package/build/template/components/content/GraphQLDocumentWrapper.d.ts +7 -0
- package/build/template/components/content/GraphQLDocumentWrapper.d.ts.map +1 -0
- package/build/template/components/content/GraphQLDocumentWrapper.js +62 -0
- package/build/template/components/content/GraphQLDocumentWrapper.js.map +1 -0
- package/build/template/components/graphql/graphql.d.ts +2 -2
- package/build/template/components/graphql/graphql.js +3 -0
- package/build/template/components/graphql/graphql.js.map +1 -0
- package/build/template/components/graphql/index.d.ts +1 -1
- package/build/template/components/graphql/index.js +1 -1
- package/build/template/components/graphql/index.js.map +1 -1
- package/build/template/components/graphql/{type-kind-icon.jsx → type-kind-icon.js} +3 -2
- package/build/template/components/graphql/type-kind-icon.js.map +1 -0
- package/build/template/components/graphql/type-link.js +11 -0
- package/build/template/components/graphql/type-link.js.map +1 -0
- package/build/template/components/sidebar/Sidebar.d.ts +1 -1
- package/build/template/components/sidebar/Sidebar.d.ts.map +1 -1
- package/build/template/components/sidebar/Sidebar.js +11 -0
- package/build/template/components/sidebar/Sidebar.js.map +1 -0
- package/build/template/components/sidebar/{SidebarItem.jsx → SidebarItem.js} +15 -32
- package/build/template/components/sidebar/SidebarItem.js.map +1 -0
- package/build/template/components/sidebar/ToggleButton.d.ts +1 -1
- package/build/template/components/sidebar/ToggleButton.d.ts.map +1 -1
- package/build/template/components/sidebar/ToggleButton.js +5 -0
- package/build/template/components/sidebar/ToggleButton.js.map +1 -0
- package/build/template/contexts/{ThemeContext.jsx → ThemeContext.js} +3 -4
- package/build/template/contexts/{ThemeContext.jsx.map → ThemeContext.js.map} +1 -1
- package/build/template/entry.client.d.ts +1 -0
- package/build/template/entry.client.d.ts.map +1 -1
- package/build/template/{entry.client.jsx → entry.client.js} +5 -6
- package/build/template/entry.client.js.map +1 -0
- package/build/template/routes/changelog.d.ts +1 -1
- package/build/template/routes/{changelog.jsx → changelog.js} +5 -4
- package/build/template/routes/changelog.js.map +1 -0
- package/build/template/routes/{index.jsx → index.js} +3 -2
- package/build/template/routes/index.js.map +1 -0
- package/build/template/routes/reference.$type.$field.d.ts +1 -1
- package/build/template/routes/{reference.$type.$field.jsx → reference.$type.$field.js} +6 -5
- package/build/template/routes/reference.$type.$field.js.map +1 -0
- package/build/template/routes/reference.$type.d.ts +1 -1
- package/build/template/routes/{reference.$type.jsx → reference.$type.js} +6 -5
- package/build/template/routes/reference.$type.js.map +1 -0
- package/build/template/routes/reference.d.ts +2 -2
- package/build/template/routes/{reference.jsx → reference.js} +6 -7
- package/build/template/routes/reference.js.map +1 -0
- package/build/template/routes/root.d.ts +2 -2
- package/build/template/routes/root.d.ts.map +1 -1
- package/build/template/routes/{root.jsx → root.js} +46 -88
- package/build/template/routes/root.js.map +1 -0
- package/build/template/routes.js +5 -0
- package/build/template/routes.js.map +1 -0
- package/build/template/server/app.js +1 -1
- package/build/template/server/app.js.map +1 -1
- package/build/template/server/{render-page.jsx → render-page.js} +3 -4
- package/build/template/server/render-page.js.map +1 -0
- package/build/template/server/ssg/generate.js +1 -1
- package/build/template/server/ssg/generate.js.map +1 -1
- package/build/template/server/ssg/get-route-paths.js +1 -1
- package/build/template/server/ssg/get-route-paths.js.map +1 -1
- package/build/template/server/view.js +1 -1
- package/build/template/server/view.js.map +1 -1
- package/package.json +57 -8
- package/src/api/vite/plugins/core.ts +0 -3
- package/src/api/vite/plugins/pages.ts +1 -1
- package/src/exports/components.ts +4 -1
- package/src/lib/graphql-document/$$.ts +4 -0
- package/src/lib/graphql-document/$.test.ts +132 -0
- package/src/lib/graphql-document/$.ts +1 -0
- package/src/lib/graphql-document/README.md +102 -0
- package/src/lib/graphql-document/analysis.ts +415 -0
- package/src/lib/graphql-document/components/CopyButton.tsx +76 -0
- package/src/lib/graphql-document/components/GraphQLDocument.tsx +250 -0
- package/src/lib/graphql-document/components/GraphQLDocument.unit.test.ts +188 -0
- package/src/lib/graphql-document/components/GraphQLDocumentWithSchema.tsx +70 -0
- package/src/lib/graphql-document/components/GraphQLIdentifierPopover.tsx +197 -0
- package/src/lib/graphql-document/components/IdentifierLink.tsx +160 -0
- package/src/lib/graphql-document/components/graphql-document-styles.ts +167 -0
- package/src/lib/graphql-document/components/index.ts +5 -0
- package/src/lib/graphql-document/demo.md +155 -0
- package/src/lib/graphql-document/example.ts +163 -0
- package/src/lib/graphql-document/graphql-document.ts +37 -0
- package/src/lib/graphql-document/hooks/use-tooltip-state.test.ts +76 -0
- package/src/lib/graphql-document/hooks/use-tooltip-state.ts +191 -0
- package/src/lib/graphql-document/positioning-simple.test.ts +252 -0
- package/src/lib/graphql-document/positioning-simple.ts +271 -0
- package/src/lib/graphql-document/schema-context.tsx +20 -0
- package/src/lib/graphql-document/schema-integration-example.ts +341 -0
- package/src/lib/graphql-document/schema-integration.test.ts +365 -0
- package/src/lib/graphql-document/schema-integration.ts +497 -0
- package/src/lib/graphql-document/types.ts +129 -0
- package/src/template/components/ArgumentAnnotation.tsx +1 -1
- package/src/template/components/ArgumentList.tsx +1 -1
- package/src/template/components/ArgumentListAnnotation.tsx +2 -2
- package/src/template/components/CodeBlockEnhancer.tsx +21 -21
- package/src/template/components/DeprecationReason.tsx +1 -1
- package/src/template/components/Description.tsx +1 -1
- package/src/template/components/Field.tsx +4 -4
- package/src/template/components/FieldList.tsx +1 -1
- package/src/template/components/FieldListSection.tsx +1 -1
- package/src/template/components/Link.tsx +2 -2
- package/src/template/components/MDXComponents.tsx +101 -0
- package/src/template/components/NamedType.tsx +2 -2
- package/src/template/components/TestComponent.tsx +6 -0
- package/src/template/components/TypeAnnotation.tsx +1 -1
- package/src/template/components/TypeFieldsLinkList.tsx +1 -1
- package/src/template/components/TypeIndex.tsx +1 -1
- package/src/template/components/content/$$.ts +1 -0
- package/src/template/components/content/GraphQLDocumentWithSchema.tsx +18 -0
- package/src/template/components/content/GraphQLDocumentWrapper.tsx +82 -0
- package/src/template/components/graphql/graphql.tsx +2 -2
- package/src/template/components/graphql/index.ts +1 -1
- package/src/template/components/graphql/type-link.tsx +2 -2
- package/src/template/entry.client.tsx +2 -2
- package/src/template/routes/changelog.tsx +1 -1
- package/src/template/routes/reference.$type.$field.tsx +3 -3
- package/src/template/routes/reference.$type.tsx +3 -3
- package/src/template/routes/reference.tsx +3 -3
- package/src/template/routes/root.tsx +36 -25
- package/src/template/routes.tsx +1 -1
- package/src/template/server/app.ts +1 -1
- package/src/template/server/ssg/generate.ts +1 -1
- package/src/template/server/ssg/get-route-paths.ts +1 -1
- package/src/template/server/view.ts +1 -1
- package/src/template/styles/code-block.css +32 -0
- package/build/template/components/ArgumentAnnotation.jsx +0 -16
- package/build/template/components/ArgumentAnnotation.jsx.map +0 -1
- package/build/template/components/ArgumentList.jsx +0 -16
- package/build/template/components/ArgumentList.jsx.map +0 -1
- package/build/template/components/ArgumentListAnnotation.jsx +0 -23
- package/build/template/components/ArgumentListAnnotation.jsx.map +0 -1
- package/build/template/components/Changelog.jsx +0 -68
- package/build/template/components/Changelog.jsx.map +0 -1
- package/build/template/components/CodeBlockEnhancer.jsx.map +0 -1
- package/build/template/components/DeprecationReason.jsx +0 -10
- package/build/template/components/DeprecationReason.jsx.map +0 -1
- package/build/template/components/Description.jsx +0 -10
- package/build/template/components/Description.jsx.map +0 -1
- package/build/template/components/Field.jsx +0 -22
- package/build/template/components/Field.jsx.map +0 -1
- package/build/template/components/FieldList.jsx.map +0 -1
- package/build/template/components/FieldListSection.jsx.map +0 -1
- package/build/template/components/HamburgerMenu.jsx +0 -53
- package/build/template/components/HamburgerMenu.jsx.map +0 -1
- package/build/template/components/Link.jsx.map +0 -1
- package/build/template/components/Logo.jsx +0 -29
- package/build/template/components/Logo.jsx.map +0 -1
- package/build/template/components/Markdown.jsx.map +0 -1
- package/build/template/components/MissingSchema.jsx +0 -4
- package/build/template/components/MissingSchema.jsx.map +0 -1
- package/build/template/components/NamedType.jsx +0 -17
- package/build/template/components/NamedType.jsx.map +0 -1
- package/build/template/components/NotFound.jsx +0 -26
- package/build/template/components/NotFound.jsx.map +0 -1
- package/build/template/components/RadixLink.jsx.map +0 -1
- package/build/template/components/Texts/MinorHeading.jsx.map +0 -1
- package/build/template/components/ThemeToggle.jsx +0 -10
- package/build/template/components/ThemeToggle.jsx.map +0 -1
- package/build/template/components/TypeAnnotation.jsx.map +0 -1
- package/build/template/components/TypeFieldsLinkList.jsx +0 -17
- package/build/template/components/TypeFieldsLinkList.jsx.map +0 -1
- package/build/template/components/TypeIndex.jsx +0 -27
- package/build/template/components/TypeIndex.jsx.map +0 -1
- package/build/template/components/graphql/graphql.jsx +0 -3
- package/build/template/components/graphql/graphql.jsx.map +0 -1
- package/build/template/components/graphql/type-kind-icon.jsx.map +0 -1
- package/build/template/components/graphql/type-link.jsx +0 -16
- package/build/template/components/graphql/type-link.jsx.map +0 -1
- package/build/template/components/sidebar/Sidebar.jsx +0 -15
- package/build/template/components/sidebar/Sidebar.jsx.map +0 -1
- package/build/template/components/sidebar/SidebarItem.jsx.map +0 -1
- package/build/template/components/sidebar/ToggleButton.jsx +0 -6
- package/build/template/components/sidebar/ToggleButton.jsx.map +0 -1
- package/build/template/entry.client.jsx.map +0 -1
- package/build/template/routes/changelog.jsx.map +0 -1
- package/build/template/routes/index.jsx.map +0 -1
- package/build/template/routes/reference.$type.$field.jsx.map +0 -1
- package/build/template/routes/reference.$type.jsx.map +0 -1
- package/build/template/routes/reference.jsx.map +0 -1
- package/build/template/routes/root.jsx.map +0 -1
- package/build/template/routes.jsx +0 -5
- package/build/template/routes.jsx.map +0 -1
- package/build/template/server/render-page.jsx.map +0 -1
@@ -0,0 +1,415 @@
|
|
1
|
+
import {
|
2
|
+
type ArgumentNode,
|
3
|
+
type ASTNode,
|
4
|
+
type DirectiveNode,
|
5
|
+
type DocumentNode,
|
6
|
+
type FieldNode,
|
7
|
+
type FragmentDefinitionNode,
|
8
|
+
type GraphQLError,
|
9
|
+
type GraphQLSchema,
|
10
|
+
type OperationDefinitionNode,
|
11
|
+
parse,
|
12
|
+
validate,
|
13
|
+
type VariableDefinitionNode,
|
14
|
+
visit,
|
15
|
+
} from 'graphql'
|
16
|
+
import type {
|
17
|
+
AnalysisConfig,
|
18
|
+
AnalysisError,
|
19
|
+
AnalysisResult,
|
20
|
+
GraphQLAnalyzer,
|
21
|
+
Identifier,
|
22
|
+
IdentifierContext,
|
23
|
+
IdentifierMap,
|
24
|
+
} from './types.ts'
|
25
|
+
|
26
|
+
/**
|
27
|
+
* Default GraphQL document analyzer implementation
|
28
|
+
*/
|
29
|
+
export class DefaultGraphQLAnalyzer implements GraphQLAnalyzer {
|
30
|
+
/**
|
31
|
+
* Parse a GraphQL document string into an AST
|
32
|
+
*/
|
33
|
+
parse(source: string): DocumentNode {
|
34
|
+
try {
|
35
|
+
return parse(source, {
|
36
|
+
noLocation: false, // We need location info for positioning
|
37
|
+
})
|
38
|
+
} catch (error) {
|
39
|
+
throw new Error(`Failed to parse GraphQL document: ${error instanceof Error ? error.message : 'Unknown error'}`)
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Validate a GraphQL document against a schema
|
45
|
+
*/
|
46
|
+
validateAgainstSchema(ast: DocumentNode, schema: GraphQLSchema): GraphQLError[] {
|
47
|
+
return [...validate(schema, ast)]
|
48
|
+
}
|
49
|
+
|
50
|
+
/**
|
51
|
+
* Extract all identifiers from a GraphQL AST
|
52
|
+
*/
|
53
|
+
extractIdentifiers(ast: DocumentNode, config: AnalysisConfig = {}): IdentifierMap {
|
54
|
+
const identifiers: Identifier[] = []
|
55
|
+
const errors: AnalysisError[] = []
|
56
|
+
const schema = config.schema
|
57
|
+
|
58
|
+
// Context tracking during traversal
|
59
|
+
let currentOperationType: 'query' | 'mutation' | 'subscription' | undefined
|
60
|
+
let currentOperationName: string | undefined
|
61
|
+
let currentFragment: string | undefined
|
62
|
+
let selectionPath: string[] = []
|
63
|
+
let parentTypes: string[] = []
|
64
|
+
|
65
|
+
// Helper function to create context
|
66
|
+
const createContext = (): IdentifierContext => {
|
67
|
+
return {
|
68
|
+
operationType: currentOperationType,
|
69
|
+
operationName: currentOperationName,
|
70
|
+
inFragment: currentFragment,
|
71
|
+
selectionPath: [...selectionPath],
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
visit(ast, {
|
76
|
+
OperationDefinition: {
|
77
|
+
enter: (node: OperationDefinitionNode) => {
|
78
|
+
currentOperationType = node.operation
|
79
|
+
currentOperationName = node.name?.value
|
80
|
+
selectionPath = []
|
81
|
+
|
82
|
+
// Set the root type based on operation type
|
83
|
+
if (schema) {
|
84
|
+
if (node.operation === 'query' && schema.getQueryType()) {
|
85
|
+
parentTypes = [schema.getQueryType()!.name]
|
86
|
+
} else if (node.operation === 'mutation' && schema.getMutationType()) {
|
87
|
+
parentTypes = [schema.getMutationType()!.name]
|
88
|
+
} else if (node.operation === 'subscription' && schema.getSubscriptionType()) {
|
89
|
+
parentTypes = [schema.getSubscriptionType()!.name]
|
90
|
+
} else {
|
91
|
+
parentTypes = []
|
92
|
+
}
|
93
|
+
} else {
|
94
|
+
// Fallback to default root type names
|
95
|
+
if (node.operation === 'query') {
|
96
|
+
parentTypes = ['Query']
|
97
|
+
} else if (node.operation === 'mutation') {
|
98
|
+
parentTypes = ['Mutation']
|
99
|
+
} else if (node.operation === 'subscription') {
|
100
|
+
parentTypes = ['Subscription']
|
101
|
+
} else {
|
102
|
+
parentTypes = []
|
103
|
+
}
|
104
|
+
}
|
105
|
+
},
|
106
|
+
leave: () => {
|
107
|
+
currentOperationType = undefined
|
108
|
+
currentOperationName = undefined
|
109
|
+
parentTypes = []
|
110
|
+
},
|
111
|
+
},
|
112
|
+
|
113
|
+
FragmentDefinition: {
|
114
|
+
enter: (node: FragmentDefinitionNode) => {
|
115
|
+
currentFragment = node.name.value
|
116
|
+
selectionPath = []
|
117
|
+
parentTypes = [node.typeCondition.name.value]
|
118
|
+
|
119
|
+
// Add fragment name as identifier
|
120
|
+
this.addIdentifier(identifiers, {
|
121
|
+
name: node.name.value,
|
122
|
+
kind: 'Fragment',
|
123
|
+
position: this.getPosition(node.name),
|
124
|
+
schemaPath: [node.name.value],
|
125
|
+
context: createContext(),
|
126
|
+
})
|
127
|
+
|
128
|
+
// Add type condition as identifier
|
129
|
+
this.addIdentifier(identifiers, {
|
130
|
+
name: node.typeCondition.name.value,
|
131
|
+
kind: 'Type',
|
132
|
+
position: this.getPosition(node.typeCondition.name),
|
133
|
+
schemaPath: [node.typeCondition.name.value],
|
134
|
+
context: createContext(),
|
135
|
+
})
|
136
|
+
},
|
137
|
+
leave: () => {
|
138
|
+
currentFragment = undefined
|
139
|
+
parentTypes = []
|
140
|
+
},
|
141
|
+
},
|
142
|
+
|
143
|
+
Field: {
|
144
|
+
enter: (node: FieldNode) => {
|
145
|
+
const fieldName = node.name.value
|
146
|
+
const parentType = parentTypes[parentTypes.length - 1]
|
147
|
+
|
148
|
+
selectionPath.push(fieldName)
|
149
|
+
|
150
|
+
this.addIdentifier(identifiers, {
|
151
|
+
name: fieldName,
|
152
|
+
kind: 'Field',
|
153
|
+
position: this.getPosition(node.name),
|
154
|
+
parentType,
|
155
|
+
schemaPath: parentType ? [parentType, fieldName] : [fieldName],
|
156
|
+
context: createContext(),
|
157
|
+
})
|
158
|
+
|
159
|
+
// Track parent type for nested selections
|
160
|
+
// Resolve the field's return type from schema if available
|
161
|
+
let pushedType = false
|
162
|
+
if (schema && parentType) {
|
163
|
+
const type = schema.getType(parentType)
|
164
|
+
if (type && ('getFields' in type)) {
|
165
|
+
const fields = (type as any).getFields()
|
166
|
+
const field = fields[fieldName]
|
167
|
+
if (field) {
|
168
|
+
// Get the base type name (unwrap NonNull and List wrappers)
|
169
|
+
let fieldType = field.type
|
170
|
+
while (fieldType.ofType) {
|
171
|
+
fieldType = fieldType.ofType
|
172
|
+
}
|
173
|
+
if (fieldType.name) {
|
174
|
+
parentTypes.push(fieldType.name)
|
175
|
+
pushedType = true
|
176
|
+
}
|
177
|
+
}
|
178
|
+
}
|
179
|
+
} else if (this.isObjectField(fieldName)) {
|
180
|
+
// Fallback to inference if no schema
|
181
|
+
const inferredType = this.inferReturnType(parentType, fieldName)
|
182
|
+
parentTypes.push(inferredType)
|
183
|
+
pushedType = true
|
184
|
+
} // Store whether we pushed a type for this field
|
185
|
+
|
186
|
+
;(node as any)._pushedType = pushedType
|
187
|
+
},
|
188
|
+
leave: (node: FieldNode) => {
|
189
|
+
selectionPath.pop()
|
190
|
+
|
191
|
+
// Remove parent type if we added one in enter
|
192
|
+
if ((node as any)._pushedType) {
|
193
|
+
parentTypes.pop()
|
194
|
+
}
|
195
|
+
},
|
196
|
+
},
|
197
|
+
|
198
|
+
Argument: {
|
199
|
+
enter: (node: ArgumentNode) => {
|
200
|
+
const argName = node.name.value
|
201
|
+
const parentType = parentTypes[parentTypes.length - 1]
|
202
|
+
const fieldName = selectionPath[selectionPath.length - 1]
|
203
|
+
|
204
|
+
this.addIdentifier(identifiers, {
|
205
|
+
name: argName,
|
206
|
+
kind: 'Argument',
|
207
|
+
position: this.getPosition(node.name),
|
208
|
+
parentType,
|
209
|
+
schemaPath: parentType && fieldName
|
210
|
+
? [parentType, fieldName, argName]
|
211
|
+
: [argName],
|
212
|
+
context: createContext(),
|
213
|
+
})
|
214
|
+
},
|
215
|
+
},
|
216
|
+
|
217
|
+
VariableDefinition: {
|
218
|
+
enter: (node: VariableDefinitionNode) => {
|
219
|
+
this.addIdentifier(identifiers, {
|
220
|
+
name: node.variable.name.value,
|
221
|
+
kind: 'Variable',
|
222
|
+
position: this.getPosition(node.variable.name),
|
223
|
+
schemaPath: [node.variable.name.value],
|
224
|
+
context: createContext(),
|
225
|
+
})
|
226
|
+
|
227
|
+
// Also add the type reference
|
228
|
+
const typeName = this.extractTypeName(node.type)
|
229
|
+
if (typeName) {
|
230
|
+
this.addIdentifier(identifiers, {
|
231
|
+
name: typeName,
|
232
|
+
kind: 'Type',
|
233
|
+
position: this.getTypePosition(node.type),
|
234
|
+
schemaPath: [typeName],
|
235
|
+
context: createContext(),
|
236
|
+
})
|
237
|
+
}
|
238
|
+
},
|
239
|
+
},
|
240
|
+
|
241
|
+
Directive: {
|
242
|
+
enter: (node: DirectiveNode) => {
|
243
|
+
this.addIdentifier(identifiers, {
|
244
|
+
name: node.name.value,
|
245
|
+
kind: 'Directive',
|
246
|
+
position: this.getPosition(node.name),
|
247
|
+
schemaPath: [node.name.value],
|
248
|
+
context: createContext(),
|
249
|
+
})
|
250
|
+
},
|
251
|
+
},
|
252
|
+
})
|
253
|
+
|
254
|
+
return this.createIdentifierMap(identifiers, errors)
|
255
|
+
}
|
256
|
+
|
257
|
+
/**
|
258
|
+
* Perform complete analysis of a GraphQL document
|
259
|
+
*/
|
260
|
+
analyze(source: string, config: AnalysisConfig = {}): AnalysisResult {
|
261
|
+
try {
|
262
|
+
const ast = this.parse(source)
|
263
|
+
const identifiers = this.extractIdentifiers(ast, config)
|
264
|
+
|
265
|
+
let validationErrors: GraphQLError[] = []
|
266
|
+
if (config.validateAgainstSchema && config.schema) {
|
267
|
+
validationErrors = this.validateAgainstSchema(ast, config.schema)
|
268
|
+
}
|
269
|
+
|
270
|
+
return {
|
271
|
+
ast,
|
272
|
+
identifiers,
|
273
|
+
isValid: validationErrors.length === 0,
|
274
|
+
errors: validationErrors,
|
275
|
+
}
|
276
|
+
} catch (error) {
|
277
|
+
return {
|
278
|
+
ast: { kind: 'Document', definitions: [] } as DocumentNode,
|
279
|
+
identifiers: this.createIdentifierMap([], [{
|
280
|
+
message: error instanceof Error ? error.message : 'Unknown parsing error',
|
281
|
+
severity: 'error',
|
282
|
+
}]),
|
283
|
+
isValid: false,
|
284
|
+
errors: [],
|
285
|
+
}
|
286
|
+
}
|
287
|
+
}
|
288
|
+
|
289
|
+
// Private helper methods
|
290
|
+
|
291
|
+
private addIdentifier(identifiers: Identifier[], identifier: Identifier): void {
|
292
|
+
identifiers.push(identifier)
|
293
|
+
}
|
294
|
+
|
295
|
+
private getPosition(node: ASTNode): Identifier['position'] {
|
296
|
+
const loc = node.loc
|
297
|
+
if (!loc) {
|
298
|
+
return { start: 0, end: 0, line: 1, column: 1 }
|
299
|
+
}
|
300
|
+
|
301
|
+
return {
|
302
|
+
start: loc.start,
|
303
|
+
end: loc.end,
|
304
|
+
line: loc.startToken.line,
|
305
|
+
column: loc.startToken.column,
|
306
|
+
}
|
307
|
+
}
|
308
|
+
|
309
|
+
private getTypePosition(node: ASTNode): Identifier['position'] {
|
310
|
+
// For type nodes, we need to extract the base type name position
|
311
|
+
// This is a simplified implementation
|
312
|
+
return this.getPosition(node)
|
313
|
+
}
|
314
|
+
|
315
|
+
private extractTypeName(typeNode: any): string | null {
|
316
|
+
// Recursively extract the base type name from wrapped types (NonNull, List)
|
317
|
+
if (typeNode.kind === 'NamedType') {
|
318
|
+
return typeNode.name.value
|
319
|
+
}
|
320
|
+
if (typeNode.kind === 'NonNullType' || typeNode.kind === 'ListType') {
|
321
|
+
return this.extractTypeName(typeNode.type)
|
322
|
+
}
|
323
|
+
return null
|
324
|
+
}
|
325
|
+
|
326
|
+
private isObjectField(fieldName: string): boolean {
|
327
|
+
// This is only used as a fallback when no schema is available
|
328
|
+
// Common patterns for object-returning fields
|
329
|
+
const objectFieldPatterns = [
|
330
|
+
'user',
|
331
|
+
'users',
|
332
|
+
'post',
|
333
|
+
'posts',
|
334
|
+
'comment',
|
335
|
+
'comments',
|
336
|
+
'profile',
|
337
|
+
'settings',
|
338
|
+
'organization',
|
339
|
+
'project',
|
340
|
+
'target',
|
341
|
+
'member',
|
342
|
+
'members',
|
343
|
+
'node',
|
344
|
+
'nodes',
|
345
|
+
'edge',
|
346
|
+
'edges',
|
347
|
+
]
|
348
|
+
return objectFieldPatterns.some(pattern => fieldName.toLowerCase().includes(pattern))
|
349
|
+
}
|
350
|
+
|
351
|
+
private inferReturnType(parentType: string | undefined, fieldName: string): string {
|
352
|
+
// Simplified type inference - in real implementation would use schema
|
353
|
+
if (fieldName === 'user') return 'User'
|
354
|
+
if (fieldName === 'posts') return 'Post'
|
355
|
+
if (fieldName === 'comments') return 'Comment'
|
356
|
+
return fieldName.charAt(0).toUpperCase() + fieldName.slice(1)
|
357
|
+
}
|
358
|
+
|
359
|
+
private createContext(
|
360
|
+
operationType?: 'query' | 'mutation' | 'subscription',
|
361
|
+
operationName?: string,
|
362
|
+
inFragment?: string,
|
363
|
+
selectionPath: string[] = [],
|
364
|
+
): IdentifierContext {
|
365
|
+
return {
|
366
|
+
operationType,
|
367
|
+
operationName,
|
368
|
+
inFragment,
|
369
|
+
selectionPath: [...selectionPath],
|
370
|
+
}
|
371
|
+
}
|
372
|
+
|
373
|
+
private createIdentifierMap(identifiers: Identifier[], errors: AnalysisError[]): IdentifierMap {
|
374
|
+
const byPosition = new Map<number, Identifier>()
|
375
|
+
const byKind = new Map<Identifier['kind'], Identifier[]>()
|
376
|
+
|
377
|
+
for (const identifier of identifiers) {
|
378
|
+
// Index by position
|
379
|
+
byPosition.set(identifier.position.start, identifier)
|
380
|
+
|
381
|
+
// Group by kind
|
382
|
+
if (!byKind.has(identifier.kind)) {
|
383
|
+
byKind.set(identifier.kind, [])
|
384
|
+
}
|
385
|
+
byKind.get(identifier.kind)!.push(identifier)
|
386
|
+
}
|
387
|
+
|
388
|
+
return {
|
389
|
+
byPosition,
|
390
|
+
byKind,
|
391
|
+
errors,
|
392
|
+
all: identifiers,
|
393
|
+
}
|
394
|
+
}
|
395
|
+
}
|
396
|
+
|
397
|
+
/**
|
398
|
+
* Default analyzer instance
|
399
|
+
*/
|
400
|
+
export const analyzer = new DefaultGraphQLAnalyzer()
|
401
|
+
|
402
|
+
/**
|
403
|
+
* Convenience function to analyze a GraphQL document
|
404
|
+
*/
|
405
|
+
export const analyze = (source: string, config?: AnalysisConfig): AnalysisResult => {
|
406
|
+
return analyzer.analyze(source, config)
|
407
|
+
}
|
408
|
+
|
409
|
+
/**
|
410
|
+
* Convenience function to extract identifiers from a GraphQL document
|
411
|
+
*/
|
412
|
+
export const extractIdentifiers = (source: string, config?: AnalysisConfig): IdentifierMap => {
|
413
|
+
const ast = analyzer.parse(source)
|
414
|
+
return analyzer.extractIdentifiers(ast, config)
|
415
|
+
}
|
@@ -0,0 +1,76 @@
|
|
1
|
+
/**
|
2
|
+
* Copy button component for GraphQL documents
|
3
|
+
*/
|
4
|
+
|
5
|
+
import type { React } from '#dep/react/index'
|
6
|
+
import { React as ReactHooks } from '#dep/react/index'
|
7
|
+
import { CheckIcon, CopyIcon } from '@radix-ui/react-icons'
|
8
|
+
import { Button } from '@radix-ui/themes'
|
9
|
+
|
10
|
+
export interface CopyButtonProps {
|
11
|
+
/** The text to copy */
|
12
|
+
text: string
|
13
|
+
/** Optional className */
|
14
|
+
className?: string
|
15
|
+
/** Size variant */
|
16
|
+
size?: '1' | '2' | '3'
|
17
|
+
}
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Copy button for GraphQL code blocks
|
21
|
+
*
|
22
|
+
* Shows a copy icon that changes to a checkmark when clicked
|
23
|
+
*/
|
24
|
+
export const CopyButton: React.FC<CopyButtonProps> = ({
|
25
|
+
text,
|
26
|
+
className = '',
|
27
|
+
size = '1',
|
28
|
+
}) => {
|
29
|
+
const [copied, setCopied] = ReactHooks.useState(false)
|
30
|
+
const timeoutRef = ReactHooks.useRef<NodeJS.Timeout | null>(null)
|
31
|
+
|
32
|
+
const handleCopy = ReactHooks.useCallback(async (e: React.MouseEvent) => {
|
33
|
+
e.preventDefault()
|
34
|
+
e.stopPropagation()
|
35
|
+
|
36
|
+
try {
|
37
|
+
await navigator.clipboard.writeText(text)
|
38
|
+
setCopied(true)
|
39
|
+
|
40
|
+
// Clear any existing timeout
|
41
|
+
if (timeoutRef.current) {
|
42
|
+
clearTimeout(timeoutRef.current)
|
43
|
+
}
|
44
|
+
|
45
|
+
// Reset after 2 seconds
|
46
|
+
timeoutRef.current = setTimeout(() => {
|
47
|
+
setCopied(false)
|
48
|
+
timeoutRef.current = null
|
49
|
+
}, 2000)
|
50
|
+
} catch (err) {
|
51
|
+
console.error('Failed to copy text:', err)
|
52
|
+
}
|
53
|
+
}, [text])
|
54
|
+
|
55
|
+
// Cleanup timeout on unmount
|
56
|
+
ReactHooks.useEffect(() => {
|
57
|
+
return () => {
|
58
|
+
if (timeoutRef.current) {
|
59
|
+
clearTimeout(timeoutRef.current)
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}, [])
|
63
|
+
|
64
|
+
return (
|
65
|
+
<Button
|
66
|
+
size={size}
|
67
|
+
variant='ghost'
|
68
|
+
className={`graphql-copy-button ${className}`}
|
69
|
+
onClick={handleCopy}
|
70
|
+
aria-label={copied ? 'Copied!' : 'Copy code'}
|
71
|
+
data-copied={copied}
|
72
|
+
>
|
73
|
+
{copied ? <CheckIcon width='16' height='16' /> : <CopyIcon width='16' height='16' />}
|
74
|
+
</Button>
|
75
|
+
)
|
76
|
+
}
|