alepha 0.15.0 → 0.15.2

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 (551) hide show
  1. package/README.md +43 -98
  2. package/dist/api/audits/index.d.ts +630 -653
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +12 -35
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +365 -358
  7. package/dist/api/files/index.d.ts.map +1 -1
  8. package/dist/api/files/index.js +12 -5
  9. package/dist/api/files/index.js.map +1 -1
  10. package/dist/api/jobs/index.d.ts +255 -248
  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.browser.js +4 -4
  19. package/dist/api/notifications/index.browser.js.map +1 -1
  20. package/dist/api/notifications/index.d.ts +84 -78
  21. package/dist/api/notifications/index.d.ts.map +1 -1
  22. package/dist/api/notifications/index.js +14 -8
  23. package/dist/api/notifications/index.js.map +1 -1
  24. package/dist/api/parameters/index.d.ts +528 -535
  25. package/dist/api/parameters/index.d.ts.map +1 -1
  26. package/dist/api/parameters/index.js +30 -37
  27. package/dist/api/parameters/index.js.map +1 -1
  28. package/dist/api/users/index.d.ts +1221 -910
  29. package/dist/api/users/index.d.ts.map +1 -1
  30. package/dist/api/users/index.js +2556 -248
  31. package/dist/api/users/index.js.map +1 -1
  32. package/dist/api/verifications/index.d.ts +142 -136
  33. package/dist/api/verifications/index.d.ts.map +1 -1
  34. package/dist/api/verifications/index.js +12 -4
  35. package/dist/api/verifications/index.js.map +1 -1
  36. package/dist/batch/index.d.ts +142 -162
  37. package/dist/batch/index.d.ts.map +1 -1
  38. package/dist/batch/index.js +31 -44
  39. package/dist/batch/index.js.map +1 -1
  40. package/dist/bucket/index.d.ts +595 -171
  41. package/dist/bucket/index.d.ts.map +1 -1
  42. package/dist/bucket/index.js +1856 -12
  43. package/dist/bucket/index.js.map +1 -1
  44. package/dist/cache/core/index.d.ts +225 -53
  45. package/dist/cache/core/index.d.ts.map +1 -1
  46. package/dist/cache/core/index.js +213 -7
  47. package/dist/cache/core/index.js.map +1 -1
  48. package/dist/cache/redis/index.d.ts +1 -0
  49. package/dist/cache/redis/index.d.ts.map +1 -1
  50. package/dist/cache/redis/index.js +6 -2
  51. package/dist/cache/redis/index.js.map +1 -1
  52. package/dist/cli/index.d.ts +834 -226
  53. package/dist/cli/index.d.ts.map +1 -1
  54. package/dist/cli/index.js +2872 -417
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/command/index.d.ts +458 -310
  57. package/dist/command/index.d.ts.map +1 -1
  58. package/dist/command/index.js +2011 -76
  59. package/dist/command/index.js.map +1 -1
  60. package/dist/core/index.browser.js +309 -97
  61. package/dist/core/index.browser.js.map +1 -1
  62. package/dist/core/index.d.ts +796 -701
  63. package/dist/core/index.d.ts.map +1 -1
  64. package/dist/core/index.js +329 -97
  65. package/dist/core/index.js.map +1 -1
  66. package/dist/core/index.native.js +309 -97
  67. package/dist/core/index.native.js.map +1 -1
  68. package/dist/datetime/index.d.ts +59 -44
  69. package/dist/datetime/index.d.ts.map +1 -1
  70. package/dist/datetime/index.js +15 -0
  71. package/dist/datetime/index.js.map +1 -1
  72. package/dist/email/index.d.ts +314 -19
  73. package/dist/email/index.d.ts.map +1 -1
  74. package/dist/email/index.js +1852 -7
  75. package/dist/email/index.js.map +1 -1
  76. package/dist/fake/index.d.ts +5500 -5418
  77. package/dist/fake/index.d.ts.map +1 -1
  78. package/dist/fake/index.js +113 -42
  79. package/dist/fake/index.js.map +1 -1
  80. package/dist/lock/core/index.d.ts +219 -212
  81. package/dist/lock/core/index.d.ts.map +1 -1
  82. package/dist/lock/core/index.js +11 -4
  83. package/dist/lock/core/index.js.map +1 -1
  84. package/dist/lock/redis/index.d.ts.map +1 -1
  85. package/dist/logger/index.d.ts +41 -90
  86. package/dist/logger/index.d.ts.map +1 -1
  87. package/dist/logger/index.js +15 -68
  88. package/dist/logger/index.js.map +1 -1
  89. package/dist/mcp/index.d.ts +228 -230
  90. package/dist/mcp/index.d.ts.map +1 -1
  91. package/dist/mcp/index.js +32 -31
  92. package/dist/mcp/index.js.map +1 -1
  93. package/dist/orm/index.browser.js +12 -12
  94. package/dist/orm/index.browser.js.map +1 -1
  95. package/dist/orm/index.bun.js +90 -80
  96. package/dist/orm/index.bun.js.map +1 -1
  97. package/dist/orm/index.d.ts +1434 -1459
  98. package/dist/orm/index.d.ts.map +1 -1
  99. package/dist/orm/index.js +112 -130
  100. package/dist/orm/index.js.map +1 -1
  101. package/dist/queue/core/index.d.ts +262 -254
  102. package/dist/queue/core/index.d.ts.map +1 -1
  103. package/dist/queue/core/index.js +14 -6
  104. package/dist/queue/core/index.js.map +1 -1
  105. package/dist/queue/redis/index.d.ts.map +1 -1
  106. package/dist/react/auth/index.browser.js +108 -0
  107. package/dist/react/auth/index.browser.js.map +1 -0
  108. package/dist/react/auth/index.d.ts +100 -0
  109. package/dist/react/auth/index.d.ts.map +1 -0
  110. package/dist/react/auth/index.js +145 -0
  111. package/dist/react/auth/index.js.map +1 -0
  112. package/dist/react/core/index.d.ts +469 -0
  113. package/dist/react/core/index.d.ts.map +1 -0
  114. package/dist/react/core/index.js +464 -0
  115. package/dist/react/core/index.js.map +1 -0
  116. package/dist/react/form/index.d.ts +232 -0
  117. package/dist/react/form/index.d.ts.map +1 -0
  118. package/dist/react/form/index.js +432 -0
  119. package/dist/react/form/index.js.map +1 -0
  120. package/dist/react/head/index.browser.js +423 -0
  121. package/dist/react/head/index.browser.js.map +1 -0
  122. package/dist/react/head/index.d.ts +288 -0
  123. package/dist/react/head/index.d.ts.map +1 -0
  124. package/dist/react/head/index.js +465 -0
  125. package/dist/react/head/index.js.map +1 -0
  126. package/dist/react/i18n/index.d.ts +175 -0
  127. package/dist/react/i18n/index.d.ts.map +1 -0
  128. package/dist/react/i18n/index.js +224 -0
  129. package/dist/react/i18n/index.js.map +1 -0
  130. package/dist/react/router/index.browser.js +1980 -0
  131. package/dist/react/router/index.browser.js.map +1 -0
  132. package/dist/react/router/index.d.ts +2068 -0
  133. package/dist/react/router/index.d.ts.map +1 -0
  134. package/dist/react/router/index.js +4932 -0
  135. package/dist/react/router/index.js.map +1 -0
  136. package/dist/react/websocket/index.d.ts +117 -0
  137. package/dist/react/websocket/index.d.ts.map +1 -0
  138. package/dist/react/websocket/index.js +107 -0
  139. package/dist/react/websocket/index.js.map +1 -0
  140. package/dist/redis/index.bun.js +4 -0
  141. package/dist/redis/index.bun.js.map +1 -1
  142. package/dist/redis/index.d.ts +127 -130
  143. package/dist/redis/index.d.ts.map +1 -1
  144. package/dist/redis/index.js +16 -25
  145. package/dist/redis/index.js.map +1 -1
  146. package/dist/retry/index.d.ts +80 -71
  147. package/dist/retry/index.d.ts.map +1 -1
  148. package/dist/retry/index.js +11 -2
  149. package/dist/retry/index.js.map +1 -1
  150. package/dist/router/index.d.ts +6 -6
  151. package/dist/router/index.d.ts.map +1 -1
  152. package/dist/scheduler/index.d.ts +119 -28
  153. package/dist/scheduler/index.d.ts.map +1 -1
  154. package/dist/scheduler/index.js +404 -3
  155. package/dist/scheduler/index.js.map +1 -1
  156. package/dist/security/index.d.ts +642 -228
  157. package/dist/security/index.d.ts.map +1 -1
  158. package/dist/security/index.js +1579 -37
  159. package/dist/security/index.js.map +1 -1
  160. package/dist/server/auth/index.d.ts +1141 -111
  161. package/dist/server/auth/index.d.ts.map +1 -1
  162. package/dist/server/auth/index.js +1261 -25
  163. package/dist/server/auth/index.js.map +1 -1
  164. package/dist/server/cache/index.d.ts +63 -78
  165. package/dist/server/cache/index.d.ts.map +1 -1
  166. package/dist/server/cache/index.js +7 -22
  167. package/dist/server/cache/index.js.map +1 -1
  168. package/dist/server/compress/index.d.ts +13 -5
  169. package/dist/server/compress/index.d.ts.map +1 -1
  170. package/dist/server/compress/index.js +10 -2
  171. package/dist/server/compress/index.js.map +1 -1
  172. package/dist/server/cookies/index.d.ts +46 -22
  173. package/dist/server/cookies/index.d.ts.map +1 -1
  174. package/dist/server/cookies/index.js +7 -5
  175. package/dist/server/cookies/index.js.map +1 -1
  176. package/dist/server/core/index.d.ts +307 -196
  177. package/dist/server/core/index.d.ts.map +1 -1
  178. package/dist/server/core/index.js +271 -38
  179. package/dist/server/core/index.js.map +1 -1
  180. package/dist/server/cors/index.d.ts +24 -34
  181. package/dist/server/cors/index.d.ts.map +1 -1
  182. package/dist/server/cors/index.js +7 -21
  183. package/dist/server/cors/index.js.map +1 -1
  184. package/dist/server/health/index.d.ts +25 -19
  185. package/dist/server/health/index.d.ts.map +1 -1
  186. package/dist/server/health/index.js +8 -2
  187. package/dist/server/health/index.js.map +1 -1
  188. package/dist/server/helmet/index.d.ts +13 -5
  189. package/dist/server/helmet/index.d.ts.map +1 -1
  190. package/dist/server/helmet/index.js +11 -3
  191. package/dist/server/helmet/index.js.map +1 -1
  192. package/dist/server/links/index.browser.js +9 -1
  193. package/dist/server/links/index.browser.js.map +1 -1
  194. package/dist/server/links/index.d.ts +133 -128
  195. package/dist/server/links/index.d.ts.map +1 -1
  196. package/dist/server/links/index.js +24 -11
  197. package/dist/server/links/index.js.map +1 -1
  198. package/dist/server/metrics/index.d.ts +524 -4
  199. package/dist/server/metrics/index.d.ts.map +1 -1
  200. package/dist/server/metrics/index.js +4472 -7
  201. package/dist/server/metrics/index.js.map +1 -1
  202. package/dist/server/multipart/index.d.ts +15 -9
  203. package/dist/server/multipart/index.d.ts.map +1 -1
  204. package/dist/server/multipart/index.js +9 -3
  205. package/dist/server/multipart/index.js.map +1 -1
  206. package/dist/server/proxy/index.d.ts +110 -104
  207. package/dist/server/proxy/index.d.ts.map +1 -1
  208. package/dist/server/proxy/index.js +8 -2
  209. package/dist/server/proxy/index.js.map +1 -1
  210. package/dist/server/rate-limit/index.d.ts +46 -51
  211. package/dist/server/rate-limit/index.d.ts.map +1 -1
  212. package/dist/server/rate-limit/index.js +18 -55
  213. package/dist/server/rate-limit/index.js.map +1 -1
  214. package/dist/server/static/index.d.ts +181 -48
  215. package/dist/server/static/index.d.ts.map +1 -1
  216. package/dist/server/static/index.js +1848 -5
  217. package/dist/server/static/index.js.map +1 -1
  218. package/dist/server/swagger/index.d.ts +348 -53
  219. package/dist/server/swagger/index.d.ts.map +1 -1
  220. package/dist/server/swagger/index.js +1849 -6
  221. package/dist/server/swagger/index.js.map +1 -1
  222. package/dist/sms/index.d.ts +312 -18
  223. package/dist/sms/index.d.ts.map +1 -1
  224. package/dist/sms/index.js +1854 -10
  225. package/dist/sms/index.js.map +1 -1
  226. package/dist/system/index.browser.js +496 -0
  227. package/dist/system/index.browser.js.map +1 -0
  228. package/dist/system/index.d.ts +1158 -0
  229. package/dist/system/index.d.ts.map +1 -0
  230. package/dist/{file → system}/index.js +412 -20
  231. package/dist/system/index.js.map +1 -0
  232. package/dist/thread/index.d.ts +82 -73
  233. package/dist/thread/index.d.ts.map +1 -1
  234. package/dist/thread/index.js +13 -4
  235. package/dist/thread/index.js.map +1 -1
  236. package/dist/topic/core/index.d.ts +330 -323
  237. package/dist/topic/core/index.d.ts.map +1 -1
  238. package/dist/topic/core/index.js +12 -5
  239. package/dist/topic/core/index.js.map +1 -1
  240. package/dist/topic/redis/index.d.ts +6 -6
  241. package/dist/topic/redis/index.d.ts.map +1 -1
  242. package/dist/vite/index.d.ts +163 -5825
  243. package/dist/vite/index.d.ts.map +1 -1
  244. package/dist/vite/index.js +130 -477
  245. package/dist/vite/index.js.map +1 -1
  246. package/dist/websocket/index.browser.js +3 -3
  247. package/dist/websocket/index.browser.js.map +1 -1
  248. package/dist/websocket/index.d.ts +287 -283
  249. package/dist/websocket/index.d.ts.map +1 -1
  250. package/dist/websocket/index.js +15 -11
  251. package/dist/websocket/index.js.map +1 -1
  252. package/package.json +86 -17
  253. package/src/api/audits/index.ts +10 -33
  254. package/src/api/files/__tests__/$bucket.spec.ts +1 -1
  255. package/src/api/files/controllers/AdminFileStatsController.spec.ts +1 -1
  256. package/src/api/files/controllers/FileController.spec.ts +1 -1
  257. package/src/api/files/index.ts +10 -3
  258. package/src/api/files/jobs/FileJobs.spec.ts +1 -1
  259. package/src/api/files/services/FileService.spec.ts +1 -1
  260. package/src/api/jobs/index.ts +10 -3
  261. package/src/api/keys/controllers/AdminApiKeyController.ts +75 -0
  262. package/src/api/keys/controllers/ApiKeyController.ts +103 -0
  263. package/src/api/keys/entities/apiKeyEntity.ts +41 -0
  264. package/src/api/keys/index.ts +49 -0
  265. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +7 -0
  266. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +17 -0
  267. package/src/api/keys/schemas/createApiKeyBodySchema.ts +7 -0
  268. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +11 -0
  269. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +15 -0
  270. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +5 -0
  271. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +5 -0
  272. package/src/api/keys/services/ApiKeyService.spec.ts +553 -0
  273. package/src/api/keys/services/ApiKeyService.ts +306 -0
  274. package/src/api/logs/TODO.md +52 -0
  275. package/src/api/notifications/index.ts +10 -4
  276. package/src/api/parameters/index.ts +9 -30
  277. package/src/api/parameters/primitives/$config.ts +12 -4
  278. package/src/api/parameters/services/ConfigStore.ts +9 -3
  279. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +1035 -0
  280. package/src/api/users/__tests__/ApiKeys.spec.ts +401 -0
  281. package/src/api/users/index.ts +14 -3
  282. package/src/api/users/primitives/$realm.ts +33 -5
  283. package/src/api/users/providers/RealmProvider.ts +1 -12
  284. package/src/api/users/services/SessionService.ts +1 -11
  285. package/src/api/verifications/controllers/VerificationController.ts +2 -0
  286. package/src/api/verifications/index.ts +10 -4
  287. package/src/batch/index.ts +9 -36
  288. package/src/batch/primitives/$batch.ts +0 -8
  289. package/src/batch/providers/BatchProvider.ts +29 -2
  290. package/src/bucket/__tests__/shared.ts +1 -1
  291. package/src/bucket/index.ts +13 -6
  292. package/src/bucket/primitives/$bucket.ts +1 -1
  293. package/src/bucket/providers/LocalFileStorageProvider.ts +1 -1
  294. package/src/bucket/providers/MemoryFileStorageProvider.ts +1 -1
  295. package/src/cache/core/__tests__/shared.ts +30 -0
  296. package/src/cache/core/index.ts +11 -6
  297. package/src/cache/core/primitives/$cache.spec.ts +5 -0
  298. package/src/cache/core/providers/CacheProvider.ts +17 -0
  299. package/src/cache/core/providers/MemoryCacheProvider.ts +300 -1
  300. package/src/cache/redis/__tests__/cache-redis.spec.ts +5 -0
  301. package/src/cache/redis/providers/RedisCacheProvider.ts +9 -0
  302. package/src/cli/apps/AlephaCli.ts +3 -16
  303. package/src/cli/apps/AlephaPackageBuilderCli.ts +10 -2
  304. package/src/cli/atoms/appEntryOptions.ts +13 -0
  305. package/src/cli/atoms/buildOptions.ts +1 -1
  306. package/src/cli/atoms/changelogOptions.ts +1 -1
  307. package/src/cli/commands/build.ts +64 -52
  308. package/src/cli/commands/db.ts +17 -11
  309. package/src/cli/commands/deploy.ts +1 -1
  310. package/src/cli/commands/dev.ts +13 -49
  311. package/src/cli/commands/gen/env.ts +6 -3
  312. package/src/cli/commands/gen/openapi.ts +5 -2
  313. package/src/cli/commands/init.spec.ts +544 -0
  314. package/src/cli/commands/init.ts +101 -58
  315. package/src/cli/commands/lint.ts +8 -2
  316. package/src/cli/commands/typecheck.ts +11 -0
  317. package/src/cli/defineConfig.ts +9 -0
  318. package/src/cli/index.ts +2 -1
  319. package/src/cli/providers/AppEntryProvider.ts +131 -0
  320. package/src/cli/providers/ViteBuildProvider.ts +40 -0
  321. package/src/cli/providers/ViteDevServerProvider.ts +378 -0
  322. package/src/cli/services/AlephaCliUtils.ts +39 -93
  323. package/src/cli/services/PackageManagerUtils.ts +140 -17
  324. package/src/cli/services/ProjectScaffolder.ts +169 -101
  325. package/src/cli/services/ViteUtils.ts +82 -0
  326. package/src/cli/{assets/claudeMd.ts → templates/agentMd.ts} +41 -28
  327. package/src/cli/{assets → templates}/apiHelloControllerTs.ts +2 -1
  328. package/src/cli/{assets → templates}/biomeJson.ts +2 -1
  329. package/src/cli/{assets → templates}/dummySpecTs.ts +2 -1
  330. package/src/cli/{assets → templates}/editorconfig.ts +2 -1
  331. package/src/cli/templates/gitignore.ts +39 -0
  332. package/src/cli/{assets → templates}/mainBrowserTs.ts +2 -1
  333. package/src/cli/templates/mainCss.ts +33 -0
  334. package/src/cli/templates/mainServerTs.ts +33 -0
  335. package/src/cli/{assets → templates}/tsconfigJson.ts +2 -1
  336. package/src/cli/templates/webAppRouterTs.ts +50 -0
  337. package/src/cli/templates/webHelloComponentTsx.ts +20 -0
  338. package/src/command/helpers/Runner.spec.ts +4 -0
  339. package/src/command/helpers/Runner.ts +3 -21
  340. package/src/command/index.ts +12 -4
  341. package/src/command/providers/CliProvider.spec.ts +1067 -0
  342. package/src/command/providers/CliProvider.ts +203 -40
  343. package/src/core/Alepha.ts +3 -9
  344. package/src/core/__tests__/Alepha-start.spec.ts +4 -4
  345. package/src/core/helpers/jsonSchemaToTypeBox.spec.ts +771 -0
  346. package/src/core/helpers/jsonSchemaToTypeBox.ts +62 -10
  347. package/src/core/index.shared.ts +1 -0
  348. package/src/core/index.ts +20 -0
  349. package/src/core/primitives/$module.ts +12 -0
  350. package/src/core/providers/EventManager.spec.ts +0 -71
  351. package/src/core/providers/EventManager.ts +3 -15
  352. package/src/core/providers/Json.ts +2 -14
  353. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +257 -0
  354. package/src/core/providers/KeylessJsonSchemaCodec.ts +396 -14
  355. package/src/core/providers/SchemaValidator.spec.ts +236 -0
  356. package/src/datetime/index.ts +15 -0
  357. package/src/email/index.ts +10 -5
  358. package/src/email/providers/LocalEmailProvider.spec.ts +1 -1
  359. package/src/email/providers/LocalEmailProvider.ts +1 -1
  360. package/src/fake/__tests__/keyName.example.ts +1 -1
  361. package/src/fake/__tests__/keyName.spec.ts +5 -5
  362. package/src/fake/index.ts +9 -6
  363. package/src/fake/providers/FakeProvider.spec.ts +258 -40
  364. package/src/fake/providers/FakeProvider.ts +133 -19
  365. package/src/lock/core/index.ts +11 -4
  366. package/src/logger/index.ts +17 -66
  367. package/src/logger/providers/PrettyFormatterProvider.ts +0 -9
  368. package/src/mcp/errors/McpError.ts +30 -0
  369. package/src/mcp/index.ts +13 -27
  370. package/src/mcp/transports/SseMcpTransport.ts +6 -7
  371. package/src/orm/__tests__/PostgresProvider.spec.ts +2 -2
  372. package/src/orm/index.browser.ts +2 -2
  373. package/src/orm/index.bun.ts +4 -2
  374. package/src/orm/index.ts +21 -47
  375. package/src/orm/providers/DrizzleKitProvider.ts +3 -5
  376. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -0
  377. package/src/orm/services/Repository.ts +18 -3
  378. package/src/queue/core/index.ts +14 -6
  379. package/src/react/auth/__tests__/$auth.spec.ts +202 -0
  380. package/src/react/auth/hooks/useAuth.ts +32 -0
  381. package/src/react/auth/index.browser.ts +13 -0
  382. package/src/react/auth/index.shared.ts +2 -0
  383. package/src/react/auth/index.ts +48 -0
  384. package/src/react/auth/providers/ReactAuthProvider.ts +16 -0
  385. package/src/react/auth/services/ReactAuth.ts +135 -0
  386. package/src/react/core/__tests__/Router.spec.tsx +169 -0
  387. package/src/react/core/components/ClientOnly.tsx +49 -0
  388. package/src/react/core/components/ErrorBoundary.tsx +73 -0
  389. package/src/react/core/contexts/AlephaContext.ts +7 -0
  390. package/src/react/core/contexts/AlephaProvider.tsx +42 -0
  391. package/src/react/core/hooks/useAction.browser.spec.tsx +569 -0
  392. package/src/react/core/hooks/useAction.ts +480 -0
  393. package/src/react/core/hooks/useAlepha.ts +26 -0
  394. package/src/react/core/hooks/useClient.ts +17 -0
  395. package/src/react/core/hooks/useEvents.ts +51 -0
  396. package/src/react/core/hooks/useInject.ts +12 -0
  397. package/src/react/core/hooks/useStore.ts +52 -0
  398. package/src/react/core/index.ts +90 -0
  399. package/src/react/form/components/FormState.tsx +17 -0
  400. package/src/react/form/errors/FormValidationError.ts +18 -0
  401. package/src/react/form/hooks/useForm.browser.spec.tsx +366 -0
  402. package/src/react/form/hooks/useForm.ts +47 -0
  403. package/src/react/form/hooks/useFormState.ts +130 -0
  404. package/src/react/form/index.ts +44 -0
  405. package/src/react/form/services/FormModel.ts +614 -0
  406. package/src/react/head/helpers/SeoExpander.spec.ts +203 -0
  407. package/src/react/head/helpers/SeoExpander.ts +142 -0
  408. package/src/react/head/hooks/useHead.spec.tsx +288 -0
  409. package/src/react/head/hooks/useHead.ts +62 -0
  410. package/src/react/head/index.browser.ts +26 -0
  411. package/src/react/head/index.ts +44 -0
  412. package/src/react/head/interfaces/Head.ts +105 -0
  413. package/src/react/head/primitives/$head.ts +25 -0
  414. package/src/react/head/providers/BrowserHeadProvider.browser.spec.ts +196 -0
  415. package/src/react/head/providers/BrowserHeadProvider.ts +212 -0
  416. package/src/react/head/providers/HeadProvider.ts +168 -0
  417. package/src/react/head/providers/ServerHeadProvider.ts +31 -0
  418. package/src/react/i18n/__tests__/integration.spec.tsx +239 -0
  419. package/src/react/i18n/components/Localize.spec.tsx +357 -0
  420. package/src/react/i18n/components/Localize.tsx +35 -0
  421. package/src/react/i18n/hooks/useI18n.browser.spec.tsx +438 -0
  422. package/src/react/i18n/hooks/useI18n.ts +18 -0
  423. package/src/react/i18n/index.ts +41 -0
  424. package/src/react/i18n/primitives/$dictionary.ts +69 -0
  425. package/src/react/i18n/providers/I18nProvider.spec.ts +389 -0
  426. package/src/react/i18n/providers/I18nProvider.ts +278 -0
  427. package/src/react/router/__tests__/page-head-browser.browser.spec.ts +95 -0
  428. package/src/react/router/__tests__/page-head.spec.ts +48 -0
  429. package/src/react/router/__tests__/seo-head.spec.ts +125 -0
  430. package/src/react/router/atoms/ssrManifestAtom.ts +58 -0
  431. package/src/react/router/components/ErrorViewer.tsx +872 -0
  432. package/src/react/router/components/Link.tsx +23 -0
  433. package/src/react/router/components/NestedView.tsx +223 -0
  434. package/src/react/router/components/NotFound.tsx +30 -0
  435. package/src/react/router/constants/PAGE_PRELOAD_KEY.ts +6 -0
  436. package/src/react/router/contexts/RouterLayerContext.ts +12 -0
  437. package/src/react/router/errors/Redirection.ts +28 -0
  438. package/src/react/router/hooks/useActive.ts +52 -0
  439. package/src/react/router/hooks/useQueryParams.ts +63 -0
  440. package/src/react/router/hooks/useRouter.ts +20 -0
  441. package/src/react/router/hooks/useRouterState.ts +11 -0
  442. package/src/react/router/index.browser.ts +45 -0
  443. package/src/react/router/index.shared.ts +19 -0
  444. package/src/react/router/index.ts +142 -0
  445. package/src/react/router/primitives/$page.browser.spec.tsx +851 -0
  446. package/src/react/router/primitives/$page.spec.tsx +708 -0
  447. package/src/react/router/primitives/$page.ts +497 -0
  448. package/src/react/router/providers/ReactBrowserProvider.ts +309 -0
  449. package/src/react/router/providers/ReactBrowserRendererProvider.ts +25 -0
  450. package/src/react/router/providers/ReactBrowserRouterProvider.ts +168 -0
  451. package/src/react/router/providers/ReactPageProvider.ts +726 -0
  452. package/src/react/router/providers/ReactServerProvider.spec.tsx +316 -0
  453. package/src/react/router/providers/ReactServerProvider.ts +558 -0
  454. package/src/react/router/providers/ReactServerTemplateProvider.ts +979 -0
  455. package/src/react/router/providers/SSRManifestProvider.ts +334 -0
  456. package/src/react/router/services/ReactPageServerService.ts +48 -0
  457. package/src/react/router/services/ReactPageService.ts +27 -0
  458. package/src/react/router/services/ReactRouter.ts +262 -0
  459. package/src/react/websocket/hooks/useRoom.tsx +242 -0
  460. package/src/react/websocket/index.ts +7 -0
  461. package/src/redis/__tests__/redis.spec.ts +13 -0
  462. package/src/redis/index.ts +9 -25
  463. package/src/redis/providers/BunRedisProvider.ts +9 -0
  464. package/src/redis/providers/NodeRedisProvider.ts +8 -0
  465. package/src/redis/providers/RedisProvider.ts +16 -0
  466. package/src/retry/index.ts +11 -2
  467. package/src/router/index.ts +15 -0
  468. package/src/scheduler/index.ts +11 -2
  469. package/src/security/__tests__/BasicAuth.spec.ts +2 -0
  470. package/src/security/__tests__/ServerSecurityProvider.spec.ts +13 -5
  471. package/src/security/index.ts +15 -10
  472. package/src/security/interfaces/IssuerResolver.ts +27 -0
  473. package/src/security/primitives/$issuer.ts +55 -0
  474. package/src/security/providers/SecurityProvider.ts +179 -0
  475. package/src/security/providers/ServerBasicAuthProvider.ts +6 -2
  476. package/src/security/providers/ServerSecurityProvider.ts +36 -22
  477. package/src/server/auth/index.ts +12 -7
  478. package/src/server/cache/index.ts +7 -22
  479. package/src/server/compress/index.ts +10 -2
  480. package/src/server/cookies/index.ts +7 -5
  481. package/src/server/cookies/primitives/$cookie.ts +33 -11
  482. package/src/server/core/index.ts +17 -7
  483. package/src/server/core/interfaces/ServerRequest.ts +83 -1
  484. package/src/server/core/primitives/$action.spec.ts +1 -1
  485. package/src/server/core/primitives/$action.ts +8 -3
  486. package/src/server/core/providers/BunHttpServerProvider.ts +1 -1
  487. package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
  488. package/src/server/core/providers/NodeHttpServerProvider.ts +77 -22
  489. package/src/server/core/providers/ServerLoggerProvider.ts +2 -2
  490. package/src/server/core/providers/ServerProvider.ts +9 -12
  491. package/src/server/core/services/ServerRequestParser.spec.ts +520 -0
  492. package/src/server/core/services/ServerRequestParser.ts +306 -13
  493. package/src/server/cors/index.ts +7 -21
  494. package/src/server/cors/primitives/$cors.ts +6 -2
  495. package/src/server/health/index.ts +8 -2
  496. package/src/server/helmet/index.ts +11 -3
  497. package/src/server/links/atoms/apiLinksAtom.ts +7 -0
  498. package/src/server/links/index.browser.ts +2 -0
  499. package/src/server/links/index.ts +13 -6
  500. package/src/server/metrics/index.ts +10 -3
  501. package/src/server/multipart/index.ts +9 -3
  502. package/src/server/proxy/index.ts +8 -2
  503. package/src/server/rate-limit/index.ts +21 -25
  504. package/src/server/rate-limit/primitives/$rateLimit.ts +6 -2
  505. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +38 -14
  506. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +22 -56
  507. package/src/server/static/index.ts +8 -2
  508. package/src/server/static/providers/ServerStaticProvider.ts +1 -1
  509. package/src/server/swagger/index.ts +9 -4
  510. package/src/server/swagger/providers/ServerSwaggerProvider.ts +1 -1
  511. package/src/sms/index.ts +9 -5
  512. package/src/sms/providers/LocalSmsProvider.spec.ts +1 -1
  513. package/src/sms/providers/LocalSmsProvider.ts +1 -1
  514. package/src/system/index.browser.ts +11 -0
  515. package/src/system/index.ts +62 -0
  516. package/src/{file → system}/providers/FileSystemProvider.ts +16 -0
  517. package/src/{file → system}/providers/MemoryFileSystemProvider.ts +116 -3
  518. package/src/system/providers/MemoryShellProvider.ts +164 -0
  519. package/src/{file → system}/providers/NodeFileSystemProvider.spec.ts +2 -2
  520. package/src/{file → system}/providers/NodeFileSystemProvider.ts +36 -0
  521. package/src/system/providers/NodeShellProvider.ts +184 -0
  522. package/src/system/providers/ShellProvider.ts +74 -0
  523. package/src/{file → system}/services/FileDetector.spec.ts +2 -2
  524. package/src/thread/index.ts +11 -2
  525. package/src/topic/core/index.ts +12 -5
  526. package/src/vite/index.ts +3 -2
  527. package/src/vite/tasks/buildClient.ts +2 -8
  528. package/src/vite/tasks/buildServer.ts +84 -21
  529. package/src/vite/tasks/copyAssets.ts +5 -4
  530. package/src/vite/tasks/generateSitemap.ts +64 -23
  531. package/src/vite/tasks/index.ts +0 -2
  532. package/src/vite/tasks/prerenderPages.ts +49 -24
  533. package/src/websocket/index.ts +12 -8
  534. package/dist/file/index.d.ts +0 -839
  535. package/dist/file/index.d.ts.map +0 -1
  536. package/dist/file/index.js.map +0 -1
  537. package/src/cli/assets/indexHtml.ts +0 -15
  538. package/src/cli/assets/mainServerTs.ts +0 -24
  539. package/src/cli/assets/webAppRouterTs.ts +0 -15
  540. package/src/cli/assets/webHelloComponentTsx.ts +0 -16
  541. package/src/cli/commands/format.ts +0 -23
  542. package/src/file/index.ts +0 -43
  543. package/src/vite/helpers/boot.ts +0 -117
  544. package/src/vite/plugins/viteAlephaDev.ts +0 -177
  545. package/src/vite/tasks/devServer.ts +0 -71
  546. package/src/vite/tasks/runAlepha.ts +0 -270
  547. /package/dist/orm/{chunk-DtkW-qnP.js → chunk-DH6iiROE.js} +0 -0
  548. /package/src/cli/{assets → templates}/apiIndexTs.ts +0 -0
  549. /package/src/cli/{assets → templates}/webIndexTs.ts +0 -0
  550. /package/src/{file → system}/errors/FileError.ts +0 -0
  551. /package/src/{file → system}/services/FileDetector.ts +0 -0
