alepha 0.13.1 → 0.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/README.md +1 -1
  2. package/dist/api-files/index.browser.js +80 -0
  3. package/dist/api-files/index.browser.js.map +1 -0
  4. package/dist/api-files/index.d.ts +28 -91
  5. package/dist/api-files/index.js +10 -755
  6. package/dist/api-files/index.js.map +1 -1
  7. package/dist/api-jobs/index.browser.js +56 -0
  8. package/dist/api-jobs/index.browser.js.map +1 -0
  9. package/dist/api-jobs/index.d.ts +46 -46
  10. package/dist/api-jobs/index.js +13 -13
  11. package/dist/api-jobs/index.js.map +1 -1
  12. package/dist/api-notifications/index.browser.js +382 -0
  13. package/dist/api-notifications/index.browser.js.map +1 -0
  14. package/dist/api-notifications/index.d.ts +231 -193
  15. package/dist/api-notifications/index.js +108 -78
  16. package/dist/api-notifications/index.js.map +1 -1
  17. package/dist/api-parameters/index.browser.js +29 -0
  18. package/dist/api-parameters/index.browser.js.map +1 -0
  19. package/dist/api-parameters/index.d.ts +21 -22
  20. package/dist/api-parameters/index.js +22 -22
  21. package/dist/api-parameters/index.js.map +1 -1
  22. package/dist/api-users/index.d.ts +237 -2001
  23. package/dist/api-users/index.js +969 -4795
  24. package/dist/api-users/index.js.map +1 -1
  25. package/dist/api-verifications/index.browser.js +52 -0
  26. package/dist/api-verifications/index.browser.js.map +1 -0
  27. package/dist/api-verifications/index.d.ts +119 -97
  28. package/dist/api-verifications/index.js +1 -1
  29. package/dist/api-verifications/index.js.map +1 -1
  30. package/dist/batch/index.d.ts +13 -13
  31. package/dist/batch/index.js +8 -13
  32. package/dist/batch/index.js.map +1 -1
  33. package/dist/bucket/index.d.ts +14 -14
  34. package/dist/bucket/index.js +19 -17
  35. package/dist/bucket/index.js.map +1 -1
  36. package/dist/cache/index.d.ts +11 -11
  37. package/dist/cache/index.js +9 -9
  38. package/dist/cache/index.js.map +1 -1
  39. package/dist/cli/{dist-Dl9Vl7Ur.js → dist-lGnqsKpu.js} +11 -15
  40. package/dist/cli/dist-lGnqsKpu.js.map +1 -0
  41. package/dist/cli/index.d.ts +32 -49
  42. package/dist/cli/index.js +90 -71
  43. package/dist/cli/index.js.map +1 -1
  44. package/dist/command/index.d.ts +20 -19
  45. package/dist/command/index.js +34 -25
  46. package/dist/command/index.js.map +1 -1
  47. package/dist/core/index.browser.js +218 -218
  48. package/dist/core/index.browser.js.map +1 -1
  49. package/dist/core/index.d.ts +232 -232
  50. package/dist/core/index.js +218 -218
  51. package/dist/core/index.js.map +1 -1
  52. package/dist/core/index.native.js +2113 -0
  53. package/dist/core/index.native.js.map +1 -0
  54. package/dist/datetime/index.d.ts +9 -9
  55. package/dist/datetime/index.js +7 -7
  56. package/dist/datetime/index.js.map +1 -1
  57. package/dist/email/index.d.ts +16 -16
  58. package/dist/email/index.js +14 -9
  59. package/dist/email/index.js.map +1 -1
  60. package/dist/file/index.js +1 -1
  61. package/dist/file/index.js.map +1 -1
  62. package/dist/lock/index.d.ts +9 -9
  63. package/dist/lock/index.js +8 -8
  64. package/dist/lock/index.js.map +1 -1
  65. package/dist/lock-redis/index.js +3 -66
  66. package/dist/lock-redis/index.js.map +1 -1
  67. package/dist/logger/index.d.ts +5 -5
  68. package/dist/logger/index.js +8 -8
  69. package/dist/logger/index.js.map +1 -1
  70. package/dist/orm/index.browser.js +114 -114
  71. package/dist/orm/index.browser.js.map +1 -1
  72. package/dist/orm/index.d.ts +218 -218
  73. package/dist/orm/index.js +49 -49
  74. package/dist/orm/index.js.map +1 -1
  75. package/dist/queue/index.d.ts +29 -29
  76. package/dist/queue/index.js +20 -20
  77. package/dist/queue/index.js.map +1 -1
  78. package/dist/queue-redis/index.d.ts +2 -2
  79. package/dist/redis/index.d.ts +4 -4
  80. package/dist/retry/index.d.ts +19 -19
  81. package/dist/retry/index.js +7 -7
  82. package/dist/retry/index.js.map +1 -1
  83. package/dist/scheduler/index.d.ts +16 -16
  84. package/dist/scheduler/index.js +9 -9
  85. package/dist/scheduler/index.js.map +1 -1
  86. package/dist/security/index.d.ts +53 -53
  87. package/dist/security/index.js +35 -35
  88. package/dist/security/index.js.map +1 -1
  89. package/dist/server/index.browser.js +1 -1
  90. package/dist/server/index.browser.js.map +1 -1
  91. package/dist/server/index.d.ts +92 -92
  92. package/dist/server/index.js +16 -16
  93. package/dist/server/index.js.map +1 -1
  94. package/dist/server-auth/index.browser.js +4 -982
  95. package/dist/server-auth/index.browser.js.map +1 -1
  96. package/dist/server-auth/index.d.ts +204 -785
  97. package/dist/server-auth/index.js +47 -1239
  98. package/dist/server-auth/index.js.map +1 -1
  99. package/dist/server-cache/index.d.ts +10 -10
  100. package/dist/server-cache/index.js +2 -2
  101. package/dist/server-cache/index.js.map +1 -1
  102. package/dist/server-compress/index.d.ts +4 -4
  103. package/dist/server-compress/index.js +1 -1
  104. package/dist/server-compress/index.js.map +1 -1
  105. package/dist/server-cookies/index.browser.js +8 -8
  106. package/dist/server-cookies/index.browser.js.map +1 -1
  107. package/dist/server-cookies/index.d.ts +17 -17
  108. package/dist/server-cookies/index.js +11 -11
  109. package/dist/server-cookies/index.js.map +1 -1
  110. package/dist/server-cors/index.d.ts +17 -17
  111. package/dist/server-cors/index.js +9 -9
  112. package/dist/server-cors/index.js.map +1 -1
  113. package/dist/server-health/index.d.ts +19 -19
  114. package/dist/server-helmet/index.d.ts +1 -1
  115. package/dist/server-links/index.browser.js +12 -12
  116. package/dist/server-links/index.browser.js.map +1 -1
  117. package/dist/server-links/index.d.ts +59 -251
  118. package/dist/server-links/index.js +23 -502
  119. package/dist/server-links/index.js.map +1 -1
  120. package/dist/server-metrics/index.d.ts +4 -4
  121. package/dist/server-multipart/index.d.ts +2 -2
  122. package/dist/server-proxy/index.d.ts +12 -12
  123. package/dist/server-proxy/index.js +10 -10
  124. package/dist/server-proxy/index.js.map +1 -1
  125. package/dist/server-rate-limit/index.d.ts +22 -22
  126. package/dist/server-rate-limit/index.js +12 -12
  127. package/dist/server-rate-limit/index.js.map +1 -1
  128. package/dist/server-security/index.d.ts +22 -22
  129. package/dist/server-security/index.js +15 -15
  130. package/dist/server-security/index.js.map +1 -1
  131. package/dist/server-static/index.d.ts +14 -14
  132. package/dist/server-static/index.js +26 -10
  133. package/dist/server-static/index.js.map +1 -1
  134. package/dist/server-swagger/index.d.ts +25 -184
  135. package/dist/server-swagger/index.js +21 -724
  136. package/dist/server-swagger/index.js.map +1 -1
  137. package/dist/sms/index.d.ts +14 -14
  138. package/dist/sms/index.js +9 -9
  139. package/dist/sms/index.js.map +1 -1
  140. package/dist/thread/index.d.ts +11 -11
  141. package/dist/thread/index.js +17 -17
  142. package/dist/thread/index.js.map +1 -1
  143. package/dist/topic/index.d.ts +26 -26
  144. package/dist/topic/index.js +16 -16
  145. package/dist/topic/index.js.map +1 -1
  146. package/dist/topic-redis/index.d.ts +1 -1
  147. package/dist/vite/index.d.ts +3 -3
  148. package/dist/vite/index.js +8 -8
  149. package/dist/vite/index.js.map +1 -1
  150. package/dist/websocket/index.browser.js +11 -11
  151. package/dist/websocket/index.browser.js.map +1 -1
  152. package/dist/websocket/index.d.ts +58 -58
  153. package/dist/websocket/index.js +13 -13
  154. package/dist/websocket/index.js.map +1 -1
  155. package/package.json +128 -57
  156. package/src/api-files/index.browser.ts +17 -0
  157. package/src/api-files/services/FileService.ts +5 -7
  158. package/src/api-jobs/index.browser.ts +15 -0
  159. package/src/api-jobs/index.ts +1 -1
  160. package/src/api-jobs/{descriptors → primitives}/$job.ts +8 -8
  161. package/src/api-jobs/providers/JobProvider.ts +9 -9
  162. package/src/api-jobs/services/JobService.ts +5 -5
  163. package/src/api-notifications/controllers/NotificationController.ts +26 -1
  164. package/src/api-notifications/index.browser.ts +17 -0
  165. package/src/api-notifications/index.ts +6 -15
  166. package/src/api-notifications/{descriptors → primitives}/$notification.ts +10 -10
  167. package/src/api-notifications/schemas/notificationQuerySchema.ts +13 -0
  168. package/src/api-notifications/services/NotificationSenderService.ts +3 -3
  169. package/src/api-notifications/services/NotificationService.ts +45 -2
  170. package/src/api-parameters/index.browser.ts +12 -0
  171. package/src/api-parameters/index.ts +1 -1
  172. package/src/api-parameters/{descriptors → primitives}/$config.ts +7 -12
  173. package/src/api-users/atoms/realmAuthSettingsAtom.ts +3 -1
  174. package/src/api-users/controllers/UserController.ts +21 -1
  175. package/src/api-users/index.ts +1 -1
  176. package/src/api-users/{descriptors → primitives}/$userRealm.ts +40 -17
  177. package/src/api-users/providers/UserRealmProvider.ts +2 -1
  178. package/src/api-users/services/SessionService.ts +2 -0
  179. package/src/api-users/services/UserService.ts +56 -16
  180. package/src/api-verifications/index.browser.ts +15 -0
  181. package/src/api-verifications/index.ts +1 -0
  182. package/src/batch/index.ts +3 -3
  183. package/src/batch/{descriptors → primitives}/$batch.ts +13 -16
  184. package/src/batch/providers/BatchProvider.ts +0 -7
  185. package/src/bucket/index.ts +15 -13
  186. package/src/bucket/{descriptors → primitives}/$bucket.ts +8 -8
  187. package/src/bucket/providers/LocalFileStorageProvider.ts +3 -3
  188. package/src/cache/index.ts +4 -4
  189. package/src/cache/{descriptors → primitives}/$cache.ts +15 -15
  190. package/src/cli/apps/AlephaCli.ts +27 -1
  191. package/src/cli/apps/AlephaPackageBuilderCli.ts +27 -2
  192. package/src/cli/commands/CoreCommands.ts +6 -2
  193. package/src/cli/commands/DrizzleCommands.ts +6 -6
  194. package/src/cli/commands/VerifyCommands.ts +1 -1
  195. package/src/cli/commands/ViteCommands.ts +8 -2
  196. package/src/cli/services/ProjectUtils.ts +74 -78
  197. package/src/command/helpers/Asker.ts +10 -0
  198. package/src/command/index.ts +5 -5
  199. package/src/command/{descriptors → primitives}/$command.ts +9 -12
  200. package/src/command/providers/CliProvider.ts +10 -10
  201. package/src/core/Alepha.ts +30 -33
  202. package/src/core/constants/KIND.ts +1 -1
  203. package/src/core/constants/OPTIONS.ts +1 -1
  204. package/src/core/helpers/{descriptor.ts → primitive.ts} +18 -18
  205. package/src/core/helpers/ref.ts +1 -1
  206. package/src/core/index.shared.ts +8 -8
  207. package/src/core/{descriptors → primitives}/$context.ts +5 -5
  208. package/src/core/{descriptors → primitives}/$hook.ts +4 -4
  209. package/src/core/{descriptors → primitives}/$inject.ts +2 -2
  210. package/src/core/{descriptors → primitives}/$module.ts +9 -9
  211. package/src/core/{descriptors → primitives}/$use.ts +2 -2
  212. package/src/core/providers/CodecManager.ts +1 -1
  213. package/src/core/providers/JsonSchemaCodec.ts +1 -1
  214. package/src/core/providers/StateManager.ts +2 -2
  215. package/src/datetime/index.ts +3 -3
  216. package/src/datetime/{descriptors → primitives}/$interval.ts +6 -6
  217. package/src/email/index.ts +17 -9
  218. package/src/email/{descriptors → primitives}/$email.ts +8 -8
  219. package/src/file/index.ts +1 -1
  220. package/src/lock/index.ts +3 -3
  221. package/src/lock/{descriptors → primitives}/$lock.ts +10 -10
  222. package/src/logger/index.ts +8 -8
  223. package/src/logger/{descriptors → primitives}/$logger.ts +2 -2
  224. package/src/logger/services/Logger.ts +1 -1
  225. package/src/orm/constants/PG_SYMBOLS.ts +2 -2
  226. package/src/orm/index.browser.ts +2 -2
  227. package/src/orm/index.ts +8 -8
  228. package/src/orm/{descriptors → primitives}/$entity.ts +11 -11
  229. package/src/orm/{descriptors → primitives}/$repository.ts +2 -2
  230. package/src/orm/{descriptors → primitives}/$sequence.ts +8 -8
  231. package/src/orm/{descriptors → primitives}/$transaction.ts +4 -4
  232. package/src/orm/providers/PostgresTypeProvider.ts +3 -3
  233. package/src/orm/providers/RepositoryProvider.ts +4 -4
  234. package/src/orm/providers/drivers/DatabaseProvider.ts +7 -7
  235. package/src/orm/providers/drivers/NodeSqliteProvider.ts +3 -3
  236. package/src/orm/services/ModelBuilder.ts +9 -9
  237. package/src/orm/services/PgRelationManager.ts +2 -2
  238. package/src/orm/services/PostgresModelBuilder.ts +5 -5
  239. package/src/orm/services/Repository.ts +7 -7
  240. package/src/orm/services/SqliteModelBuilder.ts +5 -5
  241. package/src/queue/index.ts +7 -7
  242. package/src/queue/{descriptors → primitives}/$consumer.ts +15 -15
  243. package/src/queue/{descriptors → primitives}/$queue.ts +12 -12
  244. package/src/queue/providers/WorkerProvider.ts +7 -7
  245. package/src/retry/index.ts +3 -3
  246. package/src/retry/{descriptors → primitives}/$retry.ts +14 -14
  247. package/src/scheduler/index.ts +3 -3
  248. package/src/scheduler/{descriptors → primitives}/$scheduler.ts +9 -9
  249. package/src/scheduler/providers/CronProvider.ts +1 -1
  250. package/src/security/index.ts +9 -9
  251. package/src/security/{descriptors → primitives}/$permission.ts +7 -7
  252. package/src/security/{descriptors → primitives}/$realm.ts +6 -12
  253. package/src/security/{descriptors → primitives}/$role.ts +12 -12
  254. package/src/security/{descriptors → primitives}/$serviceAccount.ts +8 -8
  255. package/src/server/index.browser.ts +1 -1
  256. package/src/server/index.ts +14 -14
  257. package/src/server/{descriptors → primitives}/$action.ts +13 -13
  258. package/src/server/{descriptors → primitives}/$route.ts +9 -9
  259. package/src/server/providers/NodeHttpServerProvider.ts +1 -1
  260. package/src/server/services/HttpClient.ts +1 -1
  261. package/src/server-auth/index.browser.ts +1 -1
  262. package/src/server-auth/index.ts +6 -6
  263. package/src/server-auth/{descriptors → primitives}/$auth.ts +10 -10
  264. package/src/server-auth/{descriptors → primitives}/$authCredentials.ts +4 -4
  265. package/src/server-auth/{descriptors → primitives}/$authGithub.ts +4 -4
  266. package/src/server-auth/{descriptors → primitives}/$authGoogle.ts +4 -4
  267. package/src/server-auth/providers/ServerAuthProvider.ts +4 -4
  268. package/src/server-cache/providers/ServerCacheProvider.ts +7 -7
  269. package/src/server-compress/providers/ServerCompressProvider.ts +3 -3
  270. package/src/server-cookies/index.browser.ts +2 -2
  271. package/src/server-cookies/index.ts +5 -5
  272. package/src/server-cookies/{descriptors → primitives}/$cookie.browser.ts +12 -12
  273. package/src/server-cookies/{descriptors → primitives}/$cookie.ts +13 -13
  274. package/src/server-cookies/providers/ServerCookiesProvider.ts +6 -5
  275. package/src/server-cookies/services/CookieParser.ts +1 -1
  276. package/src/server-cors/index.ts +3 -3
  277. package/src/server-cors/{descriptors → primitives}/$cors.ts +11 -13
  278. package/src/server-cors/providers/ServerCorsProvider.ts +5 -5
  279. package/src/server-links/index.browser.ts +5 -5
  280. package/src/server-links/index.ts +9 -9
  281. package/src/server-links/{descriptors → primitives}/$remote.ts +11 -11
  282. package/src/server-links/providers/LinkProvider.ts +7 -7
  283. package/src/server-links/providers/{RemoteDescriptorProvider.ts → RemotePrimitiveProvider.ts} +6 -6
  284. package/src/server-links/providers/ServerLinksProvider.ts +3 -3
  285. package/src/server-proxy/index.ts +3 -3
  286. package/src/server-proxy/{descriptors → primitives}/$proxy.ts +8 -8
  287. package/src/server-proxy/providers/ServerProxyProvider.ts +4 -4
  288. package/src/server-rate-limit/index.ts +6 -6
  289. package/src/server-rate-limit/{descriptors → primitives}/$rateLimit.ts +13 -13
  290. package/src/server-rate-limit/providers/ServerRateLimitProvider.ts +5 -5
  291. package/src/server-security/index.ts +3 -3
  292. package/src/server-security/{descriptors → primitives}/$basicAuth.ts +13 -13
  293. package/src/server-security/providers/ServerBasicAuthProvider.ts +5 -5
  294. package/src/server-security/providers/ServerSecurityProvider.ts +4 -4
  295. package/src/server-static/index.ts +3 -3
  296. package/src/server-static/{descriptors → primitives}/$serve.ts +8 -10
  297. package/src/server-static/providers/ServerStaticProvider.ts +24 -9
  298. package/src/server-swagger/index.ts +5 -5
  299. package/src/server-swagger/{descriptors → primitives}/$swagger.ts +9 -9
  300. package/src/server-swagger/providers/ServerSwaggerProvider.ts +11 -10
  301. package/src/sms/index.ts +4 -4
  302. package/src/sms/{descriptors → primitives}/$sms.ts +8 -8
  303. package/src/thread/index.ts +3 -3
  304. package/src/thread/{descriptors → primitives}/$thread.ts +13 -13
  305. package/src/thread/providers/ThreadProvider.ts +7 -9
  306. package/src/topic/index.ts +5 -5
  307. package/src/topic/{descriptors → primitives}/$subscriber.ts +14 -14
  308. package/src/topic/{descriptors → primitives}/$topic.ts +10 -10
  309. package/src/topic/providers/TopicProvider.ts +4 -4
  310. package/src/vite/tasks/copyAssets.ts +1 -1
  311. package/src/vite/tasks/generateSitemap.ts +3 -3
  312. package/src/vite/tasks/prerenderPages.ts +2 -2
  313. package/src/vite/tasks/runAlepha.ts +2 -2
  314. package/src/websocket/index.browser.ts +3 -3
  315. package/src/websocket/index.shared.ts +2 -2
  316. package/src/websocket/index.ts +4 -4
  317. package/src/websocket/interfaces/WebSocketInterfaces.ts +3 -3
  318. package/src/websocket/{descriptors → primitives}/$channel.ts +10 -10
  319. package/src/websocket/{descriptors → primitives}/$websocket.ts +8 -8
  320. package/src/websocket/providers/NodeWebSocketServerProvider.ts +7 -7
  321. package/src/websocket/providers/WebSocketServerProvider.ts +3 -3
  322. package/src/websocket/services/WebSocketClient.ts +5 -5
  323. package/dist/cli/dist-Dl9Vl7Ur.js.map +0 -1
  324. package/src/api-notifications/providers/MemorySmsProvider.ts +0 -20
  325. package/src/api-notifications/providers/SmsProvider.ts +0 -8
  326. /package/src/core/{descriptors → primitives}/$atom.ts +0 -0
  327. /package/src/core/{descriptors → primitives}/$env.ts +0 -0
  328. /package/src/server-auth/{descriptors → primitives}/$authApple.ts +0 -0
  329. /package/src/server-links/{descriptors → primitives}/$client.ts +0 -0
