alepha 0.14.2 → 0.14.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 (361) hide show
  1. package/dist/api/audits/index.browser.js +5 -5
  2. package/dist/api/audits/index.browser.js.map +1 -1
  3. package/dist/api/audits/index.d.ts +784 -784
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/audits/index.js +13 -13
  6. package/dist/api/audits/index.js.map +1 -1
  7. package/dist/api/files/index.browser.js +5 -5
  8. package/dist/api/files/index.browser.js.map +1 -1
  9. package/dist/api/files/index.d.ts +57 -57
  10. package/dist/api/files/index.d.ts.map +1 -1
  11. package/dist/api/files/index.js +71 -71
  12. package/dist/api/files/index.js.map +1 -1
  13. package/dist/api/jobs/index.browser.js +5 -5
  14. package/dist/api/jobs/index.browser.js.map +1 -1
  15. package/dist/api/jobs/index.d.ts +165 -165
  16. package/dist/api/jobs/index.d.ts.map +1 -1
  17. package/dist/api/jobs/index.js +10 -10
  18. package/dist/api/jobs/index.js.map +1 -1
  19. package/dist/api/notifications/index.browser.js +10 -10
  20. package/dist/api/notifications/index.browser.js.map +1 -1
  21. package/dist/api/notifications/index.d.ts +583 -171
  22. package/dist/api/notifications/index.d.ts.map +1 -1
  23. package/dist/api/notifications/index.js +12 -12
  24. package/dist/api/notifications/index.js.map +1 -1
  25. package/dist/api/parameters/index.browser.js +163 -10
  26. package/dist/api/parameters/index.browser.js.map +1 -1
  27. package/dist/api/parameters/index.d.ts +281 -276
  28. package/dist/api/parameters/index.d.ts.map +1 -1
  29. package/dist/api/parameters/index.js +196 -91
  30. package/dist/api/parameters/index.js.map +1 -1
  31. package/dist/api/users/index.browser.js +19 -19
  32. package/dist/api/users/index.browser.js.map +1 -1
  33. package/dist/api/users/index.d.ts +1137 -1123
  34. package/dist/api/users/index.d.ts.map +1 -1
  35. package/dist/api/users/index.js +827 -596
  36. package/dist/api/users/index.js.map +1 -1
  37. package/dist/api/verifications/index.browser.js +6 -6
  38. package/dist/api/verifications/index.browser.js.map +1 -1
  39. package/dist/api/verifications/index.d.ts +13 -13
  40. package/dist/api/verifications/index.d.ts.map +1 -1
  41. package/dist/api/verifications/index.js +6 -6
  42. package/dist/api/verifications/index.js.map +1 -1
  43. package/dist/bin/index.d.ts +1 -2
  44. package/dist/bin/index.js +0 -1
  45. package/dist/bin/index.js.map +1 -1
  46. package/dist/cli/index.d.ts +137 -112
  47. package/dist/cli/index.d.ts.map +1 -1
  48. package/dist/cli/index.js +371 -259
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/command/index.d.ts +45 -5
  51. package/dist/command/index.d.ts.map +1 -1
  52. package/dist/command/index.js +97 -17
  53. package/dist/command/index.js.map +1 -1
  54. package/dist/core/index.browser.js +14 -18
  55. package/dist/core/index.browser.js.map +1 -1
  56. package/dist/core/index.d.ts +29 -0
  57. package/dist/core/index.d.ts.map +1 -1
  58. package/dist/core/index.js +14 -18
  59. package/dist/core/index.js.map +1 -1
  60. package/dist/core/index.native.js +14 -18
  61. package/dist/core/index.native.js.map +1 -1
  62. package/dist/fake/index.js +195 -168
  63. package/dist/fake/index.js.map +1 -1
  64. package/dist/file/index.d.ts +8 -0
  65. package/dist/file/index.d.ts.map +1 -1
  66. package/dist/file/index.js +3 -0
  67. package/dist/file/index.js.map +1 -1
  68. package/dist/mcp/index.d.ts.map +1 -1
  69. package/dist/orm/index.d.ts +32 -32
  70. package/dist/orm/index.d.ts.map +1 -1
  71. package/dist/orm/index.js +12 -12
  72. package/dist/orm/index.js.map +1 -1
  73. package/dist/security/index.d.ts +1 -1
  74. package/dist/security/index.d.ts.map +1 -1
  75. package/dist/security/index.js +1 -1
  76. package/dist/security/index.js.map +1 -1
  77. package/dist/server/auth/index.d.ts +171 -155
  78. package/dist/server/auth/index.d.ts.map +1 -1
  79. package/dist/server/auth/index.js +0 -1
  80. package/dist/server/auth/index.js.map +1 -1
  81. package/dist/server/compress/index.d.ts.map +1 -1
  82. package/dist/server/compress/index.js +2 -0
  83. package/dist/server/compress/index.js.map +1 -1
  84. package/dist/server/core/index.d.ts.map +1 -1
  85. package/dist/server/core/index.js +1 -1
  86. package/dist/server/core/index.js.map +1 -1
  87. package/dist/server/links/index.browser.js +22 -6
  88. package/dist/server/links/index.browser.js.map +1 -1
  89. package/dist/server/links/index.d.ts +46 -44
  90. package/dist/server/links/index.d.ts.map +1 -1
  91. package/dist/server/links/index.js +24 -41
  92. package/dist/server/links/index.js.map +1 -1
  93. package/dist/server/security/index.d.ts +9 -9
  94. package/dist/server/swagger/index.d.ts +2 -1
  95. package/dist/server/swagger/index.d.ts.map +1 -1
  96. package/dist/server/swagger/index.js +8 -3
  97. package/dist/server/swagger/index.js.map +1 -1
  98. package/dist/vite/index.d.ts.map +1 -1
  99. package/dist/vite/index.js +12 -4
  100. package/dist/vite/index.js.map +1 -1
  101. package/dist/websocket/index.d.ts +7 -7
  102. package/package.json +7 -7
  103. package/src/api/audits/controllers/{AuditController.ts → AdminAuditController.ts} +5 -6
  104. package/src/api/audits/entities/audits.ts +5 -5
  105. package/src/api/audits/index.browser.ts +1 -1
  106. package/src/api/audits/index.ts +3 -3
  107. package/src/api/audits/primitives/$audit.spec.ts +276 -0
  108. package/src/api/audits/services/AuditService.spec.ts +495 -0
  109. package/src/api/files/__tests__/$bucket.spec.ts +91 -0
  110. package/src/api/files/controllers/AdminFileStatsController.spec.ts +166 -0
  111. package/src/api/files/controllers/{StorageStatsController.ts → AdminFileStatsController.ts} +2 -2
  112. package/src/api/files/controllers/FileController.spec.ts +558 -0
  113. package/src/api/files/controllers/FileController.ts +4 -5
  114. package/src/api/files/entities/files.ts +5 -5
  115. package/src/api/files/index.browser.ts +1 -1
  116. package/src/api/files/index.ts +4 -4
  117. package/src/api/files/jobs/FileJobs.spec.ts +52 -0
  118. package/src/api/files/services/FileService.spec.ts +109 -0
  119. package/src/api/jobs/__tests__/JobController.spec.ts +343 -0
  120. package/src/api/jobs/controllers/{JobController.ts → AdminJobController.ts} +2 -2
  121. package/src/api/jobs/entities/jobExecutions.ts +5 -5
  122. package/src/api/jobs/index.ts +3 -3
  123. package/src/api/jobs/primitives/$job.spec.ts +476 -0
  124. package/src/api/notifications/controllers/{NotificationController.ts → AdminNotificationController.ts} +4 -5
  125. package/src/api/notifications/entities/notifications.ts +5 -5
  126. package/src/api/notifications/index.browser.ts +1 -1
  127. package/src/api/notifications/index.ts +4 -4
  128. package/src/api/parameters/controllers/{ConfigController.ts → AdminConfigController.ts} +46 -107
  129. package/src/api/parameters/entities/parameters.ts +7 -17
  130. package/src/api/parameters/index.ts +3 -3
  131. package/src/api/parameters/primitives/$config.spec.ts +356 -0
  132. package/src/api/parameters/schemas/activateConfigBodySchema.ts +12 -0
  133. package/src/api/parameters/schemas/checkScheduledResponseSchema.ts +8 -0
  134. package/src/api/parameters/schemas/configCurrentResponseSchema.ts +13 -0
  135. package/src/api/parameters/schemas/configHistoryResponseSchema.ts +9 -0
  136. package/src/api/parameters/schemas/configNameParamSchema.ts +10 -0
  137. package/src/api/parameters/schemas/configNamesResponseSchema.ts +8 -0
  138. package/src/api/parameters/schemas/configTreeNodeSchema.ts +13 -0
  139. package/src/api/parameters/schemas/configVersionParamSchema.ts +9 -0
  140. package/src/api/parameters/schemas/configVersionResponseSchema.ts +9 -0
  141. package/src/api/parameters/schemas/configsByStatusResponseSchema.ts +9 -0
  142. package/src/api/parameters/schemas/createConfigVersionBodySchema.ts +24 -0
  143. package/src/api/parameters/schemas/index.ts +15 -0
  144. package/src/api/parameters/schemas/parameterResponseSchema.ts +26 -0
  145. package/src/api/parameters/schemas/parameterStatusSchema.ts +13 -0
  146. package/src/api/parameters/schemas/rollbackConfigBodySchema.ts +15 -0
  147. package/src/api/parameters/schemas/statusParamSchema.ts +9 -0
  148. package/src/api/users/__tests__/EmailVerification.spec.ts +369 -0
  149. package/src/api/users/__tests__/PasswordReset.spec.ts +550 -0
  150. package/src/api/users/controllers/AdminIdentityController.spec.ts +365 -0
  151. package/src/api/users/controllers/{IdentityController.ts → AdminIdentityController.ts} +3 -4
  152. package/src/api/users/controllers/AdminSessionController.spec.ts +274 -0
  153. package/src/api/users/controllers/{SessionController.ts → AdminSessionController.ts} +3 -4
  154. package/src/api/users/controllers/AdminUserController.spec.ts +372 -0
  155. package/src/api/users/controllers/AdminUserController.ts +116 -0
  156. package/src/api/users/controllers/UserController.ts +4 -107
  157. package/src/api/users/controllers/UserRealmController.ts +3 -0
  158. package/src/api/users/entities/identities.ts +6 -6
  159. package/src/api/users/entities/sessions.ts +6 -6
  160. package/src/api/users/entities/users.ts +9 -9
  161. package/src/api/users/index.ts +9 -6
  162. package/src/api/users/primitives/$userRealm.ts +13 -8
  163. package/src/api/users/services/CredentialService.spec.ts +509 -0
  164. package/src/api/users/services/CredentialService.ts +46 -0
  165. package/src/api/users/services/IdentityService.ts +15 -0
  166. package/src/api/users/services/RegistrationService.spec.ts +630 -0
  167. package/src/api/users/services/RegistrationService.ts +18 -0
  168. package/src/api/users/services/SessionService.spec.ts +301 -0
  169. package/src/api/users/services/SessionService.ts +110 -1
  170. package/src/api/users/services/UserService.ts +67 -2
  171. package/src/api/verifications/__tests__/CodeVerification.spec.ts +318 -0
  172. package/src/api/verifications/__tests__/LinkVerification.spec.ts +279 -0
  173. package/src/api/verifications/entities/verifications.ts +6 -6
  174. package/src/api/verifications/jobs/VerificationJobs.spec.ts +50 -0
  175. package/src/batch/__tests__/startup-buffering.spec.ts +458 -0
  176. package/src/batch/primitives/$batch.spec.ts +766 -0
  177. package/src/batch/providers/BatchProvider.spec.ts +786 -0
  178. package/src/bin/index.ts +0 -1
  179. package/src/bucket/__tests__/shared.ts +194 -0
  180. package/src/bucket/primitives/$bucket.spec.ts +104 -0
  181. package/src/bucket/providers/FileStorageProvider.spec.ts +13 -0
  182. package/src/bucket/providers/LocalFileStorageProvider.spec.ts +77 -0
  183. package/src/bucket/providers/MemoryFileStorageProvider.spec.ts +82 -0
  184. package/src/cache/core/__tests__/shared.ts +377 -0
  185. package/src/cache/core/primitives/$cache.spec.ts +111 -0
  186. package/src/cache/redis/__tests__/cache-redis.spec.ts +70 -0
  187. package/src/cli/apps/AlephaCli.ts +25 -4
  188. package/src/cli/commands/dev.ts +19 -7
  189. package/src/cli/commands/gen/changelog.spec.ts +315 -0
  190. package/src/cli/commands/{changelog.ts → gen/changelog.ts} +9 -9
  191. package/src/cli/commands/gen/openapi.ts +71 -0
  192. package/src/cli/commands/gen.ts +18 -0
  193. package/src/cli/commands/init.ts +2 -0
  194. package/src/cli/commands/root.ts +12 -3
  195. package/src/cli/commands/typecheck.ts +5 -0
  196. package/src/cli/index.ts +2 -1
  197. package/src/cli/services/AlephaCliUtils.ts +71 -32
  198. package/src/cli/services/GitMessageParser.ts +1 -1
  199. package/src/command/helpers/Asker.spec.ts +127 -0
  200. package/src/command/helpers/Runner.spec.ts +126 -0
  201. package/src/command/primitives/$command.spec.ts +1588 -0
  202. package/src/command/providers/CliProvider.ts +74 -24
  203. package/src/core/Alepha.ts +45 -0
  204. package/src/core/__tests__/Alepha-emit.spec.ts +22 -0
  205. package/src/core/__tests__/Alepha-graph.spec.ts +93 -0
  206. package/src/core/__tests__/Alepha-has.spec.ts +41 -0
  207. package/src/core/__tests__/Alepha-inject.spec.ts +93 -0
  208. package/src/core/__tests__/Alepha-register.spec.ts +81 -0
  209. package/src/core/__tests__/Alepha-start.spec.ts +176 -0
  210. package/src/core/__tests__/Alepha-with.spec.ts +14 -0
  211. package/src/core/__tests__/TypeBox-usecases.spec.ts +35 -0
  212. package/src/core/__tests__/TypeBoxLocale.spec.ts +15 -0
  213. package/src/core/__tests__/descriptor.spec.ts +34 -0
  214. package/src/core/__tests__/fixtures/A.ts +5 -0
  215. package/src/core/__tests__/pagination.spec.ts +77 -0
  216. package/src/core/helpers/jsonSchemaToTypeBox.ts +2 -2
  217. package/src/core/primitives/$atom.spec.ts +43 -0
  218. package/src/core/primitives/$hook.spec.ts +130 -0
  219. package/src/core/primitives/$inject.spec.ts +175 -0
  220. package/src/core/primitives/$module.spec.ts +115 -0
  221. package/src/core/providers/CodecManager.spec.ts +740 -0
  222. package/src/core/providers/EventManager.spec.ts +762 -0
  223. package/src/core/providers/EventManager.ts +4 -0
  224. package/src/core/providers/StateManager.spec.ts +365 -0
  225. package/src/core/providers/TypeProvider.spec.ts +1607 -0
  226. package/src/core/providers/TypeProvider.ts +20 -26
  227. package/src/datetime/primitives/$interval.spec.ts +103 -0
  228. package/src/datetime/providers/DateTimeProvider.spec.ts +86 -0
  229. package/src/email/primitives/$email.spec.ts +175 -0
  230. package/src/email/providers/LocalEmailProvider.spec.ts +341 -0
  231. package/src/fake/__tests__/keyName.example.ts +40 -0
  232. package/src/fake/__tests__/keyName.spec.ts +152 -0
  233. package/src/fake/__tests__/module.example.ts +32 -0
  234. package/src/fake/providers/FakeProvider.spec.ts +438 -0
  235. package/src/file/providers/FileSystemProvider.ts +8 -0
  236. package/src/file/providers/NodeFileSystemProvider.spec.ts +418 -0
  237. package/src/file/providers/NodeFileSystemProvider.ts +5 -0
  238. package/src/file/services/FileDetector.spec.ts +591 -0
  239. package/src/lock/core/__tests__/shared.ts +190 -0
  240. package/src/lock/core/providers/MemoryLockProvider.spec.ts +25 -0
  241. package/src/lock/redis/providers/RedisLockProvider.spec.ts +25 -0
  242. package/src/logger/__tests__/SimpleFormatterProvider.spec.ts +109 -0
  243. package/src/logger/primitives/$logger.spec.ts +108 -0
  244. package/src/logger/services/Logger.spec.ts +295 -0
  245. package/src/mcp/__tests__/errors.spec.ts +175 -0
  246. package/src/mcp/__tests__/integration.spec.ts +450 -0
  247. package/src/mcp/helpers/jsonrpc.spec.ts +380 -0
  248. package/src/mcp/primitives/$prompt.spec.ts +468 -0
  249. package/src/mcp/primitives/$resource.spec.ts +390 -0
  250. package/src/mcp/primitives/$tool.spec.ts +406 -0
  251. package/src/mcp/providers/McpServerProvider.spec.ts +797 -0
  252. package/src/orm/__tests__/$repository-crud.spec.ts +276 -0
  253. package/src/orm/__tests__/$repository-hooks.spec.ts +325 -0
  254. package/src/orm/__tests__/$repository-orderBy.spec.ts +128 -0
  255. package/src/orm/__tests__/$repository-pagination-sort.spec.ts +149 -0
  256. package/src/orm/__tests__/$repository-save.spec.ts +37 -0
  257. package/src/orm/__tests__/ModelBuilder-integration.spec.ts +490 -0
  258. package/src/orm/__tests__/ModelBuilder-types.spec.ts +186 -0
  259. package/src/orm/__tests__/PostgresProvider.spec.ts +46 -0
  260. package/src/orm/__tests__/delete-returning.spec.ts +256 -0
  261. package/src/orm/__tests__/deletedAt.spec.ts +80 -0
  262. package/src/orm/__tests__/enums.spec.ts +315 -0
  263. package/src/orm/__tests__/execute.spec.ts +72 -0
  264. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +65 -0
  265. package/src/orm/__tests__/fixtures/userEntitySchema.ts +27 -0
  266. package/src/orm/__tests__/joins.spec.ts +1114 -0
  267. package/src/orm/__tests__/page.spec.ts +287 -0
  268. package/src/orm/__tests__/primaryKey.spec.ts +87 -0
  269. package/src/orm/__tests__/query-date-encoding.spec.ts +402 -0
  270. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +156 -0
  271. package/src/orm/__tests__/references.spec.ts +102 -0
  272. package/src/orm/__tests__/security.spec.ts +710 -0
  273. package/src/orm/__tests__/sqlite.spec.ts +111 -0
  274. package/src/orm/__tests__/string-operators.spec.ts +429 -0
  275. package/src/orm/__tests__/timestamps.spec.ts +388 -0
  276. package/src/orm/__tests__/validation.spec.ts +183 -0
  277. package/src/orm/__tests__/version.spec.ts +64 -0
  278. package/src/orm/helpers/parseQueryString.spec.ts +196 -0
  279. package/src/orm/primitives/$repository.spec.ts +137 -0
  280. package/src/orm/primitives/$sequence.spec.ts +29 -0
  281. package/src/orm/primitives/$transaction.spec.ts +82 -0
  282. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -3
  283. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  284. package/src/orm/providers/drivers/CloudflareD1Provider.ts +1 -1
  285. package/src/orm/providers/drivers/DatabaseProvider.ts +1 -1
  286. package/src/orm/providers/drivers/NodePostgresProvider.ts +3 -3
  287. package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
  288. package/src/orm/providers/drivers/PglitePostgresProvider.ts +2 -2
  289. package/src/orm/services/ModelBuilder.spec.ts +575 -0
  290. package/src/orm/services/Repository.spec.ts +137 -0
  291. package/src/queue/core/__tests__/shared.ts +143 -0
  292. package/src/queue/core/providers/MemoryQueueProvider.spec.ts +23 -0
  293. package/src/queue/core/providers/WorkerProvider.spec.ts +378 -0
  294. package/src/queue/redis/providers/RedisQueueProvider.spec.ts +23 -0
  295. package/src/redis/__tests__/redis.spec.ts +58 -0
  296. package/src/retry/primitives/$retry.spec.ts +234 -0
  297. package/src/retry/providers/RetryProvider.spec.ts +438 -0
  298. package/src/router/__tests__/match.spec.ts +252 -0
  299. package/src/router/providers/RouterProvider.spec.ts +197 -0
  300. package/src/scheduler/__tests__/$scheduler-cron.spec.ts +25 -0
  301. package/src/scheduler/__tests__/$scheduler-interval.spec.ts +25 -0
  302. package/src/scheduler/__tests__/shared.ts +77 -0
  303. package/src/security/__tests__/bug-1-wildcard-after-start.spec.ts +229 -0
  304. package/src/security/__tests__/bug-2-password-validation.spec.ts +245 -0
  305. package/src/security/__tests__/bug-3-regex-vulnerability.spec.ts +407 -0
  306. package/src/security/__tests__/bug-4-oauth2-validation.spec.ts +439 -0
  307. package/src/security/__tests__/multi-layer-permissions.spec.ts +522 -0
  308. package/src/security/primitives/$permission.spec.ts +30 -0
  309. package/src/security/primitives/$permission.ts +2 -2
  310. package/src/security/primitives/$realm.spec.ts +101 -0
  311. package/src/security/primitives/$role.spec.ts +52 -0
  312. package/src/security/primitives/$serviceAccount.spec.ts +61 -0
  313. package/src/security/providers/SecurityProvider.spec.ts +350 -0
  314. package/src/server/auth/providers/ServerAuthProvider.ts +0 -2
  315. package/src/server/cache/providers/ServerCacheProvider.spec.ts +942 -0
  316. package/src/server/compress/providers/ServerCompressProvider.spec.ts +31 -0
  317. package/src/server/compress/providers/ServerCompressProvider.ts +2 -0
  318. package/src/server/cookies/providers/ServerCookiesProvider.spec.ts +253 -0
  319. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +334 -0
  320. package/src/server/core/__tests__/ServerRouterProvider-requestId.spec.ts +129 -0
  321. package/src/server/core/primitives/$action.spec.ts +191 -0
  322. package/src/server/core/primitives/$route.spec.ts +65 -0
  323. package/src/server/core/providers/ServerBodyParserProvider.spec.ts +93 -0
  324. package/src/server/core/providers/ServerLoggerProvider.spec.ts +100 -0
  325. package/src/server/core/providers/ServerProvider.ts +3 -1
  326. package/src/server/core/services/HttpClient.spec.ts +123 -0
  327. package/src/server/core/services/UserAgentParser.spec.ts +111 -0
  328. package/src/server/cors/providers/ServerCorsProvider.spec.ts +481 -0
  329. package/src/server/health/providers/ServerHealthProvider.spec.ts +22 -0
  330. package/src/server/helmet/providers/ServerHelmetProvider.spec.ts +105 -0
  331. package/src/server/links/__tests__/$action.spec.ts +238 -0
  332. package/src/server/links/__tests__/fixtures/CrudApp.ts +122 -0
  333. package/src/server/links/__tests__/requestId.spec.ts +120 -0
  334. package/src/server/links/primitives/$remote.spec.ts +228 -0
  335. package/src/server/links/providers/LinkProvider.spec.ts +54 -0
  336. package/src/server/links/providers/LinkProvider.ts +49 -3
  337. package/src/server/links/providers/ServerLinksProvider.ts +1 -53
  338. package/src/server/links/schemas/apiLinksResponseSchema.ts +7 -0
  339. package/src/server/metrics/providers/ServerMetricsProvider.spec.ts +25 -0
  340. package/src/server/multipart/providers/ServerMultipartProvider.spec.ts +528 -0
  341. package/src/server/proxy/primitives/$proxy.spec.ts +87 -0
  342. package/src/server/rate-limit/__tests__/ActionRateLimit.spec.ts +211 -0
  343. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +344 -0
  344. package/src/server/security/__tests__/BasicAuth.spec.ts +684 -0
  345. package/src/server/security/__tests__/ServerSecurityProvider-realm.spec.ts +388 -0
  346. package/src/server/security/providers/ServerSecurityProvider.spec.ts +123 -0
  347. package/src/server/static/primitives/$serve.spec.ts +193 -0
  348. package/src/server/swagger/__tests__/ui.spec.ts +52 -0
  349. package/src/server/swagger/primitives/$swagger.spec.ts +193 -0
  350. package/src/server/swagger/providers/ServerSwaggerProvider.ts +18 -8
  351. package/src/sms/primitives/$sms.spec.ts +165 -0
  352. package/src/sms/providers/LocalSmsProvider.spec.ts +224 -0
  353. package/src/sms/providers/MemorySmsProvider.spec.ts +193 -0
  354. package/src/thread/primitives/$thread.spec.ts +186 -0
  355. package/src/topic/core/__tests__/shared.ts +144 -0
  356. package/src/topic/core/providers/MemoryTopicProvider.spec.ts +23 -0
  357. package/src/topic/redis/providers/RedisTopicProvider.spec.ts +23 -0
  358. package/src/vite/plugins/viteAlephaDev.ts +16 -4
  359. package/src/vite/tasks/runAlepha.ts +7 -1
  360. package/src/websocket/__tests__/$websocket-new.spec.ts +195 -0
  361. package/src/websocket/primitives/$channel.spec.ts +30 -0