@@ -259,6 +259,7 @@ const $module = (options) => {
259
259
  const $ = class extends Module {
260
260
  options = options;
261
261
  register(alepha) {
262
+ if (options.atoms) for (const atom of options.atoms) alepha.store.register(atom);
262
263
  if (typeof options.register === "function") {
263
264
  options.register(alepha);
264
265
  return;
@@ -357,12 +358,8 @@ var InjectPrimitive = class extends Primitive {};
357
358
  * Used across the codebase via dependency injection.
358
359
  */
359
360
  var Json = class {
360
- stringify(value, replacer, space) {
361
- return JSON.stringify(value, replacer, space);
362
- }
363
- parse(text, reviver) {
364
- return JSON.parse(text, reviver);
365
- }
361
+ stringify = JSON.stringify;
362
+ parse = JSON.parse;
366
363
  };
367
364
 
368
365
  //#endregion
@@ -395,6 +392,64 @@ var JsonSchemaCodec = class extends SchemaCodec {
395
392
  }
396
393
  };
397
394
 
395
+ //#endregion
396
+ //#region ../../src/core/primitives/$hook.ts
397
+ /**
398
+ * Registers a new hook.
399
+ *
400
+ * ```ts
401
+ * import { $hook } from "alepha";
402
+ *
403
+ * class MyProvider {
404
+ * onStart = $hook({
405
+ * name: "start", // or "configure", "ready", "stop", ...
406
+ * handler: async (app) => {
407
+ * // await db.connect(); ...
408
+ * }
409
+ * });
410
+ * }
411
+ * ```
412
+ *
413
+ * Hooks are used to run async functions from all registered providers/services.
414
+ *
415
+ * You can't register a hook after the App has started.
416
+ *
417
+ * It's used under the hood by the `configure`, `start`, and `stop` methods.
418
+ * Some modules also use hooks to run their own logic. (e.g. `alepha/server`).
419
+ *
420
+ * You can create your own hooks by using module augmentation:
421
+ *
422
+ * ```ts
423
+ * declare module "alepha" {
424
+ *
425
+ * interface Hooks {
426
+ * "my:custom:hook": {
427
+ * arg1: string;
428
+ * }
429
+ * }
430
+ * }
431
+ *
432
+ * await alepha.events.emit("my:custom:hook", { arg1: "value" });
433
+ * ```
434
+ *
435
+ */
436
+ const $hook = (options) => createPrimitive(HookPrimitive, options);
437
+ var HookPrimitive = class extends Primitive {
438
+ called = 0;
439
+ onInit() {
440
+ const handler = this.options.handler;
441
+ this.alepha.events.on(this.options.on, {
442
+ caller: this.config.service,
443
+ priority: this.options.priority,
444
+ callback: (args) => {
445
+ this.called += 1;
446
+ return handler(args);
447
+ }
448
+ });
449
+ }
450
+ };
451
+ $hook[KIND] = HookPrimitive;
452
+
398
453
  //#endregion
399
454
  //#region ../../src/core/helpers/FileLike.ts
400
455
  const isTypeFile = (value) => {
@@ -831,22 +886,49 @@ const t = new TypeProvider();
831
886
 
832
887
  //#endregion
833
888
  //#region ../../src/core/providers/KeylessJsonSchemaCodec.ts
889
+ const UNSAFE_KEYS = new Set([
890
+ "__proto__",
891
+ "constructor",
892
+ "prototype"
893
+ ]);
834
894
  /**
835
895
  * KeylessJsonSchemaCodec provides schema-driven JSON encoding without keys.
836
896
  *
837
897
  * It uses the schema to determine field order, allowing the encoded output
838
898
  * to be a simple JSON array instead of an object with keys.
839
- *
840
- * Performance characteristics:
841
- * - Encode: 0.94-1.53x vs JSON.stringify (faster for complex objects)
842
- * - Decode: 1.76-2.00x vs JSON.parse
843
- * - Size: 50-56% smaller than JSON
844
899
  */
845
900
  var KeylessJsonSchemaCodec = class extends SchemaCodec {
846
901
  cache = /* @__PURE__ */ new Map();
847
- encoder = new TextEncoder();
848
- decoder = new TextDecoder();
902
+ textEncoder = new TextEncoder();
903
+ textDecoder = new TextDecoder();
849
904
  varCounter = 0;
905
+ useFunctionCompilation = true;
906
+ maxArrayLength = 1e4;
907
+ maxStringLength = 1e6;
908
+ maxDepth = 50;
909
+ /**
910
+ * Configure codec options.
911
+ */
912
+ configure(options) {
913
+ if (options.useFunctionCompilation !== void 0) {
914
+ this.useFunctionCompilation = options.useFunctionCompilation;
915
+ this.cache.clear();
916
+ }
917
+ if (options.maxArrayLength !== void 0) this.maxArrayLength = options.maxArrayLength;
918
+ if (options.maxStringLength !== void 0) this.maxStringLength = options.maxStringLength;
919
+ if (options.maxDepth !== void 0) this.maxDepth = options.maxDepth;
920
+ return this;
921
+ }
922
+ /**
923
+ * Hook to auto-detect safe mode on configure.
924
+ * Disables function compilation in browser by default.
925
+ */
926
+ onConfigure = $hook({
927
+ on: "configure",
928
+ handler: () => {
929
+ this.useFunctionCompilation = this.canUseFunction();
930
+ }
931
+ });
850
932
  /**
851
933
  * Encode value to a keyless JSON string.
852
934
  */
@@ -857,14 +939,14 @@ var KeylessJsonSchemaCodec = class extends SchemaCodec {
857
939
  * Encode value to binary (UTF-8 encoded keyless JSON).
858
940
  */
859
941
  encodeToBinary(schema, value) {
860
- return this.encoder.encode(this.encodeToString(schema, value));
942
+ return this.textEncoder.encode(this.encodeToString(schema, value));
861
943
  }
862
944
  /**
863
945
  * Decode keyless JSON string or binary to value.
864
946
  */
865
947
  decode(schema, value) {
866
948
  if (value instanceof Uint8Array) {
867
- const text = this.decoder.decode(value);
949
+ const text = this.textDecoder.decode(value);
868
950
  return this.getCodec(schema).decode(text);
869
951
  }
870
952
  if (typeof value === "string") return this.getCodec(schema).decode(value);
@@ -872,13 +954,54 @@ var KeylessJsonSchemaCodec = class extends SchemaCodec {
872
954
  return value;
873
955
  }
874
956
  /**
957
+ * Test if `new Function()` is available (not blocked by CSP).
958
+ */
959
+ canUseFunction() {
960
+ try {
961
+ return new Function("return true")() === true;
962
+ } catch {
963
+ return false;
964
+ }
965
+ }
966
+ /**
967
+ * Validate schema keys for prototype pollution.
968
+ * Uses a visited set to avoid infinite recursion on recursive schemas.
969
+ */
970
+ validateSchemaKeys(schema, depth = 0, visited = /* @__PURE__ */ new Set()) {
971
+ if (visited.has(schema)) return;
972
+ visited.add(schema);
973
+ if (depth > this.maxDepth) throw new AlephaError(`Schema depth exceeds maximum allowed (${this.maxDepth})`);
974
+ if (t.schema.isObject(schema)) {
975
+ const props = schema.properties;
976
+ for (const key of Object.keys(props)) {
977
+ if (UNSAFE_KEYS.has(key)) throw new AlephaError(`Unsafe schema key "${key}" detected. This key is blocked to prevent prototype pollution.`);
978
+ this.validateSchemaKeys(props[key], depth + 1, visited);
979
+ }
980
+ } else if (t.schema.isArray(schema)) {
981
+ const arrSchema = schema;
982
+ this.validateSchemaKeys(arrSchema.items, depth + 1, visited);
983
+ } else if (t.schema.isUnion(schema) || t.schema.isOptional(schema)) this.validateSchemaKeys(this.unwrap(schema), depth, visited);
984
+ }
985
+ /**
986
+ * Validate array length.
987
+ */
988
+ validateArrayLength(arr) {
989
+ if (arr.length > this.maxArrayLength) throw new AlephaError(`Array length (${arr.length}) exceeds maximum allowed (${this.maxArrayLength})`);
990
+ }
991
+ /**
992
+ * Validate string length.
993
+ */
994
+ validateStringLength(str) {
995
+ if (str.length > this.maxStringLength) throw new AlephaError(`String length (${str.length}) exceeds maximum allowed (${this.maxStringLength})`);
996
+ }
997
+ /**
875
998
  * Get a compiled codec for the given schema.
876
999
  * Codecs are cached for reuse.
877
1000
  */
878
1001
  getCodec(schema) {
879
1002
  let c = this.cache.get(schema);
880
1003
  if (!c) {
881
- c = this.compile(schema);
1004
+ c = this.useFunctionCompilation ? this.compileWithFunction(schema) : this.compileInterpreted(schema);
882
1005
  this.cache.set(schema, c);
883
1006
  }
884
1007
  return c;
@@ -886,7 +1009,11 @@ var KeylessJsonSchemaCodec = class extends SchemaCodec {
886
1009
  nextVar() {
887
1010
  return `_${this.varCounter++}`;
888
1011
  }
889
- compile(schema) {
1012
+ /**
1013
+ * Compile codec using `new Function()` for maximum performance.
1014
+ * Only used when CSP allows and useFunctionCompilation is true.
1015
+ */
1016
+ compileWithFunction(schema) {
890
1017
  this.varCounter = 0;
891
1018
  const encBody = this.genEnc(schema, "v");
892
1019
  this.varCounter = 0;
@@ -896,6 +1023,122 @@ var KeylessJsonSchemaCodec = class extends SchemaCodec {
896
1023
  decode: new Function("s", `const a=JSON.parse(s);let i=0;${decBody.code}return ${decBody.result};`)
897
1024
  };
898
1025
  }
1026
+ /**
1027
+ * Compile codec using interpreter-based approach.
1028
+ * Safer (no eval/Function) but slower. Used in browser by default.
1029
+ */
1030
+ compileInterpreted(schema) {
1031
+ const self = this;
1032
+ return {
1033
+ encode(value) {
1034
+ return JSON.stringify(self.interpretEncode(schema, value));
1035
+ },
1036
+ decode(str) {
1037
+ const ctx = {
1038
+ arr: JSON.parse(str),
1039
+ i: 0
1040
+ };
1041
+ return self.interpretDecode(schema, ctx);
1042
+ }
1043
+ };
1044
+ }
1045
+ interpretEncode(schema, value) {
1046
+ if (t.schema.isString(schema) || t.schema.isNumber(schema) || t.schema.isInteger(schema) || t.schema.isBoolean(schema) || this.isEnum(schema)) return value;
1047
+ if (t.schema.isBigInt(schema)) return `${value}n`;
1048
+ if (t.schema.isArray(schema)) {
1049
+ const arrSchema = schema;
1050
+ if (!Array.isArray(value)) return value;
1051
+ if (t.schema.isString(arrSchema.items) || t.schema.isNumber(arrSchema.items) || t.schema.isInteger(arrSchema.items) || t.schema.isBoolean(arrSchema.items)) return value;
1052
+ return value.map((e) => this.interpretEncode(arrSchema.items, e));
1053
+ }
1054
+ if (t.schema.isObject(schema)) {
1055
+ const objSchema = schema;
1056
+ const props = objSchema.properties;
1057
+ const keys = Object.keys(props);
1058
+ const req = new Set(objSchema.required || []);
1059
+ const result = [];
1060
+ for (const k of keys) {
1061
+ const ps = props[k];
1062
+ const isOpt = !req.has(k) || t.schema.isOptional(ps);
1063
+ const isNullable = this.isNullable(ps);
1064
+ const inner = this.unwrap(ps);
1065
+ const v = value[k];
1066
+ if (isOpt) result.push(v !== void 0 ? this.interpretEncode(inner, v) : null);
1067
+ else if (isNullable) result.push(v !== null ? this.interpretEncode(inner, v) : null);
1068
+ else result.push(this.interpretEncode(inner, v));
1069
+ }
1070
+ return result;
1071
+ }
1072
+ if (t.schema.isOptional(schema) || t.schema.isUnion(schema)) {
1073
+ const inner = this.unwrap(schema);
1074
+ if (this.isNullable(schema)) return value !== null ? this.interpretEncode(inner, value) : null;
1075
+ return value !== void 0 ? this.interpretEncode(inner, value) : null;
1076
+ }
1077
+ return value;
1078
+ }
1079
+ interpretDecode(schema, ctx) {
1080
+ if (t.schema.isString(schema) || t.schema.isNumber(schema) || t.schema.isInteger(schema) || t.schema.isBoolean(schema) || this.isEnum(schema)) return ctx.arr[ctx.i++];
1081
+ if (t.schema.isBigInt(schema)) return BigInt(ctx.arr[ctx.i++].slice(0, -1));
1082
+ if (t.schema.isArray(schema)) {
1083
+ const arrSchema = schema;
1084
+ const arr = ctx.arr[ctx.i++];
1085
+ if (!Array.isArray(arr)) return arr;
1086
+ if (t.schema.isObject(arrSchema.items)) return arr.map((e) => this.interpretDecodeFromValue(arrSchema.items, e));
1087
+ return arr;
1088
+ }
1089
+ if (t.schema.isObject(schema)) {
1090
+ const objSchema = schema;
1091
+ const props = objSchema.properties;
1092
+ const keys = Object.keys(props);
1093
+ const req = new Set(objSchema.required || []);
1094
+ const result = {};
1095
+ for (const k of keys) {
1096
+ const ps = props[k];
1097
+ const isOpt = !req.has(k) || t.schema.isOptional(ps);
1098
+ const isNullable = this.isNullable(ps);
1099
+ const inner = this.unwrap(ps);
1100
+ const val = ctx.arr[ctx.i++];
1101
+ if (isOpt) {
1102
+ if (val !== null) result[k] = this.interpretDecodeFromValue(inner, val);
1103
+ } else if (isNullable) result[k] = val === null ? null : this.interpretDecodeFromValue(inner, val);
1104
+ else result[k] = this.interpretDecodeFromValue(inner, val);
1105
+ }
1106
+ return result;
1107
+ }
1108
+ if (t.schema.isOptional(schema) || t.schema.isUnion(schema)) {
1109
+ const inner = this.unwrap(schema);
1110
+ const val = ctx.arr[ctx.i++];
1111
+ if (val === null) return this.isNullable(schema) ? null : void 0;
1112
+ if (t.schema.isObject(inner) || t.schema.isArray(inner)) return this.interpretDecodeFromValue(inner, val);
1113
+ return val;
1114
+ }
1115
+ return ctx.arr[ctx.i++];
1116
+ }
1117
+ interpretDecodeFromValue(schema, value) {
1118
+ if (t.schema.isString(schema) || t.schema.isNumber(schema) || t.schema.isInteger(schema) || t.schema.isBoolean(schema) || this.isEnum(schema)) return value;
1119
+ if (t.schema.isBigInt(schema)) return BigInt(value.slice(0, -1));
1120
+ if (t.schema.isArray(schema)) {
1121
+ if (!Array.isArray(value)) return value;
1122
+ const arrSchema = schema;
1123
+ if (t.schema.isObject(arrSchema.items)) return value.map((e) => this.interpretDecodeFromValue(arrSchema.items, e));
1124
+ return value;
1125
+ }
1126
+ if (t.schema.isObject(schema)) {
1127
+ const props = schema.properties;
1128
+ const keys = Object.keys(props);
1129
+ const result = {};
1130
+ for (let idx = 0; idx < keys.length; idx++) {
1131
+ const k = keys[idx];
1132
+ const inner = this.unwrap(props[k]);
1133
+ const v = value[idx];
1134
+ if (t.schema.isObject(inner)) result[k] = this.interpretDecodeFromValue(inner, v);
1135
+ else if (t.schema.isBigInt(inner)) result[k] = BigInt(v.slice(0, -1));
1136
+ else result[k] = v;
1137
+ }
1138
+ return result;
1139
+ }
1140
+ return value;
1141
+ }
899
1142
  genEnc(schema, ve) {
900
1143
  if (t.schema.isString(schema) || t.schema.isNumber(schema) || t.schema.isInteger(schema) || t.schema.isBoolean(schema) || this.isEnum(schema)) return ve;
901
1144
  if (t.schema.isBigInt(schema)) return `${ve}+'n'`;
@@ -1087,64 +1330,6 @@ var TypeBoxError = class extends AlephaError {
1087
1330
  }
1088
1331
  };
1089
1332
 
1090
- //#endregion
1091
- //#region ../../src/core/primitives/$hook.ts
1092
- /**
1093
- * Registers a new hook.
1094
- *
1095
- * ```ts
1096
- * import { $hook } from "alepha";
1097
- *
1098
- * class MyProvider {
1099
- * onStart = $hook({
1100
- * name: "start", // or "configure", "ready", "stop", ...
1101
- * handler: async (app) => {
1102
- * // await db.connect(); ...
1103
- * }
1104
- * });
1105
- * }
1106
- * ```
1107
- *
1108
- * Hooks are used to run async functions from all registered providers/services.
1109
- *
1110
- * You can't register a hook after the App has started.
1111
- *
1112
- * It's used under the hood by the `configure`, `start`, and `stop` methods.
1113
- * Some modules also use hooks to run their own logic. (e.g. `alepha/server`).
1114
- *
1115
- * You can create your own hooks by using module augmentation:
1116
- *
1117
- * ```ts
1118
- * declare module "alepha" {
1119
- *
1120
- * interface Hooks {
1121
- * "my:custom:hook": {
1122
- * arg1: string;
1123
- * }
1124
- * }
1125
- * }
1126
- *
1127
- * await alepha.events.emit("my:custom:hook", { arg1: "value" });
1128
- * ```
1129
- *
1130
- */
1131
- const $hook = (options) => createPrimitive(HookPrimitive, options);
1132
- var HookPrimitive = class extends Primitive {
1133
- called = 0;
1134
- onInit() {
1135
- const handler = this.options.handler;
1136
- this.alepha.events.on(this.options.on, {
1137
- caller: this.config.service,
1138
- priority: this.options.priority,
1139
- callback: (args) => {
1140
- this.called += 1;
1141
- return handler(args);
1142
- }
1143
- });
1144
- }
1145
- };
1146
- $hook[KIND] = HookPrimitive;
1147
-
1148
1333
  //#endregion
1149
1334
  //#region ../../src/core/providers/SchemaValidator.ts
1150
1335
  var SchemaValidator = class {
@@ -1400,7 +1585,7 @@ var EventManager = class {
1400
1585
  async emit(func, payload, options = {}) {
1401
1586
  const events = this.events[func];
1402
1587
  if (!events || events.length === 0) return;
1403
- if (events.length === 1 && !options.log && !options.reverse) {
1588
+ if (events.length === 1 && !options.log) {
1404
1589
  const hook = events[0];
1405
1590
  try {
1406
1591
  const result = hook.callback(payload);
@@ -1419,9 +1604,7 @@ var EventManager = class {
1419
1604
  ctx.now = performance.now();
1420
1605
  this.log?.trace(`${String(func)} ...`);
1421
1606
  }
1422
- let eventList = events;
1423
- if (options.reverse) eventList = events.toReversed();
1424
- for (const hook of eventList) {
1607
+ for (const hook of events) {
1425
1608
  const name = hook.caller?.name ?? "unknown";
1426
1609
  if (options.log) {
1427
1610
  ctx.now2 = performance.now();
@@ -1724,13 +1907,10 @@ var Alepha = class Alepha {
1724
1907
  * If you are not interested about these helpers, you can use the constructor directly.
1725
1908
  */
1726
1909
  static create(state = {}) {
1727
- if (typeof process === "object" && typeof process.env === "object") {
1728
- state.env = {
1729
- ...state.env,
1730
- ...process.env
1731
- };
1732
- for (const key in state.env) if (state.env[key] === "") delete state.env[key];
1733
- }
1910
+ if (typeof process === "object" && typeof process.env === "object") state.env = {
1911
+ ...state.env,
1912
+ ...process.env
1913
+ };
1734
1914
  const alepha = new Alepha(state);
1735
1915
  if (alepha.isTest()) {
1736
1916
  const g = globalThis;
@@ -1985,10 +2165,7 @@ var Alepha = class Alepha {
1985
2165
  async stop() {
1986
2166
  if (!this.started) return;
1987
2167
  this.log?.info("Stopping App...");
1988
- await this.events.emit("stop", this, {
1989
- reverse: true,
1990
- log: true
1991
- });
2168
+ await this.events.emit("stop", this, { log: true });
1992
2169
  this.log?.info("App is now off");
1993
2170
  this.started = false;
1994
2171
  this.ready = false;
@@ -2088,7 +2265,10 @@ var Alepha = class Alepha {
2088
2265
  if (!match.parents.includes(parent) && parent !== service) match.parents.push(parent);
2089
2266
  return match.instance;
2090
2267
  }
2091
- if (this.started) throw new ContainerLockedError(`Container is locked. No more services can be added. ${parent?.name} -> ${service.name}`);
2268
+ if (this.started) {
2269
+ const mod = service[MODULE]?.name;
2270
+ throw new ContainerLockedError(`Container is locked. No more services can be added. Attempted to inject '${service.name}' from '${parent?.name}'. ${mod ? `Module '${mod}' is not registered ?` : ""}`);
2271
+ }
2092
2272
  }
2093
2273
  const module = service[MODULE];
2094
2274
  if (module && typeof module === "function") this.with(module);
@@ -2104,10 +2284,10 @@ var Alepha = class Alepha {
2104
2284
  if (!transient) registry.set(service, definition);
2105
2285
  if (instance instanceof Module) {
2106
2286
  this.modules.push(instance);
2107
- const parent$1 = __alephaRef.parent;
2287
+ const parent = __alephaRef.parent;
2108
2288
  __alephaRef.parent = instance.constructor;
2109
2289
  instance.register(this);
2110
- __alephaRef.parent = parent$1;
2290
+ __alephaRef.parent = parent;
2111
2291
  }
2112
2292
  return instance;
2113
2293
  }
@@ -2319,11 +2499,13 @@ function createPagination(entities, limit = 10, offset = 0, sort) {
2319
2499
  * - Nested objects with required/optional properties
2320
2500
  * - Arrays with item schemas
2321
2501
  * - Common validation options: minLength, maxLength, minimum, maximum, pattern
2502
+ * - anyOf/oneOf/allOf with nullable patterns (e.g., `anyOf: [type, null]` → `t.nullable(type)`)
2503
+ * - Alepha ~options (trim, lowercase) pass-through
2322
2504
  *
2323
2505
  * **Not supported:**
2324
- * - oneOf, anyOf, allOf, not (composition schemas)
2325
2506
  * - $ref (references)
2326
2507
  * - additionalProperties, patternProperties
2508
+ * - Complex composition schemas (multiple non-null types in anyOf/oneOf/allOf)
2327
2509
  *
2328
2510
  * @param schema - JSON Schema object to convert
2329
2511
  * @returns TypeBox TSchema
@@ -2350,7 +2532,6 @@ function createPagination(entities, limit = 10, offset = 0, sort) {
2350
2532
  * ```
2351
2533
  */
2352
2534
  function jsonSchemaToTypeBox(schema) {
2353
- if (schema["~kind"]) return schema;
2354
2535
  if (schema.const !== void 0) return t.const(schema.const);
2355
2536
  if (schema.enum && Array.isArray(schema.enum)) {
2356
2537
  if (schema.enum.every((v) => typeof v === "string")) return t.enum(schema.enum, filterUndefined({
@@ -2360,6 +2541,33 @@ function jsonSchemaToTypeBox(schema) {
2360
2541
  }));
2361
2542
  return t.union(schema.enum.map((v) => t.const(v)));
2362
2543
  }
2544
+ if (schema.anyOf && Array.isArray(schema.anyOf)) {
2545
+ const nullSchema = schema.anyOf.find((s) => s.type === "null");
2546
+ const nonNullSchemas = schema.anyOf.filter((s) => s.type !== "null");
2547
+ if (nullSchema && nonNullSchemas.length === 1) {
2548
+ const converted = jsonSchemaToTypeBox(nonNullSchemas[0]);
2549
+ return t.nullable(converted);
2550
+ }
2551
+ return t.union(schema.anyOf.map((s) => jsonSchemaToTypeBox(s)));
2552
+ }
2553
+ if (schema.allOf && Array.isArray(schema.allOf)) {
2554
+ const nullSchema = schema.allOf.find((s) => s.type === "null");
2555
+ const nonNullSchemas = schema.allOf.filter((s) => s.type !== "null");
2556
+ if (nullSchema && nonNullSchemas.length === 1) {
2557
+ const converted = jsonSchemaToTypeBox(nonNullSchemas[0]);
2558
+ return t.nullable(converted);
2559
+ }
2560
+ if (nonNullSchemas.length > 0) return jsonSchemaToTypeBox(nonNullSchemas[0]);
2561
+ }
2562
+ if (schema.oneOf && Array.isArray(schema.oneOf)) {
2563
+ const nullSchema = schema.oneOf.find((s) => s.type === "null");
2564
+ const nonNullSchemas = schema.oneOf.filter((s) => s.type !== "null");
2565
+ if (nullSchema && nonNullSchemas.length === 1) {
2566
+ const converted = jsonSchemaToTypeBox(nonNullSchemas[0]);
2567
+ return t.nullable(converted);
2568
+ }
2569
+ return t.union(schema.oneOf.map((s) => jsonSchemaToTypeBox(s)));
2570
+ }
2363
2571
  switch (Array.isArray(schema.type) ? schema.type[0] : schema.type) {
2364
2572
  case "string": return convertString(schema);
2365
2573
  case "number": return convertNumber(schema);
@@ -2383,7 +2591,7 @@ function filterUndefined(obj) {
2383
2591
  * Convert JSON Schema string type to TypeBox.
2384
2592
  */
2385
2593
  function convertString(schema) {
2386
- const options = filterUndefined({
2594
+ const baseOptions = filterUndefined({
2387
2595
  title: schema.title,
2388
2596
  description: schema.description,
2389
2597
  default: schema.default,
@@ -2391,6 +2599,10 @@ function convertString(schema) {
2391
2599
  maxLength: schema.maxLength,
2392
2600
  pattern: schema.pattern
2393
2601
  });
2602
+ const options = schema["~options"] ? {
2603
+ ...baseOptions,
2604
+ "~options": schema["~options"]
2605
+ } : baseOptions;
2394
2606
  switch (schema.format) {
2395
2607
  case "email": return t.email(options);
2396
2608
  case "uuid": return t.uuid(options);
@@ -2648,5 +2860,5 @@ const run = (entry, opts) => {
2648
2860
  };
2649
2861
 
2650
2862
  //#endregion
2651
- export { $atom, $context, $env, $hook, $inject, $module, $use, Alepha, AlephaError, AlsProvider, AppNotStartedError, Atom, CircularDependencyError, CodecManager, ContainerLockedError, EventManager, Format, HookPrimitive, InjectPrimitive, JsonSchemaCodec, KIND, KeylessJsonSchemaCodec, Module, OPTIONS, Primitive, SchemaCodec, StateManager, TooLateSubstitutionError, Type, TypeBoxError, TypeGuard, TypeProvider, Value, createPagination, createPrimitive, isClass, isFileLike, isTypeFile, isUUID, jsonSchemaToTypeBox, pageMetadataSchema, pageQuerySchema, pageSchema, run, t };
2863
+ export { $atom, $context, $env, $hook, $inject, $module, $use, Alepha, AlephaError, AlsProvider, AppNotStartedError, Atom, CircularDependencyError, CodecManager, ContainerLockedError, EventManager, Format, HookPrimitive, InjectPrimitive, Json, JsonSchemaCodec, KIND, KeylessJsonSchemaCodec, Module, OPTIONS, Primitive, SchemaCodec, StateManager, TooLateSubstitutionError, Type, TypeBoxError, TypeGuard, TypeProvider, Value, createPagination, createPrimitive, isClass, isFileLike, isTypeFile, isUUID, jsonSchemaToTypeBox, pageMetadataSchema, pageQuerySchema, pageSchema, run, t };
2652
2864
  //# sourceMappingURL=index.browser.js.map