@fragno-dev/db 0.0.1 → 0.1.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 (200) hide show
  1. package/.turbo/turbo-build.log +137 -13
  2. package/.turbo/turbo-test.log +36 -0
  3. package/CHANGELOG.md +7 -0
  4. package/dist/adapters/adapters.d.ts +18 -0
  5. package/dist/adapters/adapters.d.ts.map +1 -0
  6. package/dist/adapters/drizzle/drizzle-adapter.d.ts +21 -0
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -0
  8. package/dist/adapters/drizzle/drizzle-adapter.js +62 -0
  9. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -0
  10. package/dist/adapters/drizzle/drizzle-query.d.ts +17 -0
  11. package/dist/adapters/drizzle/drizzle-query.d.ts.map +1 -0
  12. package/dist/adapters/drizzle/drizzle-query.js +139 -0
  13. package/dist/adapters/drizzle/drizzle-query.js.map +1 -0
  14. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +9 -0
  15. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +1 -0
  16. package/dist/adapters/drizzle/drizzle-uow-compiler.js +300 -0
  17. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -0
  18. package/dist/adapters/drizzle/drizzle-uow-decoder.js +82 -0
  19. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -0
  20. package/dist/adapters/drizzle/drizzle-uow-executor.js +125 -0
  21. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +1 -0
  22. package/dist/adapters/drizzle/generate.js +273 -0
  23. package/dist/adapters/drizzle/generate.js.map +1 -0
  24. package/dist/adapters/drizzle/join-column-utils.js +28 -0
  25. package/dist/adapters/drizzle/join-column-utils.js.map +1 -0
  26. package/dist/adapters/drizzle/shared.js +11 -0
  27. package/dist/adapters/drizzle/shared.js.map +1 -0
  28. package/dist/adapters/kysely/kysely-adapter.d.ts +23 -0
  29. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -0
  30. package/dist/adapters/kysely/kysely-adapter.js +119 -0
  31. package/dist/adapters/kysely/kysely-adapter.js.map +1 -0
  32. package/dist/adapters/kysely/kysely-query-builder.js +306 -0
  33. package/dist/adapters/kysely/kysely-query-builder.js.map +1 -0
  34. package/dist/adapters/kysely/kysely-query-compiler.js +67 -0
  35. package/dist/adapters/kysely/kysely-query-compiler.js.map +1 -0
  36. package/dist/adapters/kysely/kysely-query.js +158 -0
  37. package/dist/adapters/kysely/kysely-query.js.map +1 -0
  38. package/dist/adapters/kysely/kysely-uow-compiler.js +139 -0
  39. package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -0
  40. package/dist/adapters/kysely/kysely-uow-executor.js +89 -0
  41. package/dist/adapters/kysely/kysely-uow-executor.js.map +1 -0
  42. package/dist/adapters/kysely/migration/execute.js +176 -0
  43. package/dist/adapters/kysely/migration/execute.js.map +1 -0
  44. package/dist/fragment.d.ts +54 -0
  45. package/dist/fragment.d.ts.map +1 -0
  46. package/dist/fragment.js +92 -0
  47. package/dist/fragment.js.map +1 -0
  48. package/dist/id.d.ts +2 -0
  49. package/dist/migration-engine/auto-from-schema.js +116 -0
  50. package/dist/migration-engine/auto-from-schema.js.map +1 -0
  51. package/dist/migration-engine/create.d.ts +41 -0
  52. package/dist/migration-engine/create.d.ts.map +1 -0
  53. package/dist/migration-engine/create.js +58 -0
  54. package/dist/migration-engine/create.js.map +1 -0
  55. package/dist/migration-engine/shared.d.ts +90 -0
  56. package/dist/migration-engine/shared.d.ts.map +1 -0
  57. package/dist/migration-engine/shared.js +8 -0
  58. package/dist/migration-engine/shared.js.map +1 -0
  59. package/dist/mod.d.ts +55 -2
  60. package/dist/mod.d.ts.map +1 -1
  61. package/dist/mod.js +111 -2
  62. package/dist/mod.js.map +1 -1
  63. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js +108 -0
  64. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js.map +1 -0
  65. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js +55 -0
  66. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js.map +1 -0
  67. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js +18 -0
  68. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js.map +1 -0
  69. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js +183 -0
  70. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js.map +1 -0
  71. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js +58 -0
  72. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js.map +1 -0
  73. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js +68 -0
  74. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js.map +1 -0
  75. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js +56 -0
  76. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js.map +1 -0
  77. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js +65 -0
  78. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js.map +1 -0
  79. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js +81 -0
  80. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js.map +1 -0
  81. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js +13 -0
  82. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js.map +1 -0
  83. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js +10 -0
  84. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js.map +1 -0
  85. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js +372 -0
  86. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js.map +1 -0
  87. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js +23 -0
  88. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js.map +1 -0
  89. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js +62 -0
  90. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js.map +1 -0
  91. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js +6 -0
  92. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js.map +1 -0
  93. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js +8 -0
  94. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js.map +1 -0
  95. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js +8 -0
  96. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js.map +1 -0
  97. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js +6 -0
  98. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js.map +1 -0
  99. package/dist/query/condition-builder.d.ts +41 -0
  100. package/dist/query/condition-builder.d.ts.map +1 -0
  101. package/dist/query/condition-builder.js +93 -0
  102. package/dist/query/condition-builder.js.map +1 -0
  103. package/dist/query/cursor.d.ts +88 -0
  104. package/dist/query/cursor.d.ts.map +1 -0
  105. package/dist/query/cursor.js +103 -0
  106. package/dist/query/cursor.js.map +1 -0
  107. package/dist/query/orm/orm.d.ts +18 -0
  108. package/dist/query/orm/orm.d.ts.map +1 -0
  109. package/dist/query/orm/orm.js +48 -0
  110. package/dist/query/orm/orm.js.map +1 -0
  111. package/dist/query/query.d.ts +79 -0
  112. package/dist/query/query.d.ts.map +1 -0
  113. package/dist/query/query.js +1 -0
  114. package/dist/query/result-transform.js +155 -0
  115. package/dist/query/result-transform.js.map +1 -0
  116. package/dist/query/unit-of-work.d.ts +435 -0
  117. package/dist/query/unit-of-work.d.ts.map +1 -0
  118. package/dist/query/unit-of-work.js +549 -0
  119. package/dist/query/unit-of-work.js.map +1 -0
  120. package/dist/schema/create.d.ts +273 -116
  121. package/dist/schema/create.d.ts.map +1 -1
  122. package/dist/schema/create.js +410 -222
  123. package/dist/schema/create.js.map +1 -1
  124. package/dist/schema/serialize.js +101 -0
  125. package/dist/schema/serialize.js.map +1 -0
  126. package/dist/schema-generator/schema-generator.d.ts +15 -0
  127. package/dist/schema-generator/schema-generator.d.ts.map +1 -0
  128. package/dist/shared/providers.d.ts +6 -0
  129. package/dist/shared/providers.d.ts.map +1 -0
  130. package/dist/util/import-generator.js +26 -0
  131. package/dist/util/import-generator.js.map +1 -0
  132. package/dist/util/parse.js +15 -0
  133. package/dist/util/parse.js.map +1 -0
  134. package/dist/util/types.d.ts +8 -0
  135. package/dist/util/types.d.ts.map +1 -0
  136. package/package.json +63 -2
  137. package/src/adapters/adapters.ts +22 -0
  138. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +433 -0
  139. package/src/adapters/drizzle/drizzle-adapter.test.ts +122 -0
  140. package/src/adapters/drizzle/drizzle-adapter.ts +118 -0
  141. package/src/adapters/drizzle/drizzle-query.ts +234 -0
  142. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +1084 -0
  143. package/src/adapters/drizzle/drizzle-uow-compiler.ts +546 -0
  144. package/src/adapters/drizzle/drizzle-uow-decoder.ts +165 -0
  145. package/src/adapters/drizzle/drizzle-uow-executor.ts +213 -0
  146. package/src/adapters/drizzle/generate.test.ts +643 -0
  147. package/src/adapters/drizzle/generate.ts +481 -0
  148. package/src/adapters/drizzle/join-column-utils.test.ts +79 -0
  149. package/src/adapters/drizzle/join-column-utils.ts +39 -0
  150. package/src/adapters/drizzle/migrate-drizzle.test.ts +226 -0
  151. package/src/adapters/drizzle/shared.ts +22 -0
  152. package/src/adapters/drizzle/test-utils.ts +56 -0
  153. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +789 -0
  154. package/src/adapters/kysely/kysely-adapter.ts +196 -0
  155. package/src/adapters/kysely/kysely-query-builder.test.ts +1344 -0
  156. package/src/adapters/kysely/kysely-query-builder.ts +611 -0
  157. package/src/adapters/kysely/kysely-query-compiler.ts +124 -0
  158. package/src/adapters/kysely/kysely-query.ts +254 -0
  159. package/src/adapters/kysely/kysely-uow-compiler.test.ts +916 -0
  160. package/src/adapters/kysely/kysely-uow-compiler.ts +271 -0
  161. package/src/adapters/kysely/kysely-uow-executor.ts +149 -0
  162. package/src/adapters/kysely/kysely-uow-joins.test.ts +811 -0
  163. package/src/adapters/kysely/migration/execute-mysql.test.ts +1173 -0
  164. package/src/adapters/kysely/migration/execute-postgres.test.ts +2657 -0
  165. package/src/adapters/kysely/migration/execute.ts +382 -0
  166. package/src/adapters/kysely/migration/kysely-migrator.test.ts +197 -0
  167. package/src/fragment.test.ts +287 -0
  168. package/src/fragment.ts +198 -0
  169. package/src/migration-engine/auto-from-schema.test.ts +118 -58
  170. package/src/migration-engine/auto-from-schema.ts +103 -32
  171. package/src/migration-engine/create.test.ts +34 -46
  172. package/src/migration-engine/create.ts +41 -26
  173. package/src/migration-engine/shared.ts +26 -6
  174. package/src/mod.ts +197 -1
  175. package/src/query/condition-builder.test.ts +379 -0
  176. package/src/query/condition-builder.ts +294 -0
  177. package/src/query/cursor.test.ts +296 -0
  178. package/src/query/cursor.ts +147 -0
  179. package/src/query/orm/orm.ts +92 -0
  180. package/src/query/query-type.test.ts +429 -0
  181. package/src/query/query.ts +200 -0
  182. package/src/query/result-transform.test.ts +795 -0
  183. package/src/query/result-transform.ts +247 -0
  184. package/src/query/unit-of-work-types.test.ts +192 -0
  185. package/src/query/unit-of-work.test.ts +947 -0
  186. package/src/query/unit-of-work.ts +1199 -0
  187. package/src/schema/create.test.ts +653 -110
  188. package/src/schema/create.ts +708 -337
  189. package/src/schema/serialize.test.ts +559 -0
  190. package/src/schema/serialize.ts +359 -0
  191. package/src/schema-generator/schema-generator.ts +12 -0
  192. package/src/shared/config.ts +0 -8
  193. package/src/util/import-generator.ts +28 -0
  194. package/src/util/parse.ts +16 -0
  195. package/src/util/types.ts +4 -0
  196. package/tsconfig.json +1 -1
  197. package/tsdown.config.ts +11 -1
  198. package/vitest.config.ts +3 -0
  199. /package/dist/{cuid.js → id.js} +0 -0
  200. /package/src/{cuid.ts → id.ts} +0 -0
