@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 CHANGED
@@ -111,12 +111,16 @@ class NitroSqliteConnection {
111
111
  async executeQuery(compiledQuery) {
112
112
  const { sql, parameters } = compiledQuery;
113
113
  const params = parameters;
114
- // Determine if this is a SELECT / RETURNING query
115
- const isSelect = /^\s*(select|pragma|explain|with)\b/i.test(sql);
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 (isSelect) {
119
- return { rows: (result.results ?? []) };
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syncular/dialect-react-native-nitro-sqlite",
3
- "version": "0.0.1-73",
3
+ "version": "0.0.1-89",
4
4
  "description": "React Native Nitro SQLite dialect for the Syncular client",
5
5
  "license": "MIT",
6
6
  "author": "Benjamin Kniffler",
@@ -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
- // Determine if this is a SELECT / RETURNING query
189
- const isSelect = /^\s*(select|pragma|explain|with)\b/i.test(sql);
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 (isSelect) {
195
- return { rows: (result.results ?? []) as R[] };
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