@@ -1,10 +1,10 @@
1
1
  import { $module } from "alepha";
2
- import { $batch } from "./descriptors/$batch.ts";
2
+ import { $batch } from "./primitives/$batch.ts";
3
3
  import { BatchProvider } from "./providers/BatchProvider.ts";
4
4
 
5
5
  // ---------------------------------------------------------------------------------------------------------------------
6
6
 
7
- export * from "./descriptors/$batch.ts";
7
+ export * from "./primitives/$batch.ts";
8
8
  export * from "./providers/BatchProvider.ts";
9
9
 
10
10
  // ---------------------------------------------------------------------------------------------------------------------
@@ -53,6 +53,6 @@ export * from "./providers/BatchProvider.ts";
53
53
  */
54
54
  export const AlephaBatch = $module({
55
55
  name: "alepha.batch",
56
- descriptors: [$batch],
56
+ primitives: [$batch],
57
57
  services: [BatchProvider],
58
58
  });
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  $hook,
3
3
  $inject,
4
- createDescriptor,
5
- Descriptor,
4
+ createPrimitive,
6
5
  KIND,
6
+ Primitive,
7
7
  type Static,
8
8
  type TSchema,
9
9
  } from "alepha";
10
10
  import type { DurationLike } from "alepha/datetime";
