@justwant/db 0.2.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 (248) hide show
  1. package/README.md +111 -0
  2. package/dist/adapter.d.ts +11 -0
  3. package/dist/adapter.d.ts.map +1 -0
  4. package/dist/adapter.js +2 -0
  5. package/dist/adapter.js.map +1 -0
  6. package/dist/base/adapter.d.ts +11 -0
  7. package/dist/base/adapter.d.ts.map +1 -0
  8. package/dist/base/adapter.js +2 -0
  9. package/dist/base/adapter.js.map +1 -0
  10. package/dist/base/conforms.d.ts +12 -0
  11. package/dist/base/conforms.d.ts.map +1 -0
  12. package/dist/base/conforms.js +13 -0
  13. package/dist/base/conforms.js.map +1 -0
  14. package/dist/base/contract.d.ts +6 -0
  15. package/dist/base/contract.d.ts.map +1 -0
  16. package/dist/base/contract.js +6 -0
  17. package/dist/base/contract.js.map +1 -0
  18. package/dist/base/errors.d.ts +75 -0
  19. package/dist/base/errors.d.ts.map +1 -0
  20. package/dist/base/errors.js +100 -0
  21. package/dist/base/errors.js.map +1 -0
  22. package/dist/base/fields.d.ts +5 -0
  23. package/dist/base/fields.d.ts.map +1 -0
  24. package/dist/base/fields.js +5 -0
  25. package/dist/base/fields.js.map +1 -0
  26. package/dist/base/index.d.ts +5 -0
  27. package/dist/base/index.d.ts.map +1 -0
  28. package/dist/base/index.js +3 -0
  29. package/dist/base/index.js.map +1 -0
  30. package/dist/base/table.d.ts +61 -0
  31. package/dist/base/table.d.ts.map +1 -0
  32. package/dist/base/table.js +2 -0
  33. package/dist/base/table.js.map +1 -0
  34. package/dist/base/validate.d.ts +5 -0
  35. package/dist/base/validate.d.ts.map +1 -0
  36. package/dist/base/validate.js +5 -0
  37. package/dist/base/validate.js.map +1 -0
  38. package/dist/contract.d.ts +27 -0
  39. package/dist/contract.d.ts.map +1 -0
  40. package/dist/contract.js +14 -0
  41. package/dist/contract.js.map +1 -0
  42. package/dist/contract.type-test.d.ts +2 -0
  43. package/dist/contract.type-test.d.ts.map +1 -0
  44. package/dist/contract.type-test.js +34 -0
  45. package/dist/contract.type-test.js.map +1 -0
  46. package/dist/ddl/drop.d.ts +6 -0
  47. package/dist/ddl/drop.d.ts.map +1 -0
  48. package/dist/ddl/drop.js +14 -0
  49. package/dist/ddl/drop.js.map +1 -0
  50. package/dist/ddl/exist.d.ts +6 -0
  51. package/dist/ddl/exist.d.ts.map +1 -0
  52. package/dist/ddl/exist.js +24 -0
  53. package/dist/ddl/exist.js.map +1 -0
  54. package/dist/ddl/index.d.ts +17 -0
  55. package/dist/ddl/index.d.ts.map +1 -0
  56. package/dist/ddl/index.js +58 -0
  57. package/dist/ddl/index.js.map +1 -0
  58. package/dist/drizzle/buildOrderBy.d.ts +11 -0
  59. package/dist/drizzle/buildOrderBy.d.ts.map +1 -0
  60. package/dist/drizzle/buildOrderBy.js +19 -0
  61. package/dist/drizzle/buildOrderBy.js.map +1 -0
  62. package/dist/drizzle/buildPagination.d.ts +15 -0
  63. package/dist/drizzle/buildPagination.d.ts.map +1 -0
  64. package/dist/drizzle/buildPagination.js +13 -0
  65. package/dist/drizzle/buildPagination.js.map +1 -0
  66. package/dist/drizzle/buildWhere.d.ts +11 -0
  67. package/dist/drizzle/buildWhere.d.ts.map +1 -0
  68. package/dist/drizzle/buildWhere.js +21 -0
  69. package/dist/drizzle/buildWhere.js.map +1 -0
  70. package/dist/drizzle/bulkInsert.d.ts +9 -0
  71. package/dist/drizzle/bulkInsert.d.ts.map +1 -0
  72. package/dist/drizzle/bulkInsert.js +16 -0
  73. package/dist/drizzle/bulkInsert.js.map +1 -0
  74. package/dist/drizzle/collectSchemas.d.ts +11 -0
  75. package/dist/drizzle/collectSchemas.d.ts.map +1 -0
  76. package/dist/drizzle/collectSchemas.js +12 -0
  77. package/dist/drizzle/collectSchemas.js.map +1 -0
  78. package/dist/drizzle/createAdapter.d.ts +15 -0
  79. package/dist/drizzle/createAdapter.d.ts.map +1 -0
  80. package/dist/drizzle/createAdapter.js +163 -0
  81. package/dist/drizzle/createAdapter.js.map +1 -0
  82. package/dist/drizzle/defineMappedTable.d.ts +19 -0
  83. package/dist/drizzle/defineMappedTable.d.ts.map +1 -0
  84. package/dist/drizzle/defineMappedTable.js +66 -0
  85. package/dist/drizzle/defineMappedTable.js.map +1 -0
  86. package/dist/drizzle/drizzle-types.d.ts +16 -0
  87. package/dist/drizzle/drizzle-types.d.ts.map +1 -0
  88. package/dist/drizzle/drizzle-types.js +11 -0
  89. package/dist/drizzle/drizzle-types.js.map +1 -0
  90. package/dist/drizzle/errors.d.ts +10 -0
  91. package/dist/drizzle/errors.d.ts.map +1 -0
  92. package/dist/drizzle/errors.js +61 -0
  93. package/dist/drizzle/errors.js.map +1 -0
  94. package/dist/drizzle/index.d.ts +14 -0
  95. package/dist/drizzle/index.d.ts.map +1 -0
  96. package/dist/drizzle/index.js +12 -0
  97. package/dist/drizzle/index.js.map +1 -0
  98. package/dist/drizzle/mapping.d.ts +34 -0
  99. package/dist/drizzle/mapping.d.ts.map +1 -0
  100. package/dist/drizzle/mapping.js +24 -0
  101. package/dist/drizzle/mapping.js.map +1 -0
  102. package/dist/drizzle/types.d.ts +38 -0
  103. package/dist/drizzle/types.d.ts.map +1 -0
  104. package/dist/drizzle/types.js +6 -0
  105. package/dist/drizzle/types.js.map +1 -0
  106. package/dist/drizzle/upsert.d.ts +11 -0
  107. package/dist/drizzle/upsert.d.ts.map +1 -0
  108. package/dist/drizzle/upsert.js +28 -0
  109. package/dist/drizzle/upsert.js.map +1 -0
  110. package/dist/errors.d.ts +75 -0
  111. package/dist/errors.d.ts.map +1 -0
  112. package/dist/errors.js +100 -0
  113. package/dist/errors.js.map +1 -0
  114. package/dist/index.d.ts +2 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +2 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/prisma/buildWhere.d.ts +18 -0
  119. package/dist/prisma/buildWhere.d.ts.map +1 -0
  120. package/dist/prisma/buildWhere.js +27 -0
  121. package/dist/prisma/buildWhere.js.map +1 -0
  122. package/dist/prisma/bulkInsert.d.ts +19 -0
  123. package/dist/prisma/bulkInsert.d.ts.map +1 -0
  124. package/dist/prisma/bulkInsert.js +13 -0
  125. package/dist/prisma/bulkInsert.js.map +1 -0
  126. package/dist/prisma/createAdapter.d.ts +13 -0
  127. package/dist/prisma/createAdapter.d.ts.map +1 -0
  128. package/dist/prisma/createAdapter.js +154 -0
  129. package/dist/prisma/createAdapter.js.map +1 -0
  130. package/dist/prisma/errors.d.ts +12 -0
  131. package/dist/prisma/errors.d.ts.map +1 -0
  132. package/dist/prisma/errors.js +133 -0
  133. package/dist/prisma/errors.js.map +1 -0
  134. package/dist/prisma/index.d.ts +9 -0
  135. package/dist/prisma/index.d.ts.map +1 -0
  136. package/dist/prisma/index.js +7 -0
  137. package/dist/prisma/index.js.map +1 -0
  138. package/dist/prisma/mapping.d.ts +15 -0
  139. package/dist/prisma/mapping.d.ts.map +1 -0
  140. package/dist/prisma/mapping.js +23 -0
  141. package/dist/prisma/mapping.js.map +1 -0
  142. package/dist/prisma/types.d.ts +61 -0
  143. package/dist/prisma/types.d.ts.map +1 -0
  144. package/dist/prisma/types.js +6 -0
  145. package/dist/prisma/types.js.map +1 -0
  146. package/dist/prisma/upsert.d.ts +17 -0
  147. package/dist/prisma/upsert.d.ts.map +1 -0
  148. package/dist/prisma/upsert.js +11 -0
  149. package/dist/prisma/upsert.js.map +1 -0
  150. package/dist/table.d.ts +36 -0
  151. package/dist/table.d.ts.map +1 -0
  152. package/dist/table.js +2 -0
  153. package/dist/table.js.map +1 -0
  154. package/dist/waddler/better-sqlite3/index.d.ts +17 -0
  155. package/dist/waddler/better-sqlite3/index.d.ts.map +1 -0
  156. package/dist/waddler/better-sqlite3/index.js +20 -0
  157. package/dist/waddler/better-sqlite3/index.js.map +1 -0
  158. package/dist/waddler/buildOrderBy.d.ts +10 -0
  159. package/dist/waddler/buildOrderBy.d.ts.map +1 -0
  160. package/dist/waddler/buildOrderBy.js +22 -0
  161. package/dist/waddler/buildOrderBy.js.map +1 -0
  162. package/dist/waddler/buildWhere.d.ts +13 -0
  163. package/dist/waddler/buildWhere.d.ts.map +1 -0
  164. package/dist/waddler/buildWhere.js +26 -0
  165. package/dist/waddler/buildWhere.js.map +1 -0
  166. package/dist/waddler/bun-sql/index.d.ts +17 -0
  167. package/dist/waddler/bun-sql/index.d.ts.map +1 -0
  168. package/dist/waddler/bun-sql/index.js +25 -0
  169. package/dist/waddler/bun-sql/index.js.map +1 -0
  170. package/dist/waddler/bun-sqlite/index.d.ts +17 -0
  171. package/dist/waddler/bun-sqlite/index.d.ts.map +1 -0
  172. package/dist/waddler/bun-sqlite/index.js +20 -0
  173. package/dist/waddler/bun-sqlite/index.js.map +1 -0
  174. package/dist/waddler/core.d.ts +14 -0
  175. package/dist/waddler/core.d.ts.map +1 -0
  176. package/dist/waddler/core.js +340 -0
  177. package/dist/waddler/core.js.map +1 -0
  178. package/dist/waddler/d1/index.d.ts +16 -0
  179. package/dist/waddler/d1/index.d.ts.map +1 -0
  180. package/dist/waddler/d1/index.js +18 -0
  181. package/dist/waddler/d1/index.js.map +1 -0
  182. package/dist/waddler/durable-objects/index.d.ts +16 -0
  183. package/dist/waddler/durable-objects/index.d.ts.map +1 -0
  184. package/dist/waddler/durable-objects/index.js +18 -0
  185. package/dist/waddler/durable-objects/index.js.map +1 -0
  186. package/dist/waddler/errors.d.ts +10 -0
  187. package/dist/waddler/errors.d.ts.map +1 -0
  188. package/dist/waddler/errors.js +65 -0
  189. package/dist/waddler/errors.js.map +1 -0
  190. package/dist/waddler/index.d.ts +10 -0
  191. package/dist/waddler/index.d.ts.map +1 -0
  192. package/dist/waddler/index.js +6 -0
  193. package/dist/waddler/index.js.map +1 -0
  194. package/dist/waddler/mapping.d.ts +14 -0
  195. package/dist/waddler/mapping.d.ts.map +1 -0
  196. package/dist/waddler/mapping.js +23 -0
  197. package/dist/waddler/mapping.js.map +1 -0
  198. package/dist/waddler/mysql/index.d.ts +17 -0
  199. package/dist/waddler/mysql/index.d.ts.map +1 -0
  200. package/dist/waddler/mysql/index.js +29 -0
  201. package/dist/waddler/mysql/index.js.map +1 -0
  202. package/dist/waddler/neon/index.d.ts +17 -0
  203. package/dist/waddler/neon/index.d.ts.map +1 -0
  204. package/dist/waddler/neon/index.js +25 -0
  205. package/dist/waddler/neon/index.js.map +1 -0
  206. package/dist/waddler/pg/index.d.ts +17 -0
  207. package/dist/waddler/pg/index.d.ts.map +1 -0
  208. package/dist/waddler/pg/index.js +25 -0
  209. package/dist/waddler/pg/index.js.map +1 -0
  210. package/dist/waddler/pglite/index.d.ts +17 -0
  211. package/dist/waddler/pglite/index.d.ts.map +1 -0
  212. package/dist/waddler/pglite/index.js +25 -0
  213. package/dist/waddler/pglite/index.js.map +1 -0
  214. package/dist/waddler/planetscale/index.d.ts +17 -0
  215. package/dist/waddler/planetscale/index.d.ts.map +1 -0
  216. package/dist/waddler/planetscale/index.js +29 -0
  217. package/dist/waddler/planetscale/index.js.map +1 -0
  218. package/dist/waddler/postgres-js/index.d.ts +17 -0
  219. package/dist/waddler/postgres-js/index.d.ts.map +1 -0
  220. package/dist/waddler/postgres-js/index.js +25 -0
  221. package/dist/waddler/postgres-js/index.js.map +1 -0
  222. package/dist/waddler/tidb/index.d.ts +17 -0
  223. package/dist/waddler/tidb/index.d.ts.map +1 -0
  224. package/dist/waddler/tidb/index.js +29 -0
  225. package/dist/waddler/tidb/index.js.map +1 -0
  226. package/dist/waddler/turso/index.d.ts +17 -0
  227. package/dist/waddler/turso/index.d.ts.map +1 -0
  228. package/dist/waddler/turso/index.js +29 -0
  229. package/dist/waddler/turso/index.js.map +1 -0
  230. package/dist/waddler/types.d.ts +91 -0
  231. package/dist/waddler/types.d.ts.map +1 -0
  232. package/dist/waddler/types.js +6 -0
  233. package/dist/waddler/types.js.map +1 -0
  234. package/dist/waddler/vercel-postgres/index.d.ts +17 -0
  235. package/dist/waddler/vercel-postgres/index.d.ts.map +1 -0
  236. package/dist/waddler/vercel-postgres/index.js +25 -0
  237. package/dist/waddler/vercel-postgres/index.js.map +1 -0
  238. package/dist/waddler/xata/index.d.ts +17 -0
  239. package/dist/waddler/xata/index.d.ts.map +1 -0
  240. package/dist/waddler/xata/index.js +25 -0
  241. package/dist/waddler/xata/index.js.map +1 -0
  242. package/docs/CONTRACT.md +36 -0
  243. package/docs/COVERAGE.md +59 -0
  244. package/docs/DRIVERS.md +62 -0
  245. package/docs/drizzle/DIALECTS.md +62 -0
  246. package/docs/drizzle/LIMITS.md +39 -0
  247. package/package.json +232 -0
  248. package/prisma/schema.prisma +15 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Waddler adapter for TiDB (MySQL-compatible).
