drizzle-valibot 0.2.0 → 0.3.0-05d907b
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 +11 -2
- package/column.d.cts +8 -0
- package/column.d.mts +8 -0
- package/column.d.ts +8 -0
- package/column.types.d.cts +70 -0
- package/column.types.d.mts +70 -0
- package/column.types.d.ts +70 -0
- package/constants.d.cts +20 -0
- package/constants.d.mts +20 -0
- package/constants.d.ts +20 -0
- package/index.cjs +309 -1
- package/index.cjs.map +1 -1
- package/index.d.cts +2 -41
- package/index.d.mts +2 -41
- package/index.d.ts +2 -41
- package/index.mjs +286 -1
- package/index.mjs.map +1 -1
- package/package.json +71 -84
- package/schema.d.cts +4 -0
- package/schema.d.mts +4 -0
- package/schema.d.ts +4 -0
- package/schema.types.d.cts +20 -0
- package/schema.types.d.mts +20 -0
- package/schema.types.d.ts +20 -0
- package/schema.types.internal.d.cts +24 -0
- package/schema.types.internal.d.mts +24 -0
- package/schema.types.internal.d.ts +24 -0
- package/utils.d.cts +24 -0
- package/utils.d.mts +24 -0
- package/utils.d.ts +24 -0
package/README.md
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
`drizzle-valibot` is a plugin for [Drizzle ORM](https://github.com/drizzle-team/drizzle-orm) that allows you to generate [valibot](https://valibot.dev/) schemas from Drizzle ORM schemas.
|
|
2
2
|
|
|
3
|
+
**Features**
|
|
4
|
+
|
|
5
|
+
- Create a select schema for tables, views and enums.
|
|
6
|
+
- Create insert and update schemas for tables.
|
|
7
|
+
- Supports all dialects: PostgreSQL, MySQL and SQLite.
|
|
8
|
+
|
|
3
9
|
# Usage
|
|
4
10
|
|
|
5
11
|
```ts
|
|
6
12
|
import { pgEnum, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';
|
|
7
13
|
import { createInsertSchema, createSelectSchema } from 'drizzle-valibot';
|
|
8
|
-
import { string, parse, number } from 'valibot';
|
|
14
|
+
import { string, parse, number, pipe } from 'valibot';
|
|
9
15
|
|
|
10
16
|
const users = pgTable('users', {
|
|
11
17
|
id: serial('id').primaryKey(),
|
|
@@ -18,6 +24,9 @@ const users = pgTable('users', {
|
|
|
18
24
|
// Schema for inserting a user - can be used to validate API requests
|
|
19
25
|
const insertUserSchema = createInsertSchema(users);
|
|
20
26
|
|
|
27
|
+
// Schema for updating a user - can be used to validate API requests
|
|
28
|
+
const updateUserSchema = createUpdateSchema(users);
|
|
29
|
+
|
|
21
30
|
// Schema for selecting a user - can be used to validate API responses
|
|
22
31
|
const selectUserSchema = createSelectSchema(users);
|
|
23
32
|
|
|
@@ -28,7 +37,7 @@ const insertUserSchema = createInsertSchema(users, {
|
|
|
28
37
|
|
|
29
38
|
// Refining the fields - useful if you want to change the fields before they become nullable/optional in the final schema
|
|
30
39
|
const insertUserSchema = createInsertSchema(users, {
|
|
31
|
-
id: (schema) =>
|
|
40
|
+
id: (schema) => pipe([schema, minValue(0)]),
|
|
32
41
|
role: string(),
|
|
33
42
|
});
|
|
34
43
|
|
package/column.d.cts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import type { Json } from "./utils.cjs";
|
|
3
|
+
export declare const literalSchema: v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>, v.BooleanSchema<undefined>, v.NullSchema<undefined>], undefined>;
|
|
4
|
+
export declare const jsonSchema: v.GenericSchema<Json>;
|
|
5
|
+
export declare const bufferSchema: v.GenericSchema<Buffer>;
|
|
6
|
+
export declare function mapEnumValues(values: string[]): {
|
|
7
|
+
[k: string]: string;
|
|
8
|
+
};
|
package/column.d.mts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import type { Json } from "./utils.mjs";
|
|
3
|
+
export declare const literalSchema: v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>, v.BooleanSchema<undefined>, v.NullSchema<undefined>], undefined>;
|
|
4
|
+
export declare const jsonSchema: v.GenericSchema<Json>;
|
|
5
|
+
export declare const bufferSchema: v.GenericSchema<Buffer>;
|
|
6
|
+
export declare function mapEnumValues(values: string[]): {
|
|
7
|
+
[k: string]: string;
|
|
8
|
+
};
|
package/column.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import type { Json } from './utils.js';
|
|
3
|
+
export declare const literalSchema: v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>, v.BooleanSchema<undefined>, v.NullSchema<undefined>], undefined>;
|
|
4
|
+
export declare const jsonSchema: v.GenericSchema<Json>;
|
|
5
|
+
export declare const bufferSchema: v.GenericSchema<Buffer>;
|
|
6
|
+
export declare function mapEnumValues(values: string[]): {
|
|
7
|
+
[k: string]: string;
|
|
8
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Assume, Column } from 'drizzle-orm';
|
|
2
|
+
import type * as v from 'valibot';
|
|
3
|
+
import type { ArrayHasAtLeastOneValue, ColumnIsGeneratedAlwaysAs, IsNever, Json, RemoveNeverElements } from "./utils.cjs";
|
|
4
|
+
export type GetEnumValuesFromColumn<TColumn extends Column> = TColumn['_'] extends {
|
|
5
|
+
enumValues: [string, ...string[]];
|
|
6
|
+
} ? TColumn['_']['enumValues'] : undefined;
|
|
7
|
+
export type GetBaseColumn<TColumn extends Column> = TColumn['_'] extends {
|
|
8
|
+
baseColumn: Column | never | undefined;
|
|
9
|
+
} ? IsNever<TColumn['_']['baseColumn']> extends false ? TColumn['_']['baseColumn'] : undefined : undefined;
|
|
10
|
+
export type EnumValuesToEnum<TEnumValues extends [string, ...string[]]> = {
|
|
11
|
+
readonly [K in TEnumValues[number]]: K;
|
|
12
|
+
};
|
|
13
|
+
export type ExtractAdditionalProperties<TColumn extends Column> = {
|
|
14
|
+
max: TColumn['_']['columnType'] extends 'PgVarchar' | 'SQLiteText' | 'PgChar' | 'MySqlChar' ? Assume<TColumn['_'], {
|
|
15
|
+
length: number | undefined;
|
|
16
|
+
}>['length'] : TColumn['_']['columnType'] extends 'MySqlText' | 'MySqlVarChar' ? number : TColumn['_']['columnType'] extends 'PgBinaryVector' | 'PgHalfVector' | 'PgVector' ? Assume<TColumn['_'], {
|
|
17
|
+
dimensions: number;
|
|
18
|
+
}>['dimensions'] : TColumn['_']['columnType'] extends 'PgArray' ? Assume<TColumn['_'], {
|
|
19
|
+
size: number | undefined;
|
|
20
|
+
}>['size'] : undefined;
|
|
21
|
+
fixedLength: TColumn['_']['columnType'] extends 'PgChar' | 'MySqlChar' | 'PgHalfVector' | 'PgVector' | 'PgArray' ? true : false;
|
|
22
|
+
arrayPipelines: [];
|
|
23
|
+
};
|
|
24
|
+
type RemovePipeIfNoElements<T extends v.SchemaWithPipe<[any, ...any[]]>> = T extends infer TPiped extends {
|
|
25
|
+
pipe: [any, ...any[]];
|
|
26
|
+
} ? TPiped['pipe'][1] extends undefined ? T['pipe'][0] : TPiped : never;
|
|
27
|
+
type BuildArraySchema<TWrapped extends v.GenericSchema, TPipelines extends any[][]> = TPipelines extends [infer TFirst extends any[], ...infer TRest extends any[][]] ? BuildArraySchema<RemovePipeIfNoElements<v.SchemaWithPipe<[v.ArraySchema<TWrapped, undefined>, ...TFirst]>>, TRest> : TPipelines extends [infer TFirst extends any[]] ? BuildArraySchema<RemovePipeIfNoElements<v.SchemaWithPipe<[v.ArraySchema<TWrapped, undefined>, ...TFirst]>>, []> : TWrapped;
|
|
28
|
+
export type GetValibotType<TData, TDataType extends string, TColumnType extends string, TEnumValues extends [string, ...string[]] | undefined, TBaseColumn extends Column | undefined, TAdditionalProperties extends Record<string, any>> = TColumnType extends 'PgHalfVector' | 'PgVector' ? RemovePipeIfNoElements<v.SchemaWithPipe<RemoveNeverElements<[
|
|
29
|
+
v.ArraySchema<v.NumberSchema<undefined>, undefined>,
|
|
30
|
+
TAdditionalProperties['max'] extends number ? TAdditionalProperties['fixedLength'] extends true ? v.LengthAction<number[], number, undefined> : v.MaxLengthAction<number[], number, undefined> : never
|
|
31
|
+
]>>> : TColumnType extends 'PgUUID' ? v.SchemaWithPipe<[v.StringSchema<undefined>, v.UuidAction<string, undefined>]> : TAdditionalProperties['arrayFinished'] extends true ? GetValibotType<TData, TDataType, TColumnType, TEnumValues, TBaseColumn, Omit<TAdditionalProperties, 'arrayFinished'>> extends infer TSchema extends v.GenericSchema ? BuildArraySchema<TSchema, TAdditionalProperties['arrayPipelines']> : never : TBaseColumn extends Column ? GetValibotType<TBaseColumn['_']['data'], TBaseColumn['_']['dataType'], TBaseColumn['_']['columnType'], GetEnumValuesFromColumn<TBaseColumn>, GetBaseColumn<TBaseColumn>, Omit<ExtractAdditionalProperties<TBaseColumn>, 'arrayPipelines'> & {
|
|
32
|
+
arrayPipelines: [
|
|
33
|
+
RemoveNeverElements<[
|
|
34
|
+
TAdditionalProperties['max'] extends number ? TAdditionalProperties['fixedLength'] extends true ? v.LengthAction<Assume<TBaseColumn['_']['data'], any[]>[], number, undefined> : v.MaxLengthAction<Assume<TBaseColumn['_']['data'], any[]>[], number, undefined> : never
|
|
35
|
+
]>,
|
|
36
|
+
...TAdditionalProperties['arrayPipelines']
|
|
37
|
+
];
|
|
38
|
+
arrayFinished: GetBaseColumn<TBaseColumn> extends undefined ? true : false;
|
|
39
|
+
}> : ArrayHasAtLeastOneValue<TEnumValues> extends true ? v.EnumSchema<EnumValuesToEnum<Assume<TEnumValues, [string, ...string[]]>>, undefined> : TData extends infer TTuple extends [any, ...any[]] ? v.TupleSchema<Assume<{
|
|
40
|
+
[K in keyof TTuple]: GetValibotType<TTuple[K], string, string, undefined, undefined, {
|
|
41
|
+
noPipe: true;
|
|
42
|
+
}>;
|
|
43
|
+
}, [
|
|
44
|
+
any,
|
|
45
|
+
...any[]
|
|
46
|
+
]>, undefined> : TData extends Date ? v.DateSchema<undefined> : TData extends Buffer ? v.GenericSchema<Buffer> : TDataType extends 'array' ? v.ArraySchema<GetValibotType<Assume<TData, any[]>[number], string, string, undefined, undefined, {
|
|
47
|
+
noPipe: true;
|
|
48
|
+
}>, undefined> : TData extends infer TDict extends Record<string, any> ? v.ObjectSchema<{
|
|
49
|
+
readonly [K in keyof TDict]: GetValibotType<TDict[K], string, string, undefined, undefined, {
|
|
50
|
+
noPipe: true;
|
|
51
|
+
}>;
|
|
52
|
+
}, undefined> : TDataType extends 'json' ? v.GenericSchema<Json> : TData extends number ? TAdditionalProperties['noPipe'] extends true ? v.NumberSchema<undefined> : v.SchemaWithPipe<RemoveNeverElements<[
|
|
53
|
+
v.NumberSchema<undefined>,
|
|
54
|
+
v.MinValueAction<number, number, undefined>,
|
|
55
|
+
v.MaxValueAction<number, number, undefined>,
|
|
56
|
+
TColumnType extends 'MySqlTinyInt' | 'PgSmallInt' | 'PgSmallSerial' | 'MySqlSmallInt' | 'MySqlMediumInt' | 'PgInteger' | 'PgSerial' | 'MySqlInt' | 'PgBigInt53' | 'PgBigSerial53' | 'MySqlBigInt53' | 'MySqlSerial' | 'SQLiteInteger' | 'MySqlYear' ? v.IntegerAction<number, undefined> : never
|
|
57
|
+
]>> : TData extends bigint ? TAdditionalProperties['noPipe'] extends true ? v.BigintSchema<undefined> : v.SchemaWithPipe<[
|
|
58
|
+
v.BigintSchema<undefined>,
|
|
59
|
+
v.MinValueAction<bigint, bigint, undefined>,
|
|
60
|
+
v.MaxValueAction<bigint, bigint, undefined>
|
|
61
|
+
]> : TData extends boolean ? v.BooleanSchema<undefined> : TData extends string ? RemovePipeIfNoElements<v.SchemaWithPipe<RemoveNeverElements<[
|
|
62
|
+
v.StringSchema<undefined>,
|
|
63
|
+
TColumnType extends 'PgBinaryVector' ? v.RegexAction<string, undefined> : never,
|
|
64
|
+
TAdditionalProperties['max'] extends number ? TAdditionalProperties['fixedLength'] extends true ? v.LengthAction<string, number, undefined> : v.MaxLengthAction<string, number, undefined> : never
|
|
65
|
+
]>>> : v.AnySchema;
|
|
66
|
+
type HandleSelectColumn<TSchema extends v.GenericSchema, TColumn extends Column> = TColumn['_']['notNull'] extends true ? TSchema : v.NullableSchema<TSchema, undefined>;
|
|
67
|
+
type HandleInsertColumn<TSchema extends v.GenericSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? v.OptionalSchema<TSchema, undefined> : TSchema : v.OptionalSchema<v.NullableSchema<TSchema, undefined>, undefined>;
|
|
68
|
+
type HandleUpdateColumn<TSchema extends v.GenericSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? v.OptionalSchema<TSchema, undefined> : v.OptionalSchema<v.NullableSchema<TSchema, undefined>, undefined>;
|
|
69
|
+
export type HandleColumn<TType extends 'select' | 'insert' | 'update', TColumn extends Column> = GetValibotType<TColumn['_']['data'], TColumn['_']['dataType'], TColumn['_']['columnType'], GetEnumValuesFromColumn<TColumn>, GetBaseColumn<TColumn>, ExtractAdditionalProperties<TColumn>> extends infer TSchema extends v.GenericSchema ? TSchema extends v.AnySchema ? v.AnySchema : TType extends 'select' ? HandleSelectColumn<TSchema, TColumn> : TType extends 'insert' ? HandleInsertColumn<TSchema, TColumn> : TType extends 'update' ? HandleUpdateColumn<TSchema, TColumn> : TSchema : v.AnySchema;
|
|
70
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Assume, Column } from 'drizzle-orm';
|
|
2
|
+
import type * as v from 'valibot';
|
|
3
|
+
import type { ArrayHasAtLeastOneValue, ColumnIsGeneratedAlwaysAs, IsNever, Json, RemoveNeverElements } from "./utils.mjs";
|
|
4
|
+
export type GetEnumValuesFromColumn<TColumn extends Column> = TColumn['_'] extends {
|
|
5
|
+
enumValues: [string, ...string[]];
|
|
6
|
+
} ? TColumn['_']['enumValues'] : undefined;
|
|
7
|
+
export type GetBaseColumn<TColumn extends Column> = TColumn['_'] extends {
|
|
8
|
+
baseColumn: Column | never | undefined;
|
|
9
|
+
} ? IsNever<TColumn['_']['baseColumn']> extends false ? TColumn['_']['baseColumn'] : undefined : undefined;
|
|
10
|
+
export type EnumValuesToEnum<TEnumValues extends [string, ...string[]]> = {
|
|
11
|
+
readonly [K in TEnumValues[number]]: K;
|
|
12
|
+
};
|
|
13
|
+
export type ExtractAdditionalProperties<TColumn extends Column> = {
|
|
14
|
+
max: TColumn['_']['columnType'] extends 'PgVarchar' | 'SQLiteText' | 'PgChar' | 'MySqlChar' ? Assume<TColumn['_'], {
|
|
15
|
+
length: number | undefined;
|
|
16
|
+
}>['length'] : TColumn['_']['columnType'] extends 'MySqlText' | 'MySqlVarChar' ? number : TColumn['_']['columnType'] extends 'PgBinaryVector' | 'PgHalfVector' | 'PgVector' ? Assume<TColumn['_'], {
|
|
17
|
+
dimensions: number;
|
|
18
|
+
}>['dimensions'] : TColumn['_']['columnType'] extends 'PgArray' ? Assume<TColumn['_'], {
|
|
19
|
+
size: number | undefined;
|
|
20
|
+
}>['size'] : undefined;
|
|
21
|
+
fixedLength: TColumn['_']['columnType'] extends 'PgChar' | 'MySqlChar' | 'PgHalfVector' | 'PgVector' | 'PgArray' ? true : false;
|
|
22
|
+
arrayPipelines: [];
|
|
23
|
+
};
|
|
24
|
+
type RemovePipeIfNoElements<T extends v.SchemaWithPipe<[any, ...any[]]>> = T extends infer TPiped extends {
|
|
25
|
+
pipe: [any, ...any[]];
|
|
26
|
+
} ? TPiped['pipe'][1] extends undefined ? T['pipe'][0] : TPiped : never;
|
|
27
|
+
type BuildArraySchema<TWrapped extends v.GenericSchema, TPipelines extends any[][]> = TPipelines extends [infer TFirst extends any[], ...infer TRest extends any[][]] ? BuildArraySchema<RemovePipeIfNoElements<v.SchemaWithPipe<[v.ArraySchema<TWrapped, undefined>, ...TFirst]>>, TRest> : TPipelines extends [infer TFirst extends any[]] ? BuildArraySchema<RemovePipeIfNoElements<v.SchemaWithPipe<[v.ArraySchema<TWrapped, undefined>, ...TFirst]>>, []> : TWrapped;
|
|
28
|
+
export type GetValibotType<TData, TDataType extends string, TColumnType extends string, TEnumValues extends [string, ...string[]] | undefined, TBaseColumn extends Column | undefined, TAdditionalProperties extends Record<string, any>> = TColumnType extends 'PgHalfVector' | 'PgVector' ? RemovePipeIfNoElements<v.SchemaWithPipe<RemoveNeverElements<[
|
|
29
|
+
v.ArraySchema<v.NumberSchema<undefined>, undefined>,
|
|
30
|
+
TAdditionalProperties['max'] extends number ? TAdditionalProperties['fixedLength'] extends true ? v.LengthAction<number[], number, undefined> : v.MaxLengthAction<number[], number, undefined> : never
|
|
31
|
+
]>>> : TColumnType extends 'PgUUID' ? v.SchemaWithPipe<[v.StringSchema<undefined>, v.UuidAction<string, undefined>]> : TAdditionalProperties['arrayFinished'] extends true ? GetValibotType<TData, TDataType, TColumnType, TEnumValues, TBaseColumn, Omit<TAdditionalProperties, 'arrayFinished'>> extends infer TSchema extends v.GenericSchema ? BuildArraySchema<TSchema, TAdditionalProperties['arrayPipelines']> : never : TBaseColumn extends Column ? GetValibotType<TBaseColumn['_']['data'], TBaseColumn['_']['dataType'], TBaseColumn['_']['columnType'], GetEnumValuesFromColumn<TBaseColumn>, GetBaseColumn<TBaseColumn>, Omit<ExtractAdditionalProperties<TBaseColumn>, 'arrayPipelines'> & {
|
|
32
|
+
arrayPipelines: [
|
|
33
|
+
RemoveNeverElements<[
|
|
34
|
+
TAdditionalProperties['max'] extends number ? TAdditionalProperties['fixedLength'] extends true ? v.LengthAction<Assume<TBaseColumn['_']['data'], any[]>[], number, undefined> : v.MaxLengthAction<Assume<TBaseColumn['_']['data'], any[]>[], number, undefined> : never
|
|
35
|
+
]>,
|
|
36
|
+
...TAdditionalProperties['arrayPipelines']
|
|
37
|
+
];
|
|
38
|
+
arrayFinished: GetBaseColumn<TBaseColumn> extends undefined ? true : false;
|
|
39
|
+
}> : ArrayHasAtLeastOneValue<TEnumValues> extends true ? v.EnumSchema<EnumValuesToEnum<Assume<TEnumValues, [string, ...string[]]>>, undefined> : TData extends infer TTuple extends [any, ...any[]] ? v.TupleSchema<Assume<{
|
|
40
|
+
[K in keyof TTuple]: GetValibotType<TTuple[K], string, string, undefined, undefined, {
|
|
41
|
+
noPipe: true;
|
|
42
|
+
}>;
|
|
43
|
+
}, [
|
|
44
|
+
any,
|
|
45
|
+
...any[]
|
|
46
|
+
]>, undefined> : TData extends Date ? v.DateSchema<undefined> : TData extends Buffer ? v.GenericSchema<Buffer> : TDataType extends 'array' ? v.ArraySchema<GetValibotType<Assume<TData, any[]>[number], string, string, undefined, undefined, {
|
|
47
|
+
noPipe: true;
|
|
48
|
+
}>, undefined> : TData extends infer TDict extends Record<string, any> ? v.ObjectSchema<{
|
|
49
|
+
readonly [K in keyof TDict]: GetValibotType<TDict[K], string, string, undefined, undefined, {
|
|
50
|
+
noPipe: true;
|
|
51
|
+
}>;
|
|
52
|
+
}, undefined> : TDataType extends 'json' ? v.GenericSchema<Json> : TData extends number ? TAdditionalProperties['noPipe'] extends true ? v.NumberSchema<undefined> : v.SchemaWithPipe<RemoveNeverElements<[
|
|
53
|
+
v.NumberSchema<undefined>,
|
|
54
|
+
v.MinValueAction<number, number, undefined>,
|
|
55
|
+
v.MaxValueAction<number, number, undefined>,
|
|
56
|
+
TColumnType extends 'MySqlTinyInt' | 'PgSmallInt' | 'PgSmallSerial' | 'MySqlSmallInt' | 'MySqlMediumInt' | 'PgInteger' | 'PgSerial' | 'MySqlInt' | 'PgBigInt53' | 'PgBigSerial53' | 'MySqlBigInt53' | 'MySqlSerial' | 'SQLiteInteger' | 'MySqlYear' ? v.IntegerAction<number, undefined> : never
|
|
57
|
+
]>> : TData extends bigint ? TAdditionalProperties['noPipe'] extends true ? v.BigintSchema<undefined> : v.SchemaWithPipe<[
|
|
58
|
+
v.BigintSchema<undefined>,
|
|
59
|
+
v.MinValueAction<bigint, bigint, undefined>,
|
|
60
|
+
v.MaxValueAction<bigint, bigint, undefined>
|
|
61
|
+
]> : TData extends boolean ? v.BooleanSchema<undefined> : TData extends string ? RemovePipeIfNoElements<v.SchemaWithPipe<RemoveNeverElements<[
|
|
62
|
+
v.StringSchema<undefined>,
|
|
63
|
+
TColumnType extends 'PgBinaryVector' ? v.RegexAction<string, undefined> : never,
|
|
64
|
+
TAdditionalProperties['max'] extends number ? TAdditionalProperties['fixedLength'] extends true ? v.LengthAction<string, number, undefined> : v.MaxLengthAction<string, number, undefined> : never
|
|
65
|
+
]>>> : v.AnySchema;
|
|
66
|
+
type HandleSelectColumn<TSchema extends v.GenericSchema, TColumn extends Column> = TColumn['_']['notNull'] extends true ? TSchema : v.NullableSchema<TSchema, undefined>;
|
|
67
|
+
type HandleInsertColumn<TSchema extends v.GenericSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? v.OptionalSchema<TSchema, undefined> : TSchema : v.OptionalSchema<v.NullableSchema<TSchema, undefined>, undefined>;
|
|
68
|
+
type HandleUpdateColumn<TSchema extends v.GenericSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? v.OptionalSchema<TSchema, undefined> : v.OptionalSchema<v.NullableSchema<TSchema, undefined>, undefined>;
|
|
69
|
+
export type HandleColumn<TType extends 'select' | 'insert' | 'update', TColumn extends Column> = GetValibotType<TColumn['_']['data'], TColumn['_']['dataType'], TColumn['_']['columnType'], GetEnumValuesFromColumn<TColumn>, GetBaseColumn<TColumn>, ExtractAdditionalProperties<TColumn>> extends infer TSchema extends v.GenericSchema ? TSchema extends v.AnySchema ? v.AnySchema : TType extends 'select' ? HandleSelectColumn<TSchema, TColumn> : TType extends 'insert' ? HandleInsertColumn<TSchema, TColumn> : TType extends 'update' ? HandleUpdateColumn<TSchema, TColumn> : TSchema : v.AnySchema;
|
|
70
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Assume, Column } from 'drizzle-orm';
|
|
2
|
+
import type * as v from 'valibot';
|
|
3
|
+
import type { ArrayHasAtLeastOneValue, ColumnIsGeneratedAlwaysAs, IsNever, Json, RemoveNeverElements } from './utils.js';
|
|
4
|
+
export type GetEnumValuesFromColumn<TColumn extends Column> = TColumn['_'] extends {
|
|
5
|
+
enumValues: [string, ...string[]];
|
|
6
|
+
} ? TColumn['_']['enumValues'] : undefined;
|
|
7
|
+
export type GetBaseColumn<TColumn extends Column> = TColumn['_'] extends {
|
|
8
|
+
baseColumn: Column | never | undefined;
|
|
9
|
+
} ? IsNever<TColumn['_']['baseColumn']> extends false ? TColumn['_']['baseColumn'] : undefined : undefined;
|
|
10
|
+
export type EnumValuesToEnum<TEnumValues extends [string, ...string[]]> = {
|
|
11
|
+
readonly [K in TEnumValues[number]]: K;
|
|
12
|
+
};
|
|
13
|
+
export type ExtractAdditionalProperties<TColumn extends Column> = {
|
|
14
|
+
max: TColumn['_']['columnType'] extends 'PgVarchar' | 'SQLiteText' | 'PgChar' | 'MySqlChar' ? Assume<TColumn['_'], {
|
|
15
|
+
length: number | undefined;
|
|
16
|
+
}>['length'] : TColumn['_']['columnType'] extends 'MySqlText' | 'MySqlVarChar' ? number : TColumn['_']['columnType'] extends 'PgBinaryVector' | 'PgHalfVector' | 'PgVector' ? Assume<TColumn['_'], {
|
|
17
|
+
dimensions: number;
|
|
18
|
+
}>['dimensions'] : TColumn['_']['columnType'] extends 'PgArray' ? Assume<TColumn['_'], {
|
|
19
|
+
size: number | undefined;
|
|
20
|
+
}>['size'] : undefined;
|
|
21
|
+
fixedLength: TColumn['_']['columnType'] extends 'PgChar' | 'MySqlChar' | 'PgHalfVector' | 'PgVector' | 'PgArray' ? true : false;
|
|
22
|
+
arrayPipelines: [];
|
|
23
|
+
};
|
|
24
|
+
type RemovePipeIfNoElements<T extends v.SchemaWithPipe<[any, ...any[]]>> = T extends infer TPiped extends {
|
|
25
|
+
pipe: [any, ...any[]];
|
|
26
|
+
} ? TPiped['pipe'][1] extends undefined ? T['pipe'][0] : TPiped : never;
|
|
27
|
+
type BuildArraySchema<TWrapped extends v.GenericSchema, TPipelines extends any[][]> = TPipelines extends [infer TFirst extends any[], ...infer TRest extends any[][]] ? BuildArraySchema<RemovePipeIfNoElements<v.SchemaWithPipe<[v.ArraySchema<TWrapped, undefined>, ...TFirst]>>, TRest> : TPipelines extends [infer TFirst extends any[]] ? BuildArraySchema<RemovePipeIfNoElements<v.SchemaWithPipe<[v.ArraySchema<TWrapped, undefined>, ...TFirst]>>, []> : TWrapped;
|
|
28
|
+
export type GetValibotType<TData, TDataType extends string, TColumnType extends string, TEnumValues extends [string, ...string[]] | undefined, TBaseColumn extends Column | undefined, TAdditionalProperties extends Record<string, any>> = TColumnType extends 'PgHalfVector' | 'PgVector' ? RemovePipeIfNoElements<v.SchemaWithPipe<RemoveNeverElements<[
|
|
29
|
+
v.ArraySchema<v.NumberSchema<undefined>, undefined>,
|
|
30
|
+
TAdditionalProperties['max'] extends number ? TAdditionalProperties['fixedLength'] extends true ? v.LengthAction<number[], number, undefined> : v.MaxLengthAction<number[], number, undefined> : never
|
|
31
|
+
]>>> : TColumnType extends 'PgUUID' ? v.SchemaWithPipe<[v.StringSchema<undefined>, v.UuidAction<string, undefined>]> : TAdditionalProperties['arrayFinished'] extends true ? GetValibotType<TData, TDataType, TColumnType, TEnumValues, TBaseColumn, Omit<TAdditionalProperties, 'arrayFinished'>> extends infer TSchema extends v.GenericSchema ? BuildArraySchema<TSchema, TAdditionalProperties['arrayPipelines']> : never : TBaseColumn extends Column ? GetValibotType<TBaseColumn['_']['data'], TBaseColumn['_']['dataType'], TBaseColumn['_']['columnType'], GetEnumValuesFromColumn<TBaseColumn>, GetBaseColumn<TBaseColumn>, Omit<ExtractAdditionalProperties<TBaseColumn>, 'arrayPipelines'> & {
|
|
32
|
+
arrayPipelines: [
|
|
33
|
+
RemoveNeverElements<[
|
|
34
|
+
TAdditionalProperties['max'] extends number ? TAdditionalProperties['fixedLength'] extends true ? v.LengthAction<Assume<TBaseColumn['_']['data'], any[]>[], number, undefined> : v.MaxLengthAction<Assume<TBaseColumn['_']['data'], any[]>[], number, undefined> : never
|
|
35
|
+
]>,
|
|
36
|
+
...TAdditionalProperties['arrayPipelines']
|
|
37
|
+
];
|
|
38
|
+
arrayFinished: GetBaseColumn<TBaseColumn> extends undefined ? true : false;
|
|
39
|
+
}> : ArrayHasAtLeastOneValue<TEnumValues> extends true ? v.EnumSchema<EnumValuesToEnum<Assume<TEnumValues, [string, ...string[]]>>, undefined> : TData extends infer TTuple extends [any, ...any[]] ? v.TupleSchema<Assume<{
|
|
40
|
+
[K in keyof TTuple]: GetValibotType<TTuple[K], string, string, undefined, undefined, {
|
|
41
|
+
noPipe: true;
|
|
42
|
+
}>;
|
|
43
|
+
}, [
|
|
44
|
+
any,
|
|
45
|
+
...any[]
|
|
46
|
+
]>, undefined> : TData extends Date ? v.DateSchema<undefined> : TData extends Buffer ? v.GenericSchema<Buffer> : TDataType extends 'array' ? v.ArraySchema<GetValibotType<Assume<TData, any[]>[number], string, string, undefined, undefined, {
|
|
47
|
+
noPipe: true;
|
|
48
|
+
}>, undefined> : TData extends infer TDict extends Record<string, any> ? v.ObjectSchema<{
|
|
49
|
+
readonly [K in keyof TDict]: GetValibotType<TDict[K], string, string, undefined, undefined, {
|
|
50
|
+
noPipe: true;
|
|
51
|
+
}>;
|
|
52
|
+
}, undefined> : TDataType extends 'json' ? v.GenericSchema<Json> : TData extends number ? TAdditionalProperties['noPipe'] extends true ? v.NumberSchema<undefined> : v.SchemaWithPipe<RemoveNeverElements<[
|
|
53
|
+
v.NumberSchema<undefined>,
|
|
54
|
+
v.MinValueAction<number, number, undefined>,
|
|
55
|
+
v.MaxValueAction<number, number, undefined>,
|
|
56
|
+
TColumnType extends 'MySqlTinyInt' | 'PgSmallInt' | 'PgSmallSerial' | 'MySqlSmallInt' | 'MySqlMediumInt' | 'PgInteger' | 'PgSerial' | 'MySqlInt' | 'PgBigInt53' | 'PgBigSerial53' | 'MySqlBigInt53' | 'MySqlSerial' | 'SQLiteInteger' | 'MySqlYear' ? v.IntegerAction<number, undefined> : never
|
|
57
|
+
]>> : TData extends bigint ? TAdditionalProperties['noPipe'] extends true ? v.BigintSchema<undefined> : v.SchemaWithPipe<[
|
|
58
|
+
v.BigintSchema<undefined>,
|
|
59
|
+
v.MinValueAction<bigint, bigint, undefined>,
|
|
60
|
+
v.MaxValueAction<bigint, bigint, undefined>
|
|
61
|
+
]> : TData extends boolean ? v.BooleanSchema<undefined> : TData extends string ? RemovePipeIfNoElements<v.SchemaWithPipe<RemoveNeverElements<[
|
|
62
|
+
v.StringSchema<undefined>,
|
|
63
|
+
TColumnType extends 'PgBinaryVector' ? v.RegexAction<string, undefined> : never,
|
|
64
|
+
TAdditionalProperties['max'] extends number ? TAdditionalProperties['fixedLength'] extends true ? v.LengthAction<string, number, undefined> : v.MaxLengthAction<string, number, undefined> : never
|
|
65
|
+
]>>> : v.AnySchema;
|
|
66
|
+
type HandleSelectColumn<TSchema extends v.GenericSchema, TColumn extends Column> = TColumn['_']['notNull'] extends true ? TSchema : v.NullableSchema<TSchema, undefined>;
|
|
67
|
+
type HandleInsertColumn<TSchema extends v.GenericSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? v.OptionalSchema<TSchema, undefined> : TSchema : v.OptionalSchema<v.NullableSchema<TSchema, undefined>, undefined>;
|
|
68
|
+
type HandleUpdateColumn<TSchema extends v.GenericSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? v.OptionalSchema<TSchema, undefined> : v.OptionalSchema<v.NullableSchema<TSchema, undefined>, undefined>;
|
|
69
|
+
export type HandleColumn<TType extends 'select' | 'insert' | 'update', TColumn extends Column> = GetValibotType<TColumn['_']['data'], TColumn['_']['dataType'], TColumn['_']['columnType'], GetEnumValuesFromColumn<TColumn>, GetBaseColumn<TColumn>, ExtractAdditionalProperties<TColumn>> extends infer TSchema extends v.GenericSchema ? TSchema extends v.AnySchema ? v.AnySchema : TType extends 'select' ? HandleSelectColumn<TSchema, TColumn> : TType extends 'insert' ? HandleInsertColumn<TSchema, TColumn> : TType extends 'update' ? HandleUpdateColumn<TSchema, TColumn> : TSchema : v.AnySchema;
|
|
70
|
+
export {};
|
package/constants.d.cts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const CONSTANTS: {
|
|
2
|
+
INT8_MIN: number;
|
|
3
|
+
INT8_MAX: number;
|
|
4
|
+
INT8_UNSIGNED_MAX: number;
|
|
5
|
+
INT16_MIN: number;
|
|
6
|
+
INT16_MAX: number;
|
|
7
|
+
INT16_UNSIGNED_MAX: number;
|
|
8
|
+
INT24_MIN: number;
|
|
9
|
+
INT24_MAX: number;
|
|
10
|
+
INT24_UNSIGNED_MAX: number;
|
|
11
|
+
INT32_MIN: number;
|
|
12
|
+
INT32_MAX: number;
|
|
13
|
+
INT32_UNSIGNED_MAX: number;
|
|
14
|
+
INT48_MIN: number;
|
|
15
|
+
INT48_MAX: number;
|
|
16
|
+
INT48_UNSIGNED_MAX: number;
|
|
17
|
+
INT64_MIN: bigint;
|
|
18
|
+
INT64_MAX: bigint;
|
|
19
|
+
INT64_UNSIGNED_MAX: bigint;
|
|
20
|
+
};
|
package/constants.d.mts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const CONSTANTS: {
|
|
2
|
+
INT8_MIN: number;
|
|
3
|
+
INT8_MAX: number;
|
|
4
|
+
INT8_UNSIGNED_MAX: number;
|
|
5
|
+
INT16_MIN: number;
|
|
6
|
+
INT16_MAX: number;
|
|
7
|
+
INT16_UNSIGNED_MAX: number;
|
|
8
|
+
INT24_MIN: number;
|
|
9
|
+
INT24_MAX: number;
|
|
10
|
+
INT24_UNSIGNED_MAX: number;
|
|
11
|
+
INT32_MIN: number;
|
|
12
|
+
INT32_MAX: number;
|
|
13
|
+
INT32_UNSIGNED_MAX: number;
|
|
14
|
+
INT48_MIN: number;
|
|
15
|
+
INT48_MAX: number;
|
|
16
|
+
INT48_UNSIGNED_MAX: number;
|
|
17
|
+
INT64_MIN: bigint;
|
|
18
|
+
INT64_MAX: bigint;
|
|
19
|
+
INT64_UNSIGNED_MAX: bigint;
|
|
20
|
+
};
|
package/constants.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const CONSTANTS: {
|
|
2
|
+
INT8_MIN: number;
|
|
3
|
+
INT8_MAX: number;
|
|
4
|
+
INT8_UNSIGNED_MAX: number;
|
|
5
|
+
INT16_MIN: number;
|
|
6
|
+
INT16_MAX: number;
|
|
7
|
+
INT16_UNSIGNED_MAX: number;
|
|
8
|
+
INT24_MIN: number;
|
|
9
|
+
INT24_MAX: number;
|
|
10
|
+
INT24_UNSIGNED_MAX: number;
|
|
11
|
+
INT32_MIN: number;
|
|
12
|
+
INT32_MAX: number;
|
|
13
|
+
INT32_UNSIGNED_MAX: number;
|
|
14
|
+
INT48_MIN: number;
|
|
15
|
+
INT48_MAX: number;
|
|
16
|
+
INT48_UNSIGNED_MAX: number;
|
|
17
|
+
INT64_MIN: bigint;
|
|
18
|
+
INT64_MAX: bigint;
|
|
19
|
+
INT64_UNSIGNED_MAX: bigint;
|
|
20
|
+
};
|