bunderstack 0.17.0-beta.2 → 0.17.0-beta.4

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 (336) hide show
  1. package/CHANGELOG.md +233 -0
  2. package/README.md +11 -1
  3. package/dist/access.d.ts +116 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +325 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/api/builder.d.ts +145 -0
  8. package/dist/api/builder.d.ts.map +1 -0
  9. package/dist/api/builder.js +28 -0
  10. package/dist/api/builder.js.map +1 -0
  11. package/dist/api/context.d.ts +34 -0
  12. package/dist/api/context.d.ts.map +1 -0
  13. package/dist/api/context.js +32 -0
  14. package/dist/api/context.js.map +1 -0
  15. package/dist/api/crud-router.d.ts +290 -0
  16. package/dist/api/crud-router.d.ts.map +1 -0
  17. package/dist/api/crud-router.js +249 -0
  18. package/dist/api/crud-router.js.map +1 -0
  19. package/dist/api/openapi.d.ts +6 -0
  20. package/dist/api/openapi.d.ts.map +1 -0
  21. package/dist/api/openapi.js +146 -0
  22. package/dist/api/openapi.js.map +1 -0
  23. package/dist/api/realtime-router.d.ts +76 -0
  24. package/dist/api/realtime-router.d.ts.map +1 -0
  25. package/dist/api/realtime-router.js +41 -0
  26. package/dist/api/realtime-router.js.map +1 -0
  27. package/dist/api/registry.d.ts +30 -0
  28. package/dist/api/registry.d.ts.map +1 -0
  29. package/dist/api/registry.js +239 -0
  30. package/dist/api/registry.js.map +1 -0
  31. package/dist/api/router.d.ts +9 -0
  32. package/dist/api/router.d.ts.map +1 -0
  33. package/dist/api/router.js +19 -0
  34. package/dist/api/router.js.map +1 -0
  35. package/dist/api/storage-router.d.ts +279 -0
  36. package/dist/api/storage-router.d.ts.map +1 -0
  37. package/dist/api/storage-router.js +155 -0
  38. package/dist/api/storage-router.js.map +1 -0
  39. package/dist/api/types.d.ts +55 -0
  40. package/dist/api/types.d.ts.map +1 -0
  41. package/dist/api/types.js +2 -0
  42. package/dist/api/types.js.map +1 -0
  43. package/dist/auth.d.ts +31 -0
  44. package/dist/auth.d.ts.map +1 -0
  45. package/dist/auth.js +102 -0
  46. package/dist/auth.js.map +1 -0
  47. package/dist/blueprint-generator.d.ts +18 -0
  48. package/dist/blueprint-generator.d.ts.map +1 -0
  49. package/dist/blueprint-generator.js +125 -0
  50. package/dist/blueprint-generator.js.map +1 -0
  51. package/dist/blueprint.d.ts +46 -0
  52. package/dist/blueprint.d.ts.map +1 -0
  53. package/dist/blueprint.js +162 -0
  54. package/dist/blueprint.js.map +1 -0
  55. package/dist/cli.d.ts +8 -0
  56. package/dist/cli.d.ts.map +1 -0
  57. package/dist/cli.js +68 -0
  58. package/dist/cli.js.map +1 -0
  59. package/dist/config.d.ts +108 -0
  60. package/dist/config.d.ts.map +1 -0
  61. package/dist/config.js +90 -0
  62. package/dist/config.js.map +1 -0
  63. package/dist/cron.d.ts +4 -0
  64. package/dist/cron.d.ts.map +1 -0
  65. package/dist/cron.js +3 -0
  66. package/dist/cron.js.map +1 -0
  67. package/dist/crud-operations.d.ts +43 -0
  68. package/dist/crud-operations.d.ts.map +1 -0
  69. package/dist/crud-operations.js +238 -0
  70. package/dist/crud-operations.js.map +1 -0
  71. package/dist/database/adapter.d.ts +20 -0
  72. package/dist/database/adapter.d.ts.map +1 -0
  73. package/dist/database/adapter.js +2 -0
  74. package/dist/database/adapter.js.map +1 -0
  75. package/dist/database/bun-sql.d.ts +3 -0
  76. package/dist/database/bun-sql.d.ts.map +1 -0
  77. package/dist/database/bun-sql.js +21 -0
  78. package/dist/database/bun-sql.js.map +1 -0
  79. package/dist/database/libsql.d.ts +3 -0
  80. package/dist/database/libsql.d.ts.map +1 -0
  81. package/dist/database/libsql.js +22 -0
  82. package/dist/database/libsql.js.map +1 -0
  83. package/dist/database/pglite.d.ts +3 -0
  84. package/dist/database/pglite.d.ts.map +1 -0
  85. package/dist/database/pglite.js +27 -0
  86. package/dist/database/pglite.js.map +1 -0
  87. package/dist/database/postgres-js.d.ts +3 -0
  88. package/dist/database/postgres-js.d.ts.map +1 -0
  89. package/dist/database/postgres-js.js +21 -0
  90. package/dist/database/postgres-js.js.map +1 -0
  91. package/dist/db.d.ts +18 -0
  92. package/dist/db.d.ts.map +1 -0
  93. package/dist/db.js +26 -0
  94. package/dist/db.js.map +1 -0
  95. package/dist/dialect.d.ts +17 -0
  96. package/dist/dialect.d.ts.map +1 -0
  97. package/dist/dialect.js +22 -0
  98. package/dist/dialect.js.map +1 -0
  99. package/dist/email/smtp.d.ts +14 -0
  100. package/dist/email/smtp.d.ts.map +1 -0
  101. package/dist/email/smtp.js +27 -0
  102. package/dist/email/smtp.js.map +1 -0
  103. package/dist/email.d.ts +39 -0
  104. package/dist/email.d.ts.map +1 -0
  105. package/dist/email.js +97 -0
  106. package/dist/email.js.map +1 -0
  107. package/dist/env.d.ts +47 -0
  108. package/dist/env.d.ts.map +1 -0
  109. package/dist/env.js +99 -0
  110. package/dist/env.js.map +1 -0
  111. package/dist/errors.d.ts +125 -0
  112. package/dist/errors.d.ts.map +1 -0
  113. package/dist/errors.js +92 -0
  114. package/dist/errors.js.map +1 -0
  115. package/dist/handler.d.ts +9 -0
  116. package/dist/handler.d.ts.map +1 -0
  117. package/dist/handler.js +22 -0
  118. package/dist/handler.js.map +1 -0
  119. package/dist/idempotency.d.ts +17 -0
  120. package/dist/idempotency.d.ts.map +1 -0
  121. package/dist/idempotency.js +65 -0
  122. package/dist/idempotency.js.map +1 -0
  123. package/dist/index.d.ts +134 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +480 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/internal-tables-pg.d.ts +481 -0
  128. package/dist/internal-tables-pg.d.ts.map +1 -0
  129. package/{src/internal-tables-pg.ts → dist/internal-tables-pg.js} +10 -34
  130. package/dist/internal-tables-pg.js.map +1 -0
  131. package/dist/internal-tables.d.ts +2509 -0
  132. package/dist/internal-tables.d.ts.map +1 -0
  133. package/dist/internal-tables.js +108 -0
  134. package/dist/internal-tables.js.map +1 -0
  135. package/dist/jobs/cron.d.ts +15 -0
  136. package/dist/jobs/cron.d.ts.map +1 -0
  137. package/dist/jobs/cron.js +74 -0
  138. package/dist/jobs/cron.js.map +1 -0
  139. package/dist/jobs/define.d.ts +133 -0
  140. package/dist/jobs/define.d.ts.map +1 -0
  141. package/dist/jobs/define.js +74 -0
  142. package/dist/jobs/define.js.map +1 -0
  143. package/dist/jobs/index.d.ts +11 -0
  144. package/dist/jobs/index.d.ts.map +1 -0
  145. package/dist/jobs/index.js +8 -0
  146. package/dist/jobs/index.js.map +1 -0
  147. package/dist/jobs/queue.d.ts +6 -0
  148. package/dist/jobs/queue.d.ts.map +1 -0
  149. package/dist/jobs/queue.js +55 -0
  150. package/dist/jobs/queue.js.map +1 -0
  151. package/dist/jobs/runtime.d.ts +13 -0
  152. package/dist/jobs/runtime.d.ts.map +1 -0
  153. package/dist/jobs/runtime.js +46 -0
  154. package/dist/jobs/runtime.js.map +1 -0
  155. package/dist/jobs/slots.d.ts +25 -0
  156. package/dist/jobs/slots.d.ts.map +1 -0
  157. package/dist/jobs/slots.js +41 -0
  158. package/dist/jobs/slots.js.map +1 -0
  159. package/dist/jobs/worker.d.ts +12 -0
  160. package/dist/jobs/worker.d.ts.map +1 -0
  161. package/dist/jobs/worker.js +311 -0
  162. package/dist/jobs/worker.js.map +1 -0
  163. package/dist/lifecycle.d.ts +10 -0
  164. package/dist/lifecycle.d.ts.map +1 -0
  165. package/dist/lifecycle.js +37 -0
  166. package/dist/lifecycle.js.map +1 -0
  167. package/dist/list-query.d.ts +62 -0
  168. package/dist/list-query.d.ts.map +1 -0
  169. package/dist/list-query.js +194 -0
  170. package/dist/list-query.js.map +1 -0
  171. package/dist/manifest.d.ts +59 -0
  172. package/dist/manifest.d.ts.map +1 -0
  173. package/dist/manifest.js +167 -0
  174. package/dist/manifest.js.map +1 -0
  175. package/dist/provision-internals.d.ts +24 -0
  176. package/dist/provision-internals.d.ts.map +1 -0
  177. package/dist/provision-internals.js +7 -0
  178. package/dist/provision-internals.js.map +1 -0
  179. package/dist/provision.d.ts +23 -0
  180. package/dist/provision.d.ts.map +1 -0
  181. package/dist/provision.js +96 -0
  182. package/dist/provision.js.map +1 -0
  183. package/dist/rate-limit.d.ts +7 -0
  184. package/dist/rate-limit.d.ts.map +1 -0
  185. package/dist/rate-limit.js +49 -0
  186. package/dist/rate-limit.js.map +1 -0
  187. package/dist/realtime/facade.d.ts +18 -0
  188. package/dist/realtime/facade.d.ts.map +1 -0
  189. package/dist/realtime/facade.js +36 -0
  190. package/dist/realtime/facade.js.map +1 -0
  191. package/dist/realtime/filter.d.ts +13 -0
  192. package/dist/realtime/filter.d.ts.map +1 -0
  193. package/dist/realtime/filter.js +48 -0
  194. package/dist/realtime/filter.js.map +1 -0
  195. package/dist/realtime/heartbeat.d.ts +14 -0
  196. package/dist/realtime/heartbeat.d.ts.map +1 -0
  197. package/dist/realtime/heartbeat.js +64 -0
  198. package/dist/realtime/heartbeat.js.map +1 -0
  199. package/dist/realtime/publisher.d.ts +21 -0
  200. package/dist/realtime/publisher.d.ts.map +1 -0
  201. package/dist/realtime/publisher.js +17 -0
  202. package/dist/realtime/publisher.js.map +1 -0
  203. package/dist/schema-export-pg.d.ts +2 -0
  204. package/dist/schema-export-pg.d.ts.map +1 -0
  205. package/dist/schema-export-pg.js +4 -0
  206. package/dist/schema-export-pg.js.map +1 -0
  207. package/dist/schema-export.d.ts +2 -0
  208. package/dist/schema-export.d.ts.map +1 -0
  209. package/dist/schema-export.js +2 -0
  210. package/dist/schema-export.js.map +1 -0
  211. package/dist/scope.d.ts +4 -0
  212. package/dist/scope.d.ts.map +1 -0
  213. package/dist/scope.js +13 -0
  214. package/dist/scope.js.map +1 -0
  215. package/dist/standard-schema.d.ts +13 -0
  216. package/dist/standard-schema.d.ts.map +1 -0
  217. package/dist/standard-schema.js +34 -0
  218. package/dist/standard-schema.js.map +1 -0
  219. package/dist/storage/buckets.d.ts +80 -0
  220. package/dist/storage/buckets.d.ts.map +1 -0
  221. package/dist/storage/buckets.js +178 -0
  222. package/dist/storage/buckets.js.map +1 -0
  223. package/dist/storage/delete.d.ts +11 -0
  224. package/dist/storage/delete.d.ts.map +1 -0
  225. package/dist/storage/delete.js +18 -0
  226. package/dist/storage/delete.js.map +1 -0
  227. package/dist/storage/file-meta.d.ts +37 -0
  228. package/dist/storage/file-meta.d.ts.map +1 -0
  229. package/dist/storage/file-meta.js +166 -0
  230. package/dist/storage/file-meta.js.map +1 -0
  231. package/dist/storage/index.d.ts +28 -0
  232. package/dist/storage/index.d.ts.map +1 -0
  233. package/dist/storage/index.js +5 -0
  234. package/dist/storage/index.js.map +1 -0
  235. package/dist/storage/local.d.ts +15 -0
  236. package/dist/storage/local.d.ts.map +1 -0
  237. package/dist/storage/local.js +56 -0
  238. package/dist/storage/local.js.map +1 -0
  239. package/dist/storage/operations.d.ts +54 -0
  240. package/dist/storage/operations.d.ts.map +1 -0
  241. package/dist/storage/operations.js +250 -0
  242. package/dist/storage/operations.js.map +1 -0
  243. package/dist/storage/registry.d.ts +10 -0
  244. package/dist/storage/registry.d.ts.map +1 -0
  245. package/dist/storage/registry.js +23 -0
  246. package/dist/storage/registry.js.map +1 -0
  247. package/dist/storage/s3.d.ts +28 -0
  248. package/dist/storage/s3.d.ts.map +1 -0
  249. package/dist/storage/s3.js +71 -0
  250. package/dist/storage/s3.js.map +1 -0
  251. package/dist/storage/sweep.d.ts +9 -0
  252. package/dist/storage/sweep.d.ts.map +1 -0
  253. package/dist/storage/sweep.js +17 -0
  254. package/dist/storage/sweep.js.map +1 -0
  255. package/dist/storage/thumbnails.d.ts +11 -0
  256. package/dist/storage/thumbnails.d.ts.map +1 -0
  257. package/dist/storage/thumbnails.js +60 -0
  258. package/dist/storage/thumbnails.js.map +1 -0
  259. package/dist/testing.d.ts +27 -0
  260. package/dist/testing.d.ts.map +1 -0
  261. package/dist/testing.js +11 -0
  262. package/dist/testing.js.map +1 -0
  263. package/dist/typeid-pg.d.ts +19 -0
  264. package/dist/typeid-pg.d.ts.map +1 -0
  265. package/{src/typeid-pg.ts → dist/typeid-pg.js} +10 -13
  266. package/dist/typeid-pg.js.map +1 -0
  267. package/dist/typeid.d.ts +45 -0
  268. package/dist/typeid.d.ts.map +1 -0
  269. package/dist/typeid.js +100 -0
  270. package/dist/typeid.js.map +1 -0
  271. package/package.json +77 -28
  272. package/src/access.ts +0 -532
  273. package/src/api/builder.ts +0 -52
  274. package/src/api/context.ts +0 -83
  275. package/src/api/crud-router.ts +0 -386
  276. package/src/api/openapi.ts +0 -184
  277. package/src/api/realtime-router.ts +0 -75
  278. package/src/api/registry.ts +0 -338
  279. package/src/api/router.ts +0 -34
  280. package/src/api/storage-router.ts +0 -224
  281. package/src/api/types.ts +0 -105
  282. package/src/auth.ts +0 -117
  283. package/src/blueprint-generator.ts +0 -203
  284. package/src/blueprint.ts +0 -264
  285. package/src/cli.ts +0 -90
  286. package/src/config.ts +0 -215
  287. package/src/cron.ts +0 -3
  288. package/src/crud-operations.ts +0 -478
  289. package/src/database/adapter.ts +0 -26
  290. package/src/database/bun-sql.ts +0 -23
  291. package/src/database/libsql.ts +0 -28
  292. package/src/database/pglite.ts +0 -33
  293. package/src/database/postgres-js.ts +0 -33
  294. package/src/db.ts +0 -61
  295. package/src/dialect.ts +0 -38
  296. package/src/email/smtp.ts +0 -45
  297. package/src/email.ts +0 -154
  298. package/src/env.ts +0 -180
  299. package/src/errors.ts +0 -123
  300. package/src/handler.ts +0 -30
  301. package/src/idempotency.ts +0 -97
  302. package/src/index.ts +0 -834
  303. package/src/internal-tables.ts +0 -149
  304. package/src/jobs/cron.ts +0 -87
  305. package/src/jobs/define.ts +0 -283
  306. package/src/jobs/index.ts +0 -37
  307. package/src/jobs/queue.ts +0 -67
  308. package/src/jobs/runtime.ts +0 -58
  309. package/src/jobs/slots.ts +0 -52
  310. package/src/jobs/worker.ts +0 -369
  311. package/src/lifecycle.ts +0 -49
  312. package/src/list-query.ts +0 -333
  313. package/src/manifest.ts +0 -297
  314. package/src/provision-internals.ts +0 -29
  315. package/src/provision.ts +0 -128
  316. package/src/rate-limit.ts +0 -71
  317. package/src/realtime/facade.ts +0 -74
  318. package/src/realtime/filter.ts +0 -81
  319. package/src/realtime/heartbeat.ts +0 -80
  320. package/src/realtime/publisher.ts +0 -46
  321. package/src/schema-export-pg.ts +0 -7
  322. package/src/schema-export.ts +0 -5
  323. package/src/scope.ts +0 -17
  324. package/src/standard-schema.ts +0 -59
  325. package/src/storage/buckets.ts +0 -308
  326. package/src/storage/delete.ts +0 -26
  327. package/src/storage/file-meta.ts +0 -222
  328. package/src/storage/index.ts +0 -39
  329. package/src/storage/local.ts +0 -69
  330. package/src/storage/operations.ts +0 -398
  331. package/src/storage/registry.ts +0 -40
  332. package/src/storage/s3.ts +0 -99
  333. package/src/storage/sweep.ts +0 -25
  334. package/src/storage/thumbnails.ts +0 -65
  335. package/src/testing.ts +0 -31
  336. package/src/typeid.ts +0 -116