@@ -0,0 +1,402 @@
1
+ import { Alepha, t } from "alepha";
2
+ import { DateTimeProvider } from "alepha/datetime";
3
+ import { describe, it } from "vitest";
4
+ import { pg } from "../index.ts";
5
+ import { $entity } from "../primitives/$entity.ts";
6
+ import { $repository } from "../primitives/$repository.ts";
7
+
8
+ describe("Query with Date Encoding", () => {
9
+ it("should handle date filters with Dayjs objects", async ({ expect }) => {
10
+ const Entity = $entity({
11
+ name: "events",
12
+ schema: t.object({
13
+ id: pg.primaryKey(),
14
+ name: t.text(),
15
+ eventDate: pg.createdAt(),
16
+ scheduledFor: t.optional(t.datetime()),
17
+ }),
18
+ });
19
+
20
+ class App {
21
+ repository = $repository(Entity);
22
+ }
23
+
24
+ const alepha = Alepha.create();
25
+ const app = alepha.inject(App);
26
+ const dt = alepha.inject(DateTimeProvider);
27
+ await alepha.start();
28
+
29
+ // Create test data
30
+ const event1 = await app.repository.create({
31
+ name: "Past Event",
32
+ scheduledFor: dt.utc("2024-01-01").toISOString(),
33
+ });
34
+
35
+ const event2 = await app.repository.create({
36
+ name: "Recent Event",
37
+ scheduledFor: dt.utc("2024-06-01").toISOString(),
38
+ });
39
+
40
+ const event3 = await app.repository.create({
41
+ name: "Future Event",
42
+ scheduledFor: dt.utc("2025-01-01").toISOString(),
43
+ });
44
+
45
+ // Test 1: Filter with Dayjs object using eq
46
+ const exactMatch = await app.repository.findMany({
47
+ where: {
48
+ scheduledFor: {
49
+ eq: dt.utc("2024-06-01").toISOString(),
50
+ },
51
+ },
52
+ });
53
+
54
+ expect(exactMatch).toHaveLength(1);
55
+ expect(exactMatch[0].name).toBe("Recent Event");
56
+
57
+ // Test 2: Filter with Dayjs object using gt (greater than)
58
+ const futureEvents = await app.repository.findMany({
59
+ where: {
60
+ scheduledFor: {
61
+ gt: dt.utc("2024-06-01").toISOString(),
62
+ },
63
+ },
64
+ });
65
+
66
+ expect(futureEvents).toHaveLength(1);
67
+ expect(futureEvents[0].name).toBe("Future Event");
68
+
69
+ // Test 3: Filter with Dayjs object using lt (less than)
70
+ const pastEvents = await app.repository.findMany({
71
+ where: {
72
+ scheduledFor: {
73
+ lt: dt.utc("2024-06-01").toISOString(),
74
+ },
75
+ },
76
+ });
77
+
78
+ expect(pastEvents).toHaveLength(1);
79
+ expect(pastEvents[0].name).toBe("Past Event");
80
+
81
+ // Test 4: Filter with Dayjs object using gte and lte (range)
82
+ const rangeEvents = await app.repository.findMany({
83
+ where: {
84
+ and: [
85
+ {
86
+ scheduledFor: {
87
+ gte: dt.utc("2024-01-01").toISOString(),
88
+ },
89
+ },
90
+ {
91
+ scheduledFor: {
92
+ lte: dt.utc("2024-12-31").toISOString(),
93
+ },
94
+ },
95
+ ],
96
+ },
97
+ });
98
+
99
+ expect(rangeEvents).toHaveLength(2);
100
+ expect(rangeEvents.map((e) => e.name)).toContain("Past Event");
101
+ expect(rangeEvents.map((e) => e.name)).toContain("Recent Event");
102
+
103
+ // Test 5: Filter with Dayjs object using between
104
+ // Note: eventDate is pg.createdAt() so it's the current timestamp
105
+ // We use a future date as upper bound to include records created today
106
+ const betweenEvents = await app.repository.findMany({
107
+ where: {
108
+ eventDate: {
109
+ between: [
110
+ dt.utc("2024-01-01").toISOString(),
111
+ dt.utc("2030-12-31").toISOString(),
112
+ ] as any,
113
+ },
114
+ },
115
+ });
116
+
117
+ expect(betweenEvents.length).toBeGreaterThanOrEqual(3);
118
+
119
+ // Test 6: Filter with inArray using Dayjs objects
120
+ const specificDates = await app.repository.findMany({
121
+ where: {
122
+ scheduledFor: {
123
+ inArray: [
124
+ dt.utc("2024-01-01").toISOString(),
125
+ dt.utc("2025-01-01").toISOString(),
126
+ ],
127
+ },
128
+ },
129
+ });
130
+
131
+ expect(specificDates).toHaveLength(2);
132
+ expect(specificDates.map((e) => e.name)).toContain("Past Event");
133
+ expect(specificDates.map((e) => e.name)).toContain("Future Event");
134
+
135
+ // Test 7: Direct value (not using operator object)
136
+ const directMatch = await app.repository.findMany({
137
+ where: {
138
+ scheduledFor: dt.utc("2024-06-01").toISOString(),
139
+ },
140
+ });
141
+
142
+ expect(directMatch).toHaveLength(1);
143
+ expect(directMatch[0].name).toBe("Recent Event");
144
+
145
+ await alepha.stop();
146
+ });
147
+
148
+ it("should handle mixed date formats (string and Dayjs)", async ({
149
+ expect,
150
+ }) => {
151
+ const Entity = $entity({
152
+ name: "tasks",
153
+ schema: t.object({
154
+ id: pg.primaryKey(),
155
+ title: t.text(),
156
+ dueDate: t.optional(t.datetime()),
157
+ }),
158
+ });
159
+
160
+ class App {
161
+ repository = $repository(Entity);
162
+ }
163
+
164
+ const alepha = Alepha.create();
165
+ const app = alepha.inject(App);
166
+ const dt = alepha.inject(DateTimeProvider);
167
+ await alepha.start();
168
+
169
+ // Create test data
170
+ await app.repository.create({
171
+ title: "Task 1",
172
+ dueDate: dt.utc("2024-03-15").toISOString(),
173
+ });
174
+
175
+ await app.repository.create({
176
+ title: "Task 2",
177
+ dueDate: dt.utc("2024-06-20").toISOString(),
178
+ });
179
+
180
+ // Test with Dayjs object
181
+ const withDayjs = await app.repository.findMany({
182
+ where: {
183
+ dueDate: {
184
+ gte: dt.utc("2024-06-01").toISOString(),
185
+ },
186
+ },
187
+ });
188
+
189
+ expect(withDayjs).toHaveLength(1);
190
+ expect(withDayjs[0].title).toBe("Task 2");
191
+
192
+ // Test with ISO string (should also work)
193
+ const withString = await app.repository.findMany({
194
+ where: {
195
+ dueDate: {
196
+ gte: "2024-06-01T00:00:00.000Z" as any,
197
+ },
198
+ },
199
+ });
200
+
201
+ expect(withString).toHaveLength(1);
202
+ expect(withString[0].title).toBe("Task 2");
203
+
204
+ await alepha.stop();
205
+ });
206
+
207
+ it("should handle date comparisons in complex queries", async ({
208
+ expect,
209
+ }) => {
210
+ const Entity = $entity({
211
+ name: "appointments",
212
+ schema: t.object({
213
+ id: pg.primaryKey(),
214
+ patientName: t.text(),
215
+ appointmentDate: t.datetime(),
216
+ status: t.text(),
217
+ }),
218
+ });
219
+
220
+ class App {
221
+ repository = $repository(Entity);
222
+ }
223
+
224
+ const alepha = Alepha.create();
225
+ const app = alepha.inject(App);
226
+ const dt = alepha.inject(DateTimeProvider);
227
+ await alepha.start();
228
+
229
+ // Create test data
230
+ await app.repository.createMany([
231
+ {
232
+ patientName: "Alice",
233
+ appointmentDate: dt.utc("2024-05-01").toISOString(),
234
+ status: "confirmed",
235
+ },
236
+ {
237
+ patientName: "Bob",
238
+ appointmentDate: dt.utc("2024-06-01").toISOString(),
239
+ status: "pending",
240
+ },
241
+ {
242
+ patientName: "Charlie",
243
+ appointmentDate: dt.utc("2024-07-01").toISOString(),
244
+ status: "confirmed",
245
+ },
246
+ {
247
+ patientName: "David",
248
+ appointmentDate: dt.utc("2024-08-01").toISOString(),
249
+ status: "cancelled",
250
+ },
251
+ ]);
252
+
253
+ // Complex query: Find confirmed appointments in June or July
254
+ const confirmedSummer = await app.repository.findMany({
255
+ where: {
256
+ and: [
257
+ {
258
+ status: { eq: "confirmed" },
259
+ },
260
+ {
261
+ appointmentDate: {
262
+ gte: dt.utc("2024-06-01").toISOString(),
263
+ },
264
+ },
265
+ {
266
+ appointmentDate: {
267
+ lt: dt.utc("2024-08-01").toISOString(),
268
+ },
269
+ },
270
+ ],
271
+ },
272
+ });
273
+
274
+ expect(confirmedSummer).toHaveLength(1);
275
+ expect(confirmedSummer[0].patientName).toBe("Charlie");
276
+
277
+ // Test OR condition with dates
278
+ const earlyOrLate = await app.repository.findMany({
279
+ where: {
280
+ or: [
281
+ {
282
+ appointmentDate: {
283
+ lt: dt.utc("2024-06-01").toISOString(),
284
+ },
285
+ },
286
+ {
287
+ appointmentDate: {
288
+ gte: dt.utc("2024-08-01").toISOString(),
289
+ },
290
+ },
291
+ ],
292
+ },
293
+ });
294
+
295
+ expect(earlyOrLate).toHaveLength(2);
296
+ expect(earlyOrLate.map((a) => a.patientName)).toContain("Alice");
297
+ expect(earlyOrLate.map((a) => a.patientName)).toContain("David");
298
+
299
+ await alepha.stop();
300
+ });
301
+
302
+ it("should handle null date values", async ({ expect }) => {
303
+ const Entity = $entity({
304
+ name: "projects",
305
+ schema: t.object({
306
+ id: pg.primaryKey(),
307
+ name: t.text(),
308
+ completedAt: t.optional(t.datetime()),
309
+ }),
310
+ });
311
+
312
+ class App {
313
+ repository = $repository(Entity);
314
+ }
315
+
316
+ const alepha = Alepha.create();
317
+ const app = alepha.inject(App);
318
+ const dt = alepha.inject(DateTimeProvider);
319
+ await alepha.start();
320
+
321
+ // Create test data
322
+ await app.repository.createMany([
323
+ {
324
+ name: "Completed Project",
325
+ completedAt: dt.utc("2024-05-15").toISOString(),
326
+ },
327
+ {
328
+ name: "Ongoing Project",
329
+ },
330
+ ]);
331
+
332
+ // Test isNull filter
333
+ const ongoing = await app.repository.findMany({
334
+ where: {
335
+ completedAt: {
336
+ isNull: true,
337
+ },
338
+ },
339
+ });
340
+
341
+ expect(ongoing).toHaveLength(1);
342
+ expect(ongoing[0].name).toBe("Ongoing Project");
343
+
344
+ // Test isNotNull filter
345
+ const completed = await app.repository.findMany({
346
+ where: {
347
+ completedAt: {
348
+ isNotNull: true,
349
+ },
350
+ },
351
+ });
352
+
353
+ expect(completed).toHaveLength(1);
354
+ expect(completed[0].name).toBe("Completed Project");
355
+
356
+ await alepha.stop();
357
+ });
358
+
359
+ it("should handle date encoding with notInArray", async ({ expect }) => {
360
+ const Entity = $entity({
361
+ name: "events",
362
+ schema: t.object({
363
+ id: pg.primaryKey(),
364
+ name: t.text(),
365
+ date: t.datetime(),
366
+ }),
367
+ });
368
+
369
+ class App {
370
+ repository = $repository(Entity);
371
+ }
372
+
373
+ const alepha = Alepha.create();
374
+ const app = alepha.inject(App);
375
+ const dt = alepha.inject(DateTimeProvider);
376
+ await alepha.start();
377
+
378
+ await app.repository.createMany([
379
+ { name: "Event 1", date: dt.utc("2024-01-01").toISOString() },
380
+ { name: "Event 2", date: dt.utc("2024-02-01").toISOString() },
381
+ { name: "Event 3", date: dt.utc("2024-03-01").toISOString() },
382
+ { name: "Event 4", date: dt.utc("2024-04-01").toISOString() },
383
+ ]);
384
+
385
+ const excluded = await app.repository.findMany({
386
+ where: {
387
+ date: {
388
+ notInArray: [
389
+ dt.utc("2024-01-01").toISOString(),
390
+ dt.utc("2024-03-01").toISOString(),
391
+ ],
392
+ },
393
+ },
394
+ });
395
+
396
+ expect(excluded).toHaveLength(2);
397
+ expect(excluded.map((e) => e.name)).toContain("Event 2");
398
+ expect(excluded.map((e) => e.name)).toContain("Event 4");
399
+
400
+ await alepha.stop();
401
+ });
402
+ });
@@ -0,0 +1,156 @@
1
+ import { Alepha, t } from "alepha";
2
+ import { describe, expect, it } from "vitest";
3
+ import { $entity, $repository, pg } from "../index.ts";
4
+
5
+ describe("pg.ref - automatic onDelete behavior", () => {
6
+ const categories = $entity({
7
+ name: "categories",
8
+ schema: t.object({
9
+ id: pg.identityPrimaryKey(),
10
+ __v: pg.version(),
11
+ name: t.text(),
12
+ }),
13
+ });
14
+
15
+ const products = $entity({
16
+ name: "products",
17
+ schema: t.object({
18
+ id: pg.identityPrimaryKey(),
19
+ __v: pg.version(),
20
+ name: t.text(),
21
+ // Optional reference - should automatically set onDelete: "set null"
22
+ categoryId: pg.ref(t.optional(t.integer()), () => categories.cols.id),
23
+ }),
24
+ });
25
+
26
+ const orders = $entity({
27
+ name: "orders",
28
+ schema: t.object({
29
+ id: pg.identityPrimaryKey(),
30
+ __v: pg.version(),
31
+ orderNumber: t.text(),
32
+ // Required reference - should automatically set onDelete: "cascade"
33
+ productId: pg.ref(t.integer(), () => products.cols.id),
34
+ }),
35
+ });
36
+
37
+ class App {
38
+ categories = $repository(categories);
39
+ products = $repository(products);
40
+ orders = $repository(orders);
41
+ }
42
+
43
+ it("should cascade delete for required references", async () => {
44
+ const alepha = Alepha.create();
45
+ const app = alepha.inject(App);
46
+ await alepha.start();
47
+
48
+ // Create a product with category
49
+ const category = await app.categories.create({ name: "Electronics" });
50
+ const product = await app.products.create({
51
+ name: "Laptop",
52
+ categoryId: category.id,
53
+ });
54
+ const order = await app.orders.create({
55
+ orderNumber: "ORD-001",
56
+ productId: product.id,
57
+ });
58
+
59
+ // Verify data exists
60
+ expect(await app.products.findMany()).toEqual([
61
+ { id: product.id, name: "Laptop", categoryId: category.id, __v: 0 },
62
+ ]);
63
+ expect(await app.orders.findMany()).toEqual([
64
+ { id: order.id, orderNumber: "ORD-001", productId: product.id, __v: 0 },
65
+ ]);
66
+
67
+ // Delete product - order should cascade delete (required reference)
68
+ await app.products.deleteById(product.id);
69
+
70
+ // Order should be deleted due to cascade
71
+ expect(await app.products.findMany()).toEqual([]);
72
+ expect(await app.orders.findMany()).toEqual([]);
73
+ });
74
+
75
+ it("should set null for optional references", async () => {
76
+ const alepha = Alepha.create();
77
+ const app = alepha.inject(App);
78
+ await alepha.start();
79
+
80
+ // Create product with category
81
+ const category = await app.categories.create({ name: "Electronics" });
82
+ const product = await app.products.create({
83
+ name: "Laptop",
84
+ categoryId: category.id,
85
+ });
86
+
87
+ // Verify product has category
88
+ expect(await app.products.findMany()).toEqual([
89
+ { id: product.id, name: "Laptop", categoryId: category.id, __v: 0 },
90
+ ]);
91
+
92
+ // Delete category - product should remain but categoryId set to null
93
+ await app.categories.deleteById(category.id);
94
+
95
+ // Product should still exist with null categoryId (optional reference)
96
+ expect(await app.categories.findMany()).toEqual([]);
97
+ expect(await app.products.findMany()).toEqual([
98
+ { id: product.id, name: "Laptop", __v: 0 },
99
+ ]);
100
+ });
101
+
102
+ it("should allow explicit actions to override auto behavior", async () => {
103
+ // Test that explicit actions are not overridden by auto behavior
104
+ const customCategories = $entity({
105
+ name: "custom_categories",
106
+ schema: t.object({
107
+ id: pg.identityPrimaryKey(),
108
+ __v: pg.version(),
109
+ name: t.text(),
110
+ }),
111
+ });
112
+
113
+ const customProducts = $entity({
114
+ name: "custom_products",
115
+ schema: t.object({
116
+ id: pg.identityPrimaryKey(),
117
+ __v: pg.version(),
118
+ name: t.text(),
119
+ // Optional reference but explicitly set to cascade
120
+ categoryId: pg.ref(
121
+ t.optional(t.integer()),
122
+ () => customCategories.cols.id,
123
+ {
124
+ onDelete: "cascade",
125
+ },
126
+ ),
127
+ }),
128
+ });
129
+
130
+ class CustomApp {
131
+ categories = $repository(customCategories);
132
+ products = $repository(customProducts);
133
+ }
134
+
135
+ const alepha = Alepha.create();
136
+ const app = alepha.inject(CustomApp);
137
+ await alepha.start();
138
+
139
+ const category = await app.categories.create({ name: "Books" });
140
+ const product = await app.products.create({
141
+ name: "Novel",
142
+ categoryId: category.id,
143
+ });
144
+
145
+ expect(await app.products.findMany()).toEqual([
146
+ { id: product.id, name: "Novel", categoryId: category.id, __v: 0 },
147
+ ]);
148
+
149
+ // Delete category - product should cascade delete even though reference is optional
150
+ await app.categories.deleteById(category.id);
151
+
152
+ // Product should be deleted due to explicit cascade
153
+ expect(await app.categories.findMany()).toEqual([]);
154
+ expect(await app.products.findMany()).toEqual([]);
155
+ });
156
+ });
@@ -0,0 +1,102 @@
1
+ import { Alepha, t } from "alepha";
2
+ import { describe, expect, it } from "vitest";
3
+ import { $entity, $repository, pg } from "../index.ts";
4
+
5
+ const users = $entity({
6
+ name: "users",
7
+ schema: t.object({
8
+ id: pg.identityPrimaryKey(),
9
+ __v: pg.version(),
10
+ name: t.text(),
11
+ currentPostId: pg.ref(t.optional(t.integer()), () => posts.cols.id, {
12
+ onDelete: "set null",
13
+ }),
14
+ }),
15
+ });
16
+
17
+ const posts = $entity({
18
+ name: "posts",
19
+ schema: t.object({
20
+ id: pg.identityPrimaryKey(),
21
+ __v: pg.version(),
22
+ userId: pg.ref(t.integer(), () => users.cols.id, {
23
+ onDelete: "cascade",
24
+ }),
25
+ postParentId: pg.ref(t.optional(t.integer()), () => posts.cols.id, {
26
+ onDelete: "cascade",
27
+ }),
28
+ }),
29
+ });
30
+
31
+ class App {
32
+ users = $repository(users);
33
+ posts = $repository(posts);
34
+ }
35
+
36
+ describe("references", () => {
37
+ it("should handle delete cascade", async () => {
38
+ const alepha = Alepha.create();
39
+ const app = alepha.inject(App);
40
+ await alepha.start();
41
+
42
+ const user = await app.users.create({ name: "John" });
43
+ const post1 = await app.posts.create({ userId: user.id });
44
+ const post2 = await app.posts.create({
45
+ userId: user.id,
46
+ postParentId: post1.id,
47
+ });
48
+
49
+ expect(await app.users.findMany()).toEqual([
50
+ { id: user.id, name: "John", __v: 0 },
51
+ ]);
52
+ expect(await app.posts.findMany()).toEqual([
53
+ { id: post1.id, userId: user.id, __v: 0 },
54
+ { id: post2.id, userId: user.id, postParentId: post1.id, __v: 0 },
55
+ ]);
56
+
57
+ await app.users.deleteById(user.id);
58
+
59
+ expect(await app.users.findMany()).toEqual([]);
60
+ expect(await app.posts.findMany()).toEqual([]);
61
+ });
62
+
63
+ it("should handle delete null", async () => {
64
+ const alepha = Alepha.create();
65
+ const app = alepha.inject(App);
66
+ await alepha.start();
67
+
68
+ const user = await app.users.create({ name: "John" });
69
+ const post1 = await app.posts.create({ userId: user.id });
70
+ const post2 = await app.posts.create({
71
+ userId: user.id,
72
+ postParentId: post1.id,
73
+ });
74
+ const post3 = await app.posts.create({
75
+ userId: user.id,
76
+ });
77
+
78
+ user.currentPostId = post2.id;
79
+
80
+ await app.users.save(user);
81
+
82
+ expect(await app.users.findMany()).toEqual([
83
+ { id: user.id, name: "John", __v: 1, currentPostId: post2.id },
84
+ ]);
85
+
86
+ expect(await app.posts.findMany()).toEqual([
87
+ { id: post1.id, userId: user.id, __v: 0 },
88
+ { id: post2.id, userId: user.id, postParentId: post1.id, __v: 0 },
89
+ { id: post3.id, userId: user.id, __v: 0 },
90
+ ]);
91
+
92
+ await app.posts.deleteById(post1.id);
93
+
94
+ expect(await app.users.findMany()).toEqual([
95
+ { id: user.id, name: "John", __v: 1 },
96
+ ]);
97
+
98
+ expect(await app.posts.findMany()).toEqual([
99
+ { id: post3.id, userId: user.id, __v: 0 },
100
+ ]);
101
+ });
102
+ });