@tinqerjs/better-sqlite3-adapter 0.0.21
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/expression-generator.d.ts +18 -0
- package/dist/expression-generator.d.ts.map +1 -0
- package/dist/expression-generator.js +756 -0
- package/dist/expression-generator.js.map +1 -0
- package/dist/generators/all.d.ts +11 -0
- package/dist/generators/all.d.ts.map +1 -0
- package/dist/generators/all.js +15 -0
- package/dist/generators/all.js.map +1 -0
- package/dist/generators/any.d.ts +11 -0
- package/dist/generators/any.d.ts.map +1 -0
- package/dist/generators/any.js +20 -0
- package/dist/generators/any.js.map +1 -0
- package/dist/generators/average.d.ts +10 -0
- package/dist/generators/average.d.ts.map +1 -0
- package/dist/generators/average.js +15 -0
- package/dist/generators/average.js.map +1 -0
- package/dist/generators/count.d.ts +10 -0
- package/dist/generators/count.d.ts.map +1 -0
- package/dist/generators/count.js +11 -0
- package/dist/generators/count.js.map +1 -0
- package/dist/generators/delete.d.ts +10 -0
- package/dist/generators/delete.d.ts.map +1 -0
- package/dist/generators/delete.js +24 -0
- package/dist/generators/delete.js.map +1 -0
- package/dist/generators/distinct.d.ts +11 -0
- package/dist/generators/distinct.d.ts.map +1 -0
- package/dist/generators/distinct.js +12 -0
- package/dist/generators/distinct.js.map +1 -0
- package/dist/generators/first.d.ts +12 -0
- package/dist/generators/first.d.ts.map +1 -0
- package/dist/generators/first.js +13 -0
- package/dist/generators/first.js.map +1 -0
- package/dist/generators/from.d.ts +10 -0
- package/dist/generators/from.d.ts.map +1 -0
- package/dist/generators/from.js +41 -0
- package/dist/generators/from.js.map +1 -0
- package/dist/generators/groupby.d.ts +10 -0
- package/dist/generators/groupby.d.ts.map +1 -0
- package/dist/generators/groupby.js +36 -0
- package/dist/generators/groupby.js.map +1 -0
- package/dist/generators/insert.d.ts +11 -0
- package/dist/generators/insert.d.ts.map +1 -0
- package/dist/generators/insert.js +61 -0
- package/dist/generators/insert.js.map +1 -0
- package/dist/generators/join.d.ts +10 -0
- package/dist/generators/join.d.ts.map +1 -0
- package/dist/generators/join.js +246 -0
- package/dist/generators/join.js.map +1 -0
- package/dist/generators/last.d.ts +13 -0
- package/dist/generators/last.d.ts.map +1 -0
- package/dist/generators/last.js +16 -0
- package/dist/generators/last.js.map +1 -0
- package/dist/generators/max.d.ts +10 -0
- package/dist/generators/max.d.ts.map +1 -0
- package/dist/generators/max.js +15 -0
- package/dist/generators/max.js.map +1 -0
- package/dist/generators/min.d.ts +10 -0
- package/dist/generators/min.d.ts.map +1 -0
- package/dist/generators/min.js +15 -0
- package/dist/generators/min.js.map +1 -0
- package/dist/generators/orderby.d.ts +10 -0
- package/dist/generators/orderby.d.ts.map +1 -0
- package/dist/generators/orderby.js +66 -0
- package/dist/generators/orderby.js.map +1 -0
- package/dist/generators/select.d.ts +10 -0
- package/dist/generators/select.d.ts.map +1 -0
- package/dist/generators/select.js +34 -0
- package/dist/generators/select.js.map +1 -0
- package/dist/generators/single.d.ts +12 -0
- package/dist/generators/single.d.ts.map +1 -0
- package/dist/generators/single.js +13 -0
- package/dist/generators/single.js.map +1 -0
- package/dist/generators/skip.d.ts +10 -0
- package/dist/generators/skip.d.ts.map +1 -0
- package/dist/generators/skip.js +18 -0
- package/dist/generators/skip.js.map +1 -0
- package/dist/generators/sum.d.ts +10 -0
- package/dist/generators/sum.d.ts.map +1 -0
- package/dist/generators/sum.js +15 -0
- package/dist/generators/sum.js.map +1 -0
- package/dist/generators/take.d.ts +10 -0
- package/dist/generators/take.d.ts.map +1 -0
- package/dist/generators/take.js +18 -0
- package/dist/generators/take.js.map +1 -0
- package/dist/generators/thenby.d.ts +11 -0
- package/dist/generators/thenby.d.ts.map +1 -0
- package/dist/generators/thenby.js +58 -0
- package/dist/generators/thenby.js.map +1 -0
- package/dist/generators/update.d.ts +11 -0
- package/dist/generators/update.d.ts.map +1 -0
- package/dist/generators/update.js +69 -0
- package/dist/generators/update.js.map +1 -0
- package/dist/generators/where.d.ts +10 -0
- package/dist/generators/where.d.ts.map +1 -0
- package/dist/generators/where.js +12 -0
- package/dist/generators/where.js.map +1 -0
- package/dist/index.d.ts +172 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +234 -0
- package/dist/index.js.map +1 -0
- package/dist/sql-generator.d.ts +9 -0
- package/dist/sql-generator.d.ts.map +1 -0
- package/dist/sql-generator.js +325 -0
- package/dist/sql-generator.js.map +1 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TAKE (LIMIT) clause generator
|
|
3
|
+
*/
|
|
4
|
+
import { generateValueExpression } from "../expression-generator.js";
|
|
5
|
+
/**
|
|
6
|
+
* Generate LIMIT clause
|
|
7
|
+
*/
|
|
8
|
+
export function generateTake(operation, context) {
|
|
9
|
+
if (typeof operation.count === "number") {
|
|
10
|
+
return `LIMIT ${operation.count}`;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
// Handle as expression (ParamRef, ArithmeticExpression, etc.)
|
|
14
|
+
const expr = generateValueExpression(operation.count, context);
|
|
15
|
+
return `LIMIT ${expr}`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=take.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"take.js","sourceRoot":"","sources":["../../src/generators/take.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAwB,EAAE,OAAmB;IACxE,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,SAAS,SAAS,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,8DAA8D;QAC9D,MAAM,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC,KAAwB,EAAE,OAAO,CAAC,CAAC;QAClF,OAAO,SAAS,IAAI,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THEN BY clause generator
|
|
3
|
+
*/
|
|
4
|
+
import type { ThenByOperation } from "@tinqerjs/tinqer";
|
|
5
|
+
import type { SqlContext } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Generate additional ORDER BY clause
|
|
8
|
+
* Note: THEN BY in SQL is just additional ORDER BY columns
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateThenBy(operation: ThenByOperation, context: SqlContext): string;
|
|
11
|
+
//# sourceMappingURL=thenby.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thenby.d.ts","sourceRoot":"","sources":["../../src/generators/thenby.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CA4CtF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THEN BY clause generator
|
|
3
|
+
*/
|
|
4
|
+
import { generateValueExpression } from "../expression-generator.js";
|
|
5
|
+
/**
|
|
6
|
+
* Generate additional ORDER BY clause
|
|
7
|
+
* Note: THEN BY in SQL is just additional ORDER BY columns
|
|
8
|
+
*/
|
|
9
|
+
export function generateThenBy(operation, context) {
|
|
10
|
+
let orderByExpr;
|
|
11
|
+
if (typeof operation.keySelector === "string") {
|
|
12
|
+
// Simple column name - check if it maps to a source column
|
|
13
|
+
// Check if it's a path like "u.age"
|
|
14
|
+
if (operation.keySelector.includes(".") && context.symbolTable) {
|
|
15
|
+
const parts = operation.keySelector.split(".");
|
|
16
|
+
if (parts.length === 2) {
|
|
17
|
+
const tableRef = context.symbolTable.entries.get(parts[0]);
|
|
18
|
+
if (tableRef && tableRef.columnName === "*") {
|
|
19
|
+
orderByExpr = `"${tableRef.tableAlias}"."${parts[1]}"`;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
// Try full path
|
|
23
|
+
const pathRef = context.symbolTable.entries.get(operation.keySelector);
|
|
24
|
+
if (pathRef) {
|
|
25
|
+
orderByExpr = `"${pathRef.tableAlias}"."${pathRef.columnName}"`;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
orderByExpr = `"${operation.keySelector}"`;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
orderByExpr = `"${operation.keySelector}"`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else if (context.symbolTable) {
|
|
37
|
+
const sourceRef = context.symbolTable.entries.get(operation.keySelector);
|
|
38
|
+
if (sourceRef) {
|
|
39
|
+
orderByExpr = `"${sourceRef.tableAlias}"."${sourceRef.columnName}"`;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
orderByExpr = `"${operation.keySelector}"`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
orderByExpr = `"${operation.keySelector}"`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Complex expression
|
|
51
|
+
orderByExpr = generateValueExpression(operation.keySelector, context);
|
|
52
|
+
}
|
|
53
|
+
const direction = operation.descending ? "DESC" : "ASC";
|
|
54
|
+
// Note: This returns just the additional column, not the full ORDER BY clause
|
|
55
|
+
// The orchestrator will combine all ORDER BY columns
|
|
56
|
+
return `, ${orderByExpr} ${direction}`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=thenby.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thenby.js","sourceRoot":"","sources":["../../src/generators/thenby.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAA0B,EAAE,OAAmB;IAC5E,IAAI,WAAmB,CAAC;IAExB,IAAI,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC9C,2DAA2D;QAE3D,oCAAoC;QACpC,IAAI,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAC/D,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;gBAC5D,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC5C,WAAW,GAAG,IAAI,QAAQ,CAAC,UAAU,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;gBACzD,CAAC;qBAAM,CAAC;oBACN,gBAAgB;oBAChB,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;oBACvE,IAAI,OAAO,EAAE,CAAC;wBACZ,WAAW,GAAG,IAAI,OAAO,CAAC,UAAU,MAAM,OAAO,CAAC,UAAU,GAAG,CAAC;oBAClE,CAAC;yBAAM,CAAC;wBACN,WAAW,GAAG,IAAI,SAAS,CAAC,WAAW,GAAG,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,IAAI,SAAS,CAAC,WAAW,GAAG,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACzE,IAAI,SAAS,EAAE,CAAC;gBACd,WAAW,GAAG,IAAI,SAAS,CAAC,UAAU,MAAM,SAAS,CAAC,UAAU,GAAG,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,IAAI,SAAS,CAAC,WAAW,GAAG,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,IAAI,SAAS,CAAC,WAAW,GAAG,CAAC;QAC7C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,qBAAqB;QACrB,WAAW,GAAG,uBAAuB,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACxD,8EAA8E;IAC9E,qDAAqD;IACrD,OAAO,KAAK,WAAW,IAAI,SAAS,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UPDATE SQL generation for SQLite (better-sqlite3)
|
|
3
|
+
*/
|
|
4
|
+
import type { UpdateOperation } from "@tinqerjs/tinqer";
|
|
5
|
+
import type { SqlContext } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Generate UPDATE SQL statement
|
|
8
|
+
* SQLite supports RETURNING clause since version 3.35.0 (March 2021)
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateUpdate(operation: UpdateOperation, context: SqlContext): string;
|
|
11
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/generators/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAyB9C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAiDtF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UPDATE SQL generation for SQLite (better-sqlite3)
|
|
3
|
+
*/
|
|
4
|
+
import { generateExpression, generateBooleanExpression } from "../expression-generator.js";
|
|
5
|
+
function shouldSkipAssignment(valueExpr, context) {
|
|
6
|
+
if (valueExpr.type === "param") {
|
|
7
|
+
const paramExpr = valueExpr;
|
|
8
|
+
const paramName = paramExpr.property || paramExpr.param;
|
|
9
|
+
const params = context.params;
|
|
10
|
+
if (!params) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
if (Object.prototype.hasOwnProperty.call(params, paramName)) {
|
|
14
|
+
return params[paramName] === undefined;
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
if (valueExpr.type === "constant") {
|
|
19
|
+
const constant = valueExpr;
|
|
20
|
+
return constant.value === undefined;
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Generate UPDATE SQL statement
|
|
26
|
+
* SQLite supports RETURNING clause since version 3.35.0 (March 2021)
|
|
27
|
+
*/
|
|
28
|
+
export function generateUpdate(operation, context) {
|
|
29
|
+
const tableName = operation.schema
|
|
30
|
+
? `"${operation.schema}"."${operation.table}"`
|
|
31
|
+
: `"${operation.table}"`;
|
|
32
|
+
// Extract SET assignments from the assignments object expression
|
|
33
|
+
const assignments = [];
|
|
34
|
+
if (operation.assignments.type === "object") {
|
|
35
|
+
for (const [column, valueExpr] of Object.entries(operation.assignments.properties)) {
|
|
36
|
+
if (shouldSkipAssignment(valueExpr, context)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const value = generateExpression(valueExpr, context);
|
|
40
|
+
assignments.push(`"${column}" = ${value}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (assignments.length === 0) {
|
|
44
|
+
throw new Error("UPDATE must specify at least one column assignment. All provided values were undefined.");
|
|
45
|
+
}
|
|
46
|
+
let sql = `UPDATE ${tableName} SET ${assignments.join(", ")}`;
|
|
47
|
+
// Add WHERE clause if specified
|
|
48
|
+
if (operation.predicate) {
|
|
49
|
+
const whereClause = generateBooleanExpression(operation.predicate, context);
|
|
50
|
+
sql += ` WHERE ${whereClause}`;
|
|
51
|
+
}
|
|
52
|
+
else if (!operation.allowFullTableUpdate) {
|
|
53
|
+
throw new Error("UPDATE requires a WHERE clause or explicit allowFullTableUpdate(). " +
|
|
54
|
+
"Full table updates are dangerous and must be explicitly allowed.");
|
|
55
|
+
}
|
|
56
|
+
// SQLite supports RETURNING clause since version 3.35.0
|
|
57
|
+
if (operation.returning !== undefined) {
|
|
58
|
+
// Handle AllColumnsExpression (identity function like .returning(u => u))
|
|
59
|
+
if (operation.returning.type === "allColumns") {
|
|
60
|
+
sql += ` RETURNING *`;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const returningExpr = generateExpression(operation.returning, context);
|
|
64
|
+
sql += ` RETURNING ${returningExpr}`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return sql;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/generators/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHERE clause generator
|
|
3
|
+
*/
|
|
4
|
+
import type { WhereOperation } from "@tinqerjs/tinqer";
|
|
5
|
+
import type { SqlContext } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Generate WHERE clause
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateWhere(operation: WhereOperation, context: SqlContext): string;
|
|
10
|
+
//# sourceMappingURL=where.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../src/generators/where.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAGpF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHERE clause generator
|
|
3
|
+
*/
|
|
4
|
+
import { generateBooleanExpression } from "../expression-generator.js";
|
|
5
|
+
/**
|
|
6
|
+
* Generate WHERE clause
|
|
7
|
+
*/
|
|
8
|
+
export function generateWhere(operation, context) {
|
|
9
|
+
const predicate = generateBooleanExpression(operation.predicate, context);
|
|
10
|
+
return `WHERE ${predicate}`;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=where.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where.js","sourceRoot":"","sources":["../../src/generators/where.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,SAAyB,EAAE,OAAmB;IAC1E,MAAM,SAAS,GAAG,yBAAyB,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1E,OAAO,SAAS,SAAS,EAAE,CAAC;AAC9B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Better SQLite3 SQL generator for Tinqer
|
|
3
|
+
*/
|
|
4
|
+
import { type Queryable, type OrderedQueryable, type TerminalQuery, type QueryHelpers, type QueryBuilder, type DatabaseSchema, type Insertable, type InsertableWithReturning, type UpdatableWithSet, type UpdatableComplete, type UpdatableWithReturning, type Deletable, type DeletableComplete, type ParseQueryOptions, type QueryOperation, SelectPlanHandle, SelectTerminalHandle, InsertPlanHandleInitial, InsertPlanHandleWithValues, InsertPlanHandleWithReturning, UpdatePlanHandleWithSet, UpdatePlanHandleComplete, UpdatePlanHandleWithReturning, DeletePlanHandleInitial, DeletePlanHandleComplete } from "@tinqerjs/tinqer";
|
|
5
|
+
import type { ExecuteOptions } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Convert a SELECT plan to SQL string with parameters
|
|
8
|
+
*/
|
|
9
|
+
export declare function toSql<TRecord, TParams>(plan: SelectPlanHandle<TRecord, TParams>, params: TParams): {
|
|
10
|
+
sql: string;
|
|
11
|
+
params: Record<string, unknown>;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Convert a SELECT terminal plan to SQL string with parameters
|
|
15
|
+
*/
|
|
16
|
+
export declare function toSql<TResult, TParams>(plan: SelectTerminalHandle<TResult, TParams>, params: TParams): {
|
|
17
|
+
sql: string;
|
|
18
|
+
params: Record<string, unknown>;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Convert an INSERT plan (initial) to SQL string with parameters
|
|
22
|
+
*/
|
|
23
|
+
export declare function toSql<TRecord, TParams>(plan: InsertPlanHandleInitial<TRecord, TParams>, params: TParams): {
|
|
24
|
+
sql: string;
|
|
25
|
+
params: Record<string, unknown>;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Convert an INSERT plan to SQL string with parameters
|
|
29
|
+
*/
|
|
30
|
+
export declare function toSql<TRecord, TParams>(plan: InsertPlanHandleWithValues<TRecord, TParams>, params: TParams): {
|
|
31
|
+
sql: string;
|
|
32
|
+
params: Record<string, unknown>;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Convert an INSERT plan with RETURNING to SQL string with parameters
|
|
36
|
+
*/
|
|
37
|
+
export declare function toSql<TResult, TParams>(plan: InsertPlanHandleWithReturning<TResult, TParams>, params: TParams): {
|
|
38
|
+
sql: string;
|
|
39
|
+
params: Record<string, unknown>;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Convert an UPDATE plan (with set) to SQL string with parameters
|
|
43
|
+
*/
|
|
44
|
+
export declare function toSql<TRecord, TParams>(plan: UpdatePlanHandleWithSet<TRecord, TParams>, params: TParams): {
|
|
45
|
+
sql: string;
|
|
46
|
+
params: Record<string, unknown>;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Convert an UPDATE plan to SQL string with parameters
|
|
50
|
+
*/
|
|
51
|
+
export declare function toSql<TRecord, TParams>(plan: UpdatePlanHandleComplete<TRecord, TParams>, params: TParams): {
|
|
52
|
+
sql: string;
|
|
53
|
+
params: Record<string, unknown>;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Convert an UPDATE plan with RETURNING to SQL string with parameters
|
|
57
|
+
*/
|
|
58
|
+
export declare function toSql<TResult, TParams>(plan: UpdatePlanHandleWithReturning<TResult, TParams>, params: TParams): {
|
|
59
|
+
sql: string;
|
|
60
|
+
params: Record<string, unknown>;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Convert a DELETE plan (initial) to SQL string with parameters
|
|
64
|
+
*/
|
|
65
|
+
export declare function toSql<TParams>(plan: DeletePlanHandleInitial<unknown, TParams>, params: TParams): {
|
|
66
|
+
sql: string;
|
|
67
|
+
params: Record<string, unknown>;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Convert a DELETE plan to SQL string with parameters
|
|
71
|
+
*/
|
|
72
|
+
export declare function toSql<TParams>(plan: DeletePlanHandleComplete<unknown, TParams>, params: TParams): {
|
|
73
|
+
sql: string;
|
|
74
|
+
params: Record<string, unknown>;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Convert a SELECT plan (either regular or terminal) to SQL string with parameters
|
|
78
|
+
*/
|
|
79
|
+
export declare function toSql<TParams>(plan: SelectPlanHandle<unknown, TParams> | SelectTerminalHandle<unknown, TParams>, params: TParams): {
|
|
80
|
+
sql: string;
|
|
81
|
+
params: Record<string, unknown>;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Simpler API for generating SQL with auto-parameterization
|
|
85
|
+
* @param queryable A Queryable or TerminalQuery object
|
|
86
|
+
* @param options Parse options including cache control
|
|
87
|
+
* @returns Object with text (SQL string), parameters, and preserved result type
|
|
88
|
+
*/
|
|
89
|
+
export declare function finalize<TParams = Record<string, never>>(plan: {
|
|
90
|
+
finalize(params: TParams): {
|
|
91
|
+
operation: QueryOperation;
|
|
92
|
+
params: Record<string, unknown>;
|
|
93
|
+
};
|
|
94
|
+
}, params?: TParams): {
|
|
95
|
+
text: string;
|
|
96
|
+
parameters: Record<string, unknown>;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Database interface for Better SQLite3 compatibility
|
|
100
|
+
*/
|
|
101
|
+
interface BetterSqlite3Database {
|
|
102
|
+
prepare(sql: string): {
|
|
103
|
+
all(params?: Record<string, unknown>): unknown[];
|
|
104
|
+
get(params?: Record<string, unknown>): unknown;
|
|
105
|
+
run(params?: Record<string, unknown>): {
|
|
106
|
+
changes: number;
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Execute a query with params and helpers
|
|
112
|
+
*/
|
|
113
|
+
export declare function executeSelect<TSchema, TParams, TQuery extends Queryable<unknown> | OrderedQueryable<unknown> | TerminalQuery<unknown>>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>, params: TParams, helpers: QueryHelpers) => TQuery, params: TParams, options?: ExecuteOptions & ParseQueryOptions): TQuery extends Queryable<infer T> ? T[] : TQuery extends OrderedQueryable<infer T> ? T[] : TQuery extends TerminalQuery<infer T> ? T : never;
|
|
114
|
+
/**
|
|
115
|
+
* Execute a query with params only (no helpers)
|
|
116
|
+
*/
|
|
117
|
+
export declare function executeSelect<TSchema, TParams, TQuery extends Queryable<unknown> | OrderedQueryable<unknown> | TerminalQuery<unknown>>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>, params: TParams) => TQuery, params: TParams, options?: ExecuteOptions & ParseQueryOptions): TQuery extends Queryable<infer T> ? T[] : TQuery extends OrderedQueryable<infer T> ? T[] : TQuery extends TerminalQuery<infer T> ? T : never;
|
|
118
|
+
/**
|
|
119
|
+
* Execute a query with query builder only (no params, no helpers)
|
|
120
|
+
*/
|
|
121
|
+
export declare function executeSelect<TSchema, TQuery extends Queryable<unknown> | OrderedQueryable<unknown> | TerminalQuery<unknown>>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>) => TQuery): TQuery extends Queryable<infer T> ? T[] : TQuery extends OrderedQueryable<infer T> ? T[] : TQuery extends TerminalQuery<infer T> ? T : never;
|
|
122
|
+
/**
|
|
123
|
+
* Execute a query with no parameters
|
|
124
|
+
* @param dbClient Better SQLite3 database instance
|
|
125
|
+
* @param schema Database context with schema information
|
|
126
|
+
* @param builder Function that builds the query using LINQ operations with DSL and helpers
|
|
127
|
+
* @param options Optional execution options (e.g., SQL inspection callback)
|
|
128
|
+
* @returns Query results, properly typed based on the query
|
|
129
|
+
*/
|
|
130
|
+
export declare function executeSelectSimple<TSchema, TQuery extends Queryable<unknown> | OrderedQueryable<unknown> | TerminalQuery<unknown>>(dbClient: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>, _params: Record<string, never>, helpers: QueryHelpers) => TQuery, options?: ExecuteOptions & ParseQueryOptions): TQuery extends Queryable<infer T> ? T[] : TQuery extends OrderedQueryable<infer T> ? T[] : TQuery extends TerminalQuery<infer T> ? T : never;
|
|
131
|
+
/**
|
|
132
|
+
* Execute INSERT with params, return row count
|
|
133
|
+
*/
|
|
134
|
+
export declare function executeInsert<TSchema, TParams, TTable>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>, params: TParams) => Insertable<TTable>, params: TParams, options?: ExecuteOptions & ParseQueryOptions): number;
|
|
135
|
+
/**
|
|
136
|
+
* Execute INSERT with params and RETURNING (not supported by SQLite)
|
|
137
|
+
*/
|
|
138
|
+
export declare function executeInsert<TSchema, TParams, TTable, TReturning>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>, params: TParams) => InsertableWithReturning<TTable, TReturning>, params: TParams, options?: ExecuteOptions & ParseQueryOptions): never;
|
|
139
|
+
/**
|
|
140
|
+
* Execute INSERT without params, return row count
|
|
141
|
+
*/
|
|
142
|
+
export declare function executeInsert<TSchema, TTable>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>) => Insertable<TTable>): number;
|
|
143
|
+
/**
|
|
144
|
+
* Execute INSERT without params, with RETURNING (not supported by SQLite)
|
|
145
|
+
*/
|
|
146
|
+
export declare function executeInsert<TSchema, TTable, TReturning>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>) => InsertableWithReturning<TTable, TReturning>): never;
|
|
147
|
+
/**
|
|
148
|
+
* Execute UPDATE with params, return row count
|
|
149
|
+
*/
|
|
150
|
+
export declare function executeUpdate<TSchema, TParams, TTable>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>, params: TParams) => UpdatableWithSet<TTable> | UpdatableComplete<TTable>, params: TParams, options?: ExecuteOptions & ParseQueryOptions): number;
|
|
151
|
+
/**
|
|
152
|
+
* Execute UPDATE with params and RETURNING (not supported by SQLite)
|
|
153
|
+
*/
|
|
154
|
+
export declare function executeUpdate<TSchema, TParams, TTable, TReturning>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>, params: TParams) => UpdatableWithReturning<TTable, TReturning>, params: TParams, options?: ExecuteOptions & ParseQueryOptions): never;
|
|
155
|
+
/**
|
|
156
|
+
* Execute UPDATE without params, return row count
|
|
157
|
+
*/
|
|
158
|
+
export declare function executeUpdate<TSchema, TTable>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>) => UpdatableWithSet<TTable> | UpdatableComplete<TTable>): number;
|
|
159
|
+
/**
|
|
160
|
+
* Execute UPDATE without params, with RETURNING (not supported by SQLite)
|
|
161
|
+
*/
|
|
162
|
+
export declare function executeUpdate<TSchema, TTable, TReturning>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>) => UpdatableWithReturning<TTable, TReturning>): never;
|
|
163
|
+
/**
|
|
164
|
+
* Execute DELETE with params, return row count
|
|
165
|
+
*/
|
|
166
|
+
export declare function executeDelete<TSchema, TParams, TResult>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>, params: TParams) => Deletable<TResult> | DeletableComplete<TResult>, params: TParams, options?: ExecuteOptions & ParseQueryOptions): number;
|
|
167
|
+
/**
|
|
168
|
+
* Execute DELETE without params, return row count
|
|
169
|
+
*/
|
|
170
|
+
export declare function executeDelete<TSchema, TResult>(db: BetterSqlite3Database, schema: DatabaseSchema<TSchema>, builder: (queryBuilder: QueryBuilder<TSchema>) => Deletable<TResult> | DeletableComplete<TResult>): number;
|
|
171
|
+
export type { SqlResult, ExecuteOptions } from "./types.js";
|
|
172
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAMtB,KAAK,cAAc,EAGnB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA8DjD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EACpC,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,EACxC,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EACpC,IAAI,EAAE,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC5C,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EACpC,IAAI,EAAE,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC/C,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EACpC,IAAI,EAAE,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,EAClD,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EACpC,IAAI,EAAE,6BAA6B,CAAC,OAAO,EAAE,OAAO,CAAC,EACrD,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EACpC,IAAI,EAAE,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC/C,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EACpC,IAAI,EAAE,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,EAChD,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EACpC,IAAI,EAAE,6BAA6B,CAAC,OAAO,EAAE,OAAO,CAAC,EACrD,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAC3B,IAAI,EAAE,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC/C,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAC3B,IAAI,EAAE,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,EAChD,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAC3B,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,EACjF,MAAM,EAAE,OAAO,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AA0BpD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACtD,IAAI,EAAE;IACJ,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG;QACzB,SAAS,EAAE,cAAc,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,CAAC;CACH,EACD,MAAM,CAAC,EAAE,OAAO,GACf;IACD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAKA;AAED;;GAEG;AACH,UAAU,qBAAqB;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QACpB,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;QACjD,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5D,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EACP,OAAO,EACP,MAAM,SAAS,SAAS,CAAC,OAAO,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAEtF,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,KAAK,MAAM,EAChG,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,cAAc,GAAG,iBAAiB,GAC3C,MAAM,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,GAChC,CAAC,EAAE,GACH,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,CAAC,GACtC,CAAC,EAAE,GACH,MAAM,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GACnC,CAAC,GACD,KAAK,CAAC;AAEd;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EACP,OAAO,EACP,MAAM,SAAS,SAAS,CAAC,OAAO,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAEtF,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,KAAK,MAAM,EACzE,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,cAAc,GAAG,iBAAiB,GAC3C,MAAM,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,GAChC,CAAC,EAAE,GACH,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,CAAC,GACtC,CAAC,EAAE,GACH,MAAM,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GACnC,CAAC,GACD,KAAK,CAAC;AAEd;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EACP,MAAM,SAAS,SAAS,CAAC,OAAO,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAEtF,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,MAAM,GACvD,MAAM,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,GAChC,CAAC,EAAE,GACH,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,CAAC,GACtC,CAAC,EAAE,GACH,MAAM,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GACnC,CAAC,GACD,KAAK,CAAC;AAoGd;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EACP,MAAM,SAAS,SAAS,CAAC,OAAO,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAEtF,QAAQ,EAAE,qBAAqB,EAC/B,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CACP,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC9B,OAAO,EAAE,YAAY,KAClB,MAAM,EACX,OAAO,GAAE,cAAc,GAAG,iBAAsB,GAC/C,MAAM,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,GAChC,CAAC,EAAE,GACH,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,CAAC,GACtC,CAAC,EAAE,GACH,MAAM,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GACnC,CAAC,GACD,KAAK,CAEZ;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EACpD,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,KAAK,UAAU,CAAC,MAAM,CAAC,EACrF,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,cAAc,GAAG,iBAAiB,GAC3C,MAAM,CAAC;AAEV;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAChE,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CACP,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EACnC,MAAM,EAAE,OAAO,KACZ,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC,EAChD,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,cAAc,GAAG,iBAAiB,GAC3C,KAAK,CAAC;AAET;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAC3C,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,GACnE,MAAM,CAAC;AAEV;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EACvD,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC,GAC5F,KAAK,CAAC;AAoDT;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EACpD,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CACP,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EACnC,MAAM,EAAE,OAAO,KACZ,gBAAgB,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,EACzD,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,cAAc,GAAG,iBAAiB,GAC3C,MAAM,CAAC;AAEV;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAChE,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CACP,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EACnC,MAAM,EAAE,OAAO,KACZ,sBAAsB,CAAC,MAAM,EAAE,UAAU,CAAC,EAC/C,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,cAAc,GAAG,iBAAiB,GAC3C,KAAK,CAAC;AAET;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAC3C,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CACP,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,KAChC,gBAAgB,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,GACxD,MAAM,CAAC;AAEV;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EACvD,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,sBAAsB,CAAC,MAAM,EAAE,UAAU,CAAC,GAC3F,KAAK,CAAC;AAuDT;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EACrD,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CACP,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EACnC,MAAM,EAAE,OAAO,KACZ,SAAS,CAAC,OAAO,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,EACpD,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,cAAc,GAAG,iBAAiB,GAC3C,MAAM,CAAC;AAEV;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAC5C,EAAE,EAAE,qBAAqB,EACzB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAChG,MAAM,CAAC;AAiCV,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Better SQLite3 SQL generator for Tinqer
|
|
3
|
+
*/
|
|
4
|
+
import { defineSelect, defineInsert, defineUpdate, defineDelete, isTerminalHandle, } from "@tinqerjs/tinqer";
|
|
5
|
+
import { generateSql } from "./sql-generator.js";
|
|
6
|
+
/**
|
|
7
|
+
* Helper function to expand array parameters into indexed parameters
|
|
8
|
+
* e.g., { ids: [1, 2, 3] } becomes { ids: [1, 2, 3], "ids_0": 1, "ids_1": 2, "ids_2": 3 }
|
|
9
|
+
*/
|
|
10
|
+
function expandArrayParams(params) {
|
|
11
|
+
const expanded = { ...params };
|
|
12
|
+
for (const [key, value] of Object.entries(params)) {
|
|
13
|
+
if (Array.isArray(value)) {
|
|
14
|
+
value.forEach((item, index) => {
|
|
15
|
+
expanded[`${key}_${index}`] = item;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return expanded;
|
|
20
|
+
}
|
|
21
|
+
function materializePlan(plan, params) {
|
|
22
|
+
const { operation, params: mergedParams } = plan.finalize(params);
|
|
23
|
+
const sql = generateSql(operation, mergedParams);
|
|
24
|
+
const expandedParams = expandArrayParams(mergedParams);
|
|
25
|
+
return { operation, mergedParams, sql, expandedParams };
|
|
26
|
+
}
|
|
27
|
+
function normalizeSqliteParams(params) {
|
|
28
|
+
const converted = {};
|
|
29
|
+
for (const [key, value] of Object.entries(params)) {
|
|
30
|
+
if (typeof value === "boolean") {
|
|
31
|
+
converted[key] = value ? 1 : 0;
|
|
32
|
+
}
|
|
33
|
+
else if (value instanceof Date) {
|
|
34
|
+
const year = value.getFullYear();
|
|
35
|
+
const month = String(value.getMonth() + 1).padStart(2, "0");
|
|
36
|
+
const day = String(value.getDate()).padStart(2, "0");
|
|
37
|
+
const hours = String(value.getHours()).padStart(2, "0");
|
|
38
|
+
const minutes = String(value.getMinutes()).padStart(2, "0");
|
|
39
|
+
const seconds = String(value.getSeconds()).padStart(2, "0");
|
|
40
|
+
converted[key] = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
converted[key] = value;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return converted;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Convert any plan to SQL string with parameters
|
|
50
|
+
* Handles SQLite specific parameter normalization (booleans, dates)
|
|
51
|
+
*/
|
|
52
|
+
export function toSql(plan, params) {
|
|
53
|
+
const { operation, params: mergedParams } = plan.finalize(params);
|
|
54
|
+
const sql = generateSql(operation, mergedParams);
|
|
55
|
+
const expandedParams = expandArrayParams(mergedParams);
|
|
56
|
+
return { sql, params: expandedParams };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Simpler API for generating SQL with auto-parameterization
|
|
60
|
+
* @param queryable A Queryable or TerminalQuery object
|
|
61
|
+
* @param options Parse options including cache control
|
|
62
|
+
* @returns Object with text (SQL string), parameters, and preserved result type
|
|
63
|
+
*/
|
|
64
|
+
export function finalize(plan, params) {
|
|
65
|
+
const normalizedParams = params ?? {};
|
|
66
|
+
const { operation, params: mergedParams } = plan.finalize(normalizedParams);
|
|
67
|
+
const text = generateSql(operation, mergedParams);
|
|
68
|
+
return { text, parameters: mergedParams };
|
|
69
|
+
}
|
|
70
|
+
// Implementation
|
|
71
|
+
export function executeSelect(db, schema, builder, params, options) {
|
|
72
|
+
const plan = defineSelect(schema, builder, options);
|
|
73
|
+
const normalizedParams = params || {};
|
|
74
|
+
const { operation, sql, expandedParams } = materializePlan(plan, normalizedParams);
|
|
75
|
+
const displayParams = expandedParams;
|
|
76
|
+
if (options?.onSql) {
|
|
77
|
+
options.onSql({ sql, params: displayParams });
|
|
78
|
+
}
|
|
79
|
+
const boundParams = normalizeSqliteParams(expandedParams);
|
|
80
|
+
const stmt = db.prepare(sql);
|
|
81
|
+
if (!isTerminalHandle(plan)) {
|
|
82
|
+
return stmt.all(boundParams);
|
|
83
|
+
}
|
|
84
|
+
const operationType = operation.operationType;
|
|
85
|
+
switch (operationType) {
|
|
86
|
+
case "first":
|
|
87
|
+
case "firstOrDefault":
|
|
88
|
+
case "single":
|
|
89
|
+
case "singleOrDefault":
|
|
90
|
+
case "last":
|
|
91
|
+
case "lastOrDefault": {
|
|
92
|
+
const rows = stmt.all(boundParams);
|
|
93
|
+
if (rows.length === 0) {
|
|
94
|
+
if (operationType.includes("OrDefault")) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
throw new Error(`No elements found for ${operationType} operation`);
|
|
98
|
+
}
|
|
99
|
+
if (operationType.startsWith("single") && rows.length > 1) {
|
|
100
|
+
throw new Error(`Multiple elements found for ${operationType} operation`);
|
|
101
|
+
}
|
|
102
|
+
if (operationType.startsWith("last")) {
|
|
103
|
+
return rows[rows.length - 1];
|
|
104
|
+
}
|
|
105
|
+
return rows[0];
|
|
106
|
+
}
|
|
107
|
+
case "count":
|
|
108
|
+
case "longCount": {
|
|
109
|
+
const countRow = stmt.get(boundParams);
|
|
110
|
+
const value = countRow ? Number(extractFirstColumn(countRow)) : 0;
|
|
111
|
+
return Number.isNaN(value) ? 0 : value;
|
|
112
|
+
}
|
|
113
|
+
case "sum":
|
|
114
|
+
case "average":
|
|
115
|
+
case "min":
|
|
116
|
+
case "max": {
|
|
117
|
+
const aggRow = stmt.get(boundParams);
|
|
118
|
+
return (aggRow ? (extractFirstColumn(aggRow) ?? null) : null);
|
|
119
|
+
}
|
|
120
|
+
case "any":
|
|
121
|
+
case "all": {
|
|
122
|
+
const boolRow = stmt.get(boundParams);
|
|
123
|
+
return toBoolean(boolRow ? extractFirstColumn(boolRow) : undefined);
|
|
124
|
+
}
|
|
125
|
+
default:
|
|
126
|
+
return stmt.all(boundParams);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Execute a query with no parameters
|
|
131
|
+
* @param dbClient Better SQLite3 database instance
|
|
132
|
+
* @param schema Database context with schema information
|
|
133
|
+
* @param builder Function that builds the query using LINQ operations with DSL and helpers
|
|
134
|
+
* @param options Optional execution options (e.g., SQL inspection callback)
|
|
135
|
+
* @returns Query results, properly typed based on the query
|
|
136
|
+
*/
|
|
137
|
+
export function executeSelectSimple(dbClient, schema, builder, options = {}) {
|
|
138
|
+
return executeSelect(dbClient, schema, builder, {}, options);
|
|
139
|
+
}
|
|
140
|
+
// Implementation
|
|
141
|
+
export function executeInsert(db, schema, builder, params, options) {
|
|
142
|
+
const normalizedParams = params || {};
|
|
143
|
+
let plan;
|
|
144
|
+
try {
|
|
145
|
+
plan = defineInsert(schema, builder, options);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
if (error instanceof Error &&
|
|
149
|
+
error.message === "Failed to parse insert builder or not an insert operation") {
|
|
150
|
+
throw new Error("Failed to parse INSERT query or not an insert operation");
|
|
151
|
+
}
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
const { operation, sql, expandedParams } = materializePlan(plan, normalizedParams);
|
|
155
|
+
if (options?.onSql) {
|
|
156
|
+
options.onSql({ sql, params: expandedParams });
|
|
157
|
+
}
|
|
158
|
+
const insertOperation = operation;
|
|
159
|
+
if (insertOperation.returning) {
|
|
160
|
+
throw new Error("SQLite adapter does not support INSERT ... RETURNING clauses");
|
|
161
|
+
}
|
|
162
|
+
const stmt = db.prepare(sql);
|
|
163
|
+
const result = stmt.run(normalizeSqliteParams(expandedParams));
|
|
164
|
+
return result.changes;
|
|
165
|
+
}
|
|
166
|
+
// Implementation
|
|
167
|
+
export function executeUpdate(db, schema, builder, params, options) {
|
|
168
|
+
const normalizedParams = params || {};
|
|
169
|
+
let plan;
|
|
170
|
+
try {
|
|
171
|
+
plan = defineUpdate(schema, builder, options);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
if (error instanceof Error &&
|
|
175
|
+
error.message === "Failed to parse update builder or not an update operation") {
|
|
176
|
+
throw new Error("Failed to parse UPDATE query or not an update operation");
|
|
177
|
+
}
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
const { operation, sql, expandedParams } = materializePlan(plan, normalizedParams);
|
|
181
|
+
if (options?.onSql) {
|
|
182
|
+
options.onSql({ sql, params: expandedParams });
|
|
183
|
+
}
|
|
184
|
+
const updateOperation = operation;
|
|
185
|
+
if (updateOperation.returning) {
|
|
186
|
+
throw new Error("SQLite adapter does not support UPDATE ... RETURNING clauses");
|
|
187
|
+
}
|
|
188
|
+
const stmt = db.prepare(sql);
|
|
189
|
+
const result = stmt.run(normalizeSqliteParams(expandedParams));
|
|
190
|
+
return result.changes;
|
|
191
|
+
}
|
|
192
|
+
// Implementation
|
|
193
|
+
export function executeDelete(db, schema, builder, params, options) {
|
|
194
|
+
const normalizedParams = params || {};
|
|
195
|
+
const plan = defineDelete(schema, builder, options);
|
|
196
|
+
const planResult = plan.finalize(normalizedParams);
|
|
197
|
+
const sql = generateSql(planResult.operation, planResult.params);
|
|
198
|
+
const expandedParams = expandArrayParams(planResult.params);
|
|
199
|
+
if (options?.onSql) {
|
|
200
|
+
options.onSql({ sql, params: expandedParams });
|
|
201
|
+
}
|
|
202
|
+
const stmt = db.prepare(sql);
|
|
203
|
+
const result = stmt.run(normalizeSqliteParams(expandedParams));
|
|
204
|
+
return result.changes;
|
|
205
|
+
}
|
|
206
|
+
function extractFirstColumn(row) {
|
|
207
|
+
if (!row) {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
const keys = Object.keys(row);
|
|
211
|
+
if (keys.length === 0 || !keys[0]) {
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
return row[keys[0]];
|
|
215
|
+
}
|
|
216
|
+
function toBoolean(value) {
|
|
217
|
+
if (typeof value === "boolean") {
|
|
218
|
+
return value;
|
|
219
|
+
}
|
|
220
|
+
if (typeof value === "number") {
|
|
221
|
+
return value !== 0;
|
|
222
|
+
}
|
|
223
|
+
if (typeof value === "string") {
|
|
224
|
+
if (value === "0") {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
if (value === "1") {
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
return value.length > 0;
|
|
231
|
+
}
|
|
232
|
+
return Boolean(value);
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=index.js.map
|