@@ -0,0 +1,226 @@
1
+ import { beforeAll, describe, expect, it } from "vitest";
2
+ import { column, idColumn, referenceColumn, schema } from "../../schema/create";
3
+ import { createRequire } from "node:module";
4
+ import { writeAndLoadSchema } from "./test-utils";
5
+
6
+ // I dunno
7
+ const require = createRequire(import.meta.url);
8
+ const { generateDrizzleJson, generateMigration } =
9
+ require("drizzle-kit/api") as typeof import("drizzle-kit/api");
10
+
11
+ describe("generateSchema and migrate", () => {
12
+ const testSchema = schema((s) => {
13
+ return s
14
+ .addTable("users", (t) => {
15
+ return t
16
+ .addColumn("id", idColumn())
17
+ .addColumn("name", column("string"))
18
+ .addColumn("email", column("string"))
19
+ .addColumn("age", column("integer").nullable())
20
+ .addColumn("isActive", column("bool").defaultTo(true))
21
+ .addColumn("bio", column("string").nullable())
22
+ .addColumn("createdAt", column("timestamp").defaultTo$("now"))
23
+ .addColumn("updatedAt", column("timestamp").defaultTo$("now"))
24
+ .createIndex("idx_users_email", ["email"], { unique: true })
25
+ .createIndex("idx_users_name", ["name"])
26
+ .createIndex("idx_users_active", ["isActive"]);
27
+ })
28
+ .addTable("posts", (t) => {
29
+ return t
30
+ .addColumn("id", idColumn())
31
+ .addColumn("title", column("string"))
32
+ .addColumn("slug", column("varchar(255)"))
33
+ .addColumn("content", column("string"))
34
+ .addColumn("excerpt", column("string").nullable())
35
+ .addColumn("userId", referenceColumn())
36
+ .addColumn("viewCount", column("integer").defaultTo(0))
37
+ .addColumn("likeCount", column("bigint").defaultTo(9999999999999999n))
38
+ .addColumn("isPublished", column("bool").defaultTo(false))
39
+ .addColumn("publishedAt", column("timestamp").nullable())
40
+ .addColumn("metadata", column("json").nullable())
41
+ .addColumn("rating", column("decimal").nullable())
42
+ .addColumn("thumbnail", column("binary").nullable())
43
+ .addColumn("createdAt", column("timestamp").defaultTo$("now"))
44
+ .createIndex("idx_posts_user", ["userId"])
45
+ .createIndex("idx_posts_title", ["title"])
46
+ .createIndex("idx_posts_slug", ["slug"], { unique: true })
47
+ .createIndex("idx_posts_published", ["isPublished", "publishedAt"]);
48
+ })
49
+ .addTable("comments", (t) => {
50
+ return t
51
+ .addColumn("id", idColumn())
52
+ .addColumn("content", column("string"))
53
+ .addColumn("postId", referenceColumn())
54
+ .addColumn("userId", referenceColumn())
55
+ .addColumn("parentId", referenceColumn().nullable())
56
+ .addColumn("createdAt", column("timestamp").defaultTo$("now"))
57
+ .addColumn("editedAt", column("timestamp").nullable())
58
+ .addColumn("isDeleted", column("bool").defaultTo(false))
59
+ .createIndex("idx_comments_post", ["postId"])
60
+ .createIndex("idx_comments_user", ["userId"])
61
+ .createIndex("idx_comments_parent", ["parentId"]);
62
+ })
63
+ .addTable("tags", (t) => {
64
+ return t
65
+ .addColumn("id", idColumn())
66
+ .addColumn("name", column("string"))
67
+ .addColumn("slug", column("varchar(100)"))
68
+ .addColumn("description", column("string").nullable())
69
+ .addColumn("color", column("varchar(7)").nullable())
70
+ .addColumn("usageCount", column("bigint").defaultTo(0n))
71
+ .createIndex("idx_tags_slug", ["slug"], { unique: true })
72
+ .createIndex("idx_tags_name", ["name"]);
73
+ })
74
+ .addTable("postTags", (t) => {
75
+ return t
76
+ .addColumn("id", idColumn())
77
+ .addColumn("postId", referenceColumn())
78
+ .addColumn("tagId", referenceColumn())
79
+ .addColumn("order", column("integer").defaultTo(0))
80
+ .addColumn("createdAt", column("timestamp").defaultTo$("now"))
81
+ .createIndex("idx_postTags_post_tag", ["postId", "tagId"], { unique: true })
82
+ .createIndex("idx_postTags_tag", ["tagId"]);
83
+ })
84
+ .addReference("author", {
85
+ type: "one",
86
+ from: { table: "posts", column: "userId" },
87
+ to: { table: "users", column: "id" },
88
+ })
89
+ .addReference("post", {
90
+ type: "one",
91
+ from: { table: "comments", column: "postId" },
92
+ to: { table: "posts", column: "id" },
93
+ })
94
+ .addReference("author", {
95
+ type: "one",
96
+ from: { table: "comments", column: "userId" },
97
+ to: { table: "users", column: "id" },
98
+ })
99
+ .addReference("parent", {
100
+ type: "one",
101
+ from: { table: "comments", column: "parentId" },
102
+ to: { table: "comments", column: "id" },
103
+ })
104
+ .addReference("post", {
105
+ type: "one",
106
+ from: { table: "postTags", column: "postId" },
107
+ to: { table: "posts", column: "id" },
108
+ })
109
+ .addReference("tag", {
110
+ type: "one",
111
+ from: { table: "postTags", column: "tagId" },
112
+ to: { table: "tags", column: "id" },
113
+ });
114
+ });
115
+
116
+ let schemaFilePath: string;
117
+
118
+ beforeAll(async () => {
119
+ // Write schema to file and dynamically import it
120
+ const result = await writeAndLoadSchema("migrate-drizzle", testSchema, "postgresql");
121
+ schemaFilePath = result.schemaFilePath;
122
+
123
+ return async () => {
124
+ await result.cleanup();
125
+ };
126
+ });
127
+
128
+ it("should run migration using drizzle-kit", async () => {
129
+ // Dynamically import the generated schema (with cache busting)
130
+ const schemaModule = await import(`${schemaFilePath}?t=${Date.now()}`);
131
+
132
+ const migrationStatements = await generateMigration(
133
+ generateDrizzleJson({}), // Empty schema
134
+ generateDrizzleJson(schemaModule),
135
+ );
136
+
137
+ expect(migrationStatements.join("\n")).toMatchInlineSnapshot(`
138
+ "CREATE TABLE "users" (
139
+ "id" varchar(30) NOT NULL,
140
+ "name" text NOT NULL,
141
+ "email" text NOT NULL,
142
+ "age" integer,
143
+ "isActive" boolean DEFAULT true NOT NULL,
144
+ "bio" text,
145
+ "createdAt" timestamp DEFAULT now() NOT NULL,
146
+ "updatedAt" timestamp DEFAULT now() NOT NULL,
147
+ "_internalId" bigserial PRIMARY KEY NOT NULL,
148
+ "_version" integer DEFAULT 0 NOT NULL
149
+ );
150
+
151
+ CREATE TABLE "posts" (
152
+ "id" varchar(30) NOT NULL,
153
+ "title" text NOT NULL,
154
+ "slug" varchar(255) NOT NULL,
155
+ "content" text NOT NULL,
156
+ "excerpt" text,
157
+ "userId" bigint NOT NULL,
158
+ "viewCount" integer DEFAULT 0 NOT NULL,
159
+ "likeCount" bigint DEFAULT 9999999999999999 NOT NULL,
160
+ "isPublished" boolean DEFAULT false NOT NULL,
161
+ "publishedAt" timestamp,
162
+ "metadata" json,
163
+ "rating" numeric,
164
+ "thumbnail" "bytea",
165
+ "createdAt" timestamp DEFAULT now() NOT NULL,
166
+ "_internalId" bigserial PRIMARY KEY NOT NULL,
167
+ "_version" integer DEFAULT 0 NOT NULL
168
+ );
169
+
170
+ CREATE TABLE "comments" (
171
+ "id" varchar(30) NOT NULL,
172
+ "content" text NOT NULL,
173
+ "postId" bigint NOT NULL,
174
+ "userId" bigint NOT NULL,
175
+ "parentId" bigint,
176
+ "createdAt" timestamp DEFAULT now() NOT NULL,
177
+ "editedAt" timestamp,
178
+ "isDeleted" boolean DEFAULT false NOT NULL,
179
+ "_internalId" bigserial PRIMARY KEY NOT NULL,
180
+ "_version" integer DEFAULT 0 NOT NULL
181
+ );
182
+
183
+ CREATE TABLE "tags" (
184
+ "id" varchar(30) NOT NULL,
185
+ "name" text NOT NULL,
186
+ "slug" varchar(100) NOT NULL,
187
+ "description" text,
188
+ "color" varchar(7),
189
+ "usageCount" bigint DEFAULT 0 NOT NULL,
190
+ "_internalId" bigserial PRIMARY KEY NOT NULL,
191
+ "_version" integer DEFAULT 0 NOT NULL
192
+ );
193
+
194
+ CREATE TABLE "postTags" (
195
+ "id" varchar(30) NOT NULL,
196
+ "postId" bigint NOT NULL,
197
+ "tagId" bigint NOT NULL,
198
+ "order" integer DEFAULT 0 NOT NULL,
199
+ "createdAt" timestamp DEFAULT now() NOT NULL,
200
+ "_internalId" bigserial PRIMARY KEY NOT NULL,
201
+ "_version" integer DEFAULT 0 NOT NULL
202
+ );
203
+
204
+ ALTER TABLE "posts" ADD CONSTRAINT "posts_users_author_fk" FOREIGN KEY ("userId") REFERENCES "public"."users"("_internalId") ON DELETE no action ON UPDATE no action;
205
+ ALTER TABLE "comments" ADD CONSTRAINT "comments_posts_post_fk" FOREIGN KEY ("postId") REFERENCES "public"."posts"("_internalId") ON DELETE no action ON UPDATE no action;
206
+ ALTER TABLE "comments" ADD CONSTRAINT "comments_users_author_fk" FOREIGN KEY ("userId") REFERENCES "public"."users"("_internalId") ON DELETE no action ON UPDATE no action;
207
+ ALTER TABLE "comments" ADD CONSTRAINT "comments_comments_parent_fk" FOREIGN KEY ("parentId") REFERENCES "public"."comments"("_internalId") ON DELETE no action ON UPDATE no action;
208
+ ALTER TABLE "postTags" ADD CONSTRAINT "postTags_posts_post_fk" FOREIGN KEY ("postId") REFERENCES "public"."posts"("_internalId") ON DELETE no action ON UPDATE no action;
209
+ ALTER TABLE "postTags" ADD CONSTRAINT "postTags_tags_tag_fk" FOREIGN KEY ("tagId") REFERENCES "public"."tags"("_internalId") ON DELETE no action ON UPDATE no action;
210
+ CREATE UNIQUE INDEX "idx_users_email" ON "users" USING btree ("email");
211
+ CREATE INDEX "idx_users_name" ON "users" USING btree ("name");
212
+ CREATE INDEX "idx_users_active" ON "users" USING btree ("isActive");
213
+ CREATE INDEX "idx_posts_user" ON "posts" USING btree ("userId");
214
+ CREATE INDEX "idx_posts_title" ON "posts" USING btree ("title");
215
+ CREATE UNIQUE INDEX "idx_posts_slug" ON "posts" USING btree ("slug");
216
+ CREATE INDEX "idx_posts_published" ON "posts" USING btree ("isPublished","publishedAt");
217
+ CREATE INDEX "idx_comments_post" ON "comments" USING btree ("postId");
218
+ CREATE INDEX "idx_comments_user" ON "comments" USING btree ("userId");
219
+ CREATE INDEX "idx_comments_parent" ON "comments" USING btree ("parentId");
220
+ CREATE UNIQUE INDEX "idx_tags_slug" ON "tags" USING btree ("slug");
221
+ CREATE INDEX "idx_tags_name" ON "tags" USING btree ("name");
222
+ CREATE UNIQUE INDEX "idx_postTags_post_tag" ON "postTags" USING btree ("postId","tagId");
223
+ CREATE INDEX "idx_postTags_tag" ON "postTags" USING btree ("tagId");"
224
+ `);
225
+ });
226
+ });
@@ -0,0 +1,22 @@
1
+ import * as Drizzle from "drizzle-orm";
2
+ import type * as MySQL from "drizzle-orm/mysql-core";
3
+
4
+ export type TableType = MySQL.MySqlTableWithColumns<MySQL.TableConfig>;
5
+ export type ColumnType = MySQL.AnyMySqlColumn;
6
+ export type DBType = MySQL.MySqlDatabase<
7
+ MySQL.MySqlQueryResultHKT,
8
+ MySQL.PreparedQueryHKTBase,
9
+ Record<string, unknown>,
10
+ Drizzle.TablesRelationalConfig
11
+ >;
12
+
13
+ export function parseDrizzle(drizzle: unknown) {
14
+ const db = drizzle as DBType;
15
+ const drizzleTables = db._.fullSchema as Record<string, TableType>;
16
+ if (!drizzleTables || Object.keys(drizzleTables).length === 0)
17
+ throw new Error(
18
+ "Drizzle adapter requires query mode, make sure to configure it following their guide: https://orm.drizzle.team/docs/rqb.",
19
+ );
20
+
21
+ return [db, drizzleTables] as const;
22
+ }
@@ -0,0 +1,56 @@
1
+ import { mkdir, writeFile, rm } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { generateSchema, type SupportedProvider } from "./generate";
4
+ import type { Schema } from "../../schema/create";
5
+
6
+ /**
7
+ * Writes a Fragno schema to a temporary TypeScript file and dynamically imports it.
8
+ * This is used in tests to create Drizzle schema modules from Fragno schemas.
9
+ *
10
+ * Each test gets its own isolated directory to prevent interference.
11
+ *
12
+ * @param testFileName - Name of the test file (used to create an isolated subdirectory)
13
+ * @param schema - The Fragno schema to convert
14
+ * @param dialect - The database dialect (postgresql, mysql, sqlite)
15
+ * @returns An object containing the imported schema module, file path, and cleanup function
16
+ */
17
+ export async function writeAndLoadSchema(
18
+ testFileName: string,
19
+ schema: Schema,
20
+ dialect: SupportedProvider,
21
+ ) {
22
+ // Create test-specific directory inside _generated
23
+ const baseDir = join(import.meta.dirname, "_generated");
24
+ const testDir = join(baseDir, testFileName);
25
+
26
+ // Ensure test directory exists (with error handling for race conditions)
27
+ try {
28
+ await mkdir(testDir, { recursive: true });
29
+ } catch {
30
+ //
31
+ }
32
+
33
+ // Generate unique schema file path
34
+ const schemaFilePath = join(
35
+ testDir,
36
+ `test-schema-${Date.now()}-${Math.random().toString(36).slice(2, 9)}.ts`,
37
+ );
38
+
39
+ // Generate and write the Drizzle schema to file
40
+ const drizzleSchemaTs = generateSchema(schema, dialect);
41
+ await writeFile(schemaFilePath, drizzleSchemaTs, "utf-8");
42
+
43
+ // Dynamically import the generated schema (with cache busting)
44
+ const schemaModule = await import(`${schemaFilePath}?t=${Date.now()}`);
45
+
46
+ // Cleanup function to remove the test-specific directory
47
+ const cleanup = async () => {
48
+ await rm(testDir, { recursive: true, force: true });
49
+ };
50
+
51
+ return {
52
+ schemaModule,
53
+ schemaFilePath,
54
+ cleanup,
55
+ };
56
+ }