diff --git a/.changeset/short-lamps-vanish.md b/.changeset/short-lamps-vanish.md new file mode 100644 index 00000000000..44b789b80cf --- /dev/null +++ b/.changeset/short-lamps-vanish.md @@ -0,0 +1,5 @@ +--- +"@effect/sql-sqlite-react-native": minor +--- + +update op-sqlite for @effect/sql-sqlite-react-native diff --git a/packages/sql-sqlite-react-native/package.json b/packages/sql-sqlite-react-native/package.json index 77fa19c857e..07cc80a940c 100644 --- a/packages/sql-sqlite-react-native/package.json +++ b/packages/sql-sqlite-react-native/package.json @@ -48,13 +48,13 @@ "devDependencies": { "@effect/experimental": "workspace:^", "@effect/sql": "workspace:^", - "@op-engineering/op-sqlite": "7.1.0", + "@op-engineering/op-sqlite": ">=12.0.0", "effect": "workspace:^" }, "peerDependencies": { "@effect/experimental": "workspace:^", "@effect/sql": "workspace:^", - "@op-engineering/op-sqlite": "7.1.0", + "@op-engineering/op-sqlite": ">=12.0.0", "effect": "workspace:^" } } diff --git a/packages/sql-sqlite-react-native/src/SqliteClient.ts b/packages/sql-sqlite-react-native/src/SqliteClient.ts index 5bedcaefe24..3adb35eb611 100644 --- a/packages/sql-sqlite-react-native/src/SqliteClient.ts +++ b/packages/sql-sqlite-react-native/src/SqliteClient.ts @@ -19,6 +19,46 @@ import * as Scope from "effect/Scope" const ATTR_DB_SYSTEM_NAME = "db.system.name" +/** + * Temporary ambient augmentation for `@op-engineering/op-sqlite`. + * + * Why this file exists + * - Under TypeScript `moduleResolution: "NodeNext"`, value exports that come through + * `export * from './functions'` do not show up in the public type definitions unless + * that subpath is explicitly listed in the package `exports` map. + * - In `@op-engineering/op-sqlite@15.0.3`, this means `open` (and friends) are + * available at runtime but are not visible to the type system when doing + * `import * as Sqlite from '@op-engineering/op-sqlite'`. + * - Our code calls `Sqlite.open(...)`, which triggers TS2339/TS2305 without this + * augmentation when using NodeNext. + * + * What this does + * - Minimally augments the module to surface the `open` function and a narrow `OPDB` + * shape that covers only what we use here (close/executeSync/executeAsync). + * - This merges with the library’s existing types; it does not replace them. + * + * Removal plan + * - TODO: Remove this file once upstream publishes a fix that explicitly re‑exports + * these functions in the types entry (see tracking PR below). At that point, + * `Sqlite.open` should type‑check without any local augmentation. + * + * More details + * - Upstream PR: https://github.com/OP-Engineering/op-sqlite/pull/324 + */ +declare module "@op-engineering/op-sqlite" { + export type OPDB = { + close(): void + executeSync(query: string, params?: Array): { rows?: Array } + executeAsync(query: string, params?: Array): Promise<{ rows?: Array }> + } + + export function open(options: { + name: string + location?: string + encryptionKey?: string + }): OPDB +} + /** * @category type ids * @since 1.0.0 @@ -117,11 +157,11 @@ export const make = ( try: () => db.executeAsync(sql, params as Array), catch: (cause) => new SqlError({ cause, message: "Failed to execute statement (async)" }) }), - (result) => result.rows?._array ?? [] + (result) => result.rows ?? [] ) } return Effect.try({ - try: () => db.execute(sql, params as Array).rows?._array ?? [], + try: () => db.executeSync(sql, params as Array).rows ?? [], catch: (cause) => new SqlError({ cause, message: "Failed to execute statement" }) }) }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e23b1c8d0b6..bbc79bc9855 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -734,7 +734,7 @@ importers: version: 10.28.0 drizzle-orm: specifier: ^0.43.1 - version: 0.43.1(@cloudflare/workers-types@4.20250715.0)(@libsql/client@0.12.0)(@op-engineering/op-sqlite@7.1.0(react-native@0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@11.10.0)(bun-types@1.2.18(@types/react@19.1.8))(kysely@0.28.2)(mysql2@3.14.2)(postgres@3.4.7) + version: 0.43.1(@cloudflare/workers-types@4.20250715.0)(@libsql/client@0.12.0)(@op-engineering/op-sqlite@15.0.3(react-native@0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@11.10.0)(bun-types@1.2.18(@types/react@19.1.8))(kysely@0.28.2)(mysql2@3.14.2)(postgres@3.4.7) effect: specifier: workspace:^ version: link:../effect @@ -945,8 +945,8 @@ importers: specifier: workspace:^ version: link:../sql '@op-engineering/op-sqlite': - specifier: 7.1.0 - version: 7.1.0(react-native@0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0))(react@19.1.0) + specifier: '>=12.0.0' + version: 15.0.3(react-native@0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0))(react@19.1.0) effect: specifier: workspace:^ version: link:../effect @@ -2201,11 +2201,11 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@op-engineering/op-sqlite@7.1.0': - resolution: {integrity: sha512-tF+YLwAyV/52r7k3BCFRareiTIzR2bGVQbW54/zJgyL+lzoGJ7bHTGBauXGJAPIYKLxGq0zFxI4HbfzsNQOWgg==} + '@op-engineering/op-sqlite@15.0.3': + resolution: {integrity: sha512-vAUrw2hg2TQTDNM6tAsjtxQiyNTZCynjbV6F+FsiSYgbmfuqIL7gRu94IqmLM5/dPvqbBaDZdo4a9n6KMGN8RQ==} peerDependencies: react: '*' - react-native: '>0.73.0' + react-native: '*' '@opentelemetry/api-logs@0.203.0': resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} @@ -5023,7 +5023,6 @@ packages: libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lighthouse-logger@1.4.2: @@ -8123,7 +8122,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@op-engineering/op-sqlite@7.1.0(react-native@0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0))(react@19.1.0)': + '@op-engineering/op-sqlite@15.0.3(react-native@0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0))(react@19.1.0)': dependencies: react: 19.1.0 react-native: 0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0) @@ -9855,11 +9854,11 @@ snapshots: dotenv@8.6.0: {} - drizzle-orm@0.43.1(@cloudflare/workers-types@4.20250715.0)(@libsql/client@0.12.0)(@op-engineering/op-sqlite@7.1.0(react-native@0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@11.10.0)(bun-types@1.2.18(@types/react@19.1.8))(kysely@0.28.2)(mysql2@3.14.2)(postgres@3.4.7): + drizzle-orm@0.43.1(@cloudflare/workers-types@4.20250715.0)(@libsql/client@0.12.0)(@op-engineering/op-sqlite@15.0.3(react-native@0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@11.10.0)(bun-types@1.2.18(@types/react@19.1.8))(kysely@0.28.2)(mysql2@3.14.2)(postgres@3.4.7): optionalDependencies: '@cloudflare/workers-types': 4.20250715.0 '@libsql/client': 0.12.0 - '@op-engineering/op-sqlite': 7.1.0(react-native@0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0))(react@19.1.0) + '@op-engineering/op-sqlite': 15.0.3(react-native@0.80.1(@babel/core@7.28.0)(@types/react@19.1.8)(react@19.1.0))(react@19.1.0) '@opentelemetry/api': 1.9.0 '@types/better-sqlite3': 7.6.13 better-sqlite3: 11.10.0