@truto/ginger 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 +597 -0
- package/dist/adapters/bun-sqlite.d.ts +37 -0
- package/dist/adapters/bun-sqlite.d.ts.map +1 -0
- package/dist/adapters/bun-sqlite.js +136 -0
- package/dist/adapters/bun-sqlite.js.map +1 -0
- package/dist/adapters/durable-object.d.ts +40 -0
- package/dist/adapters/durable-object.d.ts.map +1 -0
- package/dist/adapters/durable-object.js +142 -0
- package/dist/adapters/durable-object.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/crypto.d.ts +40 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +148 -0
- package/dist/crypto.js.map +1 -0
- package/dist/errors.d.ts +64 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +90 -0
- package/dist/errors.js.map +1 -0
- package/dist/example.d.ts +119 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/example.js +297 -0
- package/dist/example.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/pagination.d.ts +31 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +173 -0
- package/dist/pagination.js.map +1 -0
- package/dist/service.d.ts +81 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +615 -0
- package/dist/service.js.map +1 -0
- package/dist/sql-builder.d.ts +48 -0
- package/dist/sql-builder.d.ts.map +1 -0
- package/dist/sql-builder.js +230 -0
- package/dist/sql-builder.js.map +1 -0
- package/dist/types.d.ts +266 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { sql } from '@truto/sqlite-builder';
|
|
2
|
+
import type { CursorToken, OrderBy } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Encode a cursor token to an opaque base64 string
|
|
5
|
+
*/
|
|
6
|
+
export declare function encodeCursor(token: CursorToken): string;
|
|
7
|
+
/**
|
|
8
|
+
* Decode an opaque cursor string back to a cursor token
|
|
9
|
+
*/
|
|
10
|
+
export declare function decodeCursor(cursor: string): CursorToken;
|
|
11
|
+
/**
|
|
12
|
+
* Create a cursor token from a row and order specification
|
|
13
|
+
*/
|
|
14
|
+
export declare function createCursor(row: Record<string, unknown>, orderBy: OrderBy[], direction: 'next' | 'prev'): CursorToken;
|
|
15
|
+
/**
|
|
16
|
+
* Generate WHERE conditions for cursor-based pagination
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildCursorConditions(cursor: CursorToken, tableName?: string): ReturnType<typeof sql>;
|
|
19
|
+
/**
|
|
20
|
+
* Get default ordering for a table
|
|
21
|
+
*/
|
|
22
|
+
export declare function getDefaultOrderBy(primaryKey: string | string[], defaultOrderBy?: OrderBy): OrderBy[];
|
|
23
|
+
/**
|
|
24
|
+
* Validate order by columns against allowed columns
|
|
25
|
+
*/
|
|
26
|
+
export declare function validateOrderBy(orderBy: OrderBy[], allowedColumns: string[]): void;
|
|
27
|
+
/**
|
|
28
|
+
* Reverse the direction of OrderBy for previous page navigation
|
|
29
|
+
*/
|
|
30
|
+
export declare function reverseOrderBy(orderBy: OrderBy[]): OrderBy[];
|
|
31
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEtD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAUvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CA0CxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,EAAE,OAAO,EAAE,EAClB,SAAS,EAAE,MAAM,GAAG,MAAM,GACzB,WAAW,CAiBb;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,UAAU,CAAC,OAAO,GAAG,CAAC,CAiFxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,EAC7B,cAAc,CAAC,EAAE,OAAO,GACvB,OAAO,EAAE,CAUX;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAAE,EAClB,cAAc,EAAE,MAAM,EAAE,GACvB,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAK5D"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { sql } from '@truto/sqlite-builder';
|
|
2
|
+
import { CursorError } from './errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Encode a cursor token to an opaque base64 string
|
|
5
|
+
*/
|
|
6
|
+
export function encodeCursor(token) {
|
|
7
|
+
try {
|
|
8
|
+
const json = JSON.stringify(token);
|
|
9
|
+
return btoa(json);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
throw new CursorError(`Failed to encode cursor: ${error instanceof Error ? error.message : 'Unknown error'}`, { token, error });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Decode an opaque cursor string back to a cursor token
|
|
17
|
+
*/
|
|
18
|
+
export function decodeCursor(cursor) {
|
|
19
|
+
try {
|
|
20
|
+
const json = atob(cursor);
|
|
21
|
+
const parsed = JSON.parse(json);
|
|
22
|
+
// Validate cursor structure
|
|
23
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
24
|
+
throw new Error('Invalid cursor structure');
|
|
25
|
+
}
|
|
26
|
+
if (!Array.isArray(parsed.orderBy)) {
|
|
27
|
+
throw new Error('Invalid orderBy in cursor');
|
|
28
|
+
}
|
|
29
|
+
if (!Array.isArray(parsed.values)) {
|
|
30
|
+
throw new Error('Invalid values in cursor');
|
|
31
|
+
}
|
|
32
|
+
if (!parsed.direction || !['next', 'prev'].includes(parsed.direction)) {
|
|
33
|
+
throw new Error('Invalid direction in cursor');
|
|
34
|
+
}
|
|
35
|
+
// Validate orderBy structure
|
|
36
|
+
for (const order of parsed.orderBy) {
|
|
37
|
+
if (!order || typeof order !== 'object') {
|
|
38
|
+
throw new Error('Invalid order object in cursor');
|
|
39
|
+
}
|
|
40
|
+
if (!order.column || typeof order.column !== 'string') {
|
|
41
|
+
throw new Error('Invalid column in cursor orderBy');
|
|
42
|
+
}
|
|
43
|
+
if (!order.direction || !['asc', 'desc'].includes(order.direction)) {
|
|
44
|
+
throw new Error('Invalid direction in cursor orderBy');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return parsed;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw new CursorError(`Failed to decode cursor: ${error instanceof Error ? error.message : 'Unknown error'}`, { cursor, error });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create a cursor token from a row and order specification
|
|
55
|
+
*/
|
|
56
|
+
export function createCursor(row, orderBy, direction) {
|
|
57
|
+
const values = orderBy.map((order) => {
|
|
58
|
+
const value = row[order.column];
|
|
59
|
+
if (value === undefined) {
|
|
60
|
+
throw new CursorError(`Column "${order.column}" not found in row for cursor creation`, { row, orderBy, column: order.column });
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
orderBy,
|
|
66
|
+
values,
|
|
67
|
+
direction,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Generate WHERE conditions for cursor-based pagination
|
|
72
|
+
*/
|
|
73
|
+
export function buildCursorConditions(cursor, tableName) {
|
|
74
|
+
const { orderBy, values, direction } = cursor;
|
|
75
|
+
if (orderBy.length !== values.length) {
|
|
76
|
+
throw new CursorError('Cursor orderBy and values arrays must have the same length', { orderBy, values });
|
|
77
|
+
}
|
|
78
|
+
if (orderBy.length === 0) {
|
|
79
|
+
return sql ``;
|
|
80
|
+
}
|
|
81
|
+
// Build comparison conditions for cursor pagination
|
|
82
|
+
// For next: use > or < based on sort direction
|
|
83
|
+
// For prev: use < or > based on sort direction (opposite)
|
|
84
|
+
const conditions = [];
|
|
85
|
+
for (let i = 0; i < orderBy.length; i++) {
|
|
86
|
+
const order = orderBy[i];
|
|
87
|
+
const value = values[i];
|
|
88
|
+
// Build column identifier safely
|
|
89
|
+
const columnIdent = tableName
|
|
90
|
+
? sql.ident(`${tableName}.${order.column}`)
|
|
91
|
+
: sql.ident(order.column);
|
|
92
|
+
// Determine comparison operator
|
|
93
|
+
let operator;
|
|
94
|
+
if (direction === 'next') {
|
|
95
|
+
operator = order.direction === 'asc' ? '>' : '<';
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
operator = order.direction === 'asc' ? '<' : '>';
|
|
99
|
+
}
|
|
100
|
+
if (i === orderBy.length - 1) {
|
|
101
|
+
// Last column: simple comparison
|
|
102
|
+
const operatorFragment = sql.raw(operator);
|
|
103
|
+
conditions.push(sql `${columnIdent} ${operatorFragment} ${value}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// Multi-column: build composite condition
|
|
107
|
+
// (col1 = ? AND col2 = ? AND ... AND colN > ?) OR
|
|
108
|
+
// (col1 = ? AND col2 = ? AND ... AND colN-1 > ?) OR
|
|
109
|
+
// ...
|
|
110
|
+
// (col1 > ?)
|
|
111
|
+
const equalityConditions = [];
|
|
112
|
+
for (let j = 0; j <= i; j++) {
|
|
113
|
+
const currentOrder = orderBy[j];
|
|
114
|
+
const currentValue = values[j];
|
|
115
|
+
// Build current column identifier safely
|
|
116
|
+
const currentColumnIdent = tableName
|
|
117
|
+
? sql.ident(`${tableName}.${currentOrder.column}`)
|
|
118
|
+
: sql.ident(currentOrder.column);
|
|
119
|
+
if (j === i) {
|
|
120
|
+
// Last condition in this group: use comparison
|
|
121
|
+
let currentOperator;
|
|
122
|
+
if (direction === 'next') {
|
|
123
|
+
currentOperator = currentOrder.direction === 'asc' ? '>' : '<';
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
currentOperator = currentOrder.direction === 'asc' ? '<' : '>';
|
|
127
|
+
}
|
|
128
|
+
const currentOperatorFragment = sql.raw(currentOperator);
|
|
129
|
+
equalityConditions.push(sql `${currentColumnIdent} ${currentOperatorFragment} ${currentValue}`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Earlier conditions: use equality
|
|
133
|
+
equalityConditions.push(sql `${currentColumnIdent} = ${currentValue}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const compositeCondition = sql.join(equalityConditions, ' AND ');
|
|
137
|
+
conditions.push(sql `(${compositeCondition})`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return conditions.length > 0 ? sql.join(conditions, ' OR ') : sql ``;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get default ordering for a table
|
|
144
|
+
*/
|
|
145
|
+
export function getDefaultOrderBy(primaryKey, defaultOrderBy) {
|
|
146
|
+
if (defaultOrderBy) {
|
|
147
|
+
return [defaultOrderBy];
|
|
148
|
+
}
|
|
149
|
+
if (Array.isArray(primaryKey)) {
|
|
150
|
+
return primaryKey.map((key) => ({ column: key, direction: 'asc' }));
|
|
151
|
+
}
|
|
152
|
+
return [{ column: primaryKey, direction: 'asc' }];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Validate order by columns against allowed columns
|
|
156
|
+
*/
|
|
157
|
+
export function validateOrderBy(orderBy, allowedColumns) {
|
|
158
|
+
for (const order of orderBy) {
|
|
159
|
+
if (!allowedColumns.includes(order.column)) {
|
|
160
|
+
throw new CursorError(`Invalid order column "${order.column}". Allowed columns: ${allowedColumns.join(', ')}`, { column: order.column, allowedColumns });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Reverse the direction of OrderBy for previous page navigation
|
|
166
|
+
*/
|
|
167
|
+
export function reverseOrderBy(orderBy) {
|
|
168
|
+
return orderBy.map((order) => ({
|
|
169
|
+
...order,
|
|
170
|
+
direction: order.direction === 'asc' ? 'desc' : 'asc',
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CACnB,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EACtF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAA;QAE9C,4BAA4B;QAC5B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC7C,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAC9C,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC7C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAChD,CAAC;QAED,6BAA6B;QAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;YACnD,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;YACrD,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;YACxD,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CACnB,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EACtF,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,GAA4B,EAC5B,OAAkB,EAClB,SAA0B;IAE1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,WAAW,CACnB,WAAW,KAAK,CAAC,MAAM,wCAAwC,EAC/D,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CACvC,CAAA;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,OAAO;QACP,MAAM;QACN,SAAS;KACV,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAmB,EACnB,SAAkB;IAElB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAE7C,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,IAAI,WAAW,CACnB,4DAA4D,EAC5D,EAAE,OAAO,EAAE,MAAM,EAAE,CACpB,CAAA;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,CAAA,EAAE,CAAA;IACd,CAAC;IAED,oDAAoD;IACpD,+CAA+C;IAC/C,0DAA0D;IAC1D,MAAM,UAAU,GAA6B,EAAE,CAAA;IAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAA;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QAEvB,iCAAiC;QACjC,MAAM,WAAW,GAAG,SAAS;YAC3B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAE3B,gCAAgC;QAChC,IAAI,QAAgB,CAAA;QACpB,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,QAAQ,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QAClD,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QAClD,CAAC;QAED,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,iCAAiC;YACjC,MAAM,gBAAgB,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC1C,UAAU,CAAC,IAAI,CAAC,GAAG,CAAA,GAAG,WAAW,IAAI,gBAAgB,IAAI,KAAK,EAAE,CAAC,CAAA;QACnE,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,kDAAkD;YAClD,oDAAoD;YACpD,MAAM;YACN,aAAa;YACb,MAAM,kBAAkB,GAA6B,EAAE,CAAA;YAEvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAE,CAAA;gBAChC,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;gBAE9B,yCAAyC;gBACzC,MAAM,kBAAkB,GAAG,SAAS;oBAClC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;oBAClD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;gBAElC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACZ,+CAA+C;oBAC/C,IAAI,eAAuB,CAAA;oBAC3B,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;wBACzB,eAAe,GAAG,YAAY,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;oBAChE,CAAC;yBAAM,CAAC;wBACN,eAAe,GAAG,YAAY,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;oBAChE,CAAC;oBACD,MAAM,uBAAuB,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;oBACxD,kBAAkB,CAAC,IAAI,CACrB,GAAG,CAAA,GAAG,kBAAkB,IAAI,uBAAuB,IAAI,YAAY,EAAE,CACtE,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,mCAAmC;oBACnC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAA,GAAG,kBAAkB,MAAM,YAAY,EAAE,CAAC,CAAA;gBACvE,CAAC;YACH,CAAC;YAED,MAAM,kBAAkB,GAAG,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;YAChE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAA,IAAI,kBAAkB,GAAG,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA,EAAE,CAAA;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAA6B,EAC7B,cAAwB;IAExB,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,cAAc,CAAC,CAAA;IACzB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAc,EAAE,CAAC,CAAC,CAAA;IAC9E,CAAC;IAED,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,KAAc,EAAE,CAAC,CAAA;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAkB,EAClB,cAAwB;IAExB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,WAAW,CACnB,yBAAyB,KAAK,CAAC,MAAM,uBAAuB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACvF,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,CACzC,CAAA;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAkB;IAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7B,GAAG,KAAK;QACR,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;KACtD,CAAC,CAAC,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { z } from 'zod/v4';
|
|
2
|
+
import type { BaseCtx, BaseService, ComputeJoins, CountParams, CreateParams, Database, DeleteParams, GetParams, JoinDef, KeyProvider, ListParams, ListResult, MethodOptions, OrderBy, QueryParams, SecretFieldDef, ServiceOptions, UpdateParams } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Main service class that provides type-safe data access for SQLite databases
|
|
5
|
+
*/
|
|
6
|
+
export declare class Service<TRow extends z.ZodTypeAny, TCreate extends z.ZodTypeAny, TUpdate extends z.ZodTypeAny, TJoins extends Record<string, JoinDef>, TSecrets extends readonly SecretFieldDef[] | undefined> implements BaseService<TRow, TCreate, TUpdate, TJoins, TSecrets> {
|
|
7
|
+
readonly table: string;
|
|
8
|
+
readonly db: Database;
|
|
9
|
+
readonly rowSchema: TRow;
|
|
10
|
+
readonly createSchema: TCreate;
|
|
11
|
+
readonly updateSchema: TUpdate;
|
|
12
|
+
readonly joins: TJoins | undefined;
|
|
13
|
+
readonly secrets: TSecrets | undefined;
|
|
14
|
+
readonly primaryKey: string | string[];
|
|
15
|
+
readonly defaultOrderBy: OrderBy | undefined;
|
|
16
|
+
readonly keyProvider: KeyProvider;
|
|
17
|
+
readonly deps: Record<string, BaseService<any, any, any, any, any>>;
|
|
18
|
+
private readonly hooks;
|
|
19
|
+
constructor(options: ServiceOptions<TRow, TCreate, TUpdate, TJoins, TSecrets>);
|
|
20
|
+
/**
|
|
21
|
+
* List records with cursor-based pagination
|
|
22
|
+
*/
|
|
23
|
+
list(params?: ListParams & MethodOptions): Promise<ListResult<z.infer<TRow> & ComputeJoins<TJoins, ListParams['include']>>>;
|
|
24
|
+
/**
|
|
25
|
+
* Get a single record by ID
|
|
26
|
+
*/
|
|
27
|
+
get(id: string | number, opts?: GetParams & MethodOptions): Promise<(z.infer<TRow> & ComputeJoins<TJoins, GetParams['include']>) | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Create a new record
|
|
30
|
+
*/
|
|
31
|
+
create(data: z.infer<TCreate>, opts?: CreateParams & MethodOptions): Promise<z.infer<TRow> & ComputeJoins<TJoins, CreateParams['include']>>;
|
|
32
|
+
/**
|
|
33
|
+
* Update a record by ID
|
|
34
|
+
*/
|
|
35
|
+
update(id: string | number, data: Partial<z.infer<TUpdate>>, opts?: UpdateParams & MethodOptions): Promise<(z.infer<TRow> & ComputeJoins<TJoins, UpdateParams['include']>) | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Delete a record by ID
|
|
38
|
+
*/
|
|
39
|
+
delete(id: string | number, opts?: DeleteParams & MethodOptions): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Count records matching criteria
|
|
42
|
+
*/
|
|
43
|
+
count(params?: CountParams & MethodOptions): Promise<number>;
|
|
44
|
+
/**
|
|
45
|
+
* Execute custom SQL query
|
|
46
|
+
*/
|
|
47
|
+
query<T = z.infer<TRow>>(query: string, opts?: QueryParams & MethodOptions, ...sqlParams: unknown[]): Promise<T[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Run hooks with context for a specific method
|
|
50
|
+
*/
|
|
51
|
+
protected runHooks<TMethod extends string>(phase: 'before' | 'after' | 'error', method: TMethod, ctx: BaseCtx): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Get columns to select based on secrets configuration
|
|
54
|
+
*/
|
|
55
|
+
private getSelectColumns;
|
|
56
|
+
/**
|
|
57
|
+
* Get allowed columns for ordering
|
|
58
|
+
*/
|
|
59
|
+
private getAllowedColumns;
|
|
60
|
+
/**
|
|
61
|
+
* Encrypt secrets in data
|
|
62
|
+
*/
|
|
63
|
+
private encryptDataSecrets;
|
|
64
|
+
/**
|
|
65
|
+
* Decrypt secrets in a row
|
|
66
|
+
*/
|
|
67
|
+
private decryptRowSecrets;
|
|
68
|
+
/**
|
|
69
|
+
* Process joined rows by extracting join data
|
|
70
|
+
*/
|
|
71
|
+
private processJoinedRows;
|
|
72
|
+
/**
|
|
73
|
+
* Extract only join data from processed row
|
|
74
|
+
*/
|
|
75
|
+
private extractJoinData;
|
|
76
|
+
/**
|
|
77
|
+
* Fetch one-to-many joins using separate queries
|
|
78
|
+
*/
|
|
79
|
+
private fetchOneToManyJoins;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|