@danceroutine/tango-orm 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +104 -0
- package/dist/{PostgresAdapter-_X36-mLL.js → PostgresAdapter-C9a1XJRx.js} +31 -7
- package/dist/PostgresAdapter-C9a1XJRx.js.map +1 -0
- package/dist/PostgresAdapter-CBc1u8eT.js +3 -0
- package/dist/SqliteAdapter-BJKNxCvS.js +3 -0
- package/dist/SqliteAdapter-Dp6VRXmz.js +118 -0
- package/dist/SqliteAdapter-Dp6VRXmz.js.map +1 -0
- package/dist/connection/adapters/Adapter.d.ts +9 -0
- package/dist/connection/adapters/AdapterRegistry.d.ts +28 -1
- package/dist/connection/adapters/dialects/PostgresAdapter.d.ts +10 -1
- package/dist/connection/adapters/dialects/SqliteAdapter.d.ts +11 -1
- package/dist/connection/clients/DBClient.d.ts +8 -0
- package/dist/connection/clients/dialects/PostgresClient.d.ts +22 -1
- package/dist/connection/clients/dialects/SqliteClient.d.ts +26 -1
- package/dist/connection/index.js +3 -3
- package/dist/{connection-DytAsjC9.js → connection-CVvycXus.js} +21 -6
- package/dist/connection-CVvycXus.js.map +1 -0
- package/dist/index.d.ts +7 -4
- package/dist/index.js +9 -8
- package/dist/manager/ManagerLike.d.ts +15 -0
- package/dist/manager/ModelManager.d.ts +48 -0
- package/dist/manager/index.d.ts +6 -0
- package/dist/manager/index.js +8 -0
- package/dist/manager/internal/MutationCompiler.d.ts +15 -0
- package/dist/manager/internal/RuntimeBoundClient.d.ts +16 -0
- package/dist/manager/registerModelObjects.d.ts +5 -0
- package/dist/manager-D6tU8xTO.js +13 -0
- package/dist/manager-D6tU8xTO.js.map +1 -0
- package/dist/query/QBuilder.d.ts +18 -0
- package/dist/query/QuerySet.d.ts +60 -9
- package/dist/query/compiler/QueryCompiler.d.ts +19 -2
- package/dist/query/domain/{RepositoryMeta.d.ts → TableMeta.d.ts} +1 -1
- package/dist/query/domain/index.d.ts +1 -1
- package/dist/query/index.d.ts +2 -2
- package/dist/query/index.js +1 -2
- package/dist/query-wnl4h2o7.js +671 -0
- package/dist/query-wnl4h2o7.js.map +1 -0
- package/dist/registerModelObjects-emX7Hja9.js +354 -0
- package/dist/registerModelObjects-emX7Hja9.js.map +1 -0
- package/dist/runtime/TangoRuntime.d.ts +34 -0
- package/dist/runtime/defaultRuntime.d.ts +13 -0
- package/dist/runtime/index.d.ts +13 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime-7U5_XDad.js +17 -0
- package/dist/runtime-7U5_XDad.js.map +1 -0
- package/dist/transaction/UnitOfWork.d.ts +21 -3
- package/dist/transaction/index.js +1 -1
- package/dist/{transaction-DIGJnp19.js → transaction-DooTMuAl.js} +29 -11
- package/dist/transaction-DooTMuAl.js.map +1 -0
- package/dist/validation/OrmSqlSafetyAdapter.d.ts +22 -0
- package/dist/validation/SQLValidationEngine.d.ts +51 -0
- package/dist/validation/SqlValidationPlan.d.ts +42 -0
- package/dist/validation/index.d.ts +3 -0
- package/package.json +81 -74
- package/dist/PostgresAdapter-DCF8T4vh.js +0 -3
- package/dist/PostgresAdapter-_X36-mLL.js.map +0 -1
- package/dist/QuerySet-BzR5QzGi.js +0 -411
- package/dist/QuerySet-BzR5QzGi.js.map +0 -1
- package/dist/SqliteAdapter-CBnxCznk.js +0 -3
- package/dist/SqliteAdapter-J03fEjmr.js +0 -70
- package/dist/SqliteAdapter-J03fEjmr.js.map +0 -1
- package/dist/connection/clients/DBClient.js +0 -1
- package/dist/connection/clients/dialects/PostgresClient.js +0 -32
- package/dist/connection/clients/dialects/SqliteClient.js +0 -44
- package/dist/connection-DytAsjC9.js.map +0 -1
- package/dist/query/QuerySet.js +0 -108
- package/dist/query/compiler/QueryCompiler.js +0 -183
- package/dist/query/domain/CompiledQuery.js +0 -1
- package/dist/query/domain/WhereClause.js +0 -1
- package/dist/query-CQbvLeuh.js +0 -21
- package/dist/query-CQbvLeuh.js.map +0 -1
- package/dist/repository/Repository.d.ts +0 -40
- package/dist/repository/Repository.js +0 -100
- package/dist/repository/index.d.ts +0 -4
- package/dist/repository/index.js +0 -4
- package/dist/repository-DaRvsfjs.js +0 -78
- package/dist/repository-DaRvsfjs.js.map +0 -1
- package/dist/transaction-DIGJnp19.js.map +0 -1
|
@@ -1,411 +0,0 @@
|
|
|
1
|
-
import { __export } from "./chunk-DLY2FNSh.js";
|
|
2
|
-
|
|
3
|
-
//#region src/query/domain/internal/InternalDialect.ts
|
|
4
|
-
const InternalDialect = {
|
|
5
|
-
POSTGRES: "postgres",
|
|
6
|
-
SQLITE: "sqlite"
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
//#endregion
|
|
10
|
-
//#region src/query/domain/internal/InternalQNodeType.ts
|
|
11
|
-
const InternalQNodeType = {
|
|
12
|
-
ATOM: "atom",
|
|
13
|
-
AND: "and",
|
|
14
|
-
OR: "or",
|
|
15
|
-
NOT: "not"
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
//#endregion
|
|
19
|
-
//#region src/query/domain/internal/InternalLookupType.ts
|
|
20
|
-
const InternalLookupType = {
|
|
21
|
-
EXACT: "exact",
|
|
22
|
-
LT: "lt",
|
|
23
|
-
LTE: "lte",
|
|
24
|
-
GT: "gt",
|
|
25
|
-
GTE: "gte",
|
|
26
|
-
IN: "in",
|
|
27
|
-
ISNULL: "isnull",
|
|
28
|
-
CONTAINS: "contains",
|
|
29
|
-
ICONTAINS: "icontains",
|
|
30
|
-
STARTSWITH: "startswith",
|
|
31
|
-
ISTARTSWITH: "istartswith",
|
|
32
|
-
ENDSWITH: "endswith",
|
|
33
|
-
IENDSWITH: "iendswith"
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
//#endregion
|
|
37
|
-
//#region src/query/compiler/QueryCompiler.ts
|
|
38
|
-
var QueryCompiler = class QueryCompiler {
|
|
39
|
-
static BRAND = "tango.orm.query_compiler";
|
|
40
|
-
__tangoBrand = QueryCompiler.BRAND;
|
|
41
|
-
static isQueryCompiler(value) {
|
|
42
|
-
return typeof value === "object" && value !== null && value.__tangoBrand === QueryCompiler.BRAND;
|
|
43
|
-
}
|
|
44
|
-
constructor(meta, dialect = InternalDialect.POSTGRES) {
|
|
45
|
-
this.meta = meta;
|
|
46
|
-
this.dialect = dialect;
|
|
47
|
-
}
|
|
48
|
-
compile(state) {
|
|
49
|
-
const whereParts = [];
|
|
50
|
-
const params = [];
|
|
51
|
-
if (state.q) {
|
|
52
|
-
const result = this.compileQNode(state.q, params.length + 1);
|
|
53
|
-
if (result.sql) {
|
|
54
|
-
whereParts.push(result.sql);
|
|
55
|
-
params.push(...result.params);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
state.excludes?.forEach((exclude) => {
|
|
59
|
-
const result = this.compileQNode({
|
|
60
|
-
kind: InternalQNodeType.NOT,
|
|
61
|
-
node: exclude
|
|
62
|
-
}, params.length + 1);
|
|
63
|
-
if (result.sql) {
|
|
64
|
-
whereParts.push(result.sql);
|
|
65
|
-
params.push(...result.params);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
const select = state.select?.map(String).join(", ") || `${this.meta.table}.*`;
|
|
69
|
-
const joins = (state.selectRelated ?? []).map((rel) => {
|
|
70
|
-
const r = this.meta.relations?.[rel];
|
|
71
|
-
if (!r || r.kind !== "belongsTo") return "";
|
|
72
|
-
return `LEFT JOIN ${r.table} ${r.alias} ON ${r.alias}.${r.targetPk} = ${this.meta.table}.${r.localKey}`;
|
|
73
|
-
}).filter(Boolean).join(" ");
|
|
74
|
-
const whereSQL = whereParts.length ? ` WHERE ${whereParts.join(" AND ")}` : "";
|
|
75
|
-
const orderSQL = ` ORDER BY ${state.order?.length ? state.order.map((o) => `${this.meta.table}.${String(o.by)} ${o.dir.toUpperCase()}`).join(", ") : `${this.meta.table}.${this.meta.pk} ASC`}`;
|
|
76
|
-
const limitSQL = state.limit ? ` LIMIT ${state.limit}` : "";
|
|
77
|
-
const offsetSQL = state.offset ? ` OFFSET ${state.offset}` : "";
|
|
78
|
-
const sql = `SELECT ${select} FROM ${this.meta.table}${joins ? " " + joins : ""}${whereSQL}${orderSQL}${limitSQL}${offsetSQL}`;
|
|
79
|
-
return {
|
|
80
|
-
sql,
|
|
81
|
-
params
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
compileQNode(node, paramIndex) {
|
|
85
|
-
switch (node.kind) {
|
|
86
|
-
case InternalQNodeType.ATOM: return this.compileAtom(node.where || {}, paramIndex);
|
|
87
|
-
case InternalQNodeType.AND: return this.compileAnd(node.nodes || [], paramIndex);
|
|
88
|
-
case InternalQNodeType.OR: return this.compileOr(node.nodes || [], paramIndex);
|
|
89
|
-
case InternalQNodeType.NOT: return this.compileNot(node.node, paramIndex);
|
|
90
|
-
default: return {
|
|
91
|
-
sql: "",
|
|
92
|
-
params: []
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
compileAtom(where, paramIndex) {
|
|
97
|
-
const entries = Object.entries(where).filter(([, value]) => value !== undefined);
|
|
98
|
-
const { parts, params } = entries.reduce((accumulator, [key, value]) => {
|
|
99
|
-
const [field, lookup = InternalLookupType.EXACT] = String(key).split("__");
|
|
100
|
-
const col = `${this.meta.table}.${field}`;
|
|
101
|
-
const idx = paramIndex + accumulator.params.length;
|
|
102
|
-
const clause = this.lookupToSQL(col, lookup, value, idx);
|
|
103
|
-
accumulator.parts.push(clause.sql);
|
|
104
|
-
accumulator.params.push(...clause.params);
|
|
105
|
-
return accumulator;
|
|
106
|
-
}, {
|
|
107
|
-
parts: [],
|
|
108
|
-
params: []
|
|
109
|
-
});
|
|
110
|
-
return {
|
|
111
|
-
sql: parts.length ? `(${parts.join(" AND ")})` : "",
|
|
112
|
-
params
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
compileAnd(nodes, paramIndex) {
|
|
116
|
-
const { parts, params } = nodes.reduce((accumulator, node) => {
|
|
117
|
-
const result = this.compileQNode(node, paramIndex + accumulator.params.length);
|
|
118
|
-
if (result.sql) {
|
|
119
|
-
accumulator.parts.push(result.sql);
|
|
120
|
-
accumulator.params.push(...result.params);
|
|
121
|
-
}
|
|
122
|
-
return accumulator;
|
|
123
|
-
}, {
|
|
124
|
-
parts: [],
|
|
125
|
-
params: []
|
|
126
|
-
});
|
|
127
|
-
return {
|
|
128
|
-
sql: parts.length ? `(${parts.join(" AND ")})` : "",
|
|
129
|
-
params
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
compileOr(nodes, paramIndex) {
|
|
133
|
-
const { parts, params } = nodes.reduce((accumulator, node) => {
|
|
134
|
-
const result = this.compileQNode(node, paramIndex + accumulator.params.length);
|
|
135
|
-
if (result.sql) {
|
|
136
|
-
accumulator.parts.push(result.sql);
|
|
137
|
-
accumulator.params.push(...result.params);
|
|
138
|
-
}
|
|
139
|
-
return accumulator;
|
|
140
|
-
}, {
|
|
141
|
-
parts: [],
|
|
142
|
-
params: []
|
|
143
|
-
});
|
|
144
|
-
return {
|
|
145
|
-
sql: parts.length ? `(${parts.join(" OR ")})` : "",
|
|
146
|
-
params
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
compileNot(node, paramIndex) {
|
|
150
|
-
const result = this.compileQNode(node, paramIndex);
|
|
151
|
-
if (!result.sql) return {
|
|
152
|
-
sql: "",
|
|
153
|
-
params: []
|
|
154
|
-
};
|
|
155
|
-
return {
|
|
156
|
-
sql: `(NOT ${result.sql})`,
|
|
157
|
-
params: result.params
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
lookupToSQL(col, lookup, value, paramIndex) {
|
|
161
|
-
const placeholder = this.dialect === InternalDialect.POSTGRES ? `$${paramIndex}` : "?";
|
|
162
|
-
const normalized = this.normalizeParam(value);
|
|
163
|
-
switch (lookup) {
|
|
164
|
-
case InternalLookupType.EXACT:
|
|
165
|
-
if (value === null) return {
|
|
166
|
-
sql: `${col} IS NULL`,
|
|
167
|
-
params: []
|
|
168
|
-
};
|
|
169
|
-
return {
|
|
170
|
-
sql: `${col} = ${placeholder}`,
|
|
171
|
-
params: [normalized]
|
|
172
|
-
};
|
|
173
|
-
case InternalLookupType.LT: return {
|
|
174
|
-
sql: `${col} < ${placeholder}`,
|
|
175
|
-
params: [normalized]
|
|
176
|
-
};
|
|
177
|
-
case InternalLookupType.LTE: return {
|
|
178
|
-
sql: `${col} <= ${placeholder}`,
|
|
179
|
-
params: [normalized]
|
|
180
|
-
};
|
|
181
|
-
case InternalLookupType.GT: return {
|
|
182
|
-
sql: `${col} > ${placeholder}`,
|
|
183
|
-
params: [normalized]
|
|
184
|
-
};
|
|
185
|
-
case InternalLookupType.GTE: return {
|
|
186
|
-
sql: `${col} >= ${placeholder}`,
|
|
187
|
-
params: [normalized]
|
|
188
|
-
};
|
|
189
|
-
case InternalLookupType.IN: {
|
|
190
|
-
const arr = (Array.isArray(value) ? value : [value]).map((entry) => this.normalizeParam(entry));
|
|
191
|
-
if (arr.length === 0) return {
|
|
192
|
-
sql: "1=0",
|
|
193
|
-
params: []
|
|
194
|
-
};
|
|
195
|
-
const placeholders = this.dialect === InternalDialect.POSTGRES ? arr.map((_, i) => `$${paramIndex + i}`).join(", ") : arr.map(() => "?").join(", ");
|
|
196
|
-
return {
|
|
197
|
-
sql: `${col} IN (${placeholders})`,
|
|
198
|
-
params: arr
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
case InternalLookupType.ISNULL: return {
|
|
202
|
-
sql: value ? `${col} IS NULL` : `${col} IS NOT NULL`,
|
|
203
|
-
params: []
|
|
204
|
-
};
|
|
205
|
-
case InternalLookupType.CONTAINS: return {
|
|
206
|
-
sql: `${col} LIKE ${placeholder}`,
|
|
207
|
-
params: [`%${value}%`]
|
|
208
|
-
};
|
|
209
|
-
case InternalLookupType.ICONTAINS: {
|
|
210
|
-
const lowerCol = this.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;
|
|
211
|
-
const lowerValue = String(value).toLowerCase();
|
|
212
|
-
return {
|
|
213
|
-
sql: `${lowerCol} LIKE ${placeholder}`,
|
|
214
|
-
params: [`%${lowerValue}%`]
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
case InternalLookupType.STARTSWITH: return {
|
|
218
|
-
sql: `${col} LIKE ${placeholder}`,
|
|
219
|
-
params: [`${value}%`]
|
|
220
|
-
};
|
|
221
|
-
case InternalLookupType.ISTARTSWITH: {
|
|
222
|
-
const lowerCol = this.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;
|
|
223
|
-
const lowerValue = String(value).toLowerCase();
|
|
224
|
-
return {
|
|
225
|
-
sql: `${lowerCol} LIKE ${placeholder}`,
|
|
226
|
-
params: [`${lowerValue}%`]
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
case InternalLookupType.ENDSWITH: return {
|
|
230
|
-
sql: `${col} LIKE ${placeholder}`,
|
|
231
|
-
params: [`%${value}`]
|
|
232
|
-
};
|
|
233
|
-
case InternalLookupType.IENDSWITH: {
|
|
234
|
-
const lowerCol = this.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;
|
|
235
|
-
const lowerValue = String(value).toLowerCase();
|
|
236
|
-
return {
|
|
237
|
-
sql: `${lowerCol} LIKE ${placeholder}`,
|
|
238
|
-
params: [`%${lowerValue}`]
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
default: throw new Error(`Unknown lookup: ${lookup}`);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
normalizeParam(value) {
|
|
245
|
-
if (this.dialect === InternalDialect.SQLITE && typeof value === "boolean") return value ? 1 : 0;
|
|
246
|
-
return value;
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
//#endregion
|
|
251
|
-
//#region src/query/compiler/index.ts
|
|
252
|
-
var compiler_exports = {};
|
|
253
|
-
__export(compiler_exports, { QueryCompiler: () => QueryCompiler });
|
|
254
|
-
|
|
255
|
-
//#endregion
|
|
256
|
-
//#region src/query/domain/internal/InternalDirection.ts
|
|
257
|
-
const InternalDirection = {
|
|
258
|
-
ASC: "asc",
|
|
259
|
-
DESC: "desc"
|
|
260
|
-
};
|
|
261
|
-
|
|
262
|
-
//#endregion
|
|
263
|
-
//#region src/query/QBuilder.ts
|
|
264
|
-
var QBuilder = class QBuilder {
|
|
265
|
-
static BRAND = "tango.orm.q_builder";
|
|
266
|
-
__tangoBrand = QBuilder.BRAND;
|
|
267
|
-
static isQBuilder(value) {
|
|
268
|
-
return typeof value === "object" && value !== null && value.__tangoBrand === QBuilder.BRAND;
|
|
269
|
-
}
|
|
270
|
-
static and(...nodes) {
|
|
271
|
-
return {
|
|
272
|
-
kind: InternalQNodeType.AND,
|
|
273
|
-
nodes: nodes.map(QBuilder.wrapNode)
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
static or(...nodes) {
|
|
277
|
-
return {
|
|
278
|
-
kind: InternalQNodeType.OR,
|
|
279
|
-
nodes: nodes.map(QBuilder.wrapNode)
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
static not(node) {
|
|
283
|
-
return {
|
|
284
|
-
kind: InternalQNodeType.NOT,
|
|
285
|
-
node: QBuilder.wrapNode(node)
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
static wrapNode(input) {
|
|
289
|
-
if (input.kind) return input;
|
|
290
|
-
return {
|
|
291
|
-
kind: InternalQNodeType.ATOM,
|
|
292
|
-
where: input
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
};
|
|
296
|
-
|
|
297
|
-
//#endregion
|
|
298
|
-
//#region src/query/QuerySet.ts
|
|
299
|
-
var QuerySet = class QuerySet {
|
|
300
|
-
static BRAND = "tango.orm.query_set";
|
|
301
|
-
__tangoBrand = QuerySet.BRAND;
|
|
302
|
-
static isQuerySet(value) {
|
|
303
|
-
return typeof value === "object" && value !== null && value.__tangoBrand === QuerySet.BRAND;
|
|
304
|
-
}
|
|
305
|
-
constructor(repo, state = {}) {
|
|
306
|
-
this.repo = repo;
|
|
307
|
-
this.state = state;
|
|
308
|
-
}
|
|
309
|
-
filter(q) {
|
|
310
|
-
const wrapped = q.kind ? q : {
|
|
311
|
-
kind: InternalQNodeType.ATOM,
|
|
312
|
-
where: q
|
|
313
|
-
};
|
|
314
|
-
const merged = this.state.q ? QBuilder.and(this.state.q, wrapped) : wrapped;
|
|
315
|
-
return new QuerySet(this.repo, {
|
|
316
|
-
...this.state,
|
|
317
|
-
q: merged
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
exclude(q) {
|
|
321
|
-
const wrapped = q.kind ? q : {
|
|
322
|
-
kind: InternalQNodeType.ATOM,
|
|
323
|
-
where: q
|
|
324
|
-
};
|
|
325
|
-
const excludes = [...this.state.excludes ?? [], wrapped];
|
|
326
|
-
return new QuerySet(this.repo, {
|
|
327
|
-
...this.state,
|
|
328
|
-
excludes
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
orderBy(...tokens) {
|
|
332
|
-
const order = tokens.map((t) => {
|
|
333
|
-
const str = String(t);
|
|
334
|
-
if (str.startsWith("-")) return {
|
|
335
|
-
by: str.slice(1),
|
|
336
|
-
dir: InternalDirection.DESC
|
|
337
|
-
};
|
|
338
|
-
return {
|
|
339
|
-
by: t,
|
|
340
|
-
dir: InternalDirection.ASC
|
|
341
|
-
};
|
|
342
|
-
});
|
|
343
|
-
return new QuerySet(this.repo, {
|
|
344
|
-
...this.state,
|
|
345
|
-
order
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
limit(n) {
|
|
349
|
-
return new QuerySet(this.repo, {
|
|
350
|
-
...this.state,
|
|
351
|
-
limit: n
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
offset(n) {
|
|
355
|
-
return new QuerySet(this.repo, {
|
|
356
|
-
...this.state,
|
|
357
|
-
offset: n
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
select(cols) {
|
|
361
|
-
return new QuerySet(this.repo, {
|
|
362
|
-
...this.state,
|
|
363
|
-
select: cols
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
selectRelated(...rels) {
|
|
367
|
-
return new QuerySet(this.repo, {
|
|
368
|
-
...this.state,
|
|
369
|
-
selectRelated: rels
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
prefetchRelated(...rels) {
|
|
373
|
-
return new QuerySet(this.repo, {
|
|
374
|
-
...this.state,
|
|
375
|
-
prefetchRelated: rels
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
async fetch(shape) {
|
|
379
|
-
const compiler = new QueryCompiler(this.repo.meta, this.repo.dialect);
|
|
380
|
-
const compiled = compiler.compile(this.state);
|
|
381
|
-
const rows = await this.repo.run(compiled);
|
|
382
|
-
const results = !shape ? rows : typeof shape === "function" ? rows.map(shape) : rows.map((r) => shape.parse(r));
|
|
383
|
-
return {
|
|
384
|
-
results,
|
|
385
|
-
nextCursor: null
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
async fetchOne(shape) {
|
|
389
|
-
const limited = this.limit(1);
|
|
390
|
-
const result = await limited.fetch(shape);
|
|
391
|
-
return result.results[0] ?? null;
|
|
392
|
-
}
|
|
393
|
-
async count() {
|
|
394
|
-
const compiler = new QueryCompiler(this.repo.meta, this.repo.dialect);
|
|
395
|
-
const compiled = compiler.compile({
|
|
396
|
-
...this.state,
|
|
397
|
-
select: ["COUNT(*) as count"]
|
|
398
|
-
});
|
|
399
|
-
const countQuery = compiled.sql.replace(/SELECT .+ FROM/, "SELECT COUNT(*) as count FROM");
|
|
400
|
-
const rows = await this.repo.client.query(countQuery, compiled.params);
|
|
401
|
-
return Number(rows.rows[0]?.count ?? 0);
|
|
402
|
-
}
|
|
403
|
-
async exists() {
|
|
404
|
-
const count = await this.count();
|
|
405
|
-
return count > 0;
|
|
406
|
-
}
|
|
407
|
-
};
|
|
408
|
-
|
|
409
|
-
//#endregion
|
|
410
|
-
export { QBuilder, QueryCompiler, QuerySet, compiler_exports };
|
|
411
|
-
//# sourceMappingURL=QuerySet-BzR5QzGi.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"QuerySet-BzR5QzGi.js","names":["value: unknown","meta: RepositoryMeta","dialect: Dialect","state: QuerySetState<T>","whereParts: string[]","params: any[]","node: QNode<T>","paramIndex: number","where: FilterInput<T>","nodes: QNode<T>[]","col: string","lookup: LookupType","value: any","value: unknown","node: FilterInput<T> | QNode<T>","input: FilterInput<T> | QNode<T>","value: unknown","repo: RepositoryLike<T>","state: QuerySetState<T>","q: FilterInput<T> | QNode<T>","wrapped: QNode<T>","n: number","cols: (keyof T)[]","shape?: ((r: T) => Out) | { parse: (r: T) => Out }","results: Out[]"],"sources":["../src/query/domain/internal/InternalDialect.ts","../src/query/domain/internal/InternalQNodeType.ts","../src/query/domain/internal/InternalLookupType.ts","../src/query/compiler/QueryCompiler.ts","../src/query/compiler/index.ts","../src/query/domain/internal/InternalDirection.ts","../src/query/QBuilder.ts","../src/query/QuerySet.ts"],"sourcesContent":["export const InternalDialect = {\n POSTGRES: 'postgres',\n SQLITE: 'sqlite',\n} as const;\n","export const InternalQNodeType = {\n ATOM: 'atom',\n AND: 'and',\n OR: 'or',\n NOT: 'not',\n} as const;\n","export const InternalLookupType = {\n EXACT: 'exact',\n LT: 'lt',\n LTE: 'lte',\n GT: 'gt',\n GTE: 'gte',\n IN: 'in',\n ISNULL: 'isnull',\n CONTAINS: 'contains',\n ICONTAINS: 'icontains',\n STARTSWITH: 'startswith',\n ISTARTSWITH: 'istartswith',\n ENDSWITH: 'endswith',\n IENDSWITH: 'iendswith',\n} as const;\n","import type { LookupType } from '../domain/LookupType';\nimport type { QuerySetState } from '../domain/QuerySetState';\nimport type { RepositoryMeta } from '../domain/RepositoryMeta';\nimport type { QNode } from '../domain/QNode';\nimport type { CompiledQuery } from '../domain/CompiledQuery';\nimport type { WhereClause } from '../domain/WhereClause';\nimport type { FilterInput } from '../domain/FilterInput';\nimport type { Dialect } from '../domain/Dialect';\nimport { InternalDialect } from '../domain/internal/InternalDialect';\nimport { InternalQNodeType } from '../domain/internal/InternalQNodeType';\nimport { InternalLookupType } from '../domain/internal/InternalLookupType';\nexport class QueryCompiler {\n static readonly BRAND = 'tango.orm.query_compiler' as const;\n readonly __tangoBrand: typeof QueryCompiler.BRAND = QueryCompiler.BRAND;\n\n static isQueryCompiler(value: unknown): value is QueryCompiler {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === QueryCompiler.BRAND\n );\n }\n\n constructor(\n private meta: RepositoryMeta,\n private dialect: Dialect = InternalDialect.POSTGRES\n ) {}\n\n compile<T>(state: QuerySetState<T>): CompiledQuery {\n const whereParts: string[] = [];\n const params: any[] = [];\n\n if (state.q) {\n const result = this.compileQNode(state.q, params.length + 1);\n if (result.sql) {\n whereParts.push(result.sql);\n params.push(...result.params);\n }\n }\n\n state.excludes?.forEach((exclude) => {\n const result = this.compileQNode({ kind: InternalQNodeType.NOT, node: exclude }, params.length + 1);\n if (result.sql) {\n whereParts.push(result.sql);\n params.push(...result.params);\n }\n });\n\n const select = state.select?.map(String).join(', ') || `${this.meta.table}.*`;\n\n const joins = (state.selectRelated ?? [])\n .map((rel) => {\n const r = this.meta.relations?.[rel];\n if (!r || r.kind !== 'belongsTo') {\n return '';\n }\n return `LEFT JOIN ${r.table} ${r.alias} ON ${r.alias}.${r.targetPk} = ${this.meta.table}.${r.localKey}`;\n })\n .filter(Boolean)\n .join(' ');\n\n const whereSQL = whereParts.length ? ` WHERE ${whereParts.join(' AND ')}` : '';\n\n const orderSQL = ` ORDER BY ${\n state.order?.length\n ? state.order.map((o) => `${this.meta.table}.${String(o.by)} ${o.dir.toUpperCase()}`).join(', ')\n : `${this.meta.table}.${this.meta.pk} ASC`\n }`;\n\n const limitSQL = state.limit ? ` LIMIT ${state.limit}` : '';\n const offsetSQL = state.offset ? ` OFFSET ${state.offset}` : '';\n\n const sql = `SELECT ${select} FROM ${this.meta.table}${joins ? ' ' + joins : ''}${whereSQL}${orderSQL}${limitSQL}${offsetSQL}`;\n\n return { sql, params };\n }\n\n private compileQNode<T>(node: QNode<T>, paramIndex: number): WhereClause {\n switch (node.kind) {\n case InternalQNodeType.ATOM:\n return this.compileAtom(node.where || {}, paramIndex);\n case InternalQNodeType.AND:\n return this.compileAnd(node.nodes || [], paramIndex);\n case InternalQNodeType.OR:\n return this.compileOr(node.nodes || [], paramIndex);\n case InternalQNodeType.NOT:\n return this.compileNot(node.node!, paramIndex);\n default:\n return { sql: '', params: [] };\n }\n }\n\n private compileAtom<T>(where: FilterInput<T>, paramIndex: number): WhereClause {\n const entries = Object.entries(where).filter(([, value]) => value !== undefined);\n\n const { parts, params } = entries.reduce<{ parts: string[]; params: any[] }>(\n (accumulator, [key, value]) => {\n const [field, lookup = InternalLookupType.EXACT] = String(key).split('__') as [string, LookupType];\n const col = `${this.meta.table}.${field}`;\n const idx = paramIndex + accumulator.params.length;\n\n const clause = this.lookupToSQL(col, lookup, value, idx);\n accumulator.parts.push(clause.sql);\n accumulator.params.push(...clause.params);\n return accumulator;\n },\n { parts: [], params: [] }\n );\n\n return {\n sql: parts.length ? `(${parts.join(' AND ')})` : '',\n params,\n };\n }\n\n private compileAnd<T>(nodes: QNode<T>[], paramIndex: number): WhereClause {\n const { parts, params } = nodes.reduce<{ parts: string[]; params: any[] }>(\n (accumulator, node) => {\n const result = this.compileQNode(node, paramIndex + accumulator.params.length);\n if (result.sql) {\n accumulator.parts.push(result.sql);\n accumulator.params.push(...result.params);\n }\n return accumulator;\n },\n { parts: [], params: [] }\n );\n\n return {\n sql: parts.length ? `(${parts.join(' AND ')})` : '',\n params,\n };\n }\n\n private compileOr<T>(nodes: QNode<T>[], paramIndex: number): WhereClause {\n const { parts, params } = nodes.reduce<{ parts: string[]; params: any[] }>(\n (accumulator, node) => {\n const result = this.compileQNode(node, paramIndex + accumulator.params.length);\n if (result.sql) {\n accumulator.parts.push(result.sql);\n accumulator.params.push(...result.params);\n }\n return accumulator;\n },\n { parts: [], params: [] }\n );\n\n return {\n sql: parts.length ? `(${parts.join(' OR ')})` : '',\n params,\n };\n }\n\n private compileNot<T>(node: QNode<T>, paramIndex: number): WhereClause {\n const result = this.compileQNode(node, paramIndex);\n if (!result.sql) {\n return { sql: '', params: [] };\n }\n\n return {\n sql: `(NOT ${result.sql})`,\n params: result.params,\n };\n }\n\n private lookupToSQL(col: string, lookup: LookupType, value: any, paramIndex: number): WhereClause {\n const placeholder = this.dialect === InternalDialect.POSTGRES ? `$${paramIndex}` : '?';\n const normalized = this.normalizeParam(value);\n\n switch (lookup) {\n case InternalLookupType.EXACT:\n if (value === null) {\n return { sql: `${col} IS NULL`, params: [] };\n }\n return { sql: `${col} = ${placeholder}`, params: [normalized] };\n\n case InternalLookupType.LT:\n return { sql: `${col} < ${placeholder}`, params: [normalized] };\n\n case InternalLookupType.LTE:\n return { sql: `${col} <= ${placeholder}`, params: [normalized] };\n\n case InternalLookupType.GT:\n return { sql: `${col} > ${placeholder}`, params: [normalized] };\n\n case InternalLookupType.GTE:\n return { sql: `${col} >= ${placeholder}`, params: [normalized] };\n\n case InternalLookupType.IN: {\n const arr = (Array.isArray(value) ? value : [value]).map((entry) => this.normalizeParam(entry));\n if (arr.length === 0) {\n return { sql: '1=0', params: [] };\n }\n const placeholders =\n this.dialect === InternalDialect.POSTGRES\n ? arr.map((_, i) => `$${paramIndex + i}`).join(', ')\n : arr.map(() => '?').join(', ');\n return { sql: `${col} IN (${placeholders})`, params: arr };\n }\n\n case InternalLookupType.ISNULL:\n return { sql: value ? `${col} IS NULL` : `${col} IS NOT NULL`, params: [] };\n\n case InternalLookupType.CONTAINS:\n return { sql: `${col} LIKE ${placeholder}`, params: [`%${value}%`] };\n\n case InternalLookupType.ICONTAINS: {\n const lowerCol = this.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;\n const lowerValue = String(value).toLowerCase();\n return { sql: `${lowerCol} LIKE ${placeholder}`, params: [`%${lowerValue}%`] };\n }\n\n case InternalLookupType.STARTSWITH:\n return { sql: `${col} LIKE ${placeholder}`, params: [`${value}%`] };\n\n case InternalLookupType.ISTARTSWITH: {\n const lowerCol = this.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;\n const lowerValue = String(value).toLowerCase();\n return { sql: `${lowerCol} LIKE ${placeholder}`, params: [`${lowerValue}%`] };\n }\n\n case InternalLookupType.ENDSWITH:\n return { sql: `${col} LIKE ${placeholder}`, params: [`%${value}`] };\n\n case InternalLookupType.IENDSWITH: {\n const lowerCol = this.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;\n const lowerValue = String(value).toLowerCase();\n return { sql: `${lowerCol} LIKE ${placeholder}`, params: [`%${lowerValue}`] };\n }\n\n default:\n throw new Error(`Unknown lookup: ${lookup}`);\n }\n }\n\n private normalizeParam(value: unknown): unknown {\n if (this.dialect === InternalDialect.SQLITE && typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n return value;\n }\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { QueryCompiler } from './QueryCompiler';\n","export const InternalDirection = {\n ASC: 'asc',\n DESC: 'desc',\n} as const;\n","import type { QNode } from './domain/QNode';\nimport type { FilterInput } from './domain/FilterInput';\nimport { InternalQNodeType } from './domain/internal/InternalQNodeType';\n\nexport class QBuilder {\n static readonly BRAND = 'tango.orm.q_builder' as const;\n readonly __tangoBrand: typeof QBuilder.BRAND = QBuilder.BRAND;\n\n static isQBuilder(value: unknown): value is QBuilder {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === QBuilder.BRAND\n );\n }\n\n static and<T>(...nodes: Array<FilterInput<T> | QNode<T>>): QNode<T> {\n return {\n kind: InternalQNodeType.AND,\n nodes: nodes.map(QBuilder.wrapNode),\n };\n }\n\n static or<T>(...nodes: Array<FilterInput<T> | QNode<T>>): QNode<T> {\n return {\n kind: InternalQNodeType.OR,\n nodes: nodes.map(QBuilder.wrapNode),\n };\n }\n\n static not<T>(node: FilterInput<T> | QNode<T>): QNode<T> {\n return {\n kind: InternalQNodeType.NOT,\n node: QBuilder.wrapNode(node),\n };\n }\n\n private static wrapNode<T>(input: FilterInput<T> | QNode<T>): QNode<T> {\n if ((input as QNode<T>).kind) {\n return input as QNode<T>;\n }\n return {\n kind: InternalQNodeType.ATOM,\n where: input as FilterInput<T>,\n };\n }\n}\n","import type { DBClient } from '../connection/clients/DBClient';\nimport type { Dialect } from './domain/Dialect';\nimport type { QuerySetState } from './domain/QuerySetState';\nimport type { RepositoryMeta } from './domain/RepositoryMeta';\nimport type { QNode } from './domain/QNode';\nimport type { QueryResult } from './domain/QueryResult';\nimport type { OrderToken } from './domain/OrderToken';\nimport type { FilterInput } from './domain/FilterInput';\nimport { InternalQNodeType } from './domain/internal/InternalQNodeType';\nimport { InternalDirection } from './domain/internal/InternalDirection';\nimport { QBuilder as Q } from './QBuilder';\nimport { QueryCompiler } from './compiler';\n\n/**\n * Interface for repository-like objects that can execute queries.\n * Used internally by QuerySet to remain decoupled from specific repository implementations.\n *\n * @template T - The model type\n */\nexport interface RepositoryLike<T> {\n meta: RepositoryMeta;\n client: DBClient;\n dialect: Dialect;\n run(compiled: { sql: string; params: any[] }): Promise<T[]>;\n}\n\n/**\n * Django-inspired query builder for constructing and executing database queries.\n * Provides a fluent API for filtering, ordering, pagination, and eager loading.\n *\n * @template T - The model type being queried\n *\n * @example\n * ```typescript\n * const users = await repository\n * .query()\n * .filter({ active: true })\n * .filter(Q.or({ role: 'admin' }, { role: 'moderator' }))\n * .orderBy('-createdAt')\n * .limit(10)\n * .fetchAll();\n * ```\n */\nexport class QuerySet<T extends Record<string, any>> {\n static readonly BRAND = 'tango.orm.query_set' as const;\n readonly __tangoBrand: typeof QuerySet.BRAND = QuerySet.BRAND;\n\n static isQuerySet<T extends Record<string, any>>(value: unknown): value is QuerySet<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === QuerySet.BRAND\n );\n }\n\n constructor(\n private repo: RepositoryLike<T>,\n private state: QuerySetState<T> = {}\n ) {}\n\n filter(q: FilterInput<T> | QNode<T>): QuerySet<T> {\n const wrapped: QNode<T> = (q as QNode<T>).kind\n ? (q as QNode<T>)\n : { kind: InternalQNodeType.ATOM, where: q as FilterInput<T> };\n const merged = this.state.q ? Q.and(this.state.q, wrapped) : wrapped;\n return new QuerySet(this.repo, { ...this.state, q: merged });\n }\n\n exclude(q: FilterInput<T> | QNode<T>): QuerySet<T> {\n const wrapped: QNode<T> = (q as QNode<T>).kind\n ? (q as QNode<T>)\n : { kind: InternalQNodeType.ATOM, where: q as FilterInput<T> };\n const excludes = [...(this.state.excludes ?? []), wrapped];\n return new QuerySet(this.repo, { ...this.state, excludes });\n }\n\n orderBy(...tokens: OrderToken<T>[]): QuerySet<T> {\n const order = tokens.map((t) => {\n const str = String(t);\n if (str.startsWith('-')) {\n return { by: str.slice(1) as keyof T, dir: InternalDirection.DESC };\n }\n return { by: t as keyof T, dir: InternalDirection.ASC };\n });\n return new QuerySet(this.repo, { ...this.state, order });\n }\n\n limit(n: number): QuerySet<T> {\n return new QuerySet(this.repo, { ...this.state, limit: n });\n }\n\n offset(n: number): QuerySet<T> {\n return new QuerySet(this.repo, { ...this.state, offset: n });\n }\n\n select(cols: (keyof T)[]): QuerySet<T> {\n return new QuerySet(this.repo, { ...this.state, select: cols });\n }\n\n selectRelated(...rels: string[]): QuerySet<T> {\n return new QuerySet(this.repo, { ...this.state, selectRelated: rels });\n }\n\n prefetchRelated(...rels: string[]): QuerySet<T> {\n return new QuerySet(this.repo, { ...this.state, prefetchRelated: rels });\n }\n\n async fetch<Out = T>(shape?: ((r: T) => Out) | { parse: (r: T) => Out }): Promise<QueryResult<Out>> {\n const compiler = new QueryCompiler(this.repo.meta, this.repo.dialect);\n const compiled = compiler.compile(this.state);\n const rows = await this.repo.run(compiled);\n\n const results: Out[] = !shape\n ? (rows as unknown as Out[])\n : typeof shape === 'function'\n ? rows.map(shape)\n : rows.map((r) => shape.parse(r));\n\n return {\n results,\n nextCursor: null,\n };\n }\n\n async fetchOne<Out = T>(shape?: ((r: T) => Out) | { parse: (r: T) => Out }): Promise<Out | null> {\n const limited = this.limit(1);\n const result = await limited.fetch(shape);\n return result.results[0] ?? null;\n }\n\n async count(): Promise<number> {\n const compiler = new QueryCompiler(this.repo.meta, this.repo.dialect);\n const compiled = compiler.compile({\n ...this.state,\n select: ['COUNT(*) as count' as keyof T],\n });\n\n const countQuery = compiled.sql.replace(/SELECT .+ FROM/, 'SELECT COUNT(*) as count FROM');\n\n const rows = await this.repo.client.query<{ count: number }>(countQuery, compiled.params);\n return Number(rows.rows[0]?.count ?? 0);\n }\n\n async exists(): Promise<boolean> {\n const count = await this.count();\n return count > 0;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import Database from "better-sqlite3";
|
|
2
|
-
|
|
3
|
-
//#region src/connection/clients/dialects/SqliteClient.ts
|
|
4
|
-
var SqliteClient = class SqliteClient {
|
|
5
|
-
static BRAND = "tango.orm.sqlite_client";
|
|
6
|
-
__tangoBrand = SqliteClient.BRAND;
|
|
7
|
-
inTransaction = false;
|
|
8
|
-
static isSqliteClient(value) {
|
|
9
|
-
return typeof value === "object" && value !== null && value.__tangoBrand === SqliteClient.BRAND;
|
|
10
|
-
}
|
|
11
|
-
constructor(db) {
|
|
12
|
-
this.db = db;
|
|
13
|
-
}
|
|
14
|
-
async query(sql, params) {
|
|
15
|
-
const stmt = this.db.prepare(sql);
|
|
16
|
-
if (/^\s*(SELECT|PRAGMA)/i.test(sql)) {
|
|
17
|
-
const rows = params ? stmt.all(...params) : stmt.all();
|
|
18
|
-
return { rows };
|
|
19
|
-
}
|
|
20
|
-
params ? stmt.run(...params) : stmt.run();
|
|
21
|
-
return { rows: [] };
|
|
22
|
-
}
|
|
23
|
-
async begin() {
|
|
24
|
-
if (!this.inTransaction) {
|
|
25
|
-
this.db.prepare("BEGIN").run();
|
|
26
|
-
this.inTransaction = true;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
async commit() {
|
|
30
|
-
if (this.inTransaction) {
|
|
31
|
-
this.db.prepare("COMMIT").run();
|
|
32
|
-
this.inTransaction = false;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
async rollback() {
|
|
36
|
-
if (this.inTransaction) {
|
|
37
|
-
this.db.prepare("ROLLBACK").run();
|
|
38
|
-
this.inTransaction = false;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
async close() {
|
|
42
|
-
this.db.close();
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
//#endregion
|
|
47
|
-
//#region src/connection/adapters/dialects/SqliteAdapter.ts
|
|
48
|
-
var SqliteAdapter = class SqliteAdapter {
|
|
49
|
-
static BRAND = "tango.orm.sqlite_adapter";
|
|
50
|
-
__tangoBrand = SqliteAdapter.BRAND;
|
|
51
|
-
name = "sqlite";
|
|
52
|
-
features = {
|
|
53
|
-
transactionalDDL: true,
|
|
54
|
-
concurrentIndex: false,
|
|
55
|
-
validateForeignKeys: false
|
|
56
|
-
};
|
|
57
|
-
static isSqliteAdapter(value) {
|
|
58
|
-
return typeof value === "object" && value !== null && value.__tangoBrand === SqliteAdapter.BRAND;
|
|
59
|
-
}
|
|
60
|
-
async connect(config) {
|
|
61
|
-
const db = new Database(config.filename || ":memory:");
|
|
62
|
-
db.pragma("journal_mode = WAL");
|
|
63
|
-
db.pragma("foreign_keys = ON");
|
|
64
|
-
return new SqliteClient(db);
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
//#endregion
|
|
69
|
-
export { SqliteAdapter, SqliteClient };
|
|
70
|
-
//# sourceMappingURL=SqliteAdapter-J03fEjmr.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteAdapter-J03fEjmr.js","names":["value: unknown","db: Database.Database","sql: string","params?: any[]","value: unknown","config: AdapterConfig"],"sources":["../src/connection/clients/dialects/SqliteClient.ts","../src/connection/adapters/dialects/SqliteAdapter.ts"],"sourcesContent":["import type Database from 'better-sqlite3';\nimport type { DBClient } from '../DBClient';\n\nexport class SqliteClient implements DBClient {\n static readonly BRAND = 'tango.orm.sqlite_client' as const;\n readonly __tangoBrand: typeof SqliteClient.BRAND = SqliteClient.BRAND;\n private inTransaction = false;\n\n static isSqliteClient(value: unknown): value is SqliteClient {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === SqliteClient.BRAND\n );\n }\n\n constructor(private db: Database.Database) {}\n\n async query<T = any>(sql: string, params?: any[]): Promise<{ rows: T[] }> {\n const stmt = this.db.prepare(sql);\n\n if (/^\\s*(SELECT|PRAGMA)/i.test(sql)) {\n const rows = params ? stmt.all(...params) : stmt.all();\n return { rows: rows as T[] };\n }\n\n params ? stmt.run(...params) : stmt.run();\n return { rows: [] };\n }\n\n async begin(): Promise<void> {\n if (!this.inTransaction) {\n this.db.prepare('BEGIN').run();\n this.inTransaction = true;\n }\n }\n\n async commit(): Promise<void> {\n if (this.inTransaction) {\n this.db.prepare('COMMIT').run();\n this.inTransaction = false;\n }\n }\n\n async rollback(): Promise<void> {\n if (this.inTransaction) {\n this.db.prepare('ROLLBACK').run();\n this.inTransaction = false;\n }\n }\n\n async close(): Promise<void> {\n this.db.close();\n }\n}\n","import Database from 'better-sqlite3';\nimport type { Adapter, AdapterConfig } from '../Adapter';\nimport type { DBClient } from '../../clients/DBClient';\nimport { SqliteClient } from '../../clients/dialects/SqliteClient';\nexport class SqliteAdapter implements Adapter {\n static readonly BRAND = 'tango.orm.sqlite_adapter' as const;\n readonly __tangoBrand: typeof SqliteAdapter.BRAND = SqliteAdapter.BRAND;\n readonly name = 'sqlite';\n readonly features = {\n transactionalDDL: true,\n concurrentIndex: false,\n validateForeignKeys: false,\n };\n\n static isSqliteAdapter(value: unknown): value is SqliteAdapter {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === SqliteAdapter.BRAND\n );\n }\n\n async connect(config: AdapterConfig): Promise<DBClient> {\n const db = new Database(config.filename || ':memory:');\n db.pragma('journal_mode = WAL');\n db.pragma('foreign_keys = ON');\n\n return new SqliteClient(db);\n }\n}\n"],"mappings":";;;IAGa,eAAN,MAAM,aAAiC;CAC1C,OAAgB,QAAQ;CACxB,eAAmD,aAAa;CAChE,gBAAwB;CAExB,OAAO,eAAeA,OAAuC;AACzD,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,aAAa;CAE3E;CAED,YAAoBC,IAAuB;AAAA,OAAvB,KAAA;CAAyB;CAE7C,MAAM,MAAeC,KAAaC,QAAwC;EACtE,MAAM,OAAO,KAAK,GAAG,QAAQ,IAAI;AAEjC,MAAI,uBAAuB,KAAK,IAAI,EAAE;GAClC,MAAM,OAAO,SAAS,KAAK,IAAI,GAAG,OAAO,GAAG,KAAK,KAAK;AACtD,UAAO,EAAQ,KAAa;EAC/B;AAED,WAAS,KAAK,IAAI,GAAG,OAAO,GAAG,KAAK,KAAK;AACzC,SAAO,EAAE,MAAM,CAAE,EAAE;CACtB;CAED,MAAM,QAAuB;AACzB,OAAK,KAAK,eAAe;AACrB,QAAK,GAAG,QAAQ,QAAQ,CAAC,KAAK;AAC9B,QAAK,gBAAgB;EACxB;CACJ;CAED,MAAM,SAAwB;AAC1B,MAAI,KAAK,eAAe;AACpB,QAAK,GAAG,QAAQ,SAAS,CAAC,KAAK;AAC/B,QAAK,gBAAgB;EACxB;CACJ;CAED,MAAM,WAA0B;AAC5B,MAAI,KAAK,eAAe;AACpB,QAAK,GAAG,QAAQ,WAAW,CAAC,KAAK;AACjC,QAAK,gBAAgB;EACxB;CACJ;CAED,MAAM,QAAuB;AACzB,OAAK,GAAG,OAAO;CAClB;AACJ;;;;IClDY,gBAAN,MAAM,cAAiC;CAC1C,OAAgB,QAAQ;CACxB,eAAoD,cAAc;CAClE,OAAgB;CAChB,WAAoB;EAChB,kBAAkB;EAClB,iBAAiB;EACjB,qBAAqB;CACxB;CAED,OAAO,gBAAgBC,OAAwC;AAC3D,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,cAAc;CAE5E;CAED,MAAM,QAAQC,QAA0C;EACpD,MAAM,KAAK,IAAI,SAAS,OAAO,YAAY;AAC3C,KAAG,OAAO,qBAAqB;AAC/B,KAAG,OAAO,oBAAoB;AAE9B,SAAO,IAAI,aAAa;CAC3B;AACJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export class PostgresClient {
|
|
2
|
-
pool;
|
|
3
|
-
client;
|
|
4
|
-
static BRAND = 'tango.orm.postgres_client';
|
|
5
|
-
__tangoBrand = PostgresClient.BRAND;
|
|
6
|
-
static isPostgresClient(value) {
|
|
7
|
-
return (typeof value === 'object' &&
|
|
8
|
-
value !== null &&
|
|
9
|
-
value.__tangoBrand === PostgresClient.BRAND);
|
|
10
|
-
}
|
|
11
|
-
constructor(pool, client) {
|
|
12
|
-
this.pool = pool;
|
|
13
|
-
this.client = client;
|
|
14
|
-
}
|
|
15
|
-
async query(sql, params) {
|
|
16
|
-
const result = await this.client.query(sql, params);
|
|
17
|
-
return { rows: result.rows };
|
|
18
|
-
}
|
|
19
|
-
async begin() {
|
|
20
|
-
await this.client.query('BEGIN');
|
|
21
|
-
}
|
|
22
|
-
async commit() {
|
|
23
|
-
await this.client.query('COMMIT');
|
|
24
|
-
}
|
|
25
|
-
async rollback() {
|
|
26
|
-
await this.client.query('ROLLBACK');
|
|
27
|
-
}
|
|
28
|
-
async close() {
|
|
29
|
-
this.client.release();
|
|
30
|
-
await this.pool.end();
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
export class SqliteClient {
|
|
2
|
-
db;
|
|
3
|
-
static BRAND = 'tango.orm.sqlite_client';
|
|
4
|
-
__tangoBrand = SqliteClient.BRAND;
|
|
5
|
-
inTransaction = false;
|
|
6
|
-
static isSqliteClient(value) {
|
|
7
|
-
return (typeof value === 'object' &&
|
|
8
|
-
value !== null &&
|
|
9
|
-
value.__tangoBrand === SqliteClient.BRAND);
|
|
10
|
-
}
|
|
11
|
-
constructor(db) {
|
|
12
|
-
this.db = db;
|
|
13
|
-
}
|
|
14
|
-
async query(sql, params) {
|
|
15
|
-
const stmt = this.db.prepare(sql);
|
|
16
|
-
if (/^\s*(SELECT|PRAGMA)/i.test(sql)) {
|
|
17
|
-
const rows = params ? stmt.all(...params) : stmt.all();
|
|
18
|
-
return { rows: rows };
|
|
19
|
-
}
|
|
20
|
-
params ? stmt.run(...params) : stmt.run();
|
|
21
|
-
return { rows: [] };
|
|
22
|
-
}
|
|
23
|
-
async begin() {
|
|
24
|
-
if (!this.inTransaction) {
|
|
25
|
-
this.db.prepare('BEGIN').run();
|
|
26
|
-
this.inTransaction = true;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
async commit() {
|
|
30
|
-
if (this.inTransaction) {
|
|
31
|
-
this.db.prepare('COMMIT').run();
|
|
32
|
-
this.inTransaction = false;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
async rollback() {
|
|
36
|
-
if (this.inTransaction) {
|
|
37
|
-
this.db.prepare('ROLLBACK').run();
|
|
38
|
-
this.inTransaction = false;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
async close() {
|
|
42
|
-
this.db.close();
|
|
43
|
-
}
|
|
44
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection-DytAsjC9.js","names":["value: unknown","adapter: Adapter","name: string","config: AdapterConfig & { adapter: string }","registry?: AdapterRegistry"],"sources":["../src/connection/adapters/dialects/index.ts","../src/connection/adapters/AdapterRegistry.ts","../src/connection/adapters/index.ts","../src/connection/clients/dialects/index.ts","../src/connection/clients/index.ts","../src/connection/index.ts"],"sourcesContent":["/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { PostgresAdapter } from './PostgresAdapter';\nexport { SqliteAdapter } from './SqliteAdapter';\n","import type { Adapter, AdapterConfig } from './Adapter';\nimport type { DBClient } from '../clients/DBClient';\nexport class AdapterRegistry {\n static readonly BRAND = 'tango.orm.adapter_registry' as const;\n readonly __tangoBrand: typeof AdapterRegistry.BRAND = AdapterRegistry.BRAND;\n private static defaultRegistryInstance: AdapterRegistry | undefined;\n\n private adapters = new Map<string, Adapter>();\n\n static isAdapterRegistry(value: unknown): value is AdapterRegistry {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === AdapterRegistry.BRAND\n );\n }\n\n static async getDefaultRegistry(): Promise<AdapterRegistry> {\n if (AdapterRegistry.defaultRegistryInstance) {\n return AdapterRegistry.defaultRegistryInstance;\n }\n\n AdapterRegistry.defaultRegistryInstance = new AdapterRegistry();\n\n const { PostgresAdapter } = await import('./dialects/PostgresAdapter');\n const { SqliteAdapter } = await import('./dialects/SqliteAdapter');\n\n AdapterRegistry.defaultRegistryInstance.register(new PostgresAdapter());\n AdapterRegistry.defaultRegistryInstance.register(new SqliteAdapter());\n\n return AdapterRegistry.defaultRegistryInstance;\n }\n\n register(adapter: Adapter): this {\n this.adapters.set(adapter.name, adapter);\n return this;\n }\n\n get(name: string): Adapter {\n const adapter = this.adapters.get(name);\n if (!adapter) {\n const available = [...this.adapters.keys()].join(', ');\n throw new Error(`Unknown adapter: ${name}. Available adapters: ${available || 'none'}`);\n }\n return adapter;\n }\n\n has(name: string): boolean {\n return this.adapters.has(name);\n }\n}\n\nexport async function connectDB(\n config: AdapterConfig & { adapter: string },\n registry?: AdapterRegistry\n): Promise<DBClient> {\n const effectiveRegistry = registry ?? (await AdapterRegistry.getDefaultRegistry());\n const adapter = effectiveRegistry.get(config.adapter);\n return adapter.connect(config);\n}\n\nexport async function getDefaultAdapterRegistry(): Promise<AdapterRegistry> {\n return AdapterRegistry.getDefaultRegistry();\n}\n","/**\n * Domain boundary barrel: exposes namespaced exports for Django-style drill-down\n * imports and curated flat exports for TS-native ergonomics.\n */\n\nexport * as dialects from './dialects/index';\n\nexport { AdapterRegistry, connectDB, getDefaultAdapterRegistry } from './AdapterRegistry';\nexport type { Adapter, AdapterConfig } from './Adapter';\nexport { PostgresAdapter, SqliteAdapter } from './dialects/index';\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { PostgresClient } from './PostgresClient';\nexport { SqliteClient } from './SqliteClient';\n","/**\n * Domain boundary barrel: exposes namespaced exports for Django-style drill-down\n * imports and curated flat exports for TS-native ergonomics.\n */\n\nexport * as dialects from './dialects/index';\n\nexport type { DBClient } from './DBClient';\nexport { PostgresClient, SqliteClient } from './dialects/index';\n","/**\n * Domain boundary barrel: exposes namespaced exports for Django-style drill-down\n * imports and curated flat exports for TS-native ergonomics.\n */\n\nexport * as adapters from './adapters/index';\nexport * as clients from './clients/index';\n\nexport { AdapterRegistry, connectDB, getDefaultAdapterRegistry } from './adapters/index';\nexport type { Adapter, AdapterConfig } from './adapters/index';\nexport type { DBClient } from './clients/DBClient';\nexport { PostgresAdapter, SqliteAdapter } from './adapters/index';\nexport { PostgresClient, SqliteClient } from './clients/index';\n"],"mappings":";;;;;;;;;;;;;ICEa,kBAAN,MAAM,gBAAgB;CACzB,OAAgB,QAAQ;CACxB,eAAsD,gBAAgB;CACtE,OAAe;CAEf,WAAmB,IAAI;CAEvB,OAAO,kBAAkBA,OAA0C;AAC/D,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,gBAAgB;CAE9E;CAED,aAAa,qBAA+C;AACxD,MAAI,gBAAgB,wBAChB,QAAO,gBAAgB;AAG3B,kBAAgB,0BAA0B,IAAI;EAE9C,MAAM,EAAE,oCAAiB,GAAG,MAAM,OAAO;EACzC,MAAM,EAAE,gCAAe,GAAG,MAAM,OAAO;AAEvC,kBAAgB,wBAAwB,SAAS,IAAI,oBAAkB;AACvE,kBAAgB,wBAAwB,SAAS,IAAI,kBAAgB;AAErE,SAAO,gBAAgB;CAC1B;CAED,SAASC,SAAwB;AAC7B,OAAK,SAAS,IAAI,QAAQ,MAAM,QAAQ;AACxC,SAAO;CACV;CAED,IAAIC,MAAuB;EACvB,MAAM,UAAU,KAAK,SAAS,IAAI,KAAK;AACvC,OAAK,SAAS;GACV,MAAM,YAAY,CAAC,GAAG,KAAK,SAAS,MAAM,AAAC,EAAC,KAAK,KAAK;AACtD,SAAM,IAAI,OAAO,mBAAmB,KAAK,wBAAwB,aAAa,OAAO;EACxF;AACD,SAAO;CACV;CAED,IAAIA,MAAuB;AACvB,SAAO,KAAK,SAAS,IAAI,KAAK;CACjC;AACJ;AAEM,eAAe,UAClBC,QACAC,UACiB;CACjB,MAAM,oBAAoB,YAAa,MAAM,gBAAgB,oBAAoB;CACjF,MAAM,UAAU,kBAAkB,IAAI,OAAO,QAAQ;AACrD,QAAO,QAAQ,QAAQ,OAAO;AACjC;AAEM,eAAe,4BAAsD;AACxE,QAAO,gBAAgB,oBAAoB;AAC9C"}
|