11
- import type { RetryDescriptorOptions } from "alepha/retry";
11
+ import type { RetryPrimitiveOptions } from "alepha/retry";
12
12
  import {
13
13
  type BatchContext,
14
14
  type BatchItemState,
@@ -17,19 +17,16 @@ import {
17
17
  } from "../providers/BatchProvider.ts";
18
18
 
19
19
  /**
20
- * Creates a batch processing descriptor for efficient grouping and processing of multiple operations.
20
+ * Creates a batch processing primitive for efficient grouping and processing of multiple operations.
21
21
  */
22
22
  export const $batch = <TItem extends TSchema, TResponse>(
23
- options: BatchDescriptorOptions<TItem, TResponse>,
24
- ): BatchDescriptor<TItem, TResponse> =>
25
- createDescriptor(BatchDescriptor<TItem, TResponse>, options);
23
+ options: BatchPrimitiveOptions<TItem, TResponse>,
24
+ ): BatchPrimitive<TItem, TResponse> =>
25
+ createPrimitive(BatchPrimitive<TItem, TResponse>, options);
26
26
 
27
27
  // ---------------------------------------------------------------------------------------------------------------------
28
28
 
29
- export interface BatchDescriptorOptions<
30
- TItem extends TSchema,
31
- TResponse = any,
32
- > {
29
+ export interface BatchPrimitiveOptions<TItem extends TSchema, TResponse = any> {
33
30
  /**
34
31
  * TypeBox schema for validating each item added to the batch.
35
32
  */
@@ -69,7 +66,7 @@ export interface BatchDescriptorOptions<
69
66
  /**
70
67
  * Retry configuration for failed batch processing operations.
71
68
  */
72
- retry?: Omit<RetryDescriptorOptions<() => Array<Static<TItem>>>, "handler">;
69
+ retry?: Omit<RetryPrimitiveOptions<() => Array<Static<TItem>>>, "handler">;
73
70
  }
74
71
 
75
72
  // ---------------------------------------------------------------------------------------------------------------------
@@ -78,16 +75,16 @@ export type { BatchItemState, BatchItemStatus };
78
75
 
79
76
  // ---------------------------------------------------------------------------------------------------------------------
80
77
 
81
- export class BatchDescriptor<
78
+ export class BatchPrimitive<
82
79
  TItem extends TSchema,
83
80
  TResponse = any,
84
- > extends Descriptor<BatchDescriptorOptions<TItem, TResponse>> {
81
+ > extends Primitive<BatchPrimitiveOptions<TItem, TResponse>> {
85
82
  protected readonly batchProvider = $inject(BatchProvider);
86
83
  protected readonly context: BatchContext<Static<TItem>, TResponse>;
87
84
 
88
85
  constructor(
89
86
  ...args: ConstructorParameters<
90
- typeof Descriptor<BatchDescriptorOptions<TItem, TResponse>>
87
+ typeof Primitive<BatchPrimitiveOptions<TItem, TResponse>>
91
88
  >
92
89
  ) {
93
90
  super(...args);
@@ -172,4 +169,4 @@ export class BatchDescriptor<
172
169
  });
173
170
  }
174
171
 
175
- $batch[KIND] = BatchDescriptor;
172
+ $batch[KIND] = BatchPrimitive;
@@ -213,13 +213,6 @@ export class BatchProvider {
213
213
  };
214
214
 
215
215
  // CAUTION: Do not log.debug/info here as it may cause infinite loops if logging is batched
216
- // log.trace is safe
217
-
218
- this.log.trace("Pushing item to batch", {
219
- id,
220
- partitionKey,
221
- item,
222
- });
223
216
 
224
217
  context.itemStates.set(id, itemState);
225
218
 
@@ -1,17 +1,17 @@
1
1
  import { $module, type FileLike } from "alepha";
2
2
  import {
3
3
  $bucket,
4
- type BucketDescriptor,
5
4
  type BucketFileOptions,
6
- } from "./descriptors/$bucket.ts";
5
+ type BucketPrimitive,
6
+ } from "./primitives/$bucket.ts";
7
7
  import { FileStorageProvider } from "./providers/FileStorageProvider.ts";
