drizzle-typebox 1.0.0-beta.6-ea4d663 → 1.0.0-beta.6-b046b02

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/index.mjs CHANGED
@@ -1,449 +1,405 @@
1
- import { Type, TypeRegistry, Kind } from '@sinclair/typebox';
2
- import { extractExtendedColumnType, getTableName, getColumnTable, isTable, getTableColumns, getViewSelectedFields, is, Column, SQL, isView } from 'drizzle-orm';
1
+ import { Kind, Type, TypeRegistry } from "@sinclair/typebox";
2
+ import { Column, SQL, extractExtendedColumnType, getColumnTable, getTableColumns, getTableName, getViewSelectedFields, is, isTable, isView } from "drizzle-orm";
3
3
 
4
+ //#region src/constants.ts
4
5
  const CONSTANTS = {
5
- INT8_MIN: -128,
6
- INT8_MAX: 127,
7
- INT8_UNSIGNED_MAX: 255,
8
- INT16_MIN: -32768,
9
- INT16_MAX: 32767,
10
- INT16_UNSIGNED_MAX: 65535,
11
- INT24_MIN: -8388608,
12
- INT24_MAX: 8388607,
13
- INT24_UNSIGNED_MAX: 16777215,
14
- INT32_MIN: -2147483648,
15
- INT32_MAX: 2147483647,
16
- INT32_UNSIGNED_MAX: 4294967295,
17
- INT48_MIN: -140737488355328,
18
- INT48_MAX: 140737488355327,
19
- INT48_UNSIGNED_MAX: 281474976710655,
20
- INT64_MIN: -9223372036854775808n,
21
- INT64_MAX: 9223372036854775807n,
22
- INT64_UNSIGNED_MAX: 18446744073709551615n,
6
+ INT8_MIN: -128,
7
+ INT8_MAX: 127,
8
+ INT8_UNSIGNED_MAX: 255,
9
+ INT16_MIN: -32768,
10
+ INT16_MAX: 32767,
11
+ INT16_UNSIGNED_MAX: 65535,
12
+ INT24_MIN: -8388608,
13
+ INT24_MAX: 8388607,
14
+ INT24_UNSIGNED_MAX: 16777215,
15
+ INT32_MIN: -2147483648,
16
+ INT32_MAX: 2147483647,
17
+ INT32_UNSIGNED_MAX: 4294967295,
18
+ INT48_MIN: -0x800000000000,
19
+ INT48_MAX: 0x7fffffffffff,
20
+ INT48_UNSIGNED_MAX: 0xffffffffffff,
21
+ INT64_MIN: -9223372036854775808n,
22
+ INT64_MAX: 9223372036854775807n,
23
+ INT64_UNSIGNED_MAX: 18446744073709551615n
23
24
  };
24
25
 
25
- const literalSchema = Type.Union([Type.String(), Type.Number(), Type.Boolean(), Type.Null()]);
26
- const jsonSchema = Type.Union([literalSchema, Type.Array(Type.Any()), Type.Record(Type.String(), Type.Any())]);
27
- TypeRegistry.Set('Buffer', (_, value) => value instanceof Buffer);
28
- const bufferSchema = { [Kind]: 'Buffer', type: 'buffer' };
26
+ //#endregion
27
+ //#region src/column.ts
28
+ const literalSchema = Type.Union([
29
+ Type.String(),
30
+ Type.Number(),
31
+ Type.Boolean(),
32
+ Type.Null()
33
+ ]);
34
+ const jsonSchema = Type.Union([
35
+ literalSchema,
36
+ Type.Array(Type.Any()),
37
+ Type.Record(Type.String(), Type.Any())
38
+ ]);
39
+ TypeRegistry.Set("Buffer", (_, value) => value instanceof Buffer);
40
+ const bufferSchema = {
41
+ [Kind]: "Buffer",
42
+ type: "buffer"
43
+ };
29
44
  function mapEnumValues(values) {
30
- return Object.fromEntries(values.map((value) => [value, value]));
45
+ return Object.fromEntries(values.map((value) => [value, value]));
31
46
  }
