@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,36 @@
1
+ import type { AnyContract, InferContract } from "./contract.js";
2
+ /**
3
+ * Represents a deferred query. Execution is lazy — call execute() to run.
4
+ * Implementations (e.g. adapter-drizzle) construct these; no factory in this package.
5
+ *
6
+ * @see docs/CONTRACT.md for construction guidance.
7
+ */
8
+ export interface BoundQuery<TResult> {
9
+ readonly _result: TResult;
10
+ execute(): Promise<TResult>;
11
+ }
12
+ /**
13
+ * Input for create operations. Excludes common auto-generated fields.
14
+ * Override the excluded keys if your schema uses different names.
15
+ */
16
+ export type CreateInput<TContract extends AnyContract> = Omit<InferContract<TContract>, "id" | "createdAt" | "updatedAt">;
17
+ export interface MappedTableInternal<TContract extends AnyContract> {
18
+ readonly contract: TContract;
19
+ readonly sql: {
20
+ findById(id: string): BoundQuery<InferContract<TContract> | null>;
21
+ findOne(where: Partial<InferContract<TContract>>): BoundQuery<InferContract<TContract> | null>;
22
+ findMany(where: Partial<InferContract<TContract>>): BoundQuery<InferContract<TContract>[]>;
23
+ create(data: CreateInput<TContract>): BoundQuery<InferContract<TContract>>;
24
+ update(id: string, data: Partial<InferContract<TContract>>): BoundQuery<InferContract<TContract>>;
25
+ /** Soft delete — marks as deleted, preserves row. */
26
+ delete(id: string): BoundQuery<void>;
27
+ /** Hard delete — removes row permanently. */
28
+ hardDelete(id: string): BoundQuery<void>;
29
+ };
30
+ }
31
+ export interface MappedTable<TContract extends AnyContract> {
32
+ readonly infer: InferContract<TContract>;
33
+ readonly contract: TContract;
34
+ readonly _internal: MappedTableInternal<TContract>;
35
+ }
36
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,WAAW,UAAU,CAAC,OAAO;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,SAAS,SAAS,WAAW,IAAI,IAAI,CAC3D,aAAa,CAAC,SAAS,CAAC,EACxB,IAAI,GAAG,WAAW,GAAG,WAAW,CACjC,CAAC;AAEF,MAAM,WAAW,mBAAmB,CAAC,SAAS,SAAS,WAAW;IAChE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE;QACZ,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAClE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/F,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3E,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GACtC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;QACxC,qDAAqD;QACrD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,6CAA6C;QAC7C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;KAC1C,CAAC;CACH;AAED,MAAM,WAAW,WAAW,CAAC,SAAS,SAAS,WAAW;IACxD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC;CACpD"}
package/dist/table.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Waddler adapter for better-sqlite3.
3
+ * @see https://waddler.drizzle.team/docs/connect-better-sqlite3
4
+ *
5
+ * Peer deps: waddler, better-sqlite3
6
+ */
7
+ import type { WaddlerConnectionConfig } from "../types.js";
8
+ export interface CreateBetterSqlite3AdapterConfig {
9
+ connection?: string;
10
+ client?: unknown;
11
+ }
12
+ /**
13
+ * Creates a better-sqlite3 connection config. Pass to createDb.
14
+ * Pass connection string (e.g. ":memory:") or existing Database.
15
+ */
16
+ export declare function createBetterSqlite3Adapter(config: CreateBetterSqlite3AdapterConfig): WaddlerConnectionConfig;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/waddler/better-sqlite3/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAc,MAAM,aAAa,CAAC;AAIvE,MAAM,WAAW,gCAAgC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,gCAAgC,GACvC,uBAAuB,CAQzB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Waddler adapter for better-sqlite3.
3
+ * @see https://waddler.drizzle.team/docs/connect-better-sqlite3
4
+ *
5
+ * Peer deps: waddler, better-sqlite3
6
+ */
7
+ import { createRequire } from "node:module";
8
+ const require = createRequire(import.meta.url);
9
+ /**
10
+ * Creates a better-sqlite3 connection config. Pass to createDb.
11
+ * Pass connection string (e.g. ":memory:") or existing Database.
12
+ */
13
+ export function createBetterSqlite3Adapter(config) {
14
+ const { waddler } = require("waddler/better-sqlite3");
15
+ const sql = config.client
16
+ ? waddler({ client: config.client })
17
+ : waddler((config.connection ?? ":memory:"));
18
+ return { sql, dialect: "sqlite", driver: config.client };
19
+ }
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/waddler/better-sqlite3/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,0BAA0B,CACxC,MAAwC;IAExC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAEnD,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM;QACvB,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,UAAU,CAAW,CAAC,CAAC;IACzD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Build ORDER BY clause for Waddler SQL.
3
+ */
4
+ import type { WaddlerQuery, WaddlerSql } from "./types.js";
5
+ export type OrderDirection = "asc" | "desc";
6
+ /** Appends ORDER BY clause to the query. Mutates query in place. */
7
+ export declare function appendOrderBy(sql: WaddlerSql, query: WaddlerQuery, mapping: Record<string, {
8
+ name: string;
9
+ }>, orderBy: Record<string, OrderDirection>): void;
10
+ //# sourceMappingURL=buildOrderBy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildOrderBy.d.ts","sourceRoot":"","sources":["../../src/waddler/buildOrderBy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,CAAC;AAE5C,oEAAoE;AACpE,wBAAgB,aAAa,CAC3B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GACtC,IAAI,CAcN"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Build ORDER BY clause for Waddler SQL.
3
+ */
4
+ /** Appends ORDER BY clause to the query. Mutates query in place. */
5
+ export function appendOrderBy(sql, query, mapping, orderBy) {
6
+ const entries = Object.entries(orderBy).filter(([key]) => mapping[key]);
7
+ if (entries.length === 0)
8
+ return;
9
+ const append = query.append;
10
+ if (!append)
11
+ return;
12
+ append.call(query, sql.raw(" ORDER BY "));
13
+ entries.forEach(([key, dir], i) => {
14
+ const colName = mapping[key]?.name;
15
+ if (!colName)
16
+ return;
17
+ if (i > 0)
18
+ append.call(query, sql.raw(", "));
19
+ append.call(query, sql `${sql.identifier(colName)} ${sql.raw(dir === "desc" ? "DESC" : "ASC")}`);
20
+ });
21
+ }
22
+ //# sourceMappingURL=buildOrderBy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildOrderBy.js","sourceRoot":"","sources":["../../src/waddler/buildOrderBy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,oEAAoE;AACpE,MAAM,UAAU,aAAa,CAC3B,GAAe,EACf,KAAmB,EACnB,OAAyC,EACzC,OAAuC;IAEvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;QACnC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAA,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Build WHERE clause for Waddler SQL (parameterized).
3
+ */
4
+ import type { WaddlerQuery, WaddlerSql } from "./types.js";
5
+ export interface AppendWhereOptions {
6
+ /** Use " AND " for first condition instead of " WHERE ". Use when WHERE already started. */
7
+ firstConnector?: " WHERE " | " AND ";
8
+ }
9
+ /** Appends WHERE conditions to the query. Mutates query in place. */
10
+ export declare function appendWhere(sql: WaddlerSql, query: WaddlerQuery, mapping: Record<string, {
11
+ name: string;
12
+ }>, where: Record<string, unknown>, options?: AppendWhereOptions): void;
13
+ //# sourceMappingURL=buildWhere.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildWhere.d.ts","sourceRoot":"","sources":["../../src/waddler/buildWhere.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,4FAA4F;IAC5F,cAAc,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;CACtC;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CACzB,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACzC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,IAAI,CAmBN"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Build WHERE clause for Waddler SQL (parameterized).
3
+ */
4
+ /** Appends WHERE conditions to the query. Mutates query in place. */
5
+ export function appendWhere(sql, query, mapping, where, options) {
6
+ const entries = Object.entries(where).filter(([, v]) => v !== undefined);
7
+ if (entries.length === 0)
8
+ return;
9
+ const append = query.append;
10
+ if (!append)
11
+ return;
12
+ const useAnd = options?.firstConnector === " AND ";
13
+ for (let i = 0; i < entries.length; i++) {
14
+ const entry = entries[i];
15
+ if (entry === undefined)
16
+ continue;
17
+ const [key, val] = entry;
18
+ const colName = mapping[key]?.name;
19
+ if (!colName)
20
+ continue;
21
+ const connector = i === 0 && !useAnd ? sql ` WHERE ` : sql ` AND `;
22
+ append.call(query, connector);
23
+ append.call(query, sql `${sql.identifier(colName)} = ${val}`);
24
+ }
25
+ }
26
+ //# sourceMappingURL=buildWhere.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildWhere.js","sourceRoot":"","sources":["../../src/waddler/buildWhere.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,qEAAqE;AACrE,MAAM,UAAU,WAAW,CACzB,GAAe,EACf,KAAmB,EACnB,OAAyC,EACzC,KAA8B,EAC9B,OAA4B;IAE5B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,MAAM,GAAG,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;IAEnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;QACnC,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAA,SAAS,CAAC,CAAC,CAAC,GAAG,CAAA,OAAO,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAA,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Waddler adapter for Bun SQL (PostgreSQL).
3
+ * @see https://waddler.drizzle.team/docs/connect-bun-sql
4
+ *
5
+ * Peer deps: waddler (Bun runtime)
6
+ */
7
+ import type { WaddlerConnectionConfig } from "../types.js";
8
+ export interface CreateBunSqlAdapterConfig {
9
+ connection?: string;
10
+ client?: unknown;
11
+ }
12
+ /**
13
+ * Creates a Bun SQL (PostgreSQL) connection config. Pass to createDb.
14
+ * Pass connection string or existing Bun.sql client.
15
+ */
16
+ export declare function createBunSqlAdapter(config: CreateBunSqlAdapterConfig): WaddlerConnectionConfig;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/waddler/bun-sql/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAc,MAAM,aAAa,CAAC;AAIvE,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,uBAAuB,CAY9F"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Waddler adapter for Bun SQL (PostgreSQL).
3
+ * @see https://waddler.drizzle.team/docs/connect-bun-sql
4
+ *
5
+ * Peer deps: waddler (Bun runtime)
6
+ */
7
+ import { createRequire } from "node:module";
8
+ const require = createRequire(import.meta.url);
9
+ /**
10
+ * Creates a Bun SQL (PostgreSQL) connection config. Pass to createDb.
11
+ * Pass connection string or existing Bun.sql client.
12
+ */
13
+ export function createBunSqlAdapter(config) {
14
+ if (!config.client && config.connection == null) {
15
+ throw new Error("createBunSqlAdapter: connection or client is required");
16
+ }
17
+ const { waddler } = require("waddler/bun-sql");
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/bun-sql/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,mBAAmB,CAAC,MAAiC;IACnE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAE5C,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 Bun SQLite.
3
+ * @see https://waddler.drizzle.team/docs/connect-bun-sqlite
4
+ *
5
+ * Peer deps: waddler (Bun runtime)
6
+ */
7
+ import type { WaddlerConnectionConfig } from "../types.js";
8
+ export interface CreateBunSqliteAdapterConfig {
9
+ connection?: string;
10
+ client?: unknown;
11
+ }
12
+ /**
13
+ * Creates a Bun SQLite connection config. Pass to createDb.
14
+ * Pass connection string (e.g. ":memory:") or existing Database.
15
+ */
16
+ export declare function createBunSqliteAdapter(config: CreateBunSqliteAdapterConfig): WaddlerConnectionConfig;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/waddler/bun-sqlite/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAc,MAAM,aAAa,CAAC;AAIvE,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,4BAA4B,GACnC,uBAAuB,CAQzB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Waddler adapter for Bun SQLite.
3
+ * @see https://waddler.drizzle.team/docs/connect-bun-sqlite
4
+ *
5
+ * Peer deps: waddler (Bun runtime)
6
+ */
7
+ import { createRequire } from "node:module";
8
+ const require = createRequire(import.meta.url);
9
+ /**
10
+ * Creates a Bun SQLite connection config. Pass to createDb.
11
+ * Pass connection string (e.g. ":memory:") or existing Database.
12
+ */
13
+ export function createBunSqliteAdapter(config) {
14
+ const { waddler } = require("waddler/bun-sqlite");
15
+ const sql = config.client
16
+ ? waddler({ client: config.client })
17
+ : waddler((config.connection ?? ":memory:"));
18
+ return { sql, dialect: "sqlite", driver: config.client };
19
+ }
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/waddler/bun-sqlite/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,sBAAsB,CACpC,MAAoC;IAEpC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAE/C,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM;QACvB,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,UAAU,CAAW,CAAC,CAAC;IACzD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Waddler adapter core - CRUD with schema-less mapping.
3
+ */
4
+ import type { CreateWaddlerAdapterOptions, Db, WaddlerConnectionConfig, WaddlerSql } from "./types.js";
5
+ /**
6
+ * Creates a db from connection config. Use with driver factories (createBunSqliteAdapter, etc.).
7
+ */
8
+ export declare function createDb(config: WaddlerConnectionConfig): Db;
9
+ /**
10
+ * Creates a Waddler adapter for the given SQL client.
11
+ * Low-level: use createDb with a driver factory for the common case.
12
+ */
13
+ export declare function createWaddlerAdapter(sql: WaddlerSql, options: CreateWaddlerAdapterOptions): Db;
14
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/waddler/core.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,KAAK,EACV,2BAA2B,EAC3B,EAAE,EAKF,uBAAuB,EAIvB,UAAU,EACX,MAAM,YAAY,CAAC;AAwFpB;;GAEG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,uBAAuB,GAAG,EAAE,CAM5D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,2BAA2B,GAAG,EAAE,CA+R9F"}
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Waddler adapter core - CRUD with schema-less mapping.
3
+ */
4
+ import { ContractValidationError, validateContractData } from "@justwant/contract/validate";
5
+ import { getCreateTableSQL, getDropTableSQL, getExistTableSQL } from "../ddl/index.js";
6
+ import { appendWhere } from "./buildWhere.js";
7
+ import { parseWaddlerError } from "./errors.js";
8
+ import { mapRowToContract } from "./mapping.js";
9
+ function resolveTableIdentifier(sql, source) {
10
+ if (typeof source === "string") {
11
+ return sql.identifier(source);
12
+ }
13
+ return sql.identifier(source);
14
+ }
15
+ function resolveTableName(source) {
16
+ if (typeof source === "string")
17
+ return source;
18
+ return source.schema ? `${source.schema}.${source.table}` : source.table;
19
+ }
20
+ function resolveTableSchema(source) {
21
+ if (typeof source === "string")
22
+ return undefined;
23
+ return source.schema;
24
+ }
25
+ function resolveSimpleTableName(source) {
26
+ if (typeof source === "string")
27
+ return source;
28
+ return source.table;
29
+ }
30
+ /** Parse exist() query result to boolean. */
31
+ function parseExistResult(rows) {
32
+ const row = rows[0];
33
+ if (!row)
34
+ return false;
35
+ const val = Object.values(row)[0];
36
+ return val === 1 || val === true || (typeof val === "number" && val !== 0);
37
+ }
38
+ /** Normalize query result to row array. */
39
+ function toRows(result) {
40
+ if (Array.isArray(result))
41
+ return result;
42
+ const r = result;
43
+ return (r?.rows ?? []);
44
+ }
45
+ /**
46
+ * Build SELECT query with optional WHERE. Uses append if available.
47
+ */
48
+ function buildSelectQuery(sql, tableId, mapping, where, softDeleteColName, limit) {
49
+ const hasWhere = softDeleteColName || Object.entries(where).some(([, v]) => v !== undefined);
50
+ const query = sql `SELECT * FROM ${tableId}`;
51
+ const append = query.append;
52
+ if (append && hasWhere) {
53
+ if (softDeleteColName) {
54
+ append.call(query, sql ` WHERE `);
55
+ append.call(query, sql `${sql.identifier(softDeleteColName)} IS NULL`);
56
+ const whereFiltered = Object.fromEntries(Object.entries(where).filter(([, v]) => v !== undefined));
57
+ if (Object.keys(whereFiltered).length > 0) {
58
+ appendWhere(sql, query, mapping, whereFiltered, {
59
+ firstConnector: " AND ",
60
+ });
61
+ }
62
+ }
63
+ else {
64
+ appendWhere(sql, query, mapping, where);
65
+ }
66
+ }
67
+ else if (append &&
68
+ !hasWhere &&
69
+ Object.keys(where).some((k) => where[k] !== undefined)) {
70
+ appendWhere(sql, query, mapping, where);
71
+ }
72
+ if (append && limit !== undefined) {
73
+ append.call(query, sql ` LIMIT ${limit}`);
74
+ }
75
+ return query;
76
+ }
77
+ /**
78
+ * Creates a db from connection config. Use with driver factories (createBunSqliteAdapter, etc.).
79
+ */
80
+ export function createDb(config) {
81
+ const db = createWaddlerAdapter(config.sql, config);
82
+ if (config.close) {
83
+ return { ...db, close: config.close };
84
+ }
85
+ return db;
86
+ }
87
+ /**
88
+ * Creates a Waddler adapter for the given SQL client.
89
+ * Low-level: use createDb with a driver factory for the common case.
90
+ */
91
+ export function createWaddlerAdapter(sql, options) {
92
+ const { dialect, driver } = options;
93
+ const supportsReturning = dialect === "pg" || dialect === "sqlite";
94
+ const adapter = {
95
+ sql,
96
+ driver,
97
+ dialect,
98
+ async createTable(contract) {
99
+ const dialect = adapter.dialect;
100
+ const ddl = getCreateTableSQL(contract, dialect);
101
+ await sql `${sql.raw(ddl)}`;
102
+ },
103
+ table(contract, tableOptions) {
104
+ const mergedMapping = {
105
+ ...contract.mapping,
106
+ ...tableOptions?.mapping,
107
+ };
108
+ return adapter.defineTable(contract.tableName, contract.fields, mergedMapping, {
109
+ softDeleteColumn: tableOptions?.softDeleteColumn,
110
+ });
111
+ },
112
+ defineTable(tableSource, contract, mapping, defineOptions) {
113
+ const softDeleteCol = defineOptions?.softDeleteColumn ?? "deletedAt";
114
+ const tableId = resolveTableIdentifier(sql, tableSource);
115
+ const tableName = resolveTableName(tableSource);
116
+ const simpleTableName = resolveSimpleTableName(tableSource);
117
+ const schema = resolveTableSchema(tableSource);
118
+ const mappingRecord = mapping;
119
+ const idCol = mappingRecord.id ?? { name: "id" };
120
+ const idColName = idCol.name;
121
+ const softDeleteColName = softDeleteCol &&
122
+ (mappingRecord[softDeleteCol] ||
123
+ Object.values(mappingRecord).some((c) => c.name === softDeleteCol))
124
+ ? (mappingRecord[softDeleteCol]?.name ?? softDeleteCol)
125
+ : null;
126
+ const createBoundQuery = (fn) => ({
127
+ get _result() {
128
+ return undefined;
129
+ },
130
+ async execute() {
131
+ try {
132
+ return await fn();
133
+ }
134
+ catch (err) {
135
+ if (err instanceof ContractValidationError)
136
+ throw err;
137
+ throw parseWaddlerError(err);
138
+ }
139
+ },
140
+ });
141
+ const toDbValues = (data) => {
142
+ const values = {};
143
+ for (const [contractKey, col] of Object.entries(mappingRecord)) {
144
+ if (contractKey in data) {
145
+ values[col.name] = data[contractKey];
146
+ }
147
+ }
148
+ return values;
149
+ };
150
+ const fromDbRow = (row) => mapRowToContract(row, mappingRecord, contract);
151
+ const sqlOps = {
152
+ findById: (id) => createBoundQuery(async () => {
153
+ let query;
154
+ if (softDeleteColName) {
155
+ query = sql `SELECT * FROM ${tableId} WHERE ${sql.identifier(idColName)} = ${id} AND ${sql.identifier(softDeleteColName)} IS NULL`;
156
+ }
157
+ else {
158
+ query = sql `SELECT * FROM ${tableId} WHERE ${sql.identifier(idColName)} = ${id}`;
159
+ }
160
+ const rows = toRows(await query);
161
+ const row = rows[0];
162
+ return row ? fromDbRow(row) : null;
163
+ }),
164
+ findOne: (where) => createBoundQuery(async () => {
165
+ const query = buildSelectQuery(sql, tableId, mappingRecord, where, softDeleteColName, 1);
166
+ const rows = toRows(await query);
167
+ const row = rows[0];
168
+ return row ? fromDbRow(row) : null;
169
+ }),
170
+ findMany: (where) => createBoundQuery(async () => {
171
+ const query = buildSelectQuery(sql, tableId, mappingRecord, where, softDeleteColName);
172
+ const rows = toRows(await query);
173
+ return rows.map((r) => fromDbRow(r));
174
+ }),
175
+ create: (data) => createBoundQuery(async () => {
176
+ const validated = validateContractData(data, contract);
177
+ if (!validated.ok) {
178
+ throw new ContractValidationError(validated.issues);
179
+ }
180
+ const values = toDbValues(validated.value);
181
+ const idMapping = mappingRecord.id;
182
+ if (idMapping && !(idMapping.name in values)) {
183
+ values[idMapping.name] = crypto.randomUUID();
184
+ }
185
+ const cols = Object.keys(values);
186
+ const vals = Object.values(values);
187
+ const colList = cols.map((c) => `"${String(c).replace(/"/g, '""')}"`).join(", ");
188
+ const returning = supportsReturning ? " RETURNING *" : "";
189
+ const insertQuery = sql `INSERT INTO ${tableId} (${sql.raw(colList)}) VALUES ${sql.values([vals])}${sql.raw(returning)}`;
190
+ const rows = toRows(await insertQuery);
191
+ if (supportsReturning && rows[0]) {
192
+ return fromDbRow(rows[0]);
193
+ }
194
+ if (!supportsReturning && dialect === "mysql") {
195
+ const selectQuery = sql `SELECT * FROM ${tableId} ORDER BY ${sql.identifier(idColName)} DESC LIMIT 1`;
196
+ const lastRows = toRows(await selectQuery);
197
+ const row = lastRows[0];
198
+ if (!row)
199
+ throw new Error("Insert did not return row");
200
+ return fromDbRow(row);
201
+ }
202
+ const row = rows[0];
203
+ if (!row)
204
+ throw new Error("Insert did not return row");
205
+ return fromDbRow(row);
206
+ }),
207
+ update: (id, data) => createBoundQuery(async () => {
208
+ const dataRecord = data;
209
+ const validated = validateContractData(dataRecord, contract, {
210
+ keys: Object.keys(dataRecord),
211
+ });
212
+ if (!validated.ok) {
213
+ throw new ContractValidationError(validated.issues);
214
+ }
215
+ const values = toDbValues(validated.value);
216
+ const entries = Object.entries(values);
217
+ if (entries.length === 0) {
218
+ const selectQuery = sql `SELECT * FROM ${tableId} WHERE ${sql.identifier(idColName)} = ${id}`;
219
+ const rows = toRows(await selectQuery);
220
+ const row = rows[0];
221
+ if (!row)
222
+ throw new Error("Update did not return row");
223
+ return fromDbRow(row);
224
+ }
225
+ const setClause = entries
226
+ .map(([col, val]) => sql `${sql.identifier(col)} = ${val}`)
227
+ .reduce((acc, part, i) => (i === 0 ? part : sql `${acc}, ${part}`), sql.raw(""));
228
+ const updateQuery = sql `UPDATE ${tableId} SET ${setClause} WHERE ${sql.identifier(idColName)} = ${id}${supportsReturning ? sql.raw(" RETURNING *") : sql.raw("")}`;
229
+ const rows = toRows(await updateQuery);
230
+ if (supportsReturning && rows[0])
231
+ return fromDbRow(rows[0]);
232
+ const selectQuery = sql `SELECT * FROM ${tableId} WHERE ${sql.identifier(idColName)} = ${id}`;
233
+ const selRows = toRows(await selectQuery);
234
+ const selRow = selRows[0];
235
+ if (!selRow)
236
+ throw new Error("Update did not return row");
237
+ return fromDbRow(selRow);
238
+ }),
239
+ delete: (id) => createBoundQuery(async () => {
240
+ if (softDeleteColName) {
241
+ const now = new Date().toISOString();
242
+ await sql `UPDATE ${tableId} SET ${sql.identifier(softDeleteColName)} = ${now} WHERE ${sql.identifier(idColName)} = ${id}`;
243
+ }
244
+ else {
245
+ await sql `DELETE FROM ${tableId} WHERE ${sql.identifier(idColName)} = ${id}`;
246
+ }
247
+ }),
248
+ hardDelete: (id) => createBoundQuery(async () => {
249
+ await sql `DELETE FROM ${tableId} WHERE ${sql.identifier(idColName)} = ${id}`;
250
+ }),
251
+ };
252
+ const tableContract = {
253
+ tableName: simpleTableName,
254
+ fields: contract,
255
+ mapping,
256
+ };
257
+ const mapped = {
258
+ get infer() {
259
+ return undefined;
260
+ },
261
+ contract,
262
+ _internal: {
263
+ contract,
264
+ sql: sqlOps,
265
+ tableName,
266
+ mapping: mapping,
267
+ client: sql,
268
+ },
269
+ create: (data) => sqlOps.create(data).execute(),
270
+ findById: (id) => sqlOps.findById(id).execute(),
271
+ findOne: (where) => sqlOps.findOne(where).execute(),
272
+ findMany: (where) => sqlOps.findMany(where).execute(),
273
+ update: (id, data) => sqlOps.update(id, data).execute(),
274
+ delete: (id) => sqlOps.delete(id).execute(),
275
+ hardDelete: (id) => sqlOps.hardDelete(id).execute(),
276
+ createSafe: async (data) => {
277
+ const validated = validateContractData(data, contract);
278
+ if (!validated.ok)
279
+ return validated;
280
+ const created = await sqlOps
281
+ .create(validated.value)
282
+ .execute();
283
+ return { ok: true, value: created };
284
+ },
285
+ updateSafe: async (id, data) => {
286
+ const dataRecord = data;
287
+ const validated = validateContractData(dataRecord, contract, {
288
+ keys: Object.keys(dataRecord),
289
+ });
290
+ if (!validated.ok)
291
+ return validated;
292
+ const updated = await sqlOps
293
+ .update(id, validated.value)
294
+ .execute();
295
+ return { ok: true, value: updated };
296
+ },
297
+ createTable: async () => {
298
+ try {
299
+ const ddl = getCreateTableSQL(tableContract, dialect, {
300
+ schema,
301
+ ifNotExists: true,
302
+ });
303
+ await sql `${sql.raw(ddl)}`;
304
+ }
305
+ catch (err) {
306
+ if (err instanceof ContractValidationError)
307
+ throw err;
308
+ throw parseWaddlerError(err);
309
+ }
310
+ },
311
+ exist: async () => {
312
+ try {
313
+ const existSql = getExistTableSQL(simpleTableName, dialect, schema);
314
+ const rows = toRows(await sql `${sql.raw(existSql)}`);
315
+ return parseExistResult(rows);
316
+ }
317
+ catch (err) {
318
+ if (err instanceof ContractValidationError)
319
+ throw err;
320
+ throw parseWaddlerError(err);
321
+ }
322
+ },
323
+ drop: async () => {
324
+ try {
325
+ const dropSql = getDropTableSQL(simpleTableName, dialect, schema);
326
+ await sql `${sql.raw(dropSql)}`;
327
+ }
328
+ catch (err) {
329
+ if (err instanceof ContractValidationError)
330
+ throw err;
331
+ throw parseWaddlerError(err);
332
+ }
333
+ },
334
+ };
335
+ return mapped;
336
+ },
337
+ };
338
+ return adapter;
339
+ }
340
+ //# sourceMappingURL=core.js.map