@fragno-dev/db 0.2.0 → 0.2.2

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 (62) hide show
  1. package/.turbo/turbo-build.log +34 -30
  2. package/CHANGELOG.md +49 -0
  3. package/dist/adapters/generic-sql/query/where-builder.js +1 -1
  4. package/dist/db-fragment-definition-builder.d.ts +31 -39
  5. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  6. package/dist/db-fragment-definition-builder.js +20 -16
  7. package/dist/db-fragment-definition-builder.js.map +1 -1
  8. package/dist/fragments/internal-fragment.d.ts +94 -8
  9. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  10. package/dist/fragments/internal-fragment.js +56 -55
  11. package/dist/fragments/internal-fragment.js.map +1 -1
  12. package/dist/hooks/hooks.d.ts +5 -3
  13. package/dist/hooks/hooks.d.ts.map +1 -1
  14. package/dist/hooks/hooks.js +38 -37
  15. package/dist/hooks/hooks.js.map +1 -1
  16. package/dist/mod.d.ts +3 -3
  17. package/dist/mod.d.ts.map +1 -1
  18. package/dist/mod.js +4 -4
  19. package/dist/mod.js.map +1 -1
  20. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +367 -80
  21. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  22. package/dist/query/unit-of-work/execute-unit-of-work.js +448 -148
  23. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  24. package/dist/query/unit-of-work/unit-of-work.d.ts +35 -11
  25. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  26. package/dist/query/unit-of-work/unit-of-work.js +49 -19
  27. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  28. package/dist/query/value-decoding.js +1 -1
  29. package/dist/schema/create.d.ts +2 -3
  30. package/dist/schema/create.d.ts.map +1 -1
  31. package/dist/schema/create.js +2 -5
  32. package/dist/schema/create.js.map +1 -1
  33. package/dist/schema/generate-id.d.ts +20 -0
  34. package/dist/schema/generate-id.d.ts.map +1 -0
  35. package/dist/schema/generate-id.js +28 -0
  36. package/dist/schema/generate-id.js.map +1 -0
  37. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -1
  38. package/package.json +3 -3
  39. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +1 -0
  40. package/src/adapters/drizzle/drizzle-adapter-sqlite3.test.ts +41 -25
  41. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +39 -25
  42. package/src/db-fragment-definition-builder.test.ts +58 -42
  43. package/src/db-fragment-definition-builder.ts +78 -88
  44. package/src/db-fragment-instantiator.test.ts +64 -88
  45. package/src/db-fragment-integration.test.ts +292 -142
  46. package/src/fragments/internal-fragment.test.ts +272 -266
  47. package/src/fragments/internal-fragment.ts +155 -122
  48. package/src/hooks/hooks.test.ts +268 -264
  49. package/src/hooks/hooks.ts +74 -63
  50. package/src/mod.ts +14 -4
  51. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1582 -998
  52. package/src/query/unit-of-work/execute-unit-of-work.ts +1746 -343
  53. package/src/query/unit-of-work/tx-builder.test.ts +1041 -0
  54. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +269 -21
  55. package/src/query/unit-of-work/unit-of-work.test.ts +64 -0
  56. package/src/query/unit-of-work/unit-of-work.ts +65 -30
  57. package/src/schema/create.ts +2 -5
  58. package/src/schema/generate-id.test.ts +57 -0
  59. package/src/schema/generate-id.ts +38 -0
  60. package/src/shared/config.ts +0 -10
  61. package/src/shared/connection-pool.ts +0 -24
  62. package/src/shared/prisma.ts +0 -45
