drizzle-arktype 0.1.0
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 +51 -0
- package/column.d.cts +6 -0
- package/column.d.mts +6 -0
- package/column.d.ts +6 -0
- package/column.types.d.cts +14 -0
- package/column.types.d.mts +14 -0
- package/column.types.d.ts +14 -0
- package/constants.d.cts +20 -0
- package/constants.d.mts +20 -0
- package/constants.d.ts +20 -0
- package/index.cjs +306 -0
- package/index.cjs.map +1 -0
- package/index.d.cts +7 -0
- package/index.d.mts +7 -0
- package/index.d.ts +7 -0
- package/index.mjs +296 -0
- package/index.mjs.map +1 -0
- package/package.json +74 -0
- package/schema.d.cts +4 -0
- package/schema.d.mts +4 -0
- package/schema.d.ts +4 -0
- package/schema.types.d.cts +19 -0
- package/schema.types.d.mts +19 -0
- package/schema.types.d.ts +19 -0
- package/schema.types.internal.d.cts +25 -0
- package/schema.types.internal.d.mts +25 -0
- package/schema.types.internal.d.ts +25 -0
- package/utils.d.cts +22 -0
- package/utils.d.mts +22 -0
- package/utils.d.ts +22 -0
package/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
`drizzle-arktype` is a plugin for [Drizzle ORM](https://github.com/drizzle-team/drizzle-orm) that allows you to generate [arktype](https://arktype.io/) schemas from Drizzle ORM schemas.
|
|
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
|
+
|
|
9
|
+
# Usage
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { pgEnum, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';
|
|
13
|
+
import { createInsertSchema, createSelectSchema } from 'drizzle-arktype';
|
|
14
|
+
import { type } from 'arktype';
|
|
15
|
+
|
|
16
|
+
const users = pgTable('users', {
|
|
17
|
+
id: serial('id').primaryKey(),
|
|
18
|
+
name: text('name').notNull(),
|
|
19
|
+
email: text('email').notNull(),
|
|
20
|
+
role: text('role', { enum: ['admin', 'user'] }).notNull(),
|
|
21
|
+
createdAt: timestamp('created_at').notNull().defaultNow(),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// Schema for inserting a user - can be used to validate API requests
|
|
25
|
+
const insertUserSchema = createInsertSchema(users);
|
|
26
|
+
|
|
27
|
+
// Schema for updating a user - can be used to validate API requests
|
|
28
|
+
const updateUserSchema = createUpdateSchema(users);
|
|
29
|
+
|
|
30
|
+
// Schema for selecting a user - can be used to validate API responses
|
|
31
|
+
const selectUserSchema = createSelectSchema(users);
|
|
32
|
+
|
|
33
|
+
// Overriding the fields
|
|
34
|
+
const insertUserSchema = createInsertSchema(users, {
|
|
35
|
+
role: type('string'),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Refining the fields - useful if you want to change the fields before they become nullable/optional in the final schema
|
|
39
|
+
const insertUserSchema = createInsertSchema(users, {
|
|
40
|
+
id: (schema) => schema.atLeast(1),
|
|
41
|
+
role: type('string'),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Usage
|
|
45
|
+
|
|
46
|
+
const isUserValid = parse(insertUserSchema, {
|
|
47
|
+
name: 'John Doe',
|
|
48
|
+
email: 'johndoe@test.com',
|
|
49
|
+
role: 'admin',
|
|
50
|
+
});
|
|
51
|
+
```
|
package/column.d.cts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Type } from 'arktype';
|
|
2
|
+
import type { Column } from 'drizzle-orm';
|
|
3
|
+
export declare const literalSchema: import("arktype/internal/methods/base.ts").BaseType<string | number | boolean | null, {}>;
|
|
4
|
+
export declare const jsonSchema: import("arktype/internal/methods/base.ts").BaseType<string | number | boolean | any[] | Record<string, any> | null, {}>;
|
|
5
|
+
export declare const bufferSchema: import("arktype/internal/methods/object.ts").ObjectType<Buffer, {}>;
|
|
6
|
+
export declare function columnToSchema(column: Column): Type;
|
package/column.d.mts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Type } from 'arktype';
|
|
2
|
+
import type { Column } from 'drizzle-orm';
|
|
3
|
+
export declare const literalSchema: import("arktype/internal/methods/base.ts").BaseType<string | number | boolean | null, {}>;
|
|
4
|
+
export declare const jsonSchema: import("arktype/internal/methods/base.ts").BaseType<string | number | boolean | any[] | Record<string, any> | null, {}>;
|
|
5
|
+
export declare const bufferSchema: import("arktype/internal/methods/object.ts").ObjectType<Buffer, {}>;
|
|
6
|
+
export declare function columnToSchema(column: Column): Type;
|
package/column.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Type } from 'arktype';
|
|
2
|
+
import type { Column } from 'drizzle-orm';
|
|
3
|
+
export declare const literalSchema: import("arktype/internal/methods/base.ts").BaseType<string | number | boolean | null, {}>;
|
|
4
|
+
export declare const jsonSchema: import("arktype/internal/methods/base.ts").BaseType<string | number | boolean | any[] | Record<string, any> | null, {}>;
|
|
5
|
+
export declare const bufferSchema: import("arktype/internal/methods/object.ts").ObjectType<Buffer, {}>;
|
|
6
|
+
export declare function columnToSchema(column: Column): Type;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Type, type } from 'arktype';
|
|
2
|
+
import type { Assume, Column } from 'drizzle-orm';
|
|
3
|
+
import type { ColumnIsGeneratedAlwaysAs, IsEnumDefined, IsUnknown, Json } from "./utils.cjs";
|
|
4
|
+
export type ArktypeNullable<TSchema> = Type<type.infer<TSchema> | null, {}>;
|
|
5
|
+
export type ArktypeOptional<TSchema> = [Type<type.infer<TSchema>, {}>, '?'];
|
|
6
|
+
export type GetEnumValuesFromColumn<TColumn extends Column> = TColumn['_'] extends {
|
|
7
|
+
enumValues: [string, ...string[]];
|
|
8
|
+
} ? TColumn['_']['enumValues'] : undefined;
|
|
9
|
+
export type GetArktypeType<TData, TColumnType extends string, TEnumValues extends [string, ...string[]] | undefined> = IsEnumDefined<TEnumValues> extends true ? Type<Assume<TEnumValues, any[]>[number]> : TColumnType extends 'PgJson' | 'PgJsonb' | 'MySqlJson' | 'SingleStoreJson' | 'SQLiteTextJson' | 'SQLiteBlobJson' ? IsUnknown<TData> extends true ? Type<Json> : Type<TData> : Type<TData>;
|
|
10
|
+
type HandleSelectColumn<TSchema, TColumn extends Column> = TColumn['_']['notNull'] extends true ? TSchema : ArktypeNullable<TSchema>;
|
|
11
|
+
type HandleInsertColumn<TSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? ArktypeOptional<TSchema> : TSchema : ArktypeOptional<ArktypeNullable<TSchema>>;
|
|
12
|
+
type HandleUpdateColumn<TSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? ArktypeOptional<TSchema> : ArktypeOptional<ArktypeNullable<TSchema>>;
|
|
13
|
+
export type HandleColumn<TType extends 'select' | 'insert' | 'update', TColumn extends Column> = GetArktypeType<TColumn['_']['data'], TColumn['_']['columnType'], GetEnumValuesFromColumn<TColumn>> extends infer TSchema ? TType extends 'select' ? HandleSelectColumn<TSchema, TColumn> : TType extends 'insert' ? HandleInsertColumn<TSchema, TColumn> : TType extends 'update' ? HandleUpdateColumn<TSchema, TColumn> : TSchema : Type;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Type, type } from 'arktype';
|
|
2
|
+
import type { Assume, Column } from 'drizzle-orm';
|
|
3
|
+
import type { ColumnIsGeneratedAlwaysAs, IsEnumDefined, IsUnknown, Json } from "./utils.mjs";
|
|
4
|
+
export type ArktypeNullable<TSchema> = Type<type.infer<TSchema> | null, {}>;
|
|
5
|
+
export type ArktypeOptional<TSchema> = [Type<type.infer<TSchema>, {}>, '?'];
|
|
6
|
+
export type GetEnumValuesFromColumn<TColumn extends Column> = TColumn['_'] extends {
|
|
7
|
+
enumValues: [string, ...string[]];
|
|
8
|
+
} ? TColumn['_']['enumValues'] : undefined;
|
|
9
|
+
export type GetArktypeType<TData, TColumnType extends string, TEnumValues extends [string, ...string[]] | undefined> = IsEnumDefined<TEnumValues> extends true ? Type<Assume<TEnumValues, any[]>[number]> : TColumnType extends 'PgJson' | 'PgJsonb' | 'MySqlJson' | 'SingleStoreJson' | 'SQLiteTextJson' | 'SQLiteBlobJson' ? IsUnknown<TData> extends true ? Type<Json> : Type<TData> : Type<TData>;
|
|
10
|
+
type HandleSelectColumn<TSchema, TColumn extends Column> = TColumn['_']['notNull'] extends true ? TSchema : ArktypeNullable<TSchema>;
|
|
11
|
+
type HandleInsertColumn<TSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? ArktypeOptional<TSchema> : TSchema : ArktypeOptional<ArktypeNullable<TSchema>>;
|
|
12
|
+
type HandleUpdateColumn<TSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? ArktypeOptional<TSchema> : ArktypeOptional<ArktypeNullable<TSchema>>;
|
|
13
|
+
export type HandleColumn<TType extends 'select' | 'insert' | 'update', TColumn extends Column> = GetArktypeType<TColumn['_']['data'], TColumn['_']['columnType'], GetEnumValuesFromColumn<TColumn>> extends infer TSchema ? TType extends 'select' ? HandleSelectColumn<TSchema, TColumn> : TType extends 'insert' ? HandleInsertColumn<TSchema, TColumn> : TType extends 'update' ? HandleUpdateColumn<TSchema, TColumn> : TSchema : Type;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Type, type } from 'arktype';
|
|
2
|
+
import type { Assume, Column } from 'drizzle-orm';
|
|
3
|
+
import type { ColumnIsGeneratedAlwaysAs, IsEnumDefined, IsUnknown, Json } from './utils.js';
|
|
4
|
+
export type ArktypeNullable<TSchema> = Type<type.infer<TSchema> | null, {}>;
|
|
5
|
+
export type ArktypeOptional<TSchema> = [Type<type.infer<TSchema>, {}>, '?'];
|
|
6
|
+
export type GetEnumValuesFromColumn<TColumn extends Column> = TColumn['_'] extends {
|
|
7
|
+
enumValues: [string, ...string[]];
|
|
8
|
+
} ? TColumn['_']['enumValues'] : undefined;
|
|
9
|
+
export type GetArktypeType<TData, TColumnType extends string, TEnumValues extends [string, ...string[]] | undefined> = IsEnumDefined<TEnumValues> extends true ? Type<Assume<TEnumValues, any[]>[number]> : TColumnType extends 'PgJson' | 'PgJsonb' | 'MySqlJson' | 'SingleStoreJson' | 'SQLiteTextJson' | 'SQLiteBlobJson' ? IsUnknown<TData> extends true ? Type<Json> : Type<TData> : Type<TData>;
|
|
10
|
+
type HandleSelectColumn<TSchema, TColumn extends Column> = TColumn['_']['notNull'] extends true ? TSchema : ArktypeNullable<TSchema>;
|
|
11
|
+
type HandleInsertColumn<TSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? ArktypeOptional<TSchema> : TSchema : ArktypeOptional<ArktypeNullable<TSchema>>;
|
|
12
|
+
type HandleUpdateColumn<TSchema, TColumn extends Column> = ColumnIsGeneratedAlwaysAs<TColumn> extends true ? never : TColumn['_']['notNull'] extends true ? ArktypeOptional<TSchema> : ArktypeOptional<ArktypeNullable<TSchema>>;
|
|
13
|
+
export type HandleColumn<TType extends 'select' | 'insert' | 'update', TColumn extends Column> = GetArktypeType<TColumn['_']['data'], TColumn['_']['columnType'], GetEnumValuesFromColumn<TColumn>> extends infer TSchema ? TType extends 'select' ? HandleSelectColumn<TSchema, TColumn> : TType extends 'insert' ? HandleInsertColumn<TSchema, TColumn> : TType extends 'update' ? HandleUpdateColumn<TSchema, TColumn> : TSchema : Type;
|
|
14
|
+
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
|
+
};
|
package/index.cjs
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var arktype = require('arktype');
|
|
4
|
+
var drizzleOrm = require('drizzle-orm');
|
|
5
|
+
|
|
6
|
+
const CONSTANTS = {
|
|
7
|
+
INT8_MIN: -128,
|
|
8
|
+
INT8_MAX: 127,
|
|
9
|
+
INT8_UNSIGNED_MAX: 255,
|
|
10
|
+
INT16_MIN: -32768,
|
|
11
|
+
INT16_MAX: 32767,
|
|
12
|
+
INT16_UNSIGNED_MAX: 65535,
|
|
13
|
+
INT24_MIN: -8388608,
|
|
14
|
+
INT24_MAX: 8388607,
|
|
15
|
+
INT24_UNSIGNED_MAX: 16777215,
|
|
16
|
+
INT32_MIN: -2147483648,
|
|
17
|
+
INT32_MAX: 2147483647,
|
|
18
|
+
INT32_UNSIGNED_MAX: 4294967295,
|
|
19
|
+
INT48_MIN: -140737488355328,
|
|
20
|
+
INT48_MAX: 140737488355327,
|
|
21
|
+
INT48_UNSIGNED_MAX: 281474976710655,
|
|
22
|
+
INT64_MIN: -9223372036854775808n,
|
|
23
|
+
INT64_MAX: 9223372036854775807n,
|
|
24
|
+
INT64_UNSIGNED_MAX: 18446744073709551615n,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function isColumnType(column, columnTypes) {
|
|
28
|
+
return columnTypes.includes(column.columnType);
|
|
29
|
+
}
|
|
30
|
+
function isWithEnum(column) {
|
|
31
|
+
return 'enumValues' in column && Array.isArray(column.enumValues) && column.enumValues.length > 0;
|
|
32
|
+
}
|
|
33
|
+
const isPgEnum = isWithEnum;
|
|
34
|
+
|
|
35
|
+
const literalSchema = arktype.type.string.or(arktype.type.number).or(arktype.type.boolean).or(arktype.type.null);
|
|
36
|
+
const jsonSchema = literalSchema.or(arktype.type.unknown.as().array()).or(arktype.type.object.as());
|
|
37
|
+
const bufferSchema = arktype.type.instanceOf(Buffer); // eslint-disable-line no-instanceof/no-instanceof
|
|
38
|
+
function columnToSchema(column) {
|
|
39
|
+
let schema;
|
|
40
|
+
if (isWithEnum(column)) {
|
|
41
|
+
schema = column.enumValues.length ? arktype.type.enumerated(...column.enumValues) : arktype.type.string;
|
|
42
|
+
}
|
|
43
|
+
if (!schema) {
|
|
44
|
+
// Handle specific types
|
|
45
|
+
if (isColumnType(column, ['PgGeometry', 'PgPointTuple'])) {
|
|
46
|
+
schema = arktype.type([arktype.type.number, arktype.type.number]);
|
|
47
|
+
}
|
|
48
|
+
else if (isColumnType(column, ['PgGeometryObject', 'PgPointObject'])) {
|
|
49
|
+
schema = arktype.type({
|
|
50
|
+
x: arktype.type.number,
|
|
51
|
+
y: arktype.type.number,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else if (isColumnType(column, ['PgHalfVector', 'PgVector'])) {
|
|
55
|
+
schema = column.dimensions
|
|
56
|
+
? arktype.type.number.array().exactlyLength(column.dimensions)
|
|
57
|
+
: arktype.type.number.array();
|
|
58
|
+
}
|
|
59
|
+
else if (isColumnType(column, ['PgLine'])) {
|
|
60
|
+
schema = arktype.type([arktype.type.number, arktype.type.number, arktype.type.number]);
|
|
61
|
+
}
|
|
62
|
+
else if (isColumnType(column, ['PgLineABC'])) {
|
|
63
|
+
schema = arktype.type({
|
|
64
|
+
a: arktype.type.number,
|
|
65
|
+
b: arktype.type.number,
|
|
66
|
+
c: arktype.type.number,
|
|
67
|
+
});
|
|
68
|
+
} // Handle other types
|
|
69
|
+
else if (isColumnType(column, ['PgArray'])) {
|
|
70
|
+
const arraySchema = columnToSchema(column.baseColumn).array();
|
|
71
|
+
schema = column.size ? arraySchema.exactlyLength(column.size) : arraySchema;
|
|
72
|
+
}
|
|
73
|
+
else if (column.dataType === 'array') {
|
|
74
|
+
schema = arktype.type.unknown.array();
|
|
75
|
+
}
|
|
76
|
+
else if (column.dataType === 'number') {
|
|
77
|
+
schema = numberColumnToSchema(column);
|
|
78
|
+
}
|
|
79
|
+
else if (column.dataType === 'bigint') {
|
|
80
|
+
schema = bigintColumnToSchema(column);
|
|
81
|
+
}
|
|
82
|
+
else if (column.dataType === 'boolean') {
|
|
83
|
+
schema = arktype.type.boolean;
|
|
84
|
+
}
|
|
85
|
+
else if (column.dataType === 'date') {
|
|
86
|
+
schema = arktype.type.Date;
|
|
87
|
+
}
|
|
88
|
+
else if (column.dataType === 'string') {
|
|
89
|
+
schema = stringColumnToSchema(column);
|
|
90
|
+
}
|
|
91
|
+
else if (column.dataType === 'json') {
|
|
92
|
+
schema = jsonSchema;
|
|
93
|
+
}
|
|
94
|
+
else if (column.dataType === 'custom') {
|
|
95
|
+
schema = arktype.type.unknown;
|
|
96
|
+
}
|
|
97
|
+
else if (column.dataType === 'buffer') {
|
|
98
|
+
schema = bufferSchema;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!schema) {
|
|
102
|
+
schema = arktype.type.unknown;
|
|
103
|
+
}
|
|
104
|
+
return schema;
|
|
105
|
+
}
|
|
106
|
+
function numberColumnToSchema(column) {
|
|
107
|
+
let unsigned = column.getSQLType().includes('unsigned');
|
|
108
|
+
let min;
|
|
109
|
+
let max;
|
|
110
|
+
let integer = false;
|
|
111
|
+
if (isColumnType(column, ['MySqlTinyInt', 'SingleStoreTinyInt'])) {
|
|
112
|
+
min = unsigned ? 0 : CONSTANTS.INT8_MIN;
|
|
113
|
+
max = unsigned ? CONSTANTS.INT8_UNSIGNED_MAX : CONSTANTS.INT8_MAX;
|
|
114
|
+
integer = true;
|
|
115
|
+
}
|
|
116
|
+
else if (isColumnType(column, [
|
|
117
|
+
'PgSmallInt',
|
|
118
|
+
'PgSmallSerial',
|
|
119
|
+
'MySqlSmallInt',
|
|
120
|
+
'SingleStoreSmallInt',
|
|
121
|
+
])) {
|
|
122
|
+
min = unsigned ? 0 : CONSTANTS.INT16_MIN;
|
|
123
|
+
max = unsigned ? CONSTANTS.INT16_UNSIGNED_MAX : CONSTANTS.INT16_MAX;
|
|
124
|
+
integer = true;
|
|
125
|
+
}
|
|
126
|
+
else if (isColumnType(column, [
|
|
127
|
+
'PgReal',
|
|
128
|
+
'MySqlFloat',
|
|
129
|
+
'MySqlMediumInt',
|
|
130
|
+
'SingleStoreFloat',
|
|
131
|
+
'SingleStoreMediumInt',
|
|
132
|
+
])) {
|
|
133
|
+
min = unsigned ? 0 : CONSTANTS.INT24_MIN;
|
|
134
|
+
max = unsigned ? CONSTANTS.INT24_UNSIGNED_MAX : CONSTANTS.INT24_MAX;
|
|
135
|
+
integer = isColumnType(column, ['MySqlMediumInt', 'SingleStoreMediumInt']);
|
|
136
|
+
}
|
|
137
|
+
else if (isColumnType(column, [
|
|
138
|
+
'PgInteger',
|
|
139
|
+
'PgSerial',
|
|
140
|
+
'MySqlInt',
|
|
141
|
+
'SingleStoreInt',
|
|
142
|
+
])) {
|
|
143
|
+
min = unsigned ? 0 : CONSTANTS.INT32_MIN;
|
|
144
|
+
max = unsigned ? CONSTANTS.INT32_UNSIGNED_MAX : CONSTANTS.INT32_MAX;
|
|
145
|
+
integer = true;
|
|
146
|
+
}
|
|
147
|
+
else if (isColumnType(column, [
|
|
148
|
+
'PgDoublePrecision',
|
|
149
|
+
'MySqlReal',
|
|
150
|
+
'MySqlDouble',
|
|
151
|
+
'SingleStoreReal',
|
|
152
|
+
'SingleStoreDouble',
|
|
153
|
+
'SQLiteReal',
|
|
154
|
+
])) {
|
|
155
|
+
min = unsigned ? 0 : CONSTANTS.INT48_MIN;
|
|
156
|
+
max = unsigned ? CONSTANTS.INT48_UNSIGNED_MAX : CONSTANTS.INT48_MAX;
|
|
157
|
+
}
|
|
158
|
+
else if (isColumnType(column, [
|
|
159
|
+
'PgBigInt53',
|
|
160
|
+
'PgBigSerial53',
|
|
161
|
+
'MySqlBigInt53',
|
|
162
|
+
'MySqlSerial',
|
|
163
|
+
'SingleStoreBigInt53',
|
|
164
|
+
'SingleStoreSerial',
|
|
165
|
+
'SQLiteInteger',
|
|
166
|
+
])) {
|
|
167
|
+
unsigned = unsigned || isColumnType(column, ['MySqlSerial', 'SingleStoreSerial']);
|
|
168
|
+
min = unsigned ? 0 : Number.MIN_SAFE_INTEGER;
|
|
169
|
+
max = Number.MAX_SAFE_INTEGER;
|
|
170
|
+
integer = true;
|
|
171
|
+
}
|
|
172
|
+
else if (isColumnType(column, ['MySqlYear', 'SingleStoreYear'])) {
|
|
173
|
+
min = 1901;
|
|
174
|
+
max = 2155;
|
|
175
|
+
integer = true;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
min = Number.MIN_SAFE_INTEGER;
|
|
179
|
+
max = Number.MAX_SAFE_INTEGER;
|
|
180
|
+
}
|
|
181
|
+
return (integer ? arktype.type.keywords.number.integer : arktype.type.number).atLeast(min).atMost(max);
|
|
182
|
+
}
|
|
183
|
+
/** @internal */
|
|
184
|
+
const unsignedBigintNarrow = (v, ctx) => v < 0n ? ctx.mustBe('greater than') : v > CONSTANTS.INT64_UNSIGNED_MAX ? ctx.mustBe('less than') : true;
|
|
185
|
+
/** @internal */
|
|
186
|
+
const bigintNarrow = (v, ctx) => v < CONSTANTS.INT64_MIN ? ctx.mustBe('greater than') : v > CONSTANTS.INT64_MAX ? ctx.mustBe('less than') : true;
|
|
187
|
+
function bigintColumnToSchema(column) {
|
|
188
|
+
const unsigned = column.getSQLType().includes('unsigned');
|
|
189
|
+
return arktype.type.bigint.narrow(unsigned ? unsignedBigintNarrow : bigintNarrow);
|
|
190
|
+
}
|
|
191
|
+
function stringColumnToSchema(column) {
|
|
192
|
+
if (isColumnType(column, ['PgUUID'])) {
|
|
193
|
+
return arktype.type(/^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$/iu).describe('a RFC-4122-compliant UUID');
|
|
194
|
+
}
|
|
195
|
+
if (isColumnType(column, ['PgBinaryVector'])) {
|
|
196
|
+
return arktype.type(`/^[01]{${column.dimensions}}$/`)
|
|
197
|
+
.describe(`a string containing ones or zeros while being ${column.dimensions} characters long`);
|
|
198
|
+
}
|
|
199
|
+
let max;
|
|
200
|
+
let fixed = false;
|
|
201
|
+
if (isColumnType(column, ['PgVarchar', 'SQLiteText'])) {
|
|
202
|
+
max = column.length;
|
|
203
|
+
}
|
|
204
|
+
else if (isColumnType(column, ['MySqlVarChar', 'SingleStoreVarChar'])) {
|
|
205
|
+
max = column.length ?? CONSTANTS.INT16_UNSIGNED_MAX;
|
|
206
|
+
}
|
|
207
|
+
else if (isColumnType(column, ['MySqlText', 'SingleStoreText'])) {
|
|
208
|
+
if (column.textType === 'longtext') {
|
|
209
|
+
max = CONSTANTS.INT32_UNSIGNED_MAX;
|
|
210
|
+
}
|
|
211
|
+
else if (column.textType === 'mediumtext') {
|
|
212
|
+
max = CONSTANTS.INT24_UNSIGNED_MAX;
|
|
213
|
+
}
|
|
214
|
+
else if (column.textType === 'text') {
|
|
215
|
+
max = CONSTANTS.INT16_UNSIGNED_MAX;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
max = CONSTANTS.INT8_UNSIGNED_MAX;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (isColumnType(column, [
|
|
222
|
+
'PgChar',
|
|
223
|
+
'MySqlChar',
|
|
224
|
+
'SingleStoreChar',
|
|
225
|
+
])) {
|
|
226
|
+
max = column.length;
|
|
227
|
+
fixed = true;
|
|
228
|
+
}
|
|
229
|
+
return max && fixed ? arktype.type.string.exactlyLength(max) : max ? arktype.type.string.atMostLength(max) : arktype.type.string;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function getColumns(tableLike) {
|
|
233
|
+
return drizzleOrm.isTable(tableLike) ? drizzleOrm.getTableColumns(tableLike) : drizzleOrm.getViewSelectedFields(tableLike);
|
|
234
|
+
}
|
|
235
|
+
function handleColumns(columns, refinements, conditions) {
|
|
236
|
+
const columnSchemas = {};
|
|
237
|
+
for (const [key, selected] of Object.entries(columns)) {
|
|
238
|
+
if (!drizzleOrm.is(selected, drizzleOrm.Column) && !drizzleOrm.is(selected, drizzleOrm.SQL) && !drizzleOrm.is(selected, drizzleOrm.SQL.Aliased) && typeof selected === 'object') {
|
|
239
|
+
const columns = drizzleOrm.isTable(selected) || drizzleOrm.isView(selected) ? getColumns(selected) : selected;
|
|
240
|
+
columnSchemas[key] = handleColumns(columns, refinements[key] ?? {}, conditions);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const refinement = refinements[key];
|
|
244
|
+
if (refinement !== undefined
|
|
245
|
+
&& (typeof refinement !== 'function' || (typeof refinement === 'function' && refinement.expression !== undefined))) {
|
|
246
|
+
columnSchemas[key] = refinement;
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
const column = drizzleOrm.is(selected, drizzleOrm.Column) ? selected : undefined;
|
|
250
|
+
const schema = column ? columnToSchema(column) : arktype.type.unknown;
|
|
251
|
+
const refined = typeof refinement === 'function' ? refinement(schema) : schema;
|
|
252
|
+
if (conditions.never(column)) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
columnSchemas[key] = refined;
|
|
257
|
+
}
|
|
258
|
+
if (column) {
|
|
259
|
+
if (conditions.nullable(column)) {
|
|
260
|
+
columnSchemas[key] = columnSchemas[key].or(arktype.type.null);
|
|
261
|
+
}
|
|
262
|
+
if (conditions.optional(column)) {
|
|
263
|
+
columnSchemas[key] = columnSchemas[key].optional();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return arktype.type(columnSchemas);
|
|
268
|
+
}
|
|
269
|
+
const createSelectSchema = ((entity, refine) => {
|
|
270
|
+
if (isPgEnum(entity)) {
|
|
271
|
+
return arktype.type.enumerated(...entity.enumValues);
|
|
272
|
+
}
|
|
273
|
+
const columns = getColumns(entity);
|
|
274
|
+
return handleColumns(columns, refine ?? {}, {
|
|
275
|
+
never: () => false,
|
|
276
|
+
optional: () => false,
|
|
277
|
+
nullable: (column) => !column.notNull,
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
const createInsertSchema = ((entity, refine) => {
|
|
281
|
+
const columns = getColumns(entity);
|
|
282
|
+
return handleColumns(columns, refine ?? {}, {
|
|
283
|
+
never: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',
|
|
284
|
+
optional: (column) => !column.notNull || (column.notNull && column.hasDefault),
|
|
285
|
+
nullable: (column) => !column.notNull,
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
const createUpdateSchema = ((entity, refine) => {
|
|
289
|
+
const columns = getColumns(entity);
|
|
290
|
+
return handleColumns(columns, refine ?? {}, {
|
|
291
|
+
never: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',
|
|
292
|
+
optional: () => true,
|
|
293
|
+
nullable: (column) => !column.notNull,
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
exports.bufferSchema = bufferSchema;
|
|
298
|
+
exports.createInsertSchema = createInsertSchema;
|
|
299
|
+
exports.createSelectSchema = createSelectSchema;
|
|
300
|
+
exports.createUpdateSchema = createUpdateSchema;
|
|
301
|
+
exports.isColumnType = isColumnType;
|
|
302
|
+
exports.isPgEnum = isPgEnum;
|
|
303
|
+
exports.isWithEnum = isWithEnum;
|
|
304
|
+
exports.jsonSchema = jsonSchema;
|
|
305
|
+
exports.literalSchema = literalSchema;
|
|
306
|
+
//# sourceMappingURL=index.cjs.map
|
package/index.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/constants.ts","../src/utils.ts","../src/column.ts","../src/schema.ts"],"sourcesContent":[null,null,null,null],"names":["type","isTable","getTableColumns","getViewSelectedFields","is","Column","SQL","isView"],"mappings":"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"}
|
package/index.d.cts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { bufferSchema, jsonSchema, literalSchema } from "./column.cjs";
|
|
2
|
+
export * from "./column.types.cjs";
|
|
3
|
+
export * from "./schema.cjs";
|
|
4
|
+
export type { BuildSchema } from "./schema.types.internal.cjs";
|
|
5
|
+
export * from "./schema.types.internal.cjs";
|
|
6
|
+
export * from "./schema.types.cjs";
|
|
7
|
+
export * from "./utils.cjs";
|
package/index.d.mts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { bufferSchema, jsonSchema, literalSchema } from "./column.mjs";
|
|
2
|
+
export * from "./column.types.mjs";
|
|
3
|
+
export * from "./schema.mjs";
|
|
4
|
+
export type { BuildSchema } from "./schema.types.internal.mjs";
|
|
5
|
+
export * from "./schema.types.internal.mjs";
|
|
6
|
+
export * from "./schema.types.mjs";
|
|
7
|
+
export * from "./utils.mjs";
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { bufferSchema, jsonSchema, literalSchema } from './column.js';
|
|
2
|
+
export * from './column.types.js';
|
|
3
|
+
export * from './schema.js';
|
|
4
|
+
export type { BuildSchema } from './schema.types.internal.js';
|
|
5
|
+
export * from './schema.types.internal.js';
|
|
6
|
+
export * from './schema.types.js';
|
|
7
|
+
export * from './utils.js';
|
package/index.mjs
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { type } from 'arktype';
|
|
2
|
+
import { isTable, getTableColumns, getViewSelectedFields, is, Column, SQL, isView } from 'drizzle-orm';
|
|
3
|
+
|
|
4
|
+
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,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
function isColumnType(column, columnTypes) {
|
|
26
|
+
return columnTypes.includes(column.columnType);
|
|
27
|
+
}
|
|
28
|
+
function isWithEnum(column) {
|
|
29
|
+
return 'enumValues' in column && Array.isArray(column.enumValues) && column.enumValues.length > 0;
|
|
30
|
+
}
|
|
31
|
+
const isPgEnum = isWithEnum;
|
|
32
|
+
|
|
33
|
+
const literalSchema = type.string.or(type.number).or(type.boolean).or(type.null);
|
|
34
|
+
const jsonSchema = literalSchema.or(type.unknown.as().array()).or(type.object.as());
|
|
35
|
+
const bufferSchema = type.instanceOf(Buffer); // eslint-disable-line no-instanceof/no-instanceof
|
|
36
|
+
function columnToSchema(column) {
|
|
37
|
+
let schema;
|
|
38
|
+
if (isWithEnum(column)) {
|
|
39
|
+
schema = column.enumValues.length ? type.enumerated(...column.enumValues) : type.string;
|
|
40
|
+
}
|
|
41
|
+
if (!schema) {
|
|
42
|
+
// Handle specific types
|
|
43
|
+
if (isColumnType(column, ['PgGeometry', 'PgPointTuple'])) {
|
|
44
|
+
schema = type([type.number, type.number]);
|
|
45
|
+
}
|
|
46
|
+
else if (isColumnType(column, ['PgGeometryObject', 'PgPointObject'])) {
|
|
47
|
+
schema = type({
|
|
48
|
+
x: type.number,
|
|
49
|
+
y: type.number,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else if (isColumnType(column, ['PgHalfVector', 'PgVector'])) {
|
|
53
|
+
schema = column.dimensions
|
|
54
|
+
? type.number.array().exactlyLength(column.dimensions)
|
|
55
|
+
: type.number.array();
|
|
56
|
+
}
|
|
57
|
+
else if (isColumnType(column, ['PgLine'])) {
|
|
58
|
+
schema = type([type.number, type.number, type.number]);
|
|
59
|
+
}
|
|
60
|
+
else if (isColumnType(column, ['PgLineABC'])) {
|
|
61
|
+
schema = type({
|
|
62
|
+
a: type.number,
|
|
63
|
+
b: type.number,
|
|
64
|
+
c: type.number,
|
|
65
|
+
});
|
|
66
|
+
} // Handle other types
|
|
67
|
+
else if (isColumnType(column, ['PgArray'])) {
|
|
68
|
+
const arraySchema = columnToSchema(column.baseColumn).array();
|
|
69
|
+
schema = column.size ? arraySchema.exactlyLength(column.size) : arraySchema;
|
|
70
|
+
}
|
|
71
|
+
else if (column.dataType === 'array') {
|
|
72
|
+
schema = type.unknown.array();
|
|
73
|
+
}
|
|
74
|
+
else if (column.dataType === 'number') {
|
|
75
|
+
schema = numberColumnToSchema(column);
|
|
76
|
+
}
|
|
77
|
+
else if (column.dataType === 'bigint') {
|
|
78
|
+
schema = bigintColumnToSchema(column);
|
|
79
|
+
}
|
|
80
|
+
else if (column.dataType === 'boolean') {
|
|
81
|
+
schema = type.boolean;
|
|
82
|
+
}
|
|
83
|
+
else if (column.dataType === 'date') {
|
|
84
|
+
schema = type.Date;
|
|
85
|
+
}
|
|
86
|
+
else if (column.dataType === 'string') {
|
|
87
|
+
schema = stringColumnToSchema(column);
|
|
88
|
+
}
|
|
89
|
+
else if (column.dataType === 'json') {
|
|
90
|
+
schema = jsonSchema;
|
|
91
|
+
}
|
|
92
|
+
else if (column.dataType === 'custom') {
|
|
93
|
+
schema = type.unknown;
|
|
94
|
+
}
|
|
95
|
+
else if (column.dataType === 'buffer') {
|
|
96
|
+
schema = bufferSchema;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (!schema) {
|
|
100
|
+
schema = type.unknown;
|
|
101
|
+
}
|
|
102
|
+
return schema;
|
|
103
|
+
}
|
|
104
|
+
function numberColumnToSchema(column) {
|
|
105
|
+
let unsigned = column.getSQLType().includes('unsigned');
|
|
106
|
+
let min;
|
|
107
|
+
let max;
|
|
108
|
+
let integer = false;
|
|
109
|
+
if (isColumnType(column, ['MySqlTinyInt', 'SingleStoreTinyInt'])) {
|
|
110
|
+
min = unsigned ? 0 : CONSTANTS.INT8_MIN;
|
|
111
|
+
max = unsigned ? CONSTANTS.INT8_UNSIGNED_MAX : CONSTANTS.INT8_MAX;
|
|
112
|
+
integer = true;
|
|
113
|
+
}
|
|
114
|
+
else if (isColumnType(column, [
|
|
115
|
+
'PgSmallInt',
|
|
116
|
+
'PgSmallSerial',
|
|
117
|
+
'MySqlSmallInt',
|
|
118
|
+
'SingleStoreSmallInt',
|
|
119
|
+
])) {
|
|
120
|
+
min = unsigned ? 0 : CONSTANTS.INT16_MIN;
|
|
121
|
+
max = unsigned ? CONSTANTS.INT16_UNSIGNED_MAX : CONSTANTS.INT16_MAX;
|
|
122
|
+
integer = true;
|
|
123
|
+
}
|
|
124
|
+
else if (isColumnType(column, [
|
|
125
|
+
'PgReal',
|
|
126
|
+
'MySqlFloat',
|
|
127
|
+
'MySqlMediumInt',
|
|
128
|
+
'SingleStoreFloat',
|
|
129
|
+
'SingleStoreMediumInt',
|
|
130
|
+
])) {
|
|
131
|
+
min = unsigned ? 0 : CONSTANTS.INT24_MIN;
|
|
132
|
+
max = unsigned ? CONSTANTS.INT24_UNSIGNED_MAX : CONSTANTS.INT24_MAX;
|
|
133
|
+
integer = isColumnType(column, ['MySqlMediumInt', 'SingleStoreMediumInt']);
|
|
134
|
+
}
|
|
135
|
+
else if (isColumnType(column, [
|
|
136
|
+
'PgInteger',
|
|
137
|
+
'PgSerial',
|
|
138
|
+
'MySqlInt',
|
|
139
|
+
'SingleStoreInt',
|
|
140
|
+
])) {
|
|
141
|
+
min = unsigned ? 0 : CONSTANTS.INT32_MIN;
|
|
142
|
+
max = unsigned ? CONSTANTS.INT32_UNSIGNED_MAX : CONSTANTS.INT32_MAX;
|
|
143
|
+
integer = true;
|
|
144
|
+
}
|
|
145
|
+
else if (isColumnType(column, [
|
|
146
|
+
'PgDoublePrecision',
|
|
147
|
+
'MySqlReal',
|
|
148
|
+
'MySqlDouble',
|
|
149
|
+
'SingleStoreReal',
|
|
150
|
+
'SingleStoreDouble',
|
|
151
|
+
'SQLiteReal',
|
|
152
|
+
])) {
|
|
153
|
+
min = unsigned ? 0 : CONSTANTS.INT48_MIN;
|
|
154
|
+
max = unsigned ? CONSTANTS.INT48_UNSIGNED_MAX : CONSTANTS.INT48_MAX;
|
|
155
|
+
}
|
|
156
|
+
else if (isColumnType(column, [
|
|
157
|
+
'PgBigInt53',
|
|
158
|
+
'PgBigSerial53',
|
|
159
|
+
'MySqlBigInt53',
|
|
160
|
+
'MySqlSerial',
|
|
161
|
+
'SingleStoreBigInt53',
|
|
162
|
+
'SingleStoreSerial',
|
|
163
|
+
'SQLiteInteger',
|
|
164
|
+
])) {
|
|
165
|
+
unsigned = unsigned || isColumnType(column, ['MySqlSerial', 'SingleStoreSerial']);
|
|
166
|
+
min = unsigned ? 0 : Number.MIN_SAFE_INTEGER;
|
|
167
|
+
max = Number.MAX_SAFE_INTEGER;
|
|
168
|
+
integer = true;
|
|
169
|
+
}
|
|
170
|
+
else if (isColumnType(column, ['MySqlYear', 'SingleStoreYear'])) {
|
|
171
|
+
min = 1901;
|
|
172
|
+
max = 2155;
|
|
173
|
+
integer = true;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
min = Number.MIN_SAFE_INTEGER;
|
|
177
|
+
max = Number.MAX_SAFE_INTEGER;
|
|
178
|
+
}
|
|
179
|
+
return (integer ? type.keywords.number.integer : type.number).atLeast(min).atMost(max);
|
|
180
|
+
}
|
|
181
|
+
/** @internal */
|
|
182
|
+
const unsignedBigintNarrow = (v, ctx) => v < 0n ? ctx.mustBe('greater than') : v > CONSTANTS.INT64_UNSIGNED_MAX ? ctx.mustBe('less than') : true;
|
|
183
|
+
/** @internal */
|
|
184
|
+
const bigintNarrow = (v, ctx) => v < CONSTANTS.INT64_MIN ? ctx.mustBe('greater than') : v > CONSTANTS.INT64_MAX ? ctx.mustBe('less than') : true;
|
|
185
|
+
function bigintColumnToSchema(column) {
|
|
186
|
+
const unsigned = column.getSQLType().includes('unsigned');
|
|
187
|
+
return type.bigint.narrow(unsigned ? unsignedBigintNarrow : bigintNarrow);
|
|
188
|
+
}
|
|
189
|
+
function stringColumnToSchema(column) {
|
|
190
|
+
if (isColumnType(column, ['PgUUID'])) {
|
|
191
|
+
return type(/^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$/iu).describe('a RFC-4122-compliant UUID');
|
|
192
|
+
}
|
|
193
|
+
if (isColumnType(column, ['PgBinaryVector'])) {
|
|
194
|
+
return type(`/^[01]{${column.dimensions}}$/`)
|
|
195
|
+
.describe(`a string containing ones or zeros while being ${column.dimensions} characters long`);
|
|
196
|
+
}
|
|
197
|
+
let max;
|
|
198
|
+
let fixed = false;
|
|
199
|
+
if (isColumnType(column, ['PgVarchar', 'SQLiteText'])) {
|
|
200
|
+
max = column.length;
|
|
201
|
+
}
|
|
202
|
+
else if (isColumnType(column, ['MySqlVarChar', 'SingleStoreVarChar'])) {
|
|
203
|
+
max = column.length ?? CONSTANTS.INT16_UNSIGNED_MAX;
|
|
204
|
+
}
|
|
205
|
+
else if (isColumnType(column, ['MySqlText', 'SingleStoreText'])) {
|
|
206
|
+
if (column.textType === 'longtext') {
|
|
207
|
+
max = CONSTANTS.INT32_UNSIGNED_MAX;
|
|
208
|
+
}
|
|
209
|
+
else if (column.textType === 'mediumtext') {
|
|
210
|
+
max = CONSTANTS.INT24_UNSIGNED_MAX;
|
|
211
|
+
}
|
|
212
|
+
else if (column.textType === 'text') {
|
|
213
|
+
max = CONSTANTS.INT16_UNSIGNED_MAX;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
max = CONSTANTS.INT8_UNSIGNED_MAX;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (isColumnType(column, [
|
|
220
|
+
'PgChar',
|
|
221
|
+
'MySqlChar',
|
|
222
|
+
'SingleStoreChar',
|
|
223
|
+
])) {
|
|
224
|
+
max = column.length;
|
|
225
|
+
fixed = true;
|
|
226
|
+
}
|
|
227
|
+
return max && fixed ? type.string.exactlyLength(max) : max ? type.string.atMostLength(max) : type.string;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function getColumns(tableLike) {
|
|
231
|
+
return isTable(tableLike) ? getTableColumns(tableLike) : getViewSelectedFields(tableLike);
|
|
232
|
+
}
|
|
233
|
+
function handleColumns(columns, refinements, conditions) {
|
|
234
|
+
const columnSchemas = {};
|
|
235
|
+
for (const [key, selected] of Object.entries(columns)) {
|
|
236
|
+
if (!is(selected, Column) && !is(selected, SQL) && !is(selected, SQL.Aliased) && typeof selected === 'object') {
|
|
237
|
+
const columns = isTable(selected) || isView(selected) ? getColumns(selected) : selected;
|
|
238
|
+
columnSchemas[key] = handleColumns(columns, refinements[key] ?? {}, conditions);
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const refinement = refinements[key];
|
|
242
|
+
if (refinement !== undefined
|
|
243
|
+
&& (typeof refinement !== 'function' || (typeof refinement === 'function' && refinement.expression !== undefined))) {
|
|
244
|
+
columnSchemas[key] = refinement;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const column = is(selected, Column) ? selected : undefined;
|
|
248
|
+
const schema = column ? columnToSchema(column) : type.unknown;
|
|
249
|
+
const refined = typeof refinement === 'function' ? refinement(schema) : schema;
|
|
250
|
+
if (conditions.never(column)) {
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
columnSchemas[key] = refined;
|
|
255
|
+
}
|
|
256
|
+
if (column) {
|
|
257
|
+
if (conditions.nullable(column)) {
|
|
258
|
+
columnSchemas[key] = columnSchemas[key].or(type.null);
|
|
259
|
+
}
|
|
260
|
+
if (conditions.optional(column)) {
|
|
261
|
+
columnSchemas[key] = columnSchemas[key].optional();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return type(columnSchemas);
|
|
266
|
+
}
|
|
267
|
+
const createSelectSchema = ((entity, refine) => {
|
|
268
|
+
if (isPgEnum(entity)) {
|
|
269
|
+
return type.enumerated(...entity.enumValues);
|
|
270
|
+
}
|
|
271
|
+
const columns = getColumns(entity);
|
|
272
|
+
return handleColumns(columns, refine ?? {}, {
|
|
273
|
+
never: () => false,
|
|
274
|
+
optional: () => false,
|
|
275
|
+
nullable: (column) => !column.notNull,
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
const createInsertSchema = ((entity, refine) => {
|
|
279
|
+
const columns = getColumns(entity);
|
|
280
|
+
return handleColumns(columns, refine ?? {}, {
|
|
281
|
+
never: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',
|
|
282
|
+
optional: (column) => !column.notNull || (column.notNull && column.hasDefault),
|
|
283
|
+
nullable: (column) => !column.notNull,
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
const createUpdateSchema = ((entity, refine) => {
|
|
287
|
+
const columns = getColumns(entity);
|
|
288
|
+
return handleColumns(columns, refine ?? {}, {
|
|
289
|
+
never: (column) => column?.generated?.type === 'always' || column?.generatedIdentity?.type === 'always',
|
|
290
|
+
optional: () => true,
|
|
291
|
+
nullable: (column) => !column.notNull,
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
export { bufferSchema, createInsertSchema, createSelectSchema, createUpdateSchema, isColumnType, isPgEnum, isWithEnum, jsonSchema, literalSchema };
|
|
296
|
+
//# sourceMappingURL=index.mjs.map
|
package/index.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/constants.ts","../src/utils.ts","../src/column.ts","../src/schema.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "drizzle-arktype",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Generate arktype schemas from Drizzle ORM schemas",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsx scripts/build.ts",
|
|
8
|
+
"b": "pnpm build",
|
|
9
|
+
"test:types": "cd tests && tsc",
|
|
10
|
+
"pack": "(cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz",
|
|
11
|
+
"publish": "npm publish package.tgz",
|
|
12
|
+
"test": "vitest run"
|
|
13
|
+
},
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"import": {
|
|
17
|
+
"types": "./index.d.mts",
|
|
18
|
+
"default": "./index.mjs"
|
|
19
|
+
},
|
|
20
|
+
"require": {
|
|
21
|
+
"types": "./index.d.cjs",
|
|
22
|
+
"default": "./index.cjs"
|
|
23
|
+
},
|
|
24
|
+
"types": "./index.d.ts",
|
|
25
|
+
"default": "./index.mjs"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"main": "./index.cjs",
|
|
29
|
+
"module": "./index.mjs",
|
|
30
|
+
"types": "./index.d.ts",
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"provenance": true
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/drizzle-team/drizzle-orm.git"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"arktype",
|
|
40
|
+
"validate",
|
|
41
|
+
"validation",
|
|
42
|
+
"schema",
|
|
43
|
+
"drizzle",
|
|
44
|
+
"orm",
|
|
45
|
+
"pg",
|
|
46
|
+
"mysql",
|
|
47
|
+
"postgresql",
|
|
48
|
+
"postgres",
|
|
49
|
+
"sqlite",
|
|
50
|
+
"database",
|
|
51
|
+
"sql",
|
|
52
|
+
"typescript",
|
|
53
|
+
"ts"
|
|
54
|
+
],
|
|
55
|
+
"author": "Drizzle Team",
|
|
56
|
+
"license": "Apache-2.0",
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"arktype": ">=2.0.0",
|
|
59
|
+
"drizzle-orm": ">=0.36.0"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@rollup/plugin-typescript": "^11.1.0",
|
|
63
|
+
"@types/node": "^18.15.10",
|
|
64
|
+
"arktype": "^2.1.10",
|
|
65
|
+
"cpy": "^10.1.0",
|
|
66
|
+
"drizzle-orm": "link:../drizzle-orm/dist",
|
|
67
|
+
"json-rules-engine": "7.3.0",
|
|
68
|
+
"rimraf": "^5.0.0",
|
|
69
|
+
"rollup": "^3.20.7",
|
|
70
|
+
"vite-tsconfig-paths": "^4.3.2",
|
|
71
|
+
"vitest": "^1.6.0",
|
|
72
|
+
"zx": "^7.2.2"
|
|
73
|
+
}
|
|
74
|
+
}
|
package/schema.d.cts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CreateInsertSchema, CreateSelectSchema, CreateUpdateSchema } from "./schema.types.cjs";
|
|
2
|
+
export declare const createSelectSchema: CreateSelectSchema;
|
|
3
|
+
export declare const createInsertSchema: CreateInsertSchema;
|
|
4
|
+
export declare const createUpdateSchema: CreateUpdateSchema;
|
package/schema.d.mts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CreateInsertSchema, CreateSelectSchema, CreateUpdateSchema } from "./schema.types.mjs";
|
|
2
|
+
export declare const createSelectSchema: CreateSelectSchema;
|
|
3
|
+
export declare const createInsertSchema: CreateInsertSchema;
|
|
4
|
+
export declare const createUpdateSchema: CreateUpdateSchema;
|
package/schema.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CreateInsertSchema, CreateSelectSchema, CreateUpdateSchema } from './schema.types.js';
|
|
2
|
+
export declare const createSelectSchema: CreateSelectSchema;
|
|
3
|
+
export declare const createInsertSchema: CreateInsertSchema;
|
|
4
|
+
export declare const createUpdateSchema: CreateUpdateSchema;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Type } from 'arktype';
|
|
2
|
+
import type { Table, View } from 'drizzle-orm';
|
|
3
|
+
import type { PgEnum } from 'drizzle-orm/pg-core';
|
|
4
|
+
import type { BuildRefine, BuildSchema, NoUnknownKeys } from "./schema.types.internal.cjs";
|
|
5
|
+
export interface CreateSelectSchema {
|
|
6
|
+
<TTable extends Table>(table: TTable): BuildSchema<'select', TTable['_']['columns'], undefined>;
|
|
7
|
+
<TTable extends Table, TRefine extends BuildRefine<TTable['_']['columns']>>(table: TTable, refine?: NoUnknownKeys<TRefine, TTable['$inferSelect']>): BuildSchema<'select', TTable['_']['columns'], TRefine>;
|
|
8
|
+
<TView extends View>(view: TView): BuildSchema<'select', TView['_']['selectedFields'], undefined>;
|
|
9
|
+
<TView extends View, TRefine extends BuildRefine<TView['_']['selectedFields']>>(view: TView, refine: NoUnknownKeys<TRefine, TView['$inferSelect']>): BuildSchema<'select', TView['_']['selectedFields'], TRefine>;
|
|
10
|
+
<TEnum extends PgEnum<any>>(enum_: TEnum): Type<TEnum['enumValues'][number], {}>;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateInsertSchema {
|
|
13
|
+
<TTable extends Table>(table: TTable): BuildSchema<'insert', TTable['_']['columns'], undefined>;
|
|
14
|
+
<TTable extends Table, TRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>>(table: TTable, refine?: NoUnknownKeys<TRefine, TTable['$inferInsert']>): BuildSchema<'insert', TTable['_']['columns'], TRefine>;
|
|
15
|
+
}
|
|
16
|
+
export interface CreateUpdateSchema {
|
|
17
|
+
<TTable extends Table>(table: TTable): BuildSchema<'update', TTable['_']['columns'], undefined>;
|
|
18
|
+
<TTable extends Table, TRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>>(table: TTable, refine?: TRefine): BuildSchema<'update', TTable['_']['columns'], TRefine>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Type } from 'arktype';
|
|
2
|
+
import type { Table, View } from 'drizzle-orm';
|
|
3
|
+
import type { PgEnum } from 'drizzle-orm/pg-core';
|
|
4
|
+
import type { BuildRefine, BuildSchema, NoUnknownKeys } from "./schema.types.internal.mjs";
|
|
5
|
+
export interface CreateSelectSchema {
|
|
6
|
+
<TTable extends Table>(table: TTable): BuildSchema<'select', TTable['_']['columns'], undefined>;
|
|
7
|
+
<TTable extends Table, TRefine extends BuildRefine<TTable['_']['columns']>>(table: TTable, refine?: NoUnknownKeys<TRefine, TTable['$inferSelect']>): BuildSchema<'select', TTable['_']['columns'], TRefine>;
|
|
8
|
+
<TView extends View>(view: TView): BuildSchema<'select', TView['_']['selectedFields'], undefined>;
|
|
9
|
+
<TView extends View, TRefine extends BuildRefine<TView['_']['selectedFields']>>(view: TView, refine: NoUnknownKeys<TRefine, TView['$inferSelect']>): BuildSchema<'select', TView['_']['selectedFields'], TRefine>;
|
|
10
|
+
<TEnum extends PgEnum<any>>(enum_: TEnum): Type<TEnum['enumValues'][number], {}>;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateInsertSchema {
|
|
13
|
+
<TTable extends Table>(table: TTable): BuildSchema<'insert', TTable['_']['columns'], undefined>;
|
|
14
|
+
<TTable extends Table, TRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>>(table: TTable, refine?: NoUnknownKeys<TRefine, TTable['$inferInsert']>): BuildSchema<'insert', TTable['_']['columns'], TRefine>;
|
|
15
|
+
}
|
|
16
|
+
export interface CreateUpdateSchema {
|
|
17
|
+
<TTable extends Table>(table: TTable): BuildSchema<'update', TTable['_']['columns'], undefined>;
|
|
18
|
+
<TTable extends Table, TRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>>(table: TTable, refine?: TRefine): BuildSchema<'update', TTable['_']['columns'], TRefine>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Type } from 'arktype';
|
|
2
|
+
import type { Table, View } from 'drizzle-orm';
|
|
3
|
+
import type { PgEnum } from 'drizzle-orm/pg-core';
|
|
4
|
+
import type { BuildRefine, BuildSchema, NoUnknownKeys } from './schema.types.internal.js';
|
|
5
|
+
export interface CreateSelectSchema {
|
|
6
|
+
<TTable extends Table>(table: TTable): BuildSchema<'select', TTable['_']['columns'], undefined>;
|
|
7
|
+
<TTable extends Table, TRefine extends BuildRefine<TTable['_']['columns']>>(table: TTable, refine?: NoUnknownKeys<TRefine, TTable['$inferSelect']>): BuildSchema<'select', TTable['_']['columns'], TRefine>;
|
|
8
|
+
<TView extends View>(view: TView): BuildSchema<'select', TView['_']['selectedFields'], undefined>;
|
|
9
|
+
<TView extends View, TRefine extends BuildRefine<TView['_']['selectedFields']>>(view: TView, refine: NoUnknownKeys<TRefine, TView['$inferSelect']>): BuildSchema<'select', TView['_']['selectedFields'], TRefine>;
|
|
10
|
+
<TEnum extends PgEnum<any>>(enum_: TEnum): Type<TEnum['enumValues'][number], {}>;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateInsertSchema {
|
|
13
|
+
<TTable extends Table>(table: TTable): BuildSchema<'insert', TTable['_']['columns'], undefined>;
|
|
14
|
+
<TTable extends Table, TRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>>(table: TTable, refine?: NoUnknownKeys<TRefine, TTable['$inferInsert']>): BuildSchema<'insert', TTable['_']['columns'], TRefine>;
|
|
15
|
+
}
|
|
16
|
+
export interface CreateUpdateSchema {
|
|
17
|
+
<TTable extends Table>(table: TTable): BuildSchema<'update', TTable['_']['columns'], undefined>;
|
|
18
|
+
<TTable extends Table, TRefine extends BuildRefine<Pick<TTable['_']['columns'], keyof TTable['$inferInsert']>>>(table: TTable, refine?: TRefine): BuildSchema<'update', TTable['_']['columns'], TRefine>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Type, type } from 'arktype';
|
|
2
|
+
import type { Assume, Column, DrizzleTypeError, SelectedFieldsFlat, Simplify, Table, View } from 'drizzle-orm';
|
|
3
|
+
import type { ArktypeNullable, ArktypeOptional, GetArktypeType, GetEnumValuesFromColumn, HandleColumn } from "./column.types.cjs";
|
|
4
|
+
import type { GetSelection, RemoveNever } from "./utils.cjs";
|
|
5
|
+
export interface Conditions {
|
|
6
|
+
never: (column?: Column) => boolean;
|
|
7
|
+
optional: (column: Column) => boolean;
|
|
8
|
+
nullable: (column: Column) => boolean;
|
|
9
|
+
}
|
|
10
|
+
type GenericSchema = type.cast<unknown> | [type.cast<unknown>, '?'];
|
|
11
|
+
export type BuildRefineColumns<TColumns extends Record<string, any>> = Simplify<RemoveNever<{
|
|
12
|
+
[K in keyof TColumns]: TColumns[K] extends infer TColumn extends Column ? GetArktypeType<TColumn['_']['data'], TColumn['_']['columnType'], GetEnumValuesFromColumn<TColumn>> extends infer TSchema extends GenericSchema ? TSchema : Type<any, {}> : TColumns[K] extends infer TObject extends SelectedFieldsFlat<Column> | Table | View ? BuildRefineColumns<GetSelection<TObject>> : TColumns[K];
|
|
13
|
+
}>>;
|
|
14
|
+
export type BuildRefine<TColumns extends Record<string, any>> = BuildRefineColumns<TColumns> extends infer TBuildColumns ? {
|
|
15
|
+
[K in keyof TBuildColumns]?: TBuildColumns[K] extends GenericSchema ? ((schema: TBuildColumns[K]) => GenericSchema) | GenericSchema : TBuildColumns[K] extends Record<string, any> ? Simplify<BuildRefine<TBuildColumns[K]>> : never;
|
|
16
|
+
} : never;
|
|
17
|
+
type HandleRefinement<TType extends 'select' | 'insert' | 'update', TRefinement extends GenericSchema | ((schema: GenericSchema) => GenericSchema), TColumn extends Column> = TRefinement extends (schema: any) => GenericSchema ? (TColumn['_']['notNull'] extends true ? ReturnType<TRefinement> : ArktypeNullable<ReturnType<TRefinement>>) extends infer TSchema ? TType extends 'update' ? ArktypeOptional<TSchema> : TSchema : Type<any, {}> : TRefinement;
|
|
18
|
+
type IsRefinementDefined<TRefinements, TKey extends string> = TKey extends keyof TRefinements ? TRefinements[TKey] extends GenericSchema | ((schema: any) => any) ? true : false : false;
|
|
19
|
+
export type BuildSchema<TType extends 'select' | 'insert' | 'update', TColumns extends Record<string, any>, TRefinements extends Record<string, any> | undefined> = type.instantiate<Simplify<RemoveNever<{
|
|
20
|
+
readonly [K in keyof TColumns]: TColumns[K] extends infer TColumn extends Column ? TRefinements extends object ? IsRefinementDefined<TRefinements, Assume<K, string>> extends true ? HandleRefinement<TType, TRefinements[Assume<K, keyof TRefinements>], TColumn> : HandleColumn<TType, TColumn> : HandleColumn<TType, TColumn> : TColumns[K] extends infer TObject extends SelectedFieldsFlat<Column> | Table | View ? BuildSchema<TType, GetSelection<TObject>, TRefinements extends object ? TRefinements[Assume<K, keyof TRefinements>] extends infer TNestedRefinements extends object ? TNestedRefinements : undefined : undefined> : any;
|
|
21
|
+
}>>>;
|
|
22
|
+
export type NoUnknownKeys<TRefinement extends Record<string, any>, TCompare extends Record<string, any>> = {
|
|
23
|
+
[K in keyof TRefinement]: K extends keyof TCompare ? TRefinement[K] extends Record<string, GenericSchema> ? NoUnknownKeys<TRefinement[K], TCompare[K]> : TRefinement[K] : DrizzleTypeError<`Found unknown key in refinement: "${K & string}"`>;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Type, type } from 'arktype';
|
|
2
|
+
import type { Assume, Column, DrizzleTypeError, SelectedFieldsFlat, Simplify, Table, View } from 'drizzle-orm';
|
|
3
|
+
import type { ArktypeNullable, ArktypeOptional, GetArktypeType, GetEnumValuesFromColumn, HandleColumn } from "./column.types.mjs";
|
|
4
|
+
import type { GetSelection, RemoveNever } from "./utils.mjs";
|
|
5
|
+
export interface Conditions {
|
|
6
|
+
never: (column?: Column) => boolean;
|
|
7
|
+
optional: (column: Column) => boolean;
|
|
8
|
+
nullable: (column: Column) => boolean;
|
|
9
|
+
}
|
|
10
|
+
type GenericSchema = type.cast<unknown> | [type.cast<unknown>, '?'];
|
|
11
|
+
export type BuildRefineColumns<TColumns extends Record<string, any>> = Simplify<RemoveNever<{
|
|
12
|
+
[K in keyof TColumns]: TColumns[K] extends infer TColumn extends Column ? GetArktypeType<TColumn['_']['data'], TColumn['_']['columnType'], GetEnumValuesFromColumn<TColumn>> extends infer TSchema extends GenericSchema ? TSchema : Type<any, {}> : TColumns[K] extends infer TObject extends SelectedFieldsFlat<Column> | Table | View ? BuildRefineColumns<GetSelection<TObject>> : TColumns[K];
|
|
13
|
+
}>>;
|
|
14
|
+
export type BuildRefine<TColumns extends Record<string, any>> = BuildRefineColumns<TColumns> extends infer TBuildColumns ? {
|
|
15
|
+
[K in keyof TBuildColumns]?: TBuildColumns[K] extends GenericSchema ? ((schema: TBuildColumns[K]) => GenericSchema) | GenericSchema : TBuildColumns[K] extends Record<string, any> ? Simplify<BuildRefine<TBuildColumns[K]>> : never;
|
|
16
|
+
} : never;
|
|
17
|
+
type HandleRefinement<TType extends 'select' | 'insert' | 'update', TRefinement extends GenericSchema | ((schema: GenericSchema) => GenericSchema), TColumn extends Column> = TRefinement extends (schema: any) => GenericSchema ? (TColumn['_']['notNull'] extends true ? ReturnType<TRefinement> : ArktypeNullable<ReturnType<TRefinement>>) extends infer TSchema ? TType extends 'update' ? ArktypeOptional<TSchema> : TSchema : Type<any, {}> : TRefinement;
|
|
18
|
+
type IsRefinementDefined<TRefinements, TKey extends string> = TKey extends keyof TRefinements ? TRefinements[TKey] extends GenericSchema | ((schema: any) => any) ? true : false : false;
|
|
19
|
+
export type BuildSchema<TType extends 'select' | 'insert' | 'update', TColumns extends Record<string, any>, TRefinements extends Record<string, any> | undefined> = type.instantiate<Simplify<RemoveNever<{
|
|
20
|
+
readonly [K in keyof TColumns]: TColumns[K] extends infer TColumn extends Column ? TRefinements extends object ? IsRefinementDefined<TRefinements, Assume<K, string>> extends true ? HandleRefinement<TType, TRefinements[Assume<K, keyof TRefinements>], TColumn> : HandleColumn<TType, TColumn> : HandleColumn<TType, TColumn> : TColumns[K] extends infer TObject extends SelectedFieldsFlat<Column> | Table | View ? BuildSchema<TType, GetSelection<TObject>, TRefinements extends object ? TRefinements[Assume<K, keyof TRefinements>] extends infer TNestedRefinements extends object ? TNestedRefinements : undefined : undefined> : any;
|
|
21
|
+
}>>>;
|
|
22
|
+
export type NoUnknownKeys<TRefinement extends Record<string, any>, TCompare extends Record<string, any>> = {
|
|
23
|
+
[K in keyof TRefinement]: K extends keyof TCompare ? TRefinement[K] extends Record<string, GenericSchema> ? NoUnknownKeys<TRefinement[K], TCompare[K]> : TRefinement[K] : DrizzleTypeError<`Found unknown key in refinement: "${K & string}"`>;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Type, type } from 'arktype';
|
|
2
|
+
import type { Assume, Column, DrizzleTypeError, SelectedFieldsFlat, Simplify, Table, View } from 'drizzle-orm';
|
|
3
|
+
import type { ArktypeNullable, ArktypeOptional, GetArktypeType, GetEnumValuesFromColumn, HandleColumn } from './column.types.js';
|
|
4
|
+
import type { GetSelection, RemoveNever } from './utils.js';
|
|
5
|
+
export interface Conditions {
|
|
6
|
+
never: (column?: Column) => boolean;
|
|
7
|
+
optional: (column: Column) => boolean;
|
|
8
|
+
nullable: (column: Column) => boolean;
|
|
9
|
+
}
|
|
10
|
+
type GenericSchema = type.cast<unknown> | [type.cast<unknown>, '?'];
|
|
11
|
+
export type BuildRefineColumns<TColumns extends Record<string, any>> = Simplify<RemoveNever<{
|
|
12
|
+
[K in keyof TColumns]: TColumns[K] extends infer TColumn extends Column ? GetArktypeType<TColumn['_']['data'], TColumn['_']['columnType'], GetEnumValuesFromColumn<TColumn>> extends infer TSchema extends GenericSchema ? TSchema : Type<any, {}> : TColumns[K] extends infer TObject extends SelectedFieldsFlat<Column> | Table | View ? BuildRefineColumns<GetSelection<TObject>> : TColumns[K];
|
|
13
|
+
}>>;
|
|
14
|
+
export type BuildRefine<TColumns extends Record<string, any>> = BuildRefineColumns<TColumns> extends infer TBuildColumns ? {
|
|
15
|
+
[K in keyof TBuildColumns]?: TBuildColumns[K] extends GenericSchema ? ((schema: TBuildColumns[K]) => GenericSchema) | GenericSchema : TBuildColumns[K] extends Record<string, any> ? Simplify<BuildRefine<TBuildColumns[K]>> : never;
|
|
16
|
+
} : never;
|
|
17
|
+
type HandleRefinement<TType extends 'select' | 'insert' | 'update', TRefinement extends GenericSchema | ((schema: GenericSchema) => GenericSchema), TColumn extends Column> = TRefinement extends (schema: any) => GenericSchema ? (TColumn['_']['notNull'] extends true ? ReturnType<TRefinement> : ArktypeNullable<ReturnType<TRefinement>>) extends infer TSchema ? TType extends 'update' ? ArktypeOptional<TSchema> : TSchema : Type<any, {}> : TRefinement;
|
|
18
|
+
type IsRefinementDefined<TRefinements, TKey extends string> = TKey extends keyof TRefinements ? TRefinements[TKey] extends GenericSchema | ((schema: any) => any) ? true : false : false;
|
|
19
|
+
export type BuildSchema<TType extends 'select' | 'insert' | 'update', TColumns extends Record<string, any>, TRefinements extends Record<string, any> | undefined> = type.instantiate<Simplify<RemoveNever<{
|
|
20
|
+
readonly [K in keyof TColumns]: TColumns[K] extends infer TColumn extends Column ? TRefinements extends object ? IsRefinementDefined<TRefinements, Assume<K, string>> extends true ? HandleRefinement<TType, TRefinements[Assume<K, keyof TRefinements>], TColumn> : HandleColumn<TType, TColumn> : HandleColumn<TType, TColumn> : TColumns[K] extends infer TObject extends SelectedFieldsFlat<Column> | Table | View ? BuildSchema<TType, GetSelection<TObject>, TRefinements extends object ? TRefinements[Assume<K, keyof TRefinements>] extends infer TNestedRefinements extends object ? TNestedRefinements : undefined : undefined> : any;
|
|
21
|
+
}>>>;
|
|
22
|
+
export type NoUnknownKeys<TRefinement extends Record<string, any>, TCompare extends Record<string, any>> = {
|
|
23
|
+
[K in keyof TRefinement]: K extends keyof TCompare ? TRefinement[K] extends Record<string, GenericSchema> ? NoUnknownKeys<TRefinement[K], TCompare[K]> : TRefinement[K] : DrizzleTypeError<`Found unknown key in refinement: "${K & string}"`>;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
package/utils.d.cts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { type } from 'arktype';
|
|
2
|
+
import type { Column, SelectedFieldsFlat, Table, View } from 'drizzle-orm';
|
|
3
|
+
import type { PgEnum } from 'drizzle-orm/pg-core';
|
|
4
|
+
import type { literalSchema } from "./column.cjs";
|
|
5
|
+
export declare function isColumnType<T extends Column>(column: Column, columnTypes: string[]): column is T;
|
|
6
|
+
export declare function isWithEnum(column: Column): column is typeof column & {
|
|
7
|
+
enumValues: [string, ...string[]];
|
|
8
|
+
};
|
|
9
|
+
export declare const isPgEnum: (entity: any) => entity is PgEnum<[string, ...string[]]>;
|
|
10
|
+
type Literal = type.infer<typeof literalSchema>;
|
|
11
|
+
export type Json = Literal | Record<string, any> | any[];
|
|
12
|
+
export type IsEnumDefined<TEnum extends [string, ...string[]] | undefined> = [string, ...string[]] extends TEnum ? false : undefined extends TEnum ? false : true;
|
|
13
|
+
export type IsNever<T> = [T] extends [never] ? true : false;
|
|
14
|
+
export type ColumnIsGeneratedAlwaysAs<TColumn extends Column> = TColumn['_']['identity'] extends 'always' ? true : TColumn['_']['generated'] extends undefined ? false : TColumn['_']['generated'] extends infer TGenerated extends {
|
|
15
|
+
type: string;
|
|
16
|
+
} ? TGenerated['type'] extends 'byDefault' ? false : true : true;
|
|
17
|
+
export type RemoveNever<T> = {
|
|
18
|
+
[K in keyof T as T[K] extends never ? never : K]: T[K];
|
|
19
|
+
};
|
|
20
|
+
export type GetSelection<T extends SelectedFieldsFlat<Column> | Table | View> = T extends Table ? T['_']['columns'] : T extends View ? T['_']['selectedFields'] : T;
|
|
21
|
+
export type IsUnknown<T> = unknown extends T ? [T] extends [null] ? false : true : false;
|
|
22
|
+
export {};
|
package/utils.d.mts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { type } from 'arktype';
|
|
2
|
+
import type { Column, SelectedFieldsFlat, Table, View } from 'drizzle-orm';
|
|
3
|
+
import type { PgEnum } from 'drizzle-orm/pg-core';
|
|
4
|
+
import type { literalSchema } from "./column.mjs";
|
|
5
|
+
export declare function isColumnType<T extends Column>(column: Column, columnTypes: string[]): column is T;
|
|
6
|
+
export declare function isWithEnum(column: Column): column is typeof column & {
|
|
7
|
+
enumValues: [string, ...string[]];
|
|
8
|
+
};
|
|
9
|
+
export declare const isPgEnum: (entity: any) => entity is PgEnum<[string, ...string[]]>;
|
|
10
|
+
type Literal = type.infer<typeof literalSchema>;
|
|
11
|
+
export type Json = Literal | Record<string, any> | any[];
|
|
12
|
+
export type IsEnumDefined<TEnum extends [string, ...string[]] | undefined> = [string, ...string[]] extends TEnum ? false : undefined extends TEnum ? false : true;
|
|
13
|
+
export type IsNever<T> = [T] extends [never] ? true : false;
|
|
14
|
+
export type ColumnIsGeneratedAlwaysAs<TColumn extends Column> = TColumn['_']['identity'] extends 'always' ? true : TColumn['_']['generated'] extends undefined ? false : TColumn['_']['generated'] extends infer TGenerated extends {
|
|
15
|
+
type: string;
|
|
16
|
+
} ? TGenerated['type'] extends 'byDefault' ? false : true : true;
|
|
17
|
+
export type RemoveNever<T> = {
|
|
18
|
+
[K in keyof T as T[K] extends never ? never : K]: T[K];
|
|
19
|
+
};
|
|
20
|
+
export type GetSelection<T extends SelectedFieldsFlat<Column> | Table | View> = T extends Table ? T['_']['columns'] : T extends View ? T['_']['selectedFields'] : T;
|
|
21
|
+
export type IsUnknown<T> = unknown extends T ? [T] extends [null] ? false : true : false;
|
|
22
|
+
export {};
|
package/utils.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { type } from 'arktype';
|
|
2
|
+
import type { Column, SelectedFieldsFlat, Table, View } from 'drizzle-orm';
|
|
3
|
+
import type { PgEnum } from 'drizzle-orm/pg-core';
|
|
4
|
+
import type { literalSchema } from './column.js';
|
|
5
|
+
export declare function isColumnType<T extends Column>(column: Column, columnTypes: string[]): column is T;
|
|
6
|
+
export declare function isWithEnum(column: Column): column is typeof column & {
|
|
7
|
+
enumValues: [string, ...string[]];
|
|
8
|
+
};
|
|
9
|
+
export declare const isPgEnum: (entity: any) => entity is PgEnum<[string, ...string[]]>;
|
|
10
|
+
type Literal = type.infer<typeof literalSchema>;
|
|
11
|
+
export type Json = Literal | Record<string, any> | any[];
|
|
12
|
+
export type IsEnumDefined<TEnum extends [string, ...string[]] | undefined> = [string, ...string[]] extends TEnum ? false : undefined extends TEnum ? false : true;
|
|
13
|
+
export type IsNever<T> = [T] extends [never] ? true : false;
|
|
14
|
+
export type ColumnIsGeneratedAlwaysAs<TColumn extends Column> = TColumn['_']['identity'] extends 'always' ? true : TColumn['_']['generated'] extends undefined ? false : TColumn['_']['generated'] extends infer TGenerated extends {
|
|
15
|
+
type: string;
|
|
16
|
+
} ? TGenerated['type'] extends 'byDefault' ? false : true : true;
|
|
17
|
+
export type RemoveNever<T> = {
|
|
18
|
+
[K in keyof T as T[K] extends never ? never : K]: T[K];
|
|
19
|
+
};
|
|
20
|
+
export type GetSelection<T extends SelectedFieldsFlat<Column> | Table | View> = T extends Table ? T['_']['columns'] : T extends View ? T['_']['selectedFields'] : T;
|
|
21
|
+
export type IsUnknown<T> = unknown extends T ? [T] extends [null] ? false : true : false;
|
|
22
|
+
export {};
|