8
8
  import { LocalFileStorageProvider } from "./providers/LocalFileStorageProvider.ts";
9
9
  import { MemoryFileStorageProvider } from "./providers/MemoryFileStorageProvider.ts";
10
10
 
11
11
  // ---------------------------------------------------------------------------------------------------------------------
12
12
 
13
- export * from "./descriptors/$bucket.ts";
14
13
  export * from "./errors/FileNotFoundError.ts";
14
+ export * from "./primitives/$bucket.ts";
15
15
  export * from "./providers/FileStorageProvider.ts";
16
16
  export * from "./providers/LocalFileStorageProvider.ts";
17
17
  export * from "./providers/MemoryFileStorageProvider.ts";
@@ -27,7 +27,7 @@ declare module "alepha" {
27
27
  "bucket:file:uploaded": {
28
28
  id: string;
29
29
  file: FileLike;
30
- bucket: BucketDescriptor;
30
+ bucket: BucketPrimitive;
31
31
  options: BucketFileOptions;
32
32
  };
33
33
  /**
@@ -35,7 +35,7 @@ declare module "alepha" {
35
35
  */
36
36
  "bucket:file:deleted": {
37
37
  id: string;
38
- bucket: BucketDescriptor;
38
+ bucket: BucketPrimitive;
39
39
  };
40
40
  }
