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,361 @@
|
|
1
|
+
import { parse, validate, visit, } from 'graphql';
|
2
|
+
/**
|
3
|
+
* Default GraphQL document analyzer implementation
|
4
|
+
*/
|
5
|
+
export class DefaultGraphQLAnalyzer {
|
6
|
+
/**
|
7
|
+
* Parse a GraphQL document string into an AST
|
8
|
+
*/
|
9
|
+
parse(source) {
|
10
|
+
try {
|
11
|
+
return parse(source, {
|
12
|
+
noLocation: false, // We need location info for positioning
|
13
|
+
});
|
14
|
+
}
|
15
|
+
catch (error) {
|
16
|
+
throw new Error(`Failed to parse GraphQL document: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
17
|
+
}
|
18
|
+
}
|
19
|
+
/**
|
20
|
+
* Validate a GraphQL document against a schema
|
21
|
+
*/
|
22
|
+
validateAgainstSchema(ast, schema) {
|
23
|
+
return [...validate(schema, ast)];
|
24
|
+
}
|
25
|
+
/**
|
26
|
+
* Extract all identifiers from a GraphQL AST
|
27
|
+
*/
|
28
|
+
extractIdentifiers(ast, config = {}) {
|
29
|
+
const identifiers = [];
|
30
|
+
const errors = [];
|
31
|
+
const schema = config.schema;
|
32
|
+
// Context tracking during traversal
|
33
|
+
let currentOperationType;
|
34
|
+
let currentOperationName;
|
35
|
+
let currentFragment;
|
36
|
+
let selectionPath = [];
|
37
|
+
let parentTypes = [];
|
38
|
+
// Helper function to create context
|
39
|
+
const createContext = () => {
|
40
|
+
return {
|
41
|
+
operationType: currentOperationType,
|
42
|
+
operationName: currentOperationName,
|
43
|
+
inFragment: currentFragment,
|
44
|
+
selectionPath: [...selectionPath],
|
45
|
+
};
|
46
|
+
};
|
47
|
+
visit(ast, {
|
48
|
+
OperationDefinition: {
|
49
|
+
enter: (node) => {
|
50
|
+
currentOperationType = node.operation;
|
51
|
+
currentOperationName = node.name?.value;
|
52
|
+
selectionPath = [];
|
53
|
+
// Set the root type based on operation type
|
54
|
+
if (schema) {
|
55
|
+
if (node.operation === 'query' && schema.getQueryType()) {
|
56
|
+
parentTypes = [schema.getQueryType().name];
|
57
|
+
}
|
58
|
+
else if (node.operation === 'mutation' && schema.getMutationType()) {
|
59
|
+
parentTypes = [schema.getMutationType().name];
|
60
|
+
}
|
61
|
+
else if (node.operation === 'subscription' && schema.getSubscriptionType()) {
|
62
|
+
parentTypes = [schema.getSubscriptionType().name];
|
63
|
+
}
|
64
|
+
else {
|
65
|
+
parentTypes = [];
|
66
|
+
}
|
67
|
+
}
|
68
|
+
else {
|
69
|
+
// Fallback to default root type names
|
70
|
+
if (node.operation === 'query') {
|
71
|
+
parentTypes = ['Query'];
|
72
|
+
}
|
73
|
+
else if (node.operation === 'mutation') {
|
74
|
+
parentTypes = ['Mutation'];
|
75
|
+
}
|
76
|
+
else if (node.operation === 'subscription') {
|
77
|
+
parentTypes = ['Subscription'];
|
78
|
+
}
|
79
|
+
else {
|
80
|
+
parentTypes = [];
|
81
|
+
}
|
82
|
+
}
|
83
|
+
},
|
84
|
+
leave: () => {
|
85
|
+
currentOperationType = undefined;
|
86
|
+
currentOperationName = undefined;
|
87
|
+
parentTypes = [];
|
88
|
+
},
|
89
|
+
},
|
90
|
+
FragmentDefinition: {
|
91
|
+
enter: (node) => {
|
92
|
+
currentFragment = node.name.value;
|
93
|
+
selectionPath = [];
|
94
|
+
parentTypes = [node.typeCondition.name.value];
|
95
|
+
// Add fragment name as identifier
|
96
|
+
this.addIdentifier(identifiers, {
|
97
|
+
name: node.name.value,
|
98
|
+
kind: 'Fragment',
|
99
|
+
position: this.getPosition(node.name),
|
100
|
+
schemaPath: [node.name.value],
|
101
|
+
context: createContext(),
|
102
|
+
});
|
103
|
+
// Add type condition as identifier
|
104
|
+
this.addIdentifier(identifiers, {
|
105
|
+
name: node.typeCondition.name.value,
|
106
|
+
kind: 'Type',
|
107
|
+
position: this.getPosition(node.typeCondition.name),
|
108
|
+
schemaPath: [node.typeCondition.name.value],
|
109
|
+
context: createContext(),
|
110
|
+
});
|
111
|
+
},
|
112
|
+
leave: () => {
|
113
|
+
currentFragment = undefined;
|
114
|
+
parentTypes = [];
|
115
|
+
},
|
116
|
+
},
|
117
|
+
Field: {
|
118
|
+
enter: (node) => {
|
119
|
+
const fieldName = node.name.value;
|
120
|
+
const parentType = parentTypes[parentTypes.length - 1];
|
121
|
+
selectionPath.push(fieldName);
|
122
|
+
this.addIdentifier(identifiers, {
|
123
|
+
name: fieldName,
|
124
|
+
kind: 'Field',
|
125
|
+
position: this.getPosition(node.name),
|
126
|
+
parentType,
|
127
|
+
schemaPath: parentType ? [parentType, fieldName] : [fieldName],
|
128
|
+
context: createContext(),
|
129
|
+
});
|
130
|
+
// Track parent type for nested selections
|
131
|
+
// Resolve the field's return type from schema if available
|
132
|
+
let pushedType = false;
|
133
|
+
if (schema && parentType) {
|
134
|
+
const type = schema.getType(parentType);
|
135
|
+
if (type && ('getFields' in type)) {
|
136
|
+
const fields = type.getFields();
|
137
|
+
const field = fields[fieldName];
|
138
|
+
if (field) {
|
139
|
+
// Get the base type name (unwrap NonNull and List wrappers)
|
140
|
+
let fieldType = field.type;
|
141
|
+
while (fieldType.ofType) {
|
142
|
+
fieldType = fieldType.ofType;
|
143
|
+
}
|
144
|
+
if (fieldType.name) {
|
145
|
+
parentTypes.push(fieldType.name);
|
146
|
+
pushedType = true;
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
}
|
151
|
+
else if (this.isObjectField(fieldName)) {
|
152
|
+
// Fallback to inference if no schema
|
153
|
+
const inferredType = this.inferReturnType(parentType, fieldName);
|
154
|
+
parentTypes.push(inferredType);
|
155
|
+
pushedType = true;
|
156
|
+
} // Store whether we pushed a type for this field
|
157
|
+
;
|
158
|
+
node._pushedType = pushedType;
|
159
|
+
},
|
160
|
+
leave: (node) => {
|
161
|
+
selectionPath.pop();
|
162
|
+
// Remove parent type if we added one in enter
|
163
|
+
if (node._pushedType) {
|
164
|
+
parentTypes.pop();
|
165
|
+
}
|
166
|
+
},
|
167
|
+
},
|
168
|
+
Argument: {
|
169
|
+
enter: (node) => {
|
170
|
+
const argName = node.name.value;
|
171
|
+
const parentType = parentTypes[parentTypes.length - 1];
|
172
|
+
const fieldName = selectionPath[selectionPath.length - 1];
|
173
|
+
this.addIdentifier(identifiers, {
|
174
|
+
name: argName,
|
175
|
+
kind: 'Argument',
|
176
|
+
position: this.getPosition(node.name),
|
177
|
+
parentType,
|
178
|
+
schemaPath: parentType && fieldName
|
179
|
+
? [parentType, fieldName, argName]
|
180
|
+
: [argName],
|
181
|
+
context: createContext(),
|
182
|
+
});
|
183
|
+
},
|
184
|
+
},
|
185
|
+
VariableDefinition: {
|
186
|
+
enter: (node) => {
|
187
|
+
this.addIdentifier(identifiers, {
|
188
|
+
name: node.variable.name.value,
|
189
|
+
kind: 'Variable',
|
190
|
+
position: this.getPosition(node.variable.name),
|
191
|
+
schemaPath: [node.variable.name.value],
|
192
|
+
context: createContext(),
|
193
|
+
});
|
194
|
+
// Also add the type reference
|
195
|
+
const typeName = this.extractTypeName(node.type);
|
196
|
+
if (typeName) {
|
197
|
+
this.addIdentifier(identifiers, {
|
198
|
+
name: typeName,
|
199
|
+
kind: 'Type',
|
200
|
+
position: this.getTypePosition(node.type),
|
201
|
+
schemaPath: [typeName],
|
202
|
+
context: createContext(),
|
203
|
+
});
|
204
|
+
}
|
205
|
+
},
|
206
|
+
},
|
207
|
+
Directive: {
|
208
|
+
enter: (node) => {
|
209
|
+
this.addIdentifier(identifiers, {
|
210
|
+
name: node.name.value,
|
211
|
+
kind: 'Directive',
|
212
|
+
position: this.getPosition(node.name),
|
213
|
+
schemaPath: [node.name.value],
|
214
|
+
context: createContext(),
|
215
|
+
});
|
216
|
+
},
|
217
|
+
},
|
218
|
+
});
|
219
|
+
return this.createIdentifierMap(identifiers, errors);
|
220
|
+
}
|
221
|
+
/**
|
222
|
+
* Perform complete analysis of a GraphQL document
|
223
|
+
*/
|
224
|
+
analyze(source, config = {}) {
|
225
|
+
try {
|
226
|
+
const ast = this.parse(source);
|
227
|
+
const identifiers = this.extractIdentifiers(ast, config);
|
228
|
+
let validationErrors = [];
|
229
|
+
if (config.validateAgainstSchema && config.schema) {
|
230
|
+
validationErrors = this.validateAgainstSchema(ast, config.schema);
|
231
|
+
}
|
232
|
+
return {
|
233
|
+
ast,
|
234
|
+
identifiers,
|
235
|
+
isValid: validationErrors.length === 0,
|
236
|
+
errors: validationErrors,
|
237
|
+
};
|
238
|
+
}
|
239
|
+
catch (error) {
|
240
|
+
return {
|
241
|
+
ast: { kind: 'Document', definitions: [] },
|
242
|
+
identifiers: this.createIdentifierMap([], [{
|
243
|
+
message: error instanceof Error ? error.message : 'Unknown parsing error',
|
244
|
+
severity: 'error',
|
245
|
+
}]),
|
246
|
+
isValid: false,
|
247
|
+
errors: [],
|
248
|
+
};
|
249
|
+
}
|
250
|
+
}
|
251
|
+
// Private helper methods
|
252
|
+
addIdentifier(identifiers, identifier) {
|
253
|
+
identifiers.push(identifier);
|
254
|
+
}
|
255
|
+
getPosition(node) {
|
256
|
+
const loc = node.loc;
|
257
|
+
if (!loc) {
|
258
|
+
return { start: 0, end: 0, line: 1, column: 1 };
|
259
|
+
}
|
260
|
+
return {
|
261
|
+
start: loc.start,
|
262
|
+
end: loc.end,
|
263
|
+
line: loc.startToken.line,
|
264
|
+
column: loc.startToken.column,
|
265
|
+
};
|
266
|
+
}
|
267
|
+
getTypePosition(node) {
|
268
|
+
// For type nodes, we need to extract the base type name position
|
269
|
+
// This is a simplified implementation
|
270
|
+
return this.getPosition(node);
|
271
|
+
}
|
272
|
+
extractTypeName(typeNode) {
|
273
|
+
// Recursively extract the base type name from wrapped types (NonNull, List)
|
274
|
+
if (typeNode.kind === 'NamedType') {
|
275
|
+
return typeNode.name.value;
|
276
|
+
}
|
277
|
+
if (typeNode.kind === 'NonNullType' || typeNode.kind === 'ListType') {
|
278
|
+
return this.extractTypeName(typeNode.type);
|
279
|
+
}
|
280
|
+
return null;
|
281
|
+
}
|
282
|
+
isObjectField(fieldName) {
|
283
|
+
// This is only used as a fallback when no schema is available
|
284
|
+
// Common patterns for object-returning fields
|
285
|
+
const objectFieldPatterns = [
|
286
|
+
'user',
|
287
|
+
'users',
|
288
|
+
'post',
|
289
|
+
'posts',
|
290
|
+
'comment',
|
291
|
+
'comments',
|
292
|
+
'profile',
|
293
|
+
'settings',
|
294
|
+
'organization',
|
295
|
+
'project',
|
296
|
+
'target',
|
297
|
+
'member',
|
298
|
+
'members',
|
299
|
+
'node',
|
300
|
+
'nodes',
|
301
|
+
'edge',
|
302
|
+
'edges',
|
303
|
+
];
|
304
|
+
return objectFieldPatterns.some(pattern => fieldName.toLowerCase().includes(pattern));
|
305
|
+
}
|
306
|
+
inferReturnType(parentType, fieldName) {
|
307
|
+
// Simplified type inference - in real implementation would use schema
|
308
|
+
if (fieldName === 'user')
|
309
|
+
return 'User';
|
310
|
+
if (fieldName === 'posts')
|
311
|
+
return 'Post';
|
312
|
+
if (fieldName === 'comments')
|
313
|
+
return 'Comment';
|
314
|
+
return fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
|
315
|
+
}
|
316
|
+
createContext(operationType, operationName, inFragment, selectionPath = []) {
|
317
|
+
return {
|
318
|
+
operationType,
|
319
|
+
operationName,
|
320
|
+
inFragment,
|
321
|
+
selectionPath: [...selectionPath],
|
322
|
+
};
|
323
|
+
}
|
324
|
+
createIdentifierMap(identifiers, errors) {
|
325
|
+
const byPosition = new Map();
|
326
|
+
const byKind = new Map();
|
327
|
+
for (const identifier of identifiers) {
|
328
|
+
// Index by position
|
329
|
+
byPosition.set(identifier.position.start, identifier);
|
330
|
+
// Group by kind
|
331
|
+
if (!byKind.has(identifier.kind)) {
|
332
|
+
byKind.set(identifier.kind, []);
|
333
|
+
}
|
334
|
+
byKind.get(identifier.kind).push(identifier);
|
335
|
+
}
|
336
|
+
return {
|
337
|
+
byPosition,
|
338
|
+
byKind,
|
339
|
+
errors,
|
340
|
+
all: identifiers,
|
341
|
+
};
|
342
|
+
}
|
343
|
+
}
|
344
|
+
/**
|
345
|
+
* Default analyzer instance
|
346
|
+
*/
|
347
|
+
export const analyzer = new DefaultGraphQLAnalyzer();
|
348
|
+
/**
|
349
|
+
* Convenience function to analyze a GraphQL document
|
350
|
+
*/
|
351
|
+
export const analyze = (source, config) => {
|
352
|
+
return analyzer.analyze(source, config);
|
353
|
+
};
|
354
|
+
/**
|
355
|
+
* Convenience function to extract identifiers from a GraphQL document
|
356
|
+
*/
|
357
|
+
export const extractIdentifiers = (source, config) => {
|
358
|
+
const ast = analyzer.parse(source);
|
359
|
+
return analyzer.extractIdentifiers(ast, config);
|
360
|
+
};
|
361
|
+
//# sourceMappingURL=analysis.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../../src/lib/graphql-document/analysis.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/**
|
2
|
+
* Copy button component for GraphQL documents
|
3
|
+
*/
|
4
|
+
import type { React } from '#dep/react/index';
|
5
|
+
export interface CopyButtonProps {
|
6
|
+
/** The text to copy */
|
7
|
+
text: string;
|
8
|
+
/** Optional className */
|
9
|
+
className?: string;
|
10
|
+
/** Size variant */
|
11
|
+
size?: '1' | '2' | '3';
|
12
|
+
}
|
13
|
+
/**
|
14
|
+
* Copy button for GraphQL code blocks
|
15
|
+
*
|
16
|
+
* Shows a copy icon that changes to a checkmark when clicked
|
17
|
+
*/
|
18
|
+
export declare const CopyButton: React.FC<CopyButtonProps>;
|
19
|
+
//# sourceMappingURL=CopyButton.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CopyButton.d.ts","sourceRoot":"","sources":["../../../../src/lib/graphql-document/components/CopyButton.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAK7C,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB;IACnB,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAoDhD,CAAA"}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
2
|
+
import { React as ReactHooks } from '#dep/react/index';
|
3
|
+
import { CheckIcon, CopyIcon } from '@radix-ui/react-icons';
|
4
|
+
import { Button } from '@radix-ui/themes';
|
5
|
+
/**
|
6
|
+
* Copy button for GraphQL code blocks
|
7
|
+
*
|
8
|
+
* Shows a copy icon that changes to a checkmark when clicked
|
9
|
+
*/
|
10
|
+
export const CopyButton = ({ text, className = '', size = '1', }) => {
|
11
|
+
const [copied, setCopied] = ReactHooks.useState(false);
|
12
|
+
const timeoutRef = ReactHooks.useRef(null);
|
13
|
+
const handleCopy = ReactHooks.useCallback(async (e) => {
|
14
|
+
e.preventDefault();
|
15
|
+
e.stopPropagation();
|
16
|
+
try {
|
17
|
+
await navigator.clipboard.writeText(text);
|
18
|
+
setCopied(true);
|
19
|
+
// Clear any existing timeout
|
20
|
+
if (timeoutRef.current) {
|
21
|
+
clearTimeout(timeoutRef.current);
|
22
|
+
}
|
23
|
+
// Reset after 2 seconds
|
24
|
+
timeoutRef.current = setTimeout(() => {
|
25
|
+
setCopied(false);
|
26
|
+
timeoutRef.current = null;
|
27
|
+
}, 2000);
|
28
|
+
}
|
29
|
+
catch (err) {
|
30
|
+
console.error('Failed to copy text:', err);
|
31
|
+
}
|
32
|
+
}, [text]);
|
33
|
+
// Cleanup timeout on unmount
|
34
|
+
ReactHooks.useEffect(() => {
|
35
|
+
return () => {
|
36
|
+
if (timeoutRef.current) {
|
37
|
+
clearTimeout(timeoutRef.current);
|
38
|
+
}
|
39
|
+
};
|
40
|
+
}, []);
|
41
|
+
return (_jsx(Button, { size: size, variant: 'ghost', className: `graphql-copy-button ${className}`, onClick: handleCopy, "aria-label": copied ? 'Copied!' : 'Copy code', "data-copied": copied, children: copied ? _jsx(CheckIcon, { width: '16', height: '16' }) : _jsx(CopyIcon, { width: '16', height: '16' }) }));
|
42
|
+
};
|
43
|
+
//# sourceMappingURL=CopyButton.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CopyButton.js","sourceRoot":"","sources":["../../../../src/lib/graphql-document/components/CopyButton.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAWzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAA8B,CAAC,EACpD,IAAI,EACJ,SAAS,GAAG,EAAE,EACd,IAAI,GAAG,GAAG,GACX,EAAE,EAAE;IACH,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACtD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAwB,IAAI,CAAC,CAAA;IAEjE,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,CAAmB,EAAE,EAAE;QACtE,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,CAAC,CAAC,eAAe,EAAE,CAAA;QAEnB,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACzC,SAAS,CAAC,IAAI,CAAC,CAAA;YAEf,6BAA6B;YAC7B,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YAClC,CAAC;YAED,wBAAwB;YACxB,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBACnC,SAAS,CAAC,KAAK,CAAC,CAAA;gBAChB,UAAU,CAAC,OAAO,GAAG,IAAI,CAAA;YAC3B,CAAC,EAAE,IAAI,CAAC,CAAA;QACV,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,6BAA6B;IAC7B,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;QACxB,OAAO,GAAG,EAAE;YACV,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YAClC,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,KAAC,MAAM,IACL,IAAI,EAAE,IAAI,EACV,OAAO,EAAC,OAAO,EACf,SAAS,EAAE,uBAAuB,SAAS,EAAE,EAC7C,OAAO,EAAE,UAAU,gBACP,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,iBAC/B,MAAM,YAElB,MAAM,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,GAAG,GAC7E,CACV,CAAA;AACH,CAAC,CAAA"}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import type { React } from '#dep/react/index';
|
2
|
+
import type { GraphQLSchema } from 'graphql';
|
3
|
+
/**
|
4
|
+
* Options for the GraphQL document component
|
5
|
+
*/
|
6
|
+
export interface GraphQLDocumentOptions {
|
7
|
+
/** Whether to show debug overlays */
|
8
|
+
debug?: boolean;
|
9
|
+
/** Whether to disable interactive features */
|
10
|
+
plain?: boolean;
|
11
|
+
/** Custom navigation handler */
|
12
|
+
onNavigate?: (url: string) => void;
|
13
|
+
/** Whether to validate against schema */
|
14
|
+
validate?: boolean;
|
15
|
+
/** Custom class name for the container */
|
16
|
+
className?: string;
|
17
|
+
}
|
18
|
+
/**
|
19
|
+
* Props for the GraphQL document component
|
20
|
+
*/
|
21
|
+
export interface GraphQLDocumentProps {
|
22
|
+
/** The GraphQL document source code */
|
23
|
+
children: string;
|
24
|
+
/** GraphQL schema for validation and linking */
|
25
|
+
schema?: GraphQLSchema;
|
26
|
+
/** Component options */
|
27
|
+
options?: GraphQLDocumentOptions;
|
28
|
+
/** Pre-rendered Shiki HTML (from build time) */
|
29
|
+
highlightedHtml?: string;
|
30
|
+
}
|
31
|
+
/**
|
32
|
+
* Interactive GraphQL document component
|
33
|
+
*
|
34
|
+
* Transforms static GraphQL code blocks into interactive documentation
|
35
|
+
* with hyperlinks, tooltips, and schema validation.
|
36
|
+
*/
|
37
|
+
export declare const GraphQLDocument: React.FC<GraphQLDocumentProps>;
|
38
|
+
//# sourceMappingURL=GraphQLDocument.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"GraphQLDocument.d.ts","sourceRoot":"","sources":["../../../../src/lib/graphql-document/components/GraphQLDocument.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAW5C;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gCAAgC;IAChC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,wBAAwB;IACxB,OAAO,CAAC,EAAE,sBAAsB,CAAA;IAChC,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAwM1D,CAAA"}
|
@@ -0,0 +1,130 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
2
|
+
import { React as ReactHooks } from '#dep/react/index';
|
3
|
+
import { useNavigate } from 'react-router';
|
4
|
+
import { analyze } from "../analysis.js";
|
5
|
+
import { useTooltipState } from "../hooks/use-tooltip-state.js";
|
6
|
+
import { createSimplePositionCalculator } from "../positioning-simple.js";
|
7
|
+
import { createPolenSchemaResolver } from "../schema-integration.js";
|
8
|
+
import { CopyButton } from "./CopyButton.js";
|
9
|
+
import { graphqlDocumentStyles } from "./graphql-document-styles.js";
|
10
|
+
import { IdentifierLink } from "./IdentifierLink.js";
|
11
|
+
/**
|
12
|
+
* Interactive GraphQL document component
|
13
|
+
*
|
14
|
+
* Transforms static GraphQL code blocks into interactive documentation
|
15
|
+
* with hyperlinks, tooltips, and schema validation.
|
16
|
+
*/
|
17
|
+
export const GraphQLDocument = ({ children, schema, options = {}, highlightedHtml, }) => {
|
18
|
+
const { debug = false, plain = false, onNavigate, validate = true, className = '', } = options || {};
|
19
|
+
const navigate = useNavigate();
|
20
|
+
const handleNavigate = onNavigate || ((url) => navigate(url));
|
21
|
+
// Container ref for positioning calculations
|
22
|
+
const containerRef = ReactHooks.useRef(null);
|
23
|
+
const [isReady, setIsReady] = ReactHooks.useState(false);
|
24
|
+
// Use tooltip state management
|
25
|
+
const tooltipState = useTooltipState({
|
26
|
+
showDelay: 300,
|
27
|
+
hideDelay: 200, // Increased for smoother experience
|
28
|
+
allowMultiplePins: true,
|
29
|
+
});
|
30
|
+
// Handle escape key to unpin all
|
31
|
+
ReactHooks.useEffect(() => {
|
32
|
+
const handleKeyDown = (event) => {
|
33
|
+
if (event.key === 'Escape') {
|
34
|
+
tooltipState.unpinAll();
|
35
|
+
}
|
36
|
+
};
|
37
|
+
document.addEventListener('keydown', handleKeyDown);
|
38
|
+
return () => {
|
39
|
+
document.removeEventListener('keydown', handleKeyDown);
|
40
|
+
};
|
41
|
+
}, [tooltipState]);
|
42
|
+
// Layer 1: Parse and analyze
|
43
|
+
const analysisResult = ReactHooks.useMemo(() => {
|
44
|
+
if (plain)
|
45
|
+
return null;
|
46
|
+
const result = analyze(children, { schema });
|
47
|
+
return result;
|
48
|
+
}, [children, plain, schema]);
|
49
|
+
// Layer 2: Schema resolution
|
50
|
+
const resolver = ReactHooks.useMemo(() => {
|
51
|
+
if (!schema || plain)
|
52
|
+
return null;
|
53
|
+
return createPolenSchemaResolver(schema);
|
54
|
+
}, [schema, plain]);
|
55
|
+
const resolutions = ReactHooks.useMemo(() => {
|
56
|
+
if (!analysisResult || !resolver) {
|
57
|
+
return new Map();
|
58
|
+
}
|
59
|
+
const results = new Map();
|
60
|
+
for (const [position, identifier] of analysisResult.identifiers.byPosition) {
|
61
|
+
const resolution = resolver.resolveIdentifier(identifier);
|
62
|
+
if (resolution) {
|
63
|
+
results.set(position, resolution);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
return results;
|
67
|
+
}, [analysisResult, resolver]);
|
68
|
+
// Layer 3: Position calculation
|
69
|
+
const positionCalculator = ReactHooks.useMemo(() => {
|
70
|
+
if (plain)
|
71
|
+
return null;
|
72
|
+
return createSimplePositionCalculator();
|
73
|
+
}, [plain]);
|
74
|
+
const [positions, setPositions] = ReactHooks.useState(new Map());
|
75
|
+
// Prepare code block and calculate positions after render
|
76
|
+
ReactHooks.useEffect(() => {
|
77
|
+
if (!containerRef.current || !analysisResult || !positionCalculator || plain) {
|
78
|
+
return;
|
79
|
+
}
|
80
|
+
// Get the code element within the container
|
81
|
+
const codeElement = containerRef.current.querySelector('pre.shiki code')
|
82
|
+
|| containerRef.current.querySelector('pre code')
|
83
|
+
|| containerRef.current.querySelector('code');
|
84
|
+
if (!codeElement) {
|
85
|
+
return;
|
86
|
+
}
|
87
|
+
// Prepare the code block (wrap identifiers)
|
88
|
+
const identifiers = Array.from(analysisResult.identifiers.byPosition.values());
|
89
|
+
positionCalculator.prepareCodeBlock(codeElement, identifiers);
|
90
|
+
// Get positions after DOM update
|
91
|
+
requestAnimationFrame(() => {
|
92
|
+
// Pass containerRef.current as the reference element for positioning
|
93
|
+
if (containerRef.current) {
|
94
|
+
const newPositions = positionCalculator.getIdentifierPositions(codeElement, containerRef.current);
|
95
|
+
setPositions(newPositions);
|
96
|
+
setIsReady(true);
|
97
|
+
}
|
98
|
+
});
|
99
|
+
}, [analysisResult, positionCalculator, plain, highlightedHtml]);
|
100
|
+
// Handle resize events
|
101
|
+
ReactHooks.useEffect(() => {
|
102
|
+
if (!containerRef.current || !positionCalculator || plain)
|
103
|
+
return;
|
104
|
+
const handleResize = () => {
|
105
|
+
const codeElement = containerRef.current?.querySelector('pre.shiki code')
|
106
|
+
|| containerRef.current?.querySelector('pre code')
|
107
|
+
|| containerRef.current?.querySelector('code');
|
108
|
+
if (codeElement && containerRef.current) {
|
109
|
+
const newPositions = positionCalculator.getIdentifierPositions(codeElement, containerRef.current);
|
110
|
+
setPositions(newPositions);
|
111
|
+
}
|
112
|
+
};
|
113
|
+
window.addEventListener('resize', handleResize);
|
114
|
+
return () => window.removeEventListener('resize', handleResize);
|
115
|
+
}, [positionCalculator, plain]);
|
116
|
+
// Validation errors
|
117
|
+
const validationErrors = ReactHooks.useMemo(() => {
|
118
|
+
if (!validate || !analysisResult || !schema)
|
119
|
+
return [];
|
120
|
+
return analysisResult.errors;
|
121
|
+
}, [validate, analysisResult, schema]);
|
122
|
+
return (_jsxs(_Fragment, { children: [_jsx("style", { dangerouslySetInnerHTML: { __html: graphqlDocumentStyles } }), _jsxs("div", { ref: containerRef, className: `graphql-document ${className} ${debug ? 'graphql-debug-mode' : ''} ${!isReady && !plain ? 'graphql-loading' : ''}`, children: [highlightedHtml ? _jsx("div", { dangerouslySetInnerHTML: { __html: highlightedHtml } }) : (_jsx("pre", { className: 'shiki', children: _jsx("code", { children: children }) })), !plain && (_jsx(CopyButton, { text: children, className: 'graphql-document-copy', size: '2' })), !plain && isReady && (_jsx("div", { className: 'graphql-interaction-layer', style: { pointerEvents: 'none' }, children: Array.from(positions.entries()).map(([id, { position, identifier }]) => {
|
123
|
+
const startPos = identifier.position.start;
|
124
|
+
const resolution = resolutions.get(startPos);
|
125
|
+
if (!resolution)
|
126
|
+
return null;
|
127
|
+
return (_jsx(IdentifierLink, { identifier: identifier, resolution: resolution, position: position, onNavigate: handleNavigate, debug: debug, isOpen: tooltipState.isOpen(id), isPinned: tooltipState.isPinned(id), onHoverStart: () => tooltipState.onHoverStart(id), onHoverEnd: () => tooltipState.onHoverEnd(id), onTogglePin: () => tooltipState.onTogglePin(id), onTooltipHover: () => tooltipState.onTooltipHover(id) }, id));
|
128
|
+
}) })), validationErrors.length > 0 && (_jsx("div", { className: 'graphql-validation-errors', children: validationErrors.map((error, index) => (_jsx("div", { className: 'graphql-error', children: error.message }, index))) }))] })] }));
|
129
|
+
};
|
130
|
+
//# sourceMappingURL=GraphQLDocument.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"GraphQLDocument.js","sourceRoot":"","sources":["../../../../src/lib/graphql-document/components/GraphQLDocument.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAkB,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAsB,CAAA;AAgCrD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAC9D,QAAQ,EACR,MAAM,EACN,OAAO,GAAG,EAAE,EACZ,eAAe,GAChB,EAAE,EAAE;IACH,MAAM,EACJ,KAAK,GAAG,KAAK,EACb,KAAK,GAAG,KAAK,EACb,UAAU,EACV,QAAQ,GAAG,IAAI,EACf,SAAS,GAAG,EAAE,GACf,GAAG,OAAO,IAAI,EAAE,CAAA;IAEjB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,cAAc,GAAG,UAAU,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAErE,6CAA6C;IAC7C,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAA;IAC5D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAExD,+BAA+B;IAC/B,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG,EAAE,oCAAoC;QACpD,iBAAiB,EAAE,IAAI;KACxB,CAAC,CAAA;IAEF,iCAAiC;IACjC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;QACxB,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAE,EAAE;YAC7C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC3B,YAAY,CAAC,QAAQ,EAAE,CAAA;YACzB,CAAC;QACH,CAAC,CAAA;QAED,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QACnD,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QACxD,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;IAElB,6BAA6B;IAC7B,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;QAC7C,IAAI,KAAK;YAAE,OAAO,IAAI,CAAA;QACtB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAC5C,OAAO,MAAM,CAAA;IACf,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IAE7B,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;QACvC,IAAI,CAAC,MAAM,IAAI,KAAK;YAAE,OAAO,IAAI,CAAA;QACjC,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;IAEnB,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1C,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,OAAO,IAAI,GAAG,EAAE,CAAA;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAA;QACzB,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,cAAc,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YAC3E,MAAM,UAAU,GAAG,QAAQ,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAA;YACzD,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE9B,gCAAgC;IAChC,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;QACjD,IAAI,KAAK;YAAE,OAAO,IAAI,CAAA;QACtB,OAAO,8BAA8B,EAAE,CAAA;IACzC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,UAAU,CAAC,QAAQ,CACnD,IAAI,GAAG,EAAE,CACV,CAAA;IAED,0DAA0D;IAC1D,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;QACxB,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,cAAc,IAAI,CAAC,kBAAkB,IAAI,KAAK,EAAE,CAAC;YAC7E,OAAM;QACR,CAAC;QAED,4CAA4C;QAC5C,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC;eACnE,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC;eAC9C,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,4CAA4C;QAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QAC9E,kBAAkB,CAAC,gBAAgB,CAAC,WAAsB,EAAE,WAAW,CAAC,CAAA;QAExE,iCAAiC;QACjC,qBAAqB,CAAC,GAAG,EAAE;YACzB,qEAAqE;YACrE,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzB,MAAM,YAAY,GAAG,kBAAkB,CAAC,sBAAsB,CAAC,WAAsB,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;gBAC5G,YAAY,CAAC,YAAY,CAAC,CAAA;gBAC1B,UAAU,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,cAAc,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAA;IAEhE,uBAAuB;IACvB,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;QACxB,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,kBAAkB,IAAI,KAAK;YAAE,OAAM;QAEjE,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC;mBACpE,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC;mBAC/C,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;YAChD,IAAI,WAAW,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACxC,MAAM,YAAY,GAAG,kBAAkB,CAAC,sBAAsB,CAAC,WAAsB,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;gBAC5G,YAAY,CAAC,YAAY,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC,CAAA;QAED,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QAC/C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IACjE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAA;IAE/B,oBAAoB;IACpB,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;QAC/C,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAA;QACtD,OAAO,cAAc,CAAC,MAAM,CAAA;IAC9B,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAA;IAEtC,OAAO,CACL,8BACE,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,GAAI,EACrE,eACE,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,oBAAoB,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,IAC3E,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAC3C,EAAE,aAGD,eAAe,CAAC,CAAC,CAAC,cAAK,uBAAuB,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,GAAI,CAAC,CAAC,CAAC,CACjF,cAAK,SAAS,EAAC,OAAO,YACpB,yBAAO,QAAQ,GAAQ,GACnB,CACP,EAGA,CAAC,KAAK,IAAI,CACT,KAAC,UAAU,IACT,IAAI,EAAE,QAAQ,EACd,SAAS,EAAC,uBAAuB,EACjC,IAAI,EAAC,GAAG,GACR,CACH,EAGA,CAAC,KAAK,IAAI,OAAO,IAAI,CACpB,cAAK,SAAS,EAAC,2BAA2B,EAAC,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,YACxE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE;4BACtE,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAA;4BAC1C,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;4BAE5C,IAAI,CAAC,UAAU;gCAAE,OAAO,IAAI,CAAA;4BAE5B,OAAO,CACL,KAAC,cAAc,IAEb,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAC/B,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EACnC,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,EACjD,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,EAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,EAC/C,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC,IAXhD,EAAE,CAYP,CACH,CAAA;wBACH,CAAC,CAAC,GACE,CACP,EAGA,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAC9B,cAAK,SAAS,EAAC,2BAA2B,YACvC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,KAAa,EAAE,EAAE,CAAC,CACnD,cAAiB,SAAS,EAAC,eAAe,YACvC,KAAK,CAAC,OAAO,IADN,KAAK,CAET,CACP,CAAC,GACE,CACP,IACG,IACL,CACJ,CAAA;AACH,CAAC,CAAA"}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import type { React } from '#dep/react/index';
|
2
|
+
import { type GraphQLDocumentProps } from './GraphQLDocument.tsx';
|
3
|
+
/**
|
4
|
+
* GraphQL Document component that uses the schema context and handles syntax highlighting
|
5
|
+
*/
|
6
|
+
export declare const GraphQLDocumentWithSchema: React.FC<Omit<GraphQLDocumentProps, 'schema' | 'highlightedHtml'>>;
|
7
|
+
//# sourceMappingURL=GraphQLDocumentWithSchema.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"GraphQLDocumentWithSchema.d.ts","sourceRoot":"","sources":["../../../../src/lib/graphql-document/components/GraphQLDocumentWithSchema.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAG7C,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAKlF;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,iBAAiB,CAAC,CA0DxG,CAAA"}
|