@hedystia/db 2.0.5 → 2.0.7
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/dist/cache/index.mjs +12 -0
- package/dist/cache/index.mjs.map +1 -0
- package/dist/cache/manager.mjs +156 -153
- package/dist/cache/manager.mjs.map +1 -1
- package/dist/cache/memory-store.mjs +113 -111
- package/dist/cache/memory-store.mjs.map +1 -1
- package/dist/cli/commands/migrate.cjs +78 -0
- package/dist/cli/commands/migrate.cjs.map +1 -0
- package/dist/cli/commands/migrate.mjs +83 -0
- package/dist/cli/commands/migrate.mjs.map +1 -0
- package/dist/cli.cjs +36 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +37 -0
- package/dist/cli.mjs.map +1 -1
- package/dist/core/database.cjs +72 -29
- package/dist/core/database.cjs.map +1 -1
- package/dist/core/database.d.cts +65 -0
- package/dist/core/database.d.mts +65 -0
- package/dist/core/database.mjs +88 -34
- package/dist/core/database.mjs.map +1 -1
- package/dist/core/repository.mjs +414 -410
- package/dist/core/repository.mjs.map +1 -1
- package/dist/drivers/driver.mjs +9 -7
- package/dist/drivers/driver.mjs.map +1 -1
- package/dist/drivers/file.mjs +315 -312
- package/dist/drivers/file.mjs.map +1 -1
- package/dist/drivers/index.mjs +15 -6
- package/dist/drivers/index.mjs.map +1 -1
- package/dist/drivers/mysql.mjs +261 -256
- package/dist/drivers/mysql.mjs.map +1 -1
- package/dist/drivers/sql-compiler.mjs +4 -1
- package/dist/drivers/sql-compiler.mjs.map +1 -1
- package/dist/drivers/sqlite.cjs +12 -1
- package/dist/drivers/sqlite.cjs.map +1 -1
- package/dist/drivers/sqlite.mjs +258 -242
- package/dist/drivers/sqlite.mjs.map +1 -1
- package/dist/errors.mjs +48 -64
- package/dist/errors.mjs.map +1 -1
- package/dist/index.mjs +21 -9
- package/dist/index.mjs.map +1 -1
- package/dist/schema/column.mjs +155 -157
- package/dist/schema/column.mjs.map +1 -1
- package/dist/schema/columns/index.mjs +103 -171
- package/dist/schema/columns/index.mjs.map +1 -1
- package/dist/schema/index.mjs +15 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/schema/registry.mjs +122 -119
- package/dist/schema/registry.mjs.map +1 -1
- package/dist/schema/table.mjs +4 -1
- package/dist/schema/table.mjs.map +1 -1
- package/dist/sync/synchronizer.mjs +2 -1
- package/dist/sync/synchronizer.mjs.map +1 -1
- package/dist/types.d.cts +67 -6
- package/dist/types.d.mts +67 -6
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { __exportAll } from "../../_virtual/_rolldown/runtime.mjs";
|
|
2
|
-
import { ColumnBuilder } from "../column.mjs";
|
|
1
|
+
import { __esmMin, __exportAll } from "../../_virtual/_rolldown/runtime.mjs";
|
|
2
|
+
import { ColumnBuilder, init_column } from "../column.mjs";
|
|
3
3
|
//#region src/schema/columns/index.ts
|
|
4
4
|
var columns_exports = /* @__PURE__ */ __exportAll({
|
|
5
5
|
NamedColumnStarter: () => NamedColumnStarter,
|
|
@@ -19,175 +19,107 @@ var columns_exports = /* @__PURE__ */ __exportAll({
|
|
|
19
19
|
timestamp: () => timestamp,
|
|
20
20
|
varchar: () => varchar
|
|
21
21
|
});
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
*/
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
*/
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
*/
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
* @
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
/** Create a TEXT column with this database column name */
|
|
123
|
-
text() {
|
|
124
|
-
return new ColumnBuilder("text").name(this._alias);
|
|
125
|
-
}
|
|
126
|
-
/** Create a BOOLEAN column with this database column name */
|
|
127
|
-
boolean() {
|
|
128
|
-
return new ColumnBuilder("boolean").name(this._alias);
|
|
129
|
-
}
|
|
130
|
-
/** Create a JSON column with this database column name */
|
|
131
|
-
json() {
|
|
132
|
-
return new ColumnBuilder("json").name(this._alias);
|
|
133
|
-
}
|
|
134
|
-
/** Create an ARRAY column with this database column name */
|
|
135
|
-
array() {
|
|
136
|
-
return new ColumnBuilder("array").name(this._alias);
|
|
137
|
-
}
|
|
138
|
-
/** Create a DATETIME column with this database column name */
|
|
139
|
-
datetime() {
|
|
140
|
-
return new ColumnBuilder("datetime").name(this._alias);
|
|
141
|
-
}
|
|
142
|
-
/** Create a TIMESTAMP column with this database column name */
|
|
143
|
-
timestamp() {
|
|
144
|
-
return new ColumnBuilder("timestamp").name(this._alias);
|
|
145
|
-
}
|
|
146
|
-
/** Create a DECIMAL column with this database column name
|
|
147
|
-
* @param {number} [precision=10] - Total number of digits
|
|
148
|
-
* @param {number} [scale=2] - Number of decimal digits
|
|
149
|
-
*/
|
|
150
|
-
decimal(precision = 10, scale = 2) {
|
|
151
|
-
return new ColumnBuilder("decimal", void 0, precision, scale).name(this._alias);
|
|
152
|
-
}
|
|
153
|
-
/** Create a FLOAT column with this database column name */
|
|
154
|
-
float() {
|
|
155
|
-
return new ColumnBuilder("float").name(this._alias);
|
|
156
|
-
}
|
|
157
|
-
/** Create a BLOB column with this database column name */
|
|
158
|
-
blob() {
|
|
159
|
-
return new ColumnBuilder("blob").name(this._alias);
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
/**
|
|
163
|
-
* Create a column with a custom database column name, then pick the column type
|
|
164
|
-
* @param {string} alias - The column name to use in the database
|
|
165
|
-
* @returns {NamedColumnStarter} A starter object to pick the column type
|
|
166
|
-
* @example
|
|
167
|
-
* guildId: name("guild_id").varchar(255).notNull()
|
|
168
|
-
*/
|
|
169
|
-
const name = (alias) => new NamedColumnStarter(alias);
|
|
170
|
-
/**
|
|
171
|
-
* Column type helpers object for schema definitions
|
|
172
|
-
* @returns {typeof d} Column type helpers
|
|
173
|
-
*/
|
|
174
|
-
const d = {
|
|
175
|
-
integer,
|
|
176
|
-
bigint,
|
|
177
|
-
varchar,
|
|
178
|
-
char,
|
|
179
|
-
text,
|
|
180
|
-
boolean,
|
|
181
|
-
json,
|
|
182
|
-
array,
|
|
183
|
-
datetime,
|
|
184
|
-
timestamp,
|
|
185
|
-
decimal,
|
|
186
|
-
float,
|
|
187
|
-
blob,
|
|
188
|
-
name
|
|
189
|
-
};
|
|
22
|
+
var integer, bigint, varchar, char, text, boolean, json, array, datetime, timestamp, decimal, float, blob, NamedColumnStarter, name, d;
|
|
23
|
+
var init_columns = __esmMin((() => {
|
|
24
|
+
init_column();
|
|
25
|
+
integer = () => new ColumnBuilder("integer");
|
|
26
|
+
bigint = () => new ColumnBuilder("bigint");
|
|
27
|
+
varchar = (length = 255) => new ColumnBuilder("varchar", length);
|
|
28
|
+
char = (length = 1) => new ColumnBuilder("char", length);
|
|
29
|
+
text = () => new ColumnBuilder("text");
|
|
30
|
+
boolean = () => new ColumnBuilder("boolean");
|
|
31
|
+
json = () => new ColumnBuilder("json");
|
|
32
|
+
array = () => new ColumnBuilder("array");
|
|
33
|
+
datetime = () => new ColumnBuilder("datetime");
|
|
34
|
+
timestamp = () => new ColumnBuilder("timestamp");
|
|
35
|
+
decimal = (precision = 10, scale = 2) => new ColumnBuilder("decimal", void 0, precision, scale);
|
|
36
|
+
float = () => new ColumnBuilder("float");
|
|
37
|
+
blob = () => new ColumnBuilder("blob");
|
|
38
|
+
NamedColumnStarter = class {
|
|
39
|
+
_alias;
|
|
40
|
+
constructor(alias) {
|
|
41
|
+
this._alias = alias;
|
|
42
|
+
}
|
|
43
|
+
/** Create an INTEGER column with this database column name */
|
|
44
|
+
integer() {
|
|
45
|
+
return new ColumnBuilder("integer").name(this._alias);
|
|
46
|
+
}
|
|
47
|
+
/** Create a BIGINT column with this database column name */
|
|
48
|
+
bigint() {
|
|
49
|
+
return new ColumnBuilder("bigint").name(this._alias);
|
|
50
|
+
}
|
|
51
|
+
/** Create a VARCHAR column with this database column name
|
|
52
|
+
* @param {number} [length=255] - Maximum character length
|
|
53
|
+
*/
|
|
54
|
+
varchar(length = 255) {
|
|
55
|
+
return new ColumnBuilder("varchar", length).name(this._alias);
|
|
56
|
+
}
|
|
57
|
+
/** Create a CHAR column with this database column name
|
|
58
|
+
* @param {number} [length=1] - Fixed character length
|
|
59
|
+
*/
|
|
60
|
+
char(length = 1) {
|
|
61
|
+
return new ColumnBuilder("char", length).name(this._alias);
|
|
62
|
+
}
|
|
63
|
+
/** Create a TEXT column with this database column name */
|
|
64
|
+
text() {
|
|
65
|
+
return new ColumnBuilder("text").name(this._alias);
|
|
66
|
+
}
|
|
67
|
+
/** Create a BOOLEAN column with this database column name */
|
|
68
|
+
boolean() {
|
|
69
|
+
return new ColumnBuilder("boolean").name(this._alias);
|
|
70
|
+
}
|
|
71
|
+
/** Create a JSON column with this database column name */
|
|
72
|
+
json() {
|
|
73
|
+
return new ColumnBuilder("json").name(this._alias);
|
|
74
|
+
}
|
|
75
|
+
/** Create an ARRAY column with this database column name */
|
|
76
|
+
array() {
|
|
77
|
+
return new ColumnBuilder("array").name(this._alias);
|
|
78
|
+
}
|
|
79
|
+
/** Create a DATETIME column with this database column name */
|
|
80
|
+
datetime() {
|
|
81
|
+
return new ColumnBuilder("datetime").name(this._alias);
|
|
82
|
+
}
|
|
83
|
+
/** Create a TIMESTAMP column with this database column name */
|
|
84
|
+
timestamp() {
|
|
85
|
+
return new ColumnBuilder("timestamp").name(this._alias);
|
|
86
|
+
}
|
|
87
|
+
/** Create a DECIMAL column with this database column name
|
|
88
|
+
* @param {number} [precision=10] - Total number of digits
|
|
89
|
+
* @param {number} [scale=2] - Number of decimal digits
|
|
90
|
+
*/
|
|
91
|
+
decimal(precision = 10, scale = 2) {
|
|
92
|
+
return new ColumnBuilder("decimal", void 0, precision, scale).name(this._alias);
|
|
93
|
+
}
|
|
94
|
+
/** Create a FLOAT column with this database column name */
|
|
95
|
+
float() {
|
|
96
|
+
return new ColumnBuilder("float").name(this._alias);
|
|
97
|
+
}
|
|
98
|
+
/** Create a BLOB column with this database column name */
|
|
99
|
+
blob() {
|
|
100
|
+
return new ColumnBuilder("blob").name(this._alias);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
name = (alias) => new NamedColumnStarter(alias);
|
|
104
|
+
d = {
|
|
105
|
+
integer,
|
|
106
|
+
bigint,
|
|
107
|
+
varchar,
|
|
108
|
+
char,
|
|
109
|
+
text,
|
|
110
|
+
boolean,
|
|
111
|
+
json,
|
|
112
|
+
array,
|
|
113
|
+
datetime,
|
|
114
|
+
timestamp,
|
|
115
|
+
decimal,
|
|
116
|
+
float,
|
|
117
|
+
blob,
|
|
118
|
+
name
|
|
119
|
+
};
|
|
120
|
+
}));
|
|
190
121
|
//#endregion
|
|
191
|
-
|
|
122
|
+
init_columns();
|
|
123
|
+
export { NamedColumnStarter, array, bigint, blob, boolean, char, columns_exports, d, datetime, decimal, float, init_columns, integer, json, name, text, timestamp, varchar };
|
|
192
124
|
|
|
193
125
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/schema/columns/index.ts"],"sourcesContent":["import { ColumnBuilder } from \"../column\";\n\n/**\n * Create an INTEGER column\n * @returns {ColumnBuilder<number>} Column builder for integer type\n */\nexport const integer = (): ColumnBuilder<number> => new ColumnBuilder<number>(\"integer\");\n\n/**\n * Create a BIGINT column\n * @returns {ColumnBuilder<number>} Column builder for bigint type\n */\nexport const bigint = (): ColumnBuilder<number> => new ColumnBuilder<number>(\"bigint\");\n\n/**\n * Create a VARCHAR column with specified length\n * @param {number} [length=255] - Maximum character length\n * @returns {ColumnBuilder<string>} Column builder for varchar type\n */\nexport const varchar = (length = 255): ColumnBuilder<string> =>\n new ColumnBuilder<string>(\"varchar\", length);\n\n/**\n * Create a CHAR column with specified length\n * @param {number} [length=1] - Fixed character length\n * @returns {ColumnBuilder<string>} Column builder for char type\n */\nexport const char = (length = 1): ColumnBuilder<string> =>\n new ColumnBuilder<string>(\"char\", length);\n\n/**\n * Create a TEXT column\n * @returns {ColumnBuilder<string>} Column builder for text type\n */\nexport const text = (): ColumnBuilder<string> => new ColumnBuilder<string>(\"text\");\n\n/**\n * Create a BOOLEAN column\n * @returns {ColumnBuilder<boolean>} Column builder for boolean type\n */\nexport const boolean = (): ColumnBuilder<boolean> => new ColumnBuilder<boolean>(\"boolean\");\n\n/**\n * Create a JSON column\n * @returns {ColumnBuilder<unknown>} Column builder for json type\n */\nexport const json = (): ColumnBuilder<unknown> => new ColumnBuilder<unknown>(\"json\");\n\n/**\n * Create an ARRAY column (stored as JSON)\n * @returns {ColumnBuilder<unknown[]>} Column builder for array type\n */\nexport const array = (): ColumnBuilder<unknown[]> => new ColumnBuilder<unknown[]>(\"array\");\n\n/**\n * Create a DATETIME column\n * @returns {ColumnBuilder<Date>} Column builder for datetime type\n */\nexport const datetime = (): ColumnBuilder<Date> => new ColumnBuilder<Date>(\"datetime\");\n\n/**\n * Create a TIMESTAMP column\n * @returns {ColumnBuilder<Date>} Column builder for timestamp type\n */\nexport const timestamp = (): ColumnBuilder<Date> => new ColumnBuilder<Date>(\"timestamp\");\n\n/**\n * Create a DECIMAL column with precision and scale\n * @param {number} [precision=10] - Total number of digits\n * @param {number} [scale=2] - Number of decimal digits\n * @returns {ColumnBuilder<number>} Column builder for decimal type\n */\nexport const decimal = (precision = 10, scale = 2): ColumnBuilder<number> =>\n new ColumnBuilder<number>(\"decimal\", undefined, precision, scale);\n\n/**\n * Create a FLOAT column\n * @returns {ColumnBuilder<number>} Column builder for float type\n */\nexport const float = (): ColumnBuilder<number> => new ColumnBuilder<number>(\"float\");\n\n/**\n * Create a BLOB column\n * @returns {ColumnBuilder<Buffer>} Column builder for blob type\n */\nexport const blob = (): ColumnBuilder<Buffer> => new ColumnBuilder<Buffer>(\"blob\");\n\n/**\n * Starter class for creating columns with a pre-set database column name\n * @example\n * // Start with name, then pick column type\n * guildId: name(\"guild_id\").varchar(255)\n */\nexport class NamedColumnStarter {\n private _alias: string;\n\n constructor(alias: string) {\n this._alias = alias;\n }\n\n /** Create an INTEGER column with this database column name */\n integer(): ColumnBuilder<number> {\n return new ColumnBuilder<number>(\"integer\").name(this._alias);\n }\n\n /** Create a BIGINT column with this database column name */\n bigint(): ColumnBuilder<number> {\n return new ColumnBuilder<number>(\"bigint\").name(this._alias);\n }\n\n /** Create a VARCHAR column with this database column name\n * @param {number} [length=255] - Maximum character length\n */\n varchar(length = 255): ColumnBuilder<string> {\n return new ColumnBuilder<string>(\"varchar\", length).name(this._alias);\n }\n\n /** Create a CHAR column with this database column name\n * @param {number} [length=1] - Fixed character length\n */\n char(length = 1): ColumnBuilder<string> {\n return new ColumnBuilder<string>(\"char\", length).name(this._alias);\n }\n\n /** Create a TEXT column with this database column name */\n text(): ColumnBuilder<string> {\n return new ColumnBuilder<string>(\"text\").name(this._alias);\n }\n\n /** Create a BOOLEAN column with this database column name */\n boolean(): ColumnBuilder<boolean> {\n return new ColumnBuilder<boolean>(\"boolean\").name(this._alias);\n }\n\n /** Create a JSON column with this database column name */\n json(): ColumnBuilder<unknown> {\n return new ColumnBuilder<unknown>(\"json\").name(this._alias);\n }\n\n /** Create an ARRAY column with this database column name */\n array(): ColumnBuilder<unknown[]> {\n return new ColumnBuilder<unknown[]>(\"array\").name(this._alias);\n }\n\n /** Create a DATETIME column with this database column name */\n datetime(): ColumnBuilder<Date> {\n return new ColumnBuilder<Date>(\"datetime\").name(this._alias);\n }\n\n /** Create a TIMESTAMP column with this database column name */\n timestamp(): ColumnBuilder<Date> {\n return new ColumnBuilder<Date>(\"timestamp\").name(this._alias);\n }\n\n /** Create a DECIMAL column with this database column name\n * @param {number} [precision=10] - Total number of digits\n * @param {number} [scale=2] - Number of decimal digits\n */\n decimal(precision = 10, scale = 2): ColumnBuilder<number> {\n return new ColumnBuilder<number>(\"decimal\", undefined, precision, scale).name(this._alias);\n }\n\n /** Create a FLOAT column with this database column name */\n float(): ColumnBuilder<number> {\n return new ColumnBuilder<number>(\"float\").name(this._alias);\n }\n\n /** Create a BLOB column with this database column name */\n blob(): ColumnBuilder<Buffer> {\n return new ColumnBuilder<Buffer>(\"blob\").name(this._alias);\n }\n}\n\n/**\n * Create a column with a custom database column name, then pick the column type\n * @param {string} alias - The column name to use in the database\n * @returns {NamedColumnStarter} A starter object to pick the column type\n * @example\n * guildId: name(\"guild_id\").varchar(255).notNull()\n */\nexport const name = (alias: string): NamedColumnStarter => new NamedColumnStarter(alias);\n\n/**\n * Column type helpers object for schema definitions\n * @returns {typeof d} Column type helpers\n */\nexport const d = {\n integer,\n bigint,\n varchar,\n char,\n text,\n boolean,\n json,\n array,\n datetime,\n timestamp,\n decimal,\n float,\n blob,\n name,\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/schema/columns/index.ts"],"sourcesContent":["import { ColumnBuilder } from \"../column\";\n\n/**\n * Create an INTEGER column\n * @returns {ColumnBuilder<number>} Column builder for integer type\n */\nexport const integer = (): ColumnBuilder<number> => new ColumnBuilder<number>(\"integer\");\n\n/**\n * Create a BIGINT column\n * @returns {ColumnBuilder<number>} Column builder for bigint type\n */\nexport const bigint = (): ColumnBuilder<number> => new ColumnBuilder<number>(\"bigint\");\n\n/**\n * Create a VARCHAR column with specified length\n * @param {number} [length=255] - Maximum character length\n * @returns {ColumnBuilder<string>} Column builder for varchar type\n */\nexport const varchar = (length = 255): ColumnBuilder<string> =>\n new ColumnBuilder<string>(\"varchar\", length);\n\n/**\n * Create a CHAR column with specified length\n * @param {number} [length=1] - Fixed character length\n * @returns {ColumnBuilder<string>} Column builder for char type\n */\nexport const char = (length = 1): ColumnBuilder<string> =>\n new ColumnBuilder<string>(\"char\", length);\n\n/**\n * Create a TEXT column\n * @returns {ColumnBuilder<string>} Column builder for text type\n */\nexport const text = (): ColumnBuilder<string> => new ColumnBuilder<string>(\"text\");\n\n/**\n * Create a BOOLEAN column\n * @returns {ColumnBuilder<boolean>} Column builder for boolean type\n */\nexport const boolean = (): ColumnBuilder<boolean> => new ColumnBuilder<boolean>(\"boolean\");\n\n/**\n * Create a JSON column\n * @returns {ColumnBuilder<unknown>} Column builder for json type\n */\nexport const json = (): ColumnBuilder<unknown> => new ColumnBuilder<unknown>(\"json\");\n\n/**\n * Create an ARRAY column (stored as JSON)\n * @returns {ColumnBuilder<unknown[]>} Column builder for array type\n */\nexport const array = (): ColumnBuilder<unknown[]> => new ColumnBuilder<unknown[]>(\"array\");\n\n/**\n * Create a DATETIME column\n * @returns {ColumnBuilder<Date>} Column builder for datetime type\n */\nexport const datetime = (): ColumnBuilder<Date> => new ColumnBuilder<Date>(\"datetime\");\n\n/**\n * Create a TIMESTAMP column\n * @returns {ColumnBuilder<Date>} Column builder for timestamp type\n */\nexport const timestamp = (): ColumnBuilder<Date> => new ColumnBuilder<Date>(\"timestamp\");\n\n/**\n * Create a DECIMAL column with precision and scale\n * @param {number} [precision=10] - Total number of digits\n * @param {number} [scale=2] - Number of decimal digits\n * @returns {ColumnBuilder<number>} Column builder for decimal type\n */\nexport const decimal = (precision = 10, scale = 2): ColumnBuilder<number> =>\n new ColumnBuilder<number>(\"decimal\", undefined, precision, scale);\n\n/**\n * Create a FLOAT column\n * @returns {ColumnBuilder<number>} Column builder for float type\n */\nexport const float = (): ColumnBuilder<number> => new ColumnBuilder<number>(\"float\");\n\n/**\n * Create a BLOB column\n * @returns {ColumnBuilder<Buffer>} Column builder for blob type\n */\nexport const blob = (): ColumnBuilder<Buffer> => new ColumnBuilder<Buffer>(\"blob\");\n\n/**\n * Starter class for creating columns with a pre-set database column name\n * @example\n * // Start with name, then pick column type\n * guildId: name(\"guild_id\").varchar(255)\n */\nexport class NamedColumnStarter {\n private _alias: string;\n\n constructor(alias: string) {\n this._alias = alias;\n }\n\n /** Create an INTEGER column with this database column name */\n integer(): ColumnBuilder<number> {\n return new ColumnBuilder<number>(\"integer\").name(this._alias);\n }\n\n /** Create a BIGINT column with this database column name */\n bigint(): ColumnBuilder<number> {\n return new ColumnBuilder<number>(\"bigint\").name(this._alias);\n }\n\n /** Create a VARCHAR column with this database column name\n * @param {number} [length=255] - Maximum character length\n */\n varchar(length = 255): ColumnBuilder<string> {\n return new ColumnBuilder<string>(\"varchar\", length).name(this._alias);\n }\n\n /** Create a CHAR column with this database column name\n * @param {number} [length=1] - Fixed character length\n */\n char(length = 1): ColumnBuilder<string> {\n return new ColumnBuilder<string>(\"char\", length).name(this._alias);\n }\n\n /** Create a TEXT column with this database column name */\n text(): ColumnBuilder<string> {\n return new ColumnBuilder<string>(\"text\").name(this._alias);\n }\n\n /** Create a BOOLEAN column with this database column name */\n boolean(): ColumnBuilder<boolean> {\n return new ColumnBuilder<boolean>(\"boolean\").name(this._alias);\n }\n\n /** Create a JSON column with this database column name */\n json(): ColumnBuilder<unknown> {\n return new ColumnBuilder<unknown>(\"json\").name(this._alias);\n }\n\n /** Create an ARRAY column with this database column name */\n array(): ColumnBuilder<unknown[]> {\n return new ColumnBuilder<unknown[]>(\"array\").name(this._alias);\n }\n\n /** Create a DATETIME column with this database column name */\n datetime(): ColumnBuilder<Date> {\n return new ColumnBuilder<Date>(\"datetime\").name(this._alias);\n }\n\n /** Create a TIMESTAMP column with this database column name */\n timestamp(): ColumnBuilder<Date> {\n return new ColumnBuilder<Date>(\"timestamp\").name(this._alias);\n }\n\n /** Create a DECIMAL column with this database column name\n * @param {number} [precision=10] - Total number of digits\n * @param {number} [scale=2] - Number of decimal digits\n */\n decimal(precision = 10, scale = 2): ColumnBuilder<number> {\n return new ColumnBuilder<number>(\"decimal\", undefined, precision, scale).name(this._alias);\n }\n\n /** Create a FLOAT column with this database column name */\n float(): ColumnBuilder<number> {\n return new ColumnBuilder<number>(\"float\").name(this._alias);\n }\n\n /** Create a BLOB column with this database column name */\n blob(): ColumnBuilder<Buffer> {\n return new ColumnBuilder<Buffer>(\"blob\").name(this._alias);\n }\n}\n\n/**\n * Create a column with a custom database column name, then pick the column type\n * @param {string} alias - The column name to use in the database\n * @returns {NamedColumnStarter} A starter object to pick the column type\n * @example\n * guildId: name(\"guild_id\").varchar(255).notNull()\n */\nexport const name = (alias: string): NamedColumnStarter => new NamedColumnStarter(alias);\n\n/**\n * Column type helpers object for schema definitions\n * @returns {typeof d} Column type helpers\n */\nexport const d = {\n integer,\n bigint,\n varchar,\n char,\n text,\n boolean,\n json,\n array,\n datetime,\n timestamp,\n decimal,\n float,\n blob,\n name,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;cAA0C;AAM7B,iBAAuC,IAAI,cAAsB,UAAU;AAM3E,gBAAsC,IAAI,cAAsB,SAAS;AAOzE,YAAW,SAAS,QAC/B,IAAI,cAAsB,WAAW,OAAO;AAOjC,SAAQ,SAAS,MAC5B,IAAI,cAAsB,QAAQ,OAAO;AAM9B,cAAoC,IAAI,cAAsB,OAAO;AAMrE,iBAAwC,IAAI,cAAuB,UAAU;AAM7E,cAAqC,IAAI,cAAuB,OAAO;AAMvE,eAAwC,IAAI,cAAyB,QAAQ;AAM7E,kBAAsC,IAAI,cAAoB,WAAW;AAMzE,mBAAuC,IAAI,cAAoB,YAAY;AAQ3E,YAAW,YAAY,IAAI,QAAQ,MAC9C,IAAI,cAAsB,WAAW,KAAA,GAAW,WAAW,MAAM;AAMtD,eAAqC,IAAI,cAAsB,QAAQ;AAMvE,cAAoC,IAAI,cAAsB,OAAO;AAQrE,sBAAb,MAAgC;EAC9B;EAEA,YAAY,OAAe;AACzB,QAAK,SAAS;;;EAIhB,UAAiC;AAC/B,UAAO,IAAI,cAAsB,UAAU,CAAC,KAAK,KAAK,OAAO;;;EAI/D,SAAgC;AAC9B,UAAO,IAAI,cAAsB,SAAS,CAAC,KAAK,KAAK,OAAO;;;;;EAM9D,QAAQ,SAAS,KAA4B;AAC3C,UAAO,IAAI,cAAsB,WAAW,OAAO,CAAC,KAAK,KAAK,OAAO;;;;;EAMvE,KAAK,SAAS,GAA0B;AACtC,UAAO,IAAI,cAAsB,QAAQ,OAAO,CAAC,KAAK,KAAK,OAAO;;;EAIpE,OAA8B;AAC5B,UAAO,IAAI,cAAsB,OAAO,CAAC,KAAK,KAAK,OAAO;;;EAI5D,UAAkC;AAChC,UAAO,IAAI,cAAuB,UAAU,CAAC,KAAK,KAAK,OAAO;;;EAIhE,OAA+B;AAC7B,UAAO,IAAI,cAAuB,OAAO,CAAC,KAAK,KAAK,OAAO;;;EAI7D,QAAkC;AAChC,UAAO,IAAI,cAAyB,QAAQ,CAAC,KAAK,KAAK,OAAO;;;EAIhE,WAAgC;AAC9B,UAAO,IAAI,cAAoB,WAAW,CAAC,KAAK,KAAK,OAAO;;;EAI9D,YAAiC;AAC/B,UAAO,IAAI,cAAoB,YAAY,CAAC,KAAK,KAAK,OAAO;;;;;;EAO/D,QAAQ,YAAY,IAAI,QAAQ,GAA0B;AACxD,UAAO,IAAI,cAAsB,WAAW,KAAA,GAAW,WAAW,MAAM,CAAC,KAAK,KAAK,OAAO;;;EAI5F,QAA+B;AAC7B,UAAO,IAAI,cAAsB,QAAQ,CAAC,KAAK,KAAK,OAAO;;;EAI7D,OAA8B;AAC5B,UAAO,IAAI,cAAsB,OAAO,CAAC,KAAK,KAAK,OAAO;;;AAWjD,SAAQ,UAAsC,IAAI,mBAAmB,MAAM;AAM3E,KAAI;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.mjs";
|
|
2
|
+
import "./column.mjs";
|
|
3
|
+
import { init_columns } from "./columns/index.mjs";
|
|
4
|
+
import { init_registry } from "./registry.mjs";
|
|
5
|
+
import "./table.mjs";
|
|
6
|
+
//#region src/schema/index.ts
|
|
7
|
+
var init_schema = __esmMin((() => {
|
|
8
|
+
init_columns();
|
|
9
|
+
init_registry();
|
|
10
|
+
}));
|
|
11
|
+
//#endregion
|
|
12
|
+
init_schema();
|
|
13
|
+
export { init_schema };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/schema/index.ts"],"sourcesContent":["export { ColumnBuilder } from \"./column\";\nexport * from \"./columns\";\nexport { d } from \"./columns\";\nexport { SchemaRegistry } from \"./registry\";\nexport { table } from \"./table\";\n"],"mappings":";;;;;;;;gBAG4C"}
|
package/dist/schema/registry.mjs
CHANGED
|
@@ -1,125 +1,128 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.mjs";
|
|
2
|
+
import { SchemaError, init_errors } from "../errors.mjs";
|
|
2
3
|
//#region src/schema/registry.ts
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
table: resolved.table,
|
|
38
|
-
column: resolved.column,
|
|
39
|
-
onDelete: ref.onDelete,
|
|
40
|
-
onUpdate: ref.onUpdate,
|
|
41
|
-
relationName: ref.relationName
|
|
42
|
-
};
|
|
43
|
-
const relationName = ref.relationName || ref.columnName.replace(/Id$/, "").replace(/_id$/, "");
|
|
44
|
-
if (!this.relations.has(schema.__name)) this.relations.set(schema.__name, []);
|
|
45
|
-
this.relations.get(schema.__name).push({
|
|
46
|
-
from: {
|
|
47
|
-
table: schema.__name,
|
|
48
|
-
column: dbColumnName
|
|
49
|
-
},
|
|
50
|
-
to: {
|
|
51
|
-
table: resolved.table,
|
|
52
|
-
column: resolved.column
|
|
53
|
-
},
|
|
54
|
-
relationName
|
|
55
|
-
});
|
|
56
|
-
if (!this.relations.has(resolved.table)) this.relations.set(resolved.table, []);
|
|
57
|
-
const reverseRelationName = schema.__name;
|
|
58
|
-
this.relations.get(resolved.table).push({
|
|
59
|
-
from: {
|
|
4
|
+
var SchemaRegistry;
|
|
5
|
+
var init_registry = __esmMin((() => {
|
|
6
|
+
init_errors();
|
|
7
|
+
SchemaRegistry = class {
|
|
8
|
+
tables = /* @__PURE__ */ new Map();
|
|
9
|
+
definitions = /* @__PURE__ */ new Map();
|
|
10
|
+
columnMaps = /* @__PURE__ */ new Map();
|
|
11
|
+
reverseColumnMaps = /* @__PURE__ */ new Map();
|
|
12
|
+
relations = /* @__PURE__ */ new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Register table definitions and resolve all deferred references
|
|
15
|
+
* @param {readonly TableDefinition[]} schemas - Table definitions to register
|
|
16
|
+
*/
|
|
17
|
+
register(schemas) {
|
|
18
|
+
for (const schema of schemas) {
|
|
19
|
+
if (!schema.__table || !schema.__name) throw new SchemaError("Invalid table definition");
|
|
20
|
+
this.definitions.set(schema.__name, schema);
|
|
21
|
+
this.tables.set(schema.__name, {
|
|
22
|
+
name: schema.__name,
|
|
23
|
+
columns: [...schema.__columns]
|
|
24
|
+
});
|
|
25
|
+
const colMap = schema.__columnMap ?? {};
|
|
26
|
+
this.columnMaps.set(schema.__name, colMap);
|
|
27
|
+
const reverseMap = {};
|
|
28
|
+
for (const [codeKey, dbName] of Object.entries(colMap)) reverseMap[dbName] = codeKey;
|
|
29
|
+
this.reverseColumnMaps.set(schema.__name, reverseMap);
|
|
30
|
+
}
|
|
31
|
+
for (const schema of schemas) for (const ref of schema.__deferredRefs) {
|
|
32
|
+
const resolved = ref.resolve();
|
|
33
|
+
if (!resolved.table || !resolved.column) throw new SchemaError(`Failed to resolve reference for ${schema.__name}.${ref.columnName}`);
|
|
34
|
+
if (!this.tables.has(resolved.table)) throw new SchemaError(`Referenced table "${resolved.table}" does not exist in schema registry`);
|
|
35
|
+
const dbColumnName = (this.columnMaps.get(schema.__name) ?? {})[ref.columnName] ?? ref.columnName;
|
|
36
|
+
const column = schema.__columns.find((c) => c.name === dbColumnName);
|
|
37
|
+
if (column) column.references = {
|
|
60
38
|
table: resolved.table,
|
|
61
|
-
column: resolved.column
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
39
|
+
column: resolved.column,
|
|
40
|
+
onDelete: ref.onDelete,
|
|
41
|
+
onUpdate: ref.onUpdate,
|
|
42
|
+
relationName: ref.relationName
|
|
43
|
+
};
|
|
44
|
+
const relationName = ref.relationName || ref.columnName.replace(/Id$/, "").replace(/_id$/, "");
|
|
45
|
+
if (!this.relations.has(schema.__name)) this.relations.set(schema.__name, []);
|
|
46
|
+
this.relations.get(schema.__name).push({
|
|
47
|
+
from: {
|
|
48
|
+
table: schema.__name,
|
|
49
|
+
column: dbColumnName
|
|
50
|
+
},
|
|
51
|
+
to: {
|
|
52
|
+
table: resolved.table,
|
|
53
|
+
column: resolved.column
|
|
54
|
+
},
|
|
55
|
+
relationName
|
|
56
|
+
});
|
|
57
|
+
if (!this.relations.has(resolved.table)) this.relations.set(resolved.table, []);
|
|
58
|
+
const reverseRelationName = schema.__name;
|
|
59
|
+
this.relations.get(resolved.table).push({
|
|
60
|
+
from: {
|
|
61
|
+
table: resolved.table,
|
|
62
|
+
column: resolved.column
|
|
63
|
+
},
|
|
64
|
+
to: {
|
|
65
|
+
table: schema.__name,
|
|
66
|
+
column: dbColumnName
|
|
67
|
+
},
|
|
68
|
+
relationName: reverseRelationName
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get table metadata by name
|
|
74
|
+
* @param {string} name - Table name
|
|
75
|
+
* @returns {TableMetadata | undefined} The table metadata
|
|
76
|
+
*/
|
|
77
|
+
getTable(name) {
|
|
78
|
+
return this.tables.get(name);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get all registered table metadata
|
|
82
|
+
* @returns {Map<string, TableMetadata>} All registered tables
|
|
83
|
+
*/
|
|
84
|
+
getAllTables() {
|
|
85
|
+
return this.tables;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get relations for a table
|
|
89
|
+
* @param {string} tableName - Table name
|
|
90
|
+
* @returns {Array<object>} Relations for the table
|
|
91
|
+
*/
|
|
92
|
+
getRelations(tableName) {
|
|
93
|
+
return this.relations.get(tableName) ?? [];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get the primary key column name for a table (returns DB column name)
|
|
97
|
+
* @param {string} tableName - Table name
|
|
98
|
+
* @returns {string | null} The primary key column name or null
|
|
99
|
+
*/
|
|
100
|
+
getPrimaryKey(tableName) {
|
|
101
|
+
const table = this.tables.get(tableName);
|
|
102
|
+
if (!table) return null;
|
|
103
|
+
for (const col of table.columns) if (col.primaryKey) return col.name;
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get the column name map (code key -> DB column name) for a table
|
|
108
|
+
* @param {string} tableName - Table name
|
|
109
|
+
* @returns {Record<string, string>} Column name map
|
|
110
|
+
*/
|
|
111
|
+
getColumnMap(tableName) {
|
|
112
|
+
return this.columnMaps.get(tableName) ?? {};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get the reverse column name map (DB column name -> code key) for a table
|
|
116
|
+
* @param {string} tableName - Table name
|
|
117
|
+
* @returns {Record<string, string>} Reverse column name map
|
|
118
|
+
*/
|
|
119
|
+
getReverseColumnMap(tableName) {
|
|
120
|
+
return this.reverseColumnMaps.get(tableName) ?? {};
|
|
69
121
|
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
* Get table metadata by name
|
|
73
|
-
* @param {string} name - Table name
|
|
74
|
-
* @returns {TableMetadata | undefined} The table metadata
|
|
75
|
-
*/
|
|
76
|
-
getTable(name) {
|
|
77
|
-
return this.tables.get(name);
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Get all registered table metadata
|
|
81
|
-
* @returns {Map<string, TableMetadata>} All registered tables
|
|
82
|
-
*/
|
|
83
|
-
getAllTables() {
|
|
84
|
-
return this.tables;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Get relations for a table
|
|
88
|
-
* @param {string} tableName - Table name
|
|
89
|
-
* @returns {Array<object>} Relations for the table
|
|
90
|
-
*/
|
|
91
|
-
getRelations(tableName) {
|
|
92
|
-
return this.relations.get(tableName) ?? [];
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Get the primary key column name for a table (returns DB column name)
|
|
96
|
-
* @param {string} tableName - Table name
|
|
97
|
-
* @returns {string | null} The primary key column name or null
|
|
98
|
-
*/
|
|
99
|
-
getPrimaryKey(tableName) {
|
|
100
|
-
const table = this.tables.get(tableName);
|
|
101
|
-
if (!table) return null;
|
|
102
|
-
for (const col of table.columns) if (col.primaryKey) return col.name;
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Get the column name map (code key -> DB column name) for a table
|
|
107
|
-
* @param {string} tableName - Table name
|
|
108
|
-
* @returns {Record<string, string>} Column name map
|
|
109
|
-
*/
|
|
110
|
-
getColumnMap(tableName) {
|
|
111
|
-
return this.columnMaps.get(tableName) ?? {};
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Get the reverse column name map (DB column name -> code key) for a table
|
|
115
|
-
* @param {string} tableName - Table name
|
|
116
|
-
* @returns {Record<string, string>} Reverse column name map
|
|
117
|
-
*/
|
|
118
|
-
getReverseColumnMap(tableName) {
|
|
119
|
-
return this.reverseColumnMaps.get(tableName) ?? {};
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
+
};
|
|
123
|
+
}));
|
|
122
124
|
//#endregion
|
|
123
|
-
|
|
125
|
+
init_registry();
|
|
126
|
+
export { SchemaRegistry, init_registry };
|
|
124
127
|
|
|
125
128
|
//# sourceMappingURL=registry.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.mjs","names":[],"sources":["../../src/schema/registry.ts"],"sourcesContent":["import { SchemaError } from \"../errors\";\nimport type { TableDefinition, TableMetadata } from \"../types\";\n\n/**\n * Schema registry that manages table definitions and resolves references\n */\nexport class SchemaRegistry {\n private tables = new Map<string, TableMetadata>();\n private definitions = new Map<string, TableDefinition>();\n private columnMaps = new Map<string, Record<string, string>>();\n private reverseColumnMaps = new Map<string, Record<string, string>>();\n private relations = new Map<\n string,\n Array<{\n from: { table: string; column: string };\n to: { table: string; column: string };\n relationName: string;\n }>\n >();\n\n /**\n * Register table definitions and resolve all deferred references\n * @param {readonly TableDefinition[]} schemas - Table definitions to register\n */\n register(schemas: readonly TableDefinition<any, any, any, any>[]): void {\n for (const schema of schemas) {\n if (!schema.__table || !schema.__name) {\n throw new SchemaError(\"Invalid table definition\");\n }\n\n this.definitions.set(schema.__name, schema);\n this.tables.set(schema.__name, {\n name: schema.__name,\n columns: [...schema.__columns],\n });\n\n const colMap: Record<string, string> = schema.__columnMap ?? {};\n this.columnMaps.set(schema.__name, colMap);\n const reverseMap: Record<string, string> = {};\n for (const [codeKey, dbName] of Object.entries(colMap)) {\n reverseMap[dbName] = codeKey;\n }\n this.reverseColumnMaps.set(schema.__name, reverseMap);\n }\n\n for (const schema of schemas) {\n for (const ref of schema.__deferredRefs) {\n const resolved = ref.resolve();\n if (!resolved.table || !resolved.column) {\n throw new SchemaError(\n `Failed to resolve reference for ${schema.__name}.${ref.columnName}`,\n );\n }\n\n if (!this.tables.has(resolved.table)) {\n throw new SchemaError(\n `Referenced table \"${resolved.table}\" does not exist in schema registry`,\n );\n }\n\n const colMap = this.columnMaps.get(schema.__name) ?? {};\n const dbColumnName = colMap[ref.columnName] ?? ref.columnName;\n const column = schema.__columns.find((c: any) => c.name === dbColumnName);\n if (column) {\n column.references = {\n table: resolved.table,\n column: resolved.column,\n onDelete: ref.onDelete,\n onUpdate: ref.onUpdate,\n relationName: ref.relationName,\n };\n }\n\n const relationName =\n ref.relationName || ref.columnName.replace(/Id$/, \"\").replace(/_id$/, \"\");\n\n if (!this.relations.has(schema.__name)) {\n this.relations.set(schema.__name, []);\n }\n this.relations.get(schema.__name)!.push({\n from: { table: schema.__name, column: dbColumnName },\n to: { table: resolved.table, column: resolved.column },\n relationName,\n });\n\n if (!this.relations.has(resolved.table)) {\n this.relations.set(resolved.table, []);\n }\n const reverseRelationName = schema.__name;\n this.relations.get(resolved.table)!.push({\n from: { table: resolved.table, column: resolved.column },\n to: { table: schema.__name, column: dbColumnName },\n relationName: reverseRelationName,\n });\n }\n }\n }\n\n /**\n * Get table metadata by name\n * @param {string} name - Table name\n * @returns {TableMetadata | undefined} The table metadata\n */\n getTable(name: string): TableMetadata | undefined {\n return this.tables.get(name);\n }\n\n /**\n * Get all registered table metadata\n * @returns {Map<string, TableMetadata>} All registered tables\n */\n getAllTables(): Map<string, TableMetadata> {\n return this.tables;\n }\n\n /**\n * Get relations for a table\n * @param {string} tableName - Table name\n * @returns {Array<object>} Relations for the table\n */\n getRelations(tableName: string): Array<{\n from: { table: string; column: string };\n to: { table: string; column: string };\n relationName: string;\n }> {\n return this.relations.get(tableName) ?? [];\n }\n\n /**\n * Get the primary key column name for a table (returns DB column name)\n * @param {string} tableName - Table name\n * @returns {string | null} The primary key column name or null\n */\n getPrimaryKey(tableName: string): string | null {\n const table = this.tables.get(tableName);\n if (!table) {\n return null;\n }\n for (const col of table.columns) {\n if (col.primaryKey) {\n return col.name;\n }\n }\n return null;\n }\n\n /**\n * Get the column name map (code key -> DB column name) for a table\n * @param {string} tableName - Table name\n * @returns {Record<string, string>} Column name map\n */\n getColumnMap(tableName: string): Record<string, string> {\n return this.columnMaps.get(tableName) ?? {};\n }\n\n /**\n * Get the reverse column name map (DB column name -> code key) for a table\n * @param {string} tableName - Table name\n * @returns {Record<string, string>} Reverse column name map\n */\n getReverseColumnMap(tableName: string): Record<string, string> {\n return this.reverseColumnMaps.get(tableName) ?? {};\n }\n}\n"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"registry.mjs","names":[],"sources":["../../src/schema/registry.ts"],"sourcesContent":["import { SchemaError } from \"../errors\";\nimport type { TableDefinition, TableMetadata } from \"../types\";\n\n/**\n * Schema registry that manages table definitions and resolves references\n */\nexport class SchemaRegistry {\n private tables = new Map<string, TableMetadata>();\n private definitions = new Map<string, TableDefinition>();\n private columnMaps = new Map<string, Record<string, string>>();\n private reverseColumnMaps = new Map<string, Record<string, string>>();\n private relations = new Map<\n string,\n Array<{\n from: { table: string; column: string };\n to: { table: string; column: string };\n relationName: string;\n }>\n >();\n\n /**\n * Register table definitions and resolve all deferred references\n * @param {readonly TableDefinition[]} schemas - Table definitions to register\n */\n register(schemas: readonly TableDefinition<any, any, any, any>[]): void {\n for (const schema of schemas) {\n if (!schema.__table || !schema.__name) {\n throw new SchemaError(\"Invalid table definition\");\n }\n\n this.definitions.set(schema.__name, schema);\n this.tables.set(schema.__name, {\n name: schema.__name,\n columns: [...schema.__columns],\n });\n\n const colMap: Record<string, string> = schema.__columnMap ?? {};\n this.columnMaps.set(schema.__name, colMap);\n const reverseMap: Record<string, string> = {};\n for (const [codeKey, dbName] of Object.entries(colMap)) {\n reverseMap[dbName] = codeKey;\n }\n this.reverseColumnMaps.set(schema.__name, reverseMap);\n }\n\n for (const schema of schemas) {\n for (const ref of schema.__deferredRefs) {\n const resolved = ref.resolve();\n if (!resolved.table || !resolved.column) {\n throw new SchemaError(\n `Failed to resolve reference for ${schema.__name}.${ref.columnName}`,\n );\n }\n\n if (!this.tables.has(resolved.table)) {\n throw new SchemaError(\n `Referenced table \"${resolved.table}\" does not exist in schema registry`,\n );\n }\n\n const colMap = this.columnMaps.get(schema.__name) ?? {};\n const dbColumnName = colMap[ref.columnName] ?? ref.columnName;\n const column = schema.__columns.find((c: any) => c.name === dbColumnName);\n if (column) {\n column.references = {\n table: resolved.table,\n column: resolved.column,\n onDelete: ref.onDelete,\n onUpdate: ref.onUpdate,\n relationName: ref.relationName,\n };\n }\n\n const relationName =\n ref.relationName || ref.columnName.replace(/Id$/, \"\").replace(/_id$/, \"\");\n\n if (!this.relations.has(schema.__name)) {\n this.relations.set(schema.__name, []);\n }\n this.relations.get(schema.__name)!.push({\n from: { table: schema.__name, column: dbColumnName },\n to: { table: resolved.table, column: resolved.column },\n relationName,\n });\n\n if (!this.relations.has(resolved.table)) {\n this.relations.set(resolved.table, []);\n }\n const reverseRelationName = schema.__name;\n this.relations.get(resolved.table)!.push({\n from: { table: resolved.table, column: resolved.column },\n to: { table: schema.__name, column: dbColumnName },\n relationName: reverseRelationName,\n });\n }\n }\n }\n\n /**\n * Get table metadata by name\n * @param {string} name - Table name\n * @returns {TableMetadata | undefined} The table metadata\n */\n getTable(name: string): TableMetadata | undefined {\n return this.tables.get(name);\n }\n\n /**\n * Get all registered table metadata\n * @returns {Map<string, TableMetadata>} All registered tables\n */\n getAllTables(): Map<string, TableMetadata> {\n return this.tables;\n }\n\n /**\n * Get relations for a table\n * @param {string} tableName - Table name\n * @returns {Array<object>} Relations for the table\n */\n getRelations(tableName: string): Array<{\n from: { table: string; column: string };\n to: { table: string; column: string };\n relationName: string;\n }> {\n return this.relations.get(tableName) ?? [];\n }\n\n /**\n * Get the primary key column name for a table (returns DB column name)\n * @param {string} tableName - Table name\n * @returns {string | null} The primary key column name or null\n */\n getPrimaryKey(tableName: string): string | null {\n const table = this.tables.get(tableName);\n if (!table) {\n return null;\n }\n for (const col of table.columns) {\n if (col.primaryKey) {\n return col.name;\n }\n }\n return null;\n }\n\n /**\n * Get the column name map (code key -> DB column name) for a table\n * @param {string} tableName - Table name\n * @returns {Record<string, string>} Column name map\n */\n getColumnMap(tableName: string): Record<string, string> {\n return this.columnMaps.get(tableName) ?? {};\n }\n\n /**\n * Get the reverse column name map (DB column name -> code key) for a table\n * @param {string} tableName - Table name\n * @returns {Record<string, string>} Reverse column name map\n */\n getReverseColumnMap(tableName: string): Record<string, string> {\n return this.reverseColumnMaps.get(tableName) ?? {};\n }\n}\n"],"mappings":"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"}
|