@vladimirdev635/gql-codegen 0.0.11 → 0.0.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.
Files changed (77) hide show
  1. package/dist/actors/ts/apollo/actor.d.ts +12 -0
  2. package/dist/actors/ts/apollo/actor.js +16 -0
  3. package/dist/actors/ts/apollo/generators/import-registry.d.ts +14 -0
  4. package/dist/actors/ts/apollo/generators/import-registry.js +54 -0
  5. package/dist/actors/ts/apollo/generators/main.d.ts +9 -0
  6. package/dist/actors/ts/apollo/generators/main.js +100 -0
  7. package/dist/actors/ts/apollo/index.d.ts +1 -0
  8. package/dist/actors/ts/apollo/index.js +1 -0
  9. package/dist/actors/ts/graphql/actor.d.ts +11 -0
  10. package/dist/actors/ts/graphql/actor.js +11 -0
  11. package/dist/actors/ts/graphql/generators/client/fragments.d.ts +7 -0
  12. package/dist/actors/ts/graphql/generators/client/fragments.js +146 -0
  13. package/dist/actors/ts/graphql/generators/client/main.d.ts +4 -0
  14. package/dist/actors/ts/graphql/generators/client/main.js +15 -0
  15. package/dist/actors/ts/graphql/generators/client/operations.d.ts +7 -0
  16. package/dist/actors/ts/graphql/generators/client/operations.js +47 -0
  17. package/dist/actors/ts/graphql/generators/main.d.ts +4 -0
  18. package/dist/actors/ts/graphql/generators/main.js +14 -0
  19. package/dist/actors/ts/graphql/generators/server/enums.d.ts +4 -0
  20. package/dist/actors/ts/graphql/generators/server/enums.js +4 -0
  21. package/dist/actors/ts/graphql/generators/server/inputs.d.ts +7 -0
  22. package/dist/actors/ts/graphql/generators/server/inputs.js +50 -0
  23. package/dist/actors/ts/graphql/generators/server/main.d.ts +4 -0
  24. package/dist/actors/ts/graphql/generators/server/main.js +20 -0
  25. package/dist/actors/ts/graphql/generators/server/objects.d.ts +9 -0
  26. package/dist/actors/ts/graphql/generators/server/objects.js +103 -0
  27. package/dist/actors/ts/graphql/generators/server/scalars/mapping.d.ts +10 -0
  28. package/dist/actors/ts/graphql/generators/server/scalars/mapping.js +20 -0
  29. package/dist/actors/ts/graphql/generators/server/shared.d.ts +8 -0
  30. package/dist/actors/ts/graphql/generators/server/shared.js +21 -0
  31. package/dist/actors/ts/graphql/generators/server/unions.d.ts +5 -0
  32. package/dist/actors/ts/graphql/generators/server/unions.js +18 -0
  33. package/dist/actors/ts/graphql/generators/shared.d.ts +6 -0
  34. package/dist/actors/ts/graphql/generators/shared.js +24 -0
  35. package/dist/actors/ts/graphql/index.d.ts +2 -0
  36. package/dist/actors/ts/graphql/index.js +2 -0
  37. package/dist/actors/ts/shared.d.ts +10 -0
  38. package/dist/actors/ts/shared.js +27 -0
  39. package/dist/actors/ts/utils.d.ts +5 -0
  40. package/dist/actors/ts/utils.js +6 -0
  41. package/dist/config.d.ts +2 -2
  42. package/dist/index.d.ts +1 -1
  43. package/dist/index.js +1 -1
  44. package/dist/main.d.ts +1 -1
  45. package/dist/schema/client/argument.d.ts +18 -0
  46. package/dist/schema/client/argument.js +15 -0
  47. package/dist/schema/client/directive.d.ts +47 -0
  48. package/dist/schema/client/directive.js +16 -0
  49. package/dist/schema/client/fragment.d.ts +108 -0
  50. package/dist/schema/client/fragment.js +66 -0
  51. package/dist/schema/client/operation.d.ts +52 -0
  52. package/dist/schema/client/operation.js +10 -0
  53. package/dist/schema/client/root.d.ts +112 -0
  54. package/dist/schema/client/root.js +9 -0
  55. package/dist/schema/root.d.ts +312 -0
  56. package/dist/schema/root.js +7 -0
  57. package/dist/{schema.spec.js → schema/schema.spec.js} +2 -2
  58. package/dist/schema/server.d.ts +857 -0
  59. package/dist/{schema.js → schema/server.js} +28 -52
  60. package/dist/schema/shared.d.ts +107 -0
  61. package/dist/schema/shared.js +34 -0
  62. package/dist/schema/test.json +1 -0
  63. package/dist/schema/utils.d.ts +3 -0
  64. package/dist/{schema.utils.js → schema/utils.js} +2 -2
  65. package/dist/utils.d.ts +10 -0
  66. package/dist/utils.js +14 -0
  67. package/package.json +6 -4
  68. package/dist/actors/apollo/actor.d.ts +0 -7
  69. package/dist/actors/apollo/actor.js +0 -18
  70. package/dist/actors/apollo/index.d.ts +0 -2
  71. package/dist/actors/apollo/index.js +0 -2
  72. package/dist/actors/apollo/utils.d.ts +0 -2
  73. package/dist/actors/apollo/utils.js +0 -7
  74. package/dist/schema.d.ts +0 -5868
  75. package/dist/schema.utils.d.ts +0 -3
  76. package/dist/test.json +0 -4303
  77. /package/dist/{schema.spec.d.ts → schema/schema.spec.d.ts} +0 -0
