alepha 0.14.2 → 0.14.4

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 (405) hide show
  1. package/README.md +1 -1
  2. package/dist/api/audits/index.browser.js +5 -5
  3. package/dist/api/audits/index.browser.js.map +1 -1
  4. package/dist/api/audits/index.d.ts +706 -785
  5. package/dist/api/audits/index.d.ts.map +1 -1
  6. package/dist/api/audits/index.js +13 -13
  7. package/dist/api/audits/index.js.map +1 -1
  8. package/dist/api/files/index.browser.js +5 -5
  9. package/dist/api/files/index.browser.js.map +1 -1
  10. package/dist/api/files/index.d.ts +58 -137
  11. package/dist/api/files/index.d.ts.map +1 -1
  12. package/dist/api/files/index.js +71 -71
  13. package/dist/api/files/index.js.map +1 -1
  14. package/dist/api/jobs/index.browser.js +5 -5
  15. package/dist/api/jobs/index.browser.js.map +1 -1
  16. package/dist/api/jobs/index.d.ts +29 -108
  17. package/dist/api/jobs/index.d.ts.map +1 -1
  18. package/dist/api/jobs/index.js +10 -10
  19. package/dist/api/jobs/index.js.map +1 -1
  20. package/dist/api/notifications/index.browser.js +10 -10
  21. package/dist/api/notifications/index.browser.js.map +1 -1
  22. package/dist/api/notifications/index.d.ts +504 -171
  23. package/dist/api/notifications/index.d.ts.map +1 -1
  24. package/dist/api/notifications/index.js +12 -12
  25. package/dist/api/notifications/index.js.map +1 -1
  26. package/dist/api/parameters/index.browser.js +163 -10
  27. package/dist/api/parameters/index.browser.js.map +1 -1
  28. package/dist/api/parameters/index.d.ts +277 -351
  29. package/dist/api/parameters/index.d.ts.map +1 -1
  30. package/dist/api/parameters/index.js +196 -91
  31. package/dist/api/parameters/index.js.map +1 -1
  32. package/dist/api/users/index.browser.js +19 -19
  33. package/dist/api/users/index.browser.js.map +1 -1
  34. package/dist/api/users/index.d.ts +787 -852
  35. package/dist/api/users/index.d.ts.map +1 -1
  36. package/dist/api/users/index.js +827 -596
  37. package/dist/api/users/index.js.map +1 -1
  38. package/dist/api/verifications/index.browser.js +6 -6
  39. package/dist/api/verifications/index.browser.js.map +1 -1
  40. package/dist/api/verifications/index.d.ts +128 -128
  41. package/dist/api/verifications/index.d.ts.map +1 -1
  42. package/dist/api/verifications/index.js +6 -6
  43. package/dist/api/verifications/index.js.map +1 -1
  44. package/dist/bin/index.d.ts +1 -2
  45. package/dist/bin/index.js +0 -1
  46. package/dist/bin/index.js.map +1 -1
  47. package/dist/cli/index.d.ts +252 -131
  48. package/dist/cli/index.d.ts.map +1 -1
  49. package/dist/cli/index.js +595 -395
  50. package/dist/cli/index.js.map +1 -1
  51. package/dist/command/index.d.ts +46 -11
  52. package/dist/command/index.d.ts.map +1 -1
  53. package/dist/command/index.js +99 -19
  54. package/dist/command/index.js.map +1 -1
  55. package/dist/core/index.browser.js +40 -22
  56. package/dist/core/index.browser.js.map +1 -1
  57. package/dist/core/index.d.ts +45 -1
  58. package/dist/core/index.d.ts.map +1 -1
  59. package/dist/core/index.js +40 -22
  60. package/dist/core/index.js.map +1 -1
  61. package/dist/core/index.native.js +40 -22
  62. package/dist/core/index.native.js.map +1 -1
  63. package/dist/fake/index.js +195 -168
  64. package/dist/fake/index.js.map +1 -1
  65. package/dist/file/index.d.ts +8 -0
  66. package/dist/file/index.d.ts.map +1 -1
  67. package/dist/file/index.js +3 -0
  68. package/dist/file/index.js.map +1 -1
  69. package/dist/logger/index.d.ts +1 -1
  70. package/dist/logger/index.d.ts.map +1 -1
  71. package/dist/logger/index.js +12 -2
  72. package/dist/logger/index.js.map +1 -1
  73. package/dist/mcp/index.js +1 -1
  74. package/dist/mcp/index.js.map +1 -1
  75. package/dist/orm/index.d.ts +59 -195
  76. package/dist/orm/index.d.ts.map +1 -1
  77. package/dist/orm/index.js +201 -430
  78. package/dist/orm/index.js.map +1 -1
  79. package/dist/security/index.d.ts +1 -1
  80. package/dist/security/index.d.ts.map +1 -1
  81. package/dist/security/index.js +1 -1
  82. package/dist/security/index.js.map +1 -1
  83. package/dist/server/auth/index.d.ts +171 -155
  84. package/dist/server/auth/index.d.ts.map +1 -1
  85. package/dist/server/auth/index.js +0 -1
  86. package/dist/server/auth/index.js.map +1 -1
  87. package/dist/server/cache/index.d.ts +12 -0
  88. package/dist/server/cache/index.d.ts.map +1 -1
  89. package/dist/server/cache/index.js +55 -2
  90. package/dist/server/cache/index.js.map +1 -1
  91. package/dist/server/compress/index.d.ts +6 -0
  92. package/dist/server/compress/index.d.ts.map +1 -1
  93. package/dist/server/compress/index.js +38 -1
  94. package/dist/server/compress/index.js.map +1 -1
  95. package/dist/server/core/index.browser.js +2 -2
  96. package/dist/server/core/index.browser.js.map +1 -1
  97. package/dist/server/core/index.d.ts +10 -10
  98. package/dist/server/core/index.d.ts.map +1 -1
  99. package/dist/server/core/index.js +7 -4
  100. package/dist/server/core/index.js.map +1 -1
  101. package/dist/server/links/index.browser.js +22 -6
  102. package/dist/server/links/index.browser.js.map +1 -1
  103. package/dist/server/links/index.d.ts +46 -44
  104. package/dist/server/links/index.d.ts.map +1 -1
  105. package/dist/server/links/index.js +24 -41
  106. package/dist/server/links/index.js.map +1 -1
  107. package/dist/server/static/index.d.ts.map +1 -1
  108. package/dist/server/static/index.js +4 -0
  109. package/dist/server/static/index.js.map +1 -1
  110. package/dist/server/swagger/index.d.ts +2 -1
  111. package/dist/server/swagger/index.d.ts.map +1 -1
  112. package/dist/server/swagger/index.js +9 -5
  113. package/dist/server/swagger/index.js.map +1 -1
  114. package/dist/vite/index.d.ts +101 -106
  115. package/dist/vite/index.d.ts.map +1 -1
  116. package/dist/vite/index.js +574 -503
  117. package/dist/vite/index.js.map +1 -1
  118. package/dist/websocket/index.d.ts +7 -7
  119. package/package.json +7 -7
  120. package/src/api/audits/controllers/{AuditController.ts → AdminAuditController.ts} +5 -6
  121. package/src/api/audits/entities/audits.ts +5 -5
  122. package/src/api/audits/index.browser.ts +1 -1
  123. package/src/api/audits/index.ts +3 -3
  124. package/src/api/audits/primitives/$audit.spec.ts +276 -0
  125. package/src/api/audits/services/AuditService.spec.ts +495 -0
  126. package/src/api/files/__tests__/$bucket.spec.ts +91 -0
  127. package/src/api/files/controllers/AdminFileStatsController.spec.ts +166 -0
  128. package/src/api/files/controllers/{StorageStatsController.ts → AdminFileStatsController.ts} +2 -2
  129. package/src/api/files/controllers/FileController.spec.ts +558 -0
  130. package/src/api/files/controllers/FileController.ts +4 -5
  131. package/src/api/files/entities/files.ts +5 -5
  132. package/src/api/files/index.browser.ts +1 -1
  133. package/src/api/files/index.ts +4 -4
  134. package/src/api/files/jobs/FileJobs.spec.ts +52 -0
  135. package/src/api/files/services/FileService.spec.ts +109 -0
  136. package/src/api/jobs/__tests__/JobController.spec.ts +343 -0
  137. package/src/api/jobs/controllers/{JobController.ts → AdminJobController.ts} +2 -2
  138. package/src/api/jobs/entities/jobExecutions.ts +5 -5
  139. package/src/api/jobs/index.ts +3 -3
  140. package/src/api/jobs/primitives/$job.spec.ts +476 -0
  141. package/src/api/notifications/controllers/{NotificationController.ts → AdminNotificationController.ts} +4 -5
  142. package/src/api/notifications/entities/notifications.ts +5 -5
  143. package/src/api/notifications/index.browser.ts +1 -1
  144. package/src/api/notifications/index.ts +4 -4
  145. package/src/api/parameters/controllers/{ConfigController.ts → AdminConfigController.ts} +46 -107
  146. package/src/api/parameters/entities/parameters.ts +7 -17
  147. package/src/api/parameters/index.ts +3 -3
  148. package/src/api/parameters/primitives/$config.spec.ts +356 -0
  149. package/src/api/parameters/schemas/activateConfigBodySchema.ts +12 -0
  150. package/src/api/parameters/schemas/checkScheduledResponseSchema.ts +8 -0
  151. package/src/api/parameters/schemas/configCurrentResponseSchema.ts +13 -0
  152. package/src/api/parameters/schemas/configHistoryResponseSchema.ts +9 -0
  153. package/src/api/parameters/schemas/configNameParamSchema.ts +10 -0
  154. package/src/api/parameters/schemas/configNamesResponseSchema.ts +8 -0
  155. package/src/api/parameters/schemas/configTreeNodeSchema.ts +13 -0
  156. package/src/api/parameters/schemas/configVersionParamSchema.ts +9 -0
  157. package/src/api/parameters/schemas/configVersionResponseSchema.ts +9 -0
  158. package/src/api/parameters/schemas/configsByStatusResponseSchema.ts +9 -0
  159. package/src/api/parameters/schemas/createConfigVersionBodySchema.ts +24 -0
  160. package/src/api/parameters/schemas/index.ts +15 -0
  161. package/src/api/parameters/schemas/parameterResponseSchema.ts +26 -0
  162. package/src/api/parameters/schemas/parameterStatusSchema.ts +13 -0
  163. package/src/api/parameters/schemas/rollbackConfigBodySchema.ts +15 -0
  164. package/src/api/parameters/schemas/statusParamSchema.ts +9 -0
  165. package/src/api/users/__tests__/EmailVerification.spec.ts +369 -0
  166. package/src/api/users/__tests__/PasswordReset.spec.ts +550 -0
  167. package/src/api/users/controllers/AdminIdentityController.spec.ts +365 -0
  168. package/src/api/users/controllers/{IdentityController.ts → AdminIdentityController.ts} +3 -4
  169. package/src/api/users/controllers/AdminSessionController.spec.ts +274 -0
  170. package/src/api/users/controllers/{SessionController.ts → AdminSessionController.ts} +3 -4
  171. package/src/api/users/controllers/AdminUserController.spec.ts +372 -0
  172. package/src/api/users/controllers/AdminUserController.ts +116 -0
  173. package/src/api/users/controllers/UserController.ts +4 -107
  174. package/src/api/users/controllers/UserRealmController.ts +3 -0
  175. package/src/api/users/entities/identities.ts +6 -6
  176. package/src/api/users/entities/sessions.ts +6 -6
  177. package/src/api/users/entities/users.ts +9 -9
  178. package/src/api/users/index.ts +9 -6
  179. package/src/api/users/primitives/$userRealm.ts +13 -8
  180. package/src/api/users/services/CredentialService.spec.ts +509 -0
  181. package/src/api/users/services/CredentialService.ts +46 -0
  182. package/src/api/users/services/IdentityService.ts +15 -0
  183. package/src/api/users/services/RegistrationService.spec.ts +630 -0
  184. package/src/api/users/services/RegistrationService.ts +18 -0
  185. package/src/api/users/services/SessionService.spec.ts +301 -0
  186. package/src/api/users/services/SessionService.ts +110 -1
  187. package/src/api/users/services/UserService.ts +67 -2
  188. package/src/api/verifications/__tests__/CodeVerification.spec.ts +318 -0
  189. package/src/api/verifications/__tests__/LinkVerification.spec.ts +279 -0
  190. package/src/api/verifications/entities/verifications.ts +6 -6
  191. package/src/api/verifications/jobs/VerificationJobs.spec.ts +50 -0
  192. package/src/batch/__tests__/startup-buffering.spec.ts +458 -0
  193. package/src/batch/primitives/$batch.spec.ts +766 -0
  194. package/src/batch/providers/BatchProvider.spec.ts +786 -0
  195. package/src/bin/index.ts +0 -1
  196. package/src/bucket/__tests__/shared.ts +194 -0
  197. package/src/bucket/primitives/$bucket.spec.ts +104 -0
  198. package/src/bucket/providers/FileStorageProvider.spec.ts +13 -0
  199. package/src/bucket/providers/LocalFileStorageProvider.spec.ts +77 -0
  200. package/src/bucket/providers/MemoryFileStorageProvider.spec.ts +82 -0
  201. package/src/cache/core/__tests__/shared.ts +377 -0
  202. package/src/cache/core/primitives/$cache.spec.ts +111 -0
  203. package/src/cache/redis/__tests__/cache-redis.spec.ts +70 -0
  204. package/src/cli/apps/AlephaCli.ts +25 -6
  205. package/src/cli/atoms/buildOptions.ts +88 -0
  206. package/src/cli/commands/build.ts +32 -69
  207. package/src/cli/commands/db.ts +0 -4
  208. package/src/cli/commands/dev.ts +34 -10
  209. package/src/cli/commands/gen/changelog.spec.ts +315 -0
  210. package/src/cli/commands/{changelog.ts → gen/changelog.ts} +9 -9
  211. package/src/cli/commands/gen/env.ts +53 -0
  212. package/src/cli/commands/gen/openapi.ts +71 -0
  213. package/src/cli/commands/gen/resource.ts +15 -0
  214. package/src/cli/commands/gen.ts +24 -0
  215. package/src/cli/commands/init.ts +2 -1
  216. package/src/cli/commands/root.ts +12 -3
  217. package/src/cli/commands/test.ts +0 -1
  218. package/src/cli/commands/typecheck.ts +5 -0
  219. package/src/cli/commands/verify.ts +1 -1
  220. package/src/cli/defineConfig.ts +49 -7
  221. package/src/cli/index.ts +2 -2
  222. package/src/cli/services/AlephaCliUtils.ts +105 -55
  223. package/src/cli/services/GitMessageParser.ts +1 -1
  224. package/src/command/helpers/Asker.spec.ts +127 -0
  225. package/src/command/helpers/Runner.spec.ts +126 -0
  226. package/src/command/helpers/Runner.ts +1 -1
  227. package/src/command/primitives/$command.spec.ts +1588 -0
  228. package/src/command/primitives/$command.ts +0 -6
  229. package/src/command/providers/CliProvider.ts +75 -27
  230. package/src/core/Alepha.ts +87 -0
  231. package/src/core/__tests__/Alepha-emit.spec.ts +22 -0
  232. package/src/core/__tests__/Alepha-graph.spec.ts +93 -0
  233. package/src/core/__tests__/Alepha-has.spec.ts +41 -0
  234. package/src/core/__tests__/Alepha-inject.spec.ts +93 -0
  235. package/src/core/__tests__/Alepha-register.spec.ts +81 -0
  236. package/src/core/__tests__/Alepha-start.spec.ts +176 -0
  237. package/src/core/__tests__/Alepha-with.spec.ts +14 -0
  238. package/src/core/__tests__/TypeBox-usecases.spec.ts +35 -0
  239. package/src/core/__tests__/TypeBoxLocale.spec.ts +15 -0
  240. package/src/core/__tests__/descriptor.spec.ts +34 -0
  241. package/src/core/__tests__/fixtures/A.ts +5 -0
  242. package/src/core/__tests__/pagination.spec.ts +77 -0
  243. package/src/core/helpers/jsonSchemaToTypeBox.ts +2 -2
  244. package/src/core/primitives/$atom.spec.ts +43 -0
  245. package/src/core/primitives/$hook.spec.ts +130 -0
  246. package/src/core/primitives/$inject.spec.ts +175 -0
  247. package/src/core/primitives/$module.spec.ts +115 -0
  248. package/src/core/providers/CodecManager.spec.ts +740 -0
  249. package/src/core/providers/EventManager.spec.ts +762 -0
  250. package/src/core/providers/EventManager.ts +4 -0
  251. package/src/core/providers/StateManager.spec.ts +365 -0
  252. package/src/core/providers/TypeProvider.spec.ts +1607 -0
  253. package/src/core/providers/TypeProvider.ts +20 -26
  254. package/src/datetime/primitives/$interval.spec.ts +103 -0
  255. package/src/datetime/providers/DateTimeProvider.spec.ts +86 -0
  256. package/src/email/primitives/$email.spec.ts +175 -0
  257. package/src/email/providers/LocalEmailProvider.spec.ts +341 -0
  258. package/src/fake/__tests__/keyName.example.ts +40 -0
  259. package/src/fake/__tests__/keyName.spec.ts +152 -0
  260. package/src/fake/__tests__/module.example.ts +32 -0
  261. package/src/fake/providers/FakeProvider.spec.ts +438 -0
  262. package/src/file/providers/FileSystemProvider.ts +8 -0
  263. package/src/file/providers/NodeFileSystemProvider.spec.ts +418 -0
  264. package/src/file/providers/NodeFileSystemProvider.ts +5 -0
  265. package/src/file/services/FileDetector.spec.ts +591 -0
  266. package/src/lock/core/__tests__/shared.ts +190 -0
  267. package/src/lock/core/providers/MemoryLockProvider.spec.ts +25 -0
  268. package/src/lock/redis/providers/RedisLockProvider.spec.ts +25 -0
  269. package/src/logger/__tests__/SimpleFormatterProvider.spec.ts +109 -0
  270. package/src/logger/index.ts +15 -3
  271. package/src/logger/primitives/$logger.spec.ts +108 -0
  272. package/src/logger/services/Logger.spec.ts +295 -0
  273. package/src/mcp/__tests__/errors.spec.ts +175 -0
  274. package/src/mcp/__tests__/integration.spec.ts +450 -0
  275. package/src/mcp/helpers/jsonrpc.spec.ts +380 -0
  276. package/src/mcp/primitives/$prompt.spec.ts +468 -0
  277. package/src/mcp/primitives/$resource.spec.ts +390 -0
  278. package/src/mcp/primitives/$tool.spec.ts +406 -0
  279. package/src/mcp/providers/McpServerProvider.spec.ts +797 -0
  280. package/src/mcp/transports/StdioMcpTransport.ts +1 -1
  281. package/src/orm/__tests__/$repository-crud.spec.ts +276 -0
  282. package/src/orm/__tests__/$repository-hooks.spec.ts +325 -0
  283. package/src/orm/__tests__/$repository-orderBy.spec.ts +128 -0
  284. package/src/orm/__tests__/$repository-pagination-sort.spec.ts +149 -0
  285. package/src/orm/__tests__/$repository-save.spec.ts +37 -0
  286. package/src/orm/__tests__/ModelBuilder-integration.spec.ts +490 -0
  287. package/src/orm/__tests__/ModelBuilder-types.spec.ts +186 -0
  288. package/src/orm/__tests__/PostgresProvider.spec.ts +46 -0
  289. package/src/orm/__tests__/delete-returning.spec.ts +256 -0
  290. package/src/orm/__tests__/deletedAt.spec.ts +80 -0
  291. package/src/orm/__tests__/enums.spec.ts +315 -0
  292. package/src/orm/__tests__/execute.spec.ts +72 -0
  293. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +65 -0
  294. package/src/orm/__tests__/fixtures/userEntitySchema.ts +27 -0
  295. package/src/orm/__tests__/joins.spec.ts +1114 -0
  296. package/src/orm/__tests__/page.spec.ts +287 -0
  297. package/src/orm/__tests__/primaryKey.spec.ts +87 -0
  298. package/src/orm/__tests__/query-date-encoding.spec.ts +402 -0
  299. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +156 -0
  300. package/src/orm/__tests__/references.spec.ts +102 -0
  301. package/src/orm/__tests__/security.spec.ts +710 -0
  302. package/src/orm/__tests__/sqlite.spec.ts +111 -0
  303. package/src/orm/__tests__/string-operators.spec.ts +429 -0
  304. package/src/orm/__tests__/timestamps.spec.ts +388 -0
  305. package/src/orm/__tests__/validation.spec.ts +183 -0
  306. package/src/orm/__tests__/version.spec.ts +64 -0
  307. package/src/orm/helpers/parseQueryString.spec.ts +196 -0
  308. package/src/orm/index.ts +2 -8
  309. package/src/orm/primitives/$repository.spec.ts +137 -0
  310. package/src/orm/primitives/$sequence.spec.ts +29 -0
  311. package/src/orm/primitives/$transaction.spec.ts +82 -0
  312. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -3
  313. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  314. package/src/orm/providers/drivers/CloudflareD1Provider.ts +1 -1
  315. package/src/orm/providers/drivers/DatabaseProvider.ts +1 -1
  316. package/src/orm/providers/drivers/NodePostgresProvider.ts +3 -3
  317. package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
  318. package/src/orm/providers/drivers/PglitePostgresProvider.ts +2 -2
  319. package/src/orm/services/ModelBuilder.spec.ts +575 -0
  320. package/src/orm/services/Repository.spec.ts +137 -0
  321. package/src/queue/core/__tests__/shared.ts +143 -0
  322. package/src/queue/core/providers/MemoryQueueProvider.spec.ts +23 -0
  323. package/src/queue/core/providers/WorkerProvider.spec.ts +394 -0
  324. package/src/queue/redis/providers/RedisQueueProvider.spec.ts +23 -0
  325. package/src/redis/__tests__/redis.spec.ts +58 -0
  326. package/src/retry/primitives/$retry.spec.ts +234 -0
  327. package/src/retry/providers/RetryProvider.spec.ts +438 -0
  328. package/src/router/__tests__/match.spec.ts +252 -0
  329. package/src/router/providers/RouterProvider.spec.ts +197 -0
  330. package/src/scheduler/__tests__/$scheduler-cron.spec.ts +25 -0
  331. package/src/scheduler/__tests__/$scheduler-interval.spec.ts +25 -0
  332. package/src/scheduler/__tests__/shared.ts +77 -0
  333. package/src/security/__tests__/bug-1-wildcard-after-start.spec.ts +229 -0
  334. package/src/security/__tests__/bug-2-password-validation.spec.ts +245 -0
  335. package/src/security/__tests__/bug-3-regex-vulnerability.spec.ts +407 -0
  336. package/src/security/__tests__/bug-4-oauth2-validation.spec.ts +439 -0
  337. package/src/security/__tests__/multi-layer-permissions.spec.ts +522 -0
  338. package/src/security/primitives/$permission.spec.ts +30 -0
  339. package/src/security/primitives/$permission.ts +2 -2
  340. package/src/security/primitives/$realm.spec.ts +101 -0
  341. package/src/security/primitives/$role.spec.ts +52 -0
  342. package/src/security/primitives/$serviceAccount.spec.ts +61 -0
  343. package/src/security/providers/SecurityProvider.spec.ts +350 -0
  344. package/src/server/auth/providers/ServerAuthProvider.ts +0 -2
  345. package/src/server/cache/providers/ServerCacheProvider.spec.ts +1125 -0
  346. package/src/server/cache/providers/ServerCacheProvider.ts +94 -9
  347. package/src/server/compress/providers/ServerCompressProvider.spec.ts +31 -0
  348. package/src/server/compress/providers/ServerCompressProvider.ts +63 -2
  349. package/src/server/cookies/providers/ServerCookiesProvider.spec.ts +253 -0
  350. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +334 -0
  351. package/src/server/core/__tests__/ServerRouterProvider-requestId.spec.ts +129 -0
  352. package/src/server/core/helpers/ServerReply.ts +2 -2
  353. package/src/server/core/primitives/$action.spec.ts +191 -0
  354. package/src/server/core/primitives/$route.spec.ts +65 -0
  355. package/src/server/core/providers/ServerBodyParserProvider.spec.ts +93 -0
  356. package/src/server/core/providers/ServerLoggerProvider.spec.ts +100 -0
  357. package/src/server/core/providers/ServerProvider.ts +14 -2
  358. package/src/server/core/services/HttpClient.spec.ts +123 -0
  359. package/src/server/core/services/UserAgentParser.spec.ts +111 -0
  360. package/src/server/cors/providers/ServerCorsProvider.spec.ts +481 -0
  361. package/src/server/health/providers/ServerHealthProvider.spec.ts +22 -0
  362. package/src/server/helmet/providers/ServerHelmetProvider.spec.ts +105 -0
  363. package/src/server/links/__tests__/$action.spec.ts +238 -0
  364. package/src/server/links/__tests__/fixtures/CrudApp.ts +122 -0
  365. package/src/server/links/__tests__/requestId.spec.ts +120 -0
  366. package/src/server/links/primitives/$remote.spec.ts +228 -0
  367. package/src/server/links/providers/LinkProvider.spec.ts +54 -0
  368. package/src/server/links/providers/LinkProvider.ts +49 -3
  369. package/src/server/links/providers/ServerLinksProvider.ts +1 -53
  370. package/src/server/links/schemas/apiLinksResponseSchema.ts +7 -0
  371. package/src/server/metrics/providers/ServerMetricsProvider.spec.ts +25 -0
  372. package/src/server/multipart/providers/ServerMultipartProvider.spec.ts +528 -0
  373. package/src/server/proxy/primitives/$proxy.spec.ts +87 -0
  374. package/src/server/rate-limit/__tests__/ActionRateLimit.spec.ts +211 -0
  375. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +344 -0
  376. package/src/server/security/__tests__/BasicAuth.spec.ts +684 -0
  377. package/src/server/security/__tests__/ServerSecurityProvider-realm.spec.ts +388 -0
  378. package/src/server/security/providers/ServerSecurityProvider.spec.ts +123 -0
  379. package/src/server/static/primitives/$serve.spec.ts +193 -0
  380. package/src/server/static/providers/ServerStaticProvider.ts +10 -0
  381. package/src/server/swagger/__tests__/ui.spec.ts +52 -0
  382. package/src/server/swagger/primitives/$swagger.spec.ts +193 -0
  383. package/src/server/swagger/providers/ServerSwaggerProvider.ts +19 -12
  384. package/src/sms/primitives/$sms.spec.ts +165 -0
  385. package/src/sms/providers/LocalSmsProvider.spec.ts +224 -0
  386. package/src/sms/providers/MemorySmsProvider.spec.ts +193 -0
  387. package/src/thread/primitives/$thread.spec.ts +186 -0
  388. package/src/topic/core/__tests__/shared.ts +144 -0
  389. package/src/topic/core/providers/MemoryTopicProvider.spec.ts +23 -0
  390. package/src/topic/redis/providers/RedisTopicProvider.spec.ts +23 -0
  391. package/src/vite/helpers/importViteReact.ts +13 -0
  392. package/src/vite/index.ts +1 -21
  393. package/src/vite/plugins/viteAlephaDev.ts +32 -5
  394. package/src/vite/plugins/viteAlephaSsrPreload.ts +222 -0
  395. package/src/vite/tasks/buildClient.ts +11 -0
  396. package/src/vite/tasks/buildServer.ts +47 -3
  397. package/src/vite/tasks/devServer.ts +69 -0
  398. package/src/vite/tasks/index.ts +2 -1
  399. package/src/vite/tasks/runAlepha.ts +7 -1
  400. package/src/websocket/__tests__/$websocket-new.spec.ts +195 -0
  401. package/src/websocket/primitives/$channel.spec.ts +30 -0
  402. package/src/cli/assets/viteConfigTs.ts +0 -14
  403. package/src/cli/commands/run.ts +0 -24
  404. package/src/vite/plugins/viteAlepha.ts +0 -37
  405. package/src/vite/plugins/viteAlephaBuild.ts +0 -281