41
41
  }
@@ -43,9 +43,9 @@ declare module "alepha" {
43
43
  // ---------------------------------------------------------------------------------------------------------------------
44
44
 
45
45
  /**
46
- * Provides file storage capabilities through declarative bucket descriptors with support for multiple storage backends.
46
+ * Provides file storage capabilities through declarative bucket primitives with support for multiple storage backends.
47
47
  *
48
- * The bucket module enables unified file operations across different storage systems using the `$bucket` descriptor
48
+ * The bucket module enables unified file operations across different storage systems using the `$bucket` primitive
49
49
  * on class properties. It abstracts storage provider differences, offering consistent APIs for local filesystem,
50
50
  * cloud storage, or in-memory storage for testing environments.
51
51
  *
@@ -55,18 +55,20 @@ declare module "alepha" {
55
55
  */
56
56
  export const AlephaBucket = $module({
57
57
  name: "alepha.bucket",
58
- descriptors: [$bucket],
58
+ primitives: [$bucket],
59
59
  services: [
60
60
  FileStorageProvider,
61
61
  MemoryFileStorageProvider,
62
62
  LocalFileStorageProvider,
63
63
  ],
64
- register: (alepha) =>
64
+ register: (alepha) => {
65
65
  alepha.with({
66
66
  optional: true,
67
67
  provide: FileStorageProvider,
68
- use: alepha.isTest()
69
- ? MemoryFileStorageProvider
70
- : LocalFileStorageProvider,
71
- }),
68
+ use:
69
+ alepha.isTest() || alepha.isServerless()
70
+ ? MemoryFileStorageProvider
71
+ : LocalFileStorageProvider,
72
+ });
73
+ },
72
74
  });
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  $inject,
3
- createDescriptor,
4
- Descriptor,
3
+ createPrimitive,
5
4
  type FileLike,
6
5
  KIND,
6
+ Primitive,
7
7
  type Service,
8
8
  } from "alepha";
9
9
  import { FileSystemProvider } from "alepha/file";
@@ -12,7 +12,7 @@ import { FileStorageProvider } from "../providers/FileStorageProvider.ts";
12
12
  import { MemoryFileStorageProvider } from "../providers/MemoryFileStorageProvider.ts";
13
13
 
