@simplysm/orm-common 13.0.69 → 13.0.71
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 +54 -1447
- package/dist/create-db-context.d.ts +10 -10
- package/dist/create-db-context.js +9 -9
- package/dist/create-db-context.js.map +1 -1
- package/dist/ddl/column-ddl.d.ts +4 -4
- package/dist/ddl/initialize.d.ts +17 -17
- package/dist/ddl/initialize.js +2 -2
- package/dist/ddl/initialize.js.map +1 -1
- package/dist/ddl/relation-ddl.d.ts +6 -6
- package/dist/ddl/schema-ddl.d.ts +4 -4
- package/dist/ddl/table-ddl.d.ts +24 -24
- package/dist/ddl/table-ddl.js +4 -4
- package/dist/ddl/table-ddl.js.map +1 -1
- package/dist/errors/db-transaction-error.d.ts +15 -15
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/exec/executable.d.ts +23 -23
- package/dist/exec/executable.js +3 -3
- package/dist/exec/executable.js.map +1 -1
- package/dist/exec/queryable.d.ts +160 -160
- package/dist/exec/queryable.js +119 -119
- package/dist/exec/queryable.js.map +1 -1
- package/dist/exec/search-parser.d.ts +37 -37
- package/dist/exec/search-parser.d.ts.map +1 -1
- package/dist/expr/expr-unit.d.ts +4 -4
- package/dist/expr/expr.d.ts +257 -257
- package/dist/expr/expr.js +265 -265
- package/dist/expr/expr.js.map +1 -1
- package/dist/query-builder/base/expr-renderer-base.d.ts +9 -9
- package/dist/query-builder/base/expr-renderer-base.js +2 -2
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
- package/dist/query-builder/base/query-builder-base.d.ts +26 -26
- package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.js +22 -22
- package/dist/query-builder/base/query-builder-base.js.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js +18 -18
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
- package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.js +11 -11
- package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js +17 -17
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.d.ts +8 -8
- package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.js +5 -5
- package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js +17 -17
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +5 -5
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js +8 -8
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
- package/dist/query-builder/query-builder.d.ts +1 -1
- package/dist/schema/factory/column-builder.d.ts +79 -79
- package/dist/schema/factory/column-builder.js +42 -42
- package/dist/schema/factory/index-builder.d.ts +39 -39
- package/dist/schema/factory/index-builder.js +26 -26
- package/dist/schema/factory/relation-builder.d.ts +99 -99
- package/dist/schema/factory/relation-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.js +38 -38
- package/dist/schema/procedure-builder.d.ts +49 -49
- package/dist/schema/procedure-builder.d.ts.map +1 -1
- package/dist/schema/procedure-builder.js +33 -33
- package/dist/schema/table-builder.d.ts +59 -59
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +43 -43
- package/dist/schema/view-builder.d.ts +49 -49
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +32 -32
- package/dist/types/column.d.ts +22 -22
- package/dist/types/column.js +1 -1
- package/dist/types/column.js.map +1 -1
- package/dist/types/db.d.ts +40 -40
- package/dist/types/expr.d.ts +59 -59
- package/dist/types/expr.d.ts.map +1 -1
- package/dist/types/query-def.d.ts +44 -44
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/utils/result-parser.d.ts +11 -11
- package/dist/utils/result-parser.js +3 -3
- package/dist/utils/result-parser.js.map +1 -1
- package/package.json +5 -5
- package/src/create-db-context.ts +20 -20
- package/src/ddl/column-ddl.ts +4 -4
- package/src/ddl/initialize.ts +259 -259
- package/src/ddl/relation-ddl.ts +89 -89
- package/src/ddl/schema-ddl.ts +4 -4
- package/src/ddl/table-ddl.ts +189 -189
- package/src/errors/db-transaction-error.ts +13 -13
- package/src/exec/executable.ts +25 -25
- package/src/exec/queryable.ts +2033 -2033
- package/src/exec/search-parser.ts +57 -57
- package/src/expr/expr-unit.ts +4 -4
- package/src/expr/expr.ts +2140 -2140
- package/src/query-builder/base/expr-renderer-base.ts +237 -237
- package/src/query-builder/base/query-builder-base.ts +213 -213
- package/src/query-builder/mssql/mssql-expr-renderer.ts +607 -607
- package/src/query-builder/mssql/mssql-query-builder.ts +650 -650
- package/src/query-builder/mysql/mysql-expr-renderer.ts +613 -613
- package/src/query-builder/mysql/mysql-query-builder.ts +759 -759
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +611 -611
- package/src/query-builder/postgresql/postgresql-query-builder.ts +686 -686
- package/src/query-builder/query-builder.ts +19 -19
- package/src/schema/factory/column-builder.ts +423 -423
- package/src/schema/factory/index-builder.ts +164 -164
- package/src/schema/factory/relation-builder.ts +453 -453
- package/src/schema/procedure-builder.ts +232 -232
- package/src/schema/table-builder.ts +319 -319
- package/src/schema/view-builder.ts +221 -221
- package/src/types/column.ts +188 -188
- package/src/types/db.ts +208 -208
- package/src/types/expr.ts +697 -697
- package/src/types/query-def.ts +513 -513
- package/src/utils/result-parser.ts +458 -458
- package/tests/db-context/create-db-context.spec.ts +224 -0
- package/tests/db-context/define-db-context.spec.ts +68 -0
- package/tests/ddl/basic.expected.ts +341 -0
- package/tests/ddl/basic.spec.ts +714 -0
- package/tests/ddl/column-builder.expected.ts +310 -0
- package/tests/ddl/column-builder.spec.ts +637 -0
- package/tests/ddl/index-builder.expected.ts +38 -0
- package/tests/ddl/index-builder.spec.ts +202 -0
- package/tests/ddl/procedure-builder.expected.ts +52 -0
- package/tests/ddl/procedure-builder.spec.ts +234 -0
- package/tests/ddl/relation-builder.expected.ts +36 -0
- package/tests/ddl/relation-builder.spec.ts +372 -0
- package/tests/ddl/table-builder.expected.ts +113 -0
- package/tests/ddl/table-builder.spec.ts +433 -0
- package/tests/ddl/view-builder.expected.ts +38 -0
- package/tests/ddl/view-builder.spec.ts +176 -0
- package/tests/dml/delete.expected.ts +96 -0
- package/tests/dml/delete.spec.ts +160 -0
- package/tests/dml/insert.expected.ts +192 -0
- package/tests/dml/insert.spec.ts +288 -0
- package/tests/dml/update.expected.ts +176 -0
- package/tests/dml/update.spec.ts +318 -0
- package/tests/dml/upsert.expected.ts +215 -0
- package/tests/dml/upsert.spec.ts +242 -0
- package/tests/errors/queryable-errors.spec.ts +177 -0
- package/tests/escape.spec.ts +100 -0
- package/tests/examples/pivot.expected.ts +211 -0
- package/tests/examples/pivot.spec.ts +533 -0
- package/tests/examples/sampling.expected.ts +69 -0
- package/tests/examples/sampling.spec.ts +105 -0
- package/tests/examples/unpivot.expected.ts +120 -0
- package/tests/examples/unpivot.spec.ts +226 -0
- package/tests/exec/search-parser.spec.ts +283 -0
- package/tests/executable/basic.expected.ts +18 -0
- package/tests/executable/basic.spec.ts +54 -0
- package/tests/expr/comparison.expected.ts +282 -0
- package/tests/expr/comparison.spec.ts +400 -0
- package/tests/expr/conditional.expected.ts +134 -0
- package/tests/expr/conditional.spec.ts +276 -0
- package/tests/expr/date.expected.ts +332 -0
- package/tests/expr/date.spec.ts +526 -0
- package/tests/expr/math.expected.ts +62 -0
- package/tests/expr/math.spec.ts +106 -0
- package/tests/expr/string.expected.ts +218 -0
- package/tests/expr/string.spec.ts +356 -0
- package/tests/expr/utility.expected.ts +147 -0
- package/tests/expr/utility.spec.ts +182 -0
- package/tests/select/basic.expected.ts +322 -0
- package/tests/select/basic.spec.ts +502 -0
- package/tests/select/filter.expected.ts +357 -0
- package/tests/select/filter.spec.ts +1068 -0
- package/tests/select/group.expected.ts +169 -0
- package/tests/select/group.spec.ts +244 -0
- package/tests/select/join.expected.ts +582 -0
- package/tests/select/join.spec.ts +805 -0
- package/tests/select/order.expected.ts +150 -0
- package/tests/select/order.spec.ts +189 -0
- package/tests/select/recursive-cte.expected.ts +244 -0
- package/tests/select/recursive-cte.spec.ts +514 -0
- package/tests/select/result-meta.spec.ts +270 -0
- package/tests/select/subquery.expected.ts +363 -0
- package/tests/select/subquery.spec.ts +537 -0
- package/tests/select/view.expected.ts +155 -0
- package/tests/select/view.spec.ts +235 -0
- package/tests/select/window.expected.ts +345 -0
- package/tests/select/window.spec.ts +618 -0
- package/tests/setup/MockExecutor.ts +18 -0
- package/tests/setup/TestDbContext.ts +59 -0
- package/tests/setup/models/Company.ts +13 -0
- package/tests/setup/models/Employee.ts +10 -0
- package/tests/setup/models/MonthlySales.ts +11 -0
- package/tests/setup/models/Post.ts +16 -0
- package/tests/setup/models/Sales.ts +10 -0
- package/tests/setup/models/User.ts +19 -0
- package/tests/setup/procedure/GetAllUsers.ts +9 -0
- package/tests/setup/procedure/GetUserById.ts +12 -0
- package/tests/setup/test-utils.ts +72 -0
- package/tests/setup/views/ActiveUsers.ts +8 -0
- package/tests/setup/views/UserSummary.ts +11 -0
- package/tests/types/nullable-queryable-record.spec.ts +145 -0
- package/tests/utils/result-parser-perf.spec.ts +210 -0
- package/tests/utils/result-parser.spec.ts +701 -0
- package/docs/expressions.md +0 -172
- package/docs/queries.md +0 -444
- package/docs/schema.md +0 -245
package/src/types/column.ts
CHANGED
|
@@ -1,188 +1,188 @@
|
|
|
1
|
-
import { DateOnly, DateTime, Time, Uuid, type Bytes } from "@simplysm/core-common";
|
|
2
|
-
|
|
3
|
-
// ============================================
|
|
4
|
-
// DataType (SQL
|
|
5
|
-
// ============================================
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* SQL
|
|
9
|
-
*
|
|
10
|
-
* DBMS
|
|
11
|
-
* - `int`: INT (4 bytes)
|
|
12
|
-
* - `bigint`: BIGINT (8 bytes)
|
|
13
|
-
* - `float`: FLOAT/REAL (4 bytes)
|
|
14
|
-
* - `double`: DOUBLE/FLOAT (8 bytes)
|
|
15
|
-
* - `decimal`: DECIMAL(precision, scale)
|
|
16
|
-
* - `varchar`: VARCHAR(length)
|
|
17
|
-
* - `char`: CHAR(length)
|
|
18
|
-
* - `text`: TEXT/LONGTEXT
|
|
19
|
-
* - `binary`: LONGBLOB/VARBINARY(MAX)/BYTEA
|
|
20
|
-
* - `boolean`: TINYINT(1)/BIT/BOOLEAN
|
|
21
|
-
* - `datetime`: DATETIME
|
|
22
|
-
* - `date`: DATE
|
|
23
|
-
* - `time`: TIME
|
|
24
|
-
* - `uuid`: BINARY(16)/UNIQUEIDENTIFIER/UUID
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```typescript
|
|
28
|
-
* const intType: DataType = { type: "int" };
|
|
29
|
-
* const decimalType: DataType = { type: "decimal", precision: 10, scale: 2 };
|
|
30
|
-
* const varcharType: DataType = { type: "varchar", length: 100 };
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
export type DataType =
|
|
34
|
-
| { type: "int" }
|
|
35
|
-
| { type: "bigint" }
|
|
36
|
-
| { type: "float" }
|
|
37
|
-
| { type: "double" }
|
|
38
|
-
| { type: "decimal"; precision: number; scale?: number }
|
|
39
|
-
| { type: "varchar"; length: number }
|
|
40
|
-
| { type: "char"; length: number }
|
|
41
|
-
| { type: "text" }
|
|
42
|
-
| { type: "binary" }
|
|
43
|
-
| { type: "boolean" }
|
|
44
|
-
| { type: "datetime" }
|
|
45
|
-
| { type: "date" }
|
|
46
|
-
| { type: "time" }
|
|
47
|
-
| { type: "uuid" };
|
|
48
|
-
|
|
49
|
-
// ============================================
|
|
50
|
-
// ColumnPrimitive (TypeScript
|
|
51
|
-
// ============================================
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* TypeScript
|
|
57
|
-
*
|
|
58
|
-
* @example
|
|
59
|
-
* ```typescript
|
|
60
|
-
* type StringType = ColumnPrimitiveMap["string"]; // string
|
|
61
|
-
* type DateTimeType = ColumnPrimitiveMap["DateTime"]; // DateTime
|
|
62
|
-
* ```
|
|
63
|
-
*/
|
|
64
|
-
export type ColumnPrimitiveMap = {
|
|
65
|
-
string: string;
|
|
66
|
-
number: number;
|
|
67
|
-
boolean: boolean;
|
|
68
|
-
DateTime: DateTime;
|
|
69
|
-
DateOnly: DateOnly;
|
|
70
|
-
Time: Time;
|
|
71
|
-
Uuid: Uuid;
|
|
72
|
-
Bytes: Bytes;
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* @example
|
|
79
|
-
* ```typescript
|
|
80
|
-
* const typeStr: ColumnPrimitiveStr = "string"; // OK
|
|
81
|
-
* const typeStr2: ColumnPrimitiveStr = "invalid"; // Error
|
|
82
|
-
* ```
|
|
83
|
-
*/
|
|
84
|
-
export type ColumnPrimitiveStr = keyof ColumnPrimitiveMap;
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* undefined
|
|
90
|
-
*/
|
|
91
|
-
export type ColumnPrimitive = ColumnPrimitiveMap[ColumnPrimitiveStr] | undefined;
|
|
92
|
-
|
|
93
|
-
// ============================================
|
|
94
|
-
// DataType ↔ ColumnPrimitive
|
|
95
|
-
// ============================================
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* SQL DataType → TypeScript
|
|
99
|
-
*
|
|
100
|
-
* @example
|
|
101
|
-
* ```typescript
|
|
102
|
-
* const tsType = dataTypeStrToColumnPrimitiveStr["int"]; // "number"
|
|
103
|
-
* const tsType2 = dataTypeStrToColumnPrimitiveStr["datetime"]; // "DateTime"
|
|
104
|
-
* ```
|
|
105
|
-
*/
|
|
106
|
-
export const dataTypeStrToColumnPrimitiveStr = {
|
|
107
|
-
int: "number" as const,
|
|
108
|
-
bigint: "number" as const,
|
|
109
|
-
float: "number" as const,
|
|
110
|
-
double: "number" as const,
|
|
111
|
-
decimal: "number" as const,
|
|
112
|
-
varchar: "string" as const,
|
|
113
|
-
char: "string" as const,
|
|
114
|
-
text: "string" as const,
|
|
115
|
-
binary: "Bytes" as const,
|
|
116
|
-
boolean: "boolean" as const,
|
|
117
|
-
datetime: "DateTime" as const,
|
|
118
|
-
date: "DateOnly" as const,
|
|
119
|
-
time: "Time" as const,
|
|
120
|
-
uuid: "Uuid" as const,
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* @template T - DataType
|
|
127
|
-
*
|
|
128
|
-
* @example
|
|
129
|
-
* ```typescript
|
|
130
|
-
* type IntType = InferColumnPrimitiveFromDataType<{ type: "int" }>; // number
|
|
131
|
-
* type VarcharType = InferColumnPrimitiveFromDataType<{ type: "varchar"; length: 100 }>; // string
|
|
132
|
-
* ```
|
|
133
|
-
*/
|
|
134
|
-
export type InferColumnPrimitiveFromDataType<TDataType extends DataType> =
|
|
135
|
-
ColumnPrimitiveMap[(typeof dataTypeStrToColumnPrimitiveStr)[TDataType["type"]]];
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* @param value -
|
|
141
|
-
* @returns ColumnPrimitiveStr
|
|
142
|
-
* @throws
|
|
143
|
-
*
|
|
144
|
-
* @example
|
|
145
|
-
* ```typescript
|
|
146
|
-
* inferColumnPrimitiveStr("hello"); // "string"
|
|
147
|
-
* inferColumnPrimitiveStr(123); // "number"
|
|
148
|
-
* inferColumnPrimitiveStr(new DateTime()); // "DateTime"
|
|
149
|
-
* ```
|
|
150
|
-
*/
|
|
151
|
-
export function inferColumnPrimitiveStr(value: ColumnPrimitive): ColumnPrimitiveStr {
|
|
152
|
-
if (typeof value === "string") return "string";
|
|
153
|
-
if (typeof value === "number") return "number";
|
|
154
|
-
if (typeof value === "boolean") return "boolean";
|
|
155
|
-
if (value instanceof DateTime) return "DateTime";
|
|
156
|
-
if (value instanceof DateOnly) return "DateOnly";
|
|
157
|
-
if (value instanceof Time) return "Time";
|
|
158
|
-
if (value instanceof Uuid) return "Uuid";
|
|
159
|
-
if (value instanceof Uint8Array) return "Bytes";
|
|
160
|
-
throw new Error(
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// ============================================
|
|
164
|
-
// ColumnMeta
|
|
165
|
-
// ============================================
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
* ColumnBuilder
|
|
171
|
-
*
|
|
172
|
-
* @property type - TypeScript
|
|
173
|
-
* @property dataType - SQL
|
|
174
|
-
* @property autoIncrement -
|
|
175
|
-
* @property nullable -
|
|
176
|
-
* @property default -
|
|
177
|
-
* @property description -
|
|
178
|
-
*
|
|
179
|
-
* @see {@link ColumnBuilder}
|
|
180
|
-
*/
|
|
181
|
-
export interface ColumnMeta {
|
|
182
|
-
type: ColumnPrimitiveStr;
|
|
183
|
-
dataType: DataType;
|
|
184
|
-
autoIncrement?: boolean;
|
|
185
|
-
nullable?: boolean;
|
|
186
|
-
default?: ColumnPrimitive;
|
|
187
|
-
description?: string;
|
|
188
|
-
}
|
|
1
|
+
import { DateOnly, DateTime, Time, Uuid, type Bytes } from "@simplysm/core-common";
|
|
2
|
+
|
|
3
|
+
// ============================================
|
|
4
|
+
// DataType (SQL type definition)
|
|
5
|
+
// ============================================
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* SQL data type definition
|
|
9
|
+
*
|
|
10
|
+
* DBMS Mapping:
|
|
11
|
+
* - `int`: INT (4 bytes)
|
|
12
|
+
* - `bigint`: BIGINT (8 bytes)
|
|
13
|
+
* - `float`: FLOAT/REAL (4 bytes)
|
|
14
|
+
* - `double`: DOUBLE/FLOAT (8 bytes)
|
|
15
|
+
* - `decimal`: DECIMAL(precision, scale)
|
|
16
|
+
* - `varchar`: VARCHAR(length)
|
|
17
|
+
* - `char`: CHAR(length)
|
|
18
|
+
* - `text`: TEXT/LONGTEXT
|
|
19
|
+
* - `binary`: LONGBLOB/VARBINARY(MAX)/BYTEA
|
|
20
|
+
* - `boolean`: TINYINT(1)/BIT/BOOLEAN
|
|
21
|
+
* - `datetime`: DATETIME
|
|
22
|
+
* - `date`: DATE
|
|
23
|
+
* - `time`: TIME
|
|
24
|
+
* - `uuid`: BINARY(16)/UNIQUEIDENTIFIER/UUID
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const intType: DataType = { type: "int" };
|
|
29
|
+
* const decimalType: DataType = { type: "decimal", precision: 10, scale: 2 };
|
|
30
|
+
* const varcharType: DataType = { type: "varchar", length: 100 };
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export type DataType =
|
|
34
|
+
| { type: "int" }
|
|
35
|
+
| { type: "bigint" }
|
|
36
|
+
| { type: "float" }
|
|
37
|
+
| { type: "double" }
|
|
38
|
+
| { type: "decimal"; precision: number; scale?: number }
|
|
39
|
+
| { type: "varchar"; length: number }
|
|
40
|
+
| { type: "char"; length: number }
|
|
41
|
+
| { type: "text" }
|
|
42
|
+
| { type: "binary" }
|
|
43
|
+
| { type: "boolean" }
|
|
44
|
+
| { type: "datetime" }
|
|
45
|
+
| { type: "date" }
|
|
46
|
+
| { type: "time" }
|
|
47
|
+
| { type: "uuid" };
|
|
48
|
+
|
|
49
|
+
// ============================================
|
|
50
|
+
// ColumnPrimitive (TypeScript Type)
|
|
51
|
+
// ============================================
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Column primitive type mapping
|
|
55
|
+
*
|
|
56
|
+
* TypeScript type name (string) → Actual TypeScript type mapping
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* type StringType = ColumnPrimitiveMap["string"]; // string
|
|
61
|
+
* type DateTimeType = ColumnPrimitiveMap["DateTime"]; // DateTime
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export type ColumnPrimitiveMap = {
|
|
65
|
+
string: string;
|
|
66
|
+
number: number;
|
|
67
|
+
boolean: boolean;
|
|
68
|
+
DateTime: DateTime;
|
|
69
|
+
DateOnly: DateOnly;
|
|
70
|
+
Time: Time;
|
|
71
|
+
Uuid: Uuid;
|
|
72
|
+
Bytes: Bytes;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Column primitive type name (string)
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const typeStr: ColumnPrimitiveStr = "string"; // OK
|
|
81
|
+
* const typeStr2: ColumnPrimitiveStr = "invalid"; // Error
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export type ColumnPrimitiveStr = keyof ColumnPrimitiveMap;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* All primitive types that can be stored in columns
|
|
88
|
+
*
|
|
89
|
+
* undefined represents NULL
|
|
90
|
+
*/
|
|
91
|
+
export type ColumnPrimitive = ColumnPrimitiveMap[ColumnPrimitiveStr] | undefined;
|
|
92
|
+
|
|
93
|
+
// ============================================
|
|
94
|
+
// DataType ↔ ColumnPrimitive Mapping
|
|
95
|
+
// ============================================
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* SQL DataType → TypeScript type name mapping
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* const tsType = dataTypeStrToColumnPrimitiveStr["int"]; // "number"
|
|
103
|
+
* const tsType2 = dataTypeStrToColumnPrimitiveStr["datetime"]; // "DateTime"
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export const dataTypeStrToColumnPrimitiveStr = {
|
|
107
|
+
int: "number" as const,
|
|
108
|
+
bigint: "number" as const,
|
|
109
|
+
float: "number" as const,
|
|
110
|
+
double: "number" as const,
|
|
111
|
+
decimal: "number" as const,
|
|
112
|
+
varchar: "string" as const,
|
|
113
|
+
char: "string" as const,
|
|
114
|
+
text: "string" as const,
|
|
115
|
+
binary: "Bytes" as const,
|
|
116
|
+
boolean: "boolean" as const,
|
|
117
|
+
datetime: "DateTime" as const,
|
|
118
|
+
date: "DateOnly" as const,
|
|
119
|
+
time: "Time" as const,
|
|
120
|
+
uuid: "Uuid" as const,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* TypeScript Type inference from DataType
|
|
125
|
+
*
|
|
126
|
+
* @template T - DataType
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* type IntType = InferColumnPrimitiveFromDataType<{ type: "int" }>; // number
|
|
131
|
+
* type VarcharType = InferColumnPrimitiveFromDataType<{ type: "varchar"; length: 100 }>; // string
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export type InferColumnPrimitiveFromDataType<TDataType extends DataType> =
|
|
135
|
+
ColumnPrimitiveMap[(typeof dataTypeStrToColumnPrimitiveStr)[TDataType["type"]]];
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Infer ColumnPrimitiveStr from runtime value
|
|
139
|
+
*
|
|
140
|
+
* @param value - Column value
|
|
141
|
+
* @returns ColumnPrimitiveStr type name
|
|
142
|
+
* @throws Error if value type is unknown
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```typescript
|
|
146
|
+
* inferColumnPrimitiveStr("hello"); // "string"
|
|
147
|
+
* inferColumnPrimitiveStr(123); // "number"
|
|
148
|
+
* inferColumnPrimitiveStr(new DateTime()); // "DateTime"
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
export function inferColumnPrimitiveStr(value: ColumnPrimitive): ColumnPrimitiveStr {
|
|
152
|
+
if (typeof value === "string") return "string";
|
|
153
|
+
if (typeof value === "number") return "number";
|
|
154
|
+
if (typeof value === "boolean") return "boolean";
|
|
155
|
+
if (value instanceof DateTime) return "DateTime";
|
|
156
|
+
if (value instanceof DateOnly) return "DateOnly";
|
|
157
|
+
if (value instanceof Time) return "Time";
|
|
158
|
+
if (value instanceof Uuid) return "Uuid";
|
|
159
|
+
if (value instanceof Uint8Array) return "Bytes";
|
|
160
|
+
throw new Error(`Unknown value type: ${typeof value}`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ============================================
|
|
164
|
+
// ColumnMeta
|
|
165
|
+
// ============================================
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Column metadata
|
|
169
|
+
*
|
|
170
|
+
* Generated by ColumnBuilder and passed to TableBuilder
|
|
171
|
+
*
|
|
172
|
+
* @property type - TypeScript type name (ColumnPrimitiveStr)
|
|
173
|
+
* @property dataType - SQL data type
|
|
174
|
+
* @property autoIncrement - Whether to auto-increment
|
|
175
|
+
* @property nullable - Whether to allow NULL
|
|
176
|
+
* @property default - Default value
|
|
177
|
+
* @property description - Column description (DDL comment)
|
|
178
|
+
*
|
|
179
|
+
* @see {@link ColumnBuilder} Column builder
|
|
180
|
+
*/
|
|
181
|
+
export interface ColumnMeta {
|
|
182
|
+
type: ColumnPrimitiveStr;
|
|
183
|
+
dataType: DataType;
|
|
184
|
+
autoIncrement?: boolean;
|
|
185
|
+
nullable?: boolean;
|
|
186
|
+
default?: ColumnPrimitive;
|
|
187
|
+
description?: string;
|
|
188
|
+
}
|