@syncular/dialect-expo-sqlite 0.0.1-73 → 0.0.1-83
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/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.test.ts +96 -0
- package/src/index.ts +10 -4
package/dist/index.js
CHANGED
|
@@ -108,11 +108,17 @@ class ExpoSqliteConnection {
|
|
|
108
108
|
async executeQuery(compiledQuery) {
|
|
109
109
|
const { sql, parameters } = compiledQuery;
|
|
110
110
|
const params = [...parameters];
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
if (
|
|
111
|
+
const hasReturning = /\breturning\b/i.test(sql);
|
|
112
|
+
const isSelectLike = /^\s*(select|pragma|explain|with)\b/i.test(sql);
|
|
113
|
+
if (isSelectLike || hasReturning) {
|
|
114
114
|
const rows = this.#db.getAllSync(sql, params);
|
|
115
|
-
|
|
115
|
+
const normalizedRows = rows ?? [];
|
|
116
|
+
return {
|
|
117
|
+
rows: normalizedRows,
|
|
118
|
+
...(hasReturning
|
|
119
|
+
? { numAffectedRows: BigInt(normalizedRows.length) }
|
|
120
|
+
: {}),
|
|
121
|
+
};
|
|
116
122
|
}
|
|
117
123
|
// For INSERT, UPDATE, DELETE — use runSync to get lastInsertRowId and changes
|
|
118
124
|
const result = this.#db.runSync(sql, params);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
|
|
2
|
+
import type { Kysely } from 'kysely';
|
|
3
|
+
import type {
|
|
4
|
+
ExpoSqliteBindParams,
|
|
5
|
+
ExpoSqliteBindValue,
|
|
6
|
+
ExpoSqliteDatabaseLike,
|
|
7
|
+
ExpoSqliteRunResult,
|
|
8
|
+
} from './index';
|
|
9
|
+
import { createExpoSqliteDb } from './index';
|
|
10
|
+
|
|
11
|
+
interface TestDb {
|
|
12
|
+
tasks: {
|
|
13
|
+
id: string;
|
|
14
|
+
title: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
class FakeExpoDatabase implements ExpoSqliteDatabaseLike {
|
|
19
|
+
readonly getAllSql: string[] = [];
|
|
20
|
+
readonly runSql: string[] = [];
|
|
21
|
+
closed = false;
|
|
22
|
+
|
|
23
|
+
getAllSync<R>(sql: string, params: ExpoSqliteBindParams): R[];
|
|
24
|
+
getAllSync<R>(sql: string, ...params: readonly ExpoSqliteBindValue[]): R[];
|
|
25
|
+
getAllSync<R>(
|
|
26
|
+
sql: string,
|
|
27
|
+
...paramsOrFirst:
|
|
28
|
+
| readonly [ExpoSqliteBindParams]
|
|
29
|
+
| readonly ExpoSqliteBindValue[]
|
|
30
|
+
): R[] {
|
|
31
|
+
this.getAllSql.push(sql);
|
|
32
|
+
void paramsOrFirst;
|
|
33
|
+
if (/\breturning\b/i.test(sql)) {
|
|
34
|
+
return [{ id: 'task-1', title: 'after' }] as R[];
|
|
35
|
+
}
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
runSync(sql: string, params: ExpoSqliteBindParams): ExpoSqliteRunResult;
|
|
40
|
+
runSync(
|
|
41
|
+
sql: string,
|
|
42
|
+
...params: readonly ExpoSqliteBindValue[]
|
|
43
|
+
): ExpoSqliteRunResult;
|
|
44
|
+
runSync(
|
|
45
|
+
sql: string,
|
|
46
|
+
...paramsOrFirst:
|
|
47
|
+
| readonly [ExpoSqliteBindParams]
|
|
48
|
+
| readonly ExpoSqliteBindValue[]
|
|
49
|
+
): ExpoSqliteRunResult {
|
|
50
|
+
this.runSql.push(sql);
|
|
51
|
+
void paramsOrFirst;
|
|
52
|
+
return { changes: 1, lastInsertRowId: 1 };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
closeSync(): void {
|
|
56
|
+
this.closed = true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
describe('expo sqlite dialect RETURNING behavior', () => {
|
|
61
|
+
let fakeDb: FakeExpoDatabase;
|
|
62
|
+
let db: Kysely<TestDb>;
|
|
63
|
+
|
|
64
|
+
beforeEach(() => {
|
|
65
|
+
fakeDb = new FakeExpoDatabase();
|
|
66
|
+
db = createExpoSqliteDb<TestDb>({ database: fakeDb });
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('routes UPDATE ... RETURNING through getAllSync and returns rows', async () => {
|
|
70
|
+
const updated = await db
|
|
71
|
+
.updateTable('tasks')
|
|
72
|
+
.set({ title: 'after' })
|
|
73
|
+
.where('id', '=', 'task-1')
|
|
74
|
+
.returning(['id', 'title'])
|
|
75
|
+
.executeTakeFirstOrThrow();
|
|
76
|
+
|
|
77
|
+
expect(updated).toEqual({ id: 'task-1', title: 'after' });
|
|
78
|
+
expect(fakeDb.getAllSql).toHaveLength(1);
|
|
79
|
+
expect(fakeDb.runSql).toHaveLength(0);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('keeps non-returning updates on runSync', async () => {
|
|
83
|
+
await db
|
|
84
|
+
.updateTable('tasks')
|
|
85
|
+
.set({ title: 'later' })
|
|
86
|
+
.where('id', '=', 'task-1')
|
|
87
|
+
.execute();
|
|
88
|
+
|
|
89
|
+
expect(fakeDb.runSql).toHaveLength(1);
|
|
90
|
+
expect(fakeDb.getAllSql).toHaveLength(0);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
afterEach(async () => {
|
|
94
|
+
await db.destroy();
|
|
95
|
+
});
|
|
96
|
+
});
|
package/src/index.ts
CHANGED
|
@@ -193,12 +193,18 @@ class ExpoSqliteConnection implements DatabaseConnection {
|
|
|
193
193
|
const { sql, parameters } = compiledQuery;
|
|
194
194
|
const params = [...parameters] as ExpoSqliteBindParams;
|
|
195
195
|
|
|
196
|
-
|
|
197
|
-
const
|
|
196
|
+
const hasReturning = /\breturning\b/i.test(sql);
|
|
197
|
+
const isSelectLike = /^\s*(select|pragma|explain|with)\b/i.test(sql);
|
|
198
198
|
|
|
199
|
-
if (
|
|
199
|
+
if (isSelectLike || hasReturning) {
|
|
200
200
|
const rows = this.#db.getAllSync<R>(sql, params);
|
|
201
|
-
|
|
201
|
+
const normalizedRows = rows ?? [];
|
|
202
|
+
return {
|
|
203
|
+
rows: normalizedRows,
|
|
204
|
+
...(hasReturning
|
|
205
|
+
? { numAffectedRows: BigInt(normalizedRows.length) }
|
|
206
|
+
: {}),
|
|
207
|
+
};
|
|
202
208
|
}
|
|
203
209
|
|
|
204
210
|
// For INSERT, UPDATE, DELETE — use runSync to get lastInsertRowId and changes
|