@hedystia/db 2.0.9 → 2.0.11
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/core/database.cjs +6 -2
- package/dist/core/database.cjs.map +1 -1
- package/dist/core/database.d.cts +3 -3
- package/dist/core/database.d.mts +3 -3
- package/dist/core/database.mjs +6 -2
- package/dist/core/database.mjs.map +1 -1
- package/dist/core/repository.cjs +32 -16
- package/dist/core/repository.cjs.map +1 -1
- package/dist/core/repository.d.cts +2 -0
- package/dist/core/repository.d.mts +2 -0
- package/dist/core/repository.mjs +33 -16
- package/dist/core/repository.mjs.map +1 -1
- package/dist/drivers/index.cjs +2 -0
- package/dist/drivers/index.cjs.map +1 -1
- package/dist/drivers/index.mjs +3 -0
- package/dist/drivers/index.mjs.map +1 -1
- package/dist/drivers/mysql.cjs +2 -1
- package/dist/drivers/mysql.cjs.map +1 -1
- package/dist/drivers/mysql.mjs +2 -1
- package/dist/drivers/mysql.mjs.map +1 -1
- package/dist/drivers/s3.cjs +282 -0
- package/dist/drivers/s3.cjs.map +1 -0
- package/dist/drivers/s3.mjs +286 -0
- package/dist/drivers/s3.mjs.map +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/schema/registry.cjs +2 -2
- package/dist/schema/registry.cjs.map +1 -1
- package/dist/schema/registry.d.cts +1 -1
- package/dist/schema/registry.d.mts +1 -1
- package/dist/schema/registry.mjs +2 -2
- package/dist/schema/registry.mjs.map +1 -1
- package/dist/types.d.cts +31 -11
- package/dist/types.d.mts +31 -11
- package/package.json +6 -2
- package/readme.md +62 -70
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.mjs";
|
|
2
|
+
import { DriverError, init_errors } from "../errors.mjs";
|
|
3
|
+
import { BaseDriver, init_driver } from "./driver.mjs";
|
|
4
|
+
//#region src/drivers/s3.ts
|
|
5
|
+
var S3Driver;
|
|
6
|
+
var init_s3 = __esmMin((() => {
|
|
7
|
+
init_errors();
|
|
8
|
+
init_driver();
|
|
9
|
+
S3Driver = class extends BaseDriver {
|
|
10
|
+
config;
|
|
11
|
+
data = /* @__PURE__ */ new Map();
|
|
12
|
+
client = null;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
super();
|
|
15
|
+
this.config = config;
|
|
16
|
+
}
|
|
17
|
+
getKey(tableName) {
|
|
18
|
+
return `${this.config.prefix ? `${this.config.prefix}/` : ""}${tableName}.json`;
|
|
19
|
+
}
|
|
20
|
+
async connect() {
|
|
21
|
+
if (this.connected) return;
|
|
22
|
+
try {
|
|
23
|
+
const { S3Client, HeadBucketCommand } = await import("@aws-sdk/client-s3");
|
|
24
|
+
const clientConfig = {};
|
|
25
|
+
if (this.config.region) clientConfig.region = this.config.region;
|
|
26
|
+
if (this.config.endpoint) {
|
|
27
|
+
clientConfig.endpoint = this.config.endpoint;
|
|
28
|
+
clientConfig.forcePathStyle = true;
|
|
29
|
+
}
|
|
30
|
+
if (this.config.accessKeyId && this.config.secretAccessKey) clientConfig.credentials = {
|
|
31
|
+
accessKeyId: this.config.accessKeyId,
|
|
32
|
+
secretAccessKey: this.config.secretAccessKey
|
|
33
|
+
};
|
|
34
|
+
this.client = new S3Client(clientConfig);
|
|
35
|
+
try {
|
|
36
|
+
await this.client.send(new HeadBucketCommand({ Bucket: this.config.bucket }));
|
|
37
|
+
} catch (err) {
|
|
38
|
+
if (err.name === "NotFound" || err.$metadata?.httpStatusCode === 404) {
|
|
39
|
+
const { CreateBucketCommand } = await import("@aws-sdk/client-s3");
|
|
40
|
+
await this.client.send(new CreateBucketCommand({ Bucket: this.config.bucket }));
|
|
41
|
+
} else if (err.$metadata?.httpStatusCode !== 200) throw err;
|
|
42
|
+
}
|
|
43
|
+
await this.loadAll();
|
|
44
|
+
this.connected = true;
|
|
45
|
+
} catch (err) {
|
|
46
|
+
throw new DriverError(`Failed to connect to S3: ${err.message}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async disconnect() {
|
|
50
|
+
await this.flushAll();
|
|
51
|
+
this.data.clear();
|
|
52
|
+
this.client = null;
|
|
53
|
+
this.connected = false;
|
|
54
|
+
}
|
|
55
|
+
async execute(sql, params = []) {
|
|
56
|
+
return this.executeParsed(sql, params);
|
|
57
|
+
}
|
|
58
|
+
async query(sql, params = []) {
|
|
59
|
+
const result = this.executeParsed(sql, params);
|
|
60
|
+
return Array.isArray(result) ? result : [];
|
|
61
|
+
}
|
|
62
|
+
async tableExists(name) {
|
|
63
|
+
return this.data.has(name);
|
|
64
|
+
}
|
|
65
|
+
async getTableColumns(name) {
|
|
66
|
+
const table = this.data.get(name);
|
|
67
|
+
if (!table) return [];
|
|
68
|
+
return Object.values(table.meta.columns);
|
|
69
|
+
}
|
|
70
|
+
async createTable(meta) {
|
|
71
|
+
if (this.data.has(meta.name)) return;
|
|
72
|
+
this.data.set(meta.name, {
|
|
73
|
+
rows: [],
|
|
74
|
+
autoIncrementId: 0,
|
|
75
|
+
meta: { columns: [...meta.columns] }
|
|
76
|
+
});
|
|
77
|
+
await this.flush(meta.name);
|
|
78
|
+
}
|
|
79
|
+
async dropTable(name) {
|
|
80
|
+
this.data.delete(name);
|
|
81
|
+
try {
|
|
82
|
+
const { DeleteObjectCommand } = await import("@aws-sdk/client-s3");
|
|
83
|
+
await this.client.send(new DeleteObjectCommand({
|
|
84
|
+
Bucket: this.config.bucket,
|
|
85
|
+
Key: this.getKey(name)
|
|
86
|
+
}));
|
|
87
|
+
} catch {}
|
|
88
|
+
}
|
|
89
|
+
async addColumn(table, column) {
|
|
90
|
+
const tableData = this.data.get(table);
|
|
91
|
+
if (!tableData) throw new DriverError(`Table "${table}" does not exist`);
|
|
92
|
+
tableData.meta.columns.push(column);
|
|
93
|
+
for (const row of tableData.rows) row[column.name] = column.defaultValue ?? null;
|
|
94
|
+
await this.flush(table);
|
|
95
|
+
}
|
|
96
|
+
async dropColumn(table, name) {
|
|
97
|
+
const tableData = this.data.get(table);
|
|
98
|
+
if (!tableData) throw new DriverError(`Table "${table}" does not exist`);
|
|
99
|
+
tableData.meta.columns = tableData.meta.columns.filter((c) => c.name !== name);
|
|
100
|
+
for (const row of tableData.rows) delete row[name];
|
|
101
|
+
await this.flush(table);
|
|
102
|
+
}
|
|
103
|
+
async renameColumn(table, oldName, newName) {
|
|
104
|
+
const tableData = this.data.get(table);
|
|
105
|
+
if (!tableData) throw new DriverError(`Table "${table}" does not exist`);
|
|
106
|
+
const col = tableData.meta.columns.find((c) => c.name === oldName);
|
|
107
|
+
if (col) col.name = newName;
|
|
108
|
+
for (const row of tableData.rows) {
|
|
109
|
+
row[newName] = row[oldName];
|
|
110
|
+
delete row[oldName];
|
|
111
|
+
}
|
|
112
|
+
await this.flush(table);
|
|
113
|
+
}
|
|
114
|
+
async transaction(fn) {
|
|
115
|
+
const snapshot = /* @__PURE__ */ new Map();
|
|
116
|
+
for (const [name, tableData] of this.data) snapshot.set(name, JSON.stringify(tableData));
|
|
117
|
+
try {
|
|
118
|
+
const result = await fn();
|
|
119
|
+
await this.flushAll();
|
|
120
|
+
return result;
|
|
121
|
+
} catch (err) {
|
|
122
|
+
for (const [name, json] of snapshot) this.data.set(name, JSON.parse(json));
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async getAllTableColumns() {
|
|
127
|
+
const result = {};
|
|
128
|
+
for (const [name, tableData] of this.data) result[name] = [...tableData.meta.columns];
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
getTableData(tableName) {
|
|
132
|
+
return this.data.get(tableName);
|
|
133
|
+
}
|
|
134
|
+
insertRow(tableName, row) {
|
|
135
|
+
const tableData = this.data.get(tableName);
|
|
136
|
+
if (!tableData) throw new DriverError(`Table "${tableName}" does not exist`);
|
|
137
|
+
let pkCol = null;
|
|
138
|
+
for (const col of tableData.meta.columns) if (col.autoIncrement) {
|
|
139
|
+
pkCol = col.name;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
if (pkCol && row[pkCol] === void 0) {
|
|
143
|
+
tableData.autoIncrementId++;
|
|
144
|
+
row[pkCol] = tableData.autoIncrementId;
|
|
145
|
+
}
|
|
146
|
+
tableData.rows.push({ ...row });
|
|
147
|
+
this.flush(tableName);
|
|
148
|
+
return pkCol ? row[pkCol] : 0;
|
|
149
|
+
}
|
|
150
|
+
findRows(tableName, filter) {
|
|
151
|
+
const tableData = this.data.get(tableName);
|
|
152
|
+
if (!tableData) return [];
|
|
153
|
+
if (!filter) return tableData.rows.map((r) => ({ ...r }));
|
|
154
|
+
return tableData.rows.filter(filter).map((r) => ({ ...r }));
|
|
155
|
+
}
|
|
156
|
+
updateRows(tableName, filter, data) {
|
|
157
|
+
const tableData = this.data.get(tableName);
|
|
158
|
+
if (!tableData) return 0;
|
|
159
|
+
let count = 0;
|
|
160
|
+
for (const row of tableData.rows) if (filter(row)) {
|
|
161
|
+
Object.assign(row, data);
|
|
162
|
+
count++;
|
|
163
|
+
}
|
|
164
|
+
if (count > 0) this.flush(tableName);
|
|
165
|
+
return count;
|
|
166
|
+
}
|
|
167
|
+
deleteRows(tableName, filter) {
|
|
168
|
+
const tableData = this.data.get(tableName);
|
|
169
|
+
if (!tableData) return 0;
|
|
170
|
+
const before = tableData.rows.length;
|
|
171
|
+
tableData.rows = tableData.rows.filter((r) => !filter(r));
|
|
172
|
+
const deleted = before - tableData.rows.length;
|
|
173
|
+
if (deleted > 0) this.flush(tableName);
|
|
174
|
+
return deleted;
|
|
175
|
+
}
|
|
176
|
+
truncateTable(tableName) {
|
|
177
|
+
const tableData = this.data.get(tableName);
|
|
178
|
+
if (tableData) {
|
|
179
|
+
tableData.rows = [];
|
|
180
|
+
tableData.autoIncrementId = 0;
|
|
181
|
+
this.flush(tableName);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
countRows(tableName, filter) {
|
|
185
|
+
const tableData = this.data.get(tableName);
|
|
186
|
+
if (!tableData) return 0;
|
|
187
|
+
if (!filter) return tableData.rows.length;
|
|
188
|
+
return tableData.rows.filter(filter).length;
|
|
189
|
+
}
|
|
190
|
+
async loadAll() {
|
|
191
|
+
try {
|
|
192
|
+
const { ListObjectsV2Command, GetObjectCommand } = await import("@aws-sdk/client-s3");
|
|
193
|
+
const prefix = this.config.prefix ? `${this.config.prefix}/` : "";
|
|
194
|
+
const response = await this.client.send(new ListObjectsV2Command({
|
|
195
|
+
Bucket: this.config.bucket,
|
|
196
|
+
Prefix: prefix
|
|
197
|
+
}));
|
|
198
|
+
if (response.Contents) {
|
|
199
|
+
for (const obj of response.Contents) if (obj.Key?.endsWith(".json")) {
|
|
200
|
+
const tableName = obj.Key.replace(prefix, "").replace(".json", "");
|
|
201
|
+
try {
|
|
202
|
+
const body = await (await this.client.send(new GetObjectCommand({
|
|
203
|
+
Bucket: this.config.bucket,
|
|
204
|
+
Key: obj.Key
|
|
205
|
+
}))).Body?.transformToString();
|
|
206
|
+
if (body) this.data.set(tableName, JSON.parse(body));
|
|
207
|
+
} catch {}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
} catch {}
|
|
211
|
+
}
|
|
212
|
+
async flush(tableName) {
|
|
213
|
+
const tableData = this.data.get(tableName);
|
|
214
|
+
if (!tableData || !this.client) return;
|
|
215
|
+
try {
|
|
216
|
+
const { PutObjectCommand } = await import("@aws-sdk/client-s3");
|
|
217
|
+
await this.client.send(new PutObjectCommand({
|
|
218
|
+
Bucket: this.config.bucket,
|
|
219
|
+
Key: this.getKey(tableName),
|
|
220
|
+
Body: JSON.stringify(tableData),
|
|
221
|
+
ContentType: "application/json"
|
|
222
|
+
}));
|
|
223
|
+
} catch {}
|
|
224
|
+
}
|
|
225
|
+
async flushAll() {
|
|
226
|
+
for (const [name] of this.data) await this.flush(name);
|
|
227
|
+
}
|
|
228
|
+
executeParsed(sql, params) {
|
|
229
|
+
const trimmed = sql.trim().toUpperCase();
|
|
230
|
+
if (trimmed.startsWith("CREATE TABLE")) return {
|
|
231
|
+
insertId: 0,
|
|
232
|
+
affectedRows: 0
|
|
233
|
+
};
|
|
234
|
+
if (trimmed.startsWith("DROP TABLE")) {
|
|
235
|
+
const match = sql.match(/DROP\s+TABLE\s+(?:IF\s+EXISTS\s+)?`?(\w+)`?/i);
|
|
236
|
+
if (match?.[1]) this.data.delete(match[1]);
|
|
237
|
+
return {
|
|
238
|
+
insertId: 0,
|
|
239
|
+
affectedRows: 0
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
if (trimmed.startsWith("SELECT")) {
|
|
243
|
+
const tableMatch = sql.match(/FROM\s+`?(\w+)`?/i);
|
|
244
|
+
if (!tableMatch) return [];
|
|
245
|
+
const tableName = tableMatch[1];
|
|
246
|
+
if (!tableName) return [];
|
|
247
|
+
return this.findRows(tableName);
|
|
248
|
+
}
|
|
249
|
+
if (trimmed.startsWith("INSERT")) {
|
|
250
|
+
const tableMatch = sql.match(/INTO\s+`?(\w+)`?/i);
|
|
251
|
+
if (!tableMatch) return {
|
|
252
|
+
insertId: 0,
|
|
253
|
+
affectedRows: 0
|
|
254
|
+
};
|
|
255
|
+
const colMatch = sql.match(/\(([^)]+)\)\s+VALUES/i);
|
|
256
|
+
if (!colMatch) return {
|
|
257
|
+
insertId: 0,
|
|
258
|
+
affectedRows: 0
|
|
259
|
+
};
|
|
260
|
+
const cols = colMatch[1]?.split(",").map((c) => c.trim().replace(/`/g, ""));
|
|
261
|
+
if (!cols) return {
|
|
262
|
+
insertId: 0,
|
|
263
|
+
affectedRows: 0
|
|
264
|
+
};
|
|
265
|
+
const row = {};
|
|
266
|
+
for (let i = 0; i < cols.length; i++) {
|
|
267
|
+
const col = cols[i];
|
|
268
|
+
if (col) row[col] = params[i];
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
insertId: this.insertRow(tableMatch[1], row),
|
|
272
|
+
affectedRows: 1
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
insertId: 0,
|
|
277
|
+
affectedRows: 0
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
}));
|
|
282
|
+
//#endregion
|
|
283
|
+
init_s3();
|
|
284
|
+
export { S3Driver, init_s3 };
|
|
285
|
+
|
|
286
|
+
//# sourceMappingURL=s3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.mjs","names":[],"sources":["../../src/drivers/s3.ts"],"sourcesContent":["import { DriverError } from \"../errors\";\nimport type { ColumnMetadata, S3ConnectionConfig, TableMetadata } from \"../types\";\nimport { BaseDriver } from \"./driver\";\n\ninterface S3TableData {\n rows: Record<string, unknown>[];\n autoIncrementId: number;\n meta: {\n columns: ColumnMetadata[];\n };\n}\n\n/**\n * S3-based database driver using JSON objects for storage\n */\nexport class S3Driver extends BaseDriver {\n private config: S3ConnectionConfig;\n private data = new Map<string, S3TableData>();\n private client: any = null;\n\n constructor(config: S3ConnectionConfig) {\n super();\n this.config = config;\n }\n\n private getKey(tableName: string): string {\n const prefix = this.config.prefix ? `${this.config.prefix}/` : \"\";\n return `${prefix}${tableName}.json`;\n }\n\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n const { S3Client, HeadBucketCommand } = await import(\"@aws-sdk/client-s3\");\n const clientConfig: any = {};\n if (this.config.region) {\n clientConfig.region = this.config.region;\n }\n if (this.config.endpoint) {\n clientConfig.endpoint = this.config.endpoint;\n clientConfig.forcePathStyle = true;\n }\n if (this.config.accessKeyId && this.config.secretAccessKey) {\n clientConfig.credentials = {\n accessKeyId: this.config.accessKeyId,\n secretAccessKey: this.config.secretAccessKey,\n };\n }\n this.client = new S3Client(clientConfig);\n\n try {\n await this.client.send(new HeadBucketCommand({ Bucket: this.config.bucket }));\n } catch (err: any) {\n if (err.name === \"NotFound\" || err.$metadata?.httpStatusCode === 404) {\n const { CreateBucketCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(new CreateBucketCommand({ Bucket: this.config.bucket }));\n } else if (err.$metadata?.httpStatusCode !== 200) {\n throw err;\n }\n }\n\n await this.loadAll();\n this.connected = true;\n } catch (err: any) {\n throw new DriverError(`Failed to connect to S3: ${err.message}`);\n }\n }\n\n async disconnect(): Promise<void> {\n await this.flushAll();\n this.data.clear();\n this.client = null;\n this.connected = false;\n }\n\n async execute(sql: string, params: unknown[] = []): Promise<any> {\n return this.executeParsed(sql, params);\n }\n\n async query(sql: string, params: unknown[] = []): Promise<any[]> {\n const result = this.executeParsed(sql, params);\n return Array.isArray(result) ? result : [];\n }\n\n async tableExists(name: string): Promise<boolean> {\n return this.data.has(name);\n }\n\n async getTableColumns(name: string): Promise<ColumnMetadata[]> {\n const table = this.data.get(name);\n if (!table) {\n return [];\n }\n return Object.values(table.meta.columns);\n }\n\n async createTable(meta: TableMetadata): Promise<void> {\n if (this.data.has(meta.name)) {\n return;\n }\n this.data.set(meta.name, {\n rows: [],\n autoIncrementId: 0,\n meta: { columns: [...meta.columns] },\n });\n await this.flush(meta.name);\n }\n\n async dropTable(name: string): Promise<void> {\n this.data.delete(name);\n try {\n const { DeleteObjectCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(\n new DeleteObjectCommand({\n Bucket: this.config.bucket,\n Key: this.getKey(name),\n }),\n );\n } catch {}\n }\n\n async addColumn(table: string, column: ColumnMetadata): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n tableData.meta.columns.push(column);\n for (const row of tableData.rows) {\n row[column.name] = column.defaultValue ?? null;\n }\n await this.flush(table);\n }\n\n async dropColumn(table: string, name: string): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n tableData.meta.columns = tableData.meta.columns.filter((c) => c.name !== name);\n for (const row of tableData.rows) {\n delete row[name];\n }\n await this.flush(table);\n }\n\n async renameColumn(table: string, oldName: string, newName: string): Promise<void> {\n const tableData = this.data.get(table);\n if (!tableData) {\n throw new DriverError(`Table \"${table}\" does not exist`);\n }\n const col = tableData.meta.columns.find((c) => c.name === oldName);\n if (col) {\n col.name = newName;\n }\n for (const row of tableData.rows) {\n row[newName] = row[oldName];\n delete row[oldName];\n }\n await this.flush(table);\n }\n\n async transaction<T>(fn: () => Promise<T>): Promise<T> {\n const snapshot = new Map<string, string>();\n for (const [name, tableData] of this.data) {\n snapshot.set(name, JSON.stringify(tableData));\n }\n try {\n const result = await fn();\n await this.flushAll();\n return result;\n } catch (err) {\n for (const [name, json] of snapshot) {\n this.data.set(name, JSON.parse(json));\n }\n throw err;\n }\n }\n\n async getAllTableColumns(): Promise<Record<string, ColumnMetadata[]>> {\n const result: Record<string, ColumnMetadata[]> = {};\n for (const [name, tableData] of this.data) {\n result[name] = [...tableData.meta.columns];\n }\n return result;\n }\n\n getTableData(tableName: string): S3TableData | undefined {\n return this.data.get(tableName);\n }\n\n insertRow(tableName: string, row: Record<string, unknown>): number {\n const tableData = this.data.get(tableName);\n if (!tableData) {\n throw new DriverError(`Table \"${tableName}\" does not exist`);\n }\n let pkCol: string | null = null;\n for (const col of tableData.meta.columns) {\n if (col.autoIncrement) {\n pkCol = col.name;\n break;\n }\n }\n if (pkCol && row[pkCol] === undefined) {\n tableData.autoIncrementId++;\n row[pkCol] = tableData.autoIncrementId;\n }\n tableData.rows.push({ ...row });\n this.flush(tableName);\n return pkCol ? (row[pkCol] as number) : 0;\n }\n\n findRows(\n tableName: string,\n filter?: (row: Record<string, unknown>) => boolean,\n ): Record<string, unknown>[] {\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return [];\n }\n if (!filter) {\n return tableData.rows.map((r) => ({ ...r }));\n }\n return tableData.rows.filter(filter).map((r) => ({ ...r }));\n }\n\n updateRows(\n tableName: string,\n filter: (row: Record<string, unknown>) => boolean,\n data: Record<string, unknown>,\n ): number {\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return 0;\n }\n let count = 0;\n for (const row of tableData.rows) {\n if (filter(row)) {\n Object.assign(row, data);\n count++;\n }\n }\n if (count > 0) {\n this.flush(tableName);\n }\n return count;\n }\n\n deleteRows(tableName: string, filter: (row: Record<string, unknown>) => boolean): number {\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return 0;\n }\n const before = tableData.rows.length;\n tableData.rows = tableData.rows.filter((r) => !filter(r));\n const deleted = before - tableData.rows.length;\n if (deleted > 0) {\n this.flush(tableName);\n }\n return deleted;\n }\n\n truncateTable(tableName: string): void {\n const tableData = this.data.get(tableName);\n if (tableData) {\n tableData.rows = [];\n tableData.autoIncrementId = 0;\n this.flush(tableName);\n }\n }\n\n countRows(tableName: string, filter?: (row: Record<string, unknown>) => boolean): number {\n const tableData = this.data.get(tableName);\n if (!tableData) {\n return 0;\n }\n if (!filter) {\n return tableData.rows.length;\n }\n return tableData.rows.filter(filter).length;\n }\n\n private async loadAll(): Promise<void> {\n try {\n const { ListObjectsV2Command, GetObjectCommand } = await import(\"@aws-sdk/client-s3\");\n const prefix = this.config.prefix ? `${this.config.prefix}/` : \"\";\n const response = await this.client.send(\n new ListObjectsV2Command({\n Bucket: this.config.bucket,\n Prefix: prefix,\n }),\n );\n\n if (response.Contents) {\n for (const obj of response.Contents) {\n if (obj.Key?.endsWith(\".json\")) {\n const tableName = obj.Key.replace(prefix, \"\").replace(\".json\", \"\");\n try {\n const getResponse = await this.client.send(\n new GetObjectCommand({\n Bucket: this.config.bucket,\n Key: obj.Key,\n }),\n );\n const body = await getResponse.Body?.transformToString();\n if (body) {\n this.data.set(tableName, JSON.parse(body));\n }\n } catch {}\n }\n }\n }\n } catch {}\n }\n\n private async flush(tableName: string): Promise<void> {\n const tableData = this.data.get(tableName);\n if (!tableData || !this.client) {\n return;\n }\n try {\n const { PutObjectCommand } = await import(\"@aws-sdk/client-s3\");\n await this.client.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: this.getKey(tableName),\n Body: JSON.stringify(tableData),\n ContentType: \"application/json\",\n }),\n );\n } catch {}\n }\n\n private async flushAll(): Promise<void> {\n for (const [name] of this.data) {\n await this.flush(name);\n }\n }\n\n private executeParsed(sql: string, params: unknown[]): any {\n const trimmed = sql.trim().toUpperCase();\n if (trimmed.startsWith(\"CREATE TABLE\")) {\n return { insertId: 0, affectedRows: 0 };\n }\n if (trimmed.startsWith(\"DROP TABLE\")) {\n const match = sql.match(/DROP\\s+TABLE\\s+(?:IF\\s+EXISTS\\s+)?`?(\\w+)`?/i);\n if (match?.[1]) {\n this.data.delete(match[1]);\n }\n return { insertId: 0, affectedRows: 0 };\n }\n if (trimmed.startsWith(\"SELECT\")) {\n const tableMatch = sql.match(/FROM\\s+`?(\\w+)`?/i);\n if (!tableMatch) {\n return [];\n }\n const tableName = tableMatch[1];\n if (!tableName) {\n return [];\n }\n return this.findRows(tableName);\n }\n if (trimmed.startsWith(\"INSERT\")) {\n const tableMatch = sql.match(/INTO\\s+`?(\\w+)`?/i);\n if (!tableMatch) {\n return { insertId: 0, affectedRows: 0 };\n }\n const colMatch = sql.match(/\\(([^)]+)\\)\\s+VALUES/i);\n if (!colMatch) {\n return { insertId: 0, affectedRows: 0 };\n }\n const cols = colMatch[1]?.split(\",\").map((c) => c.trim().replace(/`/g, \"\"));\n if (!cols) {\n return { insertId: 0, affectedRows: 0 };\n }\n const row: Record<string, unknown> = {};\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n if (col) {\n row[col] = params[i];\n }\n }\n const id = this.insertRow(tableMatch[1]!, row);\n return { insertId: id, affectedRows: 1 };\n }\n return { insertId: 0, affectedRows: 0 };\n }\n}\n"],"mappings":"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"}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["database"],"sources":["../src/index.ts"],"sourcesContent":["import { CacheManager } from \"./cache\";\nimport { database } from \"./core/database\";\nimport { TableRepository } from \"./core/repository\";\nimport { createDriver } from \"./drivers\";\nimport {\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n} from \"./drivers/sql-compiler\";\nimport { migration } from \"./migrations/definition\";\nimport { generateMigrationTemplate, generateSchemaTemplate } from \"./migrations/templates\";\nimport { ColumnBuilder } from \"./schema/column\";\nimport * as columns from \"./schema/columns\";\nimport { SchemaRegistry } from \"./schema/registry\";\nimport { table } from \"./schema/table\";\nimport { Synchronizer } from \"./sync/synchronizer\";\n\nexport {\n CacheError,\n DatabaseError,\n DriverError,\n MigrationError,\n QueryError,\n SchemaError,\n SyncError,\n} from \"./errors\";\nexport * from \"./schema/columns\";\nexport type {\n CacheConfig,\n ColumnDataType,\n ColumnMetadata,\n ConnectionConfig,\n DatabaseConfig,\n DatabaseDriver,\n DatabaseType,\n DeferredRefMeta,\n DeleteOptions,\n FileConnectionConfig,\n InferInsert,\n InferRow,\n InferUpdate,\n MigrationContext,\n MigrationDefinition,\n MySQLConnectionConfig,\n QueryOptions,\n ReferenceAction,\n RelationQueryMap,\n RelationsFor,\n Repository,\n ResolveResult,\n SQLiteConnectionConfig,\n TableCacheConfig,\n TableDefinition,\n TableMetadata,\n UpdateOptions,\n WhereClause,\n WhereCondition,\n} from \"./types\";\nexport {\n CacheManager,\n ColumnBuilder,\n columns,\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n createDriver,\n database,\n generateMigrationTemplate,\n generateSchemaTemplate,\n migration,\n SchemaRegistry,\n Synchronizer,\n TableRepository,\n table,\n};\n\nexport default database;\n"],"mappings":";;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["database"],"sources":["../src/index.ts"],"sourcesContent":["import { CacheManager } from \"./cache\";\nimport { database } from \"./core/database\";\nimport { TableRepository } from \"./core/repository\";\nimport { createDriver } from \"./drivers\";\nimport {\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n} from \"./drivers/sql-compiler\";\nimport { migration } from \"./migrations/definition\";\nimport { generateMigrationTemplate, generateSchemaTemplate } from \"./migrations/templates\";\nimport { ColumnBuilder } from \"./schema/column\";\nimport * as columns from \"./schema/columns\";\nimport { SchemaRegistry } from \"./schema/registry\";\nimport { table } from \"./schema/table\";\nimport { Synchronizer } from \"./sync/synchronizer\";\n\nexport {\n CacheError,\n DatabaseError,\n DriverError,\n MigrationError,\n QueryError,\n SchemaError,\n SyncError,\n} from \"./errors\";\nexport * from \"./schema/columns\";\nexport type {\n CacheConfig,\n ColumnDataType,\n ColumnMetadata,\n ConnectionConfig,\n DatabaseConfig,\n DatabaseDriver,\n DatabaseType,\n DeferredRefMeta,\n DeleteOptions,\n FileConnectionConfig,\n InferInsert,\n InferRow,\n InferUpdate,\n MigrationContext,\n MigrationDefinition,\n MySQLConnectionConfig,\n QueryOptions,\n ReferenceAction,\n RelationQueryMap,\n RelationsFor,\n Repository,\n ResolveResult,\n S3ConnectionConfig,\n SQLiteConnectionConfig,\n TableCacheConfig,\n TableDefinition,\n TableMetadata,\n UpdateOptions,\n WhereClause,\n WhereCondition,\n} from \"./types\";\nexport {\n CacheManager,\n ColumnBuilder,\n columns,\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n createDriver,\n database,\n generateMigrationTemplate,\n generateSchemaTemplate,\n migration,\n SchemaRegistry,\n Synchronizer,\n TableRepository,\n table,\n};\n\nexport default database;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqFA,IAAA,cAAeA,iBAAAA"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CacheConfig, ColumnDataType, ColumnMetadata, ConnectionConfig, DatabaseConfig, DatabaseDriver, DatabaseType, DeferredRefMeta, DeleteOptions, FileConnectionConfig, InferInsert, InferRow, InferUpdate, MigrationContext, MigrationDefinition, MySQLConnectionConfig, QueryOptions, ReferenceAction, RelationQueryMap, RelationsFor, Repository, ResolveResult, SQLiteConnectionConfig, TableCacheConfig, TableDefinition, TableMetadata, UpdateOptions, WhereClause, WhereCondition } from "./types.cjs";
|
|
1
|
+
import { CacheConfig, ColumnDataType, ColumnMetadata, ConnectionConfig, DatabaseConfig, DatabaseDriver, DatabaseType, DeferredRefMeta, DeleteOptions, FileConnectionConfig, InferInsert, InferRow, InferUpdate, MigrationContext, MigrationDefinition, MySQLConnectionConfig, QueryOptions, ReferenceAction, RelationQueryMap, RelationsFor, Repository, ResolveResult, S3ConnectionConfig, SQLiteConnectionConfig, TableCacheConfig, TableDefinition, TableMetadata, UpdateOptions, WhereClause, WhereCondition } from "./types.cjs";
|
|
2
2
|
import { CacheManager } from "./cache/manager.cjs";
|
|
3
3
|
import { ColumnBuilder } from "./schema/column.cjs";
|
|
4
4
|
import { NamedColumnStarter, array, bigint, blob, boolean, char, d, datetime, decimal, float, index_d_exports, integer, json, name, text, timestamp, varchar } from "./schema/columns/index.cjs";
|
|
@@ -12,4 +12,4 @@ import { migration } from "./migrations/definition.cjs";
|
|
|
12
12
|
import { generateMigrationTemplate, generateSchemaTemplate } from "./migrations/templates.cjs";
|
|
13
13
|
import { Synchronizer } from "./sync/synchronizer.cjs";
|
|
14
14
|
import { CacheError, DatabaseError, DriverError, MigrationError, QueryError, SchemaError, SyncError } from "./errors.cjs";
|
|
15
|
-
export { type CacheConfig, CacheError, CacheManager, ColumnBuilder, type ColumnDataType, type ColumnMetadata, type ConnectionConfig, type DatabaseConfig, type DatabaseDriver, DatabaseError, type DatabaseType, type DeferredRefMeta, type DeleteOptions, DriverError, type FileConnectionConfig, type InferInsert, type InferRow, type InferUpdate, type MigrationContext, type MigrationDefinition, MigrationError, type MySQLConnectionConfig, NamedColumnStarter, QueryError, type QueryOptions, type ReferenceAction, type RelationQueryMap, type RelationsFor, type Repository, type ResolveResult, type SQLiteConnectionConfig, SchemaError, SchemaRegistry, SyncError, Synchronizer, type TableCacheConfig, type TableDefinition, type TableMetadata, TableRepository, type UpdateOptions, type WhereClause, type WhereCondition, array, bigint, blob, boolean, char, index_d_exports as columns, compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere, createDriver, d, database, database as default, datetime, decimal, float, generateMigrationTemplate, generateSchemaTemplate, integer, json, migration, name, table, text, timestamp, varchar };
|
|
15
|
+
export { type CacheConfig, CacheError, CacheManager, ColumnBuilder, type ColumnDataType, type ColumnMetadata, type ConnectionConfig, type DatabaseConfig, type DatabaseDriver, DatabaseError, type DatabaseType, type DeferredRefMeta, type DeleteOptions, DriverError, type FileConnectionConfig, type InferInsert, type InferRow, type InferUpdate, type MigrationContext, type MigrationDefinition, MigrationError, type MySQLConnectionConfig, NamedColumnStarter, QueryError, type QueryOptions, type ReferenceAction, type RelationQueryMap, type RelationsFor, type Repository, type ResolveResult, type S3ConnectionConfig, type SQLiteConnectionConfig, SchemaError, SchemaRegistry, SyncError, Synchronizer, type TableCacheConfig, type TableDefinition, type TableMetadata, TableRepository, type UpdateOptions, type WhereClause, type WhereCondition, array, bigint, blob, boolean, char, index_d_exports as columns, compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere, createDriver, d, database, database as default, datetime, decimal, float, generateMigrationTemplate, generateSchemaTemplate, integer, json, migration, name, table, text, timestamp, varchar };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CacheConfig, ColumnDataType, ColumnMetadata, ConnectionConfig, DatabaseConfig, DatabaseDriver, DatabaseType, DeferredRefMeta, DeleteOptions, FileConnectionConfig, InferInsert, InferRow, InferUpdate, MigrationContext, MigrationDefinition, MySQLConnectionConfig, QueryOptions, ReferenceAction, RelationQueryMap, RelationsFor, Repository, ResolveResult, SQLiteConnectionConfig, TableCacheConfig, TableDefinition, TableMetadata, UpdateOptions, WhereClause, WhereCondition } from "./types.mjs";
|
|
1
|
+
import { CacheConfig, ColumnDataType, ColumnMetadata, ConnectionConfig, DatabaseConfig, DatabaseDriver, DatabaseType, DeferredRefMeta, DeleteOptions, FileConnectionConfig, InferInsert, InferRow, InferUpdate, MigrationContext, MigrationDefinition, MySQLConnectionConfig, QueryOptions, ReferenceAction, RelationQueryMap, RelationsFor, Repository, ResolveResult, S3ConnectionConfig, SQLiteConnectionConfig, TableCacheConfig, TableDefinition, TableMetadata, UpdateOptions, WhereClause, WhereCondition } from "./types.mjs";
|
|
2
2
|
import { CacheManager } from "./cache/manager.mjs";
|
|
3
3
|
import { ColumnBuilder } from "./schema/column.mjs";
|
|
4
4
|
import { NamedColumnStarter, array, bigint, blob, boolean, char, d, datetime, decimal, float, index_d_exports, integer, json, name, text, timestamp, varchar } from "./schema/columns/index.mjs";
|
|
@@ -12,4 +12,4 @@ import { migration } from "./migrations/definition.mjs";
|
|
|
12
12
|
import { generateMigrationTemplate, generateSchemaTemplate } from "./migrations/templates.mjs";
|
|
13
13
|
import { Synchronizer } from "./sync/synchronizer.mjs";
|
|
14
14
|
import { CacheError, DatabaseError, DriverError, MigrationError, QueryError, SchemaError, SyncError } from "./errors.mjs";
|
|
15
|
-
export { type CacheConfig, CacheError, CacheManager, ColumnBuilder, type ColumnDataType, type ColumnMetadata, type ConnectionConfig, type DatabaseConfig, type DatabaseDriver, DatabaseError, type DatabaseType, type DeferredRefMeta, type DeleteOptions, DriverError, type FileConnectionConfig, type InferInsert, type InferRow, type InferUpdate, type MigrationContext, type MigrationDefinition, MigrationError, type MySQLConnectionConfig, NamedColumnStarter, QueryError, type QueryOptions, type ReferenceAction, type RelationQueryMap, type RelationsFor, type Repository, type ResolveResult, type SQLiteConnectionConfig, SchemaError, SchemaRegistry, SyncError, Synchronizer, type TableCacheConfig, type TableDefinition, type TableMetadata, TableRepository, type UpdateOptions, type WhereClause, type WhereCondition, array, bigint, blob, boolean, char, index_d_exports as columns, compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere, createDriver, d, database, database as default, datetime, decimal, float, generateMigrationTemplate, generateSchemaTemplate, integer, json, migration, name, table, text, timestamp, varchar };
|
|
15
|
+
export { type CacheConfig, CacheError, CacheManager, ColumnBuilder, type ColumnDataType, type ColumnMetadata, type ConnectionConfig, type DatabaseConfig, type DatabaseDriver, DatabaseError, type DatabaseType, type DeferredRefMeta, type DeleteOptions, DriverError, type FileConnectionConfig, type InferInsert, type InferRow, type InferUpdate, type MigrationContext, type MigrationDefinition, MigrationError, type MySQLConnectionConfig, NamedColumnStarter, QueryError, type QueryOptions, type ReferenceAction, type RelationQueryMap, type RelationsFor, type Repository, type ResolveResult, type S3ConnectionConfig, type SQLiteConnectionConfig, SchemaError, SchemaRegistry, SyncError, Synchronizer, type TableCacheConfig, type TableDefinition, type TableMetadata, TableRepository, type UpdateOptions, type WhereClause, type WhereCondition, array, bigint, blob, boolean, char, index_d_exports as columns, compileColumnDef, compileCreateTable, compileDelete, compileInsert, compileSelect, compileUpdate, compileWhere, createDriver, d, database, database as default, datetime, decimal, float, generateMigrationTemplate, generateSchemaTemplate, integer, json, migration, name, table, text, timestamp, varchar };
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { CacheManager } from \"./cache\";\nimport { database } from \"./core/database\";\nimport { TableRepository } from \"./core/repository\";\nimport { createDriver } from \"./drivers\";\nimport {\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n} from \"./drivers/sql-compiler\";\nimport { migration } from \"./migrations/definition\";\nimport { generateMigrationTemplate, generateSchemaTemplate } from \"./migrations/templates\";\nimport { ColumnBuilder } from \"./schema/column\";\nimport * as columns from \"./schema/columns\";\nimport { SchemaRegistry } from \"./schema/registry\";\nimport { table } from \"./schema/table\";\nimport { Synchronizer } from \"./sync/synchronizer\";\n\nexport {\n CacheError,\n DatabaseError,\n DriverError,\n MigrationError,\n QueryError,\n SchemaError,\n SyncError,\n} from \"./errors\";\nexport * from \"./schema/columns\";\nexport type {\n CacheConfig,\n ColumnDataType,\n ColumnMetadata,\n ConnectionConfig,\n DatabaseConfig,\n DatabaseDriver,\n DatabaseType,\n DeferredRefMeta,\n DeleteOptions,\n FileConnectionConfig,\n InferInsert,\n InferRow,\n InferUpdate,\n MigrationContext,\n MigrationDefinition,\n MySQLConnectionConfig,\n QueryOptions,\n ReferenceAction,\n RelationQueryMap,\n RelationsFor,\n Repository,\n ResolveResult,\n SQLiteConnectionConfig,\n TableCacheConfig,\n TableDefinition,\n TableMetadata,\n UpdateOptions,\n WhereClause,\n WhereCondition,\n} from \"./types\";\nexport {\n CacheManager,\n ColumnBuilder,\n columns,\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n createDriver,\n database,\n generateMigrationTemplate,\n generateSchemaTemplate,\n migration,\n SchemaRegistry,\n Synchronizer,\n TableRepository,\n table,\n};\n\nexport default database;\n"],"mappings":";;;;;;;;;;;;;;;YAAuC;eACI;iBACS;cACX;mBAST;iBACoB;gBACuC;aAC3C;cACJ;eACO;YACZ;aAWrB;;
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { CacheManager } from \"./cache\";\nimport { database } from \"./core/database\";\nimport { TableRepository } from \"./core/repository\";\nimport { createDriver } from \"./drivers\";\nimport {\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n} from \"./drivers/sql-compiler\";\nimport { migration } from \"./migrations/definition\";\nimport { generateMigrationTemplate, generateSchemaTemplate } from \"./migrations/templates\";\nimport { ColumnBuilder } from \"./schema/column\";\nimport * as columns from \"./schema/columns\";\nimport { SchemaRegistry } from \"./schema/registry\";\nimport { table } from \"./schema/table\";\nimport { Synchronizer } from \"./sync/synchronizer\";\n\nexport {\n CacheError,\n DatabaseError,\n DriverError,\n MigrationError,\n QueryError,\n SchemaError,\n SyncError,\n} from \"./errors\";\nexport * from \"./schema/columns\";\nexport type {\n CacheConfig,\n ColumnDataType,\n ColumnMetadata,\n ConnectionConfig,\n DatabaseConfig,\n DatabaseDriver,\n DatabaseType,\n DeferredRefMeta,\n DeleteOptions,\n FileConnectionConfig,\n InferInsert,\n InferRow,\n InferUpdate,\n MigrationContext,\n MigrationDefinition,\n MySQLConnectionConfig,\n QueryOptions,\n ReferenceAction,\n RelationQueryMap,\n RelationsFor,\n Repository,\n ResolveResult,\n S3ConnectionConfig,\n SQLiteConnectionConfig,\n TableCacheConfig,\n TableDefinition,\n TableMetadata,\n UpdateOptions,\n WhereClause,\n WhereCondition,\n} from \"./types\";\nexport {\n CacheManager,\n ColumnBuilder,\n columns,\n compileColumnDef,\n compileCreateTable,\n compileDelete,\n compileInsert,\n compileSelect,\n compileUpdate,\n compileWhere,\n createDriver,\n database,\n generateMigrationTemplate,\n generateSchemaTemplate,\n migration,\n SchemaRegistry,\n Synchronizer,\n TableRepository,\n table,\n};\n\nexport default database;\n"],"mappings":";;;;;;;;;;;;;;;YAAuC;eACI;iBACS;cACX;mBAST;iBACoB;gBACuC;aAC3C;cACJ;eACO;YACZ;aAWrB;;AAwDlB,IAAA,cAAe"}
|
package/dist/schema/registry.cjs
CHANGED
|
@@ -13,7 +13,7 @@ var SchemaRegistry = class {
|
|
|
13
13
|
* Register table definitions and resolve all deferred references
|
|
14
14
|
* @param {readonly TableDefinition[]} schemas - Table definitions to register
|
|
15
15
|
*/
|
|
16
|
-
register(schemas) {
|
|
16
|
+
register(schemas, schemaKeyMap) {
|
|
17
17
|
for (const schema of schemas) {
|
|
18
18
|
if (!schema.__table || !schema.__name) throw new require_errors.SchemaError("Invalid table definition");
|
|
19
19
|
this.definitions.set(schema.__name, schema);
|
|
@@ -54,7 +54,7 @@ var SchemaRegistry = class {
|
|
|
54
54
|
relationName
|
|
55
55
|
});
|
|
56
56
|
if (!this.relations.has(resolved.table)) this.relations.set(resolved.table, []);
|
|
57
|
-
const reverseRelationName = schema.__name;
|
|
57
|
+
const reverseRelationName = schemaKeyMap?.get(schema.__name) ?? schema.__name;
|
|
58
58
|
this.relations.get(resolved.table).push({
|
|
59
59
|
from: {
|
|
60
60
|
table: resolved.table,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.cjs","names":["SchemaError"],"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":";;;;;AAMA,IAAa,iBAAb,MAA4B;CAC1B,yBAAiB,IAAI,KAA4B;CACjD,8BAAsB,IAAI,KAA8B;CACxD,6BAAqB,IAAI,KAAqC;CAC9D,oCAA4B,IAAI,KAAqC;CACrE,4BAAoB,IAAI,KAOrB;;;;;CAMH,
|
|
1
|
+
{"version":3,"file":"registry.cjs","names":["SchemaError"],"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(\n schemas: readonly TableDefinition<any, any, any, any>[],\n schemaKeyMap?: Map<string, string>,\n ): 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 = schemaKeyMap?.get(schema.__name) ?? 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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"}
|
|
@@ -14,7 +14,7 @@ declare class SchemaRegistry {
|
|
|
14
14
|
* Register table definitions and resolve all deferred references
|
|
15
15
|
* @param {readonly TableDefinition[]} schemas - Table definitions to register
|
|
16
16
|
*/
|
|
17
|
-
register(schemas: readonly TableDefinition<any, any, any, any>[]): void;
|
|
17
|
+
register(schemas: readonly TableDefinition<any, any, any, any>[], schemaKeyMap?: Map<string, string>): void;
|
|
18
18
|
/**
|
|
19
19
|
* Get table metadata by name
|
|
20
20
|
* @param {string} name - Table name
|
|
@@ -14,7 +14,7 @@ declare class SchemaRegistry {
|
|
|
14
14
|
* Register table definitions and resolve all deferred references
|
|
15
15
|
* @param {readonly TableDefinition[]} schemas - Table definitions to register
|
|
16
16
|
*/
|
|
17
|
-
register(schemas: readonly TableDefinition<any, any, any, any>[]): void;
|
|
17
|
+
register(schemas: readonly TableDefinition<any, any, any, any>[], schemaKeyMap?: Map<string, string>): void;
|
|
18
18
|
/**
|
|
19
19
|
* Get table metadata by name
|
|
20
20
|
* @param {string} name - Table name
|
package/dist/schema/registry.mjs
CHANGED
|
@@ -14,7 +14,7 @@ var init_registry = __esmMin((() => {
|
|
|
14
14
|
* Register table definitions and resolve all deferred references
|
|
15
15
|
* @param {readonly TableDefinition[]} schemas - Table definitions to register
|
|
16
16
|
*/
|
|
17
|
-
register(schemas) {
|
|
17
|
+
register(schemas, schemaKeyMap) {
|
|
18
18
|
for (const schema of schemas) {
|
|
19
19
|
if (!schema.__table || !schema.__name) throw new SchemaError("Invalid table definition");
|
|
20
20
|
this.definitions.set(schema.__name, schema);
|
|
@@ -55,7 +55,7 @@ var init_registry = __esmMin((() => {
|
|
|
55
55
|
relationName
|
|
56
56
|
});
|
|
57
57
|
if (!this.relations.has(resolved.table)) this.relations.set(resolved.table, []);
|
|
58
|
-
const reverseRelationName = schema.__name;
|
|
58
|
+
const reverseRelationName = schemaKeyMap?.get(schema.__name) ?? schema.__name;
|
|
59
59
|
this.relations.get(resolved.table).push({
|
|
60
60
|
from: {
|
|
61
61
|
table: resolved.table,
|
|
@@ -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":";;;;;cAAwC;AAM3B,kBAAb,MAA4B;EAC1B,yBAAiB,IAAI,KAA4B;EACjD,8BAAsB,IAAI,KAA8B;EACxD,6BAAqB,IAAI,KAAqC;EAC9D,oCAA4B,IAAI,KAAqC;EACrE,4BAAoB,IAAI,KAOrB;;;;;EAMH,
|
|
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(\n schemas: readonly TableDefinition<any, any, any, any>[],\n schemaKeyMap?: Map<string, string>,\n ): 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 = schemaKeyMap?.get(schema.__name) ?? 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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"}
|
package/dist/types.d.cts
CHANGED
|
@@ -5,7 +5,7 @@ type ColumnDataType = "integer" | "varchar" | "text" | "boolean" | "json" | "arr
|
|
|
5
5
|
* Database type identifier — can be a simple string shorthand or an object
|
|
6
6
|
* specifying both the database name and the driver provider to use
|
|
7
7
|
*/
|
|
8
|
-
type DatabaseType = "mysql" | "mariadb" | "sqlite" | "file" | {
|
|
8
|
+
type DatabaseType = "mysql" | "mariadb" | "sqlite" | "file" | "s3" | {
|
|
9
9
|
name: "mysql";
|
|
10
10
|
provider: "mysql" | "mysql2";
|
|
11
11
|
} | {
|
|
@@ -17,6 +17,9 @@ type DatabaseType = "mysql" | "mariadb" | "sqlite" | "file" | {
|
|
|
17
17
|
} | {
|
|
18
18
|
name: "file";
|
|
19
19
|
provider: string;
|
|
20
|
+
} | {
|
|
21
|
+
name: "s3";
|
|
22
|
+
provider: string;
|
|
20
23
|
};
|
|
21
24
|
/** Metadata describing a single database column */
|
|
22
25
|
interface ColumnMetadata {
|
|
@@ -217,8 +220,23 @@ interface FileConnectionConfig {
|
|
|
217
220
|
/** Directory where data files are stored */
|
|
218
221
|
directory: string;
|
|
219
222
|
}
|
|
223
|
+
/** Connection configuration for S3-based storage */
|
|
224
|
+
interface S3ConnectionConfig {
|
|
225
|
+
/** S3 bucket name */
|
|
226
|
+
bucket: string;
|
|
227
|
+
/** S3 endpoint URL */
|
|
228
|
+
endpoint?: string;
|
|
229
|
+
/** AWS region */
|
|
230
|
+
region?: string;
|
|
231
|
+
/** S3 access key ID */
|
|
232
|
+
accessKeyId?: string;
|
|
233
|
+
/** S3 secret access key */
|
|
234
|
+
secretAccessKey?: string;
|
|
235
|
+
/** Key prefix for stored objects */
|
|
236
|
+
prefix?: string;
|
|
237
|
+
}
|
|
220
238
|
/** Union of all supported connection configurations */
|
|
221
|
-
type ConnectionConfig = MySQLConnectionConfig | SQLiteConnectionConfig | FileConnectionConfig;
|
|
239
|
+
type ConnectionConfig = MySQLConnectionConfig | SQLiteConnectionConfig | FileConnectionConfig | S3ConnectionConfig;
|
|
222
240
|
/**
|
|
223
241
|
* Global cache configuration for the database instance.
|
|
224
242
|
* Controls query result caching and entity caching behavior.
|
|
@@ -361,16 +379,18 @@ type SchemaByName<S extends readonly AnyTableDef[], N extends string> = Extract<
|
|
|
361
379
|
type StripIdSuffix<S extends string> = S extends `${infer Base}Id` ? Base : S extends `${infer Base}_id` ? Base : S;
|
|
362
380
|
type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends ((x: infer I) => void) ? I : never;
|
|
363
381
|
type Simplify<T> = { [K in keyof T]: T[K] } & {};
|
|
364
|
-
type
|
|
365
|
-
|
|
382
|
+
type IsArray<T> = T extends readonly any[] ? true : false;
|
|
383
|
+
type SchemaKey<S, T extends AnyTableDef> = IsArray<S> extends true ? TableName<T> : { [K in keyof S]: S[K] extends T ? K : never }[keyof S];
|
|
384
|
+
type ForwardRelationEntries<S, T extends AnyTableDef> = TableRefs<T> extends infer R ? R extends DeferredRefMeta<infer Col, infer ToTable, any, infer Name> ? { [K in Name extends string ? Name : StripIdSuffix<Col>]: {
|
|
385
|
+
table: SchemaByName<InferSchemas<S>, ToTable>;
|
|
366
386
|
many: false;
|
|
367
387
|
} } : never : never;
|
|
368
|
-
type ReverseRelationEntry<U extends AnyTableDef, TargetName extends string> = TableRefs<U> extends infer R ? R extends DeferredRefMeta<any, TargetName, any, any> ? { [K in
|
|
388
|
+
type ReverseRelationEntry<S, U extends AnyTableDef, TargetName extends string> = TableRefs<U> extends infer R ? R extends DeferredRefMeta<any, TargetName, any, any> ? { [K in SchemaKey<S, U> & string]: {
|
|
369
389
|
table: U;
|
|
370
390
|
many: true;
|
|
371
391
|
} } : never : never;
|
|
372
|
-
type ReverseRelationEntries<S
|
|
373
|
-
type RelationsFor<S
|
|
392
|
+
type ReverseRelationEntries<S, T extends AnyTableDef> = ReverseRelationEntry<S, InferSchemas<S>[number], TableName<T>>;
|
|
393
|
+
type RelationsFor<S, T extends AnyTableDef> = Simplify<UnionToIntersection<ForwardRelationEntries<S, T> | ReverseRelationEntries<S, T>>>;
|
|
374
394
|
type InferSchemas<T> = T extends readonly AnyTableDef[] ? T : T extends Record<string, any> ? Array<{ [K in keyof T]: T[K] extends AnyTableDef ? T[K] : never }[keyof T]> : readonly AnyTableDef[];
|
|
375
395
|
type DepthPrev = [never, 0, 1, 2, 3];
|
|
376
396
|
type ExtractRelationRow<Rel> = Rel extends {
|
|
@@ -379,17 +399,17 @@ type ExtractRelationRow<Rel> = Rel extends {
|
|
|
379
399
|
type ExtractRelationMany<Rel> = Rel extends {
|
|
380
400
|
many: true;
|
|
381
401
|
} ? true : false;
|
|
382
|
-
type RelationQueryMap<S
|
|
402
|
+
type RelationQueryMap<S, T extends AnyTableDef, D extends number = 3> = [D] extends [never] ? {} : { [K in keyof RelationsFor<S, T>]: {
|
|
383
403
|
row: ExtractRelationRow<RelationsFor<S, T>[K]>;
|
|
384
404
|
many: ExtractRelationMany<RelationsFor<S, T>[K]>;
|
|
385
405
|
relations: RelationsFor<S, T>[K] extends {
|
|
386
406
|
table: infer R extends AnyTableDef;
|
|
387
407
|
} ? RelationQueryMap<S, R, DepthPrev[D]> : {};
|
|
388
408
|
} };
|
|
389
|
-
type ResolveWith<S
|
|
390
|
-
type ResolveResult<S
|
|
409
|
+
type ResolveWith<S, T extends AnyTableDef, W> = [W] extends [undefined] ? {} : W extends Record<string, any> ? { [K in keyof W & keyof RelationsFor<S, T>]: ExtractRelationMany<RelationsFor<S, T>[K]> extends true ? ExtractRelationRow<RelationsFor<S, T>[K]>[] : ExtractRelationRow<RelationsFor<S, T>[K]> | null } : {};
|
|
410
|
+
type ResolveResult<S, T extends AnyTableDef, O> = InferRow<T> & ResolveWith<S, T, O extends {
|
|
391
411
|
with: infer W;
|
|
392
412
|
} ? W : undefined>;
|
|
393
413
|
//#endregion
|
|
394
|
-
export { AnyTableDef, CacheConfig, ColumnDataType, ColumnMetadata, ConnectionConfig, DatabaseConfig, DatabaseDriver, DatabaseType, DeferredRefMeta, DeleteOptions, FileConnectionConfig, InferInsert, InferRow,
|
|
414
|
+
export { AnyTableDef, CacheConfig, ColumnDataType, ColumnMetadata, ConnectionConfig, DatabaseConfig, DatabaseDriver, DatabaseType, DeferredRefMeta, DeleteOptions, FileConnectionConfig, InferInsert, InferRow, InferUpdate, MigrationContext, MigrationDefinition, MySQLConnectionConfig, QueryOptions, ReferenceAction, RelationQueryMap, RelationsFor, Repository, ResolveResult, S3ConnectionConfig, SQLiteConnectionConfig, TableCacheConfig, TableDefinition, TableMetadata, UpdateOptions, WhereClause, WhereCondition };
|
|
395
415
|
//# sourceMappingURL=types.d.cts.map
|