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,196 @@
1
+ import { describe, test } from "vitest";
2
+ import { buildQueryString, parseQueryString } from "../index.ts";
3
+
4
+ describe("parseQueryString with wildcard patterns", () => {
5
+ test("should parse wildcard patterns with = operator", ({ expect }) => {
6
+ // Test startsWith pattern
7
+ const result1 = parseQueryString("name=John*");
8
+ expect(result1).toEqual({ name: { startsWith: "John" } });
9
+
10
+ // Test endsWith pattern
11
+ const result2 = parseQueryString("name=*Smith");
12
+ expect(result2).toEqual({ name: { endsWith: "Smith" } });
13
+
14
+ // Test contains pattern
15
+ const result3 = parseQueryString("name=*oh*");
16
+ expect(result3).toEqual({ name: { contains: "oh" } });
17
+
18
+ // Test literal asterisk in the middle (not at beginning or end)
19
+ const result4 = parseQueryString("name=Jo*hn");
20
+ expect(result4).toEqual({ name: { eq: "Jo*hn" } });
21
+
22
+ // Test literal equals (no wildcards)
23
+ const result5 = parseQueryString("name=John");
24
+ expect(result5).toEqual({ name: { eq: "John" } });
25
+ });
26
+
27
+ test("should handle wildcard patterns in complex queries", ({ expect }) => {
28
+ // Multiple conditions with wildcards
29
+ const result1 = parseQueryString("name=*John&email=*@example.com");
30
+ expect(result1).toEqual({
31
+ and: [
32
+ { name: { endsWith: "John" } },
33
+ { email: { endsWith: "@example.com" } },
34
+ ],
35
+ });
36
+
37
+ // OR conditions with wildcards
38
+ const result2 = parseQueryString("name=John*|name=*Smith");
39
+ expect(result2).toEqual({
40
+ or: [{ name: { startsWith: "John" } }, { name: { endsWith: "Smith" } }],
41
+ });
42
+
43
+ // Nested conditions with wildcards
44
+ const result3 = parseQueryString("(name=*John*|email=admin*)&age>18");
45
+ expect(result3).toEqual({
46
+ and: [
47
+ {
48
+ or: [
49
+ { name: { contains: "John" } },
50
+ { email: { startsWith: "admin" } },
51
+ ],
52
+ },
53
+ { age: { gt: 18 } },
54
+ ],
55
+ });
56
+ });
57
+
58
+ test("should handle wildcard patterns in quoted strings", ({ expect }) => {
59
+ // Quoted string with wildcards should be treated as wildcards
60
+ const result1 = parseQueryString('name="*John*"');
61
+ expect(result1).toEqual({ name: { contains: "John" } });
62
+
63
+ // Quoted string with asterisk in middle
64
+ const result2 = parseQueryString('name="Jo*hn"');
65
+ expect(result2).toEqual({ name: { eq: "Jo*hn" } });
66
+
67
+ // Single quotes
68
+ const result3 = parseQueryString("name='*Smith'");
69
+ expect(result3).toEqual({ name: { endsWith: "Smith" } });
70
+ });
71
+
72
+ test("should handle wildcard patterns with special characters", ({
73
+ expect,
74
+ }) => {
75
+ // Wildcard with spaces
76
+ const result1 = parseQueryString("name=*John Smith*");
77
+ expect(result1).toEqual({ name: { contains: "John Smith" } });
78
+
79
+ // Wildcard with special characters
80
+ const result2 = parseQueryString("email=*@example.com");
81
+ expect(result2).toEqual({ email: { endsWith: "@example.com" } });
82
+
83
+ // Wildcard with numbers
84
+ const result3 = parseQueryString("code=ABC*123");
85
+ expect(result3).toEqual({ code: { eq: "ABC*123" } }); // Asterisk in middle is literal
86
+ });
87
+
88
+ test("should handle wildcard patterns in arrays", ({ expect }) => {
89
+ // Array values don't support wildcards (treated as literal)
90
+ const result = parseQueryString("status=[active*,*pending,*idle*]");
91
+ expect(result).toEqual({
92
+ status: { inArray: ["active*", "*pending", "*idle*"] },
93
+ });
94
+ });
95
+
96
+ test("should handle wildcard patterns with != operator", ({ expect }) => {
97
+ // != operator doesn't support wildcards, treats as literal
98
+ const result1 = parseQueryString("name!=*John");
99
+ expect(result1).toEqual({ name: { ne: "*John" } });
100
+
101
+ const result2 = parseQueryString("name!=John*");
102
+ expect(result2).toEqual({ name: { ne: "John*" } });
103
+ });
104
+
105
+ test("should handle empty wildcard patterns", ({ expect }) => {
106
+ // Just asterisks - a single asterisk at the end means "starts with nothing" = everything
107
+ const result1 = parseQueryString("name=*");
108
+ expect(result1).toEqual({ name: { contains: "" } }); // Since * alone has both start and end asterisk
109
+
110
+ const result2 = parseQueryString("name=**");
111
+ expect(result2).toEqual({ name: { contains: "" } });
112
+
113
+ const result3 = parseQueryString("name=***");
114
+ expect(result3).toEqual({ name: { contains: "*" } });
115
+ });
116
+
117
+ test("should handle JSONB nested queries with wildcards", ({ expect }) => {
118
+ const result = parseQueryString("profile.city=*Paris*&profile.name=John*");
119
+ expect(result).toEqual({
120
+ and: [
121
+ { profile: { city: { contains: "Paris" } } },
122
+ { profile: { name: { startsWith: "John" } } },
123
+ ],
124
+ });
125
+ });
126
+
127
+ test("should not apply wildcards to non-string operators", ({ expect }) => {
128
+ // Numeric comparison operators don't use wildcards
129
+ const result1 = parseQueryString("age>18");
130
+ expect(result1).toEqual({ age: { gt: 18 } });
131
+
132
+ // NULL checks don't use wildcards
133
+ const result2 = parseQueryString("name=null");
134
+ expect(result2).toEqual({ name: { isNull: true } });
135
+
136
+ const result3 = parseQueryString("name!=null");
137
+ expect(result3).toEqual({ name: { isNotNull: true } });
138
+ });
139
+ });
140
+
141
+ describe("buildQueryString with wildcard patterns", () => {
142
+ test("should build query strings from wildcard conditions", ({ expect }) => {
143
+ // startsWith
144
+ const query1 = buildQueryString({ name: { startsWith: "John" } });
145
+ expect(query1).toBe("name=John*");
146
+
147
+ // endsWith
148
+ const query2 = buildQueryString({ name: { endsWith: "Smith" } });
149
+ expect(query2).toBe("name=*Smith");
150
+
151
+ // contains
152
+ const query3 = buildQueryString({ name: { contains: "oh" } });
153
+ expect(query3).toBe("name=*oh*");
154
+ });
155
+
156
+ test("should build complex query strings with wildcards", ({ expect }) => {
157
+ const query = buildQueryString({
158
+ and: [
159
+ { name: { startsWith: "John" } },
160
+ { email: { endsWith: "@example.com" } },
161
+ { bio: { contains: "developer" } },
162
+ ],
163
+ });
164
+ expect(query).toBe("name=John*&email=*@example.com&bio=*developer*");
165
+ });
166
+
167
+ test("should handle OR conditions with wildcards", ({ expect }) => {
168
+ const query = buildQueryString({
169
+ or: [
170
+ { name: { startsWith: "Admin" } },
171
+ { role: { contains: "manager" } },
172
+ ],
173
+ });
174
+ expect(query).toBe("(name=Admin*|role=*manager*)");
175
+ });
176
+
177
+ test("round-trip conversion should preserve wildcard semantics", ({
178
+ expect,
179
+ }) => {
180
+ const testCases = [
181
+ "name=John*",
182
+ "name=*Smith",
183
+ "name=*John*",
184
+ "email=admin*&role=*manager*",
185
+ "(name=*John*|name=*Jane*)&active=true",
186
+ "profile.city=*Paris*",
187
+ ];
188
+
189
+ for (const original of testCases) {
190
+ const parsed = parseQueryString(original);
191
+ const rebuilt = buildQueryString(parsed);
192
+ const reparsed = parseQueryString(rebuilt);
193
+ expect(reparsed).toEqual(parsed);
194
+ }
195
+ });
196
+ });
@@ -0,0 +1,137 @@
1
+ import { Alepha, type Static } from "alepha";
2
+ import { DateTimeProvider } from "alepha/datetime";
3
+ import { describe, expect, it } from "vitest";
4
+ import { bigEntity } from "../__tests__/fixtures/bigEntitySchema.ts";
5
+ import type { InsertUserEntity } from "../__tests__/fixtures/userEntitySchema.ts";
6
+ import { userEntity } from "../__tests__/fixtures/userEntitySchema.ts";
7
+ import { $repository } from "../index.ts";
8
+
9
+ class App {
10
+ users = $repository(userEntity);
11
+ big = $repository(bigEntity);
12
+ create = (data: InsertUserEntity) => this.users.create(data);
13
+ }
14
+
15
+ const testPgAttr = async (alepha: Alepha) => {
16
+ const app = alepha.inject(App);
17
+ await alepha.start();
18
+
19
+ const entity = await app.users.create({
20
+ suspect: "hey",
21
+ name: "John",
22
+ profile: {
23
+ age: 30,
24
+ },
25
+ } as any);
26
+
27
+ expect((entity as any).suspect).toBeUndefined();
28
+ expect(entity.name).toEqual("John");
29
+ expect(entity.profile.age).toEqual(30);
30
+ };
31
+
32
+ describe("$repository - pg.attr", () => {
33
+ it("should filter out attributes not defined in schema", async () => {
34
+ await testPgAttr(Alepha.create());
35
+ });
36
+
37
+ it("should filter out attributes not defined in schema (sqlite)", async () => {
38
+ await testPgAttr(
39
+ Alepha.create({
40
+ env: {
41
+ DATABASE_URL: "sqlite://:memory:",
42
+ },
43
+ }),
44
+ );
45
+ });
46
+ });
47
+
48
+ const testAllTypes = async (alepha: Alepha) => {
49
+ const app = alepha.inject(App);
50
+ await alepha.start();
51
+
52
+ const data: Static<typeof bigEntity.insertSchema> = {
53
+ type: "big_entity",
54
+ a: "a",
55
+ b: 1.111,
56
+ date: "2024-01-01",
57
+ c: 2,
58
+ d: true,
59
+ e: {
60
+ a: "a",
61
+ b: 1,
62
+ c: 2,
63
+ d: true,
64
+ e: {
65
+ a: "a",
66
+ b: 1,
67
+ c: 2,
68
+ d: true,
69
+ j: [
70
+ {
71
+ a: "a",
72
+ b: 1,
73
+ c: 2,
74
+ d: true,
75
+ e: {
76
+ a: "a",
77
+ b: 1,
78
+ c: 2,
79
+ d: true,
80
+ },
81
+ },
82
+ ],
83
+ },
84
+ },
85
+ f: ["a", "b"],
86
+ g: [1.111],
87
+ h: [2, 1],
88
+ i: [true],
89
+ j: [
90
+ {
91
+ a: "a",
92
+ b: 1,
93
+ c: 2,
94
+ d: true,
95
+ e: {
96
+ a: "a",
97
+ b: 1,
98
+ c: 2,
99
+ d: true,
100
+ },
101
+ },
102
+ ],
103
+ k: alepha.inject(DateTimeProvider).nowISOString(),
104
+ l: "123e4567-e89b-12d3-a456-426614174000",
105
+ m: "a" as const,
106
+ };
107
+ const entity = await app.big.create(data);
108
+
109
+ expect(entity).toEqual({
110
+ id: entity.id,
111
+ ...data,
112
+ });
113
+
114
+ const it = await app.big.findMany({
115
+ where: {
116
+ type: "big_entity",
117
+ },
118
+ });
119
+
120
+ expect(it).toHaveLength(1);
121
+ };
122
+
123
+ describe("$repository - all types", () => {
124
+ it("should handle all supported data types", async () => {
125
+ await testAllTypes(Alepha.create());
126
+ });
127
+
128
+ it("should handle all supported data types (sqlite)", async () => {
129
+ await testAllTypes(
130
+ Alepha.create({
131
+ env: {
132
+ DATABASE_URL: "sqlite://:memory:",
133
+ },
134
+ }),
135
+ );
136
+ });
137
+ });
@@ -0,0 +1,29 @@
1
+ import { Alepha } from "alepha";
2
+ import { describe, expect, it } from "vitest";
3
+ import { $sequence } from "../index.ts";
4
+
5
+ describe("$sequence", () => {
6
+ class App {
7
+ seq = $sequence();
8
+ seq2 = $sequence({ startWith: 100, increment: 2 });
9
+ }
10
+
11
+ const alepha = Alepha.create();
12
+ const app = alepha.inject(App);
13
+
14
+ it("should generate sequential numbers", async () => {
15
+ expect(await app.seq.next()).toBe(1);
16
+ expect(await app.seq.next()).toBe(2);
17
+ expect(await app.seq.next()).toBe(3);
18
+ expect(await app.seq.current()).toBe(3);
19
+ expect(await app.seq.next()).toBe(4);
20
+ });
21
+
22
+ it("should support custom start and increment options", async () => {
23
+ expect(await app.seq2.next()).toBe(100);
24
+ expect(await app.seq2.next()).toBe(102);
25
+ expect(await app.seq2.next()).toBe(104);
26
+ expect(await app.seq2.current()).toBe(104);
27
+ expect(await app.seq2.next()).toBe(106);
28
+ });
29
+ });
@@ -0,0 +1,82 @@
1
+ import { $inject, Alepha, t } from "alepha";
2
+ import { DateTimeProvider } from "alepha/datetime";
3
+ import { describe, expect, it } from "vitest";
4
+ import { DbConflictError } from "../errors/DbConflictError.ts";
5
+ import { $entity, $repository, $transaction, pg } from "../index.ts";
6
+
7
+ const a = $entity({
8
+ name: "a",
9
+ schema: t.object({
10
+ id: pg.primaryKey(
11
+ t.integer(),
12
+ {},
13
+ {
14
+ mode: "byDefault",
15
+ },
16
+ ),
17
+ v: pg.version(),
18
+ counter: t.integer(),
19
+ }),
20
+ });
21
+
22
+ class App {
23
+ dt = $inject(DateTimeProvider);
24
+
25
+ repository = $repository(a);
26
+
27
+ runIncrementTest = $transaction({
28
+ handler: async (tx, id: number, val: number, waitMs = 0) => {
29
+ const e = await this.repository.findById(id, {
30
+ tx,
31
+ });
32
+ if (waitMs) {
33
+ await this.dt.wait(waitMs);
34
+ }
35
+ e.counter += val;
36
+ return await this.repository.save(e, { tx });
37
+ },
38
+ });
39
+
40
+ runCollisionTest = $transaction({
41
+ handler: async (tx) => {
42
+ await this.repository.deleteMany({}, { tx });
43
+ const { id } = await this.repository.create({ counter: 0 }, { tx });
44
+ await this.repository.create({ counter: 0 }, { tx });
45
+ await this.repository.create({ counter: 0, id: id }, { tx });
46
+ },
47
+ });
48
+ }
49
+
50
+ describe("$transaction", () => {
51
+ it(
52
+ "should handle version mismatch with retry",
53
+ { timeout: 10000 },
54
+ async () => {
55
+ const alepha = Alepha.create();
56
+ const app = alepha.inject(App);
57
+ await alepha.start();
58
+
59
+ const { id } = await app.repository.create({ counter: 0 });
60
+
61
+ const tx = app.runIncrementTest(id, 10, 200);
62
+ await app.runIncrementTest(id, 100);
63
+ await tx;
64
+
65
+ const r3 = await app.repository.findById(id);
66
+
67
+ expect(r3.counter).toBe(110);
68
+ },
69
+ );
70
+
71
+ it("should rollback on conflict error", { timeout: 10000 }, async () => {
72
+ const alepha = Alepha.create();
73
+ const app = alepha.inject(App);
74
+ await alepha.start();
75
+
76
+ await app.repository.create({ counter: 0 });
77
+
78
+ await expect(() => app.runCollisionTest()).rejects.toThrow(DbConflictError);
79
+
80
+ expect(await app.repository.count()).toBe(1);
81
+ });
82
+ });
@@ -137,7 +137,7 @@ export class BunPostgresProvider extends DatabaseProvider {
137
137
  // never migrate in serverless mode (vercel, netlify, ...)
138
138
  if (!this.alepha.isServerless()) {
139
139
  try {
140
- await this.migrate.run();
140
+ await this.migrateLock.run();
141
141
  } catch (error) {
142
142
  throw new DbMigrationError(error);
143
143
  }
@@ -217,9 +217,9 @@ export class BunPostgresProvider extends DatabaseProvider {
217
217
  }
218
218
  }
219
219
 
220
- protected migrate = $lock({
220
+ protected migrateLock = $lock({
221
221
  handler: async () => {
222
- await this.migrateDatabase();
222
+ await this.migrate();
223
223
  },
224
224
  });
225
225
  }
@@ -154,7 +154,7 @@ export class BunSqliteProvider extends DatabaseProvider {
154
154
  },
155
155
  });