32
47
  function columnToSchema(column, t) {
33
- let schema;
34
- const { type, constraint } = extractExtendedColumnType(column);
35
- switch (type) {
36
- case 'array': {
37
- schema = arrayColumnToSchema(column, constraint, t);
38
- break;
39
- }
40
- case 'object': {
41
- schema = objectColumnToSchema(column, constraint, t);
42
- break;
43
- }
44
- case 'number': {
45
- schema = numberColumnToSchema(column, constraint, t);
46
- break;
47
- }
48
- case 'bigint': {
49
- schema = bigintColumnToSchema(column, constraint, t);
50
- break;
51
- }
52
- case 'boolean': {
53
- schema = t.Boolean();
54
- break;
55
- }
56
- case 'string': {
57
- schema = stringColumnToSchema(column, constraint, t);
58
- break;
59
- }
60
- case 'custom': {
61
- schema = t.Any();
62
- break;
63
- }
64
- default: {
65
- schema = t.Any();
66
- }
67
- }
68
- return schema;
48
+ let schema;
49
+ const dimensions = column.dimensions;
50
+ if (typeof dimensions === "number" && dimensions > 0) return pgArrayColumnToSchema(column, dimensions, t);
51
+ const { type, constraint } = extractExtendedColumnType(column);
52
+ switch (type) {
53
+ case "array":
54
+ schema = arrayColumnToSchema(column, constraint, t);
55
+ break;
56
+ case "object":
57
+ schema = objectColumnToSchema(column, constraint, t);
58
+ break;
59
+ case "number":
60
+ schema = numberColumnToSchema(column, constraint, t);
61
+ break;
62
+ case "bigint":
63
+ schema = bigintColumnToSchema(column, constraint, t);
64
+ break;
65
+ case "boolean":
66
+ schema = t.Boolean();
67
+ break;
68
+ case "string":
69
+ schema = stringColumnToSchema(column, constraint, t);
70
+ break;
71
+ case "custom":
72
+ schema = t.Any();
73
+ break;
74
+ default: schema = t.Any();
75
+ }
76
+ return schema;
69
77
  }
