@syncular/dialect-react-native-nitro-sqlite 0.0.1-73 → 0.0.1-89
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 +8 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.test.ts +122 -0
- package/src/index.ts +8 -4
package/dist/index.js
CHANGED
|
@@ -111,12 +111,16 @@ class NitroSqliteConnection {
|
|
|
111
111
|
async executeQuery(compiledQuery) {
|
|
112
112
|
const { sql, parameters } = compiledQuery;
|
|
113
113
|
const params = parameters;
|
|
114
|
-
|
|
115
|
-
const
|
|
114
|
+
const hasReturning = /\breturning\b/i.test(sql);
|
|
115
|
+
const isSelectLike = /^\s*(select|pragma|explain|with)\b/i.test(sql);
|
|
116
116
|
// Execute the query
|
|
117
117
|
const result = this.#db.execute(sql, params);
|
|
118
|
-
if (
|
|
119
|
-
|
|
118
|
+
if (isSelectLike || hasReturning) {
|
|
119
|
+
const rows = (result.results ?? []);
|
|
120
|
+
return {
|
|
121
|
+
rows,
|
|
122
|
+
...(hasReturning ? { numAffectedRows: BigInt(rows.length) } : {}),
|
|
123
|
+
};
|
|
120
124
|
}
|
|
121
125
|
// For INSERT, UPDATE, DELETE — return affected rows info
|
|
122
126
|
return {
|
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,122 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
|
|
2
|
+
import type { Kysely } from 'kysely';
|
|
3
|
+
import type {
|
|
4
|
+
BatchQueryCommand,
|
|
5
|
+
BatchQueryResult,
|
|
6
|
+
FileLoadResult,
|
|
7
|
+
QueryResult as NitroQueryResult,
|
|
8
|
+
NitroSQLiteConnection,
|
|
9
|
+
SQLiteValue,
|
|
10
|
+
Transaction,
|
|
11
|
+
} from 'react-native-nitro-sqlite';
|
|
12
|
+
import { createNitroSqliteDb } from './index';
|
|
13
|
+
|
|
14
|
+
interface TestDb {
|
|
15
|
+
tasks: {
|
|
16
|
+
id: string;
|
|
17
|
+
title: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function createNitroResult<Row extends Record<string, SQLiteValue>>(
|
|
22
|
+
rows: Row[],
|
|
23
|
+
rowsAffected: number,
|
|
24
|
+
insertId?: number
|
|
25
|
+
): NitroQueryResult<Row> {
|
|
26
|
+
return {
|
|
27
|
+
name: 'FakeNitroResult',
|
|
28
|
+
toString: () => 'FakeNitroResult',
|
|
29
|
+
equals: () => false,
|
|
30
|
+
dispose: () => {},
|
|
31
|
+
rowsAffected,
|
|
32
|
+
insertId,
|
|
33
|
+
results: rows,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
class FakeNitroDatabase implements NitroSQLiteConnection {
|
|
38
|
+
readonly executedSql: string[] = [];
|
|
39
|
+
closed = false;
|
|
40
|
+
|
|
41
|
+
close(): void {
|
|
42
|
+
this.closed = true;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
delete(): void {}
|
|
46
|
+
|
|
47
|
+
attach(_dbNameToAttach: string, _alias: string, _location?: string): void {}
|
|
48
|
+
|
|
49
|
+
detach(_alias: string): void {}
|
|
50
|
+
|
|
51
|
+
async transaction<Result>(
|
|
52
|
+
transactionCallback: (tx: Transaction) => Promise<Result>
|
|
53
|
+
): Promise<Result> {
|
|
54
|
+
const transaction: Transaction = {
|
|
55
|
+
commit: () => createNitroResult<Record<string, SQLiteValue>>([], 0),
|
|
56
|
+
rollback: () => createNitroResult<Record<string, SQLiteValue>>([], 0),
|
|
57
|
+
execute: (query, params) => this.execute(query, params),
|
|
58
|
+
executeAsync: async (query, params) => this.execute(query, params),
|
|
59
|
+
};
|
|
60
|
+
return transactionCallback(transaction);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
execute<
|
|
64
|
+
Row extends Record<string, SQLiteValue> = Record<string, SQLiteValue>,
|
|
65
|
+
>(query: string, _params?: SQLiteValue[]): NitroQueryResult<Row> {
|
|
66
|
+
this.executedSql.push(query);
|
|
67
|
+
if (/\breturning\b/i.test(query)) {
|
|
68
|
+
return createNitroResult([{ id: 'task-1', title: 'after' } as Row], 1, 1);
|
|
69
|
+
}
|
|
70
|
+
return createNitroResult([], 1, 1);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async executeAsync<
|
|
74
|
+
Row extends Record<string, SQLiteValue> = Record<string, SQLiteValue>,
|
|
75
|
+
>(query: string, params?: SQLiteValue[]): Promise<NitroQueryResult<Row>> {
|
|
76
|
+
return this.execute<Row>(query, params);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
executeBatch(_commands: BatchQueryCommand[]): BatchQueryResult {
|
|
80
|
+
return { rowsAffected: 0 };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async executeBatchAsync(
|
|
84
|
+
_commands: BatchQueryCommand[]
|
|
85
|
+
): Promise<BatchQueryResult> {
|
|
86
|
+
return { rowsAffected: 0 };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
loadFile(_location: string): FileLoadResult {
|
|
90
|
+
return {};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async loadFileAsync(_location: string): Promise<FileLoadResult> {
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
describe('nitro sqlite dialect RETURNING behavior', () => {
|
|
99
|
+
let fakeDb: FakeNitroDatabase;
|
|
100
|
+
let db: Kysely<TestDb>;
|
|
101
|
+
|
|
102
|
+
beforeEach(() => {
|
|
103
|
+
fakeDb = new FakeNitroDatabase();
|
|
104
|
+
db = createNitroSqliteDb<TestDb>({ database: fakeDb });
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
afterEach(async () => {
|
|
108
|
+
await db.destroy();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('returns rows for non-select UPDATE ... RETURNING queries', async () => {
|
|
112
|
+
const updated = await db
|
|
113
|
+
.updateTable('tasks')
|
|
114
|
+
.set({ title: 'after' })
|
|
115
|
+
.where('id', '=', 'task-1')
|
|
116
|
+
.returning(['id', 'title'])
|
|
117
|
+
.executeTakeFirstOrThrow();
|
|
118
|
+
|
|
119
|
+
expect(updated).toEqual({ id: 'task-1', title: 'after' });
|
|
120
|
+
expect(fakeDb.executedSql).toHaveLength(1);
|
|
121
|
+
});
|
|
122
|
+
});
|
package/src/index.ts
CHANGED
|
@@ -185,14 +185,18 @@ class NitroSqliteConnection implements DatabaseConnection {
|
|
|
185
185
|
const { sql, parameters } = compiledQuery;
|
|
186
186
|
const params = parameters as SQLiteValue[];
|
|
187
187
|
|
|
188
|
-
|
|
189
|
-
const
|
|
188
|
+
const hasReturning = /\breturning\b/i.test(sql);
|
|
189
|
+
const isSelectLike = /^\s*(select|pragma|explain|with)\b/i.test(sql);
|
|
190
190
|
|
|
191
191
|
// Execute the query
|
|
192
192
|
const result = this.#db.execute(sql, params);
|
|
193
193
|
|
|
194
|
-
if (
|
|
195
|
-
|
|
194
|
+
if (isSelectLike || hasReturning) {
|
|
195
|
+
const rows = (result.results ?? []) as R[];
|
|
196
|
+
return {
|
|
197
|
+
rows,
|
|
198
|
+
...(hasReturning ? { numAffectedRows: BigInt(rows.length) } : {}),
|
|
199
|
+
};
|
|
196
200
|
}
|
|
197
201
|
|
|
198
202
|
// For INSERT, UPDATE, DELETE — return affected rows info
|