@shivaedev/effect-prisma 0.4.2 → 0.5.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.
Files changed (39) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +37 -0
  3. package/dist/database.d.ts +8 -27
  4. package/dist/database.d.ts.map +1 -1
  5. package/dist/database.js +29 -78
  6. package/dist/database.js.map +1 -1
  7. package/dist/internal/contract-normalization.d.ts.map +1 -1
  8. package/dist/internal/contract-normalization.js +4 -1
  9. package/dist/internal/contract-normalization.js.map +1 -1
  10. package/dist/internal/database-factory.d.ts +46 -0
  11. package/dist/internal/database-factory.d.ts.map +1 -0
  12. package/dist/internal/database-factory.js +56 -0
  13. package/dist/internal/database-factory.js.map +1 -0
  14. package/dist/internal/executor.d.ts +16 -5
  15. package/dist/internal/executor.d.ts.map +1 -1
  16. package/dist/internal/sqlite-datetime.d.ts +31 -0
  17. package/dist/internal/sqlite-datetime.d.ts.map +1 -0
  18. package/dist/internal/sqlite-datetime.js +66 -0
  19. package/dist/internal/sqlite-datetime.js.map +1 -0
  20. package/dist/internal/sqlite-pragmas.d.ts +16 -0
  21. package/dist/internal/sqlite-pragmas.d.ts.map +1 -0
  22. package/dist/internal/sqlite-pragmas.js +34 -0
  23. package/dist/internal/sqlite-pragmas.js.map +1 -0
  24. package/dist/internal/transaction.d.ts +7 -6
  25. package/dist/internal/transaction.d.ts.map +1 -1
  26. package/dist/internal/transaction.js.map +1 -1
  27. package/dist/sqlite.d.ts +28 -0
  28. package/dist/sqlite.d.ts.map +1 -0
  29. package/dist/sqlite.js +41 -0
  30. package/dist/sqlite.js.map +1 -0
  31. package/package.json +11 -2
  32. package/src/database.ts +54 -204
  33. package/src/internal/contract-normalization.ts +5 -1
  34. package/src/internal/database-factory.ts +209 -0
  35. package/src/internal/executor.ts +17 -5
  36. package/src/internal/sqlite-datetime.ts +95 -0
  37. package/src/internal/sqlite-pragmas.ts +41 -0
  38. package/src/internal/transaction.ts +11 -8
  39. package/src/sqlite.ts +108 -0
@@ -0,0 +1,34 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ export const MEMORY_PATH = ":memory:";
3
+ /**
4
+ * Prisma Next's SQLite driver opens a fresh `node:sqlite` connection for every
5
+ * `RuntimeConnection`, so an in-memory database would give each transaction its
6
+ * own empty database.
7
+ */
8
+ export const assertFileBackedPath = (path) => {
9
+ if (path === MEMORY_PATH || path.trim().length === 0) {
10
+ throw new TypeError("Effect Prisma requires a file-backed SQLite database; transactions run on their own connection and cannot see an in-memory database");
11
+ }
12
+ };
13
+ /**
14
+ * Apply connect-time pragmas.
15
+ *
16
+ * The driver already sets `foreign_keys` and `busy_timeout` on every connection
17
+ * it opens, but it has no hook for anything else, so durable pragmas such as
18
+ * `journal_mode` are applied once against the database file itself.
19
+ */
20
+ export const applySqlitePragmas = (path, pragmas) => {
21
+ if (pragmas.length === 0) {
22
+ return;
23
+ }
24
+ const database = new DatabaseSync(path);
25
+ try {
26
+ for (const pragma of pragmas) {
27
+ database.exec(`PRAGMA ${pragma}`);
28
+ }
29
+ }
30
+ finally {
31
+ database.close();
32
+ }
33
+ };
34
+ //# sourceMappingURL=sqlite-pragmas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-pragmas.js","sourceRoot":"","sources":["../../src/internal/sqlite-pragmas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAEtC;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAQ,EAAE;IAC1D,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,SAAS,CAClB,qIAAqI,CACrI,CAAC;IACH,CAAC;AACF,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,IAAY,EACZ,OAA8B,EACvB,EAAE;IACT,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC;QACJ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;YAAS,CAAC;QACV,QAAQ,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;AACF,CAAC,CAAC"}
@@ -1,14 +1,15 @@
1
- import type { PostgresClient } from "@prisma-next/postgres/runtime";
1
+ import { orm } from "@prisma-next/sql-orm-client";
2
2
  import type { RuntimeConnection, RuntimeTransaction } from "@prisma-next/sql-runtime";
