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
  if (process.env.NODE_ENV === "production") {
1735
1915
  state.env ??= {};
1736
1916
  Object.assign(state.env, { NODE_ENV: "production" });
@@ -1989,10 +2169,7 @@ var Alepha = class Alepha {
1989
2169
  async stop() {
1990
2170
  if (!this.started) return;
1991
2171
  this.log?.info("Stopping App...");
1992
- await this.events.emit("stop", this, {
1993
- reverse: true,
1994
- log: true
1995
- });
2172
+ await this.events.emit("stop", this, { log: true });
1996
2173
  this.log?.info("App is now off");
1997
2174
  this.started = false;
1998
2175
  this.ready = false;
@@ -2092,7 +2269,10 @@ var Alepha = class Alepha {
2092
2269
  if (!match.parents.includes(parent) && parent !== service) match.parents.push(parent);
2093
2270
  return match.instance;
2094
2271
  }
2095
- if (this.started) throw new ContainerLockedError(`Container is locked. No more services can be added. ${parent?.name} -> ${service.name}`);
2272
+ if (this.started) {
2273
+ const mod = service[MODULE]?.name;
2274
+ 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 ?` : ""}`);
2275
+ }
2096
2276
  }
2097
2277
  const module = service[MODULE];
2098
2278
  if (module && typeof module === "function") this.with(module);
@@ -2108,10 +2288,10 @@ var Alepha = class Alepha {
2108
2288
  if (!transient) registry.set(service, definition);
2109
2289
  if (instance instanceof Module) {
2110
2290
  this.modules.push(instance);
2111
- const parent$1 = __alephaRef.parent;
2291
+ const parent = __alephaRef.parent;
2112
2292
  __alephaRef.parent = instance.constructor;
2113
2293
  instance.register(this);
2114
- __alephaRef.parent = parent$1;
2294
+ __alephaRef.parent = parent;
2115
2295
  }
2116
2296
  return instance;
2117
2297
  }
@@ -2323,11 +2503,13 @@ function createPagination(entities, limit = 10, offset = 0, sort) {
2323
2503
  * - Nested objects with required/optional properties
2324
2504
  * - Arrays with item schemas
2325
2505
  * - Common validation options: minLength, maxLength, minimum, maximum, pattern
2506
+ * - anyOf/oneOf/allOf with nullable patterns (e.g., `anyOf: [type, null]` → `t.nullable(type)`)
2507
+ * - Alepha ~options (trim, lowercase) pass-through
2326
2508
  *
2327
2509
  * **Not supported:**
2328
- * - oneOf, anyOf, allOf, not (composition schemas)
2329
2510
  * - $ref (references)
2330
2511
  * - additionalProperties, patternProperties
2512
+ * - Complex composition schemas (multiple non-null types in anyOf/oneOf/allOf)
2331
2513
  *
2332
2514
  * @param schema - JSON Schema object to convert
2333
2515
  * @returns TypeBox TSchema
@@ -2354,7 +2536,6 @@ function createPagination(entities, limit = 10, offset = 0, sort) {
2354
2536
  * ```
2355
2537
  */
2356
2538
  function jsonSchemaToTypeBox(schema) {
2357
- if (schema["~kind"]) return schema;
2358
2539
  if (schema.const !== void 0) return t.const(schema.const);
2359
2540
  if (schema.enum && Array.isArray(schema.enum)) {
2360
2541
  if (schema.enum.every((v) => typeof v === "string")) return t.enum(schema.enum, filterUndefined({
@@ -2364,6 +2545,33 @@ function jsonSchemaToTypeBox(schema) {
2364
2545
  }));
2365
2546
  return t.union(schema.enum.map((v) => t.const(v)));
2366
2547
  }
2548
+ if (schema.anyOf && Array.isArray(schema.anyOf)) {
2549
+ const nullSchema = schema.anyOf.find((s) => s.type === "null");
2550
+ const nonNullSchemas = schema.anyOf.filter((s) => s.type !== "null");
2551
+ if (nullSchema && nonNullSchemas.length === 1) {
2552
+ const converted = jsonSchemaToTypeBox(nonNullSchemas[0]);
2553
+ return t.nullable(converted);
2554
+ }
2555
+ return t.union(schema.anyOf.map((s) => jsonSchemaToTypeBox(s)));
2556
+ }
2557
+ if (schema.allOf && Array.isArray(schema.allOf)) {
2558
+ const nullSchema = schema.allOf.find((s) => s.type === "null");
2559
+ const nonNullSchemas = schema.allOf.filter((s) => s.type !== "null");
2560
+ if (nullSchema && nonNullSchemas.length === 1) {
2561
+ const converted = jsonSchemaToTypeBox(nonNullSchemas[0]);
2562
+ return t.nullable(converted);
2563
+ }
2564
+ if (nonNullSchemas.length > 0) return jsonSchemaToTypeBox(nonNullSchemas[0]);
2565
+ }
2566
+ if (schema.oneOf && Array.isArray(schema.oneOf)) {
2567
+ const nullSchema = schema.oneOf.find((s) => s.type === "null");
2568
+ const nonNullSchemas = schema.oneOf.filter((s) => s.type !== "null");
2569
+ if (nullSchema && nonNullSchemas.length === 1) {
2570
+ const converted = jsonSchemaToTypeBox(nonNullSchemas[0]);
2571
+ return t.nullable(converted);
2572
+ }
2573
+ return t.union(schema.oneOf.map((s) => jsonSchemaToTypeBox(s)));
2574
+ }
2367
2575
  switch (Array.isArray(schema.type) ? schema.type[0] : schema.type) {
2368
2576
  case "string": return convertString(schema);
2369
2577
  case "number": return convertNumber(schema);
@@ -2387,7 +2595,7 @@ function filterUndefined(obj) {
2387
2595
  * Convert JSON Schema string type to TypeBox.
2388
2596
  */
2389
2597
  function convertString(schema) {
2390
- const options = filterUndefined({
2598
+ const baseOptions = filterUndefined({
2391
2599
  title: schema.title,
2392
2600
  description: schema.description,
2393
2601
  default: schema.default,
@@ -2395,6 +2603,10 @@ function convertString(schema) {
2395
2603
  maxLength: schema.maxLength,
2396
2604
  pattern: schema.pattern
2397
2605
  });
2606
+ const options = schema["~options"] ? {
2607
+ ...baseOptions,
2608
+ "~options": schema["~options"]
2609
+ } : baseOptions;
2398
2610
  switch (schema.format) {
2399
2611
  case "email": return t.email(options);
2400
2612
  case "uuid": return t.uuid(options);
@@ -2651,5 +2863,5 @@ const run = (entry, opts) => {
2651
2863
  };
2652
2864
 
2653
2865
  //#endregion
2654
- 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 };
2866
+ 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 };
2655
2867
  //# sourceMappingURL=index.native.js.map