Skip to content

Commit 1cbc2d9

Browse files
authored
Merge pull request #350 from Code-Hex/fix/build-error
fixed build error
2 parents 068f833 + 46990c6 commit 1cbc2d9

File tree

9 files changed

+6629
-210
lines changed

9 files changed

+6629
-210
lines changed

.eslintrc.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"rules": {
2929
"no-unused-vars": "off",
3030
"@typescript-eslint/no-unused-vars": "off",
31-
"import/no-extraneous-dependencies": "off"
31+
"import/no-extraneous-dependencies": "off",
32+
"prefer-object-has-own": "off"
3233
}
3334
}
3435
],

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@
6464
"zod": "3.21.4"
6565
},
6666
"dependencies": {
67-
"@graphql-codegen/plugin-helpers": "2.7.2",
67+
"@graphql-codegen/plugin-helpers": "^4.2.0",
6868
"@graphql-codegen/schema-ast": "2.6.1",
6969
"@graphql-codegen/visitor-plugin-common": "^2.13.7",
7070
"@graphql-tools/utils": "^9.0.0",
71-
"graphql": "16.6.0"
71+
"graphql": "^16.6.0"
7272
},
7373
"peerDependencies": {
7474
"graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"

src/index.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import { MyZodSchemaVisitor } from './myzod/index';
33
import { transformSchemaAST } from '@graphql-codegen/schema-ast';
44
import { YupSchemaVisitor } from './yup/index';
55
import { ValidationSchemaPluginConfig } from './config';
6-
import { oldVisit, PluginFunction, Types } from '@graphql-codegen/plugin-helpers';
7-
import { GraphQLSchema } from 'graphql';
6+
import { PluginFunction, Types } from '@graphql-codegen/plugin-helpers';
7+
import { GraphQLSchema, visit } from 'graphql';
8+
import { SchemaVisitor } from './types';
89

910
export const plugin: PluginFunction<ValidationSchemaPluginConfig, Types.ComplexPluginOutput> = (
1011
schema: GraphQLSchema,
@@ -14,9 +15,7 @@ export const plugin: PluginFunction<ValidationSchemaPluginConfig, Types.ComplexP
1415
const { schema: _schema, ast } = transformSchemaAST(schema, config);
1516
const { buildImports, initialEmit, ...visitor } = schemaVisitor(_schema, config);
1617

17-
const result = oldVisit(ast, {
18-
leave: visitor,
19-
});
18+
const result = visit(ast, visitor);
2019

2120
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
2221
// @ts-ignore
@@ -28,7 +27,7 @@ export const plugin: PluginFunction<ValidationSchemaPluginConfig, Types.ComplexP
2827
};
2928
};
3029