3
3
  import { Effect, Exit } from "effect";
4
4
  import type { PrismaError } from "../error.js";
5
- import type { AnyPostgresContract, DatabaseExecutor } from "./executor.js";
6
- export interface TransactionResource<Models extends object, Contract extends AnyPostgresContract> {
5
+ import type { AnySqlContract, DatabaseExecutor } from "./executor.js";
6
+ export type TransactionOrm<Contract extends AnySqlContract> = ReturnType<typeof orm<Contract>>;
7
+ export interface TransactionResource<Models extends object, Contract extends AnySqlContract> {
7
8
  readonly connection: RuntimeConnection;
8
9
  readonly transaction: RuntimeTransaction;
9
10
  readonly executor: DatabaseExecutor<Models, Contract>;
10
11
  }
11
- export declare const acquireTransaction: <Models extends object, Contract extends AnyPostgresContract>(current: DatabaseExecutor<Models, Contract>, models: (orm: PostgresClient<Contract>["orm"]) => Models) => Effect.Effect<TransactionResource<Models, Contract>, PrismaError>;
12
- export declare const releaseTransaction: <Models extends object, Contract extends AnyPostgresContract, A, E>(resource: TransactionResource<Models, Contract>, exit: Exit.Exit<A, E>) => Effect.Effect<void, PrismaError>;
13
- export declare const releaseTestTransaction: <Models extends object, Contract extends AnyPostgresContract, A, E>(resource: TransactionResource<Models, Contract>, exit: Exit.Exit<A, E>) => Effect.Effect<void, PrismaError>;
12
+ export declare const acquireTransaction: <Models extends object, Contract extends AnySqlContract>(current: DatabaseExecutor<Models, Contract>, models: (orm: TransactionOrm<Contract>) => Models) => Effect.Effect<TransactionResource<Models, Contract>, PrismaError>;
13
+ export declare const releaseTransaction: <Models extends object, Contract extends AnySqlContract, A, E>(resource: TransactionResource<Models, Contract>, exit: Exit.Exit<A, E>) => Effect.Effect<void, PrismaError>;
14
+ export declare const releaseTestTransaction: <Models extends object, Contract extends AnySqlContract, A, E>(resource: TransactionResource<Models, Contract>, exit: Exit.Exit<A, E>) => Effect.Effect<void, PrismaError>;
14
15
  //# sourceMappingURL=transaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/internal/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EACX,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAa,MAAM,QAAQ,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG3E,MAAM,WAAW,mBAAmB,CACnC,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB;IAEpC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACtD;AASD,eAAO,MAAM,kBAAkB,GAC9B,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB,EAEpC,SAAS,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC3C,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,MAAM,KACtD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,CAyBhE,CAAC;AAEJ,eAAO,MAAM,kBAAkB,GAC9B,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB,EACpC,CAAC,EACD,CAAC,EAED,UAAU,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/C,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAA4C,CAAC;AAE/E,eAAO,MAAM,sBAAsB,GAClC,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB,EACpC,CAAC,EACD,CAAC,EAED,UAAU,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/C,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAA6C,CAAC"}
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/internal/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAClD,OAAO,KAAK,EACX,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAa,MAAM,QAAQ,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtE,MAAM,MAAM,cAAc,CAAC,QAAQ,SAAS,cAAc,IAAI,UAAU,CACvE,OAAO,GAAG,CAAC,QAAQ,CAAC,CACpB,CAAC;AAEF,MAAM,WAAW,mBAAmB,CACnC,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,cAAc;IAE/B,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACtD;AASD,eAAO,MAAM,kBAAkB,GAC9B,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,cAAc,EAE/B,SAAS,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC3C,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,KAAK,MAAM,KAC/C,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,CAyBhE,CAAC;AAEJ,eAAO,MAAM,kBAAkB,GAC9B,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,cAAc,EAC/B,CAAC,EACD,CAAC,EAED,UAAU,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/C,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAA4C,CAAC;AAE/E,eAAO,MAAM,sBAAsB,GAClC,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,cAAc,EAC/B,CAAC,EACD,CAAC,EAED,UAAU,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/C,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAA6C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/internal/transaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/internal/transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type SqliteOptionsBase } from "@prisma-next/sqlite/runtime";
2
+ import type { Layer } from "effect";
3
+ import type { PrismaError } from "./error.js";
4
+ import { type DatabaseIdentifier, type DatabaseServiceHolder, type DefaultModels } from "./internal/database-factory.js";
5
+ import type { AnySqlContract, ExecutorIdentifier } from "./internal/executor.js";
6
+ export declare const defaultSqlitePragmas: ReadonlyArray<string>;
7
+ export interface SqliteDatabaseLayerOptions extends SqliteOptionsBase {
8
+ /** Path to the database file. In-memory databases are not supported. */
9
+ readonly path: string;
10
+ /**
11
+ * Pragmas applied once when the Layer connects. Defaults to
12
+ * {@link defaultSqlitePragmas}; pass `[]` to skip them.
13
+ */
14
+ readonly pragmas?: ReadonlyArray<string>;
15
+ }
16
+ type SqliteFactoryOptions<Contract extends AnySqlContract> = {
17
+ readonly contract: Contract;
18
+ readonly contractJson?: never;
19
+ } | {
20
+ readonly contractJson: unknown;
21
+ readonly contract?: never;
22
+ };
23
+ export interface SqliteDatabaseDefinition<Contract extends AnySqlContract, Requirement = ExecutorIdentifier<DefaultModels<Contract>>> extends DatabaseServiceHolder<Contract, Requirement> {
24
+ readonly layer: (options: SqliteDatabaseLayerOptions) => Layer.Layer<DatabaseIdentifier<Contract> | Requirement, PrismaError>;
25
+ }
26
+ export declare const makeSqliteDatabase: <const Contract extends AnySqlContract>(identifier: string, options: SqliteFactoryOptions<Contract>) => SqliteDatabaseDefinition<Contract>;
27
+ export {};
28
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAe,EAEd,KAAK,iBAAiB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAElB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACX,cAAc,EACd,kBAAkB,EAClB,MAAM,wBAAwB,CAAC;AAQhC,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,MAAM,CAAwB,CAAC;AAEhF,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACpE,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,KAAK,oBAAoB,CAAC,QAAQ,SAAS,cAAc,IACtD;IACA,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;CAC7B,GACD;IACA,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;CACzB,CAAC;AAEL,MAAM,WAAW,wBAAwB,CACxC,QAAQ,SAAS,cAAc,EAC/B,WAAW,GAAG,kBAAkB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CACxD,SAAQ,qBAAqB,CAAC,QAAQ,EAAE,WAAW,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,CACf,OAAO,EAAE,0BAA0B,KAC/B,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,GAAG,WAAW,EAAE,WAAW,CAAC,CAAC;CAC1E;AAED,eAAO,MAAM,kBAAkB,GAAI,KAAK,CAAC,QAAQ,SAAS,cAAc,EACvE,YAAY,MAAM,EAClB,SAAS,oBAAoB,CAAC,QAAQ,CAAC,KACrC,wBAAwB,CAAC,QAAQ,CA8CnC,CAAC"}
package/dist/sqlite.js ADDED
@@ -0,0 +1,41 @@
1
+ import sqlite, {} from "@prisma-next/sqlite/runtime";
2
+ import { acquireConnectedClient, assertAvailableModelNames, } from "./internal/client-lifecycle.js";
3
+ import { makeSqlDatabase, } from "./internal/database-factory.js";
4
+ import { fromPrismaPromise } from "./internal/promise.js";
5
+ import { decodeSqliteDatetimesAsUtc } from "./internal/sqlite-datetime.js";
6
+ import { applySqlitePragmas, assertFileBackedPath, } from "./internal/sqlite-pragmas.js";
7
+ export const defaultSqlitePragmas = ["journal_mode=WAL"];
8
+ export const makeSqliteDatabase = (identifier, options) => {
9
+ return makeSqlDatabase(identifier, (layerOptions) => {
10
+ assertFileBackedPath(layerOptions.path);
11
+ applySqlitePragmas(layerOptions.path, layerOptions.pragmas ?? defaultSqlitePragmas);
12
+ const clientOptions = {
13
+ path: layerOptions.path,
14
+ extensions: layerOptions.extensions,
15
+ middleware: layerOptions.middleware,
16
+ verifyMarker: layerOptions.verifyMarker,
17
+ };
18
+ const client = options.contract === undefined
19
+ ? sqlite({
20
+ ...clientOptions,
21
+ contractJson: options.contractJson,
22
+ })
23
+ : sqlite({
24
+ ...clientOptions,
25
+ contract: options.contract,
26
+ });
27
+ decodeSqliteDatetimesAsUtc(client.context);
28
+ return fromPrismaPromise(() => acquireConnectedClient(client, () => {
29
+ // The SQLite client already exposes the unbound namespace.
30
+ const models = client.orm;
31
+ assertAvailableModelNames(Object.keys(models));
32
+ return {
33
+ client,
34
+ models,
35
+ querySemaphore: undefined,
36
+ transactional: false,
37
+ };
38
+ }));
39
+ });
40
+ };
41
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAGd,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACN,sBAAsB,EACtB,yBAAyB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAIN,eAAe,GACf,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EACN,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAA0B,CAAC,kBAAkB,CAAC,CAAC;AA+BhF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,UAAkB,EAClB,OAAuC,EACF,EAAE;IAGvC,OAAO,eAAe,CACrB,UAAU,EACV,CAAC,YAAY,EAAE,EAAE;QAChB,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACxC,kBAAkB,CACjB,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,OAAO,IAAI,oBAAoB,CAC5C,CAAC;QAEF,MAAM,aAAa,GAAG;YACrB,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,YAAY,EAAE,YAAY,CAAC,YAAY;SACvC,CAAC;QACF,MAAM,MAAM,GACX,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC7B,CAAC,CAAC,MAAM,CAAW;gBACjB,GAAG,aAAa;gBAChB,YAAY,EAAE,OAAO,CAAC,YAAY;aAClC,CAAC;YACH,CAAC,CAAC,MAAM,CAAW;gBACjB,GAAG,aAAa;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC1B,CAAC,CAAC;QAEN,0BAA0B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE3C,OAAO,iBAAiB,CAAC,GAAG,EAAE,CAC7B,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE;YACnC,2DAA2D;YAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAa,CAAC;YACpC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,OAAO;gBACN,MAAM;gBACN,MAAM;gBACN,cAAc,EAAE,SAAS;gBACzB,aAAa,EAAE,KAAK;aACpB,CAAC;QACH,CAAC,CAAC,CACF,CAAC;IACH,CAAC,CACqC,CAAC;AACzC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/effect-prisma",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "Effect-native PostgreSQL queries and transactions for Prisma Next",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -33,6 +33,12 @@
33
33
  "import": "./dist/index.js",
