orchid-orm-schema-to-zod 0.0.1
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.
- package/README.md +5 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.esm.js +368 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +374 -0
- package/dist/index.js.map +1 -0
- package/jest-setup.ts +3 -0
- package/package.json +62 -0
- package/rollup.config.js +3 -0
- package/src/index.test.ts +1249 -0
- package/src/index.ts +667 -0
- package/tsconfig.json +12 -0
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import * as pqb from 'pqb';
|
|
2
|
+
import { ColumnsShape, ColumnType, EnumColumn, ArrayColumn, JSONColumn, JSONTypeAny, JSONArray, JSONEnum, JSONInstanceOf, JSONLiteral, JSONMap, JSONSet, JSONNativeEnum, JSONTuple, JSONObject, UnknownKeysParam, JSONRecord, JSONRecordKeyType, JSONIntersection, JSONDiscriminatedUnion, Primitive } from 'pqb';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { Buffer } from 'node:buffer';
|
|
5
|
+
|
|
6
|
+
declare type NumberType = 'smallint' | 'integer' | 'real' | 'smallserial' | 'serial' | 'money';
|
|
7
|
+
declare type BigIntType = 'bigint' | 'numeric' | 'decimal' | 'double precision' | 'bigserial';
|
|
8
|
+
declare type StringType = 'varchar' | 'char' | 'text' | 'string' | 'xml' | 'json';
|
|
9
|
+
declare type DateTimeType = 'date' | 'timestamp' | 'timestamp with time zone';
|
|
10
|
+
declare type TimeType = 'time' | 'time with time zone';
|
|
11
|
+
declare type GeometryType = 'point' | 'line' | 'lseg' | 'box' | 'path' | 'polygon' | 'circle';
|
|
12
|
+
declare type NetworkType = 'cidr' | 'inet' | 'macaddr' | 'macaddr8';
|
|
13
|
+
declare type BitStringType = 'bit' | 'bit varying';
|
|
14
|
+
declare type FullTextSearchType = 'tsvector' | 'tsquery';
|
|
15
|
+
declare type UUIDType = 'uuid';
|
|
16
|
+
declare type ByteaType = 'bytea';
|
|
17
|
+
declare type SchemaToZod<T extends ColumnType, D = T['dataType']> = T['isNullable'] extends true ? z.ZodNullable<SchemaToZod<Omit<T, 'isNullable'> & {
|
|
18
|
+
isNullable: false;
|
|
19
|
+
}>> : D extends NumberType ? z.ZodNumber : D extends BigIntType | StringType | TimeType | GeometryType | NetworkType | BitStringType | FullTextSearchType | UUIDType ? z.ZodString : D extends ByteaType ? z.ZodType<Buffer> : D extends DateTimeType ? z.ZodDate : D extends 'interval' ? typeof interval : D extends 'boolean' ? z.ZodBoolean : T extends EnumColumn<string, infer U> ? z.ZodEnum<U> : T extends ArrayColumn<infer U> ? z.ZodArray<SchemaToZod<U>> : T extends JSONColumn ? JsonToZod<T['data']['schema']> : never;
|
|
20
|
+
declare type JsonToZod<T extends JSONTypeAny, D = T['dataType']> = T extends {
|
|
21
|
+
types: [JSONTypeAny, JSONTypeAny, ...JSONTypeAny[]];
|
|
22
|
+
} ? z.ZodUnion<MapJsonTuple<T['types']>> : T['data'] extends {
|
|
23
|
+
nullable: true;
|
|
24
|
+
} ? T['data'] extends {
|
|
25
|
+
optional: true;
|
|
26
|
+
} ? z.ZodNullable<z.ZodOptional<JsonToZod<Omit<T, 'data'> & {
|
|
27
|
+
data: Omit<T['data'], 'nullable' | 'optional'>;
|
|
28
|
+
}>>> : z.ZodNullable<JsonToZod<Omit<T, 'data'> & {
|
|
29
|
+
data: Omit<T['data'], 'nullable'>;
|
|
30
|
+
}>> : T['data'] extends {
|
|
31
|
+
optional: true;
|
|
32
|
+
} ? z.ZodOptional<JsonToZod<Omit<T, 'data'> & {
|
|
33
|
+
data: Omit<T['data'], 'optional'>;
|
|
34
|
+
}>> : D extends 'bigint' ? z.ZodString : D extends 'boolean' ? z.ZodBoolean : D extends 'date' ? z.ZodDate : D extends 'nan' ? z.ZodNaN : D extends 'never' ? z.ZodNever : D extends 'null' ? z.ZodNull : D extends 'number' ? z.ZodNumber : D extends 'string' ? z.ZodString : D extends 'undefined' ? z.ZodUndefined : D extends 'unknown' ? z.ZodUnknown : D extends 'void' ? z.ZodVoid : T extends JSONArray<infer U> ? z.ZodArray<JsonToZod<U>> : T extends JSONEnum<string, infer U> ? z.ZodEnum<U> : T extends JSONInstanceOf<infer U> ? z.ZodType<InstanceType<U>, z.ZodTypeDef, InstanceType<U>> : T extends JSONLiteral<infer U> ? z.ZodLiteral<U> : T extends JSONMap<infer K, infer V> ? z.ZodMap<JsonToZod<K>, JsonToZod<V>> : T extends JSONSet<infer U> ? z.ZodSet<JsonToZod<U>> : T extends JSONNativeEnum<infer U> ? z.ZodNativeEnum<U> : T extends JSONTuple<infer U, infer R> ? z.ZodTuple<MapJsonTuple<U>, R extends JSONTypeAny ? JsonToZod<R> : null> : T extends JSONObject<Record<string, JSONTypeAny>, UnknownKeysParam> ? z.ZodObject<{
|
|
35
|
+
[K in keyof T['shape']]: JsonToZod<T['shape'][K]>;
|
|
36
|
+
}, T['unknownKeys'], JsonToZod<T['catchAllType']>> : T extends JSONRecord<JSONRecordKeyType, JSONTypeAny> ? z.ZodRecord<JsonToZod<T['keyType']> extends z.ZodType<string | number | symbol, any, any> ? JsonToZod<T['keyType']> : never, JsonToZod<T['valueType']>> : T extends JSONIntersection<JSONTypeAny, JSONTypeAny> ? z.ZodIntersection<JsonToZod<T['left']>, JsonToZod<T['right']>> : T extends JSONDiscriminatedUnion<string, Primitive, any> ? z.ZodDiscriminatedUnion<T['discriminator'], T['discriminatorValue'], JsonToZod<T['_option']> extends z.ZodDiscriminatedUnionOption<T['discriminator'], T['discriminatorValue']> ? JsonToZod<T['_option']> : never> : D extends 'any' ? z.ZodTypeAny : z.ZodType<T['type']>;
|
|
37
|
+
declare type MapJsonTuple<T extends unknown[]> = T extends [infer Head, ...infer Tail] ? [Head extends JSONTypeAny ? JsonToZod<Head> : never, ...MapJsonTuple<Tail>] : [];
|
|
38
|
+
declare type ModelToZod<T extends new () => {
|
|
39
|
+
columns: {
|
|
40
|
+
shape: ColumnsShape;
|
|
41
|
+
};
|
|
42
|
+
}> = InstanceToZod<InstanceType<T>['columns']>;
|
|
43
|
+
declare const modelToZod: <T extends new () => {
|
|
44
|
+
columns: {
|
|
45
|
+
shape: ColumnsShape;
|
|
46
|
+
};
|
|
47
|
+
}>(model: T) => ModelToZod<T>;
|
|
48
|
+
declare type InstanceToZod<T extends {
|
|
49
|
+
shape: ColumnsShape;
|
|
50
|
+
}> = z.ZodObject<{
|
|
51
|
+
[K in keyof T['shape']]: SchemaToZod<T['shape'][K]>;
|
|
52
|
+
}>;
|
|
53
|
+
declare const instanceToZod: <T extends {
|
|
54
|
+
shape: ColumnsShape;
|
|
55
|
+
}>({ shape, }: T) => InstanceToZod<T>;
|
|
56
|
+
declare const columnToZod: <T extends ColumnType<unknown, pqb.Operators, unknown>>(column: T) => SchemaToZod<T, T["dataType"]>;
|
|
57
|
+
declare const interval: z.ZodObject<{
|
|
58
|
+
years: z.ZodOptional<z.ZodNumber>;
|
|
59
|
+
months: z.ZodOptional<z.ZodNumber>;
|
|
60
|
+
days: z.ZodOptional<z.ZodNumber>;
|
|
61
|
+
hours: z.ZodOptional<z.ZodNumber>;
|
|
62
|
+
seconds: z.ZodOptional<z.ZodNumber>;
|
|
63
|
+
}, "strict", z.ZodTypeAny, {
|
|
64
|
+
years?: number | undefined;
|
|
65
|
+
months?: number | undefined;
|
|
66
|
+
days?: number | undefined;
|
|
67
|
+
hours?: number | undefined;
|
|
68
|
+
seconds?: number | undefined;
|
|
69
|
+
}, {
|
|
70
|
+
years?: number | undefined;
|
|
71
|
+
months?: number | undefined;
|
|
72
|
+
days?: number | undefined;
|
|
73
|
+
hours?: number | undefined;
|
|
74
|
+
seconds?: number | undefined;
|
|
75
|
+
}>;
|
|
76
|
+
|
|
77
|
+
export { InstanceToZod, ModelToZod, columnToZod, instanceToZod, modelToZod };
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { ColumnType } from 'pqb';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { Buffer } from 'node:buffer';
|
|
4
|
+
|
|
5
|
+
const modelToZod = (model) => {
|
|
6
|
+
return instanceToZod(new model().columns);
|
|
7
|
+
};
|
|
8
|
+
const instanceToZod = ({
|
|
9
|
+
shape
|
|
10
|
+
}) => {
|
|
11
|
+
const result = {};
|
|
12
|
+
for (const key in shape) {
|
|
13
|
+
result[key] = columnToZod(shape[key]);
|
|
14
|
+
}
|
|
15
|
+
return z.object(result);
|
|
16
|
+
};
|
|
17
|
+
const columnToZod = (column) => {
|
|
18
|
+
var _a;
|
|
19
|
+
const dataType = ((_a = column.data.as) == null ? void 0 : _a.dataType) || column.dataType;
|
|
20
|
+
const converter = converters[dataType];
|
|
21
|
+
if (!converter)
|
|
22
|
+
throw new Error(`Cannot parse column ${dataType}`);
|
|
23
|
+
return converter(column);
|
|
24
|
+
};
|
|
25
|
+
const typeHandler = (fn) => {
|
|
26
|
+
return (column) => {
|
|
27
|
+
let type = fn(column);
|
|
28
|
+
column.chain.forEach((item) => {
|
|
29
|
+
if (item[0] === "transform") {
|
|
30
|
+
type = type.transform(item[1]);
|
|
31
|
+
} else if (item[0] === "to") {
|
|
32
|
+
type = z.preprocess(item[1], itemToZod(item[2]));
|
|
33
|
+
} else if (item[0] === "refine") {
|
|
34
|
+
type = type.refine(item[1]);
|
|
35
|
+
} else if (item[0] === "superRefine") {
|
|
36
|
+
type = type.superRefine(item[1]);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
if ("nullable" in column.data && column.data.nullable || column.isNullable) {
|
|
40
|
+
if ("optional" in column.data && column.data.optional) {
|
|
41
|
+
type = type.nullish();
|
|
42
|
+
} else {
|
|
43
|
+
type = type.nullable();
|
|
44
|
+
}
|
|
45
|
+
} else if ("optional" in column.data && column.data.optional) {
|
|
46
|
+
type = type.optional();
|
|
47
|
+
}
|
|
48
|
+
if (column instanceof ColumnType) {
|
|
49
|
+
if (column.data.validationDefault !== void 0) {
|
|
50
|
+
type = type.default(column.data.validationDefault);
|
|
51
|
+
}
|
|
52
|
+
} else if (column.data.default !== void 0) {
|
|
53
|
+
type = type.default(column.data.default);
|
|
54
|
+
}
|
|
55
|
+
return type;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
const stringParams = [
|
|
59
|
+
"min",
|
|
60
|
+
"max",
|
|
61
|
+
"length",
|
|
62
|
+
"regex",
|
|
63
|
+
"startsWith",
|
|
64
|
+
"endsWith"
|
|
65
|
+
];
|
|
66
|
+
const stringEmptyParams = ["email", "url", "uuid", "cuid", "trim"];
|
|
67
|
+
const handleString = typeHandler((column) => {
|
|
68
|
+
let type = z.string();
|
|
69
|
+
stringParams.forEach((key) => {
|
|
70
|
+
const value = column.data[key];
|
|
71
|
+
if (value !== void 0) {
|
|
72
|
+
type = type[key](value);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
stringEmptyParams.forEach((key) => {
|
|
76
|
+
const value = column.data[key];
|
|
77
|
+
if (value) {
|
|
78
|
+
type = type[key]();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return type;
|
|
82
|
+
});
|
|
83
|
+
const numberParams = ["lt", "lte", "gt", "gte", "multipleOf"];
|
|
84
|
+
const handleNumber = typeHandler((column) => {
|
|
85
|
+
let type = z.number();
|
|
86
|
+
numberParams.forEach((key) => {
|
|
87
|
+
const value = column.data[key];
|
|
88
|
+
if (value !== void 0) {
|
|
89
|
+
type = type[key](value);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
if (column.data.int) {
|
|
93
|
+
type = type.int();
|
|
94
|
+
}
|
|
95
|
+
return type;
|
|
96
|
+
});
|
|
97
|
+
const handleBigInt = typeHandler(() => {
|
|
98
|
+
return z.string().refine(
|
|
99
|
+
(value) => {
|
|
100
|
+
try {
|
|
101
|
+
BigInt(value);
|
|
102
|
+
return true;
|
|
103
|
+
} catch (_) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
message: "Failed to parse bigint"
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
});
|
|
112
|
+
const handleBuffer = typeHandler(() => {
|
|
113
|
+
return z.instanceof(Buffer);
|
|
114
|
+
});
|
|
115
|
+
const dateParams = ["min", "max"];
|
|
116
|
+
const handleDate = typeHandler((column) => {
|
|
117
|
+
let type = z.date();
|
|
118
|
+
dateParams.forEach((key) => {
|
|
119
|
+
const value = column.data[key];
|
|
120
|
+
if (value !== void 0) {
|
|
121
|
+
type = type[key](value);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return z.preprocess(
|
|
125
|
+
(val) => typeof val === "string" ? new Date(val) : val,
|
|
126
|
+
type
|
|
127
|
+
);
|
|
128
|
+
});
|
|
129
|
+
const handleTime = typeHandler(() => {
|
|
130
|
+
return z.string().refine(
|
|
131
|
+
(val) => {
|
|
132
|
+
return !isNaN(new Date(`2000-01-01 ${val}`).getTime());
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
message: "Invalid time"
|
|
136
|
+
}
|
|
137
|
+
);
|
|
138
|
+
});
|
|
139
|
+
const interval = z.object({
|
|
140
|
+
years: z.number().optional(),
|
|
141
|
+
months: z.number().optional(),
|
|
142
|
+
days: z.number().optional(),
|
|
143
|
+
hours: z.number().optional(),
|
|
144
|
+
seconds: z.number().optional()
|
|
145
|
+
}).strict();
|
|
146
|
+
const handleInterval = typeHandler(() => {
|
|
147
|
+
return interval;
|
|
148
|
+
});
|
|
149
|
+
const handleBoolean = typeHandler(() => {
|
|
150
|
+
return z.boolean();
|
|
151
|
+
});
|
|
152
|
+
const handleEnum = typeHandler((column) => {
|
|
153
|
+
const enumColumn = column;
|
|
154
|
+
return z.enum(enumColumn.options);
|
|
155
|
+
});
|
|
156
|
+
const handleBitString = typeHandler(() => {
|
|
157
|
+
return z.string().regex(/[10]/g);
|
|
158
|
+
});
|
|
159
|
+
const handleUUID = typeHandler(() => {
|
|
160
|
+
return z.string().uuid();
|
|
161
|
+
});
|
|
162
|
+
const arrayParams = ["min", "max", "length"];
|
|
163
|
+
const handleArray = typeHandler(
|
|
164
|
+
(array) => {
|
|
165
|
+
let type;
|
|
166
|
+
if ("element" in array) {
|
|
167
|
+
type = z.array(jsonItemToZod(array.element));
|
|
168
|
+
} else {
|
|
169
|
+
type = z.array(columnToZod(array.data.item));
|
|
170
|
+
}
|
|
171
|
+
arrayParams.forEach((key) => {
|
|
172
|
+
const value = array.data[key];
|
|
173
|
+
if (value !== void 0) {
|
|
174
|
+
type = type[key](value);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
return type;
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
const handleJson = typeHandler((column) => {
|
|
181
|
+
const type = column.data.schema;
|
|
182
|
+
return jsonItemToZod(type);
|
|
183
|
+
});
|
|
184
|
+
const jsonItemToZod = (type) => {
|
|
185
|
+
const converter = jsonConverters[type.dataType];
|
|
186
|
+
if (!converter)
|
|
187
|
+
throw new Error(`Cannot parse column ${type.dataType}`);
|
|
188
|
+
return converter(type);
|
|
189
|
+
};
|
|
190
|
+
const itemToZod = (item) => {
|
|
191
|
+
return item instanceof ColumnType ? columnToZod(item) : jsonItemToZod(item);
|
|
192
|
+
};
|
|
193
|
+
const converters = {
|
|
194
|
+
varchar: handleString,
|
|
195
|
+
char: handleString,
|
|
196
|
+
text: handleString,
|
|
197
|
+
smallint: handleNumber,
|
|
198
|
+
integer: handleNumber,
|
|
199
|
+
real: handleNumber,
|
|
200
|
+
smallserial: handleNumber,
|
|
201
|
+
serial: handleNumber,
|
|
202
|
+
money: handleNumber,
|
|
203
|
+
bigint: handleBigInt,
|
|
204
|
+
decimal: handleBigInt,
|
|
205
|
+
"double precision": handleBigInt,
|
|
206
|
+
bigserial: handleBigInt,
|
|
207
|
+
bytea: handleBuffer,
|
|
208
|
+
date: handleDate,
|
|
209
|
+
timestamp: handleDate,
|
|
210
|
+
"timestamp with time zone": handleDate,
|
|
211
|
+
time: handleTime,
|
|
212
|
+
"time with time zone": handleTime,
|
|
213
|
+
interval: handleInterval,
|
|
214
|
+
boolean: handleBoolean,
|
|
215
|
+
enum: handleEnum,
|
|
216
|
+
point: handleString,
|
|
217
|
+
line: handleString,
|
|
218
|
+
lseg: handleString,
|
|
219
|
+
box: handleString,
|
|
220
|
+
path: handleString,
|
|
221
|
+
polygon: handleString,
|
|
222
|
+
circle: handleString,
|
|
223
|
+
cidr: handleString,
|
|
224
|
+
inet: handleString,
|
|
225
|
+
macaddr: handleString,
|
|
226
|
+
macaddr8: handleString,
|
|
227
|
+
bit: handleBitString,
|
|
228
|
+
"bit varying": handleBitString,
|
|
229
|
+
tsvector: handleString,
|
|
230
|
+
tsquery: handleString,
|
|
231
|
+
xml: handleString,
|
|
232
|
+
json: handleString,
|
|
233
|
+
uuid: handleUUID,
|
|
234
|
+
array: handleArray,
|
|
235
|
+
jsonb: handleJson
|
|
236
|
+
};
|
|
237
|
+
const handleAny = typeHandler(() => {
|
|
238
|
+
return z.any();
|
|
239
|
+
});
|
|
240
|
+
const handleNaN = typeHandler(() => {
|
|
241
|
+
return z.nan();
|
|
242
|
+
});
|
|
243
|
+
const handleNever = typeHandler(() => {
|
|
244
|
+
return z.never();
|
|
245
|
+
});
|
|
246
|
+
const handleNull = typeHandler(() => {
|
|
247
|
+
return z.null();
|
|
248
|
+
});
|
|
249
|
+
const handleUndefined = typeHandler(() => {
|
|
250
|
+
return z.undefined();
|
|
251
|
+
});
|
|
252
|
+
const handleUnknown = typeHandler(() => {
|
|
253
|
+
return z.unknown();
|
|
254
|
+
});
|
|
255
|
+
const handleVoid = typeHandler(() => {
|
|
256
|
+
return z.void();
|
|
257
|
+
});
|
|
258
|
+
const handleInstanceOf = typeHandler(
|
|
259
|
+
(type) => {
|
|
260
|
+
return z.instanceof(type.class);
|
|
261
|
+
}
|
|
262
|
+
);
|
|
263
|
+
const handleLiteral = typeHandler((type) => {
|
|
264
|
+
return z.literal(type.value);
|
|
265
|
+
});
|
|
266
|
+
const handleMap = typeHandler((type) => {
|
|
267
|
+
const { keyType, valueType } = type;
|
|
268
|
+
return z.map(jsonItemToZod(keyType), jsonItemToZod(valueType));
|
|
269
|
+
});
|
|
270
|
+
const setParams = ["min", "max", "size"];
|
|
271
|
+
const handleSet = typeHandler((column) => {
|
|
272
|
+
const { valueType } = column;
|
|
273
|
+
let type = z.set(jsonItemToZod(valueType));
|
|
274
|
+
setParams.forEach((key) => {
|
|
275
|
+
const value = column.data[key];
|
|
276
|
+
if (value !== void 0) {
|
|
277
|
+
type = type[key](value);
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
return type;
|
|
281
|
+
});
|
|
282
|
+
const handleNativeEnum = typeHandler((type) => {
|
|
283
|
+
return z.nativeEnum(type.enum);
|
|
284
|
+
});
|
|
285
|
+
const handleTuple = typeHandler((column) => {
|
|
286
|
+
let type = z.tuple(
|
|
287
|
+
column.items.map((item) => jsonItemToZod(item))
|
|
288
|
+
);
|
|
289
|
+
if (column.restType) {
|
|
290
|
+
type = type.rest(jsonItemToZod(column.restType));
|
|
291
|
+
}
|
|
292
|
+
return type;
|
|
293
|
+
});
|
|
294
|
+
const handleObject = typeHandler(
|
|
295
|
+
(type) => {
|
|
296
|
+
const shape = {};
|
|
297
|
+
for (const key in type.shape) {
|
|
298
|
+
shape[key] = jsonItemToZod(type.shape[key]);
|
|
299
|
+
}
|
|
300
|
+
let object = z.object(shape);
|
|
301
|
+
if (type.unknownKeys === "passthrough") {
|
|
302
|
+
object = object.passthrough();
|
|
303
|
+
} else if (type.unknownKeys === "strict") {
|
|
304
|
+
object = object.strict();
|
|
305
|
+
}
|
|
306
|
+
if (type.catchAllType) {
|
|
307
|
+
object = object.catchall(jsonItemToZod(type.catchAllType));
|
|
308
|
+
}
|
|
309
|
+
return object;
|
|
310
|
+
}
|
|
311
|
+
);
|
|
312
|
+
const handleRecord = typeHandler(
|
|
313
|
+
(type) => {
|
|
314
|
+
return z.record(jsonItemToZod(type.keyType), jsonItemToZod(type.valueType));
|
|
315
|
+
}
|
|
316
|
+
);
|
|
317
|
+
const handleUnion = typeHandler(
|
|
318
|
+
(type) => {
|
|
319
|
+
return z.union(type.types.map(jsonItemToZod));
|
|
320
|
+
}
|
|
321
|
+
);
|
|
322
|
+
const handleIntersection = typeHandler(
|
|
323
|
+
(type) => {
|
|
324
|
+
return z.intersection(jsonItemToZod(type.left), jsonItemToZod(type.right));
|
|
325
|
+
}
|
|
326
|
+
);
|
|
327
|
+
const handleDiscriminatedUnion = typeHandler(
|
|
328
|
+
(type) => {
|
|
329
|
+
return z.discriminatedUnion(
|
|
330
|
+
type.discriminator,
|
|
331
|
+
[...type.options.values()].map(jsonItemToZod)
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
);
|
|
335
|
+
const handleLazy = typeHandler((type) => {
|
|
336
|
+
return z.lazy(() => jsonItemToZod(type.getter()));
|
|
337
|
+
});
|
|
338
|
+
const jsonConverters = {
|
|
339
|
+
any: handleAny,
|
|
340
|
+
bigint: handleBigInt,
|
|
341
|
+
boolean: handleBoolean,
|
|
342
|
+
date: handleDate,
|
|
343
|
+
nan: handleNaN,
|
|
344
|
+
never: handleNever,
|
|
345
|
+
null: handleNull,
|
|
346
|
+
number: handleNumber,
|
|
347
|
+
string: handleString,
|
|
348
|
+
undefined: handleUndefined,
|
|
349
|
+
unknown: handleUnknown,
|
|
350
|
+
void: handleVoid,
|
|
351
|
+
array: handleArray,
|
|
352
|
+
enum: handleEnum,
|
|
353
|
+
instanceOf: handleInstanceOf,
|
|
354
|
+
literal: handleLiteral,
|
|
355
|
+
map: handleMap,
|
|
356
|
+
set: handleSet,
|
|
357
|
+
nativeEnum: handleNativeEnum,
|
|
358
|
+
tuple: handleTuple,
|
|
359
|
+
object: handleObject,
|
|
360
|
+
record: handleRecord,
|
|
361
|
+
union: handleUnion,
|
|
362
|
+
intersection: handleIntersection,
|
|
363
|
+
discriminatedUnion: handleDiscriminatedUnion,
|
|
364
|
+
lazy: handleLazy
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
export { columnToZod, instanceToZod, modelToZod };
|
|
368
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"sourcesContent":["import {\n ArrayColumn,\n ColumnsShape,\n ColumnType,\n DateColumn,\n EnumColumn,\n JSONColumn,\n NumberColumn,\n TextColumn,\n JSONTypeAny,\n Primitive,\n JSONArray,\n JSONEnum,\n JSONInstanceOf,\n JSONLiteral,\n JSONMap,\n EnumLike,\n JSONNativeEnum,\n JSONDate,\n JSONNumber,\n JSONString,\n JSONSet,\n JSONTuple,\n JSONObject,\n UnknownKeysParam,\n JSONDiscriminatedObject,\n JSONDiscriminatedUnion,\n JSONRecord,\n JSONRecordKeyType,\n JSONIntersection,\n JSONUnion,\n JSONLazy,\n} from 'pqb';\nimport { z, ZodTypeAny } from 'zod';\nimport { Buffer } from 'node:buffer';\n\ntype NumberType =\n | 'smallint'\n | 'integer'\n | 'real'\n | 'smallserial'\n | 'serial'\n | 'money';\n\ntype BigIntType =\n | 'bigint'\n | 'numeric'\n | 'decimal'\n | 'double precision'\n | 'bigserial';\n\ntype StringType = 'varchar' | 'char' | 'text' | 'string' | 'xml' | 'json';\n\ntype DateTimeType = 'date' | 'timestamp' | 'timestamp with time zone';\n\ntype TimeType = 'time' | 'time with time zone';\n\ntype GeometryType =\n | 'point'\n | 'line'\n | 'lseg'\n | 'box'\n | 'path'\n | 'polygon'\n | 'circle';\n\ntype NetworkType = 'cidr' | 'inet' | 'macaddr' | 'macaddr8';\n\ntype BitStringType = 'bit' | 'bit varying';\n\ntype FullTextSearchType = 'tsvector' | 'tsquery';\n\ntype UUIDType = 'uuid';\n\ntype ByteaType = 'bytea';\n\ntype SchemaToZod<\n T extends ColumnType,\n D = T['dataType'],\n> = T['isNullable'] extends true\n ? z.ZodNullable<SchemaToZod<Omit<T, 'isNullable'> & { isNullable: false }>>\n : D extends NumberType\n ? z.ZodNumber\n : D extends\n | BigIntType\n | StringType\n | TimeType\n | GeometryType\n | NetworkType\n | BitStringType\n | FullTextSearchType\n | UUIDType\n ? z.ZodString\n : D extends ByteaType\n ? z.ZodType<Buffer>\n : D extends DateTimeType\n ? z.ZodDate\n : D extends 'interval'\n ? typeof interval\n : D extends 'boolean'\n ? z.ZodBoolean\n : T extends EnumColumn<string, infer U>\n ? z.ZodEnum<U>\n : T extends ArrayColumn<infer U>\n ? z.ZodArray<SchemaToZod<U>>\n : T extends JSONColumn\n ? JsonToZod<T['data']['schema']>\n : never;\n\ntype JsonToZod<T extends JSONTypeAny, D = T['dataType']> = T extends {\n types: [JSONTypeAny, JSONTypeAny, ...JSONTypeAny[]];\n}\n ? z.ZodUnion<MapJsonTuple<T['types']>>\n : T['data'] extends {\n nullable: true;\n }\n ? T['data'] extends { optional: true }\n ? z.ZodNullable<\n z.ZodOptional<\n JsonToZod<\n Omit<T, 'data'> & { data: Omit<T['data'], 'nullable' | 'optional'> }\n >\n >\n >\n : z.ZodNullable<\n JsonToZod<Omit<T, 'data'> & { data: Omit<T['data'], 'nullable'> }>\n >\n : T['data'] extends { optional: true }\n ? z.ZodOptional<\n JsonToZod<Omit<T, 'data'> & { data: Omit<T['data'], 'optional'> }>\n >\n : D extends 'bigint'\n ? z.ZodString\n : D extends 'boolean'\n ? z.ZodBoolean\n : D extends 'date'\n ? z.ZodDate\n : D extends 'nan'\n ? z.ZodNaN\n : D extends 'never'\n ? z.ZodNever\n : D extends 'null'\n ? z.ZodNull\n : D extends 'number'\n ? z.ZodNumber\n : D extends 'string'\n ? z.ZodString\n : D extends 'undefined'\n ? z.ZodUndefined\n : D extends 'unknown'\n ? z.ZodUnknown\n : D extends 'void'\n ? z.ZodVoid\n : T extends JSONArray<infer U>\n ? z.ZodArray<JsonToZod<U>>\n : T extends JSONEnum<string, infer U>\n ? z.ZodEnum<U>\n : T extends JSONInstanceOf<infer U>\n ? z.ZodType<InstanceType<U>, z.ZodTypeDef, InstanceType<U>>\n : T extends JSONLiteral<infer U>\n ? z.ZodLiteral<U>\n : T extends JSONMap<infer K, infer V>\n ? z.ZodMap<JsonToZod<K>, JsonToZod<V>>\n : T extends JSONSet<infer U>\n ? z.ZodSet<JsonToZod<U>>\n : T extends JSONNativeEnum<infer U>\n ? z.ZodNativeEnum<U>\n : T extends JSONTuple<infer U, infer R>\n ? z.ZodTuple<MapJsonTuple<U>, R extends JSONTypeAny ? JsonToZod<R> : null>\n : T extends JSONObject<Record<string, JSONTypeAny>, UnknownKeysParam>\n ? z.ZodObject<\n { [K in keyof T['shape']]: JsonToZod<T['shape'][K]> },\n T['unknownKeys'],\n JsonToZod<T['catchAllType']>\n >\n : T extends JSONRecord<JSONRecordKeyType, JSONTypeAny>\n ? z.ZodRecord<\n JsonToZod<T['keyType']> extends z.ZodType<\n string | number | symbol,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n >\n ? JsonToZod<T['keyType']>\n : never,\n JsonToZod<T['valueType']>\n >\n : T extends JSONIntersection<JSONTypeAny, JSONTypeAny>\n ? z.ZodIntersection<JsonToZod<T['left']>, JsonToZod<T['right']>>\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends JSONDiscriminatedUnion<string, Primitive, any>\n ? z.ZodDiscriminatedUnion<\n T['discriminator'],\n T['discriminatorValue'],\n JsonToZod<T['_option']> extends z.ZodDiscriminatedUnionOption<\n T['discriminator'],\n T['discriminatorValue']\n >\n ? JsonToZod<T['_option']>\n : never\n >\n : D extends 'any'\n ? z.ZodTypeAny\n : z.ZodType<T['type']>;\n\ntype MapJsonTuple<T extends unknown[]> = T extends [infer Head, ...infer Tail]\n ? [Head extends JSONTypeAny ? JsonToZod<Head> : never, ...MapJsonTuple<Tail>]\n : [];\n\nexport type ModelToZod<\n T extends new () => { columns: { shape: ColumnsShape } },\n> = InstanceToZod<InstanceType<T>['columns']>;\n\nexport const modelToZod = <\n T extends new () => { columns: { shape: ColumnsShape } },\n>(\n model: T,\n): ModelToZod<T> => {\n return instanceToZod(new model().columns) as unknown as ModelToZod<T>;\n};\n\nexport type InstanceToZod<T extends { shape: ColumnsShape }> = z.ZodObject<{\n [K in keyof T['shape']]: SchemaToZod<T['shape'][K]>;\n}>;\n\nexport const instanceToZod = <T extends { shape: ColumnsShape }>({\n shape,\n}: T): InstanceToZod<T> => {\n const result = {} as z.ZodRawShape;\n for (const key in shape) {\n result[key as keyof typeof result] = columnToZod(shape[key]);\n }\n return z.object(result) as InstanceToZod<T>;\n};\n\nexport const columnToZod = <T extends ColumnType>(\n column: T,\n): SchemaToZod<T> => {\n const dataType = column.data.as?.dataType || column.dataType;\n const converter = converters[dataType];\n if (!converter) throw new Error(`Cannot parse column ${dataType}`);\n return converter(column) as SchemaToZod<T>;\n};\n\nconst typeHandler = <Type extends ColumnType | JSONTypeAny>(\n fn: (column: Type) => z.ZodTypeAny,\n) => {\n return (column: ColumnType | JSONTypeAny) => {\n let type = fn(column as Type);\n\n column.chain.forEach((item) => {\n if (item[0] === 'transform') {\n type = type.transform(item[1]);\n } else if (item[0] === 'to') {\n type = z.preprocess(item[1], itemToZod(item[2]));\n } else if (item[0] === 'refine') {\n type = type.refine(item[1]);\n } else if (item[0] === 'superRefine') {\n type = type.superRefine(item[1]);\n }\n });\n\n if (\n ('nullable' in column.data && column.data.nullable) ||\n (column as ColumnType).isNullable\n ) {\n if ('optional' in column.data && column.data.optional) {\n type = type.nullish();\n } else {\n type = type.nullable();\n }\n } else if ('optional' in column.data && column.data.optional) {\n type = type.optional();\n }\n\n if (column instanceof ColumnType) {\n if (column.data.validationDefault !== undefined) {\n type = type.default(column.data.validationDefault);\n }\n } else if (column.data.default !== undefined) {\n type = type.default(column.data.default);\n }\n\n return type;\n };\n};\n\nconst stringParams = [\n 'min',\n 'max',\n 'length',\n 'regex',\n 'startsWith',\n 'endsWith',\n];\nconst stringEmptyParams = ['email', 'url', 'uuid', 'cuid', 'trim'];\nconst handleString = typeHandler((column: TextColumn | JSONString) => {\n let type = z.string();\n stringParams.forEach((key) => {\n const value = (column.data as Record<string, unknown>)[key];\n if (value !== undefined) {\n type = (\n type as unknown as Record<string, (value: unknown) => z.ZodString>\n )[key](value);\n }\n });\n stringEmptyParams.forEach((key) => {\n const value = (column.data as Record<string, unknown>)[key];\n if (value) {\n type = (type as unknown as Record<string, () => z.ZodString>)[key]();\n }\n });\n return type;\n});\n\nconst numberParams = ['lt', 'lte', 'gt', 'gte', 'multipleOf'];\nconst handleNumber = typeHandler((column: NumberColumn | JSONNumber) => {\n let type = z.number();\n numberParams.forEach((key) => {\n const value = (column.data as Record<string, unknown>)[key];\n if (value !== undefined) {\n type = (\n type as unknown as Record<string, (value: unknown) => z.ZodNumber>\n )[key](value);\n }\n });\n if ((column.data as Record<string, boolean>).int) {\n type = type.int();\n }\n return type;\n});\n\nconst handleBigInt = typeHandler(() => {\n return z.string().refine(\n (value) => {\n try {\n BigInt(value);\n return true;\n } catch (_) {\n return false;\n }\n },\n {\n message: 'Failed to parse bigint',\n },\n );\n});\n\nconst handleBuffer = typeHandler(() => {\n return z.instanceof(Buffer);\n});\n\nconst dateParams = ['min', 'max'];\nconst handleDate = typeHandler((column: DateColumn | JSONDate) => {\n let type = z.date();\n dateParams.forEach((key) => {\n const value = (column.data as Record<string, unknown>)[key];\n if (value !== undefined) {\n type = (type as unknown as Record<string, (value: unknown) => z.ZodDate>)[\n key\n ](value);\n }\n });\n\n return z.preprocess(\n (val) => (typeof val === 'string' ? new Date(val) : val),\n type,\n );\n});\n\nconst handleTime = typeHandler(() => {\n return z.string().refine(\n (val) => {\n return !isNaN(new Date(`2000-01-01 ${val}`).getTime());\n },\n {\n message: 'Invalid time',\n },\n );\n});\n\nconst interval = z\n .object({\n years: z.number().optional(),\n months: z.number().optional(),\n days: z.number().optional(),\n hours: z.number().optional(),\n seconds: z.number().optional(),\n })\n .strict();\n\nconst handleInterval = typeHandler(() => {\n return interval;\n});\n\nconst handleBoolean = typeHandler(() => {\n return z.boolean();\n});\n\nconst handleEnum = typeHandler((column: EnumColumn | JSONEnum) => {\n const enumColumn = column as\n | EnumColumn<string, [string, ...string[]]>\n | JSONEnum<string, [string, ...string[]]>;\n return z.enum(enumColumn.options);\n});\n\nconst handleBitString = typeHandler(() => {\n return z.string().regex(/[10]/g);\n});\n\nconst handleUUID = typeHandler(() => {\n return z.string().uuid();\n});\n\nconst arrayParams = ['min', 'max', 'length'];\nconst handleArray = typeHandler(\n (array: ArrayColumn<ColumnType> | JSONArray<JSONTypeAny>) => {\n let type: z.ZodArray<z.ZodTypeAny>;\n if ('element' in array) {\n type = z.array(jsonItemToZod(array.element));\n } else {\n type = z.array(columnToZod(array.data.item));\n }\n\n arrayParams.forEach((key) => {\n const value = (array.data as Record<string, unknown>)[key];\n if (value !== undefined) {\n type = (\n type as unknown as Record<\n string,\n (value: unknown) => z.ZodArray<z.ZodTypeAny>\n >\n )[key](value);\n }\n });\n\n return type;\n },\n);\n\nconst handleJson = typeHandler((column: JSONColumn) => {\n const type = column.data.schema;\n return jsonItemToZod(type);\n});\n\nconst jsonItemToZod = (type: JSONTypeAny) => {\n const converter = jsonConverters[type.dataType];\n if (!converter) throw new Error(`Cannot parse column ${type.dataType}`);\n return converter(type);\n};\n\nconst itemToZod = (item: ColumnType | JSONTypeAny) => {\n return item instanceof ColumnType ? columnToZod(item) : jsonItemToZod(item);\n};\n\nconst converters: Record<string, (column: ColumnType) => z.ZodType> = {\n varchar: handleString,\n char: handleString,\n text: handleString,\n smallint: handleNumber,\n integer: handleNumber,\n real: handleNumber,\n smallserial: handleNumber,\n serial: handleNumber,\n money: handleNumber,\n bigint: handleBigInt,\n decimal: handleBigInt,\n 'double precision': handleBigInt,\n bigserial: handleBigInt,\n bytea: handleBuffer,\n date: handleDate,\n timestamp: handleDate,\n 'timestamp with time zone': handleDate,\n time: handleTime,\n 'time with time zone': handleTime,\n interval: handleInterval,\n boolean: handleBoolean,\n enum: handleEnum,\n point: handleString,\n line: handleString,\n lseg: handleString,\n box: handleString,\n path: handleString,\n polygon: handleString,\n circle: handleString,\n cidr: handleString,\n inet: handleString,\n macaddr: handleString,\n macaddr8: handleString,\n bit: handleBitString,\n 'bit varying': handleBitString,\n tsvector: handleString,\n tsquery: handleString,\n xml: handleString,\n json: handleString,\n uuid: handleUUID,\n array: handleArray,\n jsonb: handleJson,\n};\n\nconst handleAny = typeHandler(() => {\n return z.any();\n});\n\nconst handleNaN = typeHandler(() => {\n return z.nan();\n});\n\nconst handleNever = typeHandler(() => {\n return z.never();\n});\n\nconst handleNull = typeHandler(() => {\n return z.null();\n});\n\nconst handleUndefined = typeHandler(() => {\n return z.undefined();\n});\n\nconst handleUnknown = typeHandler(() => {\n return z.unknown();\n});\n\nconst handleVoid = typeHandler(() => {\n return z.void();\n});\n\nconst handleInstanceOf = typeHandler(\n (type: JSONInstanceOf<new () => unknown>) => {\n return z.instanceof(type.class);\n },\n);\n\nconst handleLiteral = typeHandler((type: JSONTypeAny) => {\n return z.literal((type as JSONLiteral<string>).value);\n});\n\nconst handleMap = typeHandler((type: JSONMap<JSONTypeAny, JSONTypeAny>) => {\n const { keyType, valueType } = type;\n return z.map(jsonItemToZod(keyType), jsonItemToZod(valueType));\n});\n\nconst setParams = ['min', 'max', 'size'];\nconst handleSet = typeHandler((column: JSONSet<JSONTypeAny>) => {\n const { valueType } = column;\n let type = z.set(jsonItemToZod(valueType));\n setParams.forEach((key) => {\n const value = (column.data as Record<string, unknown>)[key];\n if (value !== undefined) {\n type = (\n type as unknown as Record<\n string,\n (value: unknown) => z.ZodSet<z.ZodTypeAny>\n >\n )[key](value);\n }\n });\n return type;\n});\n\nconst handleNativeEnum = typeHandler((type: JSONTypeAny) => {\n return z.nativeEnum((type as JSONNativeEnum<EnumLike>).enum);\n});\n\nconst handleTuple = typeHandler((column: JSONTuple) => {\n let type: z.ZodTuple<[], ZodTypeAny | null> = z.tuple(\n column.items.map((item) => jsonItemToZod(item)) as [],\n );\n if (column.restType) {\n type = type.rest(jsonItemToZod(column.restType));\n }\n return type;\n});\n\nconst handleObject = typeHandler(\n (type: JSONObject<Record<string, JSONTypeAny>, UnknownKeysParam>) => {\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const key in type.shape) {\n shape[key] = jsonItemToZod(type.shape[key]);\n }\n\n let object: z.ZodObject<z.ZodRawShape, UnknownKeysParam, z.ZodTypeAny> =\n z.object(shape);\n\n if (type.unknownKeys === 'passthrough') {\n object = object.passthrough();\n } else if (type.unknownKeys === 'strict') {\n object = object.strict();\n }\n\n if (type.catchAllType) {\n object = object.catchall(jsonItemToZod(type.catchAllType));\n }\n\n return object;\n },\n);\n\nconst handleRecord = typeHandler(\n (type: JSONRecord<JSONRecordKeyType, JSONTypeAny>) => {\n return z.record(jsonItemToZod(type.keyType), jsonItemToZod(type.valueType));\n },\n);\n\nconst handleUnion = typeHandler(\n (type: JSONUnion<[JSONTypeAny, JSONTypeAny, ...JSONTypeAny[]]>) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return z.union(type.types.map(jsonItemToZod) as any);\n },\n);\n\nconst handleIntersection = typeHandler(\n (type: JSONIntersection<JSONTypeAny, JSONTypeAny>) => {\n return z.intersection(jsonItemToZod(type.left), jsonItemToZod(type.right));\n },\n);\n\nconst handleDiscriminatedUnion = typeHandler(\n (\n type: JSONDiscriminatedUnion<\n string,\n Primitive,\n JSONDiscriminatedObject<string, Primitive>\n >,\n ) => {\n return z.discriminatedUnion(\n type.discriminator,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [...type.options.values()].map(jsonItemToZod) as any,\n );\n },\n);\n\nconst handleLazy = typeHandler((type: JSONLazy<JSONTypeAny>) => {\n return z.lazy(() => jsonItemToZod(type.getter()));\n});\n\nconst jsonConverters: Record<string, (type: JSONTypeAny) => z.ZodType> = {\n any: handleAny,\n bigint: handleBigInt,\n boolean: handleBoolean,\n date: handleDate,\n nan: handleNaN,\n never: handleNever,\n null: handleNull,\n number: handleNumber,\n string: handleString,\n undefined: handleUndefined,\n unknown: handleUnknown,\n void: handleVoid,\n array: handleArray,\n enum: handleEnum,\n instanceOf: handleInstanceOf,\n literal: handleLiteral,\n map: handleMap,\n set: handleSet,\n nativeEnum: handleNativeEnum,\n tuple: handleTuple,\n object: handleObject,\n record: handleRecord,\n union: handleUnion,\n intersection: handleIntersection,\n discriminatedUnion: handleDiscriminatedUnion,\n lazy: handleLazy,\n};\n"],"names":[],"mappings":"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"}
|