Skip to content
This repository was archived by the owner on Oct 8, 2024. It is now read-only.

Commit 4c54b58

Browse files
authored
E2RPRO-4480 validation 自動生成 -- カスタムメソッド追加 (Code-Hex#8)
* refactor: split shape Renderer and Factory * sort * bump * rm field arg from sometimes
1 parent 25f1738 commit 4c54b58

File tree

15 files changed

+89
-58
lines changed

15 files changed

+89
-58
lines changed

example/yup/schemas.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export function EventArgumentInputSchema(): yup.ObjectSchema<EventArgumentInput>
5050
return yup.object({
5151
favorites: yup.array(yup.string().maxLength(16).nonNullable().defined()).size(5).nonNullable().defined(),
5252
name: yup.lazy(() => yup.string().varchar().required_without("nickname").nonNullable().defined()),
53-
nickname: yup.lazy(() => yup.string().sometimes("nickname", schema => schema.varchar().max(10).required_without("name")).nullable()),
53+
nickname: yup.lazy(() => yup.string().sometimes(schema => schema.varchar().max(10).required_without("name")).nullable()),
5454
value: yup.string().startsWith("Sir").nonNullable().defined()
5555
}).strict()
5656
}

example/yup/yup.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ declare module 'yup' {
99
> extends Schema<TType, TContext, TDefault, TFlags> {
1010
maxLength(size: number): this;
1111
varchar(): this;
12-
sometimes(str: string, callback: (schema: this) => this): this;
12+
sometimes(callback: (schema: this) => this): this;
1313
startsWith(str: string): this;
1414
required_without(str: string): this;
1515
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "graphql-codegen-lighthouse-yup-schema",
3-
"version": "0.8.2",
3+
"version": "0.9.0",
44
"description": "GraphQL Code Generator plugin to generate form validation schema from your GraphQL schema",
55
"respository": {
66
"type": "git",

src/yup/Kit.ts

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import { FieldFactory } from './renderable/field/FieldFactory';
1313
import { FieldRenderer } from './renderable/field/FieldRenderer';
1414
import { RuleASTFactory } from './renderable/ruleAST/RuleASTFactory';
1515
import { RuleASTRenderer } from './renderable/ruleAST/RuleASTRenderer';
16+
import { ShapeFactory } from './renderable/shape/ShapeFactory';
17+
import { ShapeRenderer } from './renderable/shape/ShapeRenderer';
1618
import { TypeASTFactory } from './renderable/typeAST/TypeASTFactory';
1719
import { TypeASTRenderer } from './renderable/typeAST/TypeASTRenderer';
18-
import { ShapeRenderer } from './ShapeRenderer';
1920
import { EnumTypeDefinitionFactory } from './visitFunctionFactories/EnumTypeDefinitionFactory';
2021
import { InputObjectTypeDefinitionFactory } from './visitFunctionFactories/InputObjectTypeDefinitionFactory';
2122
import { ObjectTypeDefinitionFactory } from './visitFunctionFactories/ObjectTypeDefinitionFactory';
@@ -61,6 +62,10 @@ export class Kit {
6162
}
6263
}
6364

65+
getShapeRenderer() {
66+
return new ShapeRenderer(this.getFieldRenderer());
67+
}
68+
6469
getFieldRenderer() {
6570
return new FieldRenderer(this.getTypeASTRenderer());
6671
}
@@ -69,24 +74,23 @@ export class Kit {
6974
return new TypeASTRenderer(this.config, this.getRuleASTRenderer(), this.getExportTypesStrategy());
7075
}
7176

72-
getRuleASTFactory() {
73-
return new RuleASTFactory(this.config.rules, this.config.ignoreRules, this.config.lazyRules);
74-
}
75-
7677
getRuleASTRenderer() {
7778
return new RuleASTRenderer();
7879
}
7980

80-
getShapeRenderer(scalarDirection: keyof NormalizedScalarsMap[string]) {
81-
return new ShapeRenderer(this.getFieldRenderer(), this.getFieldFactory(scalarDirection));
81+
getShapeFactory(scalarDirection: keyof NormalizedScalarsMap[string]) {
82+
return new ShapeFactory(this.getFieldFactory(scalarDirection));
8283
}
8384

85+
getFieldFactory(scalarDirection: keyof NormalizedScalarsMap[string]) {
86+
return new FieldFactory(this.getTypeASTFactory(scalarDirection), this.getRuleASTFactory());
87+
}
8488
getTypeASTFactory(scalarDirection: keyof NormalizedScalarsMap[string]) {
8589
return new TypeASTFactory(this.config.lazyTypes, scalarDirection, this.getVisitor());
8690
}
8791

88-
getFieldFactory(scalarDirection: keyof NormalizedScalarsMap[string]) {
89-
return new FieldFactory(this.getTypeASTFactory(scalarDirection), this.getRuleASTFactory());
92+
getRuleASTFactory() {
93+
return new RuleASTFactory(this.config.rules, this.config.ignoreRules, this.config.lazyRules);
9094
}
9195

9296
getImportBuilder() {
@@ -102,7 +106,8 @@ export class Kit {
102106
registry,
103107
this.getVisitor(),
104108
this.getExportTypesStrategy(),
105-
this.getShapeRenderer('input')
109+
this.getShapeFactory('input'),
110+
this.getShapeRenderer()
106111
);
107112
}
108113

@@ -112,7 +117,8 @@ export class Kit {
112117
this.getVisitor(),
113118
this.getWithObjectTypesSpec(),
114119
this.getExportTypesStrategy(),
115-
this.getShapeRenderer('output'),
120+
this.getShapeFactory('output'),
121+
this.getShapeRenderer(),
116122
this.config.addUnderscoreToArgsType
117123
);
118124
}

src/yup/ShapeRenderer.ts

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/yup/renderable/field/FieldFactory.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@ export class FieldFactory {
1616
const directives = graphQLFieldNode.directives ?? [];
1717
const rulesDirective = findDirectiveByName(directives, 'rules');
1818
const rulesForArrayDirective = findDirectiveByName(directives, 'rulesForArray');
19-
const fieldName = graphQLFieldNode.name.value;
2019

2120
const metadata = new FieldMetadata({
2221
name: graphQLFieldNode.name.value,
2322
isOptional: !isNonNullType(graphQLFieldNode.type),
24-
rule: this.ruleASTFactory.createFromDirectiveOrNull(fieldName, rulesDirective ?? null),
25-
ruleForArray: this.ruleASTFactory.createFromDirectiveOrNull(fieldName, rulesForArrayDirective ?? null),
23+
rule: this.ruleASTFactory.createFromDirectiveOrNull(rulesDirective ?? null),
24+
ruleForArray: this.ruleASTFactory.createFromDirectiveOrNull(rulesForArrayDirective ?? null),
2625
});
2726

2827
return new Field(metadata, this.typeASTFactory.create(graphQLFieldNode.type));

src/yup/renderable/ruleAST/RuleASTFactory.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ export class RuleASTFactory {
1313
private readonly supportedArgumentName: string = 'apply'
1414
) {}
1515

16-
public createFromDirectiveOrNull(fieldName: string, directive: ConstDirectiveNode | null) {
17-
return directive ? this.createFromDirective(fieldName, directive) : this.createNullObject();
16+
public createFromDirectiveOrNull(directive: ConstDirectiveNode | null) {
17+
return directive ? this.createFromDirective(directive) : this.createNullObject();
1818
}
1919

2020
public createNullObject() {
2121
return new RuleASTCompositeNode([]);
2222
}
2323

24-
public createFromDirective(fieldName: string, directive: ConstDirectiveNode) {
24+
public createFromDirective(directive: ConstDirectiveNode) {
2525
const ruleStrings = (directive.arguments ?? [])
2626
.filter(arg => arg.name.value === this.supportedArgumentName)
2727
.flatMap(({ value }) => {
@@ -32,10 +32,10 @@ export class RuleASTFactory {
3232
});
3333
});
3434

35-
return this.helper(fieldName, ruleStrings);
35+
return this.helper(ruleStrings);
3636
}
3737

38-
private helper(fieldName: string, ruleStrings: readonly string[]): RuleASTCompositeNode | RuleASTSometimesNode {
38+
private helper(ruleStrings: readonly string[]): RuleASTCompositeNode | RuleASTSometimesNode {
3939
const parsed = ruleStrings.flatMap(ruleString => {
4040
const validationRule = parse(ruleString);
4141

@@ -60,7 +60,7 @@ export class RuleASTFactory {
6060

6161
return sometimesIfExists.length === 0
6262
? compositeRule
63-
: new RuleASTSometimesNode(fieldName, compositeRule, this.requiresLazy('sometimes'));
63+
: new RuleASTSometimesNode(compositeRule, this.requiresLazy('sometimes'));
6464
}
6565

6666
private mapMethodName(ruleName: string): string {

src/yup/renderable/ruleAST/RuleASTRenderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ export class RuleASTRenderer {
1616
}
1717

1818
public renderSometimesRule(sometimesRule: RuleASTSometimesNode): string {
19-
const { fieldName, continuation } = sometimesRule.getData();
20-
return `.sometimes(${JSON.stringify(fieldName)}, schema => schema${continuation.render(this)})`;
19+
const { continuation } = sometimesRule.getData();
20+
return `.sometimes(schema => schema${continuation.render(this)})`;
2121
}
2222
}
2323

src/yup/renderable/ruleAST/RuleASTSometimesNode.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ import { RuleASTRenderer } from './RuleASTRenderer';
55
// sometimes は特殊で、他の検証ルールを無視する必要があるため、コールバックで他の検証ルールを渡す形にする。
66
export class RuleASTSometimesNode implements RuleASTNode {
77
public constructor(
8-
private readonly fieldName: string, // 消したい
98
private readonly continuation: RuleASTCompositeNode,
109
private readonly _requiresLazy: boolean
1110
) {}
1211

1312
public getData() {
1413
return {
15-
fieldName: this.fieldName,
1614
continuation: this.continuation,
1715
};
1816
}

src/yup/renderable/shape/Shape.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Field } from '../field/Field';
2+
import { ShapeRenderer } from './ShapeRenderer';
3+
4+
export class Shape {
5+
constructor(private readonly fields: readonly Field[]) {}
6+
7+
public getData() {
8+
return {
9+
fields: this.fields,
10+
};
11+
}
12+
13+
public render(shapeRenderer: ShapeRenderer): string {
14+
return shapeRenderer.render(this);
15+
}
16+
}

0 commit comments

Comments
 (0)