@@ -0,0 +1,341 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { beforeEach, describe, expect, test, vi } from "vitest";
4
+ import { EmailError } from "../errors/EmailError.ts";
5
+ import { LocalEmailProvider } from "../providers/LocalEmailProvider.ts";
6
+
7
+ // Mock fs and path modules
8
+ vi.mock("node:fs/promises");
9
+ vi.mock("node:path");
10
+
11
+ // Mock logger
12
+ vi.mock("alepha/logger", () => ({
13
+ $logger: () => ({
14
+ debug: vi.fn(),
15
+ info: vi.fn(),
16
+ error: vi.fn(),
17
+ }),
18
+ }));
19
+
20
+ const mockedFs = vi.mocked(fs);
21
+ const mockedPath = vi.mocked(path);
22
+
23
+ describe("LocalEmailProvider", () => {
24
+ let provider: LocalEmailProvider;
25
+
26
+ beforeEach(() => {
27
+ vi.clearAllMocks();
28
+ // Setup default path.join mock
29
+ mockedPath.join.mockImplementation((...args) => args.join("/"));
30
+ });
31
+
32
+ describe("send", () => {
33
+ beforeEach(() => {
34
+ provider = new LocalEmailProvider({ directory: "test-emails" });
35
+ });
36
+
37
+ test("should successfully send email to local file", async () => {
38
+ mockedFs.mkdir.mockResolvedValue(undefined);
39
+ mockedFs.writeFile.mockResolvedValue();
40
+
41
+ const to = "test@example.com";
42
+ const subject = "Test Subject";
43
+ const body = "<p>Test body</p>";
44
+
45
+ await provider.send({
46
+ to,
47
+ subject,
48
+ body,
49
+ });
50
+
51
+ expect(mockedFs.mkdir).toHaveBeenCalledWith("test-emails", {
52
+ recursive: true,
53
+ });
54
+ expect(mockedFs.writeFile).toHaveBeenCalledWith(
55
+ expect.stringContaining("test@example.com"),
56
+ expect.stringContaining(subject),
57
+ "utf8",
58
+ );
59
+ });
60
+
61
+ test("should create proper filename with sanitized email and timestamp", async () => {
62
+ mockedFs.mkdir.mockResolvedValue(undefined);
63
+ mockedFs.writeFile.mockResolvedValue();
64
+
65
+ const to = "user+test@example.com";
66
+ const subject = "Test Subject";
67
+ const body = "<p>Test body</p>";
68
+
69
+ // Mock Date to have predictable timestamp
70
+ const mockDate = new Date("2023-01-01T12:00:00.000Z");
71
+ vi.setSystemTime(mockDate);
72
+
73
+ await provider.send({
74
+ to,
75
+ subject,
76
+ body,
77
+ });
78
+
79
+ expect(mockedPath.join).toHaveBeenCalledWith(
80
+ "test-emails",
81
+ "user_test@example.com+2023-01-01T12-00-00-000Z.html",
82
+ );
83
+
84
+ vi.useRealTimers();
85
+ });
86
+
87
+ test("should sanitize special characters in email address", async () => {
88
+ mockedFs.mkdir.mockResolvedValue(undefined);
89
+ mockedFs.writeFile.mockResolvedValue();
90
+
91
+ const to = "user<script>@example.com";
92
+ const subject = "Test Subject";
93
+ const body = "<p>Test body</p>";
94
+
95
+ await provider.send({
96
+ to,
97
+ subject,
98
+ body,
99
+ });
100
+
101
+ expect(mockedPath.join).toHaveBeenCalledWith(
102
+ "test-emails",
103
+ expect.stringMatching(/user_script_@example\.com\+.+\.html/),
104
+ );
105
+ });
106
+
107
+ test("should create proper HTML content", async () => {
108
+ mockedFs.mkdir.mockResolvedValue(undefined);
109
+ mockedFs.writeFile.mockResolvedValue();
110
+
111
+ const to = "test@example.com";
112
+ const subject = "Test <Subject>";
113
+ const body = "<p>Test body with <strong>HTML</strong></p>";
114
+
115
+ await provider.send({
116
+ to,
117
+ subject,
118
+ body,
119
+ });
120
+
121
+ const writeCall = mockedFs.writeFile.mock.calls[0];
122
+ const htmlContent = writeCall[1] as string;
123
+
124
+ expect(htmlContent).toContain("<!DOCTYPE html>");
125
+ expect(htmlContent).toContain("Test &lt;Subject&gt;"); // escaped subject
126
+ expect(htmlContent).toContain("test@example.com");
127
+ expect(htmlContent).toContain(
128
+ "<p>Test body with <strong>HTML</strong></p>",
129
+ ); // body not escaped
130
+ expect(htmlContent).toContain("Sent:");
131
+ });
132
+
133
+ test("should throw EmailError when mkdir fails", async () => {
134
+ const mkdirError = new Error("Permission denied");
135
+ mockedFs.mkdir.mockRejectedValue(mkdirError);
136
+
137
+ const to = "test@example.com";
138
+ const subject = "Test Subject";
139
+ const body = "<p>Test body</p>";
140
+
141
+ await expect(
142
+ provider.send({
143
+ to,
144
+ subject,
145
+ body,
146
+ }),
147
+ ).rejects.toThrow(EmailError);
148
+ await expect(
149
+ provider.send({
150
+ to,
151
+ subject,
152
+ body,
153
+ }),
154
+ ).rejects.toThrow(
155
+ "Failed to save email to local file: Permission denied",
156
+ );
157
+ });
158
+
159
+ test("should throw EmailError when writeFile fails", async () => {
160
+ mockedFs.mkdir.mockResolvedValue(undefined);
161
+ const writeError = new Error("Disk full");
162
+ mockedFs.writeFile.mockRejectedValue(writeError);
163
+
164
+ const to = "test@example.com";
165
+ const subject = "Test Subject";
166
+ const body = "<p>Test body</p>";
167
+
168
+ await expect(
169
+ provider.send({
170
+ to,
171
+ subject,
172
+ body,
173
+ }),
174
+ ).rejects.toThrow(EmailError);
175
+ await expect(
176
+ provider.send({
177
+ to,
178
+ subject,
179
+ body,
180
+ }),
181
+ ).rejects.toThrow("Failed to save email to local file: Disk full");
182
+ });
183
+
184
+ test("should handle non-Error exceptions", async () => {
185
+ mockedFs.mkdir.mockResolvedValue(undefined);
186
+ mockedFs.writeFile.mockRejectedValue("String error");
187
+
188
+ const to = "test@example.com";
189
+ const subject = "Test Subject";
190
+ const body = "<p>Test body</p>";
191
+
192
+ await expect(
193
+ provider.send({
194
+ to,
195
+ subject,
196
+ body,
197
+ }),
198
+ ).rejects.toThrow(EmailError);
199
+ await expect(
200
+ provider.send({
201
+ to,
202
+ subject,
203
+ body,
204
+ }),
205
+ ).rejects.toThrow("Failed to save email to local file: String error");
206
+ });
207
+ });
208
+
209
+ describe("createEmailHtml", () => {
210
+ beforeEach(() => {
211
+ provider = new LocalEmailProvider();
212
+ });
213
+
214
+ test("should create proper HTML structure", () => {
215
+ const mockDate = new Date("2023-01-01T12:00:00.000Z");
216
+ vi.setSystemTime(mockDate);
217
+
218
+ const to = "test@example.com";
219
+ const subject = "Test Subject";
220
+ const body = "<p>Test body</p>";
221
+
222
+ const html = provider.createEmailHtml({
223
+ to,
224
+ subject,
225
+ body,
226
+ });
227
+
228
+ expect(html).toContain("<!DOCTYPE html>");
229
+ expect(html).toContain('<html lang="en">');
230
+ expect(html).toContain("<head>");
231
+ expect(html).toContain("<body>");
232
+ expect(html).toContain("Test Subject");
233
+ expect(html).toContain("test@example.com");
234
+ expect(html).toContain("<p>Test body</p>");
235
+ expect(html).toContain("2023-01-01T12:00:00.000Z");
236
+
237
+ vi.useRealTimers();
238
+ });
239
+
240
+ test("should escape HTML in subject and email address", () => {
241
+ const to = "test<script>@example.com";
242
+ const subject = "Test <Subject> & More";
243
+ const body = "<p>Test body</p>";
244
+
245
+ const html = provider.createEmailHtml({
246
+ to,
247
+ subject,
248
+ body,
249
+ });
250
+
251
+ expect(html).toContain("test&lt;script&gt;@example.com");
252
+ expect(html).toContain("Test &lt;Subject&gt; &amp; More");
253
+ expect(html).not.toContain("test<script>@example.com");
254
+ expect(html).not.toContain("Test <Subject> & More");
255
+ });
256
+
257
+ test("should not escape HTML in body content", () => {
258
+ const to = "test@example.com";
259
+ const subject = "Test Subject";
260
+ const body = "<p>Test body with <strong>HTML</strong> & entities</p>";
261
+
262
+ const html = provider.createEmailHtml({
263
+ to,
264
+ subject,
265
+ body,
266
+ });
267
+
268
+ expect(html).toContain(
269
+ "<p>Test body with <strong>HTML</strong> & entities</p>",
270
+ );
271
+ });
272
+
273
+ test("should include CSS styles", () => {
274
+ const to = "test@example.com";
275
+ const subject = "Test Subject";
276
+ const body = "<p>Test body</p>";
277
+
278
+ const html = provider.createEmailHtml({
279
+ to,
280
+ subject,
281
+ body,
282
+ });
283
+
284
+ expect(html).toContain("<style>");
285
+ expect(html).toContain("font-family: Arial, sans-serif");
286
+ expect(html).toContain(".email-header");
287
+ expect(html).toContain(".email-body");
288
+ expect(html).toContain(".meta");
289
+ });
290
+ });
291
+
292
+ describe("escapeHtml", () => {
293
+ beforeEach(() => {
294
+ provider = new LocalEmailProvider();
295
+ });
296
+
297
+ test("should escape ampersands", () => {
298
+ const result = provider.escapeHtml("Tom & Jerry");
299
+ expect(result).toBe("Tom &amp; Jerry");
300
+ });
301
+
302
+ test("should escape less than signs", () => {
303
+ const result = provider.escapeHtml("5 < 10");
304
+ expect(result).toBe("5 &lt; 10");
305
+ });
306
+
307
+ test("should escape greater than signs", () => {
308
+ const result = provider.escapeHtml("10 > 5");
309
+ expect(result).toBe("10 &gt; 5");
310
+ });
311
+
312
+ test("should escape double quotes", () => {
313
+ const result = provider.escapeHtml('Say "Hello"');
314
+ expect(result).toBe("Say &quot;Hello&quot;");
315
+ });
316
+
317
+ test("should escape single quotes", () => {
318
+ const result = provider.escapeHtml("Don't worry");
319
+ expect(result).toBe("Don&#39;t worry");
320
+ });
321
+
322
+ test("should escape multiple special characters", () => {
323
+ const result = provider.escapeHtml(
324
+ '<script>alert("Hello & goodbye")</script>',
325
+ );
326
+ expect(result).toBe(
327
+ "&lt;script&gt;alert(&quot;Hello &amp; goodbye&quot;)&lt;/script&gt;",
328
+ );
329
+ });
330
+
331
+ test("should handle empty string", () => {
332
+ const result = provider.escapeHtml("");
333
+ expect(result).toBe("");
334
+ });
335
+
336
+ test("should handle string with no special characters", () => {
337
+ const result = provider.escapeHtml("Hello World");
338
+ expect(result).toBe("Hello World");
339
+ });
340
+ });
341
+ });
@@ -0,0 +1,40 @@
1
+ import { t } from "alepha";
2
+ import { FakeProvider } from "../providers/FakeProvider.ts";
3
+
4
+ // Example showing how key names influence generated data
5
+ const fake = new FakeProvider({ seed: 12345 });
6
+
7
+ const userSchema = t.object({
8
+ id: t.uuid(),
9
+ firstName: t.text(), // Will generate a first name (e.g. "John")
10
+ lastName: t.text(), // Will generate a last name (e.g. "Doe")
11
+ email: t.text(), // Will generate an email (e.g. "john.doe@example.com")
12
+ age: t.integer(), // Will generate age between 18-99
13
+ phone: t.text(), // Will generate a phone number
14
+ address: t.text(), // Will generate a street address
15
+ city: t.text(), // Will generate a city name
16
+ country: t.text(), // Will generate a country name
17
+ company: t.text(), // Will generate a company name
18
+ jobTitle: t.text(), // Will generate a job title
19
+ username: t.text(), // Will generate a username
20
+ website: t.text(), // Will generate a URL
21
+ avatar: t.text(), // Will generate an avatar URL
22
+ bio: t.text(), // Will generate a short bio
23
+ });
24
+
25
+ const fakeUser = fake.generate(userSchema);
26
+
27
+ console.log("Generated user with key name intelligence:");
28
+ console.log(JSON.stringify(fakeUser, null, 2));
29
+
30
+ // Example with explicit formats (key names are ignored when format is set)
31
+ const explicitSchema = t.object({
32
+ id: t.uuid(), // format: uuid - generates UUID
33
+ email: t.email(), // format: email - generates email
34
+ createdAt: t.string({ format: "date-time" }), // format: date-time
35
+ });
36
+
37
+ const explicitData = fake.generate(explicitSchema);
38
+
39
+ console.log("\nGenerated data with explicit formats:");
40
+ console.log(JSON.stringify(explicitData, null, 2));
@@ -0,0 +1,152 @@
1
+ import { t } from "alepha";
2
+ import { describe, test } from "vitest";
3
+ import { FakeProvider } from "../providers/FakeProvider.ts";
4
+
5
+ describe("FakeProvider - Key Name Intelligence", () => {
6
+ test("generates contextual data based on key names", ({ expect }) => {
7
+ const fake = new FakeProvider({ seed: 12345 });
8
+ const schema = t.object({
9
+ firstName: t.text(),
10
+ lastName: t.text(),
11
+ email: t.text(),
12
+ age: t.integer(),
13
+ phone: t.text(),
14
+ address: t.text(),
15
+ city: t.text(),
16
+ company: t.text(),
17
+ username: t.text(),
18
+ });
19
+
20
+ const result = fake.generate(schema);
21
+
22
+ // Verify types
23
+ expect(typeof result.firstName).toBe("string");
24
+ expect(typeof result.lastName).toBe("string");
25
+ expect(typeof result.email).toBe("string");
26
+ expect(typeof result.age).toBe("number");
27
+ expect(typeof result.phone).toBe("string");
28
+ expect(typeof result.address).toBe("string");
29
+ expect(typeof result.city).toBe("string");
30
+ expect(typeof result.company).toBe("string");
31
+ expect(typeof result.username).toBe("string");
32
+
33
+ // Verify email format (basic check)
34
+ expect(result.email).toMatch(/@/);
35
+
36
+ // Verify age is in expected range for context-aware generation
37
+ expect(result.age).toBeGreaterThanOrEqual(18);
38
+ expect(result.age).toBeLessThanOrEqual(99);
39
+ });
40
+
41
+ test("format takes precedence over key name", ({ expect }) => {
42
+ const fake = new FakeProvider({ seed: 12345 });
43
+ const schema = t.object({
44
+ // Even though key is "email", format: uuid should generate UUID
45
+ email: t.uuid(),
46
+ // Even though key is "id", format: email should generate email
47
+ id: t.email(),
48
+ });
49
+
50
+ const result = fake.generate(schema);
51
+
52
+ // email field should be UUID format
53
+ expect(result.email).toMatch(
54
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
55
+ );
56
+
57
+ // id field should be email format
58
+ expect(result.id).toMatch(/@/);
59
+ });
60
+
61
+ test("enum values ignore key name context", ({ expect }) => {
62
+ const fake = new FakeProvider({ seed: 12345 });
63
+ const schema = t.object({
64
+ // Even though key is "email", enum should pick from values
65
+ email: t.enum(["user1", "user2", "user3"]),
66
+ });
67
+
68
+ const result = fake.generate(schema);
69
+
70
+ expect(["user1", "user2", "user3"]).toContain(result.email);
71
+ // Should NOT be an email format
72
+ expect(result.email).not.toMatch(/@/);
73
+ });
74
+
75
+ test("generates realistic user profiles", ({ expect }) => {
76
+ const fake = new FakeProvider({ seed: 67890 });
77
+ const userSchema = t.object({
78
+ firstName: t.shortText(),
79
+ lastName: t.shortText(),
80
+ fullName: t.text(),
81
+ email: t.text(),
82
+ username: t.text(),
83
+ age: t.integer(),
84
+ bio: t.longText(),
85
+ avatar: t.text(),
86
+ website: t.text(),
87
+ jobTitle: t.text(),
88
+ company: t.text(),
89
+ address: t.text(),
90
+ city: t.text(),
91
+ state: t.text(),
92
+ country: t.text(),
93
+ zipCode: t.text(),
94
+ phone: t.text(),
95
+ });
96
+
97
+ const user = fake.generate(userSchema);
98
+
99
+ // Verify structure
100
+ expect(typeof user.firstName).toBe("string");
101
+ expect(typeof user.lastName).toBe("string");
102
+ expect(typeof user.fullName).toBe("string");
103
+ expect(typeof user.email).toBe("string");
104
+ expect(typeof user.username).toBe("string");
105
+ expect(typeof user.age).toBe("number");
106
+ expect(typeof user.bio).toBe("string");
107
+ expect(typeof user.avatar).toBe("string");
108
+ expect(typeof user.website).toBe("string");
109
+ expect(typeof user.jobTitle).toBe("string");
110
+ expect(typeof user.company).toBe("string");
111
+ expect(typeof user.address).toBe("string");
112
+ expect(typeof user.city).toBe("string");
113
+ expect(typeof user.state).toBe("string");
114
+ expect(typeof user.country).toBe("string");
115
+ expect(typeof user.zipCode).toBe("string");
116
+ expect(typeof user.phone).toBe("string");
117
+
118
+ // Check some specific patterns
119
+ expect(user.email).toMatch(/@/);
120
+ expect(user.website).toMatch(/^https?:\/\//);
121
+ });
122
+
123
+ test("numeric key names influence generation", ({ expect }) => {
124
+ const fake = new FakeProvider({ seed: 12345 });
125
+ const schema = t.object({
126
+ age: t.integer(),
127
+ year: t.integer(),
128
+ month: t.integer(),
129
+ day: t.integer(),
130
+ price: t.number(),
131
+ amount: t.number(),
132
+ });
133
+
134
+ const result = fake.generate(schema);
135
+
136
+ // Age should be in realistic range
137
+ expect(result.age).toBeGreaterThanOrEqual(18);
138
+ expect(result.age).toBeLessThanOrEqual(99);
139
+
140
+ // Month should be 1-12
141
+ expect(result.month).toBeGreaterThanOrEqual(1);
142
+ expect(result.month).toBeLessThanOrEqual(12);
143
+
144
+ // Day should be 1-31
145
+ expect(result.day).toBeGreaterThanOrEqual(1);
146
+ expect(result.day).toBeLessThanOrEqual(31);
147
+
148
+ // Price/amount should be positive
149
+ expect(result.price).toBeGreaterThan(0);
150
+ expect(result.amount).toBeGreaterThan(0);
151
+ });
152
+ });
@@ -0,0 +1,32 @@
1
+ import { $inject, Alepha, t } from "alepha";
2
+ import { AlephaFake, FakeProvider } from "../index.ts";
3
+
4
+ // Example showing how to use the AlephaFake module
5
+ class MyApp {
6
+ constructor(private fake = $inject(FakeProvider)) {}
7
+
8
+ async seedDatabase() {
9
+ // Define your schema
10
+ const userSchema = t.object({
11
+ id: t.uuid(),
12
+ firstName: t.text(),
13
+ lastName: t.text(),
14
+ email: t.email(),
15
+ age: t.integer({ minimum: 18, maximum: 99 }),
16
+ createdAt: t.string({ format: "date-time" }),
17
+ });
18
+
19
+ // Generate multiple fake users
20
+ return this.fake.generateMany(userSchema, 10);
21
+ }
22
+ }
23
+
24
+ // Create Alepha instance with the fake module
25
+ const alepha = Alepha.create().with(AlephaFake);
26
+
27
+ const app = alepha.inject(MyApp);
28
+
29
+ // Seed the database
30
+ await alepha.start();
31
+ await app.seedDatabase();
32
+ await alepha.stop();