@xyd-js/gql 0.1.0-build.170

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +1551 -0
  2. package/LICENSE +21 -0
  3. package/README.md +3 -0
  4. package/TODO.md +8 -0
  5. package/__fixtures__/-1.opendocs.docs-nested/input.graphql +66 -0
  6. package/__fixtures__/-1.opendocs.docs-nested/output.json +554 -0
  7. package/__fixtures__/-1.opendocs.flat/input.graphql +19 -0
  8. package/__fixtures__/-1.opendocs.flat/output.json +243 -0
  9. package/__fixtures__/-1.opendocs.scopes/input.graphql +33 -0
  10. package/__fixtures__/-1.opendocs.scopes/output.json +378 -0
  11. package/__fixtures__/-1.opendocs.sidebar/input.graphql +44 -0
  12. package/__fixtures__/-1.opendocs.sort/input.graphql +92 -0
  13. package/__fixtures__/-1.opendocs.sort/output.json +1078 -0
  14. package/__fixtures__/-1.opendocs.sort+group/input.graphql +111 -0
  15. package/__fixtures__/-1.opendocs.sort+group/output.json +1114 -0
  16. package/__fixtures__/-1.opendocs.sort+group+path/input.graphql +118 -0
  17. package/__fixtures__/-1.opendocs.sort+group+path/output.json +1114 -0
  18. package/__fixtures__/-2.complex.github/input.graphql +69424 -0
  19. package/__fixtures__/-2.complex.github/output.json +269874 -0
  20. package/__fixtures__/-2.complex.livesession/input.graphql +23 -0
  21. package/__fixtures__/-2.complex.livesession/output.json +302 -0
  22. package/__fixtures__/-2.complex.monday/input.graphql +6089 -0
  23. package/__fixtures__/-2.complex.monday/output.json +1 -0
  24. package/__fixtures__/-3.array-non-null-return/input.graphql +9 -0
  25. package/__fixtures__/-3.array-non-null-return/output.json +151 -0
  26. package/__fixtures__/1.basic/input.graphql +118 -0
  27. package/__fixtures__/1.basic/output.json +630 -0
  28. package/__fixtures__/2.circular/input.graphql +17 -0
  29. package/__fixtures__/2.circular/output.json +248 -0
  30. package/__fixtures__/3.opendocs/input.graphql +27 -0
  31. package/__fixtures__/3.opendocs/output.json +338 -0
  32. package/__fixtures__/4.union/input.graphql +19 -0
  33. package/__fixtures__/4.union/output.json +344 -0
  34. package/__fixtures__/5.flat/input.graphql +27 -0
  35. package/__fixtures__/5.flat/output.json +383 -0
  36. package/__fixtures__/6.default-values/input.graphql +47 -0
  37. package/__fixtures__/6.default-values/output.json +655 -0
  38. package/__fixtures__/7.type-args/input.graphql +19 -0
  39. package/__fixtures__/7.type-args/output.json +301 -0
  40. package/__fixtures__/8.default-sort/input.graphql +60 -0
  41. package/__fixtures__/8.default-sort/output.json +1078 -0
  42. package/__tests__/gqlSchemaToReferences.test.ts +109 -0
  43. package/__tests__/utils.ts +45 -0
  44. package/declarations.d.ts +4 -0
  45. package/dist/index.d.ts +21 -0
  46. package/dist/index.js +1503 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/opendocs.graphql +56 -0
  49. package/index.ts +3 -0
  50. package/package.json +29 -0
  51. package/src/context.ts +17 -0
  52. package/src/converters/gql-arg.ts +51 -0
  53. package/src/converters/gql-enum.ts +27 -0
  54. package/src/converters/gql-field.ts +164 -0
  55. package/src/converters/gql-input.ts +34 -0
  56. package/src/converters/gql-interface.ts +35 -0
  57. package/src/converters/gql-mutation.ts +36 -0
  58. package/src/converters/gql-object.ts +83 -0
  59. package/src/converters/gql-operation.ts +128 -0
  60. package/src/converters/gql-query.ts +36 -0
  61. package/src/converters/gql-sample.ts +159 -0
  62. package/src/converters/gql-scalar.ts +16 -0
  63. package/src/converters/gql-subscription.ts +36 -0
  64. package/src/converters/gql-types.ts +195 -0
  65. package/src/converters/gql-union.ts +40 -0
  66. package/src/gql-core.ts +362 -0
  67. package/src/index.ts +3 -0
  68. package/src/opendocs.graphql +56 -0
  69. package/src/opendocs.ts +253 -0
  70. package/src/schema.ts +293 -0
  71. package/src/types.ts +103 -0
  72. package/src/utils.ts +25 -0
  73. package/tsconfig.json +18 -0
  74. package/tsup.config.ts +33 -0
  75. package/tsup.examples-config.ts +30 -0
  76. package/vitest.config.ts +21 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts","../src/types.ts","../src/converters/gql-types.ts","../src/converters/gql-field.ts","../src/gql-core.ts","../src/opendocs.ts","../src/converters/gql-union.ts","../src/converters/gql-arg.ts","../src/converters/gql-input.ts","../src/converters/gql-object.ts","../src/converters/gql-enum.ts","../src/converters/gql-scalar.ts","../src/converters/gql-interface.ts","../src/context.ts","../src/converters/gql-query.ts","../src/utils.ts","../src/converters/gql-operation.ts","../src/converters/gql-sample.ts","../src/converters/gql-mutation.ts","../src/converters/gql-subscription.ts","../src/opendocs.graphql"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {fileURLToPath} from \"node:url\";\n\nimport {\n buildSchema,\n DirectiveNode,\n print,\n visit,\n parse,\n ObjectTypeExtensionNode,\n GraphQLSchema,\n StringValueNode\n} from \"graphql\";\nimport {mergeTypeDefs} from '@graphql-tools/merge';\n\nimport type {Reference} from \"@xyd-js/uniform\"\nimport {ReferenceType} from \"@xyd-js/uniform\";\n\nimport type {\n GQLSchemaToReferencesOptions,\n OpenDocsSortConfig,\n FieldMetadata,\n GQLSchemaMetadata,\n SortItem\n} from \"./types\";\nimport {DEFAULT_SORT_ORDER} from \"./types\";\nimport {graphqlTypesToUniformReferences} from \"./converters/gql-types\";\nimport {graphqlQueriesToUniformReferences} from \"./converters/gql-query\";\nimport {graphqlMutationsToUniformReferences} from \"./converters/gql-mutation\";\nimport {graphqlSubscriptionsToUniformReferences} from \"./converters/gql-subscription\";\nimport {OPEN_DOCS_DIRECTIVE_NAME, OPEN_DOCS_SCHEMA_DIRECTIVE_NAME, openDocsExtensionsToOptions} from \"./opendocs\";\nimport openDocsSchemaRaw from './opendocs.graphql'\n\n// TODO: support multi graphql files\n// TODO: sort by tag??\nexport async function gqlSchemaToReferences(\n schemaLocation: string | string[],\n options?: GQLSchemaToReferencesOptions\n): Promise<Reference[]> {\n // 1. Convert schemaLocation to array\n const schemaLocations = Array.isArray(schemaLocation) ? schemaLocation : [schemaLocation];\n\n // Add opendocs.graphql to schema locations (first)\n schemaLocations.unshift(openDocsSchemaRaw);\n\n // 2. Read all schema contents\n const schemaContents = await Promise.all(schemaLocations.map(async location => {\n if (location.startsWith('http://') || location.startsWith('https://')) {\n const response = await fetch(location);\n if (!response.ok) {\n throw new Error(`Failed to fetch schema from URL: ${location}`);\n }\n return response.text();\n }\n if (fs.existsSync(location)) {\n return fs.readFileSync(location, 'utf-8');\n }\n return location;\n }));\n\n // 3. Merge all schema contents\n const mergedTypeDefs = mergeTypeDefs(schemaContents);\n const schemaString = print(mergedTypeDefs);\n\n // 4. Build the schema\n const schema = buildSchema(schemaString, {\n assumeValid: true\n });\n if (schemaContents.length > 2) {\n console.warn(`Warning: More than 2 schema files provided - no all featues will be supported!`);\n }\n \n docDirectiveChain(schemaContents[1], schema);\n // TODO: fix schemaContents[1]\n\n if (!options) {\n options = {}\n }\n\n if (!options.hasOwnProperty('flat')) {\n options.flat = true; // Default flat is true\n }\n options = {\n ...options,\n ...openDocsExtensionsToOptions(schema)\n }\n\n // 5. Generate uniform references from the schema\n const references = [\n // types\n ...graphqlTypesToUniformReferences(schema, options),\n\n // queries\n ...graphqlQueriesToUniformReferences(schema, options),\n\n // mutations\n ...graphqlMutationsToUniformReferences(schema, options),\n\n // subscriptions\n ...graphqlSubscriptionsToUniformReferences(schema, options),\n ]\n\n // Sort references using provided sort config or defaults\n const sortConfig = options.sort ?? {sort: DEFAULT_SORT_ORDER};\n references.sort((a, b) => {\n const aOrder = getSortOrder(a, sortConfig);\n const bOrder = getSortOrder(b, sortConfig);\n return aOrder - bOrder;\n });\n\n if (options.route) {\n // TODO: types or better solution!!!\n // @ts-ignore\n references.__UNSAFE_route = () => options.route\n }\n return references\n}\n\nfunction getSortOrder(reference: Reference, sortConfig: OpenDocsSortConfig): number {\n const sortItems = sortConfig.sort ?? DEFAULT_SORT_ORDER;\n const sortStacks = sortConfig.sortStack ?? [];\n const referenceGroups = getReferenceGroups(reference);\n\n // First, find which primary group this reference belongs to\n for (let groupIndex = 0; groupIndex < sortItems.length; groupIndex++) {\n const sortItem = sortItems[groupIndex];\n\n // Check if this reference matches the primary group\n if (matchesPrimaryGroup(reference, sortItem)) {\n // Determine which stack to use (default to 0 if not specified)\n const stackIndex = sortItem.stack !== undefined ? sortItem.stack : 0;\n\n // Calculate position within this group using the stack\n const positionInGroup = calculatePositionInGroup(reference, stackIndex, sortStacks);\n\n const result = (groupIndex * 1000) + positionInGroup;\n \n // Return order: groupIndex * 1000 + positionInGroup\n // This ensures all items in group 0 come before all items in group 1, etc.\n return result;\n }\n }\n\n return Number.MAX_SAFE_INTEGER;\n}\n\nfunction matchesPrimaryGroup(reference: Reference, sortItem: SortItem): boolean {\n // Check node match first\n if (sortItem.node) {\n const context = reference.context as any;\n if (context?.graphqlTypeShort === sortItem.node) {\n return true;\n }\n // If node is specified but doesn't match, return false (don't fall through)\n return false;\n }\n\n // Check group match\n if (sortItem.group && sortItem.group.length > 0) {\n const referenceGroups = getReferenceGroups(reference);\n const match = sortItem.group.some(group => referenceGroups.includes(group));\n return match;\n }\n\n return true;\n}\n\nfunction calculatePositionInGroup(reference: Reference, stackIndex: number, sortStacks: string[][]): number {\n if (stackIndex < 0 || stackIndex >= sortStacks.length) {\n return 0;\n }\n\n const stackGroups = sortStacks[stackIndex];\n const referenceGroups = getReferenceGroups(reference);\n\n // Find the position of the reference's type in the stack\n for (let i = 0; i < stackGroups.length; i++) {\n const stackGroup = stackGroups[i];\n if (referenceGroups.includes(stackGroup)) {\n return i;\n }\n }\n\n return 999; // If not found in stack, put at the end of the group\n}\n\n\nfunction getReferenceGroups(reference: Reference): string[] {\n // Extract groups from reference context\n const context = reference.context as any;\n if (context?.group && Array.isArray(context.group)) {\n return context.group;\n }\n\n // Fallback: try to get groups from metadata if available\n if (reference.__UNSAFE_selector) {\n try {\n const selector = reference.__UNSAFE_selector;\n const metadata = selector(\"[metadata]\");\n if (metadata?.groups) {\n return metadata.groups;\n }\n } catch (e) {\n // Ignore errors from selector\n }\n }\n\n return [];\n}\n\nfunction docDirectiveChain(\n rawSDL: string,\n schema: GraphQLSchema\n) {\n const ast = parse(rawSDL);\n const metadata: GQLSchemaMetadata = {\n fields: new Map<string, FieldMetadata>()\n };\n\n // First, find root groups from @docs directive\n visit(ast, {\n SchemaExtension(node) {\n for (const directive of node.directives || []) {\n if (directive.name.value === OPEN_DOCS_SCHEMA_DIRECTIVE_NAME) {\n const groupArg = directive.arguments?.find(arg => arg.name.value === 'group');\n if (groupArg?.value.kind === 'ListValue') {\n metadata.rootGroups = groupArg.value.values\n .filter((v): v is StringValueNode => v.kind === 'StringValue')\n .map(v => v.value);\n }\n }\n }\n }\n });\n\n // Then process type extensions and fields\n visit(ast, {\n ObjectTypeExtension(node: ObjectTypeExtensionNode) {\n const validNodeTypes = ['Query', 'Mutation', 'Subscription'];\n if (!validNodeTypes.includes(node.name.value)) return;\n\n const typeLevelDoc = node.directives?.find(d => d.name.value === OPEN_DOCS_DIRECTIVE_NAME);\n const typeLevelDocArgs = typeLevelDoc ? extractDocArgs(typeLevelDoc) : {};\n\n for (const field of node.fields ?? []) {\n const fieldName = field.name.value;\n\n const fieldDoc = field.directives?.find(d => d.name.value === OPEN_DOCS_DIRECTIVE_NAME);\n const fieldDocArgs = fieldDoc ? extractDocArgs(fieldDoc) : {};\n\n // Merge paths: if both type and field have paths, join them\n let path = fieldDocArgs.path;\n if (typeLevelDocArgs.path && fieldDocArgs.path) {\n path = `${typeLevelDocArgs.path}/${fieldDocArgs.path}`;\n } else if (typeLevelDocArgs.path) {\n path = typeLevelDocArgs.path;\n }\n\n if (!fieldDocArgs.path && path) {\n path += \"/\" + fieldName\n }\n\n // Merge groups: combine root groups with type/field groups\n const groups = fieldDocArgs.groups ?? typeLevelDocArgs.groups ?? [];\n\n const effectiveDoc: FieldMetadata = {\n groups,\n path\n };\n\n metadata.fields.set(`${node.name.value}.${fieldName}`, effectiveDoc);\n }\n }\n });\n\n // Attach metadata to schema\n (schema as any).__metadata = metadata;\n}\n\nfunction extractDocArgs(directive: DirectiveNode): FieldMetadata {\n const info: FieldMetadata = {};\n for (const arg of directive.arguments ?? []) {\n if (arg.name.value === 'group' && arg.value.kind === 'ListValue') {\n info.groups = arg.value.values\n .filter((v): v is StringValueNode => v.kind === 'StringValue')\n .map(v => v.value);\n } else if (arg.name.value === 'path' && arg.value.kind === 'StringValue') {\n info.path = arg.value.value;\n }\n }\n return info;\n}","import type {GraphQLInputObjectType, GraphQLInterfaceType, GraphQLNamedType, GraphQLObjectType} from \"graphql\";\nimport {GraphQLField, OperationTypeNode} from \"graphql\";\n\nimport type {DefinitionProperty} from \"@xyd-js/uniform\";\n\n// New sorting types based on the documentation\nexport interface SortItem {\n node?: string;\n group?: string[];\n stack?: number;\n}\n\nexport interface SortStack {\n sortStack?: string[][];\n sort?: SortItem[];\n}\n\nexport interface OpenDocsSortConfig {\n sortStack?: string[][];\n sort?: SortItem[];\n}\n\nexport const DEFAULT_SORT_ORDER: SortItem[] = [\n { node: \"query\" },\n { node: \"mutation\" },\n { node: \"subscription\" },\n { node: \"object\" },\n { node: \"interface\" },\n { node: \"union\" },\n { node: \"input\" },\n { node: \"enum\" },\n { node: \"scalar\" },\n];\n\nexport interface GQLSchemaToReferencesOptions {\n // TODO: support line ranged in the future?\n regions?: string[] // TODO: BETTER API - UNIFY FOR REST API / GRAPHQL ETC\n\n flat?: boolean;\n sort?: OpenDocsSortConfig;\n route?: string\n}\n\nexport type NestedGraphqlType = {\n __definitionProperties?: DefinitionProperty[];\n} & (GraphQLObjectType | GraphQLInputObjectType | GraphQLInterfaceType)\n\n// needed cuz GraphQLField does not have operation info?\nexport class GQLOperation implements GraphQLField<any, any> {\n public _operationType!: OperationTypeNode\n field: GraphQLField<any, any>;\n\n constructor(field: GraphQLField<any, any>) {\n this.field = field;\n }\n\n get name() {\n return this.field.name;\n }\n\n get description() {\n return this.field.description;\n }\n\n get type() {\n return this.field.type;\n }\n\n get args() {\n return this.field.args;\n }\n\n get deprecationReason() {\n return this.field.deprecationReason;\n }\n\n get extensions() {\n return this.field.extensions;\n }\n\n get astNode() {\n return this.field.astNode;\n }\n\n set __operationType(operationType: OperationTypeNode) {\n this._operationType = operationType;\n }\n}\n\nexport interface GQLTypeInfo {\n typeFlat?: GraphQLNamedType\n}\n\nexport interface FieldMetadata {\n path?: string;\n groups?: string[];\n}\n\nexport interface GQLSchemaMetadata {\n fields: Map<string, FieldMetadata>;\n rootGroups?: string[];\n}\n\n","import type {\n GraphQLEnumType,\n GraphQLInputObjectType,\n GraphQLInterfaceType,\n GraphQLObjectType,\n GraphQLScalarType,\n GraphQLSchema,\n GraphQLUnionType,\n GraphQLNamedType,\n} from \"graphql\";\nimport {\n isIntrospectionType,\n isSpecifiedScalarType\n} from \"graphql\";\n\nimport {Reference} from \"@xyd-js/uniform\";\n\nimport {GQLSchemaToReferencesOptions, NestedGraphqlType} from \"../types\";\nimport {gqlObjectToUniformRef} from \"./gql-object\";\nimport {gqlInputToUniformRef} from \"./gql-input\";\nimport {gqlEnumToUniformRef} from \"./gql-enum\";\nimport {gqlScalarToUniformRef} from \"./gql-scalar\";\nimport {gqlUnionToUniformRef} from \"./gql-union\";\nimport {gqlInterfaceToUniformRef} from \"./gql-interface\";\nimport {Context} from \"../context\";\n\n// TODO: missing types like interfaces, fragments.\nexport function graphqlTypesToUniformReferences(\n schema: GraphQLSchema,\n options?: GQLSchemaToReferencesOptions,\n): Reference[] {\n const references: Reference[] = []\n const typeMap = schema.getTypeMap();\n\n const sharedProcessedTypes = new Set<NestedGraphqlType>();\n\n for (const gqlType of Object.values(typeMap)) {\n const builtInType = isSpecifiedScalarType(gqlType) ||\n isIntrospectionType(gqlType) ||\n gqlType.name === \"Mutation\" ||\n gqlType.name === \"Query\" ||\n gqlType.name === \"Subscription\" ||\n isInternalOpenDocsType(gqlType)\n\n if (builtInType) {\n continue;\n }\n\n let ref: Reference | null = null\n\n let flat = false;\n if (options?.flat) {\n flat = true;\n }\n\n switch (gqlType.constructor.name) {\n case 'GraphQLObjectType': {\n const type = gqlType as GraphQLObjectType;\n const regionKey = `object.${type.name}`;\n if (!options?.regions || !options?.regions?.length || options.regions.includes(regionKey)) {\n\n ref = gqlObjectToUniformRef(\n new Context(\n sharedProcessedTypes,\n options,\n {\n flat,\n },\n schema\n ),\n type,\n \n )\n }\n break\n }\n\n case 'GraphQLInputObjectType': {\n const type = gqlType as GraphQLInputObjectType;\n const regionKey = `input.${type.name}`;\n if (!options?.regions || !options?.regions?.length || options.regions.includes(regionKey)) {\n ref = gqlInputToUniformRef(\n new Context(\n sharedProcessedTypes,\n options,\n {\n flat,\n },\n schema\n ),\n type\n )\n }\n break\n }\n\n case 'GraphQLEnumType': {\n const type = gqlType as GraphQLEnumType;\n const regionKey = `enum.${type.name}`;\n if (!options?.regions || !options?.regions?.length || options.regions.includes(regionKey)) {\n ref = gqlEnumToUniformRef(\n new Context(\n new Set(),\n options,\n {},\n schema\n ),\n type\n )\n }\n break\n }\n\n case 'GraphQLScalarType': {\n const type = gqlType as GraphQLScalarType;\n const regionKey = `scalar.${type.name}`;\n if (!options?.regions || !options?.regions?.length || options.regions.includes(regionKey)) {\n ref = gqlScalarToUniformRef(\n new Context(\n new Set(),\n options,\n {},\n schema\n ),\n type\n )\n }\n break\n }\n\n case 'GraphQLUnionType': {\n const type = gqlType as GraphQLUnionType;\n const regionKey = `union.${type.name}`;\n if (!options?.regions || !options?.regions?.length || options.regions.includes(regionKey)) {\n ref = gqlUnionToUniformRef(\n new Context(\n sharedProcessedTypes,\n options,\n {\n flat,\n flatArg: flat || false\n },\n schema\n ),\n type,\n )\n }\n\n break\n }\n\n case 'GraphQLInterfaceType': {\n const type = gqlType as GraphQLInterfaceType;\n const regionKey = `interface.${type.name}`;\n if (!options?.regions || !options?.regions?.length || options.regions.includes(regionKey)) {\n ref = gqlInterfaceToUniformRef(\n new Context(\n new Set(),\n options,\n {\n flat\n },\n schema\n ),\n type,\n )\n }\n break\n }\n\n default: {\n console.debug(`Unsupported type: ${gqlType.constructor.name}`)\n }\n }\n\n if (ref) {\n references.push(ref);\n }\n }\n\n return references;\n}\n\nfunction isInternalOpenDocsType(type: GraphQLNamedType): boolean {\n const internalTypes = [\n 'OpenDocsScope',\n 'OpenDocsSidebarItemType',\n 'OpenDocsPage',\n 'OpenDocsExampleInput',\n 'OpenDocsSortInput',\n 'OpenDocsSortStackInput'\n\n ]\n return internalTypes.includes(type.name)\n}\n","import {\n GraphQLField,\n GraphQLFieldMap,\n GraphQLInputField,\n GraphQLInputFieldMap,\n GraphQLInputObjectType,\n GraphQLUnionType,\n GraphQLObjectType,\n GraphQLInterfaceType,\n GraphQLScalarType,\n GraphQLNonNull,\n} from \"graphql\";\n\nimport type {DefinitionProperty, DefinitionPropertyMeta} from \"@xyd-js/uniform\";\n\nimport {NestedGraphqlType} from \"../types\";\nimport {gqlFieldTypeInfo, propsUniformify} from \"../gql-core\";\nimport {gqlUnionToUniformDefinitionProperties} from \"./gql-union\";\nimport {Context} from \"../context\";\n\n// gqlFieldToUniformDefinitionProperty converts GraphQL fields (field or input field) into xyd 'uniform' definition property\nexport function gqlFieldToUniformDefinitionProperty(\n ctx: Context,\n field: GraphQLField<any, any> | GraphQLInputField,\n): DefinitionProperty {\n return GQLFieldConverter.convert(ctx, field);\n}\n\nexport class GQLFieldConverter {\n private constructor(private ctx: Context) {\n }\n\n public static convert(\n ctx: Context,\n field: GraphQLField<any, any> | GraphQLInputField,\n ): DefinitionProperty {\n return new GQLFieldConverter(ctx).convert(field);\n }\n\n private convert(\n field: GraphQLField<any, any> | GraphQLInputField,\n parent?: NestedGraphqlType,\n ): DefinitionProperty {\n if (this.ctx.globalOptions?.flat && (this.ctx.config?.flatReturn || this.ctx.config?.flat)) {\n const info = gqlFieldTypeInfo(field)\n const meta: DefinitionPropertyMeta[] = []\n\n const props = propsUniformify(this.ctx, field, [], meta)\n if (this.ctx.config?.flatReturn) {\n return {\n ...props,\n name: \"\"\n }\n }\n\n if (this.ctx.config?.flat) {\n return props\n }\n }\n\n const fieldInfo = gqlFieldTypeInfo(field)\n const graphqlTypeFlat = fieldInfo?.typeFlat\n\n let properties\n\n switch (graphqlTypeFlat?.constructor) {\n case GraphQLObjectType:\n case GraphQLInputObjectType:\n case GraphQLInterfaceType: {\n properties = this.nestedProperties(graphqlTypeFlat as NestedGraphqlType)\n break;\n }\n case GraphQLScalarType:\n case GraphQLNonNull: {\n properties = this.definitionPropsFromNestedObj(field) || []\n break;\n }\n case GraphQLUnionType: {\n properties = gqlUnionToUniformDefinitionProperties(this.ctx, graphqlTypeFlat as GraphQLUnionType)\n break;\n }\n }\n\n const resp = propsUniformify(\n this.ctx,\n field,\n properties,\n )\n\n if (graphqlTypeFlat) {\n const nestedType = graphqlTypeFlat as NestedGraphqlType\n nestedType.__definitionProperties = resp.properties\n }\n\n if (parent) {\n parent.__definitionProperties = resp.properties\n }\n\n return resp\n }\n\n // TODO: fix any + another more safety solution?\n // definitionPropsFromNestedObj converts graphql nested obj into xyd 'uniform' definition properties\n private definitionPropsFromNestedObj(obj: any): DefinitionProperty[] | null {\n if (!obj) {\n return null\n }\n if (obj.getFields) {\n return this.nestedProperties(obj)\n }\n\n if (obj.ofType) {\n return this.definitionPropsFromNestedObj(obj.ofType)\n }\n\n if (obj.type) {\n return this.definitionPropsFromNestedObj(obj.type)\n }\n\n return null\n }\n\n // deepFieldMap iterates over GraphQL field (field or input fields) maps\n private deepFieldMap(\n fieldsMap: GraphQLFieldMap<any, any> | GraphQLInputFieldMap,\n parent: NestedGraphqlType\n ): DefinitionProperty[] {\n const properties: DefinitionProperty[] = []\n\n for (const [name, field] of Object.entries(fieldsMap)) {\n const prop = this.convert(\n field,\n parent\n )\n\n if (prop) {\n properties.push(prop)\n }\n }\n\n return properties\n }\n\n // nestedProperties get fields from object or input object types and iterates over them\n private nestedProperties(objectType: NestedGraphqlType) {\n // Check if we've already processed this type to prevent circular dependencies\n if (this.ctx.processedTypes.has(objectType)) {\n if (objectType?.__definitionProperties) {\n return objectType.__definitionProperties || []\n }\n\n return [] // Return empt array for already processed types to break the cycle\n }\n\n // Mark this type as being processed\n this.ctx.processedTypes.add(objectType)\n\n const nestedFields = objectType?.getFields?.()\n const result = this.deepFieldMap(nestedFields, objectType)\n\n return result\n }\n}\n\n","import {\n GraphQLArgument,\n GraphQLEnumType,\n GraphQLEnumValue,\n GraphQLInputObjectType,\n GraphQLInterfaceType,\n GraphQLObjectType,\n GraphQLScalarType,\n GraphQLUnionType,\n GraphQLField,\n GraphQLInputField,\n GraphQLNamedType,\n\n isIntrospectionType,\n isSpecifiedScalarType, GraphQLNonNull,\n GraphQLList\n} from \"graphql\";\nimport GithubSlugger from 'github-slugger';\n\nimport {\n Definition,\n DefinitionProperty,\n DefinitionPropertyMeta,\n ExampleGroup,\n Reference,\n ReferenceCategory,\n ReferenceType\n} from \"@xyd-js/uniform\";\n\nimport {GQLTypeInfo, GQLOperation} from \"./types\";\nimport {gqlFieldToUniformDefinitionProperty} from \"./converters/gql-field\";\nimport {Context} from \"./context\";\nimport {openDocsCanonical, openDocsToGroup} from \"./opendocs\";\n\nexport type GraphqlUniformReferenceType =\n | GraphQLScalarType\n | GraphQLObjectType\n | GraphQLInterfaceType\n | GraphQLUnionType\n | GraphQLEnumType\n | GraphQLInputObjectType\n | GQLOperation\n | GraphQLField<any, any> | GraphQLInputField | GraphQLArgument\n\nexport function extractScopesFromDocDirective(\n ctx: Context,\n gqlType: GraphqlUniformReferenceType,\n): string[] {\n const scopes: string[] = []\n\n const schema = ctx?.schema\n\n if (gqlType.astNode?.directives) {\n for (const directive of gqlType.astNode.directives) {\n if (directive.name.value === \"doc\") {\n const scopesArg = directive.arguments?.find(arg => arg.name.value === 'scopes')\n if (scopesArg?.value.kind === 'ListValue') {\n for (const scopeValue of scopesArg.value.values) {\n if (scopeValue.kind === 'EnumValue') {\n // For enum values, we need to find the enum type and its value with @scope directive\n let enumType: GraphQLEnumType | undefined\n\n // First check if current type is an enum\n if (gqlType instanceof GraphQLEnumType) {\n enumType = gqlType\n }\n // If not and we have a schema, try to find the enum type\n else if (schema) {\n const type = schema.getType('OpenDocsScope')\n if (type instanceof GraphQLEnumType) {\n enumType = type\n }\n }\n\n if (enumType) {\n const enumValue = enumType.getValue(scopeValue.value)\n if (enumValue?.astNode?.directives) {\n for (const enumDirective of enumValue.astNode.directives) {\n if (enumDirective.name.value === 'scope') {\n const valueArg = enumDirective.arguments?.find(arg => arg.name.value === 'value')\n if (valueArg?.value.kind === 'StringValue') {\n scopes.push(valueArg.value.value)\n }\n }\n }\n }\n }\n } else if (scopeValue.kind === 'StringValue') {\n // Handle string literal (e.g. \"user:write\")\n scopes.push(scopeValue.value)\n }\n }\n }\n }\n }\n }\n\n return scopes\n}\n\nexport function uniformify(\n ctx: Context,\n gqlType: GraphqlUniformReferenceType,\n definitions: Definition[],\n examples: ExampleGroup[],\n): Reference {\n let canonicalPrefix = \"\"\n let graphqlTypeShort = \"\"\n let refType: ReferenceType | undefined = undefined\n\n if (gqlType instanceof GraphQLScalarType) {\n canonicalPrefix = \"scalars\"\n graphqlTypeShort = \"scalar\"\n refType = ReferenceType.GRAPHQL_SCALAR\n } else if (gqlType instanceof GraphQLObjectType) {\n canonicalPrefix = \"objects\"\n graphqlTypeShort = \"object\"\n refType = ReferenceType.GRAPHQL_OBJECT\n } else if (gqlType instanceof GraphQLInterfaceType) {\n canonicalPrefix = \"interfaces\"\n graphqlTypeShort = \"interface\"\n refType = ReferenceType.GRAPHQL_INTERFACE\n } else if (gqlType instanceof GraphQLUnionType) {\n canonicalPrefix = \"unions\"\n graphqlTypeShort = \"union\"\n refType = ReferenceType.GRAPHQL_UNION\n } else if (gqlType instanceof GraphQLEnumType) {\n canonicalPrefix = \"enums\"\n graphqlTypeShort = \"enum\"\n refType = ReferenceType.GRAPHQL_ENUM\n } else if (gqlType instanceof GraphQLInputObjectType) {\n canonicalPrefix = \"inputs\"\n graphqlTypeShort = \"input\"\n refType = ReferenceType.GRAPHQL_INPUT\n } else if (gqlType instanceof GQLOperation) {\n switch (gqlType._operationType) {\n case \"query\": {\n canonicalPrefix = \"queries\"\n graphqlTypeShort = \"query\"\n refType = ReferenceType.GRAPHQL_QUERY\n break;\n }\n case \"mutation\": {\n canonicalPrefix = \"mutations\"\n graphqlTypeShort = \"mutation\"\n refType = ReferenceType.GRAPHQL_MUTATION\n break;\n }\n case \"subscription\": {\n canonicalPrefix = \"subscriptions\"\n graphqlTypeShort = \"subscription\"\n refType = ReferenceType.GRAPHQL_SUBSCRIPTION\n break;\n }\n }\n } else {\n const info = gqlFieldTypeInfo(gqlType)\n if (info?.typeFlat && !isBuiltInType(info?.typeFlat)) {\n if (info?.typeFlat) {\n return uniformify(ctx, info.typeFlat, definitions, examples)\n }\n }\n }\n\n const slugger = new GithubSlugger();\n // const slug = slugger.slug(gqlType.name);\n const slug = gqlType.name;\n\n const odCanonical = openDocsCanonical(ctx, gqlType);\n\n let canonical = \"\"\n if (odCanonical) {\n canonical = odCanonical;\n } else if (canonicalPrefix) {\n canonical = [canonicalPrefix, slug].join(\"/\")\n }\n\n const scopes = extractScopesFromDocDirective(ctx, gqlType) || []\n return {\n title: gqlType.name,\n description: gqlType.description || \"\",\n canonical,\n\n category: ReferenceCategory.GRAPHQL,\n type: refType,\n\n context: {\n graphqlTypeShort: graphqlTypeShort,\n graphqlName: gqlType.name,\n group: openDocsToGroup(ctx, gqlType),\n scopes\n },\n\n examples: {\n groups: examples || [],\n },\n\n definitions,\n }\n}\n\nexport function propsUniformify(\n ctx: Context,\n field: GraphQLField<any, any> | GraphQLInputField | GraphQLArgument,\n properties?: DefinitionProperty[],\n meta?: DefinitionPropertyMeta[]\n): DefinitionProperty {\n const fieldInfo = gqlFieldTypeInfo(field);\n const objRef = uniformify(ctx, field, [], []);\n\n const builtInType = fieldInfo?.typeFlat ? isBuiltInType(fieldInfo?.typeFlat) : undefined\n\n return {\n name: field.name,\n type: field.type.toJSON(),\n description: field.description || \"\",\n context: {\n graphqlName: field.name,\n graphqlTypeFlat: fieldInfo.typeFlat?.toJSON() || \"\",\n graphqlBuiltInType: builtInType,\n },\n properties: properties || [],\n meta: [\n ...gqlFieldToUniformMeta(field),\n ...(meta || []),\n ],\n symbolDef: {\n canonical: objRef?.canonical,\n },\n }\n}\n\nexport function gqlObjectPropsUniformify(\n ctx: Context,\n obj: GraphQLInputObjectType | GraphQLObjectType,\n meta?: DefinitionPropertyMeta[]\n): DefinitionProperty {\n const objRef = uniformify(ctx, obj, [], []);\n const inputFields = obj.getFields?.()\n const nestedProps: DefinitionProperty[] = []\n\n const nestedDefinitionProperty: DefinitionProperty = {\n name: obj.name,\n type: obj.toJSON(),\n description: obj.description || \"\",\n context: objRef.context,\n properties: nestedProps,\n meta: [\n ...(meta || []),\n ],\n symbolDef: {\n canonical: objRef.canonical,\n },\n }\n\n if (!ctx?.config?.flatArg) {\n for (const [name, inputField] of Object.entries(inputFields)) {\n const prop = gqlFieldToUniformDefinitionProperty(\n ctx,\n inputField,\n )\n\n if (prop) {\n nestedProps.push(prop)\n }\n }\n }\n\n return nestedDefinitionProperty\n}\n\nexport function gqlFieldToUniformMeta(\n field: GraphQLField<any, any> | GraphQLInputField | GraphQLArgument\n): DefinitionPropertyMeta[] {\n const meta: DefinitionPropertyMeta[] = []\n\n // Check if field is required (non-null)\n if (isNonNullField(field.type) || isListOfNonNullItems(field.type)) {\n meta.push({\n name: \"required\",\n value: \"true\"\n })\n }\n\n // Handle directives\n if (field.astNode?.directives) {\n for (const directive of field.astNode.directives) {\n // Handle @deprecated directive\n if (directive.name.value === \"deprecated\") {\n let foundDeprecatedReason = false\n for (const arg of directive.arguments || []) {\n if (arg.name.value === \"reason\") {\n foundDeprecatedReason = true\n meta.push({\n name: \"deprecated\",\n value: arg.value.kind === 'StringValue' ? arg.value.value : \"true\"\n })\n }\n }\n\n if (!foundDeprecatedReason) {\n meta.push({\n name: \"deprecated\",\n value: \"true\"\n })\n }\n }\n }\n }\n\n if (\"defaultValue\" in field && field.defaultValue !== undefined) {\n meta.push({\n name: \"defaults\",\n value: field.defaultValue\n })\n }\n\n return meta\n}\n\nexport function gqlFieldTypeInfo(\n field: GraphQLField<any, any> | GraphQLInputField\n): GQLTypeInfo {\n const getTypeInfo = (type: any): GraphQLNamedType | undefined => {\n if (!type) return undefined;\n\n // Handle non-null types\n if (type instanceof GraphQLNonNull) {\n return getTypeInfo(type.ofType);\n }\n\n\n if (type instanceof GraphQLList) {\n return getTypeInfo(type.ofType);\n }\n\n // Return the actual type\n return type;\n };\n\n const graphqlTypeFlat = getTypeInfo(field.type);\n\n return {\n typeFlat: graphqlTypeFlat\n }\n}\n\nexport function isBuiltInType(gqlType: GraphQLNamedType): boolean {\n return isSpecifiedScalarType(gqlType) || isIntrospectionType(gqlType)\n}\n\n// TODO: fix any\nfunction isNonNullField(type: any): boolean {\n return type.constructor.name === \"GraphQLNonNull\"\n}\n\n// TODO: fix any\nfunction isListOfNonNullItems(type: any): boolean {\n return \"ofType\" in type &&\n type.constructor.name === \"GraphQLList\" &&\n type.ofType.constructor.name === \"GraphQLNonNull\"\n}","import {\n GraphQLSchema,\n GraphQLArgument,\n GraphQLEnumType,\n GraphQLEnumValue,\n GraphQLField,\n GraphQLInputObjectType,\n GraphQLInterfaceType,\n GraphQLObjectType,\n GraphQLScalarType,\n GraphQLUnionType,\n ConstValueNode,\n StringValueNode,\n} from \"graphql\";\n\nimport {GQLOperation, GQLSchemaToReferencesOptions, SortItem} from \"./types\";\nimport {GraphqlUniformReferenceType} from \"./gql-core\";\nimport {Context} from \"./context\";\n\nexport const OPEN_DOCS_SCHEMA_DIRECTIVE_NAME = \"docs\";\nexport const OPEN_DOCS_DIRECTIVE_NAME = \"doc\";\n\nexport function openDocsExtensionsToOptions(\n schema: GraphQLSchema,\n) {\n const options: GQLSchemaToReferencesOptions = {}\n\n // Check for @docs directive in schema extensions\n for (const extension of schema.extensionASTNodes || []) {\n if (extension.kind === 'SchemaExtension') {\n for (const directive of extension.directives || []) {\n if (directive.name.value === OPEN_DOCS_SCHEMA_DIRECTIVE_NAME) {\n for (const arg of directive.arguments || []) {\n if (arg.name.value === 'flattenTypes' && arg.value.kind === 'BooleanValue') {\n if (arg.value.value === true) {\n options.flat = true\n } else if (arg.value.value === false) {\n options.flat = false\n }\n } else if (arg.name.value === 'sort' && arg.value.kind === 'ListValue') {\n const sortItems: SortItem[] = [];\n for (const item of arg.value.values) {\n if (item.kind === 'ObjectValue') {\n const sortItem: SortItem = {};\n for (const field of item.fields) {\n if (field.name.value === 'node' && field.value.kind === 'StringValue') {\n sortItem.node = field.value.value;\n } else if (field.name.value === 'group' && field.value.kind === 'ListValue') {\n sortItem.group = field.value.values\n .filter((v): v is StringValueNode => v.kind === 'StringValue')\n .map(v => v.value);\n } else if (field.name.value === 'stack' && field.value.kind === 'IntValue') {\n sortItem.stack = parseInt(field.value.value);\n }\n }\n sortItems.push(sortItem);\n }\n }\n if (!options.sort) {\n options.sort = {};\n }\n options.sort.sort = sortItems;\n } else if (arg.name.value === 'sortStack' && arg.value.kind === 'ListValue') {\n const sortStacks: string[][] = [];\n for (const item of arg.value.values) {\n if (item.kind === 'ListValue') {\n const stack = item.values\n .filter((v): v is StringValueNode => v.kind === 'StringValue')\n .map(v => v.value);\n sortStacks.push(stack);\n }\n }\n if (!options.sort) {\n options.sort = {};\n }\n options.sort.sortStack = sortStacks;\n } else if (arg.name.value === 'route' && arg.value.kind === 'StringValue') {\n options.route = arg.value.value;\n }\n }\n }\n }\n }\n }\n\n return options;\n}\n\ntype OpenDocsGQLNode =\n | GQLOperation\n | GraphQLScalarType\n | GraphQLObjectType\n | GraphQLField<any, any>\n | GraphQLArgument\n | GraphQLInterfaceType\n | GraphQLUnionType\n | GraphQLEnumType\n | GraphQLEnumValue\n | GraphQLInputObjectType\n\nexport function openDocsToGroup(\n ctx: Context | undefined,\n odGqlNode: OpenDocsGQLNode,\n): string[] {\n let groups: string[] = []\n\n const metadata = (ctx?.schema as any).__metadata;\n\n if (metadata?.rootGroups) {\n groups = [...metadata.rootGroups];\n }\n\n let directiveGroups = false\n\n // Check schema metadata for field-specific groups (for operations)\n if (ctx?.schema && 'name' in odGqlNode) {\n const metadata = (ctx.schema as any).__metadata;\n if (metadata?.fields) {\n if (\"_operationType\" in odGqlNode) {\n let fieldKey = \"\"\n\n switch (odGqlNode._operationType) {\n case \"query\": {\n fieldKey = `Query.${odGqlNode.name}`;\n break;\n }\n case \"mutation\": {\n fieldKey = `Mutation.${odGqlNode.name}`;\n break;\n }\n case \"subscription\": {\n fieldKey = `Subscription.${odGqlNode.name}`;\n break;\n }\n }\n\n const fieldMetadata = metadata.fields.get(fieldKey);\n if (fieldMetadata?.groups) {\n directiveGroups = true\n groups.push(...fieldMetadata.groups);\n }\n }\n }\n }\n\n // If no groups from metadata, try getting groups from the node itself\n if (!directiveGroups && odGqlNode.astNode?.directives) {\n for (const directive of odGqlNode.astNode.directives) {\n switch (directive.name.value) {\n case OPEN_DOCS_DIRECTIVE_NAME: {\n const groupArg = directive.arguments?.find((arg: {\n name: { value: string }\n }) => arg.name.value === 'group')\n if (groupArg?.value.kind === 'ListValue') {\n directiveGroups = true\n groups.push(...groupArg.value.values\n .filter((v: ConstValueNode): v is StringValueNode => v.kind === 'StringValue')\n .map(v => v.value)\n )\n }\n break\n }\n }\n }\n }\n\n // If still no groups, use default based on type\n if (!directiveGroups) {\n if (odGqlNode instanceof GraphQLObjectType) {\n groups.push(\"Objects\")\n } else if (odGqlNode instanceof GraphQLInterfaceType) {\n groups.push(\"Interfaces\")\n } else if (odGqlNode instanceof GraphQLUnionType) {\n groups.push(\"Unions\")\n } else if (odGqlNode instanceof GraphQLEnumType) {\n groups.push(\"Enums\")\n } else if (odGqlNode instanceof GraphQLInputObjectType) {\n groups.push(\"Inputs\")\n } else if (odGqlNode instanceof GraphQLScalarType) {\n groups.push(\"Scalars\")\n } else if (odGqlNode instanceof GQLOperation) {\n switch (odGqlNode._operationType) {\n case \"query\": {\n groups.push(\"Queries\")\n break;\n }\n case \"mutation\": {\n groups.push(\"Mutations\")\n break;\n }\n case \"subscription\": {\n groups.push(\"Subscriptions\")\n break;\n }\n }\n }\n }\n\n return groups\n}\n\nexport function openDocsCanonical(\n ctx: Context,\n gqlType: GraphqlUniformReferenceType,\n) {\n let path = \"\"\n\n // Get parent path if this is a field\n if ('astNode' in gqlType && gqlType.astNode?.kind === 'FieldDefinition' && ctx?.schema) {\n // Check schema metadata for field-specific path\n const metadata = (ctx.schema as any).__metadata;\n if (metadata?.fields && 'name' in gqlType) {\n if (\"_operationType\" in gqlType) {\n let fieldKey = \"\"\n\n switch (gqlType._operationType) {\n case \"query\": {\n fieldKey = `Query.${gqlType.name}`;\n break;\n }\n case \"mutation\": {\n fieldKey = `Mutation.${gqlType.name}`;\n break;\n }\n case \"subscription\": {\n fieldKey = `Subscription.${gqlType.name}`;\n break;\n }\n }\n const fieldMetadata = metadata.fields.get(fieldKey);\n\n\n if (fieldMetadata?.path) {\n path = fieldMetadata.path;\n }\n }\n }\n }\n\n // Extract path from @doc directive if present\n if (!path && gqlType.astNode?.directives) {\n for (const directive of gqlType.astNode.directives) {\n if (directive.name.value === OPEN_DOCS_DIRECTIVE_NAME) {\n const pathArg = directive.arguments?.find(arg => arg.name.value === 'path')\n if (pathArg?.value.kind === 'StringValue') {\n path = pathArg.value.value\n }\n }\n }\n }\n\n return path\n}\n","import {GraphQLUnionType} from \"graphql\";\n\nimport {Definition, DefinitionProperty, Reference} from \"@xyd-js/uniform\";\n\nimport {gqlObjectToUniformDefinitionProperty} from \"./gql-object\";\nimport {uniformify} from \"../gql-core\";\nimport {Context} from \"../context\";\n\nexport function gqlUnionToUniformRef(ctx: Context, unionType: GraphQLUnionType): Reference {\n const properties = gqlUnionToUniformDefinitionProperties(ctx, unionType)\n\n const definitions: Definition[] = [\n {\n title: \"Possible types\",\n properties,\n }\n ]\n\n return uniformify(\n ctx,\n unionType,\n definitions,\n []\n )\n}\n\nexport function gqlUnionToUniformDefinitionProperties(\n ctx: Context,\n unionType: GraphQLUnionType\n): DefinitionProperty[] {\n return unionType.getTypes().map(type => {\n if (type.constructor.name === \"GraphQLObjectType\") {\n return gqlObjectToUniformDefinitionProperty(\n ctx,\n type,\n )\n }\n return []\n }).flat()\n}","import {GraphQLArgument, GraphQLInputObjectType} from \"graphql\";\n\nimport {DefinitionProperty} from \"@xyd-js/uniform\";\n\nimport {gqlInputToUniformDefinitionProperty} from \"./gql-input\";\nimport {Context} from \"../context\";\nimport {gqlFieldToUniformMeta, gqlFieldTypeInfo, propsUniformify} from \"../gql-core\";\n\n// gqlArgToUniformDefinitionProperty converts GraphQL arguments into xyd 'uniform' definition properties\nexport function gqlArgToUniformDefinitionProperty(\n ctx: Context,\n args: readonly GraphQLArgument[],\n): DefinitionProperty[] {\n const resp: DefinitionProperty[] = []\n\n args.forEach(arg => {\n const fieldInfo = gqlFieldTypeInfo(arg);\n if (!fieldInfo.typeFlat) {\n console.error(\"gqlArgToUniformDefinitionProperty: no typeFlat for\", arg.name);\n return;\n }\n\n const flatType = fieldInfo.typeFlat\n\n if (flatType instanceof GraphQLInputObjectType) {\n const inputObj = flatType\n const meta = gqlFieldToUniformMeta(arg)\n const defProperty = gqlInputToUniformDefinitionProperty(\n ctx,\n inputObj,\n )\n\n resp.push({\n ...defProperty,\n type: arg.type.toJSON(),\n name: arg.name,\n description: arg.description || \"\",\n meta: [\n ...defProperty.meta || [],\n ...meta || []\n ],\n });\n } else {\n const defProperty = propsUniformify(ctx, arg)\n resp.push(defProperty)\n }\n });\n\n return resp;\n}\n\n","import {GraphQLInputObjectType} from \"graphql\";\n\nimport {Reference} from \"@xyd-js/uniform\";\n\nimport {gqlObjectPropsUniformify, uniformify} from \"../gql-core\";\nimport {Context} from \"../context\";\n\n// gqlInputToUniformRef is a helper function to convert a GraphQL input object type into a 'uniform' reference.\nexport function gqlInputToUniformRef(ctx: Context, gqlType: GraphQLInputObjectType): Reference {\n const prop = gqlInputToUniformDefinitionProperty(\n ctx,\n gqlType,\n )\n\n return uniformify(\n ctx,\n gqlType,\n [\n {\n title: \"Fields\",\n properties: prop.properties || []\n }\n ],\n []\n )\n}\n\n// gqlInputToUniformDefinitionProperty is a helper function to convert a GraphQL input object into a xyd definition property.\nexport function gqlInputToUniformDefinitionProperty(\n ctx: Context,\n obj: GraphQLInputObjectType,\n) {\n return gqlObjectPropsUniformify(ctx, obj)\n}","import {GraphQLObjectType} from \"graphql\";\n\nimport {Definition, DefinitionProperty, DefinitionVariant} from \"@xyd-js/uniform\";\n\nimport {gqlFieldToUniformDefinitionProperty} from \"./gql-field\";\nimport {gqlObjectPropsUniformify, uniformify} from \"../gql-core\";\nimport {Context} from \"../context\";\nimport {gqlArgToUniformDefinitionProperty} from \"./gql-arg\";\n\n// gqlObjectToUniformRef is a helper function to convert a GraphQL object type into a 'uniform' reference.\nexport function gqlObjectToUniformRef(\n ctx: Context,\n gqlType: GraphQLObjectType\n) {\n const definitions: Definition[] = []\n const graphqlFields: DefinitionProperty[] = []\n\n const variants: DefinitionVariant[] = []\n\n const argumentDefinition: Definition = {\n title: \"Arguments\",\n properties: [],\n variants,\n meta: [\n {\n name: \"type\",\n value: \"arguments\",\n },\n ]\n }\n\n for (const [name, field] of Object.entries(gqlType.getFields())) {\n if (!field?.args?.length) {\n continue;\n }\n\n const args = gqlArgToUniformDefinitionProperty(ctx, field.args)\n\n variants.push({\n title: \"\",\n properties: args,\n meta: [\n {\n name: \"symbolName\",\n value: name,\n }\n ]\n })\n }\n definitions.push(argumentDefinition)\n\n for (const [name, field] of Object.entries(gqlType.getFields())) {\n const prop = gqlFieldToUniformDefinitionProperty(ctx, field)\n\n graphqlFields.push(prop)\n }\n\n definitions.push({\n title: \"Fields\",\n properties: graphqlFields,\n meta: [\n {\n name: \"type\",\n value: \"fields\",\n }\n ]\n })\n\n return uniformify(\n ctx,\n gqlType,\n definitions,\n []\n )\n}\n\n// gqlObjectToUniformDefinitionProperty is a helper function to convert a GraphQL object type into a xyd definition property.\nexport function gqlObjectToUniformDefinitionProperty(\n ctx: Context,\n obj: GraphQLObjectType,\n) {\n return gqlObjectPropsUniformify(ctx, obj)\n}","import {GraphQLEnumType} from \"graphql\";\n\nimport type {DefinitionProperty, Reference} from \"@xyd-js/uniform\";\nimport {uniformify} from \"../gql-core\";\nimport {NestedGraphqlType} from \"../types\";\nimport {Context} from \"../context\";\n\n// gqlEnumToUniformRef is a helper function to convert a GraphQL enum type into a 'uniform' reference.\nexport function gqlEnumToUniformRef(ctx: Context, gqlType: GraphQLEnumType): Reference {\n const props: DefinitionProperty[] = gqlType.getValues().map(value => ({\n name: value.name,\n type: \"string\", // TODO: other types?\n description: value.description || \"\",\n }))\n\n return uniformify(\n ctx,\n gqlType,\n [\n {\n title: \"Valid values\",\n properties: props\n }\n ],\n [],\n )\n}","import {GraphQLScalarType} from \"@graphql-markdown/types\";\n\nimport type {Reference} from \"@xyd-js/uniform\";\n\nimport {uniformify} from \"../gql-core\";\nimport {Context} from \"../context\";\n\n// gqlScalarToUniformRef is a helper function to convert a GraphQL scalar type into a 'uniform' reference.\nexport function gqlScalarToUniformRef(ctx: Context, gqlType: GraphQLScalarType): Reference {\n return uniformify(\n ctx,\n gqlType,\n [],\n []\n )\n}\n","import {GraphQLInterfaceType, GraphQLField} from \"graphql\";\n\nimport {Definition, DefinitionProperty, Reference} from \"@xyd-js/uniform\";\n\nimport {gqlFieldToUniformDefinitionProperty} from \"./gql-field\";\nimport {uniformify} from \"../gql-core\";\nimport {NestedGraphqlType} from \"../types\";\nimport {Context} from \"../context\";\n\nexport function gqlInterfaceToUniformRef(ctx: Context, interfaceType: GraphQLInterfaceType): Reference {\n const properties = gqlInterfaceToUniformDefinitionProperties(ctx, interfaceType)\n\n const definitions: Definition[] = [\n {\n title: \"Fields\",\n properties,\n }\n ]\n\n return uniformify(\n ctx,\n interfaceType,\n definitions,\n []\n )\n}\n\nexport function gqlInterfaceToUniformDefinitionProperties(ctx: Context, interfaceType: GraphQLInterfaceType): DefinitionProperty[] {\n return Object.values(interfaceType.getFields()).map((field: GraphQLField<any, any>) => {\n return gqlFieldToUniformDefinitionProperty(\n ctx,\n field,\n )\n })\n} ","import { GraphQLSchema } from \"graphql\";\nimport {GQLSchemaToReferencesOptions, NestedGraphqlType} from \"./types\";\n\nexport class Context {\n constructor(\n public processedTypes: Set<NestedGraphqlType> = new Set(),\n public globalOptions?: GQLSchemaToReferencesOptions,\n public config?: {\n flatReturn?: boolean,\n flat?: boolean,\n flatArg?: boolean,\n },\n public schema?: GraphQLSchema\n ) {\n }\n}\n\n","import type {GraphQLSchema} from \"graphql\";\nimport {OperationTypeNode} from \"graphql\";\n\nimport {Reference, ReferenceType} from \"@xyd-js/uniform\";\n\nimport type {GQLSchemaToReferencesOptions} from \"../types\";\nimport {filterFieldsByRegions} from \"../utils\";\nimport {gqlOperationToUniformRef} from \"./gql-operation\";\n\nexport function graphqlQueriesToUniformReferences(\n schema: GraphQLSchema,\n options?: GQLSchemaToReferencesOptions,\n): Reference[] {\n const references: Reference[] = []\n\n const queries = schema.getRootType(OperationTypeNode.QUERY)\n const queryFields = queries?.getFields?.()\n\n if (queryFields) {\n // Filter query fields based on regions if provided\n const filteredQueryFields = filterFieldsByRegions(\n queryFields,\n \"query\",\n options?.regions\n );\n\n references.push(...gqlOperationToUniformRef(\n ReferenceType.GRAPHQL_QUERY,\n filteredQueryFields,\n schema,\n options\n ))\n }\n\n return references;\n}","/**\n * Helper function to filter fields based on region patterns\n * @param fields - The fields to filter\n * @param prefix - The prefix for the region key (e.g., \"Query\" or \"Mutation\")\n * @param regions - The regions to filter by\n * @returns Filtered fields object\n */\nexport function filterFieldsByRegions<T>(\n fields: Record<string, T>,\n prefix: string,\n regions?: string[]\n): Record<string, T> {\n if (!regions || regions.length === 0) {\n return fields;\n }\n\n const filteredFields: Record<string, T> = {};\n for (const [fieldName, field] of Object.entries(fields)) {\n const regionKey = `${prefix}.${fieldName}`;\n if (regions.some(region => region === regionKey)) {\n filteredFields[fieldName] = field;\n }\n }\n return filteredFields;\n}","import { GraphQLFieldMap, GraphQLSchema, OperationTypeNode } from \"graphql\";\nimport { Definition, Example, Reference, ReferenceType, } from \"@xyd-js/uniform\";\n\nimport { type GQLSchemaToReferencesOptions, GQLOperation } from \"../types\";\nimport { gqlArgToUniformDefinitionProperty } from \"./gql-arg\";\nimport { gqlFieldToUniformDefinitionProperty } from \"./gql-field\";\nimport { simpleGraphqlExample } from \"./gql-sample\";\nimport { uniformify } from \"../gql-core\";\nimport { Context } from \"../context\";\n\n// gqlOperationToUniformRef is a helper function to create a list of xyd reference for a GraphQL operation (query or mutation).\nexport function gqlOperationToUniformRef(\n operationType: ReferenceType.GRAPHQL_MUTATION | ReferenceType.GRAPHQL_QUERY | ReferenceType.GRAPHQL_SUBSCRIPTION,\n fieldsMap: GraphQLFieldMap<any, any>,\n schema: GraphQLSchema,\n options?: GQLSchemaToReferencesOptions,\n) {\n const references: Reference[] = []\n\n for (const [operationName, operationField] of Object.entries(fieldsMap)) {\n const definitions: Definition[] = []\n let flatReturn = false\n let flat = false\n let argFlat = false\n\n if (options?.flat) {\n flatReturn = true\n flat = true\n argFlat = true\n }\n\n const args = gqlArgToUniformDefinitionProperty(new Context(\n new Set(),\n options,\n {\n flat,\n flatArg: argFlat,\n },\n schema\n ), operationField.args)\n\n\n const returns = gqlFieldToUniformDefinitionProperty(new Context(\n new Set(),\n options,\n {\n flatReturn\n },\n schema\n ), operationField)\n let returnProperties = returns.properties || []\n if (options?.flat) {\n returnProperties = [returns]\n }\n\n definitions.push({\n title: \"Arguments\",\n properties: args,\n })\n definitions.push({\n title: \"Returns\",\n properties: returnProperties,\n })\n\n const exampleQuery = simpleGraphqlExample(\n operationType,\n operationName,\n args,\n returnProperties\n )\n\n const examples: Example[] = [\n {\n codeblock: {\n tabs: [\n {\n title: \"\",\n language: \"graphql\",\n code: exampleQuery,\n }\n ]\n }\n }\n ]\n\n const exampleGroup = {\n description: \"\",\n examples,\n }\n\n const operation = new GQLOperation(operationField)\n switch (operationType) {\n case ReferenceType.GRAPHQL_QUERY: {\n operation.__operationType = OperationTypeNode.QUERY;\n break;\n }\n case ReferenceType.GRAPHQL_MUTATION: {\n operation.__operationType = OperationTypeNode.MUTATION;\n break;\n }\n case ReferenceType.GRAPHQL_SUBSCRIPTION: {\n operation.__operationType = OperationTypeNode.SUBSCRIPTION;\n break;\n }\n default: {\n console.error(`Invalid operation type: ${operationType}`);\n }\n }\n\n const ref = uniformify(\n new Context(\n new Set(),\n options,\n {},\n schema\n ),\n operation,\n definitions,\n [exampleGroup]\n )\n \n if (ref) {\n references.push(ref)\n }\n }\n\n return references\n}","import {\n Kind,\n print,\n OperationTypeNode,\n ASTNode,\n ArgumentNode,\n TypeNode,\n ValueNode,\n VariableDefinitionNode,\n} from 'graphql';\n\nimport {\n DefinitionProperty,\n ReferenceType\n} from \"@xyd-js/uniform\";\n\nconst operationTypeToTypeNode = {\n [ReferenceType.GRAPHQL_QUERY]: OperationTypeNode.QUERY,\n [ReferenceType.GRAPHQL_MUTATION]: OperationTypeNode.MUTATION,\n [ReferenceType.GRAPHQL_SUBSCRIPTION]: OperationTypeNode.SUBSCRIPTION,\n}\n\n// simpleGraphqlExample is a helper function to create a simple GraphQL example query or mutation.\nexport function simpleGraphqlExample(\n operationType: ReferenceType.GRAPHQL_QUERY | ReferenceType.GRAPHQL_MUTATION | ReferenceType.GRAPHQL_SUBSCRIPTION,\n operationName: string,\n args: DefinitionProperty[],\n returns: DefinitionProperty[],\n) {\n // Filter required arguments or take first one if no required args\n const requiredArgs = args.filter(arg => arg.meta?.some(m => m.name === 'required' && m.value === 'true'));\n const selectedArgs = requiredArgs.length > 0 ? requiredArgs : args.slice(0, 1);\n\n let hasArgVars = false\n\n const argDefaults = selectedArgs.reduce<Record<string, ArgumentNode>>((acc, arg) => {\n if (operationType != ReferenceType.GRAPHQL_QUERY) {\n return acc; // Skip for mutations, as we use variables\n }\n\n let defaultValue: string = \"\"\n\n const getDefaultValue = arg.meta?.find(m => m.name === 'defaults')?.value\n if (getDefaultValue && typeof getDefaultValue !== 'string') {\n defaultValue = JSON.stringify(getDefaultValue)\n }\n\n let sampleValue: ValueNode | undefined = undefined;\n\n switch (arg.context?.graphqlTypeFlat) {\n case 'String':\n sampleValue = {kind: Kind.STRING, value: defaultValue || `example-${arg.name}`};\n break;\n case 'Int':\n case 'Float':\n sampleValue = {kind: Kind.INT, value: defaultValue || '0'};\n break;\n case 'Boolean':\n sampleValue = {kind: Kind.BOOLEAN, value: defaultValue === 'true'};\n break;\n }\n\n // For queries, use direct values; for mutations, use variables\n if (sampleValue) {\n return {\n ...acc,\n [arg.name]: {\n kind: Kind.ARGUMENT,\n name: {kind: Kind.NAME, value: arg.name},\n value: sampleValue\n }\n };\n }\n\n return acc;\n }, {});\n\n const allDefaultArgs = Object.keys(argDefaults).length === selectedArgs.length\n\n const argumentsList: ArgumentNode[] = selectedArgs.map(arg => {\n if (allDefaultArgs) {\n return argDefaults[arg.name]\n }\n\n hasArgVars = true\n\n return {\n kind: Kind.ARGUMENT,\n name: {kind: Kind.NAME, value: arg.name},\n value: {\n kind: Kind.VARIABLE,\n name: {kind: Kind.NAME, value: arg.name}\n }\n };\n });\n\n const queryAST: ASTNode = {\n kind: Kind.DOCUMENT,\n definitions: [\n {\n kind: Kind.OPERATION_DEFINITION,\n operation: operationTypeToTypeNode[operationType],\n name: hasArgVars ? {\n kind: Kind.NAME,\n value: operationName\n } : undefined,\n variableDefinitions: hasArgVars ? selectedArgs.map(variableDefinitions) : [],\n selectionSet: {\n kind: Kind.SELECTION_SET,\n selections: [\n {\n kind: Kind.FIELD,\n name: {kind: Kind.NAME, value: operationName},\n arguments: argumentsList,\n selectionSet: {\n kind: Kind.SELECTION_SET,\n selections: [\n {kind: Kind.FIELD, name: {kind: Kind.NAME, value: `# ${operationName} fields`}}\n ]\n }\n }\n ]\n }\n }\n ]\n } as const;\n\n const sampleText = print(queryAST);\n\n return sampleText;\n}\n\nfunction variableDefinitions(arg: DefinitionProperty): VariableDefinitionNode {\n const hasDefault = arg.meta?.some(m => m.name === 'defaults');\n let defaultValue: string = \"\"\n\n const getDefaultValue = arg.meta?.find(m => m.name === 'defaults')?.value\n if (getDefaultValue && typeof getDefaultValue !== 'string') {\n defaultValue = JSON.stringify(getDefaultValue)\n }\n\n return {\n kind: Kind.VARIABLE_DEFINITION,\n variable: {\n kind: Kind.VARIABLE,\n name: {kind: Kind.NAME, value: arg.name}\n },\n type: {\n kind: Kind.NAMED_TYPE,\n name: {kind: Kind.NAME, value: arg.type}\n },\n ...(hasDefault && defaultValue ? {\n defaultValue: {\n kind: Kind.STRING,\n value: defaultValue\n }\n } : {})\n };\n}","import type {GraphQLSchema} from \"graphql\";\nimport {OperationTypeNode} from \"graphql\";\n\nimport {Reference, ReferenceType} from \"@xyd-js/uniform\";\n\nimport type {GQLSchemaToReferencesOptions} from \"../types\";\nimport {filterFieldsByRegions} from \"../utils\";\nimport {gqlOperationToUniformRef} from \"./gql-operation\";\n\nexport function graphqlMutationsToUniformReferences(\n schema: GraphQLSchema,\n options?: GQLSchemaToReferencesOptions,\n) {\n const references: Reference[] = []\n\n const mutations = schema.getRootType(OperationTypeNode.MUTATION)\n const mutationFields = mutations?.getFields?.()\n\n if (mutationFields) {\n // Filter mutation fields based on regions if provided\n const filteredMutationFields = filterFieldsByRegions(\n mutationFields,\n \"mutation\",\n options?.regions\n );\n\n references.push(...gqlOperationToUniformRef(\n ReferenceType.GRAPHQL_MUTATION,\n filteredMutationFields,\n schema,\n options,\n ))\n }\n\n return references;\n}\n","import type {GraphQLSchema} from \"graphql\";\nimport {OperationTypeNode} from \"graphql\";\n\nimport {Reference, ReferenceType} from \"@xyd-js/uniform\";\n\nimport type {GQLSchemaToReferencesOptions} from \"../types\";\nimport {filterFieldsByRegions} from \"../utils\";\nimport {gqlOperationToUniformRef} from \"./gql-operation\";\n\nexport function graphqlSubscriptionsToUniformReferences(\n schema: GraphQLSchema,\n options?: GQLSchemaToReferencesOptions,\n) {\n const references: Reference[] = []\n\n const mutations = schema.getRootType(OperationTypeNode.SUBSCRIPTION)\n const mutationFields = mutations?.getFields?.()\n\n if (mutationFields) {\n // Filter mutation fields based on regions if provided\n const filteredMutationFields = filterFieldsByRegions(\n mutationFields,\n \"mutation\",\n options?.regions\n );\n\n references.push(...gqlOperationToUniformRef(\n ReferenceType.GRAPHQL_SUBSCRIPTION,\n filteredMutationFields,\n schema,\n options,\n ))\n }\n\n return references;\n}\n","directive @scope(value: String!) on ENUM_VALUE\n\nenum OpenDocsScope {\n _PLACEHOLDER_\n}\n\ndirective @docs(\n route: String\n sort: [OpenDocsSortInput!]\n sortStack: [[String!]!]\n flattenTypes: Boolean\n sidebar: [OpenDocsPage]\n group: [String]\n) repeatable on SCHEMA\n\ninput OpenDocsPage {\n type: OpenDocsSidebarItemType!\n key: String!\n group: String\n path: String\n pages: [OpenDocsPage]\n}\n\nenum OpenDocsSidebarItemType {\n OPERATION\n TYPE\n}\n\ndirective @doc(\n group: [String!],\n path: String,\n example: OpenDocsExampleInput,\n scopes: [OpenDocsScope],\n) on QUERY |\n FIELD_DEFINITION |\n MUTATION |\n SUBSCRIPTION |\n OBJECT |\n INPUT_OBJECT |\n ENUM |\n SCALAR |\n UNION\n\n# TODO: finish\ninput OpenDocsExampleInput {\n \"\"\"\n The name of the code\n \"\"\"\n code: String!\n}\n\ninput OpenDocsSortInput {\n node: String\n group: [String!]\n stack: Int\n}"],"mappings":"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","names":["print","isIntrospectionType","isSpecifiedScalarType","GraphQLInputObjectType","GraphQLUnionType","GraphQLObjectType","GraphQLInterfaceType","GraphQLScalarType","GraphQLNonNull","GraphQLEnumType","GraphQLInputObjectType","GraphQLInterfaceType","GraphQLObjectType","GraphQLScalarType","GraphQLUnionType","metadata","GraphQLEnumType","GraphQLScalarType","GraphQLObjectType","GraphQLInterfaceType","GraphQLUnionType","GraphQLInputObjectType","GraphQLObjectType","GraphQLInputObjectType","GraphQLInterfaceType","GraphQLScalarType","GraphQLNonNull","GraphQLUnionType","GraphQLInputObjectType","GraphQLInputObjectType","isSpecifiedScalarType","isIntrospectionType","OperationTypeNode","ReferenceType","OperationTypeNode","ReferenceType","ReferenceType","ReferenceType","OperationTypeNode","OperationTypeNode","ReferenceType","OperationTypeNode","ReferenceType","OperationTypeNode","ReferenceType","OperationTypeNode","ReferenceType","OperationTypeNode","ReferenceType","print"]}