@@ -0,0 +1,290 @@
1
+ import { type Table } from 'drizzle-orm';
2
+ import '@orpc/openapi/extensions/route';
3
+ import * as v from 'valibot';
4
+ import type { AnyDb } from '../dialect.js';
5
+ import type { IdempotencyConfig } from '../idempotency.js';
6
+ import type { RealtimeFacade } from '../realtime/facade.js';
7
+ import type { CrudApiRouterFor } from './types.js';
8
+ import { type ResolvedAccess, type ResolvedTableAccess, type TableAccessInput } from '../access.js';
9
+ import { type CrudOperations } from '../crud-operations.js';
10
+ import { createApiBuilder } from './builder.js';
11
+ export type CrudApiRouterOptions<TSchema extends Record<string, unknown> = Record<string, unknown>> = {
12
+ access: ResolvedAccess;
13
+ idempotency?: boolean | IdempotencyConfig;
14
+ realtime?: RealtimeFacade<TSchema>;
15
+ };
16
+ type CrudUpdate<TTable extends Table> = Partial<Omit<TTable['$inferInsert'], 'id'>>;
17
+ /** A filter accepts one value (`=`), a list (`IN`), or null (`IS NULL`). */
18
+ export type ListFilterValue<T> = T | readonly T[] | null | 'null';
19
+ export type ListFilters<TTable extends Table, TFilterable extends string> = {
20
+ [K in Extract<keyof TTable['$inferSelect'], TFilterable>]?: ListFilterValue<TTable['$inferSelect'][K]>;
21
+ };
22
+ /**
23
+ * The `list` input as callers see it. Filter columns and sortable columns come
24
+ * from the table's `access` entry, so `filters` autocompletes to real columns
25
+ * and rejects wrong value types at compile time.
26
+ */
27
+ export type ListInputFor<TTable extends Table, TFilterable extends string, TSortable extends string> = {
28
+ limit?: number;
29
+ offset?: number;
30
+ cursor?: string;
31
+ sort?: TSortable;
32
+ order?: 'asc' | 'desc';
33
+ q?: string;
34
+ count?: boolean;
35
+ filters?: ListFilters<TTable, TFilterable>;
36
+ } | undefined;
37
+ export type BuildTableCrudProceduresArgs<TSchema extends Record<string, unknown>, TTable extends Table> = {
38
+ table: TTable;
39
+ operations: CrudOperations;
40
+ builder: ReturnType<typeof createApiBuilder<TSchema>>;
41
+ access: ResolvedTableAccess;
42
+ };
43
+ export declare function buildTableCrudProcedures<TSchema extends Record<string, unknown>, TTable extends Table, TFilterable extends string = string, TSortable extends string = string>(args: BuildTableCrudProceduresArgs<TSchema, TTable>): {
44
+ list: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>> & object, object, v.GenericSchema<ListInputFor<TTable, TFilterable, TSortable>, ListInputFor<TTable, TFilterable, TSortable>>, v.StrictObjectSchema<{
45
+ readonly items: v.ArraySchema<v.GenericSchema<TTable["$inferSelect"], TTable["$inferSelect"]>, undefined>;
46
+ readonly nextCursor: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
47
+ readonly hasMore: v.BooleanSchema<undefined>;
48
+ readonly total: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
49
+ readonly limit: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
50
+ readonly offset: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
51
+ readonly cursor: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
52
+ readonly q: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
53
+ readonly sort: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
54
+ readonly order: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
55
+ }, undefined>, {
56
+ readonly BAD_REQUEST: {
57
+ readonly data: v.StrictObjectSchema<{
58
+ readonly code: v.LiteralSchema<"BAD_REQUEST", undefined>;
59
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
60
+ }, undefined>;
61
+ };
62
+ readonly UNAUTHORIZED: {
63
+ readonly data: v.StrictObjectSchema<{
64
+ readonly code: v.LiteralSchema<"UNAUTHORIZED", undefined>;
65
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
66
+ }, undefined>;
67
+ };
68
+ readonly FORBIDDEN: {
69
+ readonly data: v.StrictObjectSchema<{
70
+ readonly code: v.LiteralSchema<"FORBIDDEN", undefined>;
71
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
72
+ }, undefined>;
73
+ };
74
+ readonly NOT_FOUND: {
75
+ readonly data: v.StrictObjectSchema<{
76
+ readonly code: v.LiteralSchema<"NOT_FOUND", undefined>;
77
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
78
+ }, undefined>;
79
+ };
80
+ readonly CONFLICT: {
81
+ readonly data: v.StrictObjectSchema<{
82
+ readonly code: v.LiteralSchema<"CONFLICT", undefined>;
83
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
84
+ }, undefined>;
85
+ };
86
+ readonly PAYLOAD_TOO_LARGE: {
87
+ readonly data: v.StrictObjectSchema<{
88
+ readonly code: v.LiteralSchema<"PAYLOAD_TOO_LARGE", undefined>;
89
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
90
+ }, undefined>;
91
+ };
92
+ readonly TOO_MANY_REQUESTS: {
93
+ readonly data: v.StrictObjectSchema<{
94
+ readonly code: v.LiteralSchema<"TOO_MANY_REQUESTS", undefined>;
95
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
96
+ }, undefined>;
97
+ };
98
+ }, never>;
99
+ get: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>> & object, object, v.StrictObjectSchema<{
100
+ readonly id: v.StringSchema<undefined>;
101
+ }, undefined>, v.GenericSchema<TTable["$inferSelect"], TTable["$inferSelect"]>, {
102
+ readonly BAD_REQUEST: {
103
+ readonly data: v.StrictObjectSchema<{
104
+ readonly code: v.LiteralSchema<"BAD_REQUEST", undefined>;
105
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
106
+ }, undefined>;
107
+ };
108
+ readonly UNAUTHORIZED: {
109
+ readonly data: v.StrictObjectSchema<{
110
+ readonly code: v.LiteralSchema<"UNAUTHORIZED", undefined>;
111
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
112
+ }, undefined>;
113
+ };
114
+ readonly FORBIDDEN: {
115
+ readonly data: v.StrictObjectSchema<{
116
+ readonly code: v.LiteralSchema<"FORBIDDEN", undefined>;
117
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
118
+ }, undefined>;
119
+ };
120
+ readonly NOT_FOUND: {
121
+ readonly data: v.StrictObjectSchema<{
122
+ readonly code: v.LiteralSchema<"NOT_FOUND", undefined>;
123
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
124
+ }, undefined>;
125
+ };
126
+ readonly CONFLICT: {
127
+ readonly data: v.StrictObjectSchema<{
128
+ readonly code: v.LiteralSchema<"CONFLICT", undefined>;
129
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
130
+ }, undefined>;
131
+ };
132
+ readonly PAYLOAD_TOO_LARGE: {
133
+ readonly data: v.StrictObjectSchema<{
134
+ readonly code: v.LiteralSchema<"PAYLOAD_TOO_LARGE", undefined>;
135
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
136
+ }, undefined>;
137
+ };
138
+ readonly TOO_MANY_REQUESTS: {
139
+ readonly data: v.StrictObjectSchema<{
140
+ readonly code: v.LiteralSchema<"TOO_MANY_REQUESTS", undefined>;
141
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
142
+ }, undefined>;
143
+ };
144
+ }, Extract<TTable["$inferSelect"], import("@orpc/server").AnyORPCError>>;
145
+ create: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>> & object, object, v.GenericSchema<Partial<TTable["$inferInsert"]>, Partial<TTable["$inferInsert"]>>, v.GenericSchema<TTable["$inferSelect"], TTable["$inferSelect"]>, {
146
+ readonly BAD_REQUEST: {
147
+ readonly data: v.StrictObjectSchema<{
148
+ readonly code: v.LiteralSchema<"BAD_REQUEST", undefined>;
149
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
150
+ }, undefined>;
151
+ };
152
+ readonly UNAUTHORIZED: {
153
+ readonly data: v.StrictObjectSchema<{
154
+ readonly code: v.LiteralSchema<"UNAUTHORIZED", undefined>;
155
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
156
+ }, undefined>;
157
+ };
158
+ readonly FORBIDDEN: {
159
+ readonly data: v.StrictObjectSchema<{
160
+ readonly code: v.LiteralSchema<"FORBIDDEN", undefined>;
161
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
162
+ }, undefined>;
163
+ };
164
+ readonly NOT_FOUND: {
165
+ readonly data: v.StrictObjectSchema<{
166
+ readonly code: v.LiteralSchema<"NOT_FOUND", undefined>;
167
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
168
+ }, undefined>;
169
+ };
170
+ readonly CONFLICT: {
171
+ readonly data: v.StrictObjectSchema<{
172
+ readonly code: v.LiteralSchema<"CONFLICT", undefined>;
173
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
174
+ }, undefined>;
175
+ };
176
+ readonly PAYLOAD_TOO_LARGE: {
177
+ readonly data: v.StrictObjectSchema<{
178
+ readonly code: v.LiteralSchema<"PAYLOAD_TOO_LARGE", undefined>;
179
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
180
+ }, undefined>;
181
+ };
182
+ readonly TOO_MANY_REQUESTS: {
183
+ readonly data: v.StrictObjectSchema<{
184
+ readonly code: v.LiteralSchema<"TOO_MANY_REQUESTS", undefined>;
185
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
186
+ }, undefined>;
187
+ };
188
+ }, Extract<TTable["$inferSelect"], import("@orpc/server").AnyORPCError>>;
189
+ update: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>> & object, object, v.StrictObjectSchema<{
190
+ readonly params: v.StrictObjectSchema<{
191
+ readonly id: v.StringSchema<undefined>;
192
+ }, undefined>;
193
+ readonly query: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, {}>;
194
+ readonly headers: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, {}>;
195
+ readonly body: v.GenericSchema<CrudUpdate<TTable>, CrudUpdate<TTable>>;
196
+ }, undefined>, v.GenericSchema<TTable["$inferSelect"], TTable["$inferSelect"]>, {
197
+ readonly BAD_REQUEST: {
198
+ readonly data: v.StrictObjectSchema<{
199
+ readonly code: v.LiteralSchema<"BAD_REQUEST", undefined>;
200
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
201
+ }, undefined>;
202
+ };
203
+ readonly UNAUTHORIZED: {
204
+ readonly data: v.StrictObjectSchema<{
205
+ readonly code: v.LiteralSchema<"UNAUTHORIZED", undefined>;
206
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
207
+ }, undefined>;
208
+ };
209
+ readonly FORBIDDEN: {
210
+ readonly data: v.StrictObjectSchema<{
211
+ readonly code: v.LiteralSchema<"FORBIDDEN", undefined>;
212
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
213
+ }, undefined>;
214
+ };
215
+ readonly NOT_FOUND: {
216
+ readonly data: v.StrictObjectSchema<{
217
+ readonly code: v.LiteralSchema<"NOT_FOUND", undefined>;
218
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
219
+ }, undefined>;
220
+ };
221
+ readonly CONFLICT: {
222
+ readonly data: v.StrictObjectSchema<{
223
+ readonly code: v.LiteralSchema<"CONFLICT", undefined>;
224
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
225
+ }, undefined>;
226
+ };
227
+ readonly PAYLOAD_TOO_LARGE: {
228
+ readonly data: v.StrictObjectSchema<{
229
+ readonly code: v.LiteralSchema<"PAYLOAD_TOO_LARGE", undefined>;
230
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
231
+ }, undefined>;
232
+ };
233
+ readonly TOO_MANY_REQUESTS: {
234
+ readonly data: v.StrictObjectSchema<{
235
+ readonly code: v.LiteralSchema<"TOO_MANY_REQUESTS", undefined>;
236
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
237
+ }, undefined>;
238
+ };
239
+ }, Extract<TTable["$inferSelect"], import("@orpc/server").AnyORPCError>>;
240
+ delete: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>> & object, object, v.StrictObjectSchema<{
241
+ readonly id: v.StringSchema<undefined>;
242
+ }, undefined>, v.UndefinedSchema<undefined>, {
243
+ readonly BAD_REQUEST: {
244
+ readonly data: v.StrictObjectSchema<{
245
+ readonly code: v.LiteralSchema<"BAD_REQUEST", undefined>;
246
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
247
+ }, undefined>;
248
+ };
249
+ readonly UNAUTHORIZED: {
250
+ readonly data: v.StrictObjectSchema<{
251
+ readonly code: v.LiteralSchema<"UNAUTHORIZED", undefined>;
252
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
253
+ }, undefined>;
254
+ };
255
+ readonly FORBIDDEN: {
256
+ readonly data: v.StrictObjectSchema<{
257
+ readonly code: v.LiteralSchema<"FORBIDDEN", undefined>;
258
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
259
+ }, undefined>;
260
+ };
261
+ readonly NOT_FOUND: {
262
+ readonly data: v.StrictObjectSchema<{
263
+ readonly code: v.LiteralSchema<"NOT_FOUND", undefined>;
264
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
265
+ }, undefined>;
266
+ };
267
+ readonly CONFLICT: {
268
+ readonly data: v.StrictObjectSchema<{
269
+ readonly code: v.LiteralSchema<"CONFLICT", undefined>;
270
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
271
+ }, undefined>;
272
+ };
273
+ readonly PAYLOAD_TOO_LARGE: {
274
+ readonly data: v.StrictObjectSchema<{
275
+ readonly code: v.LiteralSchema<"PAYLOAD_TOO_LARGE", undefined>;
276
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
277
+ }, undefined>;
278
+ };
279
+ readonly TOO_MANY_REQUESTS: {
280
+ readonly data: v.StrictObjectSchema<{
281
+ readonly code: v.LiteralSchema<"TOO_MANY_REQUESTS", undefined>;
282
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
283
+ }, undefined>;
284
+ };
285
+ }, never>;
286
+ };
287
+ export type TableCrudProcedures<TTable extends Table, TFilterable extends string = string, TSortable extends string = string> = ReturnType<typeof buildTableCrudProcedures<Record<string, unknown>, TTable, TFilterable, TSortable>>;
288
+ export declare function buildCrudApiRouter<TSchema extends Record<string, unknown>, TAccess extends Record<string, TableAccessInput> | undefined = undefined>(schema: TSchema, db: AnyDb, options: CrudApiRouterOptions<TSchema>): CrudApiRouterFor<TSchema, TAccess>;
289
+ export {};
290
+ //# sourceMappingURL=crud-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud-router.d.ts","sourceRoot":"","sources":["../../src/api/crud-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,249 @@
1
+ import { getTableColumns, getTableName, isTable } from 'drizzle-orm';
2
+ import { createInsertSchema, createSelectSchema, createUpdateSchema, } from 'drizzle-valibot';
3
+ import '@orpc/openapi/extensions/route';
4
+ import * as v from 'valibot';
5
+ import { tableEntryForName, } from '../access.js';
6
+ import { createCrudOperations } from '../crud-operations.js';
7
+ import { MAX_LIST_LIMIT } from '../list-query.js';
8
+ import { createApiBuilder } from './builder.js';
9
+ function strictObject(schema) {
10
+ return v.strictObject(schema.entries);
11
+ }
12
+ export function buildTableCrudProcedures(args) {
13
+ const { table, operations, builder, access } = args;
14
+ const name = getTableName(table);
15
+ // drizzle-valibot infers its schemas through internal generics. Left as-is,
16
+ // declaration emit inlines those generics by name into the published `.d.ts`,
17
+ // where they are unbound — every column silently becomes optional for the
18
+ // consumer. Restating the type keeps the runtime schema and makes the emitted
19
+ // one both correct and readable.
20
+ const selectSchema = strictObject(createSelectSchema(table));
21
+ const generatedInsertSchema = strictObject(createInsertSchema(table));
22
+ const generatedColumns = Object.keys(generatedInsertSchema.entries);
23
+ const columns = getTableColumns(table);
24
+ const serverManagedColumns = [
25
+ ...access.readonlyColumns,
26
+ ...(access.writeScope && generatedColumns.includes('organizationId')
27
+ ? ['organizationId']
28
+ : []),
29
+ ...Object.entries(columns)
30
+ .filter(([, column]) => !column.notNull || column.hasDefault)
31
+ .map(([column]) => column),
32
+ ].filter((column) => generatedColumns.includes(column));
33
+ const insertEntries = {
34
+ ...generatedInsertSchema.entries,
35
+ };
36
+ for (const column of serverManagedColumns) {
37
+ const schema = insertEntries[column];
38
+ if (schema)
39
+ insertEntries[column] = v.optional(schema);
40
+ }
41
+ const insertSchema = v.strictObject(insertEntries);
42
+ const generatedUpdateSchema = createUpdateSchema(table);
43
+ const updateBodySchema = v.omit(generatedUpdateSchema, [
44
+ 'id',
45
+ ]);
46
+ const updateInputSchema = v.strictObject({
47
+ params: v.strictObject({ id: v.string() }),
48
+ query: v.optional(v.record(v.string(), v.unknown()), {}),
49
+ headers: v.optional(v.record(v.string(), v.unknown()), {}),
50
+ // Same reason as `selectSchema`: state the type instead of letting
51
+ // declaration emit inline drizzle-valibot's generics.
52
+ body: strictObject(updateBodySchema),
53
+ });
54
+ // One filter field per allowed column, typed by the column itself: a scalar
55
+ // for `=`, a list for `IN`, and `null` for `IS NULL`. Query strings are
56
+ // coerced to these types by SmartCoercionHandlerPlugin, so REST and RPC share
57
+ // one contract and nothing has to re-read the raw URL.
58
+ const selectEntries = createSelectSchema(table).entries;
59
+ const filterEntries = {};
60
+ for (const column of access.filterableColumns) {
61
+ const base = selectEntries[column];
62
+ if (!base)
63
+ continue;
64
+ filterEntries[column] = v.optional(v.union([
65
+ // `?filters[col]=null` — a query string cannot carry a real null.
66
+ v.pipe(v.literal('null'), v.transform(() => null)),
67
+ base,
68
+ v.pipe(v.array(base), v.maxLength(MAX_LIST_LIMIT)),
69
+ v.null(),
70
+ ]));
71
+ }
72
+ // Built from runtime column lists, so the schema's own inferred type cannot
73
+ // name the columns; the cast restates it with the literals the caller's
74
+ // `access` config carries. Runtime shape and this type are the same object.
75
+ const listQuerySchema = v.optional(v.strictObject({
76
+ limit: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1))),
77
+ offset: v.optional(v.pipe(v.number(), v.integer(), v.minValue(0))),
78
+ cursor: v.optional(v.string()),
79
+ sort: v.optional(v.picklist(access.sortableColumns)),
80
+ order: v.optional(v.picklist(['asc', 'desc'])),
81
+ q: v.optional(v.pipe(v.string(), v.maxLength(100))),
82
+ count: v.optional(v.boolean()),
83
+ // Always present, even with no filterable columns: clients send `{}`.
84
+ filters: v.optional(v.strictObject(filterEntries)),
85
+ }));
86
+ const listOutputSchema = v.strictObject({
87
+ items: v.array(selectSchema),
88
+ nextCursor: v.optional(v.string()),
89
+ hasMore: v.boolean(),
90
+ total: v.optional(v.number()),
91
+ limit: v.optional(v.number()),
92
+ offset: v.optional(v.number()),
93
+ cursor: v.optional(v.string()),
94
+ q: v.optional(v.string()),
95
+ sort: v.optional(v.string()),
96
+ order: v.optional(v.string()),
97
+ });
98
+ // 1. LIST procedure
99
+ const list = builder.public
100
+ .route({
101
+ method: 'GET',
102
+ path: `/api/${name}`,
103
+ summary: `List ${name}`,
104
+ tags: [name],
105
+ })
106
+ .input(listQuerySchema)
107
+ .output(listOutputSchema)
108
+ .handler(async ({ input, context }) => {
109
+ const session = await context.getSession();
110
+ const execCtx = {
111
+ request: context.request,
112
+ user: session.user,
113
+ session: { activeOrganizationId: session.activeOrganizationId },
114
+ };
115
+ const result = await operations.list(name, input ?? {}, execCtx);
116
+ return {
117
+ ...result,
118
+ items: result.items,
119
+ };
120
+ });
121
+ // 2. GET procedure
122
+ const get = builder.public
123
+ .route({
124
+ method: 'GET',
125
+ path: `/api/${name}/{id}`,
126
+ summary: `Get ${name} by ID`,
127
+ tags: [name],
128
+ })
129
+ .input(v.strictObject({ id: v.string() }))
130
+ .output(selectSchema)
131
+ .handler(async ({ input, context }) => {
132
+ const session = await context.getSession();
133
+ const execCtx = {
134
+ request: context.request,
135
+ user: session.user,
136
+ session: { activeOrganizationId: session.activeOrganizationId },
137
+ };
138
+ return (await operations.get(name, input.id, execCtx));
139
+ });
140
+ // 3. CREATE procedure
141
+ const create = builder.public
142
+ .route({
143
+ method: 'POST',
144
+ path: `/api/${name}`,
145
+ summary: `Create ${name}`,
146
+ tags: [name],
147
+ successStatus: 201,
148
+ })
149
+ .input(insertSchema)
150
+ .output(selectSchema)
151
+ .handler(async ({ input, context }) => {
152
+ const session = await context.getSession();
153
+ const execCtx = {
154
+ request: context.request,
155
+ user: session.user,
156
+ session: { activeOrganizationId: session.activeOrganizationId },
157
+ };
158
+ const idempotencyKey = context.request.headers
159
+ .get('Idempotency-Key')
160
+ ?.trim();
161
+ const rawBody = await context.getRawBody();
162
+ const res = await operations.create(name, input, rawBody, idempotencyKey, execCtx);
163
+ if (res.type === 'replay') {
164
+ context.resHeaders.set('Idempotency-Replayed', 'true');
165
+ return res.record;
166
+ }
167
+ return res.record;
168
+ });
169
+ // 4. UPDATE procedure
170
+ const update = builder.public
171
+ .route({
172
+ method: 'PATCH',
173
+ path: `/api/${name}/{id}`,
174
+ summary: `Update ${name}`,
175
+ tags: [name],
176
+ inputStructure: 'detailed',
177
+ })
178
+ .input(updateInputSchema)
179
+ .output(selectSchema)
180
+ .handler(async ({ input, context }) => {
181
+ const session = await context.getSession();
182
+ const execCtx = {
183
+ request: context.request,
184
+ user: session.user,
185
+ session: { activeOrganizationId: session.activeOrganizationId },
186
+ };
187
+ return (await operations.update(name, input.params.id, input.body, execCtx));
188
+ });
189
+ // 5. DELETE procedure
190
+ const deleteProc = builder.public
191
+ .route({
192
+ method: 'DELETE',
193
+ path: `/api/${name}/{id}`,
194
+ summary: `Delete ${name}`,
195
+ tags: [name],
196
+ successStatus: 204,
197
+ })
198
+ .input(v.strictObject({ id: v.string() }))
199
+ .output(v.undefined())
200
+ .handler(async ({ input, context }) => {
201
+ const session = await context.getSession();
202
+ const execCtx = {
203
+ request: context.request,
204
+ user: session.user,
205
+ session: { activeOrganizationId: session.activeOrganizationId },
206
+ };
207
+ await operations.delete(name, input.id, execCtx);
208
+ return undefined;
209
+ });
210
+ return {
211
+ list,
212
+ get,
213
+ create,
214
+ update,
215
+ delete: deleteProc,
216
+ };
217
+ }
218
+ export function buildCrudApiRouter(schema, db, options) {
219
+ const { access, realtime, idempotency } = options;
220
+ const builder = createApiBuilder();
221
+ const operations = createCrudOperations({
222
+ schema,
223
+ db,
224
+ access,
225
+ idempotency,
226
+ realtime,
227
+ });
228
+ const routerObj = {};
229
+ for (const [tableKey, table] of Object.entries(schema)) {
230
+ if (!isTable(table))
231
+ continue;
232
+ const name = getTableName(table);
233
+ const tableAccess = tableEntryForName(access, name);
234
+ if (!tableAccess?.enabled)
235
+ continue;
236
+ const idCol = getTableColumns(table)['id'];
237
+ if (!idCol)
238
+ continue;
239
+ const procedures = buildTableCrudProcedures({
240
+ table: table,
241
+ operations,
242
+ builder,
243
+ access: tableAccess,
244
+ });
245
+ routerObj[tableKey] = procedures;
246
+ }
247
+ return routerObj;
248
+ }
249
+ //# sourceMappingURL=crud-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud-router.js","sourceRoot":"","sources":["../../src/api/crud-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface MergeOpenAPISpecsOptions {
2
+ nativeSpec: Record<string, any>;
3
+ authSpec?: Record<string, any>;
4
+ }
5
+ export declare function mergeOpenAPISpecs(options: MergeOpenAPISpecsOptions): Record<string, any>;
6
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/api/openapi.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC/B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAsKrB"}