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
@@ -1,45 +1,462 @@
1
1
  import * as alepha1 from "alepha";
2
- import { Alepha, AlephaError, FileLike, KIND, Primitive, Service, Static } from "alepha";
3
- import { FileDetector, FileSystemProvider } from "alepha/file";
2
+ import { Alepha, AlephaError, FileLike, Json, KIND, Primitive, Service, Static, StreamLike } from "alepha";
4
3
  import * as fs from "node:fs";
4
+ import { Readable } from "node:stream";
5
5
  import * as alepha_logger0 from "alepha/logger";
6
6
 
7
7
  //#region ../../src/bucket/providers/FileStorageProvider.d.ts
8
8
  declare abstract class FileStorageProvider {
9
9
  /**
10
- * Uploads a file to the storage.
11
- *
12
- * @param bucketName - Container name
13
- * @param file - File to upload
14
- * @param fileId - Optional file identifier. If not provided, a unique ID will be generated.
15
- * @return The identifier of the uploaded file.
16
- */
10
+ * Uploads a file to the storage.
11
+ *
12
+ * @param bucketName - Container name
13
+ * @param file - File to upload
14
+ * @param fileId - Optional file identifier. If not provided, a unique ID will be generated.
15
+ * @return The identifier of the uploaded file.
16
+ */
17
17
  abstract upload(bucketName: string, file: FileLike, fileId?: string): Promise<string>;
18
18
  /**
19
- * Downloads a file from the storage.
20
- *
21
- * @param bucketName - Container name
22
- * @param fileId - Identifier of the file to download
23
- * @return The downloaded file as a FileLike object.
24
- */
19
+ * Downloads a file from the storage.
20
+ *
21
+ * @param bucketName - Container name
22
+ * @param fileId - Identifier of the file to download
23
+ * @return The downloaded file as a FileLike object.
24
+ */
25
25
  abstract download(bucketName: string, fileId: string): Promise<FileLike>;
26
26
  /**
27
- * Check if fileId exists in the storage bucket.
28
- *
29
- * @param bucketName - Container name
30
- * @param fileId - Identifier of the file to stream
31
- * @return True is the file exists, false otherwise.
32
- */
27
+ * Check if fileId exists in the storage bucket.
28
+ *
29
+ * @param bucketName - Container name
30
+ * @param fileId - Identifier of the file to stream
31
+ * @return True is the file exists, false otherwise.
32
+ */
33
33
  abstract exists(bucketName: string, fileId: string): Promise<boolean>;
34
34
  /**
35
- * Delete permanently a file from the storage.
36
- *
37
- * @param bucketName - Container name
38
- * @param fileId - Identifier of the file to delete
39
- */
35
+ * Delete permanently a file from the storage.
36
+ *
37
+ * @param bucketName - Container name
38
+ * @param fileId - Identifier of the file to delete
39
+ */
40
40
  abstract delete(bucketName: string, fileId: string): Promise<void>;
41
41
  }
42
42
  //#endregion