156
156
 
157
- await this.migrateDatabase();
157
+ await this.migrate();
158
158
 
159
159
  this.log.info(`Using Bun SQLite database at ${filepath}`);
160
160
  },
@@ -125,7 +125,7 @@ export class CloudflareD1Provider extends DatabaseProvider {
125
125
 
126
126
  this.drizzleDb = drizzle(this.d1) as DrizzleD1Database;
127
127
 
128
- await this.migrateDatabase();
128
+ await this.migrate();
129
129
 
130
130
  this.log.info("Using Cloudflare D1 database");
131
131
  },
@@ -95,7 +95,7 @@ export abstract class DatabaseProvider {
95
95
  /**
96
96
  * Base migration orchestration - handles environment logic
97
97
  */
98
- protected async migrateDatabase(): Promise<void> {
98
+ public async migrate(): Promise<void> {
99
99
  const migrationsFolder = this.getMigrationsFolder();
100
100
 
101
101
  // Handle different environments
@@ -127,7 +127,7 @@ export class NodePostgresProvider extends DatabaseProvider {
127
127
  // never migrate in serverless mode (vercel, netlify, ...)
128
128
  if (!this.alepha.isServerless()) {
129
129
  try {
130
- await this.migrate.run();
130
+ await this.migrateLock.run();
131
131
  } catch (error) {
132
132
  throw new DbMigrationError(error);
133
133
  }
@@ -196,9 +196,9 @@ export class NodePostgresProvider extends DatabaseProvider {
196
196
  }
197
197
  }
198
198
 
199
- protected migrate = $lock({
199
+ protected migrateLock = $lock({
200
200
  handler: async () => {
201
- await this.migrateDatabase();
201
+ await this.migrate();
202
202
  },
203
203
  });
204
204
 
@@ -157,7 +157,7 @@ export class NodeSqliteProvider extends DatabaseProvider {
157
157
 
158
158
  this.sqlite = new DatabaseSync(filepath);
159
159
 
160
- await this.migrateDatabase();
160
+ await this.migrate();
161
161
 
162
162
  this.log.info(`Using SQLite database at ${filepath}`);
163
163
  },
@@ -55,7 +55,7 @@ export class PglitePostgresProvider extends DatabaseProvider {
55
55
  if (this.alepha.isTest()) {
56
56
  path = ":memory:"; // use in-memory database for tests by default
57
57
  } else {
58
- path = "node_modules/.db"; // default path for dev
58
+ path = "node_modules/.alepha/pglite"; // default path for dev
59
59
  }
60
60
  } else {
61
61
  if (path.includes(":memory:")) {
@@ -112,7 +112,7 @@ export class PglitePostgresProvider extends DatabaseProvider {
112
112
  client: this.client,
113
113
  });
114
114
 
115
- await this.migrateDatabase();
115
+ await this.migrate();
116
116
 
117
117
  this.log.info(`Using PGlite database at ${path}`);
118
118
  },