@@ -0,0 +1,12 @@
1
+ import { PathOrFileDescriptor } from 'fs';
2
+ import { Actor, ActorContext } from '@/config.js';
3
+ import { TSActorConfig } from '../shared.js';
4
+ export declare enum ImportModule {
5
+ GRAPHQL = 0,
6
+ APOLLO = 1
7
+ }
8
+ export interface ApolloActorConfig extends TSActorConfig {
9
+ outPath: PathOrFileDescriptor;
10
+ modulePaths: Record<ImportModule, string>;
11
+ }
12
+ export declare function buildApolloActor(config: ApolloActorConfig): Actor<ActorContext>;
@@ -0,0 +1,16 @@
1
+ import { writeFileSync } from 'fs';
2
+ import { renderNodes } from '../shared.js';
3
+ import { generateNodes } from './generators/main.js';
4
+ export var ImportModule;
5
+ (function (ImportModule) {
6
+ ImportModule[ImportModule["GRAPHQL"] = 0] = "GRAPHQL";
7
+ ImportModule[ImportModule["APOLLO"] = 1] = "APOLLO";
8
+ })(ImportModule || (ImportModule = {}));
9
+ async function apolloActor(config, context) {
10
+ const nodes = generateNodes(config, context);
11
+ const code = await renderNodes(config, nodes);
12
+ writeFileSync(config.outPath, code);
13
+ }
14
+ export function buildApolloActor(config) {
15
+ return context => apolloActor(config, context);
16
+ }
@@ -0,0 +1,14 @@
1
+ import { ImportModule } from '../actor.js';
2
+ import ts from 'typescript';
3
+ interface ImportProps {
4
+ alias: string | null;
5
+ type: boolean;
6
+ }
7
+ export declare class ImportRegistry {
8
+ private imports;
9
+ generateImportDeclarations(modulePaths: Record<ImportModule, string>): ts.ImportDeclaration[];
10
+ addImport(module: ImportModule | string, name: string, props?: ImportProps): string;
11
+ addImports(module: ImportModule | string, imports: Record<string, ImportProps>): void;
12
+ private addToClause;
13
+ }
14
+ export {};
@@ -0,0 +1,54 @@
1
+ import { entries } from '../../../../utils.js';
2
+ import { ImportModule } from '../actor.js';
3
+ import ts from 'typescript';
4
+ import assert from 'assert';
5
+ export class ImportRegistry {
6
+ imports = {
7
+ [ImportModule.APOLLO]: { imports: {}, identifiers: new Set() },
8
+ [ImportModule.GRAPHQL]: { imports: {}, identifiers: new Set() }
9
+ };
10
+ generateImportDeclarations(modulePaths) {
11
+ return entries(this.imports)
12
+ .map(([module, clause]) => {
13
+ return ts.factory.createImportDeclaration(undefined, ts.factory.createImportClause(false, undefined, ts.factory.createNamedImports(entries(clause.imports)
14
+ .map(([name, props]) => ts.factory.createImportSpecifier(props.type, props.alias !== null ?
15
+ ts.factory.createIdentifier(props.alias) :
16
+ undefined, ts.factory.createIdentifier(name))))), ts.factory.createStringLiteral((module in modulePaths ?
17
+ modulePaths[module] :
18
+ module)));
19
+ });
20
+ }
21
+ addImport(module, name, props = { alias: null, type: true }) {
22
+ this.addImports(module, { [name]: props });
23
+ return props.alias || name;
24
+ }
25
+ addImports(module, imports) {
26
+ if (!(module in this.imports)) {
27
+ this.imports[module] = {
28
+ imports: {},
29
+ identifiers: new Set()
30
+ };
31
+ }
32
+ const clause = this.imports[module];
33
+ for (const [name, props] of Object.entries(imports)) {
34
+ if (name in clause.imports) {
35
+ if (clause.imports[name].alias === props.alias)
36
+ continue;
37
+ this.addToClause(clause, name, props);
38
+ continue;
39
+ }
40
+ this.addToClause(clause, name, props);
41
+ }
42
+ }
43
+ addToClause(clause, name, props) {
44
+ if (props.alias === null) {
45
+ assert(!clause.identifiers.has(name));
46
+ clause.imports[name] = props;
47
+ clause.identifiers.add(name);
48
+ return;
49
+ }
50
+ assert(!clause.identifiers.has(props.alias));
51
+ clause.imports[name] = props;
52
+ clause.identifiers.add(props.alias);
53
+ }
54
+ }
@@ -0,0 +1,9 @@
1
+ import { ActorContext } from '@/config.js';
2
+ import { ApolloActorConfig } from '../actor.js';
3
+ import ts from 'typescript';
4
+ import { operationSchema } from '@/schema/client/operation.js';
5
+ import { z } from 'zod/v4';
6
+ import { ImportRegistry } from './import-registry.js';
7
+ export declare function generateMutationFuncTypeNode(registry: ImportRegistry, operationName: string): ts.TypeAliasDeclaration;
8
+ export declare function generateOperationNodes(registry: ImportRegistry, operation: z.infer<typeof operationSchema>): ts.Node[];
9
+ export declare function generateNodes(config: ApolloActorConfig, context: ActorContext): ts.Node[];
@@ -0,0 +1,100 @@
1
+ import { ImportModule } from '../actor.js';
2
+ import ts from 'typescript';
3
+ import { opTypeToName } from '../../graphql/generators/client/operations.js';
4
+ import { addNewLineBetweenNodes } from '../../shared.js';
5
+ import { ImportRegistry } from './import-registry.js';
6
+ export function generateMutationFuncTypeNode(registry, operationName) {
7
+ return ts.factory.createTypeAliasDeclaration(ts.factory.createModifiersFromModifierFlags(ts.ModifierFlags.Export), operationName + 'MutationFn', [], ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.APOLLO, 'MutationFunction'), [
8
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operationName + 'Mutation')),
9
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operationName + 'MutationVariables'))
10
+ ]));
11
+ }
12
+ function generateOperationHookFunctionNodes(registry, operation, operationInfix) {
13
+ return [
14
+ ts.factory.createFunctionDeclaration([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], undefined, ts.factory.createIdentifier('use' +
15
+ operation.name +
16
+ operationInfix +
17
+ opTypeToName(operation.type)), undefined, [ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createIdentifier('baseOptions'), ts.factory.createToken(ts.SyntaxKind.QuestionToken), ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(registry.addImport(ImportModule.APOLLO, opTypeToName(operation.type) + 'HookOptions')), [
18
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operation.name + opTypeToName(operation.type))),
19
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operation.name +
20
+ opTypeToName(operation.type) +
21
+ 'Variables'))
22
+ ]), undefined)], undefined, ts.factory.createBlock([
23
+ ts.factory.createVariableStatement(undefined, ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(ts.factory.createIdentifier('options'), undefined, undefined, ts.factory.createObjectLiteralExpression([
24
+ ts.factory.createSpreadAssignment(ts.factory.createIdentifier('defaultOptions')),
25
+ ts.factory.createSpreadAssignment(ts.factory.createIdentifier('baseOptions'))
26
+ ], false))], ts.NodeFlags.Const)),
27
+ ts.factory.createReturnStatement(ts.factory.createCallExpression(ts.factory.createIdentifier(registry.addImport(ImportModule.APOLLO, 'use' +
28
+ operationInfix +
29
+ opTypeToName(operation.type), { alias: null, type: false })), [
30
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operation.name +
31
+ opTypeToName(operation.type))),
32
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operation.name +
33
+ opTypeToName(operation.type) +
34
+ 'Variables'))
35
+ ], [
36
+ ts.factory.createIdentifier(operation.name + 'ApolloDocument'),
37
+ ts.factory.createIdentifier('options')
38
+ ]))
39
+ ], true)),
40
+ ts.factory.createTypeAliasDeclaration([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createIdentifier(operation.name +
41
+ opTypeToName(operation.type) +
42
+ operationInfix +
43
+ 'HookResult'), undefined, ts.factory.createTypeReferenceNode(ts.factory.createIdentifier('ReturnType'), [ts.factory.createTypeQueryNode(ts.factory.createIdentifier('use' + operation.name + opTypeToName(operation.type)), undefined)]))
44
+ ];
45
+ }
46
+ function generateOperationDocumentNode(registry, operationName) {
47
+ return ts.factory.createVariableStatement(undefined, ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(operationName + 'ApolloDocument', undefined, undefined, ts.factory.createCallExpression(ts.factory.createIdentifier(registry.addImport(ImportModule.APOLLO, 'gql', { alias: null, type: false })), undefined, [ts.factory.createIdentifier(registry.addImport(ImportModule.GRAPHQL, operationName + 'Document', { alias: null, type: false }))]))], ts.NodeFlags.Const));
48
+ }
49
+ function generateQueryResultNode(registry, operation) {
50
+ const opName = opTypeToName(operation.type);
51
+ return ts.factory.createTypeAliasDeclaration(ts.factory.createModifiersFromModifierFlags(ts.ModifierFlags.Export), operation.name + opName + 'Result', [], ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.APOLLO, 'QueryResult'), [
52
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operation.name + opName)),
53
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operation.name + 'QueryVariables'))
54
+ ]));
55
+ }
56
+ function generateMutationOptionsNode(registry, operation) {
57
+ const opName = opTypeToName(operation.type);
58
+ return ts.factory.createTypeAliasDeclaration(ts.factory.createModifiersFromModifierFlags(ts.ModifierFlags.Export), operation.name + opName + 'Options', [], ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.APOLLO, 'BaseMutationOptions'), [
59
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operation.name + opName)),
60
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operation.name + opName + 'Variables'))
61
+ ]));
62
+ }
63
+ function generateMutationResultNode(registry, operation) {
64
+ const opName = opTypeToName(operation.type);
65
+ return ts.factory.createTypeAliasDeclaration(ts.factory.createModifiersFromModifierFlags(ts.ModifierFlags.Export), operation.name + opName + 'Result', [], ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.APOLLO, 'MutationResult'), [
66
+ ts.factory.createTypeReferenceNode(registry.addImport(ImportModule.GRAPHQL, operation.name + opName))
67
+ ]));
68
+ }
69
+ function generateOperationHookNodes(registry, operation) {
70
+ const nodes = [
71
+ generateOperationDocumentNode(registry, operation.name),
72
+ ...generateOperationHookFunctionNodes(registry, operation, '')
73
+ ];
74
+ if (operation.type === 'QUERY') {
75
+ nodes.push(...generateOperationHookFunctionNodes(registry, operation, 'Lazy'), ...generateOperationHookFunctionNodes(registry, operation, 'Suspense'), generateQueryResultNode(registry, operation));
76
+ }
77
+ if (operation.type === 'MUTATION') {
78
+ nodes.push(generateMutationResultNode(registry, operation), generateMutationOptionsNode(registry, operation));
79
+ }
80
+ return nodes;
81
+ }
82
+ export function generateOperationNodes(registry, operation) {
83
+ const nodes = [];
84
+ if (operation.type === 'MUTATION') {
85
+ nodes.push(generateMutationFuncTypeNode(registry, operation.name));
86
+ }
87
+ nodes.push(...generateOperationHookNodes(registry, operation));
88
+ return nodes;
89
+ }
90
+ export function generateNodes(config, context) {
91
+ const registry = new ImportRegistry();
92
+ const nodes = Object.values(context.schema.client.operations).map(op => {
93
+ return generateOperationNodes(registry, op);
94
+ }).flat();
95
+ return addNewLineBetweenNodes([
96
+ ...registry.generateImportDeclarations(config.modulePaths),
97
+ ts.factory.createVariableStatement([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(ts.factory.createIdentifier('defaultOptions'), undefined, undefined, ts.factory.createObjectLiteralExpression())], ts.NodeFlags.Const)),
98
+ ...nodes
99
+ ]);
100
+ }
@@ -0,0 +1 @@
1
+ export { ApolloActorConfig, buildApolloActor } from './actor.js';
@@ -0,0 +1 @@
1
+ export { buildApolloActor } from './actor.js';
@@ -0,0 +1,11 @@
1
+ import { ScalarsMapping } from './generators/server/scalars/mapping.js';
2
+ import { PathOrFileDescriptor } from 'fs';
3
+ import ts from 'typescript';
4
+ import { Actor, ActorContext } from '@/config.js';
5
+ import { TSActorConfig } from '../shared.js';
6
+ export interface GraphqlActorConfig extends TSActorConfig {
7
+ outPath: PathOrFileDescriptor;
8
+ scalarsMapping: ScalarsMapping;
9
+ importDeclarations: ts.ImportDeclaration[];
10
+ }
11
+ export declare function buildGraphqlActor(config: GraphqlActorConfig): Actor<ActorContext>;
@@ -0,0 +1,11 @@
1
+ import { writeFileSync } from 'fs';
2
+ import { renderNodes } from '../shared.js';
3
+ import { generateNodes } from './generators/main.js';
4
+ async function graphqlActor(config, context) {
5
+ const nodes = generateNodes(config, context);
6
+ const code = await renderNodes(config, nodes);
7
+ writeFileSync(config.outPath, code);
8
+ }
9
+ export function buildGraphqlActor(config) {
10
+ return context => graphqlActor(config, context);
11
+ }
@@ -0,0 +1,7 @@
1
+ import ts from 'typescript';
2
+ import { RootSchema } from '@/schema/root.js';
3
+ import { FragmentSpecSchemaType } from '@/schema/client/fragment.js';
4
+ import { ScalarsMapping } from '../server/scalars/mapping.js';
5
+ export declare function extractFragmentSourceTextsInSpec(schema: RootSchema, fragmentSpec: FragmentSpecSchemaType): string[];
6
+ export declare function generateZodFragmentSpecCallExpression(scalarsMapping: ScalarsMapping, schema: RootSchema, spec: FragmentSpecSchemaType): ts.CallExpression;
7
+ export declare function generateFragmentTypes(scalarsMapping: ScalarsMapping, schema: RootSchema): ts.Node[];
@@ -0,0 +1,146 @@
1
+ /* eslint-disable max-lines */
2
+ import ts from 'typescript';
3
+ import { generateSchemaName } from '../server/shared.js';
4
+ import { generateZodObjectFieldSpec } from '../server/objects.js';
5
+ import assert from 'assert';
6
+ import { invokeMethod } from '../../../shared.js';
7
+ export function extractFragmentSourceTextsInSpec(schema, fragmentSpec) {
8
+ if (fragmentSpec._type === 'union') {
9
+ return fragmentSpec.selections.map((s) => {
10
+ if (s._type === 'SpreadSelection') {
11
+ return [schema.client.fragments[s.fragment].sourceText];
12
+ }
13
+ if (s._type === 'ObjectConditionalSpreadSelection') {
14
+ return extractFragmentSourceTextsInSpec(schema, s.spec);
15
+ }
16
+ return [];
17
+ }).flat();
18
+ }
19
+ return fragmentSpec.selections.map((s) => {
20
+ if (s._type === 'SpreadSelection') {
21
+ return [schema.client.fragments[s.fragment].sourceText];
22
+ }
23
+ if (s._type === 'FieldSelection' && s.selection !== null) {
24
+ return extractFragmentSourceTextsInSpec(schema, s.selection);
25
+ }
26
+ return [];
27
+ }).flat();
28
+ }
29
+ function generateFragmentDocumentNode(schema, name, fragment) {
30
+ return ts.factory.createVariableStatement([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(ts.factory.createIdentifier(name + 'FragmentDocument'), undefined, undefined, ts.factory.createStringLiteral([
31
+ fragment.sourceText,
32
+ ...extractFragmentSourceTextsInSpec(schema, fragment.spec)
33
+ ].join('\n')))], ts.NodeFlags.Const));
34
+ }
35
+ function generateZodObjectSelection(scalarsMapping, schema, objectType, selection, typenameConfig) {
36
+ switch (selection._type) {
37
+ case 'TypenameField': {
38
+ if ('ignore' in typenameConfig)
39
+ return null;
40
+ let expression = invokeMethod(ts.factory.createIdentifier('z'), 'literal', [ts.factory.createStringLiteral(objectType.name)]);
41
+ if (selection.alias === null && typenameConfig.optional) {
42
+ expression = invokeMethod(invokeMethod(expression, 'nullable', []), 'optional', []);
43
+ }
44
+ return ts.factory.createPropertyAssignment(selection.alias || '__typename', expression);
45
+ }
46
+ case 'FieldSelection': {
47
+ const fieldSpec = objectType.fields[selection.name];
48
+ let expression;
49
+ if (selection.selection === null) {
50
+ expression = generateZodObjectFieldSpec(scalarsMapping, fieldSpec);
51
+ }
52
+ else {
53
+ // eslint-disable-next-line no-use-before-define
54
+ expression = generateZodFragmentSpecCallExpression(scalarsMapping, schema, selection.selection);
55
+ }
56
+ return ts.factory.createPropertyAssignment(selection.alias, expression);
57
+ }
58
+ case 'SpreadSelection': {
59
+ return ts.factory.createSpreadAssignment(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier(generateSchemaName(selection.fragment + 'Fragment')), 'shape'));
60
+ }
61
+ }
62
+ }
63
+ function resolveSelections(specSelections, typenameConfig) {
64
+ const ignoreTypename = 'ignore' in typenameConfig;
65
+ const selections = [...specSelections.filter(s => s._type !== 'TypenameField' || !ignoreTypename).toSorted((s1, s2) => s1._type.localeCompare(s2._type))];
66
+ if (ignoreTypename)
67
+ return selections;
68
+ const hasTypename = specSelections.some(s => s._type === 'TypenameField');
69
+ const hasSpreadSelection = specSelections.some(s => s._type === 'SpreadSelection');
70
+ if (!hasTypename) {
71
+ if (hasSpreadSelection) {
72
+ selections.push({ _type: 'TypenameField', alias: null });
73
+ }
74
+ else {
75
+ selections.unshift({ _type: 'TypenameField', alias: null });
76
+ }
77
+ }
78
+ return selections;
79
+ }
80
+ function generateZodObjectFragmentSpecCallExpression(scalarsMapping, schema, object, specSelections, insideLazy, typenameConfig) {
81
+ const selections = resolveSelections(specSelections, typenameConfig);
82
+ const expression = ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('z'), 'object'), undefined, [ts.factory.createObjectLiteralExpression(selections.map(s => generateZodObjectSelection(scalarsMapping, schema, object, s, typenameConfig)).filter(s => s !== null), true)]);
83
+ if (insideLazy)
84
+ return expression;
85
+ const hasSpreadSelection = selections.some(s => s._type === 'SpreadSelection');
86
+ if (!hasSpreadSelection)
87
+ return expression;
88
+ return ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('z'), 'lazy'), undefined, [ts.factory.createArrowFunction(undefined, undefined, [], undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), expression)]);
89
+ }
90
+ function resolveUnionSelections(schema, specSelections) {
91
+ const typenameSelections = [];
92
+ const objectSelections = specSelections.map(s => {
93
+ assert(s._type !== 'UnionConditionalSpreadSelection');
94
+ if (s._type === 'TypenameField') {
95
+ typenameSelections.push(s);
96
+ return [];
97
+ }
98
+ if (s._type === 'ObjectConditionalSpreadSelection')
99
+ return [s];
100
+ const fragmentSpec = schema.client.fragments[s.fragment].spec;
101
+ assert(fragmentSpec._type === 'union');
102
+ const [selections, tSelections] = resolveUnionSelections(schema, fragmentSpec.selections);
103
+ typenameSelections.push(...tSelections);
104
+ return selections;
105
+ }).flat();
106
+ return [objectSelections, typenameSelections];
107
+ }
108
+ function generateZodUnionFragmentSpecCallExpression(scalarsMapping, schema, spec) {
109
+ const [objectSelections, typenameSelections] = resolveUnionSelections(schema, spec.selections);
110
+ for (const item of Object.keys(schema.server.unions[spec.unionName].items)) {
111
+ if (!objectSelections.some(s => s.object === item)) {
112
+ objectSelections.push({
113
+ _type: 'ObjectConditionalSpreadSelection',
114
+ object: item,
115
+ spec: {
116
+ _type: 'object',
117
+ name: item,
118
+ selections: []
119
+ }
120
+ });
121
+ }
122
+ }
123
+ const expression = ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('z'), 'union'), undefined, [ts.factory.createArrayLiteralExpression(objectSelections.map(s => generateZodObjectFragmentSpecCallExpression(scalarsMapping, schema, schema.server.objects[s.object], [...s.spec.selections, ...typenameSelections], true, { ensurePresent: true, optional: false })), true)]);
124
+ return ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('z'), 'lazy'), undefined, [ts.factory.createArrowFunction(undefined, undefined, [], undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), expression)]);
125
+ }
126
+ export function generateZodFragmentSpecCallExpression(scalarsMapping, schema, spec) {
127
+ if (spec._type === 'object') {
128
+ return generateZodObjectFragmentSpecCallExpression(scalarsMapping, schema, schema.server.objects[spec.name], spec.selections, false, { ensurePresent: true, optional: true });
129
+ }
130
+ return generateZodUnionFragmentSpecCallExpression(scalarsMapping, schema, spec);
131
+ }
132
+ function generateZodFragmentSchema(scalarsMapping, schema, fragmentName, fragment) {
133
+ return ts.factory.createVariableStatement([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(ts.factory.createIdentifier(generateSchemaName(fragmentName + 'Fragment')), undefined, undefined, generateZodFragmentSpecCallExpression(scalarsMapping, schema, fragment.spec))], ts.NodeFlags.Const));
134
+ }
135
+ function generateFragmentSpecDeclarations(scalarsMapping, schema, fragmentName, fragment) {
136
+ return [
137
+ generateFragmentDocumentNode(schema, fragmentName, fragment),
138
+ generateZodFragmentSchema(scalarsMapping, schema, fragmentName, fragment)
139
+ ];
140
+ }
141
+ export function generateFragmentTypes(scalarsMapping, schema) {
142
+ return Object.entries(schema.client.fragments)
143
+ .map(([name, fragment]) => {
144
+ return generateFragmentSpecDeclarations(scalarsMapping, schema, name, fragment);
145
+ }).flat();
146
+ }
@@ -0,0 +1,4 @@
1
+ import ts from 'typescript';
2
+ import { ActorContext } from '@/config.js';
3
+ import { GraphqlActorConfig } from '../../actor.js';
4
+ export declare function generateClientNodes(config: GraphqlActorConfig, context: ActorContext): ts.Node[];
@@ -0,0 +1,15 @@
1
+ import ts from 'typescript';
2
+ import { generateFragmentTypes } from './fragments.js';
3
+ import { generateOperationsNodes } from './operations.js';
4
+ const operationTypeNode = ts.factory.createInterfaceDeclaration(ts.factory.createModifiersFromModifierFlags(ts.ModifierFlags.Export), 'Operation', [], [], [
5
+ ts.factory.createPropertySignature(undefined, 'document', undefined, ts.factory.createTypeReferenceNode('string')),
6
+ ts.factory.createPropertySignature(undefined, 'variablesSchema', undefined, ts.factory.createTypeReferenceNode('z.ZodType')),
7
+ ts.factory.createPropertySignature(undefined, 'resultSchema', undefined, ts.factory.createTypeReferenceNode('z.ZodType'))
8
+ ]);
9
+ export function generateClientNodes(config, context) {
10
+ return [
11
+ operationTypeNode,
12
+ ...generateFragmentTypes(config.scalarsMapping, context.schema),
13
+ ...generateOperationsNodes(config.scalarsMapping, context.schema)
14
+ ];
15
+ }
@@ -0,0 +1,7 @@
1
+ import ts from 'typescript';
2
+ import { RootSchema } from '@/schema/root.js';
3
+ import { operationSchema } from '@/schema/client/operation.js';
4
+ import { z } from 'zod/v4';
5
+ import { ScalarsMapping } from '../server/scalars/mapping.js';
6
+ export declare function opTypeToName(type: z.infer<typeof operationSchema>['type']): string;
7
+ export declare function generateOperationsNodes(scalarsMapping: ScalarsMapping, schema: RootSchema): ts.Node[];
@@ -0,0 +1,47 @@
1
+ /* eslint-disable max-lines */
2
+ import ts from 'typescript';
3
+ import { extractFragmentSourceTextsInSpec, generateZodFragmentSpecCallExpression, } from './fragments.js';
4
+ import { generateSchemaName, generateZodInferTypeAlias } from '../server/shared.js';
5
+ import { generateInputTypeDefinitionFields } from '../server/inputs.js';
6
+ export function opTypeToName(type) {
7
+ switch (type) {
8
+ case 'QUERY': return 'Query';
9
+ case 'MUTATION': return 'Mutation';
10
+ case 'SUBSCRIPTION': return 'Subscription';
11
+ }
12
+ }
13
+ function parametersToFields(parameters) {
14
+ return Object.fromEntries(Object.keys(parameters).map(name => [name.slice(1), parameters[name]]));
15
+ }
16
+ function generateOperationNode(schema, operation) {
17
+ return ts.factory.createVariableStatement(ts.factory.createModifiersFromModifierFlags(ts.ModifierFlags.Export), ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(ts.factory.createIdentifier(operation.name + 'Operation'), undefined, undefined, ts.factory.createSatisfiesExpression(ts.factory.createAsExpression(ts.factory.createObjectLiteralExpression([
18
+ ts.factory.createPropertyAssignment('document', ts.factory.createStringLiteral([
19
+ operation.sourceText,
20
+ ...extractFragmentSourceTextsInSpec(schema, operation.fragmentSpec)
21
+ ].join('\n'))),
22
+ ts.factory.createPropertyAssignment('variablesSchema', ts.factory.createIdentifier(generateSchemaName(operation.name + 'Variables'))),
23
+ ts.factory.createPropertyAssignment('resultSchema', ts.factory.createIdentifier(generateSchemaName(operation.name + 'Result')))
24
+ ], true), ts.factory.createTypeReferenceNode('const')), ts.factory.createTypeReferenceNode('Operation')))], ts.NodeFlags.Const));
25
+ }
26
+ function generateOperationZodInputSchema(scalarsMapping, operation) {
27
+ return ts.factory.createVariableStatement([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(ts.factory.createIdentifier(generateSchemaName(operation.name + 'Variables')), undefined, undefined, ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('z'), 'object'), undefined, [ts.factory.createObjectLiteralExpression(generateInputTypeDefinitionFields(scalarsMapping, parametersToFields(operation.parameters)), true)]))], ts.NodeFlags.Const));
28
+ }
29
+ function genearteOperationZodOutputSchema(scalarsMapping, schema, operation) {
30
+ return ts.factory.createVariableStatement([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(ts.factory.createIdentifier(generateSchemaName(operation.name + 'Result')), undefined, undefined, generateZodFragmentSpecCallExpression(scalarsMapping, schema, operation.fragmentSpec))], ts.NodeFlags.Const));
31
+ }
32
+ function generateOperationNodes(scalarsMapping, schema, operation) {
33
+ return [
34
+ generateOperationZodInputSchema(scalarsMapping, operation),
35
+ generateZodInferTypeAlias(operation.name + 'Variables', generateSchemaName(operation.name + 'Variables')),
36
+ ts.factory.createIdentifier('\n'),
37
+ genearteOperationZodOutputSchema(scalarsMapping, schema, operation),
38
+ generateZodInferTypeAlias(operation.name + 'Result', generateSchemaName(operation.name + 'Result')),
39
+ generateOperationNode(schema, operation),
40
+ ts.factory.createIdentifier('\n')
41
+ ];
42
+ }
43
+ export function generateOperationsNodes(scalarsMapping, schema) {
44
+ return Object.values(schema.client.operations).map(operation => {
45
+ return generateOperationNodes(scalarsMapping, schema, operation);
46
+ }).flat();
47
+ }
@@ -0,0 +1,4 @@
1
+ import ts from 'typescript';
2
+ import { ActorContext } from '@/config.js';
3
+ import { GraphqlActorConfig } from '../actor.js';
4
+ export declare function generateNodes(config: GraphqlActorConfig, context: ActorContext): ts.Node[];
@@ -0,0 +1,14 @@
1
+ import ts from 'typescript';
2
+ import { generateServerNodes } from './server/main.js';
3
+ import { generateClientNodes } from './client/main.js';
4
+ export function generateNodes(config, context) {
5
+ return [
6
+ ts.factory.createImportDeclaration([], ts.factory.createImportClause(false, undefined, ts.factory.createNamedImports([
7
+ ts.factory.createImportSpecifier(false, undefined, ts.factory.createIdentifier('z'))
8
+ ])), ts.factory.createStringLiteral('zod/v4')),
9
+ ...config.importDeclarations,
10
+ ts.factory.createIdentifier('\n'),
11
+ ...generateServerNodes(config, context),
12
+ ...generateClientNodes(config, context)
13
+ ];
14
+ }
@@ -0,0 +1,4 @@
1
+ import { z } from 'zod/v4';
2
+ import ts from 'typescript';
3
+ import { enumSchema } from '@/schema/server.js';
4
+ export declare function generateEnumDefinition(e: z.infer<typeof enumSchema>): ts.EnumDeclaration;
@@ -0,0 +1,4 @@
1
+ import ts from 'typescript';
2
+ export function generateEnumDefinition(e) {
3
+ return ts.factory.createEnumDeclaration(ts.factory.createModifiersFromModifierFlags(ts.ModifierFlags.Export), e.name, e.values.map(value => ts.factory.createEnumMember(value)));
4
+ }
@@ -0,0 +1,7 @@
1
+ import { z } from 'zod/v4';
2
+ import ts from 'typescript';
3
+ import { inputSchema } from '@/schema/server.js';
4
+ import { inputFieldSchema } from '@/schema/shared.js';
5
+ import { ScalarsMapping } from './scalars/mapping.js';
6
+ export declare function generateInputTypeDefinitionFields(scalarsMapping: ScalarsMapping, fields: Record<string, z.infer<typeof inputFieldSchema>>): ts.PropertyAssignment[];
7
+ export declare function generateInputTypeDefinitions(scalarsMapping: ScalarsMapping, input: z.infer<typeof inputSchema>): ts.Node[];
@@ -0,0 +1,50 @@
1
+ import ts from 'typescript';
2
+ import { getScalarSpecFromMapping } from './scalars/mapping.js';
3
+ import { invokeMethod } from '../../../shared.js';
4
+ import { generateSchemaName, generateZodInferTypeAlias } from './shared.js';
5
+ function generateZodInputTypeSpec(scalarsMapping, type) {
6
+ switch (type._type) {
7
+ case 'Enum': {
8
+ return ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('z'), 'enum'), undefined, [ts.factory.createIdentifier(type.name)]);
9
+ }
10
+ case 'Scalar': {
11
+ return getScalarSpecFromMapping(scalarsMapping, type.name).inputSchema;
12
+ }
13
+ case 'InputType': {
14
+ return ts.factory.createIdentifier(generateSchemaName(type.name));
15
+ }
16
+ }
17
+ }
18
+ function generateZodInputFieldSpec(scalarsMapping, field) {
19
+ let expression;
20
+ switch (field.spec._type) {
21
+ case 'array': {
22
+ expression = ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('z'), 'array'), undefined, [generateZodInputTypeSpec(scalarsMapping, field.spec.type)]);
23
+ break;
24
+ }
25
+ case 'literal': {
26
+ expression = generateZodInputTypeSpec(scalarsMapping, field.spec.type);
27
+ }
28
+ }
29
+ if (!field.nullable) {
30
+ return expression;
31
+ }
32
+ return invokeMethod(invokeMethod(expression, 'nullable', []), 'optional', []);
33
+ }
34
+ export function generateInputTypeDefinitionFields(scalarsMapping, fields) {
35
+ return Object.entries(fields).map(([name, field]) => {
36
+ return ts.factory.createPropertyAssignment(name, generateZodInputFieldSpec(scalarsMapping, field));
37
+ });
38
+ }
39
+ function generateZodInputTypeDefinition(scalarsMapping, name, fields) {
40
+ return ts.factory.createVariableStatement([ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], ts.factory.createVariableDeclarationList([
41
+ ts.factory.createVariableDeclaration(generateSchemaName(name), undefined, undefined, ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('z'), ts.factory.createIdentifier('object')), undefined, [ts.factory.createObjectLiteralExpression(generateInputTypeDefinitionFields(scalarsMapping, fields), true)]))
42
+ ], ts.NodeFlags.Const));
43
+ }
44
+ export function generateInputTypeDefinitions(scalarsMapping, input) {
45
+ return [
46
+ generateZodInputTypeDefinition(scalarsMapping, input.name, input.fields),
47
+ generateZodInferTypeAlias(input.name, generateSchemaName(input.name)),
48
+ ts.factory.createIdentifier('\n')
49
+ ];
50
+ }
@@ -0,0 +1,4 @@
1
+ import ts from 'typescript';
2
+ import { GraphqlActorConfig } from '../../actor.js';
3
+ import { ActorContext } from '@/config.js';
4
+ export declare function generateServerNodes(config: GraphqlActorConfig, context: ActorContext): ts.Node[];
@@ -0,0 +1,20 @@
1
+ import ts from 'typescript';
2
+ import { generateEnumDefinition } from './enums.js';
3
+ import { generateUnionTypeDefinitions } from './unions.js';
4
+ import { generateInputTypeDefinitions } from './inputs.js';
5
+ import { addNewLineBetweenNodes } from '../../../shared.js';
6
+ import { generateObjectTypeNodes } from './objects.js';
7
+ export function generateServerNodes(config, context) {
8
+ return [
9
+ ...addNewLineBetweenNodes(Object.values(context.schema.server.enums)
10
+ .map(generateEnumDefinition)),
11
+ ts.factory.createIdentifier('\n'),
12
+ ...Object.values(context.schema.server.objects)
13
+ .map(object => generateObjectTypeNodes(config.scalarsMapping, object)).flat(),
14
+ ...Object.values(context.schema.server.unions)
15
+ .map(union => generateUnionTypeDefinitions(config.scalarsMapping, context.schema.server.objects, union)).flat(),
16
+ ...Object.values(context.schema.server.inputs)
17
+ .map(input => generateInputTypeDefinitions(config.scalarsMapping, input))
18
+ .flat()
19
+ ];
20
+ }
@@ -0,0 +1,9 @@
1
+ import { ScalarsMapping } from './scalars/mapping.js';
2
+ import ts from 'typescript';
3
+ import { objectFieldSchema, objectNonCallableFieldSpecSchema, objectSchema } from '@/schema/server.js';
4
+ import { z } from 'zod/v4';
5
+ export declare function generateObjectNonCallableFieldSpec(scalarsMapping: ScalarsMapping, spec: z.infer<typeof objectNonCallableFieldSpecSchema>): ts.Expression;
6
+ export declare function generateZodObjectFieldSpec(scalarsMapping: ScalarsMapping, field: z.infer<typeof objectFieldSchema>): ts.Expression;
7
+ export declare function generateZodObjectTypeExpression(scalarsMapping: ScalarsMapping, object: z.infer<typeof objectSchema>, includeTypename?: boolean): ts.CallExpression;
8
+ export declare function generateZodObjectTypeNode(scalarsMapping: ScalarsMapping, object: z.infer<typeof objectSchema>): ts.VariableStatement;
9
+ export declare function generateObjectTypeNodes(scalarsMapping: ScalarsMapping, object: z.infer<typeof objectSchema>): ts.Node[];