31-
const schemaVisitor = (schema: GraphQLSchema, config: ValidationSchemaPluginConfig) => {
30+
const schemaVisitor = (schema: GraphQLSchema, config: ValidationSchemaPluginConfig): SchemaVisitor => {
3231
if (config?.schema === 'zod') {
3332
return ZodSchemaVisitor(schema, config);
3433
} else if (config?.schema === 'myzod') {

src/myzod/index.ts

Lines changed: 68 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ import {
1414
import { DeclarationBlock, indent } from '@graphql-codegen/visitor-plugin-common';
1515
import { TsVisitor } from '@graphql-codegen/typescript';
1616
import { buildApi, formatDirectiveConfig } from '../directive';
17+
import { SchemaVisitor } from '../types';
1718

1819
const importZod = `import * as myzod from 'myzod'`;
1920
const anySchema = `definedNonNullAnySchema`;
2021

21-
export const MyZodSchemaVisitor = (schema: GraphQLSchema, config: ValidationSchemaPluginConfig) => {
22+
export const MyZodSchemaVisitor = (schema: GraphQLSchema, config: ValidationSchemaPluginConfig): SchemaVisitor => {
2223
const tsVisitor = new TsVisitor(schema, config);
2324

2425
const importTypes: string[] = [];
@@ -36,72 +37,80 @@ export const MyZodSchemaVisitor = (schema: GraphQLSchema, config: ValidationSche
3637
new DeclarationBlock({}).export().asKind('const').withName(`${anySchema}`).withContent(`myzod.object({})`)
3738
.string,
3839
].join('\n'),
39-
InputObjectTypeDefinition: (node: InputObjectTypeDefinitionNode) => {
40-
const name = tsVisitor.convertName(node.name.value);
41-
importTypes.push(name);
42-
43-
const shape = node.fields
44-
?.map(field => generateFieldMyZodSchema(config, tsVisitor, schema, field, 2))
45-
.join(',\n');
46-
47-
return new DeclarationBlock({})
48-
.export()
49-
.asKind('function')
50-
.withName(`${name}Schema(): myzod.Type<${name}>`)
51-
.withBlock([indent(`return myzod.object({`), shape, indent('})')].join('\n')).string;
40+
InputObjectTypeDefinition: {
41+
leave: (node: InputObjectTypeDefinitionNode) => {
42+
const name = tsVisitor.convertName(node.name.value);
43+
importTypes.push(name);
44+
45+
const shape = node.fields
46+
?.map(field => generateFieldMyZodSchema(config, tsVisitor, schema, field, 2))
47+
.join(',\n');
48+
49+
return new DeclarationBlock({})
50+
.export()
51+
.asKind('function')
52+
.withName(`${name}Schema(): myzod.Type<${name}>`)
53+
.withBlock([indent(`return myzod.object({`), shape, indent('})')].join('\n')).string;
54+
},
5255
},
53-
ObjectTypeDefinition: ObjectTypeDefinitionBuilder(config.withObjectType, (node: ObjectTypeDefinitionNode) => {
54-
const name = tsVisitor.convertName(node.name.value);
55-
importTypes.push(name);
56-
57-
const shape = node.fields
58-
?.map(field => generateFieldMyZodSchema(config, tsVisitor, schema, field, 2))
59-
.join(',\n');
60-
61-
return new DeclarationBlock({})
62-
.export()
63-
.asKind('function')
64-
.withName(`${name}Schema(): myzod.Type<${name}>`)
65-
.withBlock(
66-
[
67-
indent(`return myzod.object({`),
68-
indent(`__typename: myzod.literal('${node.name.value}').optional(),`, 2),
69-
shape,
70-
indent('})'),
71-
].join('\n')
72-
).string;
73-
}),
74-
EnumTypeDefinition: (node: EnumTypeDefinitionNode) => {
75-
const enumname = tsVisitor.convertName(node.name.value);
76-
importTypes.push(enumname);
77-
// z.enum are basically myzod.literals
78-
if (config.enumsAsTypes) {
56+
ObjectTypeDefinition: {
57+
leave: ObjectTypeDefinitionBuilder(config.withObjectType, (node: ObjectTypeDefinitionNode) => {
58+
const name = tsVisitor.convertName(node.name.value);
59+
importTypes.push(name);
60+
61+
const shape = node.fields
62+
?.map(field => generateFieldMyZodSchema(config, tsVisitor, schema, field, 2))
63+
.join(',\n');
64+
7965
return new DeclarationBlock({})
8066
.export()
81-
.asKind('type')
82-
.withName(`${enumname}Schema`)
83-
.withContent(`myzod.literals(${node.values?.map(enumOption => `'${enumOption.name.value}'`).join(', ')})`)
84-
.string;
85-
}
67+
.asKind('function')
68+
.withName(`${name}Schema(): myzod.Type<${name}>`)
69+
.withBlock(
70+
[
71+
indent(`return myzod.object({`),
72+
indent(`__typename: myzod.literal('${node.name.value}').optional(),`, 2),
73+
shape,
74+
indent('})'),
75+
].join('\n')
76+
).string;
77+
}),
78+
},
79+
EnumTypeDefinition: {
80+
leave: (node: EnumTypeDefinitionNode) => {
81+
const enumname = tsVisitor.convertName(node.name.value);
82+
importTypes.push(enumname);
83+
// z.enum are basically myzod.literals
84+
if (config.enumsAsTypes) {
85+
return new DeclarationBlock({})
86+
.export()
87+
.asKind('type')
88+
.withName(`${enumname}Schema`)
89+
.withContent(`myzod.literals(${node.values?.map(enumOption => `'${enumOption.name.value}'`).join(', ')})`)
90+
.string;
91+
}
8692

87-
return new DeclarationBlock({})
88-
.export()
89-
.asKind('const')
90-
.withName(`${enumname}Schema`)
91-
.withContent(`myzod.enum(${enumname})`).string;
93+
return new DeclarationBlock({})
94+
.export()
95+
.asKind('const')
96+
.withName(`${enumname}Schema`)
97+
.withContent(`myzod.enum(${enumname})`).string;
98+
},
9299
},
93-
UnionTypeDefinition: (node: UnionTypeDefinitionNode) => {
94-
if (!node.types || !config.withObjectType) return;
100+
UnionTypeDefinition: {
101+
leave: (node: UnionTypeDefinitionNode) => {
102+
if (!node.types || !config.withObjectType) return;
95103

96-
const unionName = tsVisitor.convertName(node.name.value);
97-
const unionElements = node.types?.map(t => `${tsVisitor.convertName(t.name.value)}Schema()`).join(', ');
98-
const unionElementsCount = node.types?.length ?? 0;
104+
const unionName = tsVisitor.convertName(node.name.value);
105+
const unionElements = node.types?.map(t => `${tsVisitor.convertName(t.name.value)}Schema()`).join(', ');
106+
const unionElementsCount = node.types?.length ?? 0;
99107

100-
const union =
101-
unionElementsCount > 1 ? indent(`return myzod.union([${unionElements}])`) : indent(`return ${unionElements}`);
108+
const union =
109+
unionElementsCount > 1 ? indent(`return myzod.union([${unionElements}])`) : indent(`return ${unionElements}`);
102110

103-
return new DeclarationBlock({}).export().asKind('function').withName(`${unionName}Schema()`).withBlock(union)
104-
.string;
111+
return new DeclarationBlock({}).export().asKind('function').withName(`${unionName}Schema()`).withBlock(union)
112+
.string;
113+
},
105114
},
106115
};
107116
};

src/types.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { oldVisit } from '@graphql-codegen/plugin-helpers';
2+
import { ASTNode, ASTVisitFn } from 'graphql';
3+
4+
export type NewVisitor = Partial<{
5+
readonly [NodeT in ASTNode as NodeT['kind']]?: {
6+
leave?: ASTVisitFn<NodeT>;
7+
};
8+
}>;
9+
export type OldLeaveVisitor = Partial<Parameters<typeof oldVisit>[1]['leave']>;
10+
export type SchemaVisitor = {
11+
buildImports: () => string[];
12+
initialEmit: () => string;
13+
} & NewVisitor;

src/yup/index.ts

Lines changed: 74 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ import {
1414
import { DeclarationBlock, indent } from '@graphql-codegen/visitor-plugin-common';
1515
import { TsVisitor } from '@graphql-codegen/typescript';
1616
import { buildApi, formatDirectiveConfig } from '../directive';
17+
import { SchemaVisitor } from '../types';
1718

1819
const importYup = `import * as yup from 'yup'`;
1920

20-
export const YupSchemaVisitor = (schema: GraphQLSchema, config: ValidationSchemaPluginConfig) => {
21+
export const YupSchemaVisitor = (schema: GraphQLSchema, config: ValidationSchemaPluginConfig): SchemaVisitor => {
2122
const tsVisitor = new TsVisitor(schema, config);
2223

2324
const importTypes: string[] = [];
@@ -45,80 +46,92 @@ export const YupSchemaVisitor = (schema: GraphQLSchema, config: ValidationSchema
4546
).string
4647
);
4748
},
48-
InputObjectTypeDefinition: (node: InputObjectTypeDefinitionNode) => {
49-
const name = tsVisitor.convertName(node.name.value);
50-
importTypes.push(name);
49+
InputObjectTypeDefinition: {
50+
leave: (node: InputObjectTypeDefinitionNode) => {
51+
const name = tsVisitor.convertName(node.name.value);
52+
importTypes.push(name);
5153

52-
const shape = node.fields?.map(field => generateFieldYupSchema(config, tsVisitor, schema, field, 2)).join(',\n');
54+
const shape = node.fields
55+
?.map(field => generateFieldYupSchema(config, tsVisitor, schema, field, 2))
56+
.join(',\n');
5357

54-
return new DeclarationBlock({})
55-
.export()
56-
.asKind('function')
57-
.withName(`${name}Schema(): yup.SchemaOf<${name}>`)
58-
.withBlock([indent(`return yup.object({`), shape, indent('})')].join('\n')).string;
58+
return new DeclarationBlock({})
59+
.export()
60+
.asKind('function')
61+
.withName(`${name}Schema(): yup.SchemaOf<${name}>`)
62+
.withBlock([indent(`return yup.object({`), shape, indent('})')].join('\n')).string;
63+
},
5964
},
60-
ObjectTypeDefinition: ObjectTypeDefinitionBuilder(config.withObjectType, (node: ObjectTypeDefinitionNode) => {
61-
const name = tsVisitor.convertName(node.name.value);
62-
importTypes.push(name);
65+
ObjectTypeDefinition: {
66+
leave: ObjectTypeDefinitionBuilder(config.withObjectType, (node: ObjectTypeDefinitionNode) => {
67+
const name = tsVisitor.convertName(node.name.value);
68+
importTypes.push(name);
6369

64-
const shape = node.fields?.map(field => generateFieldYupSchema(config, tsVisitor, schema, field, 2)).join(',\n');
70+
const shape = node.fields
71+
?.map(field => generateFieldYupSchema(config, tsVisitor, schema, field, 2))
72+
.join(',\n');
6573

66-
return new DeclarationBlock({})
67-
.export()
68-
.asKind('function')
69-
.withName(`${name}Schema(): yup.SchemaOf<${name}>`)
70-
.withBlock(
71-
[
72-
indent(`return yup.object({`),
73-
indent(`__typename: yup.mixed().oneOf(['${node.name.value}', undefined]),`, 2),
74-
shape,
75-
indent('})'),
76-
].join('\n')
77-
).string;
78-
}),
79-
EnumTypeDefinition: (node: EnumTypeDefinitionNode) => {
80-
const enumname = tsVisitor.convertName(node.name.value);
81-
importTypes.push(enumname);
74+
return new DeclarationBlock({})
75+
.export()
76+
.asKind('function')
77+
.withName(`${name}Schema(): yup.SchemaOf<${name}>`)
78+
.withBlock(
79+
[
80+
indent(`return yup.object({`),
81+
indent(`__typename: yup.mixed().oneOf(['${node.name.value}', undefined]),`, 2),
82+
shape,
83+
indent('})'),
84+
].join('\n')
85+
).string;
86+
}),
87+
},
88+
EnumTypeDefinition: {
89+
leave: (node: EnumTypeDefinitionNode) => {
90+
const enumname = tsVisitor.convertName(node.name.value);
91+
importTypes.push(enumname);
92+
93+
if (config.enumsAsTypes) {
94+
return new DeclarationBlock({})
95+
.export()
96+
.asKind('const')
97+
.withName(`${enumname}Schema`)
98+
.withContent(
99+
`yup.mixed().oneOf([${node.values?.map(enumOption => `'${enumOption.name.value}'`).join(', ')}])`
100+
).string;
101+
}
82102

83-
if (config.enumsAsTypes) {
103+
const values = node.values
104+
?.map(
105+
enumOption =>
106+
`${enumname}.${tsVisitor.convertName(enumOption.name, {
107+
useTypesPrefix: false,
108+
transformUnderscore: true,
109+
})}`
110+
)
111+
.join(', ');
84112
return new DeclarationBlock({})
85113
.export()
86114
.asKind('const')
87115
.withName(`${enumname}Schema`)
88-
.withContent(
89-
`yup.mixed().oneOf([${node.values?.map(enumOption => `'${enumOption.name.value}'`).join(', ')}])`
90-
).string;
91-
}
92-
93-
const values = node.values
94-
?.map(
95-
enumOption =>
96-
`${enumname}.${tsVisitor.convertName(enumOption.name, {
97-
useTypesPrefix: false,
98-
transformUnderscore: true,
99-
})}`
100-
)
101-
.join(', ');
102-
return new DeclarationBlock({})
103-
.export()
104-
.asKind('const')
105-
.withName(`${enumname}Schema`)
106-
.withContent(`yup.mixed().oneOf([${values}])`).string;
116+
.withContent(`yup.mixed().oneOf([${values}])`).string;
117+
},
107118
},
108-
UnionTypeDefinition: (node: UnionTypeDefinitionNode) => {
109-
if (!node.types || !config.withObjectType) return;
119+
UnionTypeDefinition: {
120+
leave: (node: UnionTypeDefinitionNode) => {
121+
if (!node.types || !config.withObjectType) return;
110122

111-
const unionName = tsVisitor.convertName(node.name.value);
112-
importTypes.push(unionName);
123+
const unionName = tsVisitor.convertName(node.name.value);
124+
importTypes.push(unionName);
113125

114-
const unionElements = node.types?.map(t => `${tsVisitor.convertName(t.name.value)}Schema()`).join(', ');
115-
const union = indent(`return union<${unionName}>(${unionElements})`);
126+
const unionElements = node.types?.map(t => `${tsVisitor.convertName(t.name.value)}Schema()`).join(', ');
127+
const union = indent(`return union<${unionName}>(${unionElements})`);
116128

117-
return new DeclarationBlock({})
118-
.export()
119-
.asKind('function')
120-
.withName(`${unionName}Schema(): yup.BaseSchema<${unionName}>`)
121-
.withBlock(union).string;
129+
return new DeclarationBlock({})
130+
.export()
131+
.asKind('function')
132+
.withName(`${unionName}Schema(): yup.BaseSchema<${unionName}>`)
133+
.withBlock(union).string;
134+
},
122135
},
123136
// ScalarTypeDefinition: (node) => {
124137
// const decl = new DeclarationBlock({})

0 commit comments

Comments
 (0)