70
78
  function numberColumnToSchema(column, constraint, t) {
71
- let min;
72
- let max;
73
- let integer = false;
74
- switch (constraint) {
75
- case 'int8': {
76
- min = CONSTANTS.INT8_MIN;
77
- max = CONSTANTS.INT8_MAX;
78
- integer = true;
79
- break;
80
- }
81
- case 'uint8': {
82
- min = 0;
83
- max = CONSTANTS.INT8_UNSIGNED_MAX;
84
- integer = true;
85
- break;
86
- }
87
- case 'int16': {
88
- min = CONSTANTS.INT16_MIN;
89
- max = CONSTANTS.INT16_MAX;
90
- integer = true;
91
- break;
92
- }
93
- case 'uint16': {
94
- min = 0;
95
- max = CONSTANTS.INT16_UNSIGNED_MAX;
96
- integer = true;
97
- break;
98
- }
99
- case 'int24': {
100
- min = CONSTANTS.INT24_MIN;
101
- max = CONSTANTS.INT24_MAX;
102
- integer = true;
103
- break;
104
- }
105
- case 'uint24': {
106
- min = 0;
107
- max = CONSTANTS.INT24_UNSIGNED_MAX;
108
- integer = true;
109
- break;
110
- }
111
- case 'int32': {
112
- min = CONSTANTS.INT32_MIN;
113
- max = CONSTANTS.INT32_MAX;
114
- integer = true;
115
- break;
116
- }
117
- case 'uint32': {
118
- min = 0;
119
- max = CONSTANTS.INT32_UNSIGNED_MAX;
120
- integer = true;
121
- break;
122
- }
123
- case 'int53': {
124
- min = Number.MIN_SAFE_INTEGER;
125
- max = Number.MAX_SAFE_INTEGER;
126
- integer = true;
127
- break;
128
- }
129
- case 'uint53': {
130
- min = 0;
131
- max = Number.MAX_SAFE_INTEGER;
132
- integer = true;
133
- break;
134
- }
135
- case 'float': {
136
- min = CONSTANTS.INT24_MIN;
137
- max = CONSTANTS.INT24_MAX;
138
- break;
139
- }
140
- case 'ufloat': {
141
- min = 0;
142
- max = CONSTANTS.INT24_UNSIGNED_MAX;
143
- break;
144
- }
145
- case 'double': {
146
- min = CONSTANTS.INT48_MIN;
147
- max = CONSTANTS.INT48_MAX;
148
- break;
149
- }
150
- case 'udouble': {
151
- min = 0;
152
- max = CONSTANTS.INT48_UNSIGNED_MAX;
153
- break;
154
- }
155
- case 'year': {
156
- min = 1901;
157
- max = 2155;
158
- integer = true;
159
- break;
160
- }
161
- case 'unsigned': {
162
- min = 0;
163
- max = Number.MAX_SAFE_INTEGER;
164
- break;
165
- }
166
- default: {
167
- min = Number.MIN_SAFE_INTEGER;
168
- max = Number.MAX_SAFE_INTEGER;
169
- break;
170
- }
171
- }
172
- const key = integer ? 'Integer' : 'Number';
173
- return t[key]({
174
- minimum: min,
175
- maximum: max,
176
- });
79
+ let min;
80
+ let max;
81
+ let integer = false;
82
+ switch (constraint) {
83
+ case "int8":
84
+ min = CONSTANTS.INT8_MIN;
85
+ max = CONSTANTS.INT8_MAX;
86
+ integer = true;
87
+ break;
88
+ case "uint8":
89
+ min = 0;
90
+ max = CONSTANTS.INT8_UNSIGNED_MAX;
91
+ integer = true;
92
+ break;
93
+ case "int16":
94
+ min = CONSTANTS.INT16_MIN;
95
+ max = CONSTANTS.INT16_MAX;
96
+ integer = true;
97
+ break;
98
+ case "uint16":
99
+ min = 0;
100
+ max = CONSTANTS.INT16_UNSIGNED_MAX;
101
+ integer = true;
102
+ break;
103
+ case "int24":
104
+ min = CONSTANTS.INT24_MIN;
105
+ max = CONSTANTS.INT24_MAX;
106
+ integer = true;
107
+ break;
108
+ case "uint24":
109
+ min = 0;
110
+ max = CONSTANTS.INT24_UNSIGNED_MAX;
111
+ integer = true;
112
+ break;
113
+ case "int32":
114
+ min = CONSTANTS.INT32_MIN;
115
+ max = CONSTANTS.INT32_MAX;
116
+ integer = true;
117
+ break;
118
+ case "uint32":
119
+ min = 0;
120
+ max = CONSTANTS.INT32_UNSIGNED_MAX;
121
+ integer = true;
122
+ break;
123
+ case "int53":
124
+ min = Number.MIN_SAFE_INTEGER;
125
+ max = Number.MAX_SAFE_INTEGER;
126
+ integer = true;
127
+ break;
128
+ case "uint53":
129
+ min = 0;
130
+ max = Number.MAX_SAFE_INTEGER;
131
+ integer = true;
132
+ break;
133
+ case "float":
134
+ min = CONSTANTS.INT24_MIN;
135
+ max = CONSTANTS.INT24_MAX;
136
+ break;
137
+ case "ufloat":
138
+ min = 0;
139
+ max = CONSTANTS.INT24_UNSIGNED_MAX;
140
+ break;
141
+ case "double":
142
+ min = CONSTANTS.INT48_MIN;
143
+ max = CONSTANTS.INT48_MAX;
144
+ break;
145
+ case "udouble":
146
+ min = 0;
147
+ max = CONSTANTS.INT48_UNSIGNED_MAX;
148
+ break;
149
+ case "year":
150
+ min = 1901;
151
+ max = 2155;
152
+ integer = true;
153
+ break;
154
+ case "unsigned":
155
+ min = 0;
156
+ max = Number.MAX_SAFE_INTEGER;
157
+ break;
158
+ default:
159
+ min = Number.MIN_SAFE_INTEGER;
160
+ max = Number.MAX_SAFE_INTEGER;
161
+ break;
162
+ }
163
+ return t[integer ? "Integer" : "Number"]({
164
+ minimum: min,
165
+ maximum: max
166
+ });
177
167
  }