34
34
  "default": "./dist/index.js"
35
35
  },
36
+ "./sqlite": {
37
+ "types": "./dist/sqlite.d.ts",
38
+ "source": "./src/sqlite.ts",
39
+ "import": "./dist/sqlite.js",
40
+ "default": "./dist/sqlite.js"
41
+ },
36
42
  "./testing": {
37
43
  "types": "./dist/testing.d.ts",
38
44
  "source": "./src/testing.ts",
@@ -51,7 +57,8 @@
51
57
  "@prisma-next/sql-contract": "0.15.0",
52
58
  "@prisma-next/sql-orm-client": "0.15.0",
53
59
  "@prisma-next/sql-relational-core": "0.15.0",
54
- "@prisma-next/sql-runtime": "0.15.0"
60
+ "@prisma-next/sql-runtime": "0.15.0",
61
+ "@prisma-next/sqlite": "0.15.0"
55
62
  },
56
63
  "peerDependencies": {
57
64
  "@effect/vitest": "4.0.0-beta.102",
@@ -65,8 +72,10 @@
65
72
  "devDependencies": {
66
73
  "@effect/vitest": "4.0.0-beta.102",
67
74
  "@prisma-next/adapter-postgres": "0.15.0",
75
+ "@prisma-next/adapter-sqlite": "0.15.0",
68
76
  "@prisma-next/cli": "0.15.0",
69
77
  "@prisma-next/target-postgres": "0.15.0",
78
+ "@prisma-next/target-sqlite": "0.15.0",
70
79
  "@types/node": "24.10.1",
71
80
  "@types/pg": "8.20.0",
72
81
  "@typescript/native": "npm:typescript@7.0.2",
package/src/database.ts CHANGED
@@ -2,69 +2,34 @@ import postgres, {
2
2
  type PostgresClient,
3
3
  type PostgresOptionsBase,
4
4
  } from "@prisma-next/postgres/runtime";
5
- import { Context, Effect, Layer, Redacted } from "effect";
5
+ import { type Layer, Redacted } from "effect";
6
6
  import type { PrismaError } from "./error.js";
7
+ import { acquireConnectedClient } from "./internal/client-lifecycle.js";
7
8
  import {
8
- acquireConnectedClient,
9
- assertAvailableModelNames,
10
- } from "./internal/client-lifecycle.js";
9
+ type DatabaseIdentifier,
10
+ type DatabaseServiceHolder,
11
+ type DefaultModels,
12
+ makeSqlDatabase,
13
+ namespaceModels,
14
+ } from "./internal/database-factory.js";
11
15
  import type {
12
- AnyPostgresContract,
13
- DatabaseExecutor,
16
+ AnySqlContract,
14
17
  ExecutorIdentifier,
15
18
  } from "./internal/executor.js";
16
19
  import { fromPrismaPromise } from "./internal/promise.js";
17
- import { makeModelRelation } from "./internal/relation-runtime.js";
18
- import { DatabaseTestingTypeId } from "./internal/testing.js";
19
- import {
20
- acquireTransaction,
21
- releaseTestTransaction,
22
- releaseTransaction,
23
- } from "./internal/transaction.js";
24
- import type { Relation } from "./relation.js";
25
-
26
- type ClientFor<Contract extends AnyPostgresContract> = PostgresClient<Contract>;
27
- type OrmFor<Contract extends AnyPostgresContract> = ClientFor<Contract>["orm"];
28
- type DefaultNamespaceId<Contract extends AnyPostgresContract> =
29
- "__unbound__" extends keyof OrmFor<Contract>
30
- ? "__unbound__"
31
- : "public" extends keyof OrmFor<Contract>
32
- ? "public"
33
- : keyof OrmFor<Contract>;
34
- type DefaultModels<Contract extends AnyPostgresContract> =
35
- OrmFor<Contract>[DefaultNamespaceId<Contract>] extends infer Models extends
36
- object
37
- ? Models
38
- : never;
39
-
40
- interface DatabaseIdentifier<Contract extends AnyPostgresContract> {
41
- readonly _contract: Contract;
42
- readonly _databaseIdentifier: unique symbol;
43
- }
44
20
 
45
- type DatabaseModels<Contract extends AnyPostgresContract, Requirement> = {
46
- readonly [Model in keyof DefaultModels<Contract>]: Relation<
47
- DefaultModels<Contract>[Model],
48
- Requirement,
49
- Contract,
50
- Model & string
51
- >;
52
- };
53
-
54
- export type DatabaseService<
55
- Contract extends AnyPostgresContract,
56
- Requirement,
57
- > = DatabaseModels<Contract, Requirement> & {
58
- transaction<A, E, R>(
59
- program: Effect.Effect<A, E, R>,
60
- ): Effect.Effect<A, E | PrismaError, R | Requirement>;
61
- };
21
+ export type {
22
+ AnyDatabase,
23
+ DatabaseRequirement,
24
+ DatabaseService,
25
+ DatabaseServiceOf,
26
+ } from "./internal/database-factory.js";
62
27
 
63
28
  export interface DatabaseLayerOptions extends PostgresOptionsBase {
64
29
  readonly url: string | Redacted.Redacted<string>;
65
30
  }
66
31
 
67
- type DatabaseFactoryOptions<Contract extends AnyPostgresContract> =
32
+ type DatabaseFactoryOptions<Contract extends AnySqlContract> =
68
33
  | {
69
34
  readonly contract: Contract;
70
35
  readonly contractJson?: never;
@@ -75,171 +40,56 @@ type DatabaseFactoryOptions<Contract extends AnyPostgresContract> =
75
40
  };
76
41
 
77
42
  export interface DatabaseDefinition<
78
- Contract extends AnyPostgresContract,
43
+ Contract extends AnySqlContract,
79
44
  Requirement = ExecutorIdentifier<DefaultModels<Contract>>,
80
- > extends Context.Service<
81
- DatabaseIdentifier<Contract>,
82
- DatabaseService<Contract, Requirement>
83
- > {
45
+ > extends DatabaseServiceHolder<Contract, Requirement> {
84
46
  readonly layer: (
85
47
  options: DatabaseLayerOptions,
86
48
  ) => Layer.Layer<DatabaseIdentifier<Contract> | Requirement, PrismaError>;
87
49
  }
88
50
 
89
- export type AnyDatabase = Effect.Effect<unknown, never, unknown> & {
90
- readonly layer: (...arguments_: ReadonlyArray<never>) => Layer.Any;
91
- };
92
-
93
- export type DatabaseRequirement<Database> =
94
- Database extends DatabaseDefinition<AnyPostgresContract, infer Requirement>
95
- ? Requirement
96
- : never;
97
-
98
- export type DatabaseServiceOf<Database extends AnyDatabase> =
99
- Effect.Success<Database>;
100
-
101
- const defaultModels = <
102
- Contract extends AnyPostgresContract,
103
- Models extends object,
104
- >(
51
+ const defaultModels = <Contract extends AnySqlContract, Models extends object>(
105
52
  client: Pick<PostgresClient<Contract>, "contract" | "orm">,
106
- ): Models => {
107
- const namespaces = Object.keys(client.contract.domain.namespaces);
108
- if (namespaces.length !== 1 || namespaces[0] === undefined) {
109
- throw new TypeError(
110
- "Effect Prisma currently requires exactly one domain namespace",
111
- );
112
- }
113
- assertAvailableModelNames(
114
- Object.keys(client.contract.domain.namespaces[namespaces[0]].models),
115
- );
116
- return Reflect.get(client.orm, namespaces[0]) as Models;
117
- };
53
+ ): Models => namespaceModels<Contract, Models>(client.contract, client.orm);
118
54
 
119
- export const makeDatabase = <const Contract extends AnyPostgresContract>(
55
+ export const makeDatabase = <const Contract extends AnySqlContract>(
120
56
  identifier: string,
121
57
  options: DatabaseFactoryOptions<Contract>,
122
58
  ): DatabaseDefinition<Contract> => {
123
59
  type Models = DefaultModels<Contract>;
124
- type ExecutorId = ExecutorIdentifier<Models>;
125
- type DatabaseId = DatabaseIdentifier<Contract>;
126
-
127
- const Executor = Context.Service<
128
- ExecutorId,
129
- DatabaseExecutor<Models, Contract>
130
- >(`${identifier}/Executor`);
131
- const Service = Context.Service<
132
- DatabaseId,
133
- DatabaseService<Contract, ExecutorId>
134
- >(identifier);
135
-
136
- const transaction = <A, E, R>(
137
- program: Effect.Effect<A, E, R>,
138
- ): Effect.Effect<A, E | PrismaError, R | ExecutorId> =>
139
- Effect.flatMap(Executor, (current) => {
140
- if (current.transactional) {
141
- return program;
142
- }
143
-
144
- return Effect.acquireUseRelease(
145
- acquireTransaction(current, (transactionOrm) =>
146
- defaultModels<Contract, Models>({
147
- contract: current.client.contract,
148
- orm: transactionOrm,
149
- }),
150
- ),
151
- (resource) =>
152
- program.pipe(Effect.provideService(Executor, resource.executor)),
153
- releaseTransaction,
154
- ).pipe(Effect.withSpan("prisma.transaction", { kind: "client" }));
155
- });
156
-
157
- const withTestTransaction = <A, E, R>(
158
- program: Effect.Effect<A, E, R>,
159
- ): Effect.Effect<A, E | PrismaError, R | ExecutorId> =>
160
- Effect.flatMap(Executor, (current) => {
161
- if (current.transactional) {
162
- return program;
163
- }
164
60
 
165
- return Effect.acquireUseRelease(
166
- acquireTransaction(current, (transactionOrm) =>
167
- defaultModels<Contract, Models>({
168
- contract: current.client.contract,
169
- orm: transactionOrm,
170
- }),
171
- ),
172
- (resource) =>
173
- program.pipe(Effect.provideService(Executor, resource.executor)),
174
- releaseTestTransaction,
175
- ).pipe(Effect.withSpan("prisma.testTransaction", { kind: "client" }));
176
- });
177
-
178
- const facade = new Proxy(
179
- Object.assign(Object.create(null), {
180
- transaction,
181
- }) as DatabaseService<Contract, ExecutorId>,
182
- {
183
- get(target, property, receiver) {
184
- if (Reflect.has(target, property)) {
185
- return Reflect.get(target, property, receiver);
186
- }
187
- if (typeof property !== "string") {
188
- return undefined;
189
- }
190
- return makeModelRelation(Executor, property);
191
- },
61
+ return makeSqlDatabase<Contract, DatabaseLayerOptions>(
62
+ identifier,
63
+ (layerOptions) => {
64
+ const clientOptions = {
65
+ url:
66
+ typeof layerOptions.url === "string"
67
+ ? layerOptions.url
68
+ : Redacted.value(layerOptions.url),
69
+ extensions: layerOptions.extensions,
70
+ middleware: layerOptions.middleware,
71
+ poolOptions: layerOptions.poolOptions,
72
+ verifyMarker: layerOptions.verifyMarker,
73
+ };
74
+ const client =
75
+ options.contract === undefined
76
+ ? postgres<Contract>({
77
+ ...clientOptions,
78
+ contractJson: options.contractJson,
79
+ })
80
+ : postgres<Contract>({
81
+ ...clientOptions,
82
+ contract: options.contract,
83
+ });
84
+
85
+ return fromPrismaPromise(() =>
86
+ acquireConnectedClient(client, () => ({
87
+ client,
88
+ models: defaultModels<Contract, Models>(client),
89
+ querySemaphore: undefined,
90
+ transactional: false,
91
+ })),
92
+ );
192
93
  },
193
- );
194
-
195
- const layer = (
196
- layerOptions: DatabaseLayerOptions,
197
- ): Layer.Layer<DatabaseId | ExecutorId, PrismaError> => {
198
- const acquire = Effect.acquireRelease(
199
- Effect.suspend(() => {
200
- const clientOptions = {
201
- url:
202
- typeof layerOptions.url === "string"
203
- ? layerOptions.url
204
- : Redacted.value(layerOptions.url),
205
- extensions: layerOptions.extensions,
206
- middleware: layerOptions.middleware,
207
- poolOptions: layerOptions.poolOptions,
208
- verifyMarker: layerOptions.verifyMarker,
209
- };
210
- const client =
211
- options.contract === undefined
212
- ? postgres<Contract>({
213
- ...clientOptions,
214
- contractJson: options.contractJson,
215
- })
216
- : postgres<Contract>({
217
- ...clientOptions,
218
- contract: options.contract,
219
- });
220
-
221
- return fromPrismaPromise(() =>
222
- acquireConnectedClient(client, () => ({
223
- client,
224
- models: defaultModels<Contract, Models>(client),
225
- querySemaphore: undefined,
226
- transactional: false,
227
- })),
228
- );
229
- }),
230
- (executor) =>
231
- Effect.promise(() => executor.client.close()).pipe(Effect.orDie),
232
- );
233
-
234
- return Layer.effectContext(
235
- Effect.map(acquire, (executor) =>
236
- Context.make(Executor, executor).pipe(Context.add(Service, facade)),
237
- ),
238
- );
239
- };
240
-
241
- return Object.assign(Service, {
242
- layer,
243
- [DatabaseTestingTypeId]: { withTestTransaction },
244
- }) as DatabaseDefinition<Contract>;
94
+ ) as DatabaseDefinition<Contract>;
245
95
  };
@@ -1,4 +1,6 @@
1
1
  const timestampReference = /\b(?:Timestamp|Timestamptz)<(?:\d+|undefined)>/g;
2
+ const timestampCodecReference =
3
+ /\bCodecTypes\['pg\/(?:timestamp|timestamptz)@1'\]\['(?:input|output)'\]/g;
2
4
  const unsupportedTimestampReference = /\b(?:Timestamp|Timestamptz)\s*</;
3
5
 
4
6
  /**
@@ -6,7 +8,9 @@ const unsupportedTimestampReference = /\b(?:Timestamp|Timestamptz)\s*</;
6
8
  * JavaScript Dates accepted and returned by its runtime codecs.
7
9
  */
8
10
  export const normalizePrismaNextContractTypes = (source: string): string => {
9
- const normalized = source.replaceAll(timestampReference, "Date");
11
+ const normalized = source
12
+ .replaceAll(timestampReference, "Date")
13
+ .replaceAll(timestampCodecReference, "Date");
10
14
 
11
15
  if (unsupportedTimestampReference.test(normalized)) {
12
16
  throw new Error(