@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.
Files changed (109) hide show
  1. package/dist/expression-generator.d.ts +18 -0
  2. package/dist/expression-generator.d.ts.map +1 -0
  3. package/dist/expression-generator.js +756 -0
  4. package/dist/expression-generator.js.map +1 -0
  5. package/dist/generators/all.d.ts +11 -0
  6. package/dist/generators/all.d.ts.map +1 -0
  7. package/dist/generators/all.js +15 -0
  8. package/dist/generators/all.js.map +1 -0
  9. package/dist/generators/any.d.ts +11 -0
  10. package/dist/generators/any.d.ts.map +1 -0
  11. package/dist/generators/any.js +20 -0
  12. package/dist/generators/any.js.map +1 -0
  13. package/dist/generators/average.d.ts +10 -0
  14. package/dist/generators/average.d.ts.map +1 -0
  15. package/dist/generators/average.js +15 -0
  16. package/dist/generators/average.js.map +1 -0
  17. package/dist/generators/count.d.ts +10 -0
  18. package/dist/generators/count.d.ts.map +1 -0
  19. package/dist/generators/count.js +11 -0
  20. package/dist/generators/count.js.map +1 -0
  21. package/dist/generators/delete.d.ts +10 -0
  22. package/dist/generators/delete.d.ts.map +1 -0
  23. package/dist/generators/delete.js +24 -0
  24. package/dist/generators/delete.js.map +1 -0
  25. package/dist/generators/distinct.d.ts +11 -0
  26. package/dist/generators/distinct.d.ts.map +1 -0
  27. package/dist/generators/distinct.js +12 -0
  28. package/dist/generators/distinct.js.map +1 -0
  29. package/dist/generators/first.d.ts +12 -0
  30. package/dist/generators/first.d.ts.map +1 -0
  31. package/dist/generators/first.js +13 -0
  32. package/dist/generators/first.js.map +1 -0
  33. package/dist/generators/from.d.ts +10 -0
  34. package/dist/generators/from.d.ts.map +1 -0
  35. package/dist/generators/from.js +41 -0
  36. package/dist/generators/from.js.map +1 -0
  37. package/dist/generators/groupby.d.ts +10 -0
  38. package/dist/generators/groupby.d.ts.map +1 -0
  39. package/dist/generators/groupby.js +36 -0
  40. package/dist/generators/groupby.js.map +1 -0
  41. package/dist/generators/insert.d.ts +11 -0
  42. package/dist/generators/insert.d.ts.map +1 -0
  43. package/dist/generators/insert.js +61 -0
  44. package/dist/generators/insert.js.map +1 -0
  45. package/dist/generators/join.d.ts +10 -0
  46. package/dist/generators/join.d.ts.map +1 -0
  47. package/dist/generators/join.js +246 -0
  48. package/dist/generators/join.js.map +1 -0
  49. package/dist/generators/last.d.ts +13 -0
  50. package/dist/generators/last.d.ts.map +1 -0
  51. package/dist/generators/last.js +16 -0
  52. package/dist/generators/last.js.map +1 -0
  53. package/dist/generators/max.d.ts +10 -0
  54. package/dist/generators/max.d.ts.map +1 -0
  55. package/dist/generators/max.js +15 -0
  56. package/dist/generators/max.js.map +1 -0
  57. package/dist/generators/min.d.ts +10 -0
  58. package/dist/generators/min.d.ts.map +1 -0
  59. package/dist/generators/min.js +15 -0
  60. package/dist/generators/min.js.map +1 -0
  61. package/dist/generators/orderby.d.ts +10 -0
  62. package/dist/generators/orderby.d.ts.map +1 -0
  63. package/dist/generators/orderby.js +66 -0
  64. package/dist/generators/orderby.js.map +1 -0
  65. package/dist/generators/select.d.ts +10 -0
  66. package/dist/generators/select.d.ts.map +1 -0
  67. package/dist/generators/select.js +34 -0
  68. package/dist/generators/select.js.map +1 -0
  69. package/dist/generators/single.d.ts +12 -0
  70. package/dist/generators/single.d.ts.map +1 -0
  71. package/dist/generators/single.js +13 -0
  72. package/dist/generators/single.js.map +1 -0
  73. package/dist/generators/skip.d.ts +10 -0
  74. package/dist/generators/skip.d.ts.map +1 -0
  75. package/dist/generators/skip.js +18 -0
  76. package/dist/generators/skip.js.map +1 -0
  77. package/dist/generators/sum.d.ts +10 -0
  78. package/dist/generators/sum.d.ts.map +1 -0
  79. package/dist/generators/sum.js +15 -0
  80. package/dist/generators/sum.js.map +1 -0
  81. package/dist/generators/take.d.ts +10 -0
  82. package/dist/generators/take.d.ts.map +1 -0
  83. package/dist/generators/take.js +18 -0
  84. package/dist/generators/take.js.map +1 -0
  85. package/dist/generators/thenby.d.ts +11 -0
  86. package/dist/generators/thenby.d.ts.map +1 -0
  87. package/dist/generators/thenby.js +58 -0
  88. package/dist/generators/thenby.js.map +1 -0
  89. package/dist/generators/update.d.ts +11 -0
  90. package/dist/generators/update.d.ts.map +1 -0
  91. package/dist/generators/update.js +69 -0
  92. package/dist/generators/update.js.map +1 -0
  93. package/dist/generators/where.d.ts +10 -0
  94. package/dist/generators/where.d.ts.map +1 -0
  95. package/dist/generators/where.js +12 -0
  96. package/dist/generators/where.js.map +1 -0
  97. package/dist/index.d.ts +172 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +234 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/sql-generator.d.ts +9 -0
  102. package/dist/sql-generator.d.ts.map +1 -0
  103. package/dist/sql-generator.js +325 -0
  104. package/dist/sql-generator.js.map +1 -0
  105. package/dist/types.d.ts +62 -0
  106. package/dist/types.d.ts.map +1 -0
  107. package/dist/types.js +5 -0
  108. package/dist/types.js.map +1 -0
  109. 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"}
@@ -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":"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"}
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