178
- TypeRegistry.Set('BigIntStringMode', (_, value) => {
179
- if (typeof value !== 'string' || !(/^-?\d+$/.test(value))) {
180
- return false;
181
- }
182
- const bigint = BigInt(value);
183
- if (bigint < CONSTANTS.INT64_MIN || bigint > CONSTANTS.INT64_MAX) {
184
- return false;
185
- }
186
- return true;
168
+ TypeRegistry.Set("BigIntStringMode", (_, value) => {
169
+ if (typeof value !== "string" || !/^-?\d+$/.test(value)) return false;
170
+ const bigint = BigInt(value);
171
+ if (bigint < CONSTANTS.INT64_MIN || bigint > CONSTANTS.INT64_MAX) return false;
172
+ return true;
187
173
  });
188
- TypeRegistry.Set('UnsignedBigIntStringMode', (_, value) => {
189
- if (typeof value !== 'string' || !(/^\d+$/.test(value))) {
190
- return false;
191
- }
192
- const bigint = BigInt(value);
193
- if (bigint < 0 || bigint > CONSTANTS.INT64_MAX) {
194
- return false;
195
- }
196
- return true;
174
+ TypeRegistry.Set("UnsignedBigIntStringMode", (_, value) => {
175
+ if (typeof value !== "string" || !/^\d+$/.test(value)) return false;
176
+ const bigint = BigInt(value);
177
+ if (bigint < 0 || bigint > CONSTANTS.INT64_MAX) return false;
178
+ return true;
197
179
  });
198
180
  /** @internal */
199
181
  const bigintStringModeSchema = {
200
- [Kind]: 'BigIntStringMode',
201
- type: 'string',
182
+ [Kind]: "BigIntStringMode",
183
+ type: "string"
202
184
  };
203
185
  /** @internal */
204
186
  const unsignedBigintStringModeSchema = {
205
- [Kind]: 'UnsignedBigIntStringMode',
206
- type: 'string',
187
+ [Kind]: "UnsignedBigIntStringMode",
188
+ type: "string"
207
189
  };
190
+ function pgArrayColumnToSchema(column, dimensions, t) {
191
+ const [baseType, baseConstraint] = column.dataType.split(" ");
192
+ let baseSchema;
193
+ switch (baseType) {
194
+ case "number":
195
+ baseSchema = numberColumnToSchema(column, baseConstraint, t);
196
+ break;
197
+ case "bigint":
198
+ baseSchema = bigintColumnToSchema(column, baseConstraint, t);
199
+ break;
200
+ case "boolean":
201
+ baseSchema = t.Boolean();
202
+ break;
203
+ case "string":
204
+ baseSchema = stringColumnToSchema(column, baseConstraint, t);
205
+ break;
206
+ case "object":
207
+ baseSchema = objectColumnToSchema(column, baseConstraint, t);
208
+ break;
209
+ case "array":
210
+ baseSchema = arrayColumnToSchema(column, baseConstraint, t);
211
+ break;
212
+ default: baseSchema = t.Any();
213
+ }
214
+ let schema = t.Array(baseSchema);
215
+ for (let i = 1; i < dimensions; i++) schema = t.Array(schema);
216
+ return schema;
217
+ }
208
218
  function arrayColumnToSchema(column, constraint, t) {
209
- switch (constraint) {
210
- case 'geometry':
211
- case 'point': {
212
- return t.Tuple([t.Number(), t.Number()]);
213
- }
214
- case 'line': {
215
- return t.Tuple([t.Number(), t.Number(), t.Number()]);
216
- }
217
- case 'vector':
218
- case 'halfvector': {
219
- const length = column.length;
220
- const sizeParam = length
221
- ? {
222
- minItems: length,
223
- maxItems: length,
224
- }
225
- : undefined;
226
- return t.Array(t.Number(), sizeParam);
227
- }
228
- case 'int64vector': {
229
- const length = column.length;
230
- const sizeParam = length
231
- ? {
232
- minItems: length,
233
- maxItems: length,
234
- }
235
- : undefined;
236
- return t.Array(t.BigInt({
237
- minimum: CONSTANTS.INT64_MIN,
238
- maximum: CONSTANTS.INT64_MAX,
239
- }), sizeParam);
240
- }
241
- case 'basecolumn': {
242
- const size = column.length;
243
- const sizeParam = size
244
- ? {
245
- minItems: size,
246
- maxItems: size,
247
- }
248
- : undefined;
249
- return column.baseColumn
250
- ? t.Array(columnToSchema(column.baseColumn, t), sizeParam)
251
- : t.Array(t.Any(), sizeParam);
252
- }
253
- default: {
254
- return t.Array(t.Any());
255
- }
256
- }
219
+ switch (constraint) {
220
+ case "geometry":
221
+ case "point": return t.Tuple([t.Number(), t.Number()]);
222
+ case "line": return t.Tuple([
223
+ t.Number(),
224
+ t.Number(),
225
+ t.Number()
226
+ ]);
227
+ case "vector":
228
+ case "halfvector": {
229
+ const length = column.length;
230
+ const sizeParam = length ? {
231
+ minItems: length,
232
+ maxItems: length
233
+ } : void 0;
234
+ return t.Array(t.Number(), sizeParam);
235
+ }
236
+ case "int64vector": {
237
+ const length = column.length;
238
+ const sizeParam = length ? {
239
+ minItems: length,
240
+ maxItems: length
241
+ } : void 0;
242
+ return t.Array(t.BigInt({
243
+ minimum: CONSTANTS.INT64_MIN,
244
+ maximum: CONSTANTS.INT64_MAX
245
+ }), sizeParam);
246
+ }
247
+ case "basecolumn": {
248
+ const baseColumn = column.baseColumn;
249
+ if (baseColumn) {
250
+ const size = column.length;
251
+ const sizeParam = size ? {
252
+ minItems: size,
253
+ maxItems: size
254
+ } : void 0;
255
+ return t.Array(columnToSchema(baseColumn, t), sizeParam);
256
+ }
257
+ return t.Array(t.Any());
258
+ }
259
+ default: return t.Array(t.Any());
260
+ }
257
261
  }
258
262
  function objectColumnToSchema(column, constraint, t) {
259
- switch (constraint) {
260
- case 'buffer': {
261
- return bufferSchema;
262
- }
263
- case 'date': {
264
- return t.Date();
265
- }
266
- case 'geometry':
267
- case 'point': {
268
- return t.Object({
269
- x: t.Number(),
270
- y: t.Number(),
271
- });
272
- }
273
- case 'json': {
274
- return jsonSchema;
275
- }
276
- case 'line': {
277
- return t.Object({
278
- a: t.Number(),
279
- b: t.Number(),
280
- c: t.Number(),
281
- });
282
- }
283
- default: {
284
- return t.Object({});
285
- }
286
- }
263
+ switch (constraint) {
264
+ case "buffer": return bufferSchema;
265
+ case "date": return t.Date();
266
+ case "geometry":
267
+ case "point": return t.Object({
268
+ x: t.Number(),
269
+ y: t.Number()
270
+ });
271
+ case "json": return jsonSchema;
272
+ case "line": return t.Object({
273
+ a: t.Number(),
274
+ b: t.Number(),
275
+ c: t.Number()
276
+ });
277
+ default: return t.Object({});
278
+ }
287
279
  }
288
280
  function bigintColumnToSchema(column, constraint, t) {
289
- let min;
290
- let max;
291
- switch (constraint) {
292
- case 'int64': {
293
- min = CONSTANTS.INT64_MIN;
294
- max = CONSTANTS.INT64_MAX;
295
- break;
296
- }
297
- case 'uint64': {
298
- min = 0n;
299
- max = CONSTANTS.INT64_UNSIGNED_MAX;
300
- break;
301
- }
302
- }
303
- const options = {};
304
- if (min !== undefined) {
305
- options.minimum = min;
306
- }
307
- if (max !== undefined) {
308
- options.maximum = max;
309
- }
310
- return t.BigInt(Object.keys(options).length > 0 ? options : undefined);
281
+ let min;
282
+ let max;
283
+ switch (constraint) {
284
+ case "int64":
285
+ min = CONSTANTS.INT64_MIN;
286
+ max = CONSTANTS.INT64_MAX;
287
+ break;
288
+ case "uint64":
289
+ min = 0n;
290
+ max = CONSTANTS.INT64_UNSIGNED_MAX;
291
+ break;
292
+ }
293
+ const options = {};
294
+ if (min !== void 0) options.minimum = min;
295
+ if (max !== void 0) options.maximum = max;
296
+ return t.BigInt(Object.keys(options).length > 0 ? options : void 0);
311
297
  }
312
298
  function stringColumnToSchema(column, constraint, t) {
313
- const { name: columnName, length, isLengthExact } = column;
314
- let regex;
315
- if (constraint === 'binary') {
316
- regex = /^[01]*$/;
317
- }
318
- if (constraint === 'uuid') {
319
- return t.String({
320
- format: 'uuid',
321
- });
322
- }
323
- if (constraint === 'enum') {
324
- const enumValues = column.enumValues;
325
- if (!enumValues) {
326
- throw new Error(`Column "${getTableName(getColumnTable(column))}"."${columnName}" is of 'enum' type, but lacks enum values`);
327
- }
328
- return t.Enum(mapEnumValues(enumValues));
329
- }
330
- if (constraint === 'int64') {
331
- return bigintStringModeSchema;
332
- }
333
- if (constraint === 'uint64') {
334
- return unsignedBigintStringModeSchema;
335
- }
336
- const options = {};
337
- if (length !== undefined && isLengthExact) {
338
- options.minLength = length;
339
- options.maxLength = length;
340
- }
341
- else if (length !== undefined) {
342
- options.maxLength = length;
343
- }
344
- return regex
345
- ? t.RegExp(regex, Object.keys(options).length > 0 ? options : undefined)
346
- : t.String(Object.keys(options).length > 0 ? options : undefined);
299
+ const { name: columnName, length, isLengthExact } = column;
300
+ let regex;
301
+ if (constraint === "binary") regex = /^[01]*$/;
302
+ if (constraint === "uuid") return t.String({ format: "uuid" });
303
+ if (constraint === "enum") {
304
+ const enumValues = column.enumValues;
305
+ if (!enumValues) throw new Error(`Column "${getTableName(getColumnTable(column))}"."${columnName}" is of 'enum' type, but lacks enum values`);
306
+ return t.Enum(mapEnumValues(enumValues));
307
+ }
308
+ if (constraint === "int64") return bigintStringModeSchema;
309
+ if (constraint === "uint64") return unsignedBigintStringModeSchema;
310
+ const options = {};
311
+ if (length !== void 0 && isLengthExact) {
312
+ options.minLength = length;
313
+ options.maxLength = length;
314
+ } else if (length !== void 0) options.maxLength = length;
315
+ return regex ? t.RegExp(regex, Object.keys(options).length > 0 ? options : void 0) : t.String(Object.keys(options).length > 0 ? options : void 0);
347
316
  }
348
317
 
318
+ //#endregion
319
+ //#region src/utils.ts
349
320
  function isColumnType(column, columnTypes) {
350
- return columnTypes.includes(column.columnType);
321
+ return columnTypes.includes(column.columnType);
351
322
  }
352
323
  function isWithEnum(column) {
353
- return 'enumValues' in column && Array.isArray(column.enumValues) && column.enumValues.length > 0;
324
+ return "enumValues" in column && Array.isArray(column.enumValues) && column.enumValues.length > 0;
354
325
  }
355
326
  const isPgEnum = isWithEnum;
356
327
 
328
+ //#endregion
329
+ //#region src/schema.ts
357
330
  function getColumns(tableLike) {
358
- return isTable(tableLike) ? getTableColumns(tableLike) : getViewSelectedFields(tableLike);
331
+ return isTable(tableLike) ? getTableColumns(tableLike) : getViewSelectedFields(tableLike);
359
332
  }
360
333
  function handleColumns(columns, refinements, conditions, factory) {
361
- const columnSchemas = {};
362
- for (const [key, selected] of Object.entries(columns)) {
363
- if (!is(selected, Column) && !is(selected, SQL) && !is(selected, SQL.Aliased) && typeof selected === 'object') {
364
- const columns = isTable(selected) || isView(selected) ? getColumns(selected) : selected;
365
- columnSchemas[key] = handleColumns(columns, refinements[key] ?? {}, conditions, factory);
366
- continue;
367
- }
368
- const refinement = refinements[key];
369
- if (refinement !== undefined && typeof refinement !== 'function') {
370
- columnSchemas[key] = refinement;
371
- continue;
372
- }
373
- const column = is(selected, Column) ? selected : undefined;
374
- const schema = column ? columnToSchema(column, factory?.typeboxInstance ?? Type) : Type.Any();
375
- const refined = typeof refinement === 'function' ? refinement(schema) : schema;
376
- if (conditions.never(column)) {
377
- continue;
378
- }
379
- else {
380
- columnSchemas[key] = refined;
381
- }
382
- if (column) {
383
- if (conditions.nullable(column)) {
384
- columnSchemas[key] = Type.Union([columnSchemas[key], Type.Null()]);
385
- }
386
- if (conditions.optional(column)) {
387
- columnSchemas[key] = Type.Optional(columnSchemas[key]);
388
- }
389
- }
390
- }
391
- return Type.Object(columnSchemas);
334
+ const columnSchemas = {};
335
+ for (const [key, selected] of Object.entries(columns)) {
336
+ if (!is(selected, Column) && !is(selected, SQL) && !is(selected, SQL.Aliased) && typeof selected === "object") {
337
+ columnSchemas[key] = handleColumns(isTable(selected) || isView(selected) ? getColumns(selected) : selected, refinements[key] ?? {}, conditions, factory);
338
+ continue;
339
+ }
340
+ const refinement = refinements[key];
341
+ if (refinement !== void 0 && typeof refinement !== "function") {
342
+ columnSchemas[key] = refinement;
343
+ continue;
344
+ }
345
+ const column = is(selected, Column) ? selected : void 0;
346
+ const schema = column ? columnToSchema(column, factory?.typeboxInstance ?? Type) : Type.Any();
347
+ const refined = typeof refinement === "function" ? refinement(schema) : schema;
348
+ if (conditions.never(column)) continue;
349
+ else columnSchemas[key] = refined;
350
+ if (column) {
351
+ if (conditions.nullable(column)) columnSchemas[key] = Type.Union([columnSchemas[key], Type.Null()]);
352
+ if (conditions.optional(column)) columnSchemas[key] = Type.Optional(columnSchemas[key]);
353
+ }
354
+ }
355
+ return Type.Object(columnSchemas);
392
356
  }
393
357
  function handleEnum(enum_, factory) {
394
- const typebox = factory?.typeboxInstance ?? Type;
395
- return typebox.Enum(mapEnumValues(enum_.enumValues));
358
+ return (factory?.typeboxInstance ?? Type).Enum(mapEnumValues(enum_.enumValues));
396
359
  }
397
360
  const selectConditions = {
398
- never: () => false,
399
- optional: () => false,
400
- nullable: (column) => !column.notNull,
361
+ never: () => false,
362
+ optional: () => false,
363
+ nullable: (column) => !column.notNull
401
364
  };
402
365
  const insertConditions = {
403
- never: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always'
404
- || ('identity' in (column ?? {}) && typeof column?.identity !== 'undefined'),
405
- optional: (column) => !column.notNull || (column.notNull && column.hasDefault),
406
- nullable: (column) => !column.notNull,
366
+ never: (column) => column?.generated?.type === "always" || column?.generatedIdentity?.type === "always" || "identity" in (column ?? {}) && typeof column?.identity !== "undefined",
367
+ optional: (column) => !column.notNull || column.notNull && column.hasDefault,
368
+ nullable: (column) => !column.notNull
407
369
  };
408
370
  const updateConditions = {
409
- never: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always'
410
- || ('identity' in (column ?? {}) && typeof column?.identity !== 'undefined'),
411
- optional: () => true,
412
- nullable: (column) => !column.notNull,
371
+ never: (column) => column?.generated?.type === "always" || column?.generatedIdentity?.type === "always" || "identity" in (column ?? {}) && typeof column?.identity !== "undefined",
372
+ optional: () => true,
373
+ nullable: (column) => !column.notNull
413
374
  };
414
375
  const createSelectSchema = (entity, refine) => {
415
- if (isPgEnum(entity)) {
416
- return handleEnum(entity);
417
- }
418
- const columns = getColumns(entity);
419
- return handleColumns(columns, refine ?? {}, selectConditions);
376
+ if (isPgEnum(entity)) return handleEnum(entity);
377
+ return handleColumns(getColumns(entity), refine ?? {}, selectConditions);
420
378
  };
421
379
  const createInsertSchema = (entity, refine) => {
422
- const columns = getColumns(entity);
423
- return handleColumns(columns, refine ?? {}, insertConditions);
380
+ return handleColumns(getColumns(entity), refine ?? {}, insertConditions);
424
381
  };
425
382
  const createUpdateSchema = (entity, refine) => {
426
- const columns = getColumns(entity);
427
- return handleColumns(columns, refine ?? {}, updateConditions);
383
+ return handleColumns(getColumns(entity), refine ?? {}, updateConditions);
428
384
  };
429
385
  function createSchemaFactory(options) {
430
- const createSelectSchema = (entity, refine) => {
431
- if (isPgEnum(entity)) {
432
- return handleEnum(entity, options);
433
- }
434
- const columns = getColumns(entity);
435
- return handleColumns(columns, refine ?? {}, selectConditions, options);
436
- };
437
- const createInsertSchema = (entity, refine) => {
438
- const columns = getColumns(entity);
439
- return handleColumns(columns, refine ?? {}, insertConditions, options);
440
- };
441
- const createUpdateSchema = (entity, refine) => {
442
- const columns = getColumns(entity);
443
- return handleColumns(columns, refine ?? {}, updateConditions, options);
444
- };
445
- return { createSelectSchema, createInsertSchema, createUpdateSchema };
386
+ const createSelectSchema$1 = (entity, refine) => {
387
+ if (isPgEnum(entity)) return handleEnum(entity, options);
388
+ return handleColumns(getColumns(entity), refine ?? {}, selectConditions, options);
389
+ };
390
+ const createInsertSchema$1 = (entity, refine) => {
391
+ return handleColumns(getColumns(entity), refine ?? {}, insertConditions, options);
392
+ };
393
+ const createUpdateSchema$1 = (entity, refine) => {
394
+ return handleColumns(getColumns(entity), refine ?? {}, updateConditions, options);
395
+ };
396
+ return {
397
+ createSelectSchema: createSelectSchema$1,
398
+ createInsertSchema: createInsertSchema$1,
399
+ createUpdateSchema: createUpdateSchema$1
400
+ };
446
401
  }
447
402
 
403
+ //#endregion
448
404
  export { bufferSchema, createInsertSchema, createSchemaFactory, createSelectSchema, createUpdateSchema, getColumns, handleColumns, handleEnum, isColumnType, isPgEnum, isWithEnum, jsonSchema, literalSchema };
449
- //# sourceMappingURL=index.mjs.map
405
+ //# sourceMappingURL=index.mjs.map