3
+ * @see https://waddler.drizzle.team/docs/connect-tidb
4
+ *
5
+ * Peer deps: waddler, @tidbcloud/serverless
6
+ */
7
+ import type { WaddlerConnectionConfig } from "../types.js";
8
+ export interface CreateTidbAdapterConfig {
9
+ connection?: string;
10
+ client?: unknown;
11
+ }
12
+ /**
13
+ * Creates a TiDB (MySQL-compatible) connection config. Pass to createDb.
14
+ * Pass connection string or existing driver.
15
+ */
16
+ export declare function createTidbAdapter(config: CreateTidbAdapterConfig): WaddlerConnectionConfig;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/waddler/tidb/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAc,MAAM,aAAa,CAAC;AAIvE,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,uBAAuB,CAgB1F"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Waddler adapter for TiDB (MySQL-compatible).
3
+ * @see https://waddler.drizzle.team/docs/connect-tidb
4
+ *
5
+ * Peer deps: waddler, @tidbcloud/serverless
6
+ */
7
+ import { createRequire } from "node:module";
8
+ const require = createRequire(import.meta.url);
9
+ /**
10
+ * Creates a TiDB (MySQL-compatible) connection config. Pass to createDb.
11
+ * Pass connection string or existing driver.
12
+ */
13
+ export function createTidbAdapter(config) {
14
+ if (!config.client && config.connection == null) {
15
+ throw new Error("createTidbAdapter: connection or client is required");
16
+ }
17
+ const { waddler } = require("waddler/tidb-serverless");
18
+ if (config.client) {
19
+ return { sql: waddler({ client: config.client }), dialect: "mysql", driver: config.client };
20
+ }
21
+ if (config.connection == null)
22
+ throw new Error("connection required");
23
+ return {
24
+ sql: waddler({ connection: config.connection }),
25
+ dialect: "mysql",
26
+ driver: config.client,
27
+ };
28
+ }
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/waddler/tidb/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAO/C;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA+B;IAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,yBAAyB,CAEpD,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtE,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;QAC/C,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Waddler adapter for Turso (LibSQL).
3
+ * @see https://waddler.drizzle.team/docs/connect-turso
4
+ *
5
+ * Peer deps: waddler, @libsql/client
6
+ */
7
+ import type { WaddlerConnectionConfig } from "../types.js";
8
+ export interface CreateTursoAdapterConfig {
9
+ connection?: string;
10
+ client?: unknown;
11
+ }
12
+ /**
13
+ * Creates a Turso (LibSQL) connection config. Pass to createDb.
14
+ * Pass connection config or existing LibSQL client.
15
+ */
16
+ export declare function createTursoAdapter(config: CreateTursoAdapterConfig): WaddlerConnectionConfig;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/waddler/turso/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAc,MAAM,aAAa,CAAC;AAIvE,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,uBAAuB,CAgB5F"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Waddler adapter for Turso (LibSQL).
3
+ * @see https://waddler.drizzle.team/docs/connect-turso
4
+ *
5
+ * Peer deps: waddler, @libsql/client
6
+ */
7
+ import { createRequire } from "node:module";
8
+ const require = createRequire(import.meta.url);
9
+ /**
10
+ * Creates a Turso (LibSQL) connection config. Pass to createDb.
11
+ * Pass connection config or existing LibSQL client.
12
+ */
13
+ export function createTursoAdapter(config) {
14
+ if (!config.client && config.connection == null) {
15
+ throw new Error("createTursoAdapter: connection or client is required");
16
+ }
17
+ const { waddler } = require("waddler/libsql");
18
+ if (config.client) {
19
+ return { sql: waddler({ client: config.client }), dialect: "sqlite", driver: config.client };
20
+ }
21
+ if (config.connection == null)
22
+ throw new Error("connection required");
23
+ return {
24
+ sql: waddler({ connection: config.connection }),
25
+ dialect: "sqlite",
26
+ driver: config.client,
27
+ };
28
+ }
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/waddler/turso/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAO/C;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAgC;IACjE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAE3C,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC/F,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtE,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;QAC/C,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Waddler adapter types.
3
+ * Schema-less: table and column names are strings.
4
+ */
5
+ import type { AnyContract, TableContract } from "@justwant/contract";
6
+ import type { MappedTable, MappedTableInternal } from "@justwant/db";
7
+ /** String-based mapping: contract key → column name. */
8
+ export type StringMapping<TContract extends AnyContract> = {
9
+ [K in keyof TContract]: {
10
+ name: string;
11
+ };
12
+ };
13
+ /** Table source: table name or schema.table. */
14
+ export type TableSource = string | {
15
+ schema?: string;
16
+ table: string;
17
+ };
18
+ /**
19
+ * Waddler SQL client interface.
20
+ * Compatible with waddler/node-postgres, waddler/neon-http, etc.
21
+ */
22
+ export interface WaddlerSql {
23
+ (strings: TemplateStringsArray, ...values: unknown[]): WaddlerQuery;
24
+ identifier: (name: string | {
25
+ schema?: string;
26
+ table: string;
27
+ column?: string;
28
+ as?: string;
29
+ }) => unknown;
30
+ raw: (sql: string) => unknown;
31
+ values: (tuples: unknown[][]) => unknown;
32
+ append?: (part: unknown) => WaddlerQuery;
33
+ }
34
+ /** Query result - thenable, may have append for building. */
35
+ export interface WaddlerQuery {
36
+ then<T>(onfulfilled?: (value: unknown) => T | PromiseLike<T>): Promise<T>;
37
+ catch<T>(onrejected?: (reason: unknown) => T | PromiseLike<T>): Promise<T>;
38
+ append?: (part: unknown) => WaddlerQuery;
39
+ }
40
+ export interface WaddlerMappedTableInternal<TContract extends AnyContract> extends MappedTableInternal<TContract> {
41
+ readonly tableName: string;
42
+ readonly mapping: StringMapping<TContract>;
43
+ readonly client: WaddlerSql;
44
+ }
45
+ export interface WaddlerMappedTable<TContract extends AnyContract> extends MappedTable<TContract> {
46
+ readonly _internal: WaddlerMappedTableInternal<TContract>;
47
+ }
48
+ export type WaddlerDialect = "pg" | "mysql" | "sqlite";
49
+ /** Connection config passed to createDb. Returned by driver factories (createBunSqliteAdapter, etc.). */
50
+ export interface WaddlerConnectionConfig {
51
+ sql: WaddlerSql;
52
+ dialect: WaddlerDialect;
53
+ driver?: unknown;
54
+ onValidationError?: "throw" | "return";
55
+ /** Release connection when done. Call db.close() or await on shutdown. */
56
+ close?: () => Promise<void>;
57
+ }
58
+ export interface CreateWaddlerAdapterOptions {
59
+ dialect: WaddlerDialect;
60
+ /** Expose the native driver (pg Pool, neon client, etc.). */
61
+ driver?: unknown;
62
+ /** On validation error: "throw" (default) or "return" for createSafe/updateSafe. */
63
+ onValidationError?: "throw" | "return";
64
+ }
65
+ export interface TableOptions {
66
+ /** Override mapping for specific keys. Merged with contract.mapping. */
67
+ mapping?: Partial<Record<string, {
68
+ name: string;
69
+ }>>;
70
+ /** Column name for soft delete. Default 'deletedAt'. Set to null to disable. */
71
+ softDeleteColumn?: string | null;
72
+ }
73
+ export interface Db {
74
+ readonly sql: WaddlerSql;
75
+ readonly driver?: unknown;
76
+ readonly dialect: WaddlerDialect;
77
+ /** Execute getCreateTableSQL and run DDL. */
78
+ createTable<T extends TableContract<AnyContract>>(contract: T): Promise<void>;
79
+ /** Create table from TableContract (tableName + mapping from contract). */
80
+ table<T extends TableContract<AnyContract>>(contract: T, options?: TableOptions): WaddlerMappedTable<T["fields"]>;
81
+ /** Legacy: define table with explicit tableSource, contract, mapping. */
82
+ defineTable<TContract extends AnyContract>(tableName: TableSource, contract: TContract, mapping: StringMapping<TContract>, options?: DefineWaddlerTableOptions): WaddlerMappedTable<TContract>;
83
+ transaction?<T>(fn: (tx: Db) => Promise<T>): Promise<T>;
84
+ /** Release connection. No-op if config had no close. */
85
+ close?(): Promise<void>;
86
+ }
87
+ export interface DefineWaddlerTableOptions {
88
+ /** Column name for soft delete. Default 'deletedAt'. Set to null to disable. */
89
+ softDeleteColumn?: string | null;
90
+ }
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/waddler/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Waddler adapter types.
3
+ * Schema-less: table and column names are strings.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/waddler/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Waddler adapter for Vercel Postgres.
3
+ * @see https://waddler.drizzle.team/docs/connect-vercel-postgres
4
+ *
5
+ * Peer deps: waddler, @vercel/postgres
6
+ */
7
+ import type { WaddlerConnectionConfig } from "../types.js";
8
+ export interface CreateVercelPostgresAdapterConfig {
9
+ connection?: string;
10
+ client?: unknown;
11
+ }
12
+ /**
13
+ * Creates a Vercel Postgres connection config. Pass to createDb.
14
+ * Pass connection string or existing Pool client.
15
+ */
16
+ export declare function createVercelPostgresAdapter(config: CreateVercelPostgresAdapterConfig): WaddlerConnectionConfig;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/waddler/vercel-postgres/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAc,MAAM,aAAa,CAAC;AAIvE,MAAM,WAAW,iCAAiC;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,iCAAiC,GACxC,uBAAuB,CAYzB"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Waddler adapter for Vercel Postgres.
3
+ * @see https://waddler.drizzle.team/docs/connect-vercel-postgres
4
+ *
5
+ * Peer deps: waddler, @vercel/postgres
6
+ */
7
+ import { createRequire } from "node:module";
8
+ const require = createRequire(import.meta.url);
9
+ /**
10
+ * Creates a Vercel Postgres connection config. Pass to createDb.
11
+ * Pass connection string or existing Pool client.
12
+ */
13
+ export function createVercelPostgresAdapter(config) {
14
+ if (!config.client && config.connection == null) {
15
+ throw new Error("createVercelPostgresAdapter: connection or client is required");
16
+ }
17
+ const { waddler } = require("waddler/vercel-postgres");
18
+ if (config.client) {
19
+ return { sql: waddler({ client: config.client }), dialect: "pg", driver: config.client };
20
+ }
21
+ if (config.connection == null)
22
+ throw new Error("connection required");
23
+ return { sql: waddler({ connection: config.connection }), dialect: "pg", driver: config.client };
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/waddler/vercel-postgres/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAO/C;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAyC;IAEzC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,yBAAyB,CAEpD,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC3F,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACnG,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Waddler adapter for Xata (PostgreSQL).
3
+ * @see https://waddler.drizzle.team/docs/connect-xata
4
+ *
5
+ * Peer deps: waddler, @xata.io/client
6
+ */
7
+ import type { WaddlerConnectionConfig } from "../types.js";
8
+ export interface CreateXataAdapterConfig {
9
+ connection?: string;
10
+ client?: unknown;
11
+ }
12
+ /**
13
+ * Creates an Xata PostgreSQL connection config. Pass to createDb.
14
+ * Pass connection string or existing XataClient.
15
+ */
16
+ export declare function createXataAdapter(config: CreateXataAdapterConfig): WaddlerConnectionConfig;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/waddler/xata/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAc,MAAM,aAAa,CAAC;AAIvE,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,uBAAuB,CAY1F"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Waddler adapter for Xata (PostgreSQL).
3
+ * @see https://waddler.drizzle.team/docs/connect-xata
4
+ *
5
+ * Peer deps: waddler, @xata.io/client
6
+ */
7
+ import { createRequire } from "node:module";
8
+ const require = createRequire(import.meta.url);
9
+ /**
10
+ * Creates an Xata PostgreSQL connection config. Pass to createDb.
11
+ * Pass connection string or existing XataClient.
12
+ */
13
+ export function createXataAdapter(config) {
14
+ if (!config.client && config.connection == null) {
15
+ throw new Error("createXataAdapter: connection or client is required");
16
+ }
17
+ const { waddler } = require("waddler/xata-http");
18
+ if (config.client) {
19
+ return { sql: waddler({ client: config.client }), dialect: "pg", driver: config.client };
20
+ }
21
+ if (config.connection == null)
22
+ throw new Error("connection required");
23
+ return { sql: waddler({ connection: config.connection }), dialect: "pg", driver: config.client };
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/waddler/xata/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAO/C;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA+B;IAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAE9C,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC3F,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACnG,CAAC"}
@@ -0,0 +1,36 @@
1
+ # Contract invariants
2
+
3
+ ## FieldDef
4
+
5
+ - **`_required: true`** — Field is required in create/update. Must be present.
6
+ - **`_required: false`** — Field is optional. Can be omitted.
7
+ - **`_nullable: true`** — Optional fields. At read time, DB `null` → JS `undefined`.
8
+ - **`_nullable: false`** — Required fields. Never null.
9
+
10
+ ## BoundQuery
11
+
12
+ - **Lazy execution** — Queries are not run until `execute()` is called.
13
+ - **Transaction context** — When inside `adapter.transaction(fn)`, `execute()` uses the transaction context. Implementations must propagate this.
14
+ - **No factory** — This package does not provide `createBoundQuery()`. Implementations (e.g. `@justwant/db/drizzle`) construct `BoundQuery` objects. Example:
15
+
16
+ ```ts
17
+ const q: BoundQuery<T> = {
18
+ get _result() { return undefined as T },
19
+ async execute() { return /* run query */ }
20
+ }
21
+ ```
22
+
23
+ ## MappedTableInternal.sql
24
+
25
+ - **delete(id)** — Soft delete. Marks row as deleted, preserves data. Typically sets `deleted_at` or similar.
26
+ - **hardDelete(id)** — Hard delete. Removes row permanently.
27
+
28
+ ## CreateInput
29
+
30
+ - Excludes `id`, `createdAt`, `updatedAt` by default. Override if your schema uses different column names.
31
+
32
+ ## AnyContract
33
+
34
+ - Must be `Record<string, FieldDef<unknown, boolean>>`.
35
+ - Empty contract `{}` is valid.
36
+ - Index signatures are not supported.
@@ -0,0 +1,59 @@
1
+ # Couverture des tests — @justwant/db
2
+
3
+ ## Résumé
4
+
5
+ | Module | Spec | Couverture estimée | Lacunes |
6
+ |--------|------|-------------------|---------|
7
+ | **base/** | | | |
8
+ | contract.ts | contract.spec.ts | ✓ | — |
9
+ | tableContract.ts | tableContract.spec.ts | ✓ | — |
10
+ | table.ts | table.spec.ts | ✓ | — |
11
+ | conforms.ts | conforms.spec.ts | ✓ | — |
12
+ | validate.ts | validate.spec.ts | ✓ | — |
13
+ | schemas.ts | schemas.spec.ts | ✓ | — |
14
+ | fieldBuilder.ts | via tableContract, validate | ✓ | — |
15
+ | fields.ts | réexport | ✓ | — |
16
+ | errors.ts | adapter.spec.ts | ✓ | — |
17
+ | adapter.ts | adapter.spec.ts | ✓ | — |
18
+ | **waddler/** | | | |
19
+ | core.ts | createAdapter.spec.ts, integration.spec.ts | ✓ | buildWhere, buildOrderBy (indirect) |
20
+ | errors.ts | errors.spec.ts | ✓ | — |
21
+ | buildWhere.ts | via createAdapter | ✓ | — |
22
+ | mapping.ts | via drizzle/mapping.spec | ✓ | — |
23
+ | **drizzle/** | | | |
24
+ | createAdapter.ts | createAdapter.spec.ts | ✓ | — |
25
+ | buildWhere, buildOrderBy, buildPagination | *.spec.ts | ✓ | — |
26
+ | mapping, upsert, bulkInsert, collectSchemas | *.spec.ts | ✓ | — |
27
+ | errors.ts | errors.spec.ts | ✓ | — |
28
+ | **prisma/** | | | |
29
+ | createAdapter.ts | createAdapter.spec.ts | ✓ | — |
30
+ | buildWhere, mapping, upsert, bulkInsert | *.spec.ts | ✓ | — |
31
+ | errors.ts | errors.spec.ts | ✓ | — |
32
+
33
+ ## Fichiers sans spec dédié
34
+
35
+ - **Entry points** (bun-sqlite, pg, neon, etc.) : wrappers minces autour de `createWaddlerAdapter`, couverts par les tests d’intégration.
36
+ - **fieldBuilder.ts** : couvert via tableContract (defineContract avec field builders) et validate (email, uuid).
37
+ - **waddler/buildOrderBy.ts** : non utilisé par le core waddler actuel ; couvert si utilisé via drizzle.
38
+
39
+ ## Tests E2E / intégration
40
+
41
+ - `waddler/integration.spec.ts` : CRUD complet avec bun-sqlite.
42
+ - `prisma/integration.spec.ts` : CRUD avec Prisma.
43
+ - `drizzle/createAdapter.spec.ts` : CRUD avec Drizzle + SQLite.
44
+
45
+ ## Verdict
46
+
47
+ **Couverture suffisante** pour un package DAL :
48
+
49
+ 1. **API publique** : create, findById, findOne, findMany, update, delete, createSafe, updateSafe, table(), createTable() sont testés.
50
+ 2. **Validation** : validateContractData, ContractValidationError, createSafe couverts.
51
+ 3. **Conformité** : assertTableConforms, conformsTo, tableConforms couverts.
52
+ 4. **Erreurs** : hiérarchie AdapterError et parseWaddlerError/parseDbError couvertes.
53
+ 5. **Schémas** : uuid, email, url, ipv4, slug validés.
54
+
55
+ ## Recommandations
56
+
57
+ 1. **Coverage threshold** : ajouter `coverageThreshold = 0.8` dans `bunfig.toml` pour bloquer les merges si la couverture baisse.
58
+ 2. **Tests manquants** : `updateSafe` avec validation échouée (retourne `{ ok: false }`).
59
+ 3. **E2E multi-dialecte** : un test pg ou mysql en CI si possible.
@@ -0,0 +1,62 @@
1
+ # DB Drivers (Waddler)
2
+
3
+ Pass the driver config to `createDb` for tree-shaking. Import only the driver you need. Connection must be passed explicitly (no `process.env` fallback in drivers).
4
+
5
+ ## Bun SQLite
6
+
7
+ **Package:** `@justwant/db/bun-sqlite`
8
+ **Peer deps:** waddler (Bun runtime)
9
+
10
+ ```ts
11
+ import { createDb } from "@justwant/db/waddler";
12
+ import { createBunSqliteAdapter } from "@justwant/db/bun-sqlite";
13
+
14
+ const db = createDb(createBunSqliteAdapter({ connection: ":memory:" }));
15
+ ```
16
+
17
+ | Option | Type | Description |
18
+ |--------|------|-------------|
19
+ | `connection` | `string` | Path or `:memory:`. Default: `:memory:` |
20
+ | `client` | `unknown` | Existing Database |
21
+
22
+ ## PostgreSQL (node-postgres)
23
+
24
+ **Package:** `@justwant/db/pg`
25
+
26
+ ```ts
27
+ const db = createDb(createPgAdapter({ connection: "postgresql://user:pass@localhost/db" }));
28
+ ```
29
+
30
+ | Option | Type | Description |
31
+ |--------|------|-------------|
32
+ | `connection` | `string` | Connection string (required if no client) |
33
+ | `client` | `unknown` | Existing pg Pool/Client |
34
+
35
+ ## Neon
36
+
37
+ **Package:** `@justwant/db/neon`
38
+
39
+ ```ts
40
+ const db = createDb(createNeonAdapter({ connection: "postgresql://..." }));
41
+ ```
42
+
43
+ ## Vercel Postgres, Xata, PGLite, Bun SQL, postgres.js
44
+
45
+ Same pattern: `{ connection: string }` or `{ client: unknown }`.
46
+
47
+ ## MySQL, PlanetScale, TiDB
48
+
49
+ ```ts
50
+ const db = createDb(createMysqlAdapter({ connection: "mysql://..." }));
51
+ ```
52
+
53
+ ## Turso, D1, Durable Objects, better-sqlite3
54
+
55
+ - **Turso:** `{ connection: string }` or `{ client: unknown }`
56
+ - **D1:** `{ client: unknown }` (required)
57
+ - **Durable Objects:** `{ client: unknown }` (required)
58
+ - **better-sqlite3:** `{ connection: ":memory:" }` or `{ client: unknown }`
59
+
60
+ ## Mapping
61
+
62
+ See [@justwant/contract README](../../contract/README.md#mapping-contract-key--column-name). Default: contract key = column name. Use `defaultMapping: "camelToSnake"` or `mapping` to override.
@@ -0,0 +1,62 @@
1
+ # Supported Dialects and Types
2
+
3
+ `@justwant/db/drizzle` supports PostgreSQL, MySQL, and SQLite via Drizzle ORM.
4
+
5
+ ## Drivers
6
+
7
+ | Dialect | Drizzle driver | Package |
8
+ |---------|---------------|---------|
9
+ | **PostgreSQL** | `drizzle-orm/node-pg` | `pg` |
10
+ | **MySQL** | `drizzle-orm/mysql2` | `mysql2` |
11
+ | **SQLite** | `drizzle-orm/better-sqlite3` | `better-sqlite3` |
12
+ | **SQLite (Bun)** | `drizzle-orm/bun-sqlite` | built-in `bun:sqlite` |
13
+
14
+ ## Type Support by Dialect
15
+
16
+ ### PostgreSQL
17
+
18
+ - `text`, `varchar`, `char` → `string`
19
+ - `integer`, `bigint`, `smallint` → `number`
20
+ - `boolean` → `boolean`
21
+ - `timestamp`, `timestamptz`, `date` → `Date`
22
+ - `json`, `jsonb` → `unknown` (or typed via schema)
23
+ - `uuid` → `string`
24
+ - `numeric`, `decimal` → `number` or `string` (precision-dependent)
25
+
26
+ ### MySQL
27
+
28
+ - `varchar`, `char`, `text` → `string`
29
+ - `int`, `bigint`, `tinyint` → `number` (tinyint as boolean: `0`/`1`)
30
+ - `boolean` (alias for tinyint) → `boolean`
31
+ - `datetime`, `timestamp`, `date` → `Date`
32
+ - `json` → `unknown`
33
+ - `decimal` → `number` or `string`
34
+
35
+ ### SQLite
36
+
37
+ - `text` → `string`
38
+ - `integer` → `number`
39
+ - `real` → `number`
40
+ - `blob` → `Buffer` or `Uint8Array`
41
+ - `boolean` (stored as integer 0/1) → `boolean`
42
+ - `numeric` → `number` or `string`
43
+
44
+ ## Enums
45
+
46
+ - **PostgreSQL**: `pgEnum()` → TypeScript `string` union
47
+ - **MySQL**: `mysqlEnum()` → TypeScript `string` union
48
+ - **SQLite**: Use `text` with check constraint or application-level validation
49
+
50
+ ## Dialect Detection
51
+
52
+ The adapter infers dialect from `db.dialect.name`:
53
+
54
+ - `"pg"` or `"postgresql"` → PostgreSQL
55
+ - `"mysql"` → MySQL
56
+ - `"sqlite"` or `"bun-sqlite"` → SQLite
57
+
58
+ For drivers where auto-detection fails (e.g. `drizzle-orm/bun-sqlite`), pass `dialect` explicitly:
59
+
60
+ ```ts
61
+ createDrizzleAdapter(db, { dialect: "sqlite" });
62
+ ```
@@ -0,0 +1,39 @@
1
+ # Known Limits
2
+
3
+ ## drizzle-orm Version Compatibility
4
+
5
+ - **0.45.x**: Tested and supported.
6
+ - **1.0.0-beta.x**: Tested with `1.0.0-beta.16` and compatible. The adapter uses the core query builder API (`select`, `insert`, `update`, `delete`, `eq`, `and`, `isNull`, `getTableName`) and does not rely on RQB (Relational Query Builder), so RQBv1→v2 migration does not affect this package.
7
+ - **Internal types**: `Table['_']['columns']` and `Column._.data` are used for mapping; if Drizzle changes these internals in a future release, `drizzle-types.ts` is the single point to update.
8
+
9
+ ## Upsert
10
+
11
+ - **PostgreSQL**: Full support via `ON CONFLICT DO UPDATE`
12
+ - **MySQL**: Not supported (throws `AdapterUnsupportedError`). Use `ON DUPLICATE KEY` manually or a separate package.
13
+ - **SQLite**: Not supported in Phase 1. May be added later.
14
+
15
+ ## Computed / Generated Columns
16
+
17
+ - Columns with database-side defaults (e.g. `DEFAULT (lower(hex(randomblob(16))))`) are supported for inserts when omitted.
18
+ - Application-generated values (e.g. `$defaultFn`) are handled by Drizzle; ensure your mapping includes them when reading.
19
+ - Virtual/computed columns that are not stored are not supported in the mapping.
20
+
21
+ ## JSON / JSONB
22
+
23
+ - Stored and retrieved as `unknown` by default.
24
+ - Use schema-level typing or `mapRowToContract` custom logic for typed JSON fields.
25
+
26
+ ## Index Signatures in Contracts
27
+
28
+ - `InferContract` does not support index signatures (`[key: string]: T`).
29
+ - Use explicit field definitions only.
30
+
31
+ ## Migrations
32
+
33
+ - `collectSchemas()` returns tables for inspection.
34
+ - Use **drizzle-kit** for migration generation: `drizzle-kit generate`, `drizzle-kit migrate`.
35
+
36
+ ## Transactions
37
+
38
+ - Supported when the Drizzle client exposes `transaction(fn)`.
39
+ - The transaction adapter uses the same API; all `defineTable` tables use the transactional client during the callback.