Skip to content

Commit d9dbd35

Browse files
committed
generated union type in examples
1 parent 0ceba60 commit d9dbd35

File tree

5 files changed

+84
-3
lines changed

5 files changed

+84
-3
lines changed

example/myzod/schemas.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
import * as myzod from 'myzod'
2-
import { AttributeInput, ButtonComponentType, ComponentInput, DropDownComponentInput, EventArgumentInput, EventInput, EventOptionType, HttpInput, HttpMethod, LayoutInput, PageInput, PageType, User } from '../types'
2+
import { Admin, AttributeInput, ButtonComponentType, ComponentInput, DropDownComponentInput, EventArgumentInput, EventInput, EventOptionType, Guest, HttpInput, HttpMethod, LayoutInput, PageInput, PageType, User } from '../types'
33

44
export const definedNonNullAnySchema = myzod.object({});
55

6+
export function AdminSchema(): myzod.Type<Admin> {
7+
return myzod.object({
8+
__typename: myzod.literal('Admin').optional(),
9+
lastModifiedAt: definedNonNullAnySchema.optional().nullable()
10+
})
11+
}
12+
613
export function AttributeInputSchema(): myzod.Type<AttributeInput> {
714
return myzod.object({
815
key: myzod.string().optional().nullable(),
@@ -45,6 +52,13 @@ export function EventInputSchema(): myzod.Type<EventInput> {
4552

4653
export const EventOptionTypeSchema = myzod.enum(EventOptionType);
4754

55+
export function GuestSchema(): myzod.Type<Guest> {
56+
return myzod.object({
57+
__typename: myzod.literal('Guest').optional(),
58+
lastLoggedIn: definedNonNullAnySchema.optional().nullable()
59+
})
60+
}
61+
4862
export function HttpInputSchema(): myzod.Type<HttpInput> {
4963
return myzod.object({
5064
method: HttpMethodSchema.optional().nullable(),
@@ -84,8 +98,11 @@ export function UserSchema(): myzod.Type<User> {
8498
createdAt: definedNonNullAnySchema.optional().nullable(),
8599
email: myzod.string().optional().nullable(),
86100
id: myzod.string().optional().nullable(),
101+
kind: UserKindSchema.optional().nullable(),
87102
name: myzod.string().optional().nullable(),
88103
password: myzod.string().optional().nullable(),
89104
updatedAt: definedNonNullAnySchema.optional().nullable()
90105
})
91106
}
107+
108+
export const UserKindSchema = myzod.union([AdminSchema(), GuestSchema()]);

example/test.graphql

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,22 @@ enum PageType {
55
BASIC_AUTH
66
}
77

8+
type Admin {
9+
lastModifiedAt: Date
10+
}
11+
12+
type Guest {
13+
lastLoggedIn: Date
14+
}
15+
16+
union UserKind = Admin | Guest
17+
818
type User {
919
id: ID
1020
name: String
1121
email: String
1222
password: String
23+
kind: UserKind
1324
createdAt: Date
1425
updatedAt: Date
1526
}

example/types.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ export type Scalars = {
1414
URL: any;
1515
};
1616

17+
export type Admin = {
18+
__typename?: 'Admin';
19+
lastModifiedAt?: Maybe<Scalars['Date']>;
20+
};
21+
1722
export type AttributeInput = {
1823
key?: InputMaybe<Scalars['String']>;
1924
val?: InputMaybe<Scalars['String']>;
@@ -52,6 +57,11 @@ export enum EventOptionType {
5257
Retry = 'RETRY'
5358
}
5459

60+
export type Guest = {
61+
__typename?: 'Guest';
62+
lastLoggedIn?: Maybe<Scalars['Date']>;
63+
};
64+
5565
export type HttpInput = {
5666
method?: InputMaybe<HttpMethod>;
5767
url: Scalars['URL'];
@@ -92,7 +102,10 @@ export type User = {
92102
createdAt?: Maybe<Scalars['Date']>;
93103
email?: Maybe<Scalars['String']>;
94104
id?: Maybe<Scalars['ID']>;
105+
kind?: Maybe<UserKind>;
95106
name?: Maybe<Scalars['String']>;
96107
password?: Maybe<Scalars['String']>;
97108
updatedAt?: Maybe<Scalars['Date']>;
98109
};
110+
111+
export type UserKind = Admin | Guest;

example/yup/schemas.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
import * as yup from 'yup'
2-
import { AttributeInput, ButtonComponentType, ComponentInput, DropDownComponentInput, EventArgumentInput, EventInput, EventOptionType, HttpInput, HttpMethod, LayoutInput, PageInput, PageType, User } from '../types'
2+
import { Admin, AttributeInput, ButtonComponentType, ComponentInput, DropDownComponentInput, EventArgumentInput, EventInput, EventOptionType, Guest, HttpInput, HttpMethod, LayoutInput, PageInput, PageType, User, UserKind } from '../types'
3+
4+
function union<T>(...schemas: ReadonlyArray<yup.SchemaOf<T>>): yup.BaseSchema<T> {
5+
return yup.mixed().test({
6+
test: (value) => schemas.some((schema) => schema.isValidSync(value))
7+
})
8+
}
9+
10+
export function AdminSchema(): yup.SchemaOf<Admin> {
11+
return yup.object({
12+
__typename: yup.mixed().oneOf(['Admin', undefined]),
13+
lastModifiedAt: yup.mixed()
14+
})
15+
}
316

417
export function AttributeInputSchema(): yup.SchemaOf<AttributeInput> {
518
return yup.object({
@@ -43,6 +56,13 @@ export function EventInputSchema(): yup.SchemaOf<EventInput> {
4356

4457
export const EventOptionTypeSchema = yup.mixed().oneOf([EventOptionType.Reload, EventOptionType.Retry]);
4558

59+
export function GuestSchema(): yup.SchemaOf<Guest> {
60+
return yup.object({
61+
__typename: yup.mixed().oneOf(['Guest', undefined]),
62+
lastLoggedIn: yup.mixed()
63+
})
64+
}
65+
4666
export function HttpInputSchema(): yup.SchemaOf<HttpInput> {
4767
return yup.object({
4868
method: HttpMethodSchema,
@@ -82,8 +102,11 @@ export function UserSchema(): yup.SchemaOf<User> {
82102
createdAt: yup.mixed(),
83103
email: yup.string(),
84104
id: yup.string(),
105+
kind: UserKindSchema,
85106
name: yup.string(),
86107
password: yup.string(),
87108
updatedAt: yup.mixed()
88109
})
89110
}
111+
112+
export const UserKindSchema: yup.BaseSchema<UserKind> = union<UserKind>(AdminSchema(), GuestSchema());

example/zod/schemas.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { z } from 'zod'
2-
import { AttributeInput, ButtonComponentType, ComponentInput, DropDownComponentInput, EventArgumentInput, EventInput, EventOptionType, HttpInput, HttpMethod, LayoutInput, PageInput, PageType, User } from '../types'
2+
import { Admin, AttributeInput, ButtonComponentType, ComponentInput, DropDownComponentInput, EventArgumentInput, EventInput, EventOptionType, Guest, HttpInput, HttpMethod, LayoutInput, PageInput, PageType, User } from '../types'
33

44
type Properties<T> = Required<{
55
[K in keyof T]: z.ZodType<T[K], any, T[K]>;
@@ -11,6 +11,13 @@ export const isDefinedNonNullAny = (v: any): v is definedNonNullAny => v !== und
1111

1212
export const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v));
1313

14+
export function AdminSchema(): z.ZodObject<Properties<Admin>> {
15+
return z.object<Properties<Admin>>({
16+
__typename: z.literal('Admin').optional(),
17+
lastModifiedAt: definedNonNullAnySchema.nullish()
18+
})
19+
}
20+
1421
export function AttributeInputSchema(): z.ZodObject<Properties<AttributeInput>> {
1522
return z.object<Properties<AttributeInput>>({
1623
key: z.string().nullish(),
@@ -53,6 +60,13 @@ export function EventInputSchema(): z.ZodObject<Properties<EventInput>> {
5360

5461
export const EventOptionTypeSchema = z.nativeEnum(EventOptionType);
5562

63+
export function GuestSchema(): z.ZodObject<Properties<Guest>> {
64+
return z.object<Properties<Guest>>({
65+
__typename: z.literal('Guest').optional(),
66+
lastLoggedIn: definedNonNullAnySchema.nullish()
67+
})
68+
}
69+
5670
export function HttpInputSchema(): z.ZodObject<Properties<HttpInput>> {
5771
return z.object<Properties<HttpInput>>({
5872
method: HttpMethodSchema.nullish(),
@@ -92,8 +106,11 @@ export function UserSchema(): z.ZodObject<Properties<User>> {
92106
createdAt: definedNonNullAnySchema.nullish(),
93107
email: z.string().nullish(),
94108
id: z.string().nullish(),
109+
kind: UserKindSchema.nullish(),
95110
name: z.string().nullish(),
96111
password: z.string().nullish(),
97112
updatedAt: definedNonNullAnySchema.nullish()
98113
})
99114
}
115+
116+
export const UserKindSchema = z.union([AdminSchema(), GuestSchema()]);

0 commit comments

Comments
 (0)