@@ -0,0 +1,57 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { schema, idColumn, FragnoId } from "./create";
3
+ import { generateId } from "./generate-id";
4
+
5
+ describe("generateId", () => {
6
+ const testSchema = schema((s) =>
7
+ s.addTable("users", (t) =>
8
+ t.addColumn("id", idColumn()).addColumn("email", "string").addColumn("name", "string"),
9
+ ),
10
+ );
11
+
12
+ it("should generate a new FragnoId", () => {
13
+ const id = generateId(testSchema, "users");
14
+
15
+ expect(id).toBeInstanceOf(FragnoId);
16
+ expect(id.externalId).toBeDefined();
17
+ expect(typeof id.externalId).toBe("string");
18
+ expect(id.externalId.length).toBeGreaterThan(0);
19
+ expect(id.version).toBe(0);
20
+ });
21
+
22
+ it("should generate unique IDs on each call", () => {
23
+ const id1 = generateId(testSchema, "users");
24
+ const id2 = generateId(testSchema, "users");
25
+
26
+ expect(id1.externalId).not.toBe(id2.externalId);
27
+ });
28
+
29
+ it("should throw for non-existent table", () => {
30
+ expect(() => {
31
+ // @ts-expect-error - testing runtime error for non-existent table
32
+ generateId(testSchema, "nonexistent");
33
+ }).toThrow("Table nonexistent not found in schema");
34
+ });
35
+
36
+ it("should work with multiple tables", () => {
37
+ const multiTableSchema = schema((s) =>
38
+ s
39
+ .addTable("users", (t) =>
40
+ t.addColumn("id", idColumn()).addColumn("email", "string").addColumn("name", "string"),
41
+ )
42
+ .addTable("posts", (t) =>
43
+ t
44
+ .addColumn("id", idColumn())
45
+ .addColumn("title", "string")
46
+ .addColumn("authorId", "string"),
47
+ ),
48
+ );
49
+
50
+ const userId = generateId(multiTableSchema, "users");
51
+ const postId = generateId(multiTableSchema, "posts");
52
+
53
+ expect(userId).toBeInstanceOf(FragnoId);
54
+ expect(postId).toBeInstanceOf(FragnoId);
55
+ expect(userId.externalId).not.toBe(postId.externalId);
56
+ });
57
+ });
@@ -0,0 +1,38 @@
1
+ import type { AnySchema } from "./create";
2
+ import { FragnoId } from "./create";
3
+
4
+ /**
5
+ * Generate a new ID for a table without creating a record.
6
+ * This is useful when you need to reference an ID before actually creating the record,
7
+ * or when you need to pass the ID to external services.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const userId = generateId(mySchema, "users");
12
+ * // Use userId in related records or pass to external services
13
+ * uow.create("users", { id: userId, name: "John" });
14
+ * ```
15
+ */
16
+ export function generateId<
17
+ TSchema extends AnySchema,
18
+ TableName extends keyof TSchema["tables"] & string,
19
+ >(schema: TSchema, tableName: TableName): FragnoId {
20
+ const tableSchema = schema.tables[tableName];
21
+ if (!tableSchema) {
22
+ throw new Error(`Table ${tableName} not found in schema`);
23
+ }
24
+
25
+ const idColumn = tableSchema.getIdColumn();
26
+ const generated = idColumn.generateDefaultValue();
27
+ if (generated === undefined) {
28
+ throw new Error(`ID column ${idColumn.ormName} on table ${tableName} has no default generator`);
29
+ }
30
+
31
+ if (typeof generated !== "string") {
32
+ throw new Error(
33
+ `ID column ${idColumn.ormName} on table ${tableName} has no default generator that generates a string.`,
34
+ );
35
+ }
36
+
37
+ return FragnoId.fromExternal(generated, 0);
38
+ }
@@ -1,10 +0,0 @@
1
- import type { AnySchema } from "../schema/create";
2
-
3
- export interface LibraryConfig<TSchemas extends AnySchema[] = AnySchema[]> {
4
- namespace: string;
5
-
6
- /**
7
- * different versions of schemas (sorted in ascending order)
8
- */
9
- schemas: TSchemas;
10
- }
@@ -1,24 +0,0 @@
1
- /**
2
- * Represents an active database connection that can be released back to the pool.
3
- */
4
- export interface Connection<TDatabase> {
5
- db: TDatabase;
6
- release(): Promise<void>;
7
- }
8
-
9
- /**
10
- * Connection pool interface for managing database connections.
11
- * Adapter-specific implementations should be used (e.g., createKyselyConnectionPool, createDrizzleConnectionPool).
12
- */
13
- export interface ConnectionPool<TDatabase> {
14
- /** Acquire a connection from the pool */
15
- connect(): Promise<Connection<TDatabase>>;
16
- /**
17
- * Get the database instance synchronously. Only works if the pool has already been initialized
18
- * via connect().
19
- * @throws an error if called before the pool is initialized.
20
- */
21
- getDatabaseSync(): TDatabase;
22
- /** Close the pool and cleanup resources */
23
- close(): Promise<void>;
24
- }
@@ -1,45 +0,0 @@
1
- export type PrismaClient = Record<
2
- string,
3
- {
4
- count: (options: {
5
- select: Record<string, unknown>;
6
- where?: object;
7
- }) => Promise<Record<string, number>>;
8
- upsert: (options: {
9
- where: object;
10
- update: Record<string, unknown>;
11
- create: Record<string, unknown>;
12
- }) => Promise<void>;
13
-
14
- create: (options: { data: Record<string, unknown> }) => Promise<Record<string, unknown>>;
15
-
16
- createMany: (options: { data: Record<string, unknown>[] }) => Promise<void>;
17
-
18
- delete: (options: { where: object }) => Promise<Record<string, unknown>>;
19
-
20
- deleteMany: (options: { where?: object }) => Promise<void>;
21
-
22
- findFirst: (options: {
23
- where: object;
24
- select?: Record<string, unknown>;
25
- orderBy?: OrderBy | OrderBy[];
26
- skip?: number;
27
- }) => Promise<Record<string, unknown> | null>;
28
-
29
- findMany: (options: {
30
- where?: object;
31
- select?: Record<string, unknown>;
32
- orderBy?: OrderBy | OrderBy[];
33
- skip?: number;
34
- take?: number;
35
- }) => Promise<Record<string, unknown>[]>;
36
-
37
- updateMany: (options: { where?: object; data: Record<string, unknown> }) => Promise<void>;
38
- }
39
- > & {
40
- $transaction: <T>(v: (tx: PrismaClient) => T | Promise<T>) => Promise<T>;
41
- };
42
-
43
- export type OrderBy = {
44
- [k: string]: "asc" | "desc" | OrderBy;
45
- };