14
14
  /**
15
- * Creates a bucket descriptor for file storage and management with configurable validation.
15
+ * Creates a bucket primitive for file storage and management with configurable validation.
16
16
  *
17
17
  * Provides a comprehensive file storage system that handles uploads, downloads, validation,
18
18
  * and management across multiple storage backends with MIME type and size limit controls.
@@ -60,10 +60,10 @@ import { MemoryFileStorageProvider } from "../providers/MemoryFileStorageProvide
60
60
  * }
61
61
  * ```
62
62
  */
63
- export const $bucket = (options: BucketDescriptorOptions) =>
64
- createDescriptor(BucketDescriptor, options);
63
+ export const $bucket = (options: BucketPrimitiveOptions) =>
64
+ createPrimitive(BucketPrimitive, options);
65
65
 
66
- export interface BucketDescriptorOptions extends BucketFileOptions {
66
+ export interface BucketPrimitiveOptions extends BucketFileOptions {
67
67
  /**
68
68
  * File storage provider configuration for the bucket.
69
69
  *
@@ -204,7 +204,7 @@ export interface BucketFileOptions {
204
204
 
205
205
  // ---------------------------------------------------------------------------------------------------------------------
206
206
 
207
- export class BucketDescriptor extends Descriptor<BucketDescriptorOptions> {
207
+ export class BucketPrimitive extends Primitive<BucketPrimitiveOptions> {
208
208
  public readonly provider = this.$provider();
209
209
  private readonly fileSystem = $inject(FileSystemProvider);
210
210
 
@@ -302,7 +302,7 @@ export class BucketDescriptor extends Descriptor<BucketDescriptorOptions> {
302
302
  }
303
303
  }
304
304
 
305
- $bucket[KIND] = BucketDescriptor;
305
+ $bucket[KIND] = BucketPrimitive;
306
306
 
307
307
  // ---------------------------------------------------------------------------------------------------------------------
308
308
 
@@ -17,8 +17,8 @@ import {
17
17
  } from "alepha";
18
18
  import { FileDetector, FileSystemProvider } from "alepha/file";
19
19
  import { $logger } from "alepha/logger";
20
- import { $bucket } from "../descriptors/$bucket.ts";
21
20
  import { FileNotFoundError } from "../errors/FileNotFoundError.ts";
21
+ import { $bucket } from "../primitives/$bucket.ts";
22
22
  import type { FileStorageProvider } from "./FileStorageProvider.ts";
23
23
 
24
24
  // ---------------------------------------------------------------------------------------------------------------------
@@ -68,7 +68,7 @@ export class LocalFileStorageProvider implements FileStorageProvider {
68
68
  this.alepha.isTest() &&
69
69
  this.storagePath === localFileStorageOptions.options.default.storagePath
70
70
  ) {
71
- this.alepha.state.set(localFileStorageOptions, {
71
+ this.alepha.store.set(localFileStorageOptions, {
72
72
  storagePath: join(tmpdir(), `alepha-test-${Date.now()}`),
73
73
  });
74
74
  }
@@ -82,7 +82,7 @@ export class LocalFileStorageProvider implements FileStorageProvider {
82
82
  await mkdir(this.storagePath, { recursive: true });
83
83
  } catch {}
84
84
 
85
- for (const bucket of this.alepha.descriptors($bucket)) {
85
+ for (const bucket of this.alepha.primitives($bucket)) {
86
86
  if (bucket.provider !== this) {
87
87
  continue;
88
88
  }
@@ -1,11 +1,11 @@
1
1
  import { $module } from "alepha";
2
- import { $cache } from "./descriptors/$cache.ts";
2
+ import { $cache } from "./primitives/$cache.ts";
3
3
  import { CacheProvider } from "./providers/CacheProvider.ts";
4
4
  import { MemoryCacheProvider } from "./providers/MemoryCacheProvider.ts";
5
5
 
6
6
  // ---------------------------------------------------------------------------------------------------------------------
7
7
 
8
- export * from "./descriptors/$cache.ts";
8
+ export * from "./primitives/$cache.ts";
9
9
  export * from "./providers/CacheProvider.ts";
10
10
  export * from "./providers/MemoryCacheProvider.ts";
11
11
 
@@ -14,7 +14,7 @@ export * from "./providers/MemoryCacheProvider.ts";
14
14
  /**
15
15
  * Provides high-performance caching capabilities for Alepha applications with configurable TTL and multiple storage backends.
16
16
  *
17
- * The cache module enables declarative caching through the `$cache` descriptor, allowing you to cache method results,
17
+ * The cache module enables declarative caching through the `$cache` primitive, allowing you to cache method results,
18
18
  * API responses, or computed values with automatic invalidation and type safety. It supports both in-memory and
19
19
  * persistent storage backends for different performance and durability requirements.
20
20
  *
@@ -24,7 +24,7 @@ export * from "./providers/MemoryCacheProvider.ts";
24
24
  */
25
25
  export const AlephaCache = $module({
26
26
  name: "alepha.cache",
27
- descriptors: [$cache],
27
+ primitives: [$cache],
28
28
  services: [CacheProvider, MemoryCacheProvider],
29
29
  register: (alepha) =>
30
30
  alepha.with({
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  $env,
3
3
  $inject,
4
- createDescriptor,
5
- Descriptor,
4
+ createPrimitive,
6
5
  type InstantiableClass,
7
6
  KIND,
7
+ Primitive,
8
8
  t,
9
9
  } from "alepha";
10
10
  import { DateTimeProvider, type DurationLike } from "alepha/datetime";
@@ -13,7 +13,7 @@ import { CacheProvider } from "../providers/CacheProvider.ts";
13
13
  import { MemoryCacheProvider } from "../providers/MemoryCacheProvider.ts";
14
14
 
15
15
  /**
16
- * Creates a cache descriptor for high-performance data caching with automatic management.
16
+ * Creates a cache primitive for high-performance data caching with automatic management.
17
17
  *
18
18
  * Provides a caching layer that improves application performance by storing frequently accessed
19
19
  * data in memory or external stores like Redis, with support for both function result caching
@@ -61,14 +61,14 @@ import { MemoryCacheProvider } from "../providers/MemoryCacheProvider.ts";
61
61
  * ```
62
62
  */
63
63
  export const $cache = <TReturn = string, TParameter extends any[] = any[]>(
64
- options: CacheDescriptorOptions<TReturn, TParameter> = {},
65
- ): CacheDescriptorFn<TReturn, TParameter> => {
66
- const instance = createDescriptor(
67
- CacheDescriptor<TReturn, TParameter>,
64
+ options: CachePrimitiveOptions<TReturn, TParameter> = {},
65
+ ): CachePrimitiveFn<TReturn, TParameter> => {
66
+ const instance = createPrimitive(
67
+ CachePrimitive<TReturn, TParameter>,
68
68
  options,
69
69
  );
70
70
  const fn = (...args: TParameter): Promise<TReturn> => instance.run(...args);
71
- return Object.setPrototypeOf(fn, instance) as CacheDescriptorFn<
71
+ return Object.setPrototypeOf(fn, instance) as CachePrimitiveFn<
72
72
  TReturn,
73
73
  TParameter
74
74
  >;
@@ -76,7 +76,7 @@ export const $cache = <TReturn = string, TParameter extends any[] = any[]>(
76
76
 
77
77
  // ---------------------------------------------------------------------------------------------------------------------
78
78
 
79
- export interface CacheDescriptorOptions<
79
+ export interface CachePrimitiveOptions<
80
80
  TReturn = any,
81
81
  TParameter extends any[] = any[],
82
82
  > {
@@ -130,10 +130,10 @@ const envSchema = t.object({
130
130
  }),
131
131
  });
132
132
 
133
- export class CacheDescriptor<
133
+ export class CachePrimitive<
134
134
  TReturn = any,
135
135
  TParameter extends any[] = any[],
136
- > extends Descriptor<CacheDescriptorOptions<TReturn, TParameter>> {
136
+ > extends Primitive<CachePrimitiveOptions<TReturn, TParameter>> {
137
137
  protected readonly env = $env(envSchema);
138
138
  protected readonly dateTimeProvider = $inject(DateTimeProvider);
139
139
  protected readonly provider = this.$provider();
@@ -277,14 +277,14 @@ export class CacheDescriptor<
277
277
  }
278
278
  }
279
279
 
280
- export interface CacheDescriptorFn<
280
+ export interface CachePrimitiveFn<
281
281
  TReturn = any,
282
282
  TParameter extends any[] = any[],
283
- > extends CacheDescriptor<TReturn, TParameter> {
283
+ > extends CachePrimitive<TReturn, TParameter> {
284
284
  /**
285
- * Run the cache descriptor with the provided arguments.
285
+ * Run the cache primitive with the provided arguments.
286
286
  */
287
287
  (...args: TParameter): Promise<TReturn>;
288
288
  }
289
289
 
290
- $cache[KIND] = CacheDescriptor;
290
+ $cache[KIND] = CachePrimitive;
@@ -1,4 +1,6 @@
1
- import { $module } from "alepha";
1
+ import { join } from "node:path";
2
+ import { $hook, $inject, $module, Alepha } from "alepha";
3
+ import { FileSystemProvider } from "alepha/file";
2
4
  import { BiomeCommands } from "../commands/BiomeCommands.ts";
3
5
  import { CoreCommands } from "../commands/CoreCommands.ts";
4
6
  import { DrizzleCommands } from "../commands/DrizzleCommands.ts";
@@ -6,9 +8,33 @@ import { VerifyCommands } from "../commands/VerifyCommands.ts";
6
8
  import { ViteCommands } from "../commands/ViteCommands.ts";
7
9
  import { ProcessRunner } from "../services/ProcessRunner.ts";
8
10
 
11
+ class AlephaCliExtension {
12
+ protected readonly alepha = $inject(Alepha);
13
+ protected readonly fs = $inject(FileSystemProvider);
14
+ protected readonly onConfigure = $hook({
15
+ on: "configure",
16
+ handler: async () => {
17
+ const extensionPath = join(process.cwd(), "alepha.config.ts");
18
+ const hasExtension = await this.fs.exists(extensionPath);
19
+ if (!hasExtension) {
20
+ return;
21
+ }
22
+
23
+ // import
24
+ const { default: Extension } = await import(extensionPath);
25
+ if (typeof Extension !== "function") {
26
+ return;
27
+ }
28
+
29
+ this.alepha.with(Extension);
30
+ },
31
+ });
32
+ }
33
+
9
34
  export const AlephaCli = $module({
10
35
  name: "alepha.cli",
11
36
  services: [
37
+ AlephaCliExtension,
12
38
  ProcessRunner,
13
39
  CoreCommands,
14
40
  DrizzleCommands,
@@ -9,6 +9,7 @@ import type { InlineConfig } from "tsdown";
9
9
  interface Module {
10
10
  name: string;
11
11
  dependencies: string[];
12
+ native?: boolean;
12
13
  browser?: boolean;
13
14
  node?: boolean;
14
15
  }
@@ -41,11 +42,20 @@ export class AlephaPackageBuilderCli {
41
42
  pkgData.exports[path] = {};
42
43
  // order is important here for compatibility
43
44
  pkgData.exports[path].types = `./src/${item.name}/index.ts`;
45
+ if (item.native) {
46
+ pkgData.exports[path]["react-native"] =
47
+ `./src/${item.name}/index.native.ts`;
48
+ } else if (item.browser) {
49
+ pkgData.exports[path]["react-native"] =
50
+ `./src/${item.name}/index.browser.ts`;
51
+ }
52
+
44
53
  if (item.browser) {
45
54
  pkgData.exports[path].browser = `./src/${item.name}/index.browser.ts`;
46
55
  }
56
+
47
57
  pkgData.exports[path].import = `./src/${item.name}/index.ts`;
48
- pkgData.exports[path].require = `./src/${item.name}/index.ts`;
58
+ pkgData.exports[path].default = `./src/${item.name}/index.ts`;
49
59
  }
50
60
 
51
61
  if (packageName === "alepha") {
@@ -70,7 +80,9 @@ export class AlephaPackageBuilderCli {
70
80
  const external = [
71
81
  "alepha",
72
82
  packageName,
73
- ...modules.map((item) => `${packageName}/${item.name}`),
83
+ ...modules.map(
84
+ (item) => `${packageName}/${item.name.replace("-", "/")}`,
85
+ ),
74
86
  ];
75
87
 
76
88
  await run.rm(this.dist);
@@ -90,6 +102,17 @@ export class AlephaPackageBuilderCli {
90
102
  external,
91
103
  });
92
104
 
105
+ if (item.native) {
106
+ entries.push({
107
+ entry: join(src, "index.native.ts"),
108
+ outDir: dest,
109
+ platform: "neutral",
110
+ sourcemap: true,
111
+ dts: false,
112
+ external,
113
+ });
114
+ }
115
+
93
116
  if (item.browser) {
94
117
  entries.push({
95
118
  entry: join(src, "index.browser.ts"),
@@ -244,6 +267,7 @@ export async function analyzeModules(
244
267
 
245
268
  // Check for browser/node entry points
246
269
  const hasBrowser = await fileExists(join(modulePath, "index.browser.ts"));
270
+ const hasNative = await fileExists(join(modulePath, "index.native.ts"));
247
271
  const hasNode = await fileExists(join(modulePath, "index.node.ts"));
248
272
 
249
273
  // Get all .ts/.tsx files in this module
@@ -276,6 +300,7 @@ export async function analyzeModules(
276
300
  dependencies: Array.from(dependencies),
277
301
  };
278
302
 
303
+ if (hasNative) module.native = true;
279
304
  if (hasBrowser) module.browser = true;
280
305
  if (hasNode) module.node = true;
281
306
 
@@ -62,11 +62,15 @@ export class CoreCommands {
62
62
  react: t.optional(
63
63
  t.boolean({ description: "Include Alepha React dependencies" }),
64
64
  ),
65
- admin: t.optional(
66
- t.boolean({ description: "Include Alepha admin panel dependencies" }),
65
+ ui: t.optional(
66
+ t.boolean({ description: "Include Alepha UI dependencies" }),
67
67
  ),
68
68
  }),
69
69
  handler: async ({ run, flags, root }) => {
70
+ if (flags.ui) {
71
+ flags.react = true;
72
+ }
73
+
70
74
  await run({
71
75
  name: "Ensuring configuration files",
72
76
  handler: async () => {
@@ -49,8 +49,8 @@ export class DrizzleCommands {
49
49
  alepha.inject<DrizzleKitProvider>("DrizzleKitProvider");
50
50
  const accepted = new Set<string>([]);
51
51
 
52
- for (const descriptor of repositoryProvider.getRepositories()) {
53
- const provider = descriptor.provider;
52
+ for (const primitive of repositoryProvider.getRepositories()) {
53
+ const provider = primitive.provider;
54
54
  const providerName = provider.name;
55
55
  if (accepted.has(providerName)) {
56
56
  continue;
@@ -124,7 +124,7 @@ export class DrizzleCommands {
124
124
  * Generate database migration files
125
125
  *
126
126
  * - Loads the Alepha instance from the specified entry file.
127
- * - Retrieves all repository descriptors to gather database models.
127
+ * - Retrieves all repository primitives to gather database models.
128
128
  * - Creates temporary entity definitions based on the current database schema.
129
129
  * - Writes these definitions to a temporary schema file. (node_modules/.db/entities.ts)
130
130
  * - Invokes Drizzle Kit's CLI to generate migration files based on the current schema.
@@ -167,7 +167,7 @@ export class DrizzleCommands {
167
167
  * Push database schema changes directly to the database
168
168
  *
169
169
  * - Loads the Alepha instance from the specified entry file.
170
- * - Retrieves all repository descriptors to gather database models.
170
+ * - Retrieves all repository primitives to gather database models.
171
171
  * - Creates temporary entity definitions and Drizzle config.
172
172
  * - Invokes Drizzle Kit's push command to apply schema changes directly.
173
173
  */
@@ -198,7 +198,7 @@ export class DrizzleCommands {
198
198
  * Apply pending database migrations
199
199
  *
200
200
  * - Loads the Alepha instance from the specified entry file.
201
- * - Retrieves all repository descriptors to gather database models.
201
+ * - Retrieves all repository primitives to gather database models.
202
202
  * - Creates temporary entity definitions and Drizzle config.
203
203
  * - Invokes Drizzle Kit's migrate command to apply pending migrations.
204
204
  */
@@ -229,7 +229,7 @@ export class DrizzleCommands {
229
229
  * Launch Drizzle Studio database browser
230
230
  *
231
231
  * - Loads the Alepha instance from the specified entry file.
232
- * - Retrieves all repository descriptors to gather database models.
232
+ * - Retrieves all repository primitives to gather database models.
233
233
  * - Creates temporary entity definitions and Drizzle config.
234
234
  * - Invokes Drizzle Kit's studio command to launch the web-based database browser.
235
235
  */
@@ -35,7 +35,7 @@ export class VerifyCommands {
35
35
  await run("alepha test");
36
36
  }
37
37
 
38
- if (await this.utils.hasDir(root, "migrations")) {
38
+ if (await this.utils.exists(root, "migrations")) {
39
39
  await run("alepha db:check-migrations");
40
40
  }
41
41
 
@@ -68,7 +68,12 @@ export class ViteCommands {
68
68
  await access(join(root, "index.html"));
69
69
  } catch {
70
70
  this.log.trace("No index.html found, running entry file with tsx");
71
- await this.runner.exec(`tsx watch ${entry}`);
71
+ let cmd = "tsx --watch";
72
+ if (await this.utils.exists(root, ".env")) {
73
+ cmd += ` --env-file=./.env`;
74
+ }
75
+ cmd += ` ${entry}`;
76
+ await this.runner.exec(cmd);
72
77
  return;
73
78
  }
74
79
 
@@ -140,6 +145,7 @@ export class ViteCommands {
140
145
  ] ?? {};
141
146
 
142
147
  const stats = flags.stats ?? viteAlephaBuildOptions.stats ?? false;
148
+ const hasServer = viteAlephaBuildOptions.serverEntry !== false;
143
149
 
144
150
  let hasClient = false;
145
151
  try {
@@ -184,7 +190,7 @@ export class ViteCommands {
184
190
  });
185
191
 
186
192
  // Server will handle index.html if both client & server are built
187
- if (clientBuilt) {
193
+ if (clientBuilt && hasServer) {
188
194
  await unlink(`${distDir}/${clientDir}/index.html`);
189
195
  }
190
196
  },