@@ -0,0 +1,56 @@
1
+ directive @scope(value: String!) on ENUM_VALUE
2
+
3
+ enum OpenDocsScope {
4
+ _PLACEHOLDER_
5
+ }
6
+
7
+ directive @docs(
8
+ route: String
9
+ sort: [OpenDocsSortInput!]
10
+ sortStack: [[String!]!]
11
+ flattenTypes: Boolean
12
+ sidebar: [OpenDocsPage]
13
+ group: [String]
14
+ ) repeatable on SCHEMA
15
+
16
+ input OpenDocsPage {
17
+ type: OpenDocsSidebarItemType!
18
+ key: String!
19
+ group: String
20
+ path: String
21
+ pages: [OpenDocsPage]
22
+ }
23
+
24
+ enum OpenDocsSidebarItemType {
25
+ OPERATION
26
+ TYPE
27
+ }
28
+
29
+ directive @doc(
30
+ group: [String!],
31
+ path: String,
32
+ example: OpenDocsExampleInput,
33
+ scopes: [OpenDocsScope],
34
+ ) on QUERY |
35
+ FIELD_DEFINITION |
36
+ MUTATION |
37
+ SUBSCRIPTION |
38
+ OBJECT |
39
+ INPUT_OBJECT |
40
+ ENUM |
41
+ SCALAR |
42
+ UNION
43
+
44
+ # TODO: finish
45
+ input OpenDocsExampleInput {
46
+ """
47
+ The name of the code
48
+ """
49
+ code: String!
50
+ }
51
+
52
+ input OpenDocsSortInput {
53
+ node: String
54
+ group: [String!]
55
+ stack: Int
56
+ }
package/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export {
2
+ gqlSchemaToReferences
3
+ } from "./src"
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@xyd-js/gql",
3
+ "version": "0.1.0-build.170",
4
+ "description": "",
5
+ "main": "./dist/index.js",
6
+ "type": "module",
7
+ "dependencies": {
8
+ "@graphql-tools/merge": "^8.4.0",
9
+ "@graphql-tools/schema": "^10.0.0",
10
+ "github-slugger": "^2.0.0",
11
+ "graphql": "^16.8.1",
12
+ "@xyd-js/uniform": "0.1.0-build.172",
13
+ "@xyd-js/core": "0.1.0-build.170"
14
+ },
15
+ "devDependencies": {
16
+ "rimraf": "^3.0.2",
17
+ "tsup": "^8.3.0",
18
+ "typescript": "^4.5.5",
19
+ "vitest": "^2.1.1"
20
+ },
21
+ "scripts": {
22
+ "clean": "rimraf build",
23
+ "prebuild": "pnpm clean",
24
+ "build": "tsup",
25
+ "build:examples": "tsup --config tsup.examples-config.ts",
26
+ "test": "vitest",
27
+ "ci:test": "vitest run"
28
+ }
29
+ }
package/src/context.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { GraphQLSchema } from "graphql";
2
+ import {GQLSchemaToReferencesOptions, NestedGraphqlType} from "./types";
3
+
4
+ export class Context {
5
+ constructor(
6
+ public processedTypes: Set<NestedGraphqlType> = new Set(),
7
+ public globalOptions?: GQLSchemaToReferencesOptions,
8
+ public config?: {
9
+ flatReturn?: boolean,
10
+ flat?: boolean,
11
+ flatArg?: boolean,
12
+ },
13
+ public schema?: GraphQLSchema
14
+ ) {
15
+ }
16
+ }
17
+
@@ -0,0 +1,51 @@
1
+ import {GraphQLArgument, GraphQLInputObjectType} from "graphql";
2
+
3
+ import {DefinitionProperty} from "@xyd-js/uniform";
4
+
5
+ import {gqlInputToUniformDefinitionProperty} from "./gql-input";
6
+ import {Context} from "../context";
7
+ import {gqlFieldToUniformMeta, gqlFieldTypeInfo, propsUniformify} from "../gql-core";
8
+
9
+ // gqlArgToUniformDefinitionProperty converts GraphQL arguments into xyd 'uniform' definition properties
10
+ export function gqlArgToUniformDefinitionProperty(
11
+ ctx: Context,
12
+ args: readonly GraphQLArgument[],
13
+ ): DefinitionProperty[] {
14
+ const resp: DefinitionProperty[] = []
15
+
16
+ args.forEach(arg => {
17
+ const fieldInfo = gqlFieldTypeInfo(arg);
18
+ if (!fieldInfo.typeFlat) {
19
+ console.error("gqlArgToUniformDefinitionProperty: no typeFlat for", arg.name);
20
+ return;
21
+ }
22
+
23
+ const flatType = fieldInfo.typeFlat
24
+
25
+ if (flatType instanceof GraphQLInputObjectType) {
26
+ const inputObj = flatType
27
+ const meta = gqlFieldToUniformMeta(arg)
28
+ const defProperty = gqlInputToUniformDefinitionProperty(
29
+ ctx,
30
+ inputObj,
31
+ )
32
+
33
+ resp.push({
34
+ ...defProperty,
35
+ type: arg.type.toJSON(),
36
+ name: arg.name,
37
+ description: arg.description || "",
38
+ meta: [
39
+ ...defProperty.meta || [],
40
+ ...meta || []
41
+ ],
42
+ });
43
+ } else {
44
+ const defProperty = propsUniformify(ctx, arg)
45
+ resp.push(defProperty)
46
+ }
47
+ });
48
+
49
+ return resp;
50
+ }
51
+
@@ -0,0 +1,27 @@
1
+ import {GraphQLEnumType} from "graphql";
2
+
3
+ import type {DefinitionProperty, Reference} from "@xyd-js/uniform";
4
+ import {uniformify} from "../gql-core";
5
+ import {NestedGraphqlType} from "../types";
6
+ import {Context} from "../context";
7
+
8
+ // gqlEnumToUniformRef is a helper function to convert a GraphQL enum type into a 'uniform' reference.
9
+ export function gqlEnumToUniformRef(ctx: Context, gqlType: GraphQLEnumType): Reference {
10
+ const props: DefinitionProperty[] = gqlType.getValues().map(value => ({
11
+ name: value.name,
12
+ type: "string", // TODO: other types?
13
+ description: value.description || "",
14
+ }))
15
+
16
+ return uniformify(
17
+ ctx,
18
+ gqlType,
19
+ [
20
+ {
21
+ title: "Valid values",
22
+ properties: props
23
+ }
24
+ ],
25
+ [],
26
+ )
27
+ }
@@ -0,0 +1,164 @@
1
+ import {
2
+ GraphQLField,
3
+ GraphQLFieldMap,
4
+ GraphQLInputField,
5
+ GraphQLInputFieldMap,
6
+ GraphQLInputObjectType,
7
+ GraphQLUnionType,
8
+ GraphQLObjectType,
9
+ GraphQLInterfaceType,
10
+ GraphQLScalarType,
11
+ GraphQLNonNull,
12
+ } from "graphql";
13
+
14
+ import type {DefinitionProperty, DefinitionPropertyMeta} from "@xyd-js/uniform";
15
+
16
+ import {NestedGraphqlType} from "../types";
17
+ import {gqlFieldTypeInfo, propsUniformify} from "../gql-core";
18
+ import {gqlUnionToUniformDefinitionProperties} from "./gql-union";
19
+ import {Context} from "../context";
20
+
21
+ // gqlFieldToUniformDefinitionProperty converts GraphQL fields (field or input field) into xyd 'uniform' definition property
22
+ export function gqlFieldToUniformDefinitionProperty(
23
+ ctx: Context,
24
+ field: GraphQLField<any, any> | GraphQLInputField,
25
+ ): DefinitionProperty {
26
+ return GQLFieldConverter.convert(ctx, field);
27
+ }
28
+
29
+ export class GQLFieldConverter {
30
+ private constructor(private ctx: Context) {
31
+ }
32
+
33
+ public static convert(
34
+ ctx: Context,
35
+ field: GraphQLField<any, any> | GraphQLInputField,
36
+ ): DefinitionProperty {
37
+ return new GQLFieldConverter(ctx).convert(field);
38
+ }
39
+
40
+ private convert(
41
+ field: GraphQLField<any, any> | GraphQLInputField,
42
+ parent?: NestedGraphqlType,
43
+ ): DefinitionProperty {
44
+ if (this.ctx.globalOptions?.flat && (this.ctx.config?.flatReturn || this.ctx.config?.flat)) {
45
+ const info = gqlFieldTypeInfo(field)
46
+ const meta: DefinitionPropertyMeta[] = []
47
+
48
+ const props = propsUniformify(this.ctx, field, [], meta)
49
+ if (this.ctx.config?.flatReturn) {
50
+ return {
51
+ ...props,
52
+ name: ""
53
+ }
54
+ }
55
+
56
+ if (this.ctx.config?.flat) {
57
+ return props
58
+ }
59
+ }
60
+
61
+ const fieldInfo = gqlFieldTypeInfo(field)
62
+ const graphqlTypeFlat = fieldInfo?.typeFlat
63
+
64
+ let properties
65
+
66
+ switch (graphqlTypeFlat?.constructor) {
67
+ case GraphQLObjectType:
68
+ case GraphQLInputObjectType:
69
+ case GraphQLInterfaceType: {
70
+ properties = this.nestedProperties(graphqlTypeFlat as NestedGraphqlType)
71
+ break;
72
+ }
73
+ case GraphQLScalarType:
74
+ case GraphQLNonNull: {
75
+ properties = this.definitionPropsFromNestedObj(field) || []
76
+ break;
77
+ }
78
+ case GraphQLUnionType: {
79
+ properties = gqlUnionToUniformDefinitionProperties(this.ctx, graphqlTypeFlat as GraphQLUnionType)
80
+ break;
81
+ }
82
+ }
83
+
84
+ const resp = propsUniformify(
85
+ this.ctx,
86
+ field,
87
+ properties,
88
+ )
89
+
90
+ if (graphqlTypeFlat) {
91
+ const nestedType = graphqlTypeFlat as NestedGraphqlType
92
+ nestedType.__definitionProperties = resp.properties
93
+ }
94
+
95
+ if (parent) {
96
+ parent.__definitionProperties = resp.properties
97
+ }
98
+
99
+ return resp
100
+ }
101
+
102
+ // TODO: fix any + another more safety solution?
103
+ // definitionPropsFromNestedObj converts graphql nested obj into xyd 'uniform' definition properties
104
+ private definitionPropsFromNestedObj(obj: any): DefinitionProperty[] | null {
105
+ if (!obj) {
106
+ return null
107
+ }
108
+ if (obj.getFields) {
109
+ return this.nestedProperties(obj)
110
+ }
111
+
112
+ if (obj.ofType) {
113
+ return this.definitionPropsFromNestedObj(obj.ofType)
114
+ }
115
+
116
+ if (obj.type) {
117
+ return this.definitionPropsFromNestedObj(obj.type)
118
+ }
119
+
120
+ return null
121
+ }
122
+
123
+ // deepFieldMap iterates over GraphQL field (field or input fields) maps
124
+ private deepFieldMap(
125
+ fieldsMap: GraphQLFieldMap<any, any> | GraphQLInputFieldMap,
126
+ parent: NestedGraphqlType
127
+ ): DefinitionProperty[] {
128
+ const properties: DefinitionProperty[] = []
129
+
130
+ for (const [name, field] of Object.entries(fieldsMap)) {
131
+ const prop = this.convert(
132
+ field,
133
+ parent
134
+ )
135
+
136
+ if (prop) {
137
+ properties.push(prop)
138
+ }
139
+ }
140
+
141
+ return properties
142
+ }
143
+
144
+ // nestedProperties get fields from object or input object types and iterates over them
145
+ private nestedProperties(objectType: NestedGraphqlType) {
146
+ // Check if we've already processed this type to prevent circular dependencies
147
+ if (this.ctx.processedTypes.has(objectType)) {
148
+ if (objectType?.__definitionProperties) {
149
+ return objectType.__definitionProperties || []
150
+ }
151
+
152
+ return [] // Return empt array for already processed types to break the cycle
153
+ }
154
+
155
+ // Mark this type as being processed
156
+ this.ctx.processedTypes.add(objectType)
157
+
158
+ const nestedFields = objectType?.getFields?.()
159
+ const result = this.deepFieldMap(nestedFields, objectType)
160
+
161
+ return result
162
+ }
163
+ }
164
+
@@ -0,0 +1,34 @@
1
+ import {GraphQLInputObjectType} from "graphql";
2
+
3
+ import {Reference} from "@xyd-js/uniform";
4
+
5
+ import {gqlObjectPropsUniformify, uniformify} from "../gql-core";
6
+ import {Context} from "../context";
7
+
8
+ // gqlInputToUniformRef is a helper function to convert a GraphQL input object type into a 'uniform' reference.
9
+ export function gqlInputToUniformRef(ctx: Context, gqlType: GraphQLInputObjectType): Reference {
10
+ const prop = gqlInputToUniformDefinitionProperty(
11
+ ctx,
12
+ gqlType,
13
+ )
14
+
15
+ return uniformify(
16
+ ctx,
17
+ gqlType,
18
+ [
19
+ {
20
+ title: "Fields",
21
+ properties: prop.properties || []
22
+ }
23
+ ],
24
+ []
25
+ )
26
+ }
27
+
28
+ // gqlInputToUniformDefinitionProperty is a helper function to convert a GraphQL input object into a xyd definition property.
29
+ export function gqlInputToUniformDefinitionProperty(
30
+ ctx: Context,
31
+ obj: GraphQLInputObjectType,
32
+ ) {
33
+ return gqlObjectPropsUniformify(ctx, obj)
34
+ }