43
+ //#region ../../src/system/providers/FileSystemProvider.d.ts
44
+ /**
45
+ * Options for creating a file from a URL
46
+ */
47
+ interface CreateFileFromUrlOptions {
48
+ /**
49
+ * The URL to load the file from (file://, http://, or https://)
50
+ */
51
+ url: string;
52
+ /**
53
+ * The MIME type of the file (optional, will be detected from filename if not provided)
54
+ */
55
+ type?: string;
56
+ /**
57
+ * The name of the file (optional, will be extracted from URL if not provided)
58
+ */
59
+ name?: string;
60
+ }
61
+ /**
62
+ * Options for creating a file from a path (URL with file:// scheme)
63
+ */
64
+ interface CreateFileFromPathOptions {
65
+ /**
66
+ * The path to the file on the local filesystem
67
+ */
68
+ path: string;
69
+ /**
70
+ * The MIME type of the file (optional, will be detected from filename if not provided)
71
+ */
72
+ type?: string;
73
+ /**
74
+ * The name of the file (optional, will be extracted from URL if not provided)
75
+ */
76
+ name?: string;
77
+ }
78
+ /**
79
+ * Options for creating a file from a Buffer
80
+ */
81
+ interface CreateFileFromBufferOptions {
82
+ /**
83
+ * The Buffer containing the file data
84
+ */
85
+ buffer: Buffer;
86
+ /**
87
+ * The MIME type of the file (optional, will be detected from name if not provided)
88
+ */
89
+ type?: string;
90
+ /**
91
+ * The name of the file (required for proper content type detection)
92
+ */
93
+ name?: string;
94
+ }
95
+ /**
96
+ * Options for creating a file from a stream
97
+ */
98
+ interface CreateFileFromStreamOptions {
99
+ /**
100
+ * The readable stream containing the file data
101
+ */
102
+ stream: StreamLike;
103
+ /**
104
+ * The MIME type of the file (optional, will be detected from name if not provided)
105
+ */
106
+ type?: string;
107
+ /**
108
+ * The name of the file (required for proper content type detection)
109
+ */
110
+ name?: string;
111
+ /**
112
+ * The size of the file in bytes (optional)
113
+ */
114
+ size?: number;
115
+ }
116
+ /**
117
+ * Options for creating a file from text content
118
+ */
119
+ interface CreateFileFromTextOptions {
120
+ /**
121
+ * The text content to create the file from
122
+ */
123
+ text: string;
124
+ /**
125
+ * The MIME type of the file (default: text/plain)
126
+ */
127
+ type?: string;
128
+ /**
129
+ * The name of the file (default: "file.txt")
130
+ */
131
+ name?: string;
132
+ }
133
+ interface CreateFileFromResponseOptions {
134
+ /**
135
+ * The Response object containing the file data
136
+ */
137
+ response: Response;
138
+ /**
139
+ * Override the name (optional, uses filename from Content-Disposition header if not provided)
140
+ */
141
+ name?: string;
142
+ /**
143
+ * Override the MIME type (optional, uses file.type if not provided)
144
+ */
145
+ type?: string;
146
+ }
147
+ /**
148
+ * Options for creating a file from a Web File object
149
+ */
150
+ interface CreateFileFromWebFileOptions {
151
+ /**
152
+ * The Web File object
153
+ */
154
+ file: File;
155
+ /**
156
+ * Override the MIME type (optional, uses file.type if not provided)
157
+ */
158
+ type?: string;
159
+ /**
160
+ * Override the name (optional, uses file.name if not provided)
161
+ */
162
+ name?: string;
163
+ /**
164
+ * Override the size (optional, uses file.size if not provided)
165
+ */
166
+ size?: number;
167
+ }
168
+ /**
169
+ * Options for creating a file from an ArrayBuffer
170
+ */
171
+ interface CreateFileFromArrayBufferOptions {
172
+ /**
173
+ * The ArrayBuffer containing the file data
174
+ */
175
+ arrayBuffer: ArrayBuffer;
176
+ /**
177
+ * The MIME type of the file (optional, will be detected from name if not provided)
178
+ */
179
+ type?: string;
180
+ /**
181
+ * The name of the file (required for proper content type detection)
182
+ */
183
+ name?: string;
184
+ }
185
+ /**
186
+ * Union type for all createFile options
187
+ */
188
+ type CreateFileOptions = CreateFileFromUrlOptions | CreateFileFromPathOptions | CreateFileFromBufferOptions | CreateFileFromStreamOptions | CreateFileFromTextOptions | CreateFileFromWebFileOptions | CreateFileFromResponseOptions | CreateFileFromArrayBufferOptions;
189
+ /**
190
+ * Options for rm (remove) operation
191
+ */
192
+ interface RmOptions {
193
+ /**
194
+ * If true, removes directories and their contents recursively
195
+ */
196
+ recursive?: boolean;
197
+ /**
198
+ * If true, no error will be thrown if the path does not exist
199
+ */
200
+ force?: boolean;
201
+ }
202
+ /**
203
+ * Options for cp (copy) operation
204
+ */
205
+ interface CpOptions {
206
+ /**
207
+ * If true, copy directories recursively
208
+ */
209
+ recursive?: boolean;
210
+ /**
211
+ * If true, overwrite existing destination
212
+ */
213
+ force?: boolean;
214
+ }
215
+ /**
216
+ * Options for mkdir operation
217
+ */
218
+ interface MkdirOptions {
219
+ /**
220
+ * If true, creates parent directories as needed
221
+ */
222
+ recursive?: boolean;
223
+ /**
224
+ * File mode (permission and sticky bits)
225
+ */
226
+ mode?: number;
227
+ }
228
+ /**
229
+ * Options for ls (list) operation
230
+ */
231
+ interface LsOptions {
232
+ /**
233
+ * If true, list contents of directories recursively
234
+ */
235
+ recursive?: boolean;
236
+ /**
237
+ * If true, include hidden files (starting with .)
238
+ */
239
+ hidden?: boolean;
240
+ }
241
+ /**
242
+ * FileSystem interface providing utilities for working with files.
243
+ */
244
+ declare abstract class FileSystemProvider {
245
+ /**
246
+ * Joins multiple path segments into a single path.
247
+ *
248
+ * @param paths - The path segments to join
249
+ * @returns The joined path
250
+ */
251
+ abstract join(...paths: string[]): string;
252
+ /**
253
+ * Creates a FileLike object from various sources.
254
+ *
255
+ * @param options - Options for creating the file
256
+ * @returns A FileLike object
257
+ */
258
+ abstract createFile(options: CreateFileOptions): FileLike;
259
+ /**
260
+ * Removes a file or directory.
261
+ *
262
+ * @param path - The path to remove
263
+ * @param options - Remove options
264
+ */
265
+ abstract rm(path: string, options?: RmOptions): Promise<void>;
266
+ /**
267
+ * Copies a file or directory.
268
+ *
269
+ * @param src - Source path
270
+ * @param dest - Destination path
271
+ * @param options - Copy options
272
+ */
273
+ abstract cp(src: string, dest: string, options?: CpOptions): Promise<void>;
274
+ /**
275
+ * Moves/renames a file or directory.
276
+ *
277
+ * @param src - Source path
278
+ * @param dest - Destination path
279
+ */
280
+ abstract mv(src: string, dest: string): Promise<void>;
281
+ /**
282
+ * Creates a directory.
283
+ *
284
+ * @param path - The directory path to create
285
+ * @param options - Mkdir options
286
+ */
287
+ abstract mkdir(path: string, options?: MkdirOptions): Promise<void>;
288
+ /**
289
+ * Lists files in a directory.
290
+ *
291
+ * @param path - The directory path to list
292
+ * @param options - List options
293
+ * @returns Array of filenames
294
+ */
295
+ abstract ls(path: string, options?: LsOptions): Promise<string[]>;
296
+ /**
297
+ * Checks if a file or directory exists.
298
+ *
299
+ * @param path - The path to check
300
+ * @returns True if the path exists, false otherwise
301
+ */
302
+ abstract exists(path: string): Promise<boolean>;
303
+ /**
304
+ * Reads the content of a file.
305
+ *
306
+ * @param path - The file path to read
307
+ * @returns The file content as a Buffer
308
+ */
309
+ abstract readFile(path: string): Promise<Buffer>;
310
+ /**
311
+ * Writes data to a file.
312
+ *
313
+ * @param path - The file path to write to
314
+ * @param data - The data to write (Buffer or string)
315
+ */
316
+ abstract writeFile(path: string, data: Uint8Array | Buffer | string | FileLike): Promise<void>;
317
+ /**
318
+ * Reads the content of a file as a string.
319
+ *
320
+ * @param path - The file path to read
321
+ * @returns The file content as a string
322
+ */
323
+ abstract readTextFile(path: string): Promise<string>;
324
+ /**
325
+ * Reads the content of a file as JSON.
326
+ *
327
+ * @param path - The file path to read
328
+ * @returns The parsed JSON content
329
+ */
330
+ abstract readJsonFile<T = unknown>(path: string): Promise<T>;
331
+ }
332
+ //#endregion
333
+ //#region ../../src/system/services/FileDetector.d.ts
334
+ interface FileTypeResult {
335
+ /**
336
+ * The detected MIME type
337
+ */
338
+ mimeType: string;
339
+ /**
340
+ * The detected file extension
341
+ */
342
+ extension: string;
343
+ /**
344
+ * Whether the file type was verified by magic bytes
345
+ */
346
+ verified: boolean;
347
+ /**
348
+ * The stream (potentially wrapped to allow re-reading)
349
+ */
350
+ stream: Readable;
351
+ }
352
+ /**
353
+ * Service for detecting file types and getting content types.
354
+ *
355
+ * @example
356
+ * ```typescript
357
+ * const detector = alepha.inject(FileDetector);
358
+ *
359
+ * // Get content type from filename
360
+ * const mimeType = detector.getContentType("image.png"); // "image/png"
361
+ *
362
+ * // Detect file type by magic bytes
363
+ * const stream = createReadStream('image.png');
364
+ * const result = await detector.detectFileType(stream, 'image.png');
365
+ * console.log(result.mimeType); // 'image/png'
366
+ * console.log(result.verified); // true if magic bytes match
367
+ * ```
368
+ */
369
+ declare class FileDetector {
370
+ /**
371
+ * Magic byte signatures for common file formats.
372
+ * Each signature is represented as an array of bytes or null (wildcard).
373
+ */
374
+ protected static readonly MAGIC_BYTES: Record<string, {
375
+ signature: (number | null)[];
376
+ mimeType: string;
377
+ }[]>;
378
+ /**
379
+ * All possible format signatures for checking against actual file content
380
+ */
381
+ protected static readonly ALL_SIGNATURES: {
382
+ signature: (number | null)[];
383
+ mimeType: string;
384
+ ext: string;
385
+ }[];
386
+ /**
387
+ * MIME type map for file extensions.
388
+ *
389
+ * Can be used to get the content type of file based on its extension.
390
+ * Feel free to add more mime types in your project!
391
+ */
392
+ static readonly mimeMap: Record<string, string>;
393
+ /**
394
+ * Reverse MIME type map for looking up extensions from MIME types.
395
+ * Prefers shorter, more common extensions when multiple exist.
396
+ */
397
+ protected static readonly reverseMimeMap: Record<string, string>;
398
+ /**
399
+ * Returns the file extension for a given MIME type.
400
+ *
401
+ * @param mimeType - The MIME type to look up
402
+ * @returns The file extension (without dot), or "bin" if not found
403
+ *
404
+ * @example
405
+ * ```typescript
406
+ * const detector = alepha.inject(FileDetector);
407
+ * const ext = detector.getExtensionFromMimeType("image/png"); // "png"
408
+ * const ext2 = detector.getExtensionFromMimeType("application/octet-stream"); // "bin"
409
+ * ```
410
+ */
411
+ getExtensionFromMimeType(mimeType: string): string;
412
+ /**
413
+ * Returns the content type of file based on its filename.
414
+ *
415
+ * @param filename - The filename to check
416
+ * @returns The MIME type
417
+ *
418
+ * @example
419
+ * ```typescript
420
+ * const detector = alepha.inject(FileDetector);
421
+ * const mimeType = detector.getContentType("image.png"); // "image/png"
422
+ * ```
423
+ */
424
+ getContentType(filename: string): string;
425
+ /**
426
+ * Detects the file type by checking magic bytes against the stream content.
427
+ *
428
+ * @param stream - The readable stream to check
429
+ * @param filename - The filename (used to get the extension)
430
+ * @returns File type information including MIME type, extension, and verification status
431
+ *
432
+ * @example
433
+ * ```typescript
434
+ * const detector = alepha.inject(FileDetector);
435
+ * const stream = createReadStream('image.png');
436
+ * const result = await detector.detectFileType(stream, 'image.png');
437
+ * console.log(result.mimeType); // 'image/png'
438
+ * console.log(result.verified); // true if magic bytes match
439
+ * ```
440
+ */
441
+ detectFileType(stream: Readable, filename: string): Promise<FileTypeResult>;
442
+ /**
443
+ * Reads all bytes from a stream and returns the first N bytes along with a new stream containing all data.
444
+ * This approach reads the entire stream upfront to avoid complex async handling issues.
445
+ *
446
+ * @protected
447
+ */
448
+ protected peekBytes(stream: Readable, numBytes: number): Promise<{
449
+ buffer: Buffer;
450
+ stream: Readable;
451
+ }>;
452
+ /**
453
+ * Checks if a buffer matches a magic byte signature.
454
+ *
455
+ * @protected
456
+ */
457
+ protected matchesSignature(buffer: Buffer, signature: (number | null)[]): boolean;
458
+ }
459
+ //#endregion
43
460
  //#region ../../src/bucket/providers/MemoryFileStorageProvider.d.ts
44
461
  declare class MemoryFileStorageProvider implements FileStorageProvider {
45
462
  readonly files: Record<string, FileLike>;
@@ -108,134 +525,134 @@ declare const $bucket: {
108
525
  };
109
526
  interface BucketPrimitiveOptions extends BucketFileOptions {
110
527
  /**
111
- * File storage provider configuration for the bucket.
112
- *
113
- * Options:
114
- * - **"memory"**: In-memory storage (default for development, lost on restart)
115
- * - **Service<FileStorageProvider>**: Custom provider class (e.g., S3FileStorageProvider, AzureBlobProvider)
116
- * - **undefined**: Uses the default file storage provider from dependency injection
117
- *
118
- * **Provider Selection Guidelines**:
119
- * - **Development**: Use "memory" for fast, simple testing without external dependencies
120
- * - **Production**: Use cloud providers (S3, Azure Blob, Google Cloud Storage) for scalability
121
- * - **Local deployment**: Use filesystem providers for on-premise installations
122
- * - **Hybrid**: Use different providers for different bucket types (temp files vs permanent storage)
123
- *
124
- * **Provider Capabilities**:
125
- * - File persistence and durability guarantees
126
- * - Scalability and performance characteristics
127
- * - Geographic distribution and CDN integration
128
- * - Cost implications for storage and bandwidth
129
- * - Backup and disaster recovery features
130
- *
131
- * @default Uses injected FileStorageProvider
132
- * @example "memory"
133
- * @example S3FileStorageProvider
134
- * @example AzureBlobStorageProvider
135
- */
528
+ * File storage provider configuration for the bucket.
529
+ *
530
+ * Options:
531
+ * - **"memory"**: In-memory storage (default for development, lost on restart)
532
+ * - **Service<FileStorageProvider>**: Custom provider class (e.g., S3FileStorageProvider, AzureBlobProvider)
533
+ * - **undefined**: Uses the default file storage provider from dependency injection
534
+ *
535
+ * **Provider Selection Guidelines**:
536
+ * - **Development**: Use "memory" for fast, simple testing without external dependencies
537
+ * - **Production**: Use cloud providers (S3, Azure Blob, Google Cloud Storage) for scalability
538
+ * - **Local deployment**: Use filesystem providers for on-premise installations
539
+ * - **Hybrid**: Use different providers for different bucket types (temp files vs permanent storage)
540
+ *
541
+ * **Provider Capabilities**:
542
+ * - File persistence and durability guarantees
543
+ * - Scalability and performance characteristics
544
+ * - Geographic distribution and CDN integration
545
+ * - Cost implications for storage and bandwidth
546
+ * - Backup and disaster recovery features
547
+ *
548
+ * @default Uses injected FileStorageProvider
549
+ * @example "memory"
550
+ * @example S3FileStorageProvider
551
+ * @example AzureBlobStorageProvider
552
+ */
136
553
  provider?: Service<FileStorageProvider> | "memory";
137
554
  /**
138
- * Unique name identifier for the bucket.
139
- *
140
- * This name is used for:
141
- * - Storage backend organization and partitioning
142
- * - File path generation and URL construction
143
- * - Logging, monitoring, and debugging
144
- * - Access control and permissions management
145
- * - Backup and replication configuration
146
- *
147
- * **Naming Conventions**:
148
- * - Use lowercase with hyphens for consistency
149
- * - Include purpose or content type in the name
150
- * - Avoid spaces and special characters
151
- * - Consider environment prefixes for deployment isolation
152
- *
153
- * If not provided, defaults to the property key where the bucket is declared.
154
- *
155
- * @example "user-avatars"
156
- * @example "product-images"
157
- * @example "legal-documents"
158
- * @example "temp-processing-files"
159
- */
555
+ * Unique name identifier for the bucket.
556
+ *
557
+ * This name is used for:
558
+ * - Storage backend organization and partitioning
559
+ * - File path generation and URL construction
560
+ * - Logging, monitoring, and debugging
561
+ * - Access control and permissions management
562
+ * - Backup and replication configuration
563
+ *
564
+ * **Naming Conventions**:
565
+ * - Use lowercase with hyphens for consistency
566
+ * - Include purpose or content type in the name
567
+ * - Avoid spaces and special characters
568
+ * - Consider environment prefixes for deployment isolation
569
+ *
570
+ * If not provided, defaults to the property key where the bucket is declared.
571
+ *
572
+ * @example "user-avatars"
573
+ * @example "product-images"
574
+ * @example "legal-documents"
575
+ * @example "temp-processing-files"
576
+ */
160
577
  name?: string;
161
578
  }
162
579
  interface BucketFileOptions {
163
580
  /**
164
- * Human-readable description of the bucket's purpose and contents.
165
- *
166
- * Used for:
167
- * - Documentation generation and API references
168
- * - Developer onboarding and system understanding
169
- * - Monitoring dashboards and admin interfaces
170
- * - Compliance and audit documentation
171
- *
172
- * **Description Best Practices**:
173
- * - Explain what types of files this bucket stores
174
- * - Mention any special handling or processing requirements
175
- * - Include information about retention policies if applicable
176
- * - Note any compliance or security considerations
177
- *
178
- * @example "User profile pictures and avatar images"
179
- * @example "Product catalog images with automated thumbnail generation"
180
- * @example "Legal documents requiring long-term retention"
181
- * @example "Temporary files for data processing workflows"
182
- */
581
+ * Human-readable description of the bucket's purpose and contents.
582
+ *
583
+ * Used for:
584
+ * - Documentation generation and API references
585
+ * - Developer onboarding and system understanding
586
+ * - Monitoring dashboards and admin interfaces
587
+ * - Compliance and audit documentation
588
+ *
589
+ * **Description Best Practices**:
590
+ * - Explain what types of files this bucket stores
591
+ * - Mention any special handling or processing requirements
592
+ * - Include information about retention policies if applicable
593
+ * - Note any compliance or security considerations
594
+ *
595
+ * @example "User profile pictures and avatar images"
596
+ * @example "Product catalog images with automated thumbnail generation"
597
+ * @example "Legal documents requiring long-term retention"
598
+ * @example "Temporary files for data processing workflows"
599
+ */
183
600
  description?: string;
184
601
  /**
185
- * Array of allowed MIME types for files uploaded to this bucket.
186
- *
187
- * When specified, only files with these exact MIME types will be accepted.
188
- * Files with disallowed MIME types will be rejected with an InvalidFileError.
189
- *
190
- * **MIME Type Categories**:
191
- * - Images: "image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml"
192
- * - Documents: "application/pdf", "text/plain", "text/csv"
193
- * - Office: "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
194
- * - Archives: "application/zip", "application/x-tar", "application/gzip"
195
- * - Media: "video/mp4", "audio/mpeg", "audio/wav"
196
- *
197
- * **Security Considerations**:
198
- * - Always validate MIME types for user uploads
199
- * - Be cautious with executable file types
200
- * - Consider using allow-lists rather than deny-lists
201
- * - Remember that MIME types can be spoofed by malicious users
202
- *
203
- * If not specified, all MIME types are allowed (not recommended for user uploads).
204
- *
205
- * @example ["image/jpeg", "image/png"] // Only JPEG and PNG images
206
- * @example ["application/pdf", "text/plain"] // Documents only
207
- * @example ["video/mp4", "video/webm"] // Video files
208
- */
602
+ * Array of allowed MIME types for files uploaded to this bucket.
603
+ *
604
+ * When specified, only files with these exact MIME types will be accepted.
605
+ * Files with disallowed MIME types will be rejected with an InvalidFileError.
606
+ *
607
+ * **MIME Type Categories**:
608
+ * - Images: "image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml"
609
+ * - Documents: "application/pdf", "text/plain", "text/csv"
610
+ * - Office: "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
611
+ * - Archives: "application/zip", "application/x-tar", "application/gzip"
612
+ * - Media: "video/mp4", "audio/mpeg", "audio/wav"
613
+ *
614
+ * **Security Considerations**:
615
+ * - Always validate MIME types for user uploads
616
+ * - Be cautious with executable file types
617
+ * - Consider using allow-lists rather than deny-lists
618
+ * - Remember that MIME types can be spoofed by malicious users
619
+ *
620
+ * If not specified, all MIME types are allowed (not recommended for user uploads).
621
+ *
622
+ * @example ["image/jpeg", "image/png"] // Only JPEG and PNG images
623
+ * @example ["application/pdf", "text/plain"] // Documents only
624
+ * @example ["video/mp4", "video/webm"] // Video files
625
+ */
209
626
  mimeTypes?: string[];
210
627
  /**
211
- * Maximum file size allowed in megabytes (MB).
212
- *
213
- * Files larger than this limit will be rejected with an InvalidFileError.
214
- * This helps prevent:
215
- * - Storage quota exhaustion
216
- * - Memory issues during file processing
217
- * - Long upload times and timeouts
218
- * - Abuse of storage resources
219
- *
220
- * **Size Guidelines by File Type**:
221
- * - Profile images: 1-5 MB
222
- * - Product photos: 5-10 MB
223
- * - Documents: 10-50 MB
224
- * - Video files: 50-500 MB
225
- * - Data files: 100-1000 MB
226
- *
227
- * **Considerations**:
228
- * - Consider your storage costs and limits
229
- * - Factor in network upload speeds for users
230
- * - Account for processing requirements (thumbnails, compression)
231
- * - Set reasonable limits based on actual use cases
232
- *
233
- * @default 10 MB
234
- *
235
- * @example 1 // 1MB for small images
236
- * @example 25 // 25MB for documents
237
- * @example 100 // 100MB for media files
238
- */
628
+ * Maximum file size allowed in megabytes (MB).
629
+ *
630
+ * Files larger than this limit will be rejected with an InvalidFileError.
631
+ * This helps prevent:
632
+ * - Storage quota exhaustion
633
+ * - Memory issues during file processing
634
+ * - Long upload times and timeouts
635
+ * - Abuse of storage resources
636
+ *
637
+ * **Size Guidelines by File Type**:
638
+ * - Profile images: 1-5 MB
639
+ * - Product photos: 5-10 MB
640
+ * - Documents: 10-50 MB
641
+ * - Video files: 50-500 MB
642
+ * - Data files: 100-1000 MB
643
+ *
644
+ * **Considerations**:
645
+ * - Consider your storage costs and limits
646
+ * - Factor in network upload speeds for users
647
+ * - Account for processing requirements (thumbnails, compression)
648
+ * - Set reasonable limits based on actual use cases
649
+ *
650
+ * @default 10 MB
651
+ *
652
+ * @example 1 // 1MB for small images
653
+ * @example 25 // 25MB for documents
654
+ * @example 100 // 100MB for media files
655
+ */
239
656
  maxSize?: number;
240
657
  }
241
658
  declare class BucketPrimitive extends Primitive<BucketPrimitiveOptions> {
@@ -243,37 +660,37 @@ declare class BucketPrimitive extends Primitive<BucketPrimitiveOptions> {
243
660
  private readonly fileSystem;
244
661
  get name(): string;
245
662
  /**
246
- * Uploads a file to the bucket.
247
- */
663
+ * Uploads a file to the bucket.
664
+ */
248
665
  upload(file: FileLike, options?: BucketFileOptions): Promise<string>;
249
666
  /**
250
- * Delete permanently a file from the bucket.
251
- */
667
+ * Delete permanently a file from the bucket.
668
+ */
252
669
  delete(fileId: string, skipHook?: boolean): Promise<void>;
253
670
  /**
254
- * Checks if a file exists in the bucket.
255
- */
671
+ * Checks if a file exists in the bucket.
672
+ */
256
673
  exists(fileId: string): Promise<boolean>;
257
674
  /**
258
- * Downloads a file from the bucket.
259
- */
675
+ * Downloads a file from the bucket.
676
+ */
260
677
  download(fileId: string): Promise<FileLike>;
261
678
  protected $provider(): FileStorageProvider | MemoryFileStorageProvider;
262
679
  }
263
680
  interface BucketFileOptions {
264
681
  /**
265
- * Optional description of the bucket.
266
- */
682
+ * Optional description of the bucket.
683
+ */
267
684
  description?: string;
268
685
  /**
269
- * Allowed MIME types.
270
- */
686
+ * Allowed MIME types.
687
+ */
271
688
  mimeTypes?: string[];
272
689
  /**
273
- * Maximum size of the files in the bucket.
274
- *
275
- * @default 10
276
- */
690
+ * Maximum size of the files in the bucket.
691
+ *
692
+ * @default 10
693
+ */
277
694
  maxSize?: number;
278
695
  }
279
696
  //#endregion
@@ -320,9 +737,9 @@ declare class LocalFileStorageProvider implements FileStorageProvider {
320
737
  declare module "alepha" {
321
738
  interface Hooks {
322
739
  /**
323
- * Triggered when a file is uploaded to a bucket.
324
- * Can be used to perform actions after a file is uploaded, like creating a database record!
325
- */
740
+ * Triggered when a file is uploaded to a bucket.
741
+ * Can be used to perform actions after a file is uploaded, like creating a database record!
742
+ */
326
743
  "bucket:file:uploaded": {
327
744
  id: string;
328
745
  file: FileLike;
@@ -330,8 +747,8 @@ declare module "alepha" {
330
747
  options: BucketFileOptions;
331
748
  };
332
749
  /**
333
- * Triggered when a file is deleted from a bucket.
334
- */
750
+ * Triggered when a file is deleted from a bucket.
751
+ */
335
752
  "bucket:file:deleted": {
336
753
  id: string;
337
754
  bucket: BucketPrimitive;
@@ -339,14 +756,21 @@ declare module "alepha" {
339
756
  }
340
757
  }
341
758
  /**
342
- * Provides file storage capabilities through declarative bucket primitives with support for multiple storage backends.
759
+ * | type | quality | stability |
760
+ * |------|---------|-----------|
761
+ * | backend | rare | stable |
762
+ *
763
+ * Unified file storage abstraction across multiple backends.
343
764
  *
344
- * The bucket module enables unified file operations across different storage systems using the `$bucket` primitive
345
- * on class properties. It abstracts storage provider differences, offering consistent APIs for local filesystem,
346
- * cloud storage, or in-memory storage for testing environments.
765
+ * **Features:**
766
+ * - File storage buckets with constraints
767
+ * - Unified API across all storage backends
768
+ * - MIME type validation
769
+ * - File size limits
770
+ * - Upload/download/delete operations
771
+ * - TTL-based file expiration
772
+ * - Providers: Memory (testing), Local filesystem, AWS S3 / Cloudflare R2 / MinIO, Azure Blob Storage, Vercel Blob
347
773
  *
348
- * @see {@link $bucket}
349
- * @see {@link FileStorageProvider}
350
774
  * @module alepha.bucket
351
775
  */
352
776
  declare const AlephaBucket: alepha1.Service<alepha1.Module>;