alepha 0.15.1 → 0.15.3

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 (523) hide show
  1. package/README.md +68 -80
  2. package/dist/api/audits/index.d.ts +10 -33
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +10 -33
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +10 -3
  7. package/dist/api/files/index.d.ts.map +1 -1
  8. package/dist/api/files/index.js +10 -3
  9. package/dist/api/files/index.js.map +1 -1
  10. package/dist/api/jobs/index.d.ts +162 -155
  11. package/dist/api/jobs/index.d.ts.map +1 -1
  12. package/dist/api/jobs/index.js +10 -3
  13. package/dist/api/jobs/index.js.map +1 -1
  14. package/dist/api/keys/index.d.ts +413 -0
  15. package/dist/api/keys/index.d.ts.map +1 -0
  16. package/dist/api/keys/index.js +476 -0
  17. package/dist/api/keys/index.js.map +1 -0
  18. package/dist/api/notifications/index.d.ts +10 -4
  19. package/dist/api/notifications/index.d.ts.map +1 -1
  20. package/dist/api/notifications/index.js +10 -4
  21. package/dist/api/notifications/index.js.map +1 -1
  22. package/dist/api/parameters/index.d.ts +43 -50
  23. package/dist/api/parameters/index.d.ts.map +1 -1
  24. package/dist/api/parameters/index.js +30 -37
  25. package/dist/api/parameters/index.js.map +1 -1
  26. package/dist/api/users/index.d.ts +1081 -760
  27. package/dist/api/users/index.d.ts.map +1 -1
  28. package/dist/api/users/index.js +2539 -218
  29. package/dist/api/users/index.js.map +1 -1
  30. package/dist/api/verifications/index.d.ts +138 -132
  31. package/dist/api/verifications/index.d.ts.map +1 -1
  32. package/dist/api/verifications/index.js +12 -4
  33. package/dist/api/verifications/index.js.map +1 -1
  34. package/dist/batch/index.d.ts +20 -40
  35. package/dist/batch/index.d.ts.map +1 -1
  36. package/dist/batch/index.js +31 -44
  37. package/dist/batch/index.js.map +1 -1
  38. package/dist/bucket/index.d.ts +440 -8
  39. package/dist/bucket/index.d.ts.map +1 -1
  40. package/dist/bucket/index.js +1861 -12
  41. package/dist/bucket/index.js.map +1 -1
  42. package/dist/cache/core/index.d.ts +179 -7
  43. package/dist/cache/core/index.d.ts.map +1 -1
  44. package/dist/cache/core/index.js +213 -7
  45. package/dist/cache/core/index.js.map +1 -1
  46. package/dist/cache/redis/index.d.ts +1 -0
  47. package/dist/cache/redis/index.d.ts.map +1 -1
  48. package/dist/cache/redis/index.js +4 -0
  49. package/dist/cache/redis/index.js.map +1 -1
  50. package/dist/cli/index.d.ts +638 -5645
  51. package/dist/cli/index.d.ts.map +1 -1
  52. package/dist/cli/index.js +2550 -368
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/command/index.d.ts +203 -45
  55. package/dist/command/index.d.ts.map +1 -1
  56. package/dist/command/index.js +2060 -71
  57. package/dist/command/index.js.map +1 -1
  58. package/dist/core/index.browser.js +70 -40
  59. package/dist/core/index.browser.js.map +1 -1
  60. package/dist/core/index.d.ts +34 -13
  61. package/dist/core/index.d.ts.map +1 -1
  62. package/dist/core/index.js +90 -40
  63. package/dist/core/index.js.map +1 -1
  64. package/dist/core/index.native.js +70 -40
  65. package/dist/core/index.native.js.map +1 -1
  66. package/dist/datetime/index.d.ts +15 -0
  67. package/dist/datetime/index.d.ts.map +1 -1
  68. package/dist/datetime/index.js +15 -0
  69. package/dist/datetime/index.js.map +1 -1
  70. package/dist/email/index.d.ts +323 -20
  71. package/dist/email/index.d.ts.map +1 -1
  72. package/dist/email/index.js +1857 -7
  73. package/dist/email/index.js.map +1 -1
  74. package/dist/fake/index.d.ts +90 -8
  75. package/dist/fake/index.d.ts.map +1 -1
  76. package/dist/fake/index.js +91 -20
  77. package/dist/fake/index.js.map +1 -1
  78. package/dist/lock/core/index.d.ts +11 -4
  79. package/dist/lock/core/index.d.ts.map +1 -1
  80. package/dist/lock/core/index.js +11 -4
  81. package/dist/lock/core/index.js.map +1 -1
  82. package/dist/logger/index.d.ts +17 -66
  83. package/dist/logger/index.d.ts.map +1 -1
  84. package/dist/logger/index.js +14 -63
  85. package/dist/logger/index.js.map +1 -1
  86. package/dist/mcp/index.d.ts +10 -30
  87. package/dist/mcp/index.d.ts.map +1 -1
  88. package/dist/mcp/index.js +12 -35
  89. package/dist/mcp/index.js.map +1 -1
  90. package/dist/orm/index.browser.js +3 -3
  91. package/dist/orm/index.browser.js.map +1 -1
  92. package/dist/orm/index.bun.js +39 -20
  93. package/dist/orm/index.bun.js.map +1 -1
  94. package/dist/orm/index.d.ts +517 -540
  95. package/dist/orm/index.d.ts.map +1 -1
  96. package/dist/orm/index.js +58 -71
  97. package/dist/orm/index.js.map +1 -1
  98. package/dist/queue/core/index.d.ts +18 -10
  99. package/dist/queue/core/index.d.ts.map +1 -1
  100. package/dist/queue/core/index.js +14 -6
  101. package/dist/queue/core/index.js.map +1 -1
  102. package/dist/react/auth/index.browser.js +108 -0
  103. package/dist/react/auth/index.browser.js.map +1 -0
  104. package/dist/react/auth/index.d.ts +100 -0
  105. package/dist/react/auth/index.d.ts.map +1 -0
  106. package/dist/react/auth/index.js +145 -0
  107. package/dist/react/auth/index.js.map +1 -0
  108. package/dist/react/core/index.d.ts +469 -0
  109. package/dist/react/core/index.d.ts.map +1 -0
  110. package/dist/react/core/index.js +464 -0
  111. package/dist/react/core/index.js.map +1 -0
  112. package/dist/react/form/index.d.ts +232 -0
  113. package/dist/react/form/index.d.ts.map +1 -0
  114. package/dist/react/form/index.js +432 -0
  115. package/dist/react/form/index.js.map +1 -0
  116. package/dist/react/head/index.browser.js +423 -0
  117. package/dist/react/head/index.browser.js.map +1 -0
  118. package/dist/react/head/index.d.ts +288 -0
  119. package/dist/react/head/index.d.ts.map +1 -0
  120. package/dist/react/head/index.js +465 -0
  121. package/dist/react/head/index.js.map +1 -0
  122. package/dist/react/i18n/index.d.ts +175 -0
  123. package/dist/react/i18n/index.d.ts.map +1 -0
  124. package/dist/react/i18n/index.js +224 -0
  125. package/dist/react/i18n/index.js.map +1 -0
  126. package/dist/react/router/index.browser.js +1974 -0
  127. package/dist/react/router/index.browser.js.map +1 -0
  128. package/dist/react/router/index.d.ts +1956 -0
  129. package/dist/react/router/index.d.ts.map +1 -0
  130. package/dist/react/router/index.js +4722 -0
  131. package/dist/react/router/index.js.map +1 -0
  132. package/dist/react/websocket/index.d.ts +117 -0
  133. package/dist/react/websocket/index.d.ts.map +1 -0
  134. package/dist/react/websocket/index.js +107 -0
  135. package/dist/react/websocket/index.js.map +1 -0
  136. package/dist/redis/index.bun.js +4 -0
  137. package/dist/redis/index.bun.js.map +1 -1
  138. package/dist/redis/index.d.ts +41 -44
  139. package/dist/redis/index.d.ts.map +1 -1
  140. package/dist/redis/index.js +16 -25
  141. package/dist/redis/index.js.map +1 -1
  142. package/dist/retry/index.d.ts +11 -2
  143. package/dist/retry/index.d.ts.map +1 -1
  144. package/dist/retry/index.js +11 -2
  145. package/dist/retry/index.js.map +1 -1
  146. package/dist/scheduler/index.d.ts +11 -2
  147. package/dist/scheduler/index.d.ts.map +1 -1
  148. package/dist/scheduler/index.js +11 -2
  149. package/dist/scheduler/index.js.map +1 -1
  150. package/dist/security/index.d.ts +140 -49
  151. package/dist/security/index.d.ts.map +1 -1
  152. package/dist/security/index.js +164 -32
  153. package/dist/security/index.js.map +1 -1
  154. package/dist/server/auth/index.d.ts +12 -7
  155. package/dist/server/auth/index.d.ts.map +1 -1
  156. package/dist/server/auth/index.js +12 -7
  157. package/dist/server/auth/index.js.map +1 -1
  158. package/dist/server/cache/index.d.ts +7 -22
  159. package/dist/server/cache/index.d.ts.map +1 -1
  160. package/dist/server/cache/index.js +7 -22
  161. package/dist/server/cache/index.js.map +1 -1
  162. package/dist/server/compress/index.d.ts +10 -2
  163. package/dist/server/compress/index.d.ts.map +1 -1
  164. package/dist/server/compress/index.js +10 -2
  165. package/dist/server/compress/index.js.map +1 -1
  166. package/dist/server/cookies/index.d.ts +40 -16
  167. package/dist/server/cookies/index.d.ts.map +1 -1
  168. package/dist/server/cookies/index.js +7 -5
  169. package/dist/server/cookies/index.js.map +1 -1
  170. package/dist/server/core/index.d.ts +124 -23
  171. package/dist/server/core/index.d.ts.map +1 -1
  172. package/dist/server/core/index.js +231 -14
  173. package/dist/server/core/index.js.map +1 -1
  174. package/dist/server/cors/index.d.ts +13 -23
  175. package/dist/server/cors/index.d.ts.map +1 -1
  176. package/dist/server/cors/index.js +7 -21
  177. package/dist/server/cors/index.js.map +1 -1
  178. package/dist/server/health/index.d.ts +8 -2
  179. package/dist/server/health/index.d.ts.map +1 -1
  180. package/dist/server/health/index.js +8 -2
  181. package/dist/server/health/index.js.map +1 -1
  182. package/dist/server/helmet/index.d.ts +11 -3
  183. package/dist/server/helmet/index.d.ts.map +1 -1
  184. package/dist/server/helmet/index.js +11 -3
  185. package/dist/server/helmet/index.js.map +1 -1
  186. package/dist/server/links/index.d.ts +11 -6
  187. package/dist/server/links/index.d.ts.map +1 -1
  188. package/dist/server/links/index.js +11 -6
  189. package/dist/server/links/index.js.map +1 -1
  190. package/dist/server/metrics/index.d.ts +10 -3
  191. package/dist/server/metrics/index.d.ts.map +1 -1
  192. package/dist/server/metrics/index.js +10 -3
  193. package/dist/server/metrics/index.js.map +1 -1
  194. package/dist/server/multipart/index.d.ts +9 -3
  195. package/dist/server/multipart/index.d.ts.map +1 -1
  196. package/dist/server/multipart/index.js +9 -3
  197. package/dist/server/multipart/index.js.map +1 -1
  198. package/dist/server/proxy/index.d.ts +8 -2
  199. package/dist/server/proxy/index.d.ts.map +1 -1
  200. package/dist/server/proxy/index.js +8 -2
  201. package/dist/server/proxy/index.js.map +1 -1
  202. package/dist/server/rate-limit/index.d.ts +30 -35
  203. package/dist/server/rate-limit/index.d.ts.map +1 -1
  204. package/dist/server/rate-limit/index.js +18 -55
  205. package/dist/server/rate-limit/index.js.map +1 -1
  206. package/dist/server/static/index.d.ts +137 -4
  207. package/dist/server/static/index.d.ts.map +1 -1
  208. package/dist/server/static/index.js +1853 -5
  209. package/dist/server/static/index.js.map +1 -1
  210. package/dist/server/swagger/index.d.ts +309 -6
  211. package/dist/server/swagger/index.d.ts.map +1 -1
  212. package/dist/server/swagger/index.js +1854 -6
  213. package/dist/server/swagger/index.js.map +1 -1
  214. package/dist/sms/index.d.ts +309 -7
  215. package/dist/sms/index.d.ts.map +1 -1
  216. package/dist/sms/index.js +1856 -7
  217. package/dist/sms/index.js.map +1 -1
  218. package/dist/system/index.browser.js +1218 -0
  219. package/dist/system/index.browser.js.map +1 -0
  220. package/dist/{file → system}/index.d.ts +343 -16
  221. package/dist/system/index.d.ts.map +1 -0
  222. package/dist/{file → system}/index.js +419 -22
  223. package/dist/system/index.js.map +1 -0
  224. package/dist/thread/index.d.ts +11 -2
  225. package/dist/thread/index.d.ts.map +1 -1
  226. package/dist/thread/index.js +11 -2
  227. package/dist/thread/index.js.map +1 -1
  228. package/dist/topic/core/index.d.ts +12 -5
  229. package/dist/topic/core/index.d.ts.map +1 -1
  230. package/dist/topic/core/index.js +12 -5
  231. package/dist/topic/core/index.js.map +1 -1
  232. package/dist/vite/index.d.ts +5 -6272
  233. package/dist/vite/index.d.ts.map +1 -1
  234. package/dist/vite/index.js +23 -10
  235. package/dist/vite/index.js.map +1 -1
  236. package/dist/websocket/index.d.ts +12 -8
  237. package/dist/websocket/index.d.ts.map +1 -1
  238. package/dist/websocket/index.js +12 -8
  239. package/dist/websocket/index.js.map +1 -1
  240. package/package.json +82 -11
  241. package/src/api/audits/index.ts +10 -33
  242. package/src/api/files/__tests__/$bucket.spec.ts +1 -1
  243. package/src/api/files/controllers/AdminFileStatsController.spec.ts +1 -1
  244. package/src/api/files/controllers/FileController.spec.ts +1 -1
  245. package/src/api/files/index.ts +10 -3
  246. package/src/api/files/jobs/FileJobs.spec.ts +1 -1
  247. package/src/api/files/services/FileService.spec.ts +1 -1
  248. package/src/api/jobs/index.ts +10 -3
  249. package/src/api/keys/controllers/AdminApiKeyController.ts +75 -0
  250. package/src/api/keys/controllers/ApiKeyController.ts +103 -0
  251. package/src/api/keys/entities/apiKeyEntity.ts +41 -0
  252. package/src/api/keys/index.ts +49 -0
  253. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +7 -0
  254. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +17 -0
  255. package/src/api/keys/schemas/createApiKeyBodySchema.ts +7 -0
  256. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +11 -0
  257. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +15 -0
  258. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +5 -0
  259. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +5 -0
  260. package/src/api/keys/services/ApiKeyService.spec.ts +553 -0
  261. package/src/api/keys/services/ApiKeyService.ts +306 -0
  262. package/src/api/logs/TODO.md +55 -0
  263. package/src/api/notifications/index.ts +10 -4
  264. package/src/api/parameters/index.ts +9 -30
  265. package/src/api/parameters/primitives/$config.ts +12 -4
  266. package/src/api/parameters/services/ConfigStore.ts +9 -3
  267. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +1035 -0
  268. package/src/api/users/__tests__/ApiKeys.spec.ts +401 -0
  269. package/src/api/users/index.ts +14 -3
  270. package/src/api/users/primitives/$realm.ts +33 -5
  271. package/src/api/users/providers/RealmProvider.ts +1 -12
  272. package/src/api/users/services/SessionService.ts +1 -1
  273. package/src/api/verifications/controllers/VerificationController.ts +2 -0
  274. package/src/api/verifications/index.ts +10 -4
  275. package/src/batch/index.ts +9 -36
  276. package/src/batch/primitives/$batch.ts +0 -8
  277. package/src/batch/providers/BatchProvider.ts +29 -2
  278. package/src/bucket/__tests__/shared.ts +1 -1
  279. package/src/bucket/index.ts +13 -6
  280. package/src/bucket/primitives/$bucket.ts +1 -1
  281. package/src/bucket/providers/LocalFileStorageProvider.ts +1 -1
  282. package/src/bucket/providers/MemoryFileStorageProvider.ts +1 -1
  283. package/src/cache/core/__tests__/shared.ts +30 -0
  284. package/src/cache/core/index.ts +11 -6
  285. package/src/cache/core/primitives/$cache.spec.ts +5 -0
  286. package/src/cache/core/providers/CacheProvider.ts +17 -0
  287. package/src/cache/core/providers/MemoryCacheProvider.ts +300 -1
  288. package/src/cache/redis/__tests__/cache-redis.spec.ts +5 -0
  289. package/src/cache/redis/providers/RedisCacheProvider.ts +9 -0
  290. package/src/cli/apps/AlephaCli.ts +1 -14
  291. package/src/cli/apps/AlephaPackageBuilderCli.ts +10 -1
  292. package/src/cli/atoms/buildOptions.ts +99 -9
  293. package/src/cli/commands/build.ts +150 -37
  294. package/src/cli/commands/db.ts +22 -18
  295. package/src/cli/commands/deploy.ts +1 -1
  296. package/src/cli/commands/dev.ts +1 -20
  297. package/src/cli/commands/gen/env.ts +5 -2
  298. package/src/cli/commands/gen/openapi.ts +5 -2
  299. package/src/cli/commands/init.spec.ts +588 -0
  300. package/src/cli/commands/init.ts +115 -58
  301. package/src/cli/commands/lint.ts +7 -1
  302. package/src/cli/commands/typecheck.ts +11 -0
  303. package/src/cli/providers/AppEntryProvider.ts +1 -1
  304. package/src/cli/providers/ViteBuildProvider.ts +8 -50
  305. package/src/cli/providers/ViteDevServerProvider.ts +35 -16
  306. package/src/cli/services/AlephaCliUtils.ts +52 -121
  307. package/src/cli/services/PackageManagerUtils.ts +129 -11
  308. package/src/cli/services/ProjectScaffolder.spec.ts +97 -0
  309. package/src/cli/services/ProjectScaffolder.ts +148 -81
  310. package/src/cli/services/ViteUtils.ts +82 -0
  311. package/src/cli/{assets/claudeMd.ts → templates/agentMd.ts} +37 -24
  312. package/src/cli/templates/apiAppSecurityTs.ts +11 -0
  313. package/src/cli/templates/apiIndexTs.ts +30 -0
  314. package/src/cli/templates/gitignore.ts +39 -0
  315. package/src/cli/{assets → templates}/mainCss.ts +11 -2
  316. package/src/cli/templates/mainServerTs.ts +33 -0
  317. package/src/cli/templates/webAppRouterTs.ts +74 -0
  318. package/src/cli/templates/webHelloComponentTsx.ts +30 -0
  319. package/src/command/helpers/Runner.spec.ts +139 -0
  320. package/src/command/helpers/Runner.ts +7 -22
  321. package/src/command/index.ts +12 -4
  322. package/src/command/providers/CliProvider.spec.ts +1392 -0
  323. package/src/command/providers/CliProvider.ts +320 -47
  324. package/src/core/Alepha.ts +34 -27
  325. package/src/core/__tests__/Alepha-start.spec.ts +4 -4
  326. package/src/core/helpers/jsonSchemaToTypeBox.spec.ts +771 -0
  327. package/src/core/helpers/jsonSchemaToTypeBox.ts +62 -10
  328. package/src/core/index.shared.ts +1 -0
  329. package/src/core/index.ts +20 -0
  330. package/src/core/providers/EventManager.spec.ts +0 -71
  331. package/src/core/providers/EventManager.ts +3 -15
  332. package/src/core/providers/Json.ts +2 -14
  333. package/src/datetime/index.ts +15 -0
  334. package/src/email/index.ts +10 -5
  335. package/src/email/providers/LocalEmailProvider.spec.ts +1 -1
  336. package/src/email/providers/LocalEmailProvider.ts +1 -1
  337. package/src/fake/__tests__/keyName.example.ts +1 -1
  338. package/src/fake/__tests__/keyName.spec.ts +5 -5
  339. package/src/fake/index.ts +9 -6
  340. package/src/fake/providers/FakeProvider.spec.ts +258 -40
  341. package/src/fake/providers/FakeProvider.ts +133 -19
  342. package/src/lock/core/index.ts +11 -4
  343. package/src/logger/index.ts +17 -66
  344. package/src/mcp/index.ts +10 -27
  345. package/src/mcp/transports/SseMcpTransport.ts +0 -11
  346. package/src/orm/__tests__/PostgresProvider.spec.ts +2 -2
  347. package/src/orm/index.browser.ts +2 -2
  348. package/src/orm/index.bun.ts +5 -3
  349. package/src/orm/index.ts +23 -53
  350. package/src/orm/providers/drivers/BunSqliteProvider.ts +5 -1
  351. package/src/orm/providers/drivers/CloudflareD1Provider.ts +57 -30
  352. package/src/orm/providers/drivers/DatabaseProvider.ts +9 -1
  353. package/src/orm/providers/drivers/NodeSqliteProvider.ts +4 -1
  354. package/src/orm/services/Repository.ts +7 -3
  355. package/src/queue/core/index.ts +14 -6
  356. package/src/react/auth/__tests__/$auth.spec.ts +202 -0
  357. package/src/react/auth/hooks/useAuth.ts +32 -0
  358. package/src/react/auth/index.browser.ts +13 -0
  359. package/src/react/auth/index.shared.ts +2 -0
  360. package/src/react/auth/index.ts +48 -0
  361. package/src/react/auth/providers/ReactAuthProvider.ts +16 -0
  362. package/src/react/auth/services/ReactAuth.ts +135 -0
  363. package/src/react/core/__tests__/Router.spec.tsx +169 -0
  364. package/src/react/core/components/ClientOnly.tsx +49 -0
  365. package/src/react/core/components/ErrorBoundary.tsx +73 -0
  366. package/src/react/core/contexts/AlephaContext.ts +7 -0
  367. package/src/react/core/contexts/AlephaProvider.tsx +42 -0
  368. package/src/react/core/hooks/useAction.browser.spec.tsx +569 -0
  369. package/src/react/core/hooks/useAction.ts +480 -0
  370. package/src/react/core/hooks/useAlepha.ts +26 -0
  371. package/src/react/core/hooks/useClient.ts +17 -0
  372. package/src/react/core/hooks/useEvents.ts +51 -0
  373. package/src/react/core/hooks/useInject.ts +12 -0
  374. package/src/react/core/hooks/useStore.ts +52 -0
  375. package/src/react/core/index.ts +90 -0
  376. package/src/react/form/components/FormState.tsx +17 -0
  377. package/src/react/form/errors/FormValidationError.ts +18 -0
  378. package/src/react/form/hooks/useForm.browser.spec.tsx +366 -0
  379. package/src/react/form/hooks/useForm.ts +47 -0
  380. package/src/react/form/hooks/useFormState.ts +130 -0
  381. package/src/react/form/index.ts +44 -0
  382. package/src/react/form/services/FormModel.ts +614 -0
  383. package/src/react/head/helpers/SeoExpander.spec.ts +203 -0
  384. package/src/react/head/helpers/SeoExpander.ts +142 -0
  385. package/src/react/head/hooks/useHead.spec.tsx +288 -0
  386. package/src/react/head/hooks/useHead.ts +62 -0
  387. package/src/react/head/index.browser.ts +26 -0
  388. package/src/react/head/index.ts +44 -0
  389. package/src/react/head/interfaces/Head.ts +105 -0
  390. package/src/react/head/primitives/$head.ts +25 -0
  391. package/src/react/head/providers/BrowserHeadProvider.browser.spec.ts +196 -0
  392. package/src/react/head/providers/BrowserHeadProvider.ts +212 -0
  393. package/src/react/head/providers/HeadProvider.ts +168 -0
  394. package/src/react/head/providers/ServerHeadProvider.ts +31 -0
  395. package/src/react/i18n/__tests__/integration.spec.tsx +239 -0
  396. package/src/react/i18n/components/Localize.spec.tsx +357 -0
  397. package/src/react/i18n/components/Localize.tsx +35 -0
  398. package/src/react/i18n/hooks/useI18n.browser.spec.tsx +438 -0
  399. package/src/react/i18n/hooks/useI18n.ts +18 -0
  400. package/src/react/i18n/index.ts +41 -0
  401. package/src/react/i18n/primitives/$dictionary.ts +69 -0
  402. package/src/react/i18n/providers/I18nProvider.spec.ts +389 -0
  403. package/src/react/i18n/providers/I18nProvider.ts +278 -0
  404. package/src/react/router/__tests__/page-head-browser.browser.spec.ts +95 -0
  405. package/src/react/router/__tests__/page-head.spec.ts +48 -0
  406. package/src/react/router/__tests__/seo-head.spec.ts +125 -0
  407. package/src/react/router/atoms/ssrManifestAtom.ts +58 -0
  408. package/src/react/router/components/ErrorViewer.tsx +872 -0
  409. package/src/react/router/components/Link.tsx +23 -0
  410. package/src/react/router/components/NestedView.tsx +223 -0
  411. package/src/react/router/components/NotFound.tsx +30 -0
  412. package/src/react/router/constants/PAGE_PRELOAD_KEY.ts +6 -0
  413. package/src/react/router/contexts/RouterLayerContext.ts +12 -0
  414. package/src/react/router/errors/Redirection.ts +28 -0
  415. package/src/react/router/hooks/useActive.ts +52 -0
  416. package/src/react/router/hooks/useQueryParams.ts +63 -0
  417. package/src/react/router/hooks/useRouter.ts +20 -0
  418. package/src/react/router/hooks/useRouterState.ts +11 -0
  419. package/src/react/router/index.browser.ts +45 -0
  420. package/src/react/router/index.shared.ts +19 -0
  421. package/src/react/router/index.ts +146 -0
  422. package/src/react/router/primitives/$page.browser.spec.tsx +851 -0
  423. package/src/react/router/primitives/$page.spec.tsx +676 -0
  424. package/src/react/router/primitives/$page.ts +489 -0
  425. package/src/react/router/providers/ReactBrowserProvider.ts +312 -0
  426. package/src/react/router/providers/ReactBrowserRendererProvider.ts +25 -0
  427. package/src/react/router/providers/ReactBrowserRouterProvider.ts +168 -0
  428. package/src/react/router/providers/ReactPageProvider.ts +726 -0
  429. package/src/react/router/providers/ReactPreloadProvider.spec.ts +142 -0
  430. package/src/react/router/providers/ReactPreloadProvider.ts +85 -0
  431. package/src/react/router/providers/ReactServerProvider.spec.tsx +316 -0
  432. package/src/react/router/providers/ReactServerProvider.ts +487 -0
  433. package/src/react/router/providers/ReactServerTemplateProvider.spec.ts +210 -0
  434. package/src/react/router/providers/ReactServerTemplateProvider.ts +542 -0
  435. package/src/react/router/providers/SSRManifestProvider.ts +334 -0
  436. package/src/react/router/services/ReactPageServerService.ts +48 -0
  437. package/src/react/router/services/ReactPageService.ts +27 -0
  438. package/src/react/router/services/ReactRouter.ts +262 -0
  439. package/src/react/websocket/hooks/useRoom.tsx +242 -0
  440. package/src/react/websocket/index.ts +7 -0
  441. package/src/redis/__tests__/redis.spec.ts +13 -0
  442. package/src/redis/index.ts +9 -25
  443. package/src/redis/providers/BunRedisProvider.ts +9 -0
  444. package/src/redis/providers/NodeRedisProvider.ts +8 -0
  445. package/src/redis/providers/RedisProvider.ts +16 -0
  446. package/src/retry/index.ts +11 -2
  447. package/src/router/index.ts +15 -0
  448. package/src/scheduler/index.ts +11 -2
  449. package/src/security/__tests__/BasicAuth.spec.ts +2 -0
  450. package/src/security/__tests__/ServerSecurityProvider.spec.ts +90 -5
  451. package/src/security/index.ts +15 -10
  452. package/src/security/interfaces/IssuerResolver.ts +27 -0
  453. package/src/security/primitives/$issuer.ts +55 -0
  454. package/src/security/providers/SecurityProvider.ts +179 -0
  455. package/src/security/providers/ServerBasicAuthProvider.ts +6 -2
  456. package/src/security/providers/ServerSecurityProvider.ts +63 -41
  457. package/src/server/auth/index.ts +12 -7
  458. package/src/server/cache/index.ts +7 -22
  459. package/src/server/compress/index.ts +10 -2
  460. package/src/server/cookies/index.ts +7 -5
  461. package/src/server/cookies/primitives/$cookie.ts +33 -11
  462. package/src/server/core/index.ts +16 -6
  463. package/src/server/core/interfaces/ServerRequest.ts +83 -1
  464. package/src/server/core/primitives/$action.spec.ts +1 -1
  465. package/src/server/core/primitives/$action.ts +8 -3
  466. package/src/server/core/providers/NodeHttpServerProvider.spec.ts +9 -3
  467. package/src/server/core/providers/NodeHttpServerProvider.ts +9 -3
  468. package/src/server/core/services/ServerRequestParser.spec.ts +520 -0
  469. package/src/server/core/services/ServerRequestParser.ts +306 -13
  470. package/src/server/cors/index.ts +7 -21
  471. package/src/server/cors/primitives/$cors.ts +6 -2
  472. package/src/server/health/index.ts +8 -2
  473. package/src/server/helmet/index.ts +11 -3
  474. package/src/server/links/index.ts +11 -6
  475. package/src/server/metrics/index.ts +10 -3
  476. package/src/server/multipart/index.ts +9 -3
  477. package/src/server/proxy/index.ts +8 -2
  478. package/src/server/rate-limit/index.ts +21 -25
  479. package/src/server/rate-limit/primitives/$rateLimit.ts +6 -2
  480. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +38 -14
  481. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +22 -56
  482. package/src/server/static/index.ts +8 -2
  483. package/src/server/static/providers/ServerStaticProvider.ts +1 -1
  484. package/src/server/swagger/index.ts +9 -4
  485. package/src/server/swagger/providers/ServerSwaggerProvider.ts +1 -1
  486. package/src/sms/index.ts +9 -5
  487. package/src/sms/providers/LocalSmsProvider.spec.ts +1 -1
  488. package/src/sms/providers/LocalSmsProvider.ts +1 -1
  489. package/src/system/index.browser.ts +36 -0
  490. package/src/system/index.ts +62 -0
  491. package/src/system/index.workerd.ts +1 -0
  492. package/src/{file → system}/providers/FileSystemProvider.ts +24 -0
  493. package/src/{file → system}/providers/MemoryFileSystemProvider.ts +116 -3
  494. package/src/system/providers/MemoryShellProvider.ts +164 -0
  495. package/src/{file → system}/providers/NodeFileSystemProvider.spec.ts +2 -2
  496. package/src/{file → system}/providers/NodeFileSystemProvider.ts +47 -2
  497. package/src/system/providers/NodeShellProvider.ts +184 -0
  498. package/src/system/providers/ShellProvider.ts +74 -0
  499. package/src/{file → system}/services/FileDetector.spec.ts +2 -2
  500. package/src/thread/index.ts +11 -2
  501. package/src/topic/core/index.ts +12 -5
  502. package/src/vite/tasks/buildClient.ts +2 -7
  503. package/src/vite/tasks/buildServer.ts +19 -13
  504. package/src/vite/tasks/generateCloudflare.ts +10 -7
  505. package/src/vite/tasks/generateDocker.ts +4 -0
  506. package/src/websocket/index.ts +12 -8
  507. package/dist/file/index.d.ts.map +0 -1
  508. package/dist/file/index.js.map +0 -1
  509. package/src/cli/assets/apiIndexTs.ts +0 -16
  510. package/src/cli/assets/mainServerTs.ts +0 -24
  511. package/src/cli/assets/webAppRouterTs.ts +0 -16
  512. package/src/cli/assets/webHelloComponentTsx.ts +0 -20
  513. package/src/cli/providers/ViteTemplateProvider.ts +0 -27
  514. package/src/file/index.ts +0 -43
  515. /package/src/cli/{assets → templates}/apiHelloControllerTs.ts +0 -0
  516. /package/src/cli/{assets → templates}/biomeJson.ts +0 -0
  517. /package/src/cli/{assets → templates}/dummySpecTs.ts +0 -0
  518. /package/src/cli/{assets → templates}/editorconfig.ts +0 -0
  519. /package/src/cli/{assets → templates}/mainBrowserTs.ts +0 -0
  520. /package/src/cli/{assets → templates}/tsconfigJson.ts +0 -0
  521. /package/src/cli/{assets → templates}/webIndexTs.ts +0 -0
  522. /package/src/{file → system}/errors/FileError.ts +0 -0
  523. /package/src/{file → system}/services/FileDetector.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.browser.js","names":["pageSchema"],"sources":["../../src/orm/errors/DbError.ts","../../src/orm/errors/DbEntityNotFoundError.ts","../../src/orm/helpers/parseQueryString.ts","../../src/orm/helpers/pgAttr.ts","../../src/orm/constants/PG_SYMBOLS.ts","../../src/orm/types/schema.ts","../../src/orm/schemas/insertSchema.ts","../../src/orm/schemas/updateSchema.ts","../../src/orm/primitives/$entity.ts","../../src/orm/providers/DatabaseTypeProvider.ts","../../src/orm/schemas/legacyIdSchema.ts","../../src/orm/index.browser.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\n\nexport class DbError extends AlephaError {\n name = \"DbError\";\n\n constructor(message: string, cause?: unknown) {\n super(message, { cause });\n }\n}\n","import { DbError } from \"./DbError.ts\";\n\nexport class DbEntityNotFoundError extends DbError {\n readonly name = \"DbEntityNotFoundError\";\n readonly status = 404;\n\n constructor(entityName: string) {\n super(`Entity from '${entityName}' was not found`);\n }\n}\n","import { AlephaError, type TObject } from \"alepha\";\nimport type { PgQueryWhere } from \"../interfaces/PgQueryWhere.ts\";\n\n/**\n * Parse a string query into a PgQueryWhere object.\n *\n * Supported syntax:\n * - Simple equality: \"name=John\"\n * - Wildcard patterns: \"name=John*\" (startsWith), \"name=*John\" (endsWith), \"name=*John*\" (contains)\n * - Operators: \"age>18\", \"age>=18\", \"age<65\", \"age<=65\", \"status!=active\"\n * - NULL checks: \"deletedAt=null\", \"email!=null\"\n * - IN arrays: \"status=[pending,active]\"\n * - AND conditions: \"name=John&age>18\"\n * - OR conditions: \"name=John|email=john@example.com\"\n * - Nested AND/OR: \"(name=John|name=Jane)&age>18\"\n * - JSONB nested: \"profile.city=Paris\"\n *\n * @example\n * ```ts\n * // Simple equality\n * parseQueryString(\"name=John\")\n * // => { name: { eq: \"John\" } }\n *\n * // Wildcard patterns\n * parseQueryString(\"name=John*\") // startsWith\n * // => { name: { startsWith: \"John\" } }\n * parseQueryString(\"name=*Smith\") // endsWith\n * // => { name: { endsWith: \"Smith\" } }\n * parseQueryString(\"name=*oh*\") // contains\n * // => { name: { contains: \"oh\" } }\n *\n * // Multiple conditions\n * parseQueryString(\"name=John&age>18\")\n * // => { and: [{ name: { eq: \"John\" } }, { age: { gt: 18 } }] }\n *\n * // OR conditions\n * parseQueryString(\"status=active|status=pending\")\n * // => { or: [{ status: { eq: \"active\" } }, { status: { eq: \"pending\" } }] }\n *\n * // Complex nested\n * parseQueryString(\"(name=John|name=Jane)&age>18&status!=archived\")\n * // => { and: [\n * // { or: [{ name: { eq: \"John\" } }, { name: { eq: \"Jane\" } }] },\n * // { age: { gt: 18 } },\n * // { status: { ne: \"archived\" } }\n * // ] }\n *\n * // JSONB nested query\n * parseQueryString(\"profile.city=Paris&profile.age>25\")\n * // => { profile: { city: { eq: \"Paris\" }, age: { gt: 25 } } }\n * ```\n */\nexport function parseQueryString<T extends TObject>(\n query: string,\n): PgQueryWhere<T> {\n if (!query || query.trim() === \"\") {\n return {};\n }\n\n const parser = new QueryStringParser(query);\n return parser.parse() as PgQueryWhere<T>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nclass QueryStringParser {\n private pos = 0;\n private readonly query: string;\n\n constructor(query: string) {\n this.query = query.trim();\n }\n\n parse(): PgQueryWhere<any> {\n return this.parseExpression();\n }\n\n private parseExpression(): PgQueryWhere<any> {\n return this.parseOr();\n }\n\n private parseOr(): any {\n const left = this.parseAnd();\n\n // Check for OR operator (|)\n if (this.peek() === \"|\") {\n const conditions = [left];\n\n while (this.peek() === \"|\") {\n this.consume(\"|\");\n conditions.push(this.parseAnd());\n }\n\n return { or: conditions };\n }\n\n return left;\n }\n\n private parseAnd(): any {\n const left = this.parsePrimary();\n\n // Check for AND operator (&)\n if (this.peek() === \"&\") {\n const conditions = [left];\n\n while (this.peek() === \"&\") {\n this.consume(\"&\");\n conditions.push(this.parsePrimary());\n }\n\n return { and: conditions };\n }\n\n return left;\n }\n\n private parsePrimary(): any {\n this.skipWhitespace();\n\n // Handle parentheses\n if (this.peek() === \"(\") {\n this.consume(\"(\");\n const expr = this.parseExpression();\n this.consume(\")\");\n return expr;\n }\n\n // Parse field condition\n return this.parseCondition();\n }\n\n private parseCondition(): any {\n const field = this.parseFieldPath();\n this.skipWhitespace();\n\n // Get operator\n const operator = this.parseOperator();\n this.skipWhitespace();\n\n // Get value\n const value = this.parseValue();\n\n if (value === \"\") {\n throw new AlephaError(`Expected value for field '${field.join(\".\")}'`);\n }\n\n // Build the condition object\n return this.buildCondition(field, operator, value);\n }\n\n private parseFieldPath(): string[] {\n const path: string[] = [];\n let current = \"\";\n\n while (this.pos < this.query.length) {\n const ch = this.query[this.pos];\n\n if (ch === \".\" && current) {\n path.push(current);\n current = \"\";\n this.pos++;\n continue;\n }\n\n if (ch === \"=\" || ch === \"!\" || ch === \">\" || ch === \"<\" || ch === \" \") {\n break;\n }\n\n current += ch;\n this.pos++;\n }\n\n if (current) {\n path.push(current);\n }\n\n return path;\n }\n\n private parseOperator(): string {\n this.skipWhitespace();\n\n const remaining = this.query.slice(this.pos);\n\n // Two-character operators\n if (remaining.startsWith(\">=\")) {\n this.pos += 2;\n return \">=\";\n }\n if (remaining.startsWith(\"<=\")) {\n this.pos += 2;\n return \"<=\";\n }\n if (remaining.startsWith(\"!=\")) {\n this.pos += 2;\n return \"!=\";\n }\n\n // Single-character operators\n const ch = this.query[this.pos];\n if (ch === \"=\" || ch === \">\" || ch === \"<\") {\n this.pos++;\n return ch;\n }\n\n throw new Error(`Expected operator at position ${this.pos}`);\n }\n\n private parseValue(): any {\n this.skipWhitespace();\n\n // Handle null\n if (this.query.slice(this.pos, this.pos + 4).toLowerCase() === \"null\") {\n this.pos += 4;\n return null;\n }\n\n // Handle arrays [value1,value2,...]\n if (this.query[this.pos] === \"[\") {\n return this.parseArray();\n }\n\n // Handle quoted strings\n if (this.query[this.pos] === '\"' || this.query[this.pos] === \"'\") {\n return this.parseQuotedString();\n }\n\n // Parse unquoted value (until &, |, or ))\n let value = \"\";\n while (this.pos < this.query.length) {\n const ch = this.query[this.pos];\n if (ch === \"&\" || ch === \"|\" || ch === \")\") {\n break;\n }\n value += ch;\n this.pos++;\n }\n\n return this.coerceValue(value.trim());\n }\n\n private parseArray(): any[] {\n this.consume(\"[\");\n const values: any[] = [];\n\n while (this.pos < this.query.length && this.query[this.pos] !== \"]\") {\n this.skipWhitespace();\n\n // Handle quoted values\n if (this.query[this.pos] === '\"' || this.query[this.pos] === \"'\") {\n values.push(this.parseQuotedString());\n } else {\n // Parse until comma or ]\n let value = \"\";\n while (\n this.pos < this.query.length &&\n this.query[this.pos] !== \",\" &&\n this.query[this.pos] !== \"]\"\n ) {\n value += this.query[this.pos];\n this.pos++;\n }\n values.push(this.coerceValue(value.trim()));\n }\n\n this.skipWhitespace();\n if (this.query[this.pos] === \",\") {\n this.pos++;\n }\n }\n\n this.consume(\"]\");\n return values;\n }\n\n private parseQuotedString(): string {\n const quote = this.query[this.pos];\n this.pos++; // Skip opening quote\n\n let value = \"\";\n let escaped = false;\n\n while (this.pos < this.query.length) {\n const ch = this.query[this.pos];\n\n if (escaped) {\n value += ch;\n escaped = false;\n this.pos++;\n continue;\n }\n\n if (ch === \"\\\\\") {\n escaped = true;\n this.pos++;\n continue;\n }\n\n if (ch === quote) {\n this.pos++; // Skip closing quote\n break;\n }\n\n value += ch;\n this.pos++;\n }\n\n return value;\n }\n\n private coerceValue(value: string): any {\n // Try to parse as number\n if (/^-?\\d+$/.test(value)) {\n return parseInt(value, 10);\n }\n\n if (/^-?\\d+\\.\\d+$/.test(value)) {\n return parseFloat(value);\n }\n\n // Try to parse as boolean\n if (value.toLowerCase() === \"true\") {\n return true;\n }\n if (value.toLowerCase() === \"false\") {\n return false;\n }\n\n return value;\n }\n\n private buildCondition(path: string[], operator: string, value: any): any {\n // Map operator to filter operator\n let filterOp: any;\n\n if (operator === \"=\") {\n if (value === null) {\n filterOp = { isNull: true };\n } else if (Array.isArray(value)) {\n // Arrays should be treated as inArray regardless of content\n filterOp = { inArray: value };\n } else if (typeof value === \"string\" && value.includes(\"*\")) {\n // Handle wildcard patterns\n const startsWithAsterisk = value.startsWith(\"*\");\n const endsWithAsterisk = value.endsWith(\"*\");\n const cleanValue = value.replace(/^\\*|\\*$/g, \"\"); // Remove leading/trailing asterisks\n\n if (startsWithAsterisk && endsWithAsterisk) {\n // *text* -> contains\n filterOp = { contains: cleanValue };\n } else if (startsWithAsterisk) {\n // *text -> endsWith\n filterOp = { endsWith: cleanValue };\n } else if (endsWithAsterisk) {\n // text* -> startsWith\n filterOp = { startsWith: cleanValue };\n } else {\n // Has asterisk in the middle, treat as literal\n filterOp = { eq: value };\n }\n } else {\n filterOp = { eq: value };\n }\n } else if (operator === \"!=\") {\n if (value === null) {\n filterOp = { isNotNull: true };\n } else {\n filterOp = { ne: value };\n }\n } else if (operator === \">\") {\n filterOp = { gt: value };\n } else if (operator === \">=\") {\n filterOp = { gte: value };\n } else if (operator === \"<\") {\n filterOp = { lt: value };\n } else if (operator === \"<=\") {\n filterOp = { lte: value };\n } else {\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n // Build nested object for path\n if (path.length === 1) {\n return { [path[0]]: filterOp };\n }\n\n // Handle nested paths (JSONB)\n let result: any = filterOp;\n for (let i = path.length - 1; i >= 0; i--) {\n result = { [path[i]]: result };\n }\n\n return result;\n }\n\n private peek(): string {\n this.skipWhitespace();\n return this.query[this.pos] || \"\";\n }\n\n private consume(expected: string): void {\n this.skipWhitespace();\n if (this.query[this.pos] !== expected) {\n throw new Error(\n `Expected '${expected}' at position ${this.pos}, got '${this.query[this.pos]}'`,\n );\n }\n this.pos++;\n }\n\n private skipWhitespace(): void {\n while (this.pos < this.query.length && /\\s/.test(this.query[this.pos])) {\n this.pos++;\n }\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Helper function to build query strings programmatically\n *\n * @example\n * ```ts\n * buildQueryString({\n * and: [\n * { name: \"eq:John\" },\n * { age: \"gt:18\" }\n * ]\n * })\n * // => \"name=John&age>18\"\n * ```\n */\nexport function buildQueryString(where: any): string {\n if (!where || typeof where !== \"object\") {\n return \"\";\n }\n\n // Handle logical operators\n if (\"and\" in where && Array.isArray(where.and)) {\n return where.and.map((w: any) => buildQueryString(w)).join(\"&\");\n }\n\n if (\"or\" in where && Array.isArray(where.or)) {\n const parts = where.or.map((w: any) => buildQueryString(w));\n return parts.length > 1 ? `(${parts.join(\"|\")})` : parts[0];\n }\n\n if (\"not\" in where) {\n // Not operator is harder to represent in string form\n // For now, we'll skip it or you could add a syntax like \"!field=value\"\n return \"\";\n }\n\n // Handle field conditions\n const parts: string[] = [];\n\n for (const [field, condition] of Object.entries(where)) {\n if (typeof condition !== \"object\" || condition === null) {\n parts.push(`${field}=${condition}`);\n continue;\n }\n\n if (\"eq\" in condition) {\n parts.push(`${field}=${condition.eq}`);\n } else if (\"ne\" in condition) {\n parts.push(`${field}!=${condition.ne}`);\n } else if (\"gt\" in condition) {\n parts.push(`${field}>${condition.gt}`);\n } else if (\"gte\" in condition) {\n parts.push(`${field}>=${condition.gte}`);\n } else if (\"lt\" in condition) {\n parts.push(`${field}<${condition.lt}`);\n } else if (\"lte\" in condition) {\n parts.push(`${field}<=${condition.lte}`);\n } else if (\"contains\" in condition) {\n parts.push(`${field}=*${condition.contains}*`);\n } else if (\"startsWith\" in condition) {\n parts.push(`${field}=${condition.startsWith}*`);\n } else if (\"endsWith\" in condition) {\n parts.push(`${field}=*${condition.endsWith}`);\n } else if (\"isNull\" in condition && condition.isNull) {\n parts.push(`${field}=null`);\n } else if (\"isNotNull\" in condition && condition.isNotNull) {\n parts.push(`${field}!=null`);\n } else if (\"inArray\" in condition && Array.isArray(condition.inArray)) {\n const values = condition.inArray.map((v: any) =>\n typeof v === \"string\" ? `\"${v}\"` : v,\n );\n parts.push(`${field}=[${values.join(\",\")}]`);\n } else {\n // Nested object (JSONB)\n const nested = buildQueryString(condition);\n if (nested) {\n parts.push(`${field}.${nested}`);\n }\n }\n }\n\n return parts.join(\"&\");\n}\n","import type { TObject, TSchema } from \"alepha\";\nimport type { PgSymbolKeys, PgSymbols } from \"../constants/PG_SYMBOLS.ts\";\n\n/**\n * Decorates a typebox schema with a Postgres attribute.\n *\n * > It's just a fancy way to add Symbols to a field.\n *\n * @example\n * ```ts\n * import { t } from \"alepha\";\n * import { PG_UPDATED_AT } from \"../constants/PG_SYMBOLS\";\n *\n * export const updatedAtSchema = pgAttr(\n * t.datetime(), PG_UPDATED_AT,\n * );\n * ```\n */\nexport const pgAttr = <T extends TSchema, Attr extends PgSymbolKeys>(\n type: T,\n attr: Attr,\n value?: PgSymbols[Attr],\n): PgAttr<T, Attr> => {\n Object.assign(type, { [attr]: value ?? {} });\n return type as PgAttr<T, Attr>;\n};\n\n/**\n * Retrieves the fields of a schema that have a specific attribute.\n */\nexport const getAttrFields = (\n schema: TObject,\n name: PgSymbolKeys,\n): PgAttrField[] => {\n const fields: Array<PgAttrField> = [];\n\n for (const key of Object.keys(schema.properties)) {\n const value = schema.properties[key];\n if (name in value) {\n fields.push({\n type: value as TSchema,\n key: key,\n data: (value as any)[name],\n });\n }\n }\n\n return fields;\n};\n\n/**\n * Type representation.\n */\nexport type PgAttr<T extends TSchema, TAttr extends PgSymbolKeys> = T & {\n [K in TAttr]: PgSymbols[K];\n};\n\nexport interface PgAttrField {\n key: string;\n type: TSchema;\n data: any;\n nested?: any[];\n one?: boolean;\n}\n","import type {\n PgSequenceOptions,\n UpdateDeleteAction,\n} from \"drizzle-orm/pg-core\";\nimport type { EntityPrimitive } from \"../primitives/$entity.ts\";\n\nexport const PG_DEFAULT = Symbol.for(\"Alepha.Postgres.Default\");\nexport const PG_PRIMARY_KEY = Symbol.for(\"Alepha.Postgres.PrimaryKey\");\nexport const PG_CREATED_AT = Symbol.for(\"Alepha.Postgres.CreatedAt\");\nexport const PG_UPDATED_AT = Symbol.for(\"Alepha.Postgres.UpdatedAt\");\nexport const PG_DELETED_AT = Symbol.for(\"Alepha.Postgres.DeletedAt\");\nexport const PG_VERSION = Symbol.for(\"Alepha.Postgres.Version\");\nexport const PG_IDENTITY = Symbol.for(\"Alepha.Postgres.Identity\");\nexport const PG_ENUM = Symbol.for(\"Alepha.Postgres.Enum\");\nexport const PG_REF = Symbol.for(\"Alepha.Postgres.Ref\");\n\n/**\n * @deprecated Use `PG_IDENTITY` instead.\n */\nexport const PG_SERIAL = Symbol.for(\"Alepha.Postgres.Serial\");\n\nexport type PgDefault = typeof PG_DEFAULT;\nexport type PgRef = typeof PG_REF;\nexport type PgPrimaryKey = typeof PG_PRIMARY_KEY;\n\nexport type PgSymbols = {\n [PG_DEFAULT]: {};\n [PG_PRIMARY_KEY]: {};\n [PG_CREATED_AT]: {};\n [PG_UPDATED_AT]: {};\n [PG_DELETED_AT]: {};\n [PG_VERSION]: {};\n [PG_IDENTITY]: PgIdentityOptions;\n [PG_REF]: PgRefOptions;\n [PG_ENUM]: PgEnumOptions;\n\n /**\n * @deprecated Use `PG_IDENTITY` instead.\n */\n [PG_SERIAL]: {};\n};\n\nexport type PgSymbolKeys = keyof PgSymbols;\n\nexport type PgIdentityOptions = {\n mode: \"always\" | \"byDefault\";\n} & PgSequenceOptions & {\n name?: string;\n };\n\nexport interface PgEnumOptions {\n name?: string;\n description?: string;\n}\n\nexport interface PgRefOptions {\n ref: () => {\n name: string;\n entity: EntityPrimitive;\n };\n actions?: {\n onUpdate?: UpdateDeleteAction;\n onDelete?: UpdateDeleteAction;\n };\n}\n","import type { Static, TSchema } from \"alepha\";\nimport { customType } from \"drizzle-orm/pg-core\";\n\n/**\n * Postgres schema type.\n */\nexport const schema = <TDocument extends TSchema>(\n name: string,\n document: TDocument,\n) =>\n customType<{\n data: Static<TDocument>;\n driverData: string;\n config: { document: TDocument };\n configRequired: true;\n }>({\n dataType: () => \"jsonb\",\n toDriver: (value) => JSON.stringify(value),\n fromDriver: (value: TDocument | string) =>\n value && typeof value === \"string\" ? JSON.parse(value) : value,\n })(name, { document }).$type<Static<TDocument>>();\n","import type { TObject, TOptional } from \"alepha\";\nimport { t } from \"alepha\";\nimport { PG_DEFAULT } from \"../constants/PG_SYMBOLS.ts\";\nimport { schema } from \"../types/schema.ts\";\n\n/**\n * Transforms a TObject schema for insert operations.\n * All default properties at the root level are made optional.\n *\n * @example\n * Before: { name: string; age: number(default=0); }\n * After: { name: string; age?: number; }\n */\nexport type TObjectInsert<T extends TObject> = TObject<{\n [K in keyof T[\"properties\"]]: T[\"properties\"][K] extends\n | { [PG_DEFAULT]: any }\n | { \"~optional\": true }\n ? TOptional<T[\"properties\"][K]>\n : T[\"properties\"][K];\n}>;\n\nexport const insertSchema = <T extends TObject>(obj: T): TObjectInsert<T> => {\n const newProperties: Record<string, any> = {};\n\n for (const key in obj.properties) {\n const prop = obj.properties[key];\n\n if (PG_DEFAULT in prop) {\n newProperties[key] = t.optional(prop);\n } else {\n newProperties[key] = prop;\n }\n }\n\n return t.object(\n newProperties,\n \"options\" in schema && typeof schema.options === \"object\"\n ? { ...schema.options }\n : {},\n ) as TObjectInsert<T>;\n};\n","import {\n type TNull,\n type TObject,\n type TOptional,\n type TUnion,\n t,\n} from \"alepha\";\n\n/**\n * Transforms a TObject schema for update operations.\n * All optional properties at the root level are made nullable (i.e., `T | null`).\n * This allows an API endpoint to explicitly accept `null` to clear an optional field in the database.\n *\n * @example\n * Before: { name?: string; age: number; }\n * After: { name?: string | null; age: number; }\n */\nexport type TObjectUpdate<T extends TObject> = TObject<{\n [K in keyof T[\"properties\"]]: T[\"properties\"][K] extends TOptional<infer U>\n ? TOptional<TUnion<[U, TNull]>>\n : T[\"properties\"][K];\n}>;\n\nexport const updateSchema = <T extends TObject>(\n schema: T,\n): TObjectUpdate<T> => {\n const newProperties: Record<string, any> = {};\n\n for (const key in schema.properties) {\n const prop = schema.properties[key];\n if (t.schema.isOptional(prop)) {\n newProperties[key] = t.optional(t.union([prop, t.raw.Null()]));\n } else {\n newProperties[key] = prop;\n }\n }\n\n return t.object(\n newProperties,\n \"options\" in schema && typeof schema.options === \"object\"\n ? { ...schema.options }\n : {},\n ) as TObjectUpdate<T>;\n};\n","import { KIND, type Static, type TObject } from \"alepha\";\nimport type { BuildExtraConfigColumns, SQL } from \"drizzle-orm\";\nimport type {\n PgColumn,\n PgColumnBuilderBase,\n PgTableExtraConfigValue,\n} from \"drizzle-orm/pg-core\";\nimport { insertSchema, type TObjectInsert } from \"../schemas/insertSchema.ts\";\nimport { type TObjectUpdate, updateSchema } from \"../schemas/updateSchema.ts\";\n\n/**\n * Creates a database entity primitive that defines table structure using TypeBox schemas.\n *\n * @example\n * ```ts\n * import { t } from \"alepha\";\n * import { $entity } from \"alepha/orm\";\n *\n * const userEntity = $entity({\n * name: \"users\",\n * schema: t.object({\n * id: pg.primaryKey(),\n * name: t.text(),\n * email: t.email(),\n * }),\n * });\n * ```\n */\nexport const $entity = <TSchema extends TObject>(\n options: EntityPrimitiveOptions<TSchema>,\n): EntityPrimitive<TSchema> => {\n return new EntityPrimitive<TSchema>(options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface EntityPrimitiveOptions<\n T extends TObject,\n Keys = keyof Static<T>,\n> {\n /**\n * The database table name that will be created for this entity.\n * If not provided, name will be inferred from the $repository variable name.\n */\n name: string;\n\n /**\n * TypeBox schema defining the table structure and column types.\n */\n schema: T;\n\n /**\n * Database indexes to create for query optimization.\n */\n indexes?: (\n | Keys\n | {\n /**\n * Single column to index.\n */\n column: Keys;\n /**\n * Whether this should be a unique index (enforces uniqueness constraint).\n */\n unique?: boolean;\n /**\n * Custom name for the index. If not provided, generates name automatically.\n */\n name?: string;\n }\n | {\n /**\n * Multiple columns for composite index (order matters for query optimization).\n */\n columns: Keys[];\n /**\n * Whether this should be a unique index (enforces uniqueness constraint).\n */\n unique?: boolean;\n /**\n * Custom name for the index. If not provided, generates name automatically.\n */\n name?: string;\n }\n )[];\n\n /**\n * Foreign key constraints to maintain referential integrity.\n */\n foreignKeys?: Array<{\n /**\n * Optional name for the foreign key constraint.\n */\n name?: string;\n /**\n * Local columns that reference the foreign table.\n */\n columns: Array<keyof Static<T>>;\n /**\n * Referenced columns in the foreign table.\n * Must be EntityColumn references from other entities.\n */\n foreignColumns: Array<() => EntityColumn<any>>;\n }>;\n\n /**\n * Additional table constraints for data validation.\n *\n * Constraints enforce business rules at the database level, providing\n * an additional layer of data integrity beyond application validation.\n *\n * **Constraint Types**:\n * - **Unique constraints**: Prevent duplicate values across columns\n * - **Check constraints**: Enforce custom validation rules with SQL expressions\n *\n * @example\n * ```ts\n * constraints: [\n * {\n * name: \"unique_user_email\",\n * columns: [\"email\"],\n * unique: true\n * },\n * {\n * name: \"valid_age_range\",\n * columns: [\"age\"],\n * check: sql`age >= 0 AND age <= 150`\n * },\n * {\n * name: \"unique_user_username_per_tenant\",\n * columns: [\"tenantId\", \"username\"],\n * unique: true\n * }\n * ]\n * ```\n */\n constraints?: Array<{\n /**\n * Columns involved in this constraint.\n */\n columns: Array<keyof Static<T>>;\n /**\n * Optional name for the constraint.\n */\n name?: string;\n /**\n * Whether this is a unique constraint.\n */\n unique?: boolean | {} /* options */;\n /**\n * SQL expression for check constraint validation.\n */\n check?: SQL;\n }>;\n\n /**\n * Advanced Drizzle ORM configuration for complex table setups.\n */\n config?: (\n self: BuildExtraConfigColumns<string, FromSchema<T>, \"pg\">,\n ) => PgTableExtraConfigValue[];\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class EntityPrimitive<T extends TObject = TObject> {\n public readonly options: EntityPrimitiveOptions<T>;\n\n constructor(options: EntityPrimitiveOptions<T>) {\n this.options = options;\n }\n\n alias(alias: string): this {\n const aliased = new EntityPrimitive<T>(this.options);\n return new Proxy(aliased, {\n get(target, prop, receiver) {\n if (prop === \"$alias\") {\n return alias;\n }\n return Reflect.get(target, prop, receiver);\n },\n }) as this;\n }\n\n get cols(): EntityColumns<T> {\n const cols: Partial<EntityColumns<T>> = {};\n for (const key of Object.keys(this.schema.properties) as Array<\n keyof T[\"properties\"]\n >) {\n cols[key] = {\n name: key as string,\n entity: this,\n };\n }\n\n return cols as EntityColumns<T>;\n }\n\n get name(): string {\n return this.options.name;\n }\n\n get schema(): T {\n return this.options.schema;\n }\n\n get insertSchema(): TObjectInsert<T> {\n return insertSchema(this.options.schema);\n }\n\n get updateSchema(): TObjectUpdate<T> {\n return updateSchema(this.options.schema);\n }\n}\n\n$entity[KIND] = EntityPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Convert a schema to columns.\n */\nexport type FromSchema<T extends TObject> = {\n [key in keyof T[\"properties\"]]: PgColumnBuilderBase;\n};\n\nexport type SchemaToTableConfig<T extends TObject> = {\n name: string;\n schema: string | undefined;\n columns: {\n [key in keyof T[\"properties\"]]: PgColumn;\n };\n dialect: string;\n};\n\nexport type EntityColumn<T extends TObject> = {\n name: string;\n entity: EntityPrimitive<T>;\n};\n\nexport type EntityColumns<T extends TObject> = {\n [key in keyof T[\"properties\"]]: EntityColumn<T>;\n};\n","import {\n AlephaError,\n pageSchema,\n type Static,\n type TBigInt,\n type TInteger,\n type TNumber,\n type TNumberOptions,\n type TObject,\n type TObjectOptions,\n type TPage,\n type TSchema,\n type TString,\n type TStringOptions,\n type TUnsafe,\n t,\n} from \"alepha\";\nimport type { UpdateDeleteAction } from \"drizzle-orm/pg-core/foreign-keys\";\nimport {\n PG_CREATED_AT,\n PG_DEFAULT,\n PG_DELETED_AT,\n PG_ENUM,\n PG_IDENTITY,\n PG_PRIMARY_KEY,\n PG_REF,\n PG_UPDATED_AT,\n PG_VERSION,\n type PgDefault,\n type PgEnumOptions,\n type PgIdentityOptions,\n type PgPrimaryKey,\n type PgRef,\n} from \"../constants/PG_SYMBOLS.ts\";\nimport type { PgAttr } from \"../helpers/pgAttr.ts\";\nimport { pgAttr } from \"../helpers/pgAttr.ts\";\n\nexport class DatabaseTypeProvider {\n public readonly attr = pgAttr;\n\n /**\n * Creates a primary key with an identity column.\n */\n public readonly identityPrimaryKey = (\n identity?: PgIdentityOptions,\n options?: TNumberOptions,\n ) =>\n pgAttr(\n pgAttr(pgAttr(t.integer(options), PG_PRIMARY_KEY), PG_IDENTITY, identity),\n PG_DEFAULT,\n );\n\n /**\n * Creates a primary key with a big identity column. (default)\n */\n public readonly bigIdentityPrimaryKey = (\n identity?: PgIdentityOptions,\n options?: TNumberOptions,\n ) =>\n pgAttr(\n pgAttr(pgAttr(t.int64(options), PG_PRIMARY_KEY), PG_IDENTITY, identity),\n PG_DEFAULT,\n );\n\n /**\n * Creates a primary key with a UUID column.\n */\n public readonly uuidPrimaryKey = () =>\n pgAttr(pgAttr(t.uuid(), PG_PRIMARY_KEY), PG_DEFAULT);\n\n /**\n * Creates a primary key for a given type. Supports:\n * - `t.integer()` -> PG INT (default)\n * - `t.bigint()` -> PG BIGINT\n * - `t.uuid()` -> PG UUID\n */\n public primaryKey(): PgAttr<PgAttr<TInteger, PgPrimaryKey>, PgDefault>;\n public primaryKey(\n type: TString,\n options?: TStringOptions,\n ): PgAttr<PgAttr<TString, PgPrimaryKey>, PgDefault>;\n public primaryKey(\n type: TInteger,\n options?: TNumberOptions,\n identity?: PgIdentityOptions,\n ): PgAttr<PgAttr<TInteger, PgPrimaryKey>, PgDefault>;\n public primaryKey(\n type: TNumber,\n options?: TNumberOptions,\n identity?: PgIdentityOptions,\n ): PgAttr<PgAttr<TNumber, PgPrimaryKey>, PgDefault>;\n public primaryKey(\n type: TBigInt,\n options?: TNumberOptions,\n identity?: PgIdentityOptions,\n ): PgAttr<PgAttr<TBigInt, PgPrimaryKey>, PgDefault>;\n public primaryKey(\n type?: TSchema,\n options?: TNumberOptions | TStringOptions,\n identity?: PgIdentityOptions,\n ): PgAttr<PgAttr<TSchema, PgPrimaryKey>, PgDefault> {\n if (!type || t.schema.isInteger(type)) {\n return pgAttr(\n pgAttr(\n pgAttr(t.integer(options), PG_PRIMARY_KEY),\n PG_IDENTITY,\n identity,\n ),\n PG_DEFAULT,\n );\n }\n\n if (t.schema.isString(type) && type.format === \"uuid\") {\n return pgAttr(pgAttr(t.uuid(), PG_PRIMARY_KEY), PG_DEFAULT);\n }\n\n if (t.schema.isNumber(type) && type.format === \"int64\") {\n return pgAttr(\n pgAttr(\n pgAttr(t.number(options), PG_PRIMARY_KEY),\n PG_IDENTITY,\n identity,\n ),\n PG_DEFAULT,\n );\n }\n\n if (t.schema.isBigInt(type)) {\n return pgAttr(\n pgAttr(\n pgAttr(t.bigint(options), PG_PRIMARY_KEY),\n PG_IDENTITY,\n identity,\n ),\n PG_DEFAULT,\n );\n }\n\n throw new AlephaError(`Unsupported type for primary key: ${type}`);\n }\n\n /**\n * Wrap a schema with \"default\" attribute.\n * This is used to set a default value for a column in the database.\n */\n public readonly default = <T extends TSchema>(\n type: T,\n value?: Static<T>,\n ): PgAttr<T, PgDefault> => {\n if (value != null) {\n Object.assign(type, { default: value });\n }\n\n return this.attr(type, PG_DEFAULT);\n };\n\n /**\n * Creates a column 'version'.\n *\n * This is used to track the version of a row in the database.\n *\n * You can use it for optimistic concurrency control (OCC) with {@link RepositoryPrimitive#save}.\n *\n * @see {@link RepositoryPrimitive#save}\n * @see {@link PgVersionMismatchError}\n */\n public readonly version = (options: TNumberOptions = {}) =>\n this.default(pgAttr(t.integer(options), PG_VERSION), 0);\n\n /**\n * Creates a column Created At. So just a datetime column with a default value of the current timestamp.\n */\n public readonly createdAt = (options?: TStringOptions) =>\n pgAttr(pgAttr(t.datetime(options), PG_CREATED_AT), PG_DEFAULT);\n\n /**\n * Creates a column Updated At. Like createdAt, but it is updated on every update of the row.\n */\n public readonly updatedAt = (options?: TStringOptions) =>\n pgAttr(pgAttr(t.datetime(options), PG_UPDATED_AT), PG_DEFAULT);\n\n /**\n * Creates a column Deleted At for soft delete functionality.\n * This is used to mark rows as deleted without actually removing them from the database.\n * The column is nullable - NULL means not deleted, timestamp means deleted.\n */\n public readonly deletedAt = (options?: TStringOptions) =>\n pgAttr(t.optional(t.datetime(options)), PG_DELETED_AT);\n\n /**\n * Creates a Postgres ENUM type.\n *\n * > By default, `t.enum()` is mapped to a TEXT column in Postgres.\n * > Using this method, you can create a real ENUM type in the database.\n *\n * @example\n * ```ts\n * const statusEnum = pg.enum([\"pending\", \"active\", \"archived\"], { name: \"status_enum\" });\n * ```\n */\n public readonly enum = <T extends string[]>(\n values: [...T],\n pgEnumOptions?: PgEnumOptions,\n typeOptions?: TStringOptions,\n ): PgAttr<TUnsafe<T[number]>, typeof PG_ENUM> => {\n return pgAttr(\n t.enum(values, {\n description: pgEnumOptions?.description,\n ...typeOptions,\n }),\n PG_ENUM,\n pgEnumOptions,\n );\n };\n\n /**\n * Creates a reference to another table or schema. Basically a foreign key.\n */\n public readonly ref = <T extends TSchema>(\n type: T,\n ref: () => any,\n actions?: {\n onUpdate?: UpdateDeleteAction;\n onDelete?: UpdateDeleteAction;\n },\n ): PgAttr<T, PgRef> => {\n // If actions are not provided, set default onDelete based on type\n const finalActions = actions ?? {\n onDelete: t.schema.isOptional(type) ? \"set null\" : \"cascade\",\n };\n\n return this.attr(type, PG_REF, {\n ref,\n actions: finalActions,\n });\n };\n\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Creates a page schema for a given object schema.\n * It's used by {@link Repository#paginate} method.\n */\n public readonly page = <T extends TObject>(\n resource: T,\n options?: TObjectOptions,\n ): TPage<T> => {\n return pageSchema(resource, options);\n };\n}\n\n/**\n * Wrapper of TypeProvider (`t`) for database types.\n *\n * Use `db` for improve TypeBox schema definitions with database-specific attributes.\n *\n * @example\n * ```ts\n * import { t } from \"alepha\";\n * import { db } from \"alepha/orm\";\n *\n * const userSchema = t.object({\n * id: db.primaryKey(t.uuid()),\n * email: t.email(),\n * createdAt: db.createdAt(),\n * });\n * ```\n */\nexport const db = new DatabaseTypeProvider();\n\n/**\n * @deprecated Use `db` instead.\n */\nexport const pg = db;\n","import { t } from \"alepha\";\nimport {\n PG_DEFAULT,\n PG_PRIMARY_KEY,\n PG_SERIAL,\n} from \"../constants/PG_SYMBOLS.ts\";\nimport { pgAttr } from \"../helpers/pgAttr.ts\";\n\n/**\n * @deprecated Use `pg.primaryKey()` instead.\n */\nexport const legacyIdSchema = pgAttr(\n pgAttr(pgAttr(t.integer(), PG_PRIMARY_KEY), PG_SERIAL),\n PG_DEFAULT,\n);\n","import { $module } from \"alepha\";\nimport { AlephaDateTime } from \"alepha/datetime\";\n\nexport * from \"./index.shared.ts\";\n\nexport const AlephaPostgres = $module({\n name: \"alepha.postgres\",\n primitives: [],\n services: [AlephaDateTime],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.browser.js","names":["pageSchema"],"sources":["../../src/orm/errors/DbError.ts","../../src/orm/errors/DbEntityNotFoundError.ts","../../src/orm/helpers/parseQueryString.ts","../../src/orm/helpers/pgAttr.ts","../../src/orm/constants/PG_SYMBOLS.ts","../../src/orm/types/schema.ts","../../src/orm/schemas/insertSchema.ts","../../src/orm/schemas/updateSchema.ts","../../src/orm/primitives/$entity.ts","../../src/orm/providers/DatabaseTypeProvider.ts","../../src/orm/schemas/legacyIdSchema.ts","../../src/orm/index.browser.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\n\nexport class DbError extends AlephaError {\n name = \"DbError\";\n\n constructor(message: string, cause?: unknown) {\n super(message, { cause });\n }\n}\n","import { DbError } from \"./DbError.ts\";\n\nexport class DbEntityNotFoundError extends DbError {\n readonly name = \"DbEntityNotFoundError\";\n readonly status = 404;\n\n constructor(entityName: string) {\n super(`Entity from '${entityName}' was not found`);\n }\n}\n","import { AlephaError, type TObject } from \"alepha\";\nimport type { PgQueryWhere } from \"../interfaces/PgQueryWhere.ts\";\n\n/**\n * Parse a string query into a PgQueryWhere object.\n *\n * Supported syntax:\n * - Simple equality: \"name=John\"\n * - Wildcard patterns: \"name=John*\" (startsWith), \"name=*John\" (endsWith), \"name=*John*\" (contains)\n * - Operators: \"age>18\", \"age>=18\", \"age<65\", \"age<=65\", \"status!=active\"\n * - NULL checks: \"deletedAt=null\", \"email!=null\"\n * - IN arrays: \"status=[pending,active]\"\n * - AND conditions: \"name=John&age>18\"\n * - OR conditions: \"name=John|email=john@example.com\"\n * - Nested AND/OR: \"(name=John|name=Jane)&age>18\"\n * - JSONB nested: \"profile.city=Paris\"\n *\n * @example\n * ```ts\n * // Simple equality\n * parseQueryString(\"name=John\")\n * // => { name: { eq: \"John\" } }\n *\n * // Wildcard patterns\n * parseQueryString(\"name=John*\") // startsWith\n * // => { name: { startsWith: \"John\" } }\n * parseQueryString(\"name=*Smith\") // endsWith\n * // => { name: { endsWith: \"Smith\" } }\n * parseQueryString(\"name=*oh*\") // contains\n * // => { name: { contains: \"oh\" } }\n *\n * // Multiple conditions\n * parseQueryString(\"name=John&age>18\")\n * // => { and: [{ name: { eq: \"John\" } }, { age: { gt: 18 } }] }\n *\n * // OR conditions\n * parseQueryString(\"status=active|status=pending\")\n * // => { or: [{ status: { eq: \"active\" } }, { status: { eq: \"pending\" } }] }\n *\n * // Complex nested\n * parseQueryString(\"(name=John|name=Jane)&age>18&status!=archived\")\n * // => { and: [\n * // { or: [{ name: { eq: \"John\" } }, { name: { eq: \"Jane\" } }] },\n * // { age: { gt: 18 } },\n * // { status: { ne: \"archived\" } }\n * // ] }\n *\n * // JSONB nested query\n * parseQueryString(\"profile.city=Paris&profile.age>25\")\n * // => { profile: { city: { eq: \"Paris\" }, age: { gt: 25 } } }\n * ```\n */\nexport function parseQueryString<T extends TObject>(\n query: string,\n): PgQueryWhere<T> {\n if (!query || query.trim() === \"\") {\n return {};\n }\n\n const parser = new QueryStringParser(query);\n return parser.parse() as PgQueryWhere<T>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nclass QueryStringParser {\n private pos = 0;\n private readonly query: string;\n\n constructor(query: string) {\n this.query = query.trim();\n }\n\n parse(): PgQueryWhere<any> {\n return this.parseExpression();\n }\n\n private parseExpression(): PgQueryWhere<any> {\n return this.parseOr();\n }\n\n private parseOr(): any {\n const left = this.parseAnd();\n\n // Check for OR operator (|)\n if (this.peek() === \"|\") {\n const conditions = [left];\n\n while (this.peek() === \"|\") {\n this.consume(\"|\");\n conditions.push(this.parseAnd());\n }\n\n return { or: conditions };\n }\n\n return left;\n }\n\n private parseAnd(): any {\n const left = this.parsePrimary();\n\n // Check for AND operator (&)\n if (this.peek() === \"&\") {\n const conditions = [left];\n\n while (this.peek() === \"&\") {\n this.consume(\"&\");\n conditions.push(this.parsePrimary());\n }\n\n return { and: conditions };\n }\n\n return left;\n }\n\n private parsePrimary(): any {\n this.skipWhitespace();\n\n // Handle parentheses\n if (this.peek() === \"(\") {\n this.consume(\"(\");\n const expr = this.parseExpression();\n this.consume(\")\");\n return expr;\n }\n\n // Parse field condition\n return this.parseCondition();\n }\n\n private parseCondition(): any {\n const field = this.parseFieldPath();\n this.skipWhitespace();\n\n // Get operator\n const operator = this.parseOperator();\n this.skipWhitespace();\n\n // Get value\n const value = this.parseValue();\n\n if (value === \"\") {\n throw new AlephaError(`Expected value for field '${field.join(\".\")}'`);\n }\n\n // Build the condition object\n return this.buildCondition(field, operator, value);\n }\n\n private parseFieldPath(): string[] {\n const path: string[] = [];\n let current = \"\";\n\n while (this.pos < this.query.length) {\n const ch = this.query[this.pos];\n\n if (ch === \".\" && current) {\n path.push(current);\n current = \"\";\n this.pos++;\n continue;\n }\n\n if (ch === \"=\" || ch === \"!\" || ch === \">\" || ch === \"<\" || ch === \" \") {\n break;\n }\n\n current += ch;\n this.pos++;\n }\n\n if (current) {\n path.push(current);\n }\n\n return path;\n }\n\n private parseOperator(): string {\n this.skipWhitespace();\n\n const remaining = this.query.slice(this.pos);\n\n // Two-character operators\n if (remaining.startsWith(\">=\")) {\n this.pos += 2;\n return \">=\";\n }\n if (remaining.startsWith(\"<=\")) {\n this.pos += 2;\n return \"<=\";\n }\n if (remaining.startsWith(\"!=\")) {\n this.pos += 2;\n return \"!=\";\n }\n\n // Single-character operators\n const ch = this.query[this.pos];\n if (ch === \"=\" || ch === \">\" || ch === \"<\") {\n this.pos++;\n return ch;\n }\n\n throw new Error(`Expected operator at position ${this.pos}`);\n }\n\n private parseValue(): any {\n this.skipWhitespace();\n\n // Handle null\n if (this.query.slice(this.pos, this.pos + 4).toLowerCase() === \"null\") {\n this.pos += 4;\n return null;\n }\n\n // Handle arrays [value1,value2,...]\n if (this.query[this.pos] === \"[\") {\n return this.parseArray();\n }\n\n // Handle quoted strings\n if (this.query[this.pos] === '\"' || this.query[this.pos] === \"'\") {\n return this.parseQuotedString();\n }\n\n // Parse unquoted value (until &, |, or ))\n let value = \"\";\n while (this.pos < this.query.length) {\n const ch = this.query[this.pos];\n if (ch === \"&\" || ch === \"|\" || ch === \")\") {\n break;\n }\n value += ch;\n this.pos++;\n }\n\n return this.coerceValue(value.trim());\n }\n\n private parseArray(): any[] {\n this.consume(\"[\");\n const values: any[] = [];\n\n while (this.pos < this.query.length && this.query[this.pos] !== \"]\") {\n this.skipWhitespace();\n\n // Handle quoted values\n if (this.query[this.pos] === '\"' || this.query[this.pos] === \"'\") {\n values.push(this.parseQuotedString());\n } else {\n // Parse until comma or ]\n let value = \"\";\n while (\n this.pos < this.query.length &&\n this.query[this.pos] !== \",\" &&\n this.query[this.pos] !== \"]\"\n ) {\n value += this.query[this.pos];\n this.pos++;\n }\n values.push(this.coerceValue(value.trim()));\n }\n\n this.skipWhitespace();\n if (this.query[this.pos] === \",\") {\n this.pos++;\n }\n }\n\n this.consume(\"]\");\n return values;\n }\n\n private parseQuotedString(): string {\n const quote = this.query[this.pos];\n this.pos++; // Skip opening quote\n\n let value = \"\";\n let escaped = false;\n\n while (this.pos < this.query.length) {\n const ch = this.query[this.pos];\n\n if (escaped) {\n value += ch;\n escaped = false;\n this.pos++;\n continue;\n }\n\n if (ch === \"\\\\\") {\n escaped = true;\n this.pos++;\n continue;\n }\n\n if (ch === quote) {\n this.pos++; // Skip closing quote\n break;\n }\n\n value += ch;\n this.pos++;\n }\n\n return value;\n }\n\n private coerceValue(value: string): any {\n // Try to parse as number\n if (/^-?\\d+$/.test(value)) {\n return parseInt(value, 10);\n }\n\n if (/^-?\\d+\\.\\d+$/.test(value)) {\n return parseFloat(value);\n }\n\n // Try to parse as boolean\n if (value.toLowerCase() === \"true\") {\n return true;\n }\n if (value.toLowerCase() === \"false\") {\n return false;\n }\n\n return value;\n }\n\n private buildCondition(path: string[], operator: string, value: any): any {\n // Map operator to filter operator\n let filterOp: any;\n\n if (operator === \"=\") {\n if (value === null) {\n filterOp = { isNull: true };\n } else if (Array.isArray(value)) {\n // Arrays should be treated as inArray regardless of content\n filterOp = { inArray: value };\n } else if (typeof value === \"string\" && value.includes(\"*\")) {\n // Handle wildcard patterns\n const startsWithAsterisk = value.startsWith(\"*\");\n const endsWithAsterisk = value.endsWith(\"*\");\n const cleanValue = value.replace(/^\\*|\\*$/g, \"\"); // Remove leading/trailing asterisks\n\n if (startsWithAsterisk && endsWithAsterisk) {\n // *text* -> contains\n filterOp = { contains: cleanValue };\n } else if (startsWithAsterisk) {\n // *text -> endsWith\n filterOp = { endsWith: cleanValue };\n } else if (endsWithAsterisk) {\n // text* -> startsWith\n filterOp = { startsWith: cleanValue };\n } else {\n // Has asterisk in the middle, treat as literal\n filterOp = { eq: value };\n }\n } else {\n filterOp = { eq: value };\n }\n } else if (operator === \"!=\") {\n if (value === null) {\n filterOp = { isNotNull: true };\n } else {\n filterOp = { ne: value };\n }\n } else if (operator === \">\") {\n filterOp = { gt: value };\n } else if (operator === \">=\") {\n filterOp = { gte: value };\n } else if (operator === \"<\") {\n filterOp = { lt: value };\n } else if (operator === \"<=\") {\n filterOp = { lte: value };\n } else {\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n // Build nested object for path\n if (path.length === 1) {\n return { [path[0]]: filterOp };\n }\n\n // Handle nested paths (JSONB)\n let result: any = filterOp;\n for (let i = path.length - 1; i >= 0; i--) {\n result = { [path[i]]: result };\n }\n\n return result;\n }\n\n private peek(): string {\n this.skipWhitespace();\n return this.query[this.pos] || \"\";\n }\n\n private consume(expected: string): void {\n this.skipWhitespace();\n if (this.query[this.pos] !== expected) {\n throw new Error(\n `Expected '${expected}' at position ${this.pos}, got '${this.query[this.pos]}'`,\n );\n }\n this.pos++;\n }\n\n private skipWhitespace(): void {\n while (this.pos < this.query.length && /\\s/.test(this.query[this.pos])) {\n this.pos++;\n }\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Helper function to build query strings programmatically\n *\n * @example\n * ```ts\n * buildQueryString({\n * and: [\n * { name: \"eq:John\" },\n * { age: \"gt:18\" }\n * ]\n * })\n * // => \"name=John&age>18\"\n * ```\n */\nexport function buildQueryString(where: any): string {\n if (!where || typeof where !== \"object\") {\n return \"\";\n }\n\n // Handle logical operators\n if (\"and\" in where && Array.isArray(where.and)) {\n return where.and.map((w: any) => buildQueryString(w)).join(\"&\");\n }\n\n if (\"or\" in where && Array.isArray(where.or)) {\n const parts = where.or.map((w: any) => buildQueryString(w));\n return parts.length > 1 ? `(${parts.join(\"|\")})` : parts[0];\n }\n\n if (\"not\" in where) {\n // Not operator is harder to represent in string form\n // For now, we'll skip it or you could add a syntax like \"!field=value\"\n return \"\";\n }\n\n // Handle field conditions\n const parts: string[] = [];\n\n for (const [field, condition] of Object.entries(where)) {\n if (typeof condition !== \"object\" || condition === null) {\n parts.push(`${field}=${condition}`);\n continue;\n }\n\n if (\"eq\" in condition) {\n parts.push(`${field}=${condition.eq}`);\n } else if (\"ne\" in condition) {\n parts.push(`${field}!=${condition.ne}`);\n } else if (\"gt\" in condition) {\n parts.push(`${field}>${condition.gt}`);\n } else if (\"gte\" in condition) {\n parts.push(`${field}>=${condition.gte}`);\n } else if (\"lt\" in condition) {\n parts.push(`${field}<${condition.lt}`);\n } else if (\"lte\" in condition) {\n parts.push(`${field}<=${condition.lte}`);\n } else if (\"contains\" in condition) {\n parts.push(`${field}=*${condition.contains}*`);\n } else if (\"startsWith\" in condition) {\n parts.push(`${field}=${condition.startsWith}*`);\n } else if (\"endsWith\" in condition) {\n parts.push(`${field}=*${condition.endsWith}`);\n } else if (\"isNull\" in condition && condition.isNull) {\n parts.push(`${field}=null`);\n } else if (\"isNotNull\" in condition && condition.isNotNull) {\n parts.push(`${field}!=null`);\n } else if (\"inArray\" in condition && Array.isArray(condition.inArray)) {\n const values = condition.inArray.map((v: any) =>\n typeof v === \"string\" ? `\"${v}\"` : v,\n );\n parts.push(`${field}=[${values.join(\",\")}]`);\n } else {\n // Nested object (JSONB)\n const nested = buildQueryString(condition);\n if (nested) {\n parts.push(`${field}.${nested}`);\n }\n }\n }\n\n return parts.join(\"&\");\n}\n","import type { TObject, TSchema } from \"alepha\";\nimport type { PgSymbolKeys, PgSymbols } from \"../constants/PG_SYMBOLS.ts\";\n\n/**\n * Decorates a typebox schema with a Postgres attribute.\n *\n * > It's just a fancy way to add Symbols to a field.\n *\n * @example\n * ```ts\n * import { t } from \"alepha\";\n * import { PG_UPDATED_AT } from \"../constants/PG_SYMBOLS\";\n *\n * export const updatedAtSchema = pgAttr(\n * t.datetime(), PG_UPDATED_AT,\n * );\n * ```\n */\nexport const pgAttr = <T extends TSchema, Attr extends PgSymbolKeys>(\n type: T,\n attr: Attr,\n value?: PgSymbols[Attr],\n): PgAttr<T, Attr> => {\n Object.assign(type, { [attr]: value ?? {} });\n return type as PgAttr<T, Attr>;\n};\n\n/**\n * Retrieves the fields of a schema that have a specific attribute.\n */\nexport const getAttrFields = (\n schema: TObject,\n name: PgSymbolKeys,\n): PgAttrField[] => {\n const fields: Array<PgAttrField> = [];\n\n for (const key of Object.keys(schema.properties)) {\n const value = schema.properties[key];\n if (name in value) {\n fields.push({\n type: value as TSchema,\n key: key,\n data: (value as any)[name],\n });\n }\n }\n\n return fields;\n};\n\n/**\n * Type representation.\n */\nexport type PgAttr<T extends TSchema, TAttr extends PgSymbolKeys> = T & {\n [K in TAttr]: PgSymbols[K];\n};\n\nexport interface PgAttrField {\n key: string;\n type: TSchema;\n data: any;\n nested?: any[];\n one?: boolean;\n}\n","import type {\n PgSequenceOptions,\n UpdateDeleteAction,\n} from \"drizzle-orm/pg-core\";\nimport type { EntityPrimitive } from \"../primitives/$entity.ts\";\n\nexport const PG_DEFAULT = Symbol.for(\"Alepha.Postgres.Default\");\nexport const PG_PRIMARY_KEY = Symbol.for(\"Alepha.Postgres.PrimaryKey\");\nexport const PG_CREATED_AT = Symbol.for(\"Alepha.Postgres.CreatedAt\");\nexport const PG_UPDATED_AT = Symbol.for(\"Alepha.Postgres.UpdatedAt\");\nexport const PG_DELETED_AT = Symbol.for(\"Alepha.Postgres.DeletedAt\");\nexport const PG_VERSION = Symbol.for(\"Alepha.Postgres.Version\");\nexport const PG_IDENTITY = Symbol.for(\"Alepha.Postgres.Identity\");\nexport const PG_ENUM = Symbol.for(\"Alepha.Postgres.Enum\");\nexport const PG_REF = Symbol.for(\"Alepha.Postgres.Ref\");\n\n/**\n * @deprecated Use `PG_IDENTITY` instead.\n */\nexport const PG_SERIAL = Symbol.for(\"Alepha.Postgres.Serial\");\n\nexport type PgDefault = typeof PG_DEFAULT;\nexport type PgRef = typeof PG_REF;\nexport type PgPrimaryKey = typeof PG_PRIMARY_KEY;\n\nexport type PgSymbols = {\n [PG_DEFAULT]: {};\n [PG_PRIMARY_KEY]: {};\n [PG_CREATED_AT]: {};\n [PG_UPDATED_AT]: {};\n [PG_DELETED_AT]: {};\n [PG_VERSION]: {};\n [PG_IDENTITY]: PgIdentityOptions;\n [PG_REF]: PgRefOptions;\n [PG_ENUM]: PgEnumOptions;\n\n /**\n * @deprecated Use `PG_IDENTITY` instead.\n */\n [PG_SERIAL]: {};\n};\n\nexport type PgSymbolKeys = keyof PgSymbols;\n\nexport type PgIdentityOptions = {\n mode: \"always\" | \"byDefault\";\n} & PgSequenceOptions & {\n name?: string;\n };\n\nexport interface PgEnumOptions {\n name?: string;\n description?: string;\n}\n\nexport interface PgRefOptions {\n ref: () => {\n name: string;\n entity: EntityPrimitive;\n };\n actions?: {\n onUpdate?: UpdateDeleteAction;\n onDelete?: UpdateDeleteAction;\n };\n}\n","import type { Static, TSchema } from \"alepha\";\nimport { customType } from \"drizzle-orm/pg-core\";\n\n/**\n * Postgres schema type.\n */\nexport const schema = <TDocument extends TSchema>(\n name: string,\n document: TDocument,\n) =>\n customType<{\n data: Static<TDocument>;\n driverData: string;\n config: { document: TDocument };\n configRequired: true;\n }>({\n dataType: () => \"jsonb\",\n toDriver: (value) => JSON.stringify(value),\n fromDriver: (value: TDocument | string) =>\n value && typeof value === \"string\" ? JSON.parse(value) : value,\n })(name, { document }).$type<Static<TDocument>>();\n","import type { TObject, TOptional } from \"alepha\";\nimport { t } from \"alepha\";\nimport { PG_DEFAULT } from \"../constants/PG_SYMBOLS.ts\";\nimport { schema } from \"../types/schema.ts\";\n\n/**\n * Transforms a TObject schema for insert operations.\n * All default properties at the root level are made optional.\n *\n * @example\n * Before: { name: string; age: number(default=0); }\n * After: { name: string; age?: number; }\n */\nexport type TObjectInsert<T extends TObject> = TObject<{\n [K in keyof T[\"properties\"]]: T[\"properties\"][K] extends\n | { [PG_DEFAULT]: any }\n | { \"~optional\": true }\n ? TOptional<T[\"properties\"][K]>\n : T[\"properties\"][K];\n}>;\n\nexport const insertSchema = <T extends TObject>(obj: T): TObjectInsert<T> => {\n const newProperties: Record<string, any> = {};\n\n for (const key in obj.properties) {\n const prop = obj.properties[key];\n\n if (PG_DEFAULT in prop) {\n newProperties[key] = t.optional(prop);\n } else {\n newProperties[key] = prop;\n }\n }\n\n return t.object(\n newProperties,\n \"options\" in schema && typeof schema.options === \"object\"\n ? { ...schema.options }\n : {},\n ) as TObjectInsert<T>;\n};\n","import {\n type TNull,\n type TObject,\n type TOptional,\n type TUnion,\n t,\n} from \"alepha\";\n\n/**\n * Transforms a TObject schema for update operations.\n * All optional properties at the root level are made nullable (i.e., `T | null`).\n * This allows an API endpoint to explicitly accept `null` to clear an optional field in the database.\n *\n * @example\n * Before: { name?: string; age: number; }\n * After: { name?: string | null; age: number; }\n */\nexport type TObjectUpdate<T extends TObject> = TObject<{\n [K in keyof T[\"properties\"]]: T[\"properties\"][K] extends TOptional<infer U>\n ? TOptional<TUnion<[U, TNull]>>\n : T[\"properties\"][K];\n}>;\n\nexport const updateSchema = <T extends TObject>(\n schema: T,\n): TObjectUpdate<T> => {\n const newProperties: Record<string, any> = {};\n\n for (const key in schema.properties) {\n const prop = schema.properties[key];\n if (t.schema.isOptional(prop)) {\n newProperties[key] = t.optional(t.union([prop, t.raw.Null()]));\n } else {\n newProperties[key] = prop;\n }\n }\n\n return t.object(\n newProperties,\n \"options\" in schema && typeof schema.options === \"object\"\n ? { ...schema.options }\n : {},\n ) as TObjectUpdate<T>;\n};\n","import { KIND, type Static, type TObject } from \"alepha\";\nimport type { BuildExtraConfigColumns, SQL } from \"drizzle-orm\";\nimport type {\n PgColumn,\n PgColumnBuilderBase,\n PgTableExtraConfigValue,\n} from \"drizzle-orm/pg-core\";\nimport { insertSchema, type TObjectInsert } from \"../schemas/insertSchema.ts\";\nimport { type TObjectUpdate, updateSchema } from \"../schemas/updateSchema.ts\";\n\n/**\n * Creates a database entity primitive that defines table structure using TypeBox schemas.\n *\n * @example\n * ```ts\n * import { t } from \"alepha\";\n * import { $entity } from \"alepha/orm\";\n *\n * const userEntity = $entity({\n * name: \"users\",\n * schema: t.object({\n * id: pg.primaryKey(),\n * name: t.text(),\n * email: t.email(),\n * }),\n * });\n * ```\n */\nexport const $entity = <TSchema extends TObject>(\n options: EntityPrimitiveOptions<TSchema>,\n): EntityPrimitive<TSchema> => {\n return new EntityPrimitive<TSchema>(options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface EntityPrimitiveOptions<\n T extends TObject,\n Keys = keyof Static<T>,\n> {\n /**\n * The database table name that will be created for this entity.\n * If not provided, name will be inferred from the $repository variable name.\n */\n name: string;\n\n /**\n * TypeBox schema defining the table structure and column types.\n */\n schema: T;\n\n /**\n * Database indexes to create for query optimization.\n */\n indexes?: (\n | Keys\n | {\n /**\n * Single column to index.\n */\n column: Keys;\n /**\n * Whether this should be a unique index (enforces uniqueness constraint).\n */\n unique?: boolean;\n /**\n * Custom name for the index. If not provided, generates name automatically.\n */\n name?: string;\n }\n | {\n /**\n * Multiple columns for composite index (order matters for query optimization).\n */\n columns: Keys[];\n /**\n * Whether this should be a unique index (enforces uniqueness constraint).\n */\n unique?: boolean;\n /**\n * Custom name for the index. If not provided, generates name automatically.\n */\n name?: string;\n }\n )[];\n\n /**\n * Foreign key constraints to maintain referential integrity.\n */\n foreignKeys?: Array<{\n /**\n * Optional name for the foreign key constraint.\n */\n name?: string;\n /**\n * Local columns that reference the foreign table.\n */\n columns: Array<keyof Static<T>>;\n /**\n * Referenced columns in the foreign table.\n * Must be EntityColumn references from other entities.\n */\n foreignColumns: Array<() => EntityColumn<any>>;\n }>;\n\n /**\n * Additional table constraints for data validation.\n *\n * Constraints enforce business rules at the database level, providing\n * an additional layer of data integrity beyond application validation.\n *\n * **Constraint Types**:\n * - **Unique constraints**: Prevent duplicate values across columns\n * - **Check constraints**: Enforce custom validation rules with SQL expressions\n *\n * @example\n * ```ts\n * constraints: [\n * {\n * name: \"unique_user_email\",\n * columns: [\"email\"],\n * unique: true\n * },\n * {\n * name: \"valid_age_range\",\n * columns: [\"age\"],\n * check: sql`age >= 0 AND age <= 150`\n * },\n * {\n * name: \"unique_user_username_per_tenant\",\n * columns: [\"tenantId\", \"username\"],\n * unique: true\n * }\n * ]\n * ```\n */\n constraints?: Array<{\n /**\n * Columns involved in this constraint.\n */\n columns: Array<keyof Static<T>>;\n /**\n * Optional name for the constraint.\n */\n name?: string;\n /**\n * Whether this is a unique constraint.\n */\n unique?: boolean | {} /* options */;\n /**\n * SQL expression for check constraint validation.\n */\n check?: SQL;\n }>;\n\n /**\n * Advanced Drizzle ORM configuration for complex table setups.\n */\n config?: (\n self: BuildExtraConfigColumns<string, FromSchema<T>, \"pg\">,\n ) => PgTableExtraConfigValue[];\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class EntityPrimitive<T extends TObject = TObject> {\n public readonly options: EntityPrimitiveOptions<T>;\n\n constructor(options: EntityPrimitiveOptions<T>) {\n this.options = options;\n }\n\n alias(alias: string): this {\n const aliased = new EntityPrimitive<T>(this.options);\n return new Proxy(aliased, {\n get(target, prop, receiver) {\n if (prop === \"$alias\") {\n return alias;\n }\n return Reflect.get(target, prop, receiver);\n },\n }) as this;\n }\n\n get cols(): EntityColumns<T> {\n const cols: Partial<EntityColumns<T>> = {};\n for (const key of Object.keys(this.schema.properties) as Array<\n keyof T[\"properties\"]\n >) {\n cols[key] = {\n name: key as string,\n entity: this,\n };\n }\n\n return cols as EntityColumns<T>;\n }\n\n get name(): string {\n return this.options.name;\n }\n\n get schema(): T {\n return this.options.schema;\n }\n\n get insertSchema(): TObjectInsert<T> {\n return insertSchema(this.options.schema);\n }\n\n get updateSchema(): TObjectUpdate<T> {\n return updateSchema(this.options.schema);\n }\n}\n\n$entity[KIND] = EntityPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Convert a schema to columns.\n */\nexport type FromSchema<T extends TObject> = {\n [key in keyof T[\"properties\"]]: PgColumnBuilderBase;\n};\n\nexport type SchemaToTableConfig<T extends TObject> = {\n name: string;\n schema: string | undefined;\n columns: {\n [key in keyof T[\"properties\"]]: PgColumn;\n };\n dialect: string;\n};\n\nexport type EntityColumn<T extends TObject> = {\n name: string;\n entity: EntityPrimitive<T>;\n};\n\nexport type EntityColumns<T extends TObject> = {\n [key in keyof T[\"properties\"]]: EntityColumn<T>;\n};\n","import {\n AlephaError,\n pageSchema,\n type Static,\n type TBigInt,\n type TInteger,\n type TNumber,\n type TNumberOptions,\n type TObject,\n type TObjectOptions,\n type TPage,\n type TSchema,\n type TString,\n type TStringOptions,\n type TUnsafe,\n t,\n} from \"alepha\";\nimport type { UpdateDeleteAction } from \"drizzle-orm/pg-core/foreign-keys\";\nimport {\n PG_CREATED_AT,\n PG_DEFAULT,\n PG_DELETED_AT,\n PG_ENUM,\n PG_IDENTITY,\n PG_PRIMARY_KEY,\n PG_REF,\n PG_UPDATED_AT,\n PG_VERSION,\n type PgDefault,\n type PgEnumOptions,\n type PgIdentityOptions,\n type PgPrimaryKey,\n type PgRef,\n} from \"../constants/PG_SYMBOLS.ts\";\nimport type { PgAttr } from \"../helpers/pgAttr.ts\";\nimport { pgAttr } from \"../helpers/pgAttr.ts\";\n\nexport class DatabaseTypeProvider {\n public readonly attr = pgAttr;\n\n /**\n * Creates a primary key with an identity column.\n */\n public readonly identityPrimaryKey = (\n identity?: PgIdentityOptions,\n options?: TNumberOptions,\n ) =>\n pgAttr(\n pgAttr(pgAttr(t.integer(options), PG_PRIMARY_KEY), PG_IDENTITY, identity),\n PG_DEFAULT,\n );\n\n /**\n * Creates a primary key with a big identity column. (default)\n */\n public readonly bigIdentityPrimaryKey = (\n identity?: PgIdentityOptions,\n options?: TNumberOptions,\n ) =>\n pgAttr(\n pgAttr(pgAttr(t.int64(options), PG_PRIMARY_KEY), PG_IDENTITY, identity),\n PG_DEFAULT,\n );\n\n /**\n * Creates a primary key with a UUID column.\n */\n public readonly uuidPrimaryKey = () =>\n pgAttr(pgAttr(t.uuid(), PG_PRIMARY_KEY), PG_DEFAULT);\n\n /**\n * Creates a primary key for a given type. Supports:\n * - `t.integer()` -> PG INT (default)\n * - `t.bigint()` -> PG BIGINT\n * - `t.uuid()` -> PG UUID\n */\n public primaryKey(): PgAttr<PgAttr<TInteger, PgPrimaryKey>, PgDefault>;\n public primaryKey(\n type: TString,\n options?: TStringOptions,\n ): PgAttr<PgAttr<TString, PgPrimaryKey>, PgDefault>;\n public primaryKey(\n type: TInteger,\n options?: TNumberOptions,\n identity?: PgIdentityOptions,\n ): PgAttr<PgAttr<TInteger, PgPrimaryKey>, PgDefault>;\n public primaryKey(\n type: TNumber,\n options?: TNumberOptions,\n identity?: PgIdentityOptions,\n ): PgAttr<PgAttr<TNumber, PgPrimaryKey>, PgDefault>;\n public primaryKey(\n type: TBigInt,\n options?: TNumberOptions,\n identity?: PgIdentityOptions,\n ): PgAttr<PgAttr<TBigInt, PgPrimaryKey>, PgDefault>;\n public primaryKey(\n type?: TSchema,\n options?: TNumberOptions | TStringOptions,\n identity?: PgIdentityOptions,\n ): PgAttr<PgAttr<TSchema, PgPrimaryKey>, PgDefault> {\n if (!type || t.schema.isInteger(type)) {\n return pgAttr(\n pgAttr(\n pgAttr(t.integer(options), PG_PRIMARY_KEY),\n PG_IDENTITY,\n identity,\n ),\n PG_DEFAULT,\n );\n }\n\n if (t.schema.isString(type) && type.format === \"uuid\") {\n return pgAttr(pgAttr(t.uuid(), PG_PRIMARY_KEY), PG_DEFAULT);\n }\n\n if (t.schema.isNumber(type) && type.format === \"int64\") {\n return pgAttr(\n pgAttr(\n pgAttr(t.number(options), PG_PRIMARY_KEY),\n PG_IDENTITY,\n identity,\n ),\n PG_DEFAULT,\n );\n }\n\n if (t.schema.isBigInt(type)) {\n return pgAttr(\n pgAttr(\n pgAttr(t.bigint(options), PG_PRIMARY_KEY),\n PG_IDENTITY,\n identity,\n ),\n PG_DEFAULT,\n );\n }\n\n throw new AlephaError(`Unsupported type for primary key: ${type}`);\n }\n\n /**\n * Wrap a schema with \"default\" attribute.\n * This is used to set a default value for a column in the database.\n */\n public readonly default = <T extends TSchema>(\n type: T,\n value?: Static<T>,\n ): PgAttr<T, PgDefault> => {\n if (value != null) {\n Object.assign(type, { default: value });\n }\n\n return this.attr(type, PG_DEFAULT);\n };\n\n /**\n * Creates a column 'version'.\n *\n * This is used to track the version of a row in the database.\n *\n * You can use it for optimistic concurrency control (OCC) with {@link RepositoryPrimitive#save}.\n *\n * @see {@link RepositoryPrimitive#save}\n * @see {@link PgVersionMismatchError}\n */\n public readonly version = (options: TNumberOptions = {}) =>\n this.default(pgAttr(t.integer(options), PG_VERSION), 0);\n\n /**\n * Creates a column Created At. So just a datetime column with a default value of the current timestamp.\n */\n public readonly createdAt = (options?: TStringOptions) =>\n pgAttr(pgAttr(t.datetime(options), PG_CREATED_AT), PG_DEFAULT);\n\n /**\n * Creates a column Updated At. Like createdAt, but it is updated on every update of the row.\n */\n public readonly updatedAt = (options?: TStringOptions) =>\n pgAttr(pgAttr(t.datetime(options), PG_UPDATED_AT), PG_DEFAULT);\n\n /**\n * Creates a column Deleted At for soft delete functionality.\n * This is used to mark rows as deleted without actually removing them from the database.\n * The column is nullable - NULL means not deleted, timestamp means deleted.\n */\n public readonly deletedAt = (options?: TStringOptions) =>\n pgAttr(t.optional(t.datetime(options)), PG_DELETED_AT);\n\n /**\n * Creates a Postgres ENUM type.\n *\n * > By default, `t.enum()` is mapped to a TEXT column in Postgres.\n * > Using this method, you can create a real ENUM type in the database.\n *\n * @example\n * ```ts\n * const statusEnum = pg.enum([\"pending\", \"active\", \"archived\"], { name: \"status_enum\" });\n * ```\n */\n public readonly enum = <T extends string[]>(\n values: [...T],\n pgEnumOptions?: PgEnumOptions,\n typeOptions?: TStringOptions,\n ): PgAttr<TUnsafe<T[number]>, typeof PG_ENUM> => {\n return pgAttr(\n t.enum(values, {\n description: pgEnumOptions?.description,\n ...typeOptions,\n }),\n PG_ENUM,\n pgEnumOptions,\n );\n };\n\n /**\n * Creates a reference to another table or schema. Basically a foreign key.\n */\n public readonly ref = <T extends TSchema>(\n type: T,\n ref: () => any,\n actions?: {\n onUpdate?: UpdateDeleteAction;\n onDelete?: UpdateDeleteAction;\n },\n ): PgAttr<T, PgRef> => {\n // If actions are not provided, set default onDelete based on type\n const finalActions = actions ?? {\n onDelete: t.schema.isOptional(type) ? \"set null\" : \"cascade\",\n };\n\n return this.attr(type, PG_REF, {\n ref,\n actions: finalActions,\n });\n };\n\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Creates a page schema for a given object schema.\n * It's used by {@link Repository#paginate} method.\n */\n public readonly page = <T extends TObject>(\n resource: T,\n options?: TObjectOptions,\n ): TPage<T> => {\n return pageSchema(resource, options);\n };\n}\n\n/**\n * Wrapper of TypeProvider (`t`) for database types.\n *\n * Use `db` for improve TypeBox schema definitions with database-specific attributes.\n *\n * @example\n * ```ts\n * import { t } from \"alepha\";\n * import { db } from \"alepha/orm\";\n *\n * const userSchema = t.object({\n * id: db.primaryKey(t.uuid()),\n * email: t.email(),\n * createdAt: db.createdAt(),\n * });\n * ```\n */\nexport const db = new DatabaseTypeProvider();\n\n/**\n * @deprecated Use `db` instead.\n */\nexport const pg = db;\n","import { t } from \"alepha\";\nimport {\n PG_DEFAULT,\n PG_PRIMARY_KEY,\n PG_SERIAL,\n} from \"../constants/PG_SYMBOLS.ts\";\nimport { pgAttr } from \"../helpers/pgAttr.ts\";\n\n/**\n * @deprecated Use `pg.primaryKey()` instead.\n */\nexport const legacyIdSchema = pgAttr(\n pgAttr(pgAttr(t.integer(), PG_PRIMARY_KEY), PG_SERIAL),\n PG_DEFAULT,\n);\n","import { $module } from \"alepha\";\nimport { AlephaDateTime } from \"alepha/datetime\";\n\nexport * from \"./index.shared.ts\";\n\nexport const AlephaOrm = $module({\n name: \"alepha.orm\",\n primitives: [],\n services: [AlephaDateTime],\n});\n"],"mappings":"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"}
@@ -209,9 +209,13 @@ var DatabaseProvider = class {
209
209
  return `migrations/${this.name}`;
210
210
  }
211
211
  /**
212
- * Base migration orchestration - handles environment logic
212
+ * Base migration orchestration - handles environment logic.
213
+ *
214
+ * Never runs in serverless mode - migrations should be applied during
215
+ * deployment, not at runtime (to avoid race conditions and timeouts).
213
216
  */
214
217
  async migrate() {
218
+ if (this.alepha.isServerless()) return;
215
219
  const migrationsFolder = this.getMigrationsFolder();
216
220
  if (this.alepha.isProduction()) await this.runProductionMigration(migrationsFolder);
217
221
  else if (this.alepha.isTest()) await this.runTestMigration();
@@ -1075,12 +1079,13 @@ var BunSqliteProvider = class extends DatabaseProvider {
1075
1079
  this.log.trace(query, { params });
1076
1080
  } }
1077
1081
  });
1078
- await this.migrate();
1082
+ if (!this.alepha.isServerless()) await this.migrate();
1079
1083
  this.log.info(`Using Bun SQLite database at ${filepath}`);
1080
1084
  }
1081
1085
  });
1082
1086
  onStop = $hook({
1083
1087
  on: "stop",
1088
+ priority: "last",
1084
1089
  handler: async () => {
1085
1090
  if (this.sqlite) {
1086
1091
  this.log.debug("Closing Bun SQLite connection...");
@@ -1115,7 +1120,7 @@ var CloudflareD1Provider = class extends DatabaseProvider {
1115
1120
  kit = $inject(DrizzleKitProvider);
1116
1121
  log = $logger();
1117
1122
  builder = $inject(SqliteModelBuilder);
1118
- env = $env(t.object({ DATABASE_URL: t.string({ description: "Expect to be 'cloudflare-d1://name:id'" }) }));
1123
+ env = $env(t.object({ DATABASE_URL: t.string({ description: "Expect to be 'd1://name:id'" }) }));
1119
1124
  d1;
1120
1125
  drizzleDb;
1121
1126
  get name() {
@@ -1139,21 +1144,33 @@ var CloudflareD1Provider = class extends DatabaseProvider {
1139
1144
  onStart = $hook({
1140
1145
  on: "start",
1141
1146
  handler: async () => {
1142
- const [bindingName] = this.env.DATABASE_URL.replace("cloudflare-d1://", "").split(":");
1143
- const cloudflareEnv = this.alepha.store.get("cloudflare.env");
1144
- if (!cloudflareEnv) throw new AlephaError("Cloudflare Workers environment not found in Alepha store under 'cloudflare.env'.");
1145
- const binding = cloudflareEnv[bindingName];
1146
- if (!binding) throw new AlephaError(`D1 binding '${bindingName}' not found in Cloudflare Workers environment.`);
1147
- this.d1 = binding;
1148
- const { drizzle } = await import("drizzle-orm/d1");
1149
- this.drizzleDb = drizzle(this.d1);
1150
- await this.migrate();
1151
- this.log.info("Using Cloudflare D1 database");
1147
+ try {
1148
+ const [bindingName] = this.env.DATABASE_URL.replace("d1://", "").split(":");
1149
+ const cloudflareEnv = this.alepha.store.get("cloudflare.env");
1150
+ if (!cloudflareEnv) throw new AlephaError("Cloudflare Workers environment not found in Alepha store under 'cloudflare.env'.");
1151
+ const binding = cloudflareEnv[bindingName];
1152
+ if (!binding) throw new AlephaError(`D1 binding '${bindingName}' not found in Cloudflare Workers environment.`);
1153
+ this.d1 = binding;
1154
+ const { drizzle } = await import("drizzle-orm/d1");
1155
+ this.drizzleDb = drizzle(this.d1);
1156
+ if (!this.alepha.isServerless()) await this.migrate();
1157
+ this.log.info("Using Cloudflare D1 database");
1158
+ } catch (error) {
1159
+ const errorMessage = error instanceof Error ? `${error.message}${error.stack ? `\n${error.stack}` : ""}` : String(error);
1160
+ this.log.error(`D1 initialization failed: ${errorMessage}`);
1161
+ throw error;
1162
+ }
1152
1163
  }
1153
1164
  });
1154
1165
  async executeMigrations(migrationsFolder) {
1155
- const { migrate } = await import("drizzle-orm/d1/migrator");
1156
- await migrate(this.db, { migrationsFolder });
1166
+ this.log.debug(`Running D1 migrations from '${migrationsFolder}'...`);
1167
+ try {
1168
+ const { migrate } = await import("drizzle-orm/d1/migrator");
1169
+ await migrate(this.db, { migrationsFolder });
1170
+ this.log.debug("D1 migrations completed successfully");
1171
+ } catch (error) {
1172
+ throw new AlephaError(`D1 migration failed from '${migrationsFolder}': ${error instanceof Error ? `${error.name}: ${error.message}` : String(error)}`, { cause: error });
1173
+ }
1157
1174
  }
1158
1175
  /**
1159
1176
  * Override development migration to skip sync (not supported on D1).
@@ -2726,7 +2743,7 @@ var index_bun_exports = /* @__PURE__ */ __exportAll({
2726
2743
  $repository: () => $repository,
2727
2744
  $sequence: () => $sequence,
2728
2745
  $transaction: () => $transaction,
2729
- AlephaPostgres: () => AlephaPostgres,
2746
+ AlephaOrm: () => AlephaOrm,
2730
2747
  BunPostgresProvider: () => BunPostgresProvider,
2731
2748
  BunSqliteProvider: () => BunSqliteProvider,
2732
2749
  CloudflareD1Provider: () => CloudflareD1Provider,
@@ -2752,6 +2769,7 @@ var index_bun_exports = /* @__PURE__ */ __exportAll({
2752
2769
  Repository: () => Repository,
2753
2770
  RepositoryProvider: () => RepositoryProvider,
2754
2771
  SequencePrimitive: () => SequencePrimitive,
2772
+ SqliteProvider: () => SqliteProvider,
2755
2773
  buildQueryString: () => buildQueryString,
2756
2774
  bunSqliteOptions: () => bunSqliteOptions,
2757
2775
  db: () => db,
@@ -2768,8 +2786,9 @@ var index_bun_exports = /* @__PURE__ */ __exportAll({
2768
2786
  sql: () => sql,
2769
2787
  updateSchema: () => updateSchema
2770
2788
  });
2771
- const AlephaPostgres = $module({
2772
- name: "alepha.postgres",
2789
+ const SqliteProvider = BunSqliteProvider;
2790
+ const AlephaOrm = $module({
2791
+ name: "alepha.orm",
2773
2792
  primitives: [$sequence, $entity],
2774
2793
  services: [
2775
2794
  AlephaDateTime,
@@ -2792,7 +2811,7 @@ const AlephaPostgres = $module({
2792
2811
  alepha.with(RepositoryProvider);
2793
2812
  const url = env.DATABASE_URL;
2794
2813
  const isPostgres = url?.startsWith("postgres:");
2795
- if (url?.startsWith("cloudflare-d1:")) {
2814
+ if (url?.startsWith("d1:")) {
2796
2815
  alepha.with({
2797
2816
  optional: true,
2798
2817
  provide: DatabaseProvider,
@@ -2817,5 +2836,5 @@ const AlephaPostgres = $module({
2817
2836
  });
2818
2837
 
2819
2838
  //#endregion
2820
- export { $entity, $repository, $sequence, $transaction, AlephaPostgres, BunPostgresProvider, BunSqliteProvider, CloudflareD1Provider, DatabaseProvider, DatabaseTypeProvider, DbConflictError, DbEntityNotFoundError, DbError, DbMigrationError, DbVersionMismatchError, DrizzleKitProvider, EntityPrimitive, PG_CREATED_AT, PG_DEFAULT, PG_DELETED_AT, PG_ENUM, PG_IDENTITY, PG_PRIMARY_KEY, PG_REF, PG_SERIAL, PG_UPDATED_AT, PG_VERSION, Repository, RepositoryProvider, SequencePrimitive, buildQueryString, bunSqliteOptions, db, drizzle, getAttrFields, insertSchema, legacyIdSchema, pageQuerySchema, pageSchema, parseQueryString, pg, pgAttr, schema, sql, updateSchema };
2839
+ export { $entity, $repository, $sequence, $transaction, AlephaOrm, BunPostgresProvider, BunSqliteProvider, CloudflareD1Provider, DatabaseProvider, DatabaseTypeProvider, DbConflictError, DbEntityNotFoundError, DbError, DbMigrationError, DbVersionMismatchError, DrizzleKitProvider, EntityPrimitive, PG_CREATED_AT, PG_DEFAULT, PG_DELETED_AT, PG_ENUM, PG_IDENTITY, PG_PRIMARY_KEY, PG_REF, PG_SERIAL, PG_UPDATED_AT, PG_VERSION, Repository, RepositoryProvider, SequencePrimitive, SqliteProvider, buildQueryString, bunSqliteOptions, db, drizzle, getAttrFields, insertSchema, legacyIdSchema, pageQuerySchema, pageSchema, parseQueryString, pg, pgAttr, schema, sql, updateSchema };
2821
2840
  //# sourceMappingURL=index.bun.js.map