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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/server/compress/providers/ServerCompressProvider.ts","../../../src/server/compress/index.ts"],"sourcesContent":["import { Readable, type Transform } from \"node:stream\";\nimport { ReadableStream } from \"node:stream/web\";\nimport { promisify } from \"node:util\";\nimport * as zlib from \"node:zlib\";\nimport { $hook, $inject, Alepha } from \"alepha\";\nimport type { ServerResponse } from \"alepha/server\";\n\nconst gzip = promisify(zlib.gzip);\nconst createGzip = zlib.createGzip;\nconst brotli = promisify(zlib.brotliCompress);\nconst createBrotliCompress = zlib.createBrotliCompress;\nconst zstd = zlib.zstdCompress ? promisify(zlib.zstdCompress) : undefined;\nconst createZstdCompress = zstd ? zlib.createZstdCompress : undefined;\n\ndeclare module \"alepha\" {\n interface State {\n \"alepha.server.compress.options\"?: ServerCompressProviderOptions;\n }\n}\n\nexport class ServerCompressProvider {\n static compressors: Record<\n string,\n | {\n compress: (...args: any[]) => Promise<Buffer>;\n stream: (options?: any) => Transform;\n }\n | undefined\n > = {\n gzip: {\n compress: gzip,\n stream: createGzip,\n },\n br: {\n compress: brotli,\n stream: createBrotliCompress,\n },\n zstd:\n zstd && createZstdCompress\n ? {\n compress: zstd,\n stream: createZstdCompress,\n }\n : undefined,\n };\n\n protected readonly alepha = $inject(Alepha);\n\n protected get options(): ServerCompressProviderOptions {\n return {\n allowedContentTypes: [\n \"application/json\",\n \"text/html\",\n \"application/javascript\",\n \"text/plain\",\n \"text/css\",\n ],\n ...this.alepha.store.get(\"alepha.server.compress.options\"),\n };\n }\n\n public readonly onResponse = $hook({\n on: \"server:onResponse\",\n handler: async ({ request, response }) => {\n // skip if already compressed\n if (response.headers[\"content-encoding\"]) {\n return;\n }\n\n const acceptEncoding = request.headers[\"accept-encoding\"]; // skip if no accept-encoding header\n if (!acceptEncoding) {\n return;\n }\n\n // skip if not json or html (for now)\n if (!this.isAllowedContentType(response.headers[\"content-type\"])) {\n return;\n }\n\n for (const encoding of [\"zstd\", \"br\", \"gzip\"] as const) {\n if (\n acceptEncoding.includes(encoding) &&\n ServerCompressProvider.compressors[encoding]\n ) {\n await this.compress(encoding, response);\n return;\n }\n }\n },\n });\n\n protected isAllowedContentType(contentType: string | undefined): boolean {\n if (!contentType) {\n return false;\n }\n\n const lowerContentType = contentType.toLowerCase();\n\n return !!this.options.allowedContentTypes.find((it) =>\n lowerContentType.includes(it),\n );\n }\n\n protected async compress(\n encoding: keyof typeof ServerCompressProvider.compressors,\n response: ServerResponse,\n ): Promise<void> {\n const body = response.body; // can be string or Buffer or ArrayBuffer or Readable\n\n const compressor = ServerCompressProvider.compressors[encoding];\n if (!compressor) {\n return;\n }\n\n const params = this.getParams(encoding);\n\n if (\n typeof body === \"string\" ||\n Buffer.isBuffer(body) ||\n body instanceof ArrayBuffer\n ) {\n const compressed = await compressor.compress(body, {\n params,\n });\n this.setHeaders(response, encoding);\n response.headers[\"content-length\"] = compressed.length.toString();\n response.body = compressed;\n }\n\n if (typeof body === \"object\" && body instanceof Readable) {\n this.setHeaders(response, encoding);\n response.body = body.pipe(compressor.stream({ params }));\n }\n\n if (typeof body === \"object\" && body instanceof ReadableStream) {\n this.setHeaders(response, encoding);\n response.body = Readable.fromWeb(body).pipe(\n compressor.stream({ params }),\n );\n }\n }\n\n protected getParams(\n encoding: keyof typeof ServerCompressProvider.compressors,\n ): Record<number, any> {\n if (encoding === \"zstd\") {\n return {\n [zlib.constants.ZSTD_c_compressionLevel]: 3, // default compression level for zstd\n };\n }\n if (encoding === \"br\") {\n return {};\n }\n if (encoding === \"gzip\") {\n return {};\n }\n return {};\n }\n\n protected setHeaders(\n response: ServerResponse,\n encoding: keyof typeof ServerCompressProvider.compressors,\n ): void {\n response.headers.vary = \"content-encoding\";\n response.headers[\"content-encoding\"] = encoding;\n response.headers[\"cache-control\"] = \"no-cache\";\n }\n}\n\nexport interface ServerCompressProviderOptions {\n allowedContentTypes: string[];\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { ServerCompressProvider } from \"./providers/ServerCompressProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/ServerCompressProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha Server that provides server-side compression capabilities.\n *\n * Compresses responses using gzip, brotli, or zstd based on the `Accept-Encoding` header.\n */\nexport const AlephaServerCompress = $module({\n name: \"alepha.server.compress\",\n services: [AlephaServer, ServerCompressProvider],\n});\n"],"mappings":";;;;;;;;AAOA,MAAM,OAAO,UAAU,KAAK,KAAK;AACjC,MAAM,aAAa,KAAK;AACxB,MAAM,SAAS,UAAU,KAAK,eAAe;AAC7C,MAAM,uBAAuB,KAAK;AAClC,MAAM,OAAO,KAAK,eAAe,UAAU,KAAK,aAAa,GAAG;AAChE,MAAM,qBAAqB,OAAO,KAAK,qBAAqB;AAQ5D,IAAa,yBAAb,MAAa,uBAAuB;CAClC,OAAO,cAOH;EACF,MAAM;GACJ,UAAU;GACV,QAAQ;GACT;EACD,IAAI;GACF,UAAU;GACV,QAAQ;GACT;EACD,MACE,QAAQ,qBACJ;GACE,UAAU;GACV,QAAQ;GACT,GACD;EACP;CAED,AAAmB,SAAS,QAAQ,OAAO;CAE3C,IAAc,UAAyC;AACrD,SAAO;GACL,qBAAqB;IACnB;IACA;IACA;IACA;IACA;IACD;GACD,GAAG,KAAK,OAAO,MAAM,IAAI,iCAAiC;GAC3D;;CAGH,AAAgB,aAAa,MAAM;EACjC,IAAI;EACJ,SAAS,OAAO,EAAE,SAAS,eAAe;AAExC,OAAI,SAAS,QAAQ,oBACnB;GAGF,MAAM,iBAAiB,QAAQ,QAAQ;AACvC,OAAI,CAAC,eACH;AAIF,OAAI,CAAC,KAAK,qBAAqB,SAAS,QAAQ,gBAAgB,CAC9D;AAGF,QAAK,MAAM,YAAY;IAAC;IAAQ;IAAM;IAAO,CAC3C,KACE,eAAe,SAAS,SAAS,IACjC,uBAAuB,YAAY,WACnC;AACA,UAAM,KAAK,SAAS,UAAU,SAAS;AACvC;;;EAIP,CAAC;CAEF,AAAU,qBAAqB,aAA0C;AACvE,MAAI,CAAC,YACH,QAAO;EAGT,MAAM,mBAAmB,YAAY,aAAa;AAElD,SAAO,CAAC,CAAC,KAAK,QAAQ,oBAAoB,MAAM,OAC9C,iBAAiB,SAAS,GAAG,CAC9B;;CAGH,MAAgB,SACd,UACA,UACe;EACf,MAAM,OAAO,SAAS;EAEtB,MAAM,aAAa,uBAAuB,YAAY;AACtD,MAAI,CAAC,WACH;EAGF,MAAM,SAAS,KAAK,UAAU,SAAS;AAEvC,MACE,OAAO,SAAS,YAChB,OAAO,SAAS,KAAK,IACrB,gBAAgB,aAChB;GACA,MAAM,aAAa,MAAM,WAAW,SAAS,MAAM,EACjD,QACD,CAAC;AACF,QAAK,WAAW,UAAU,SAAS;AACnC,YAAS,QAAQ,oBAAoB,WAAW,OAAO,UAAU;AACjE,YAAS,OAAO;;AAGlB,MAAI,OAAO,SAAS,YAAY,gBAAgB,UAAU;AACxD,QAAK,WAAW,UAAU,SAAS;AACnC,YAAS,OAAO,KAAK,KAAK,WAAW,OAAO,EAAE,QAAQ,CAAC,CAAC;;AAG1D,MAAI,OAAO,SAAS,YAAY,gBAAgB,gBAAgB;AAC9D,QAAK,WAAW,UAAU,SAAS;AACnC,YAAS,OAAO,SAAS,QAAQ,KAAK,CAAC,KACrC,WAAW,OAAO,EAAE,QAAQ,CAAC,CAC9B;;;CAIL,AAAU,UACR,UACqB;AACrB,MAAI,aAAa,OACf,QAAO,GACJ,KAAK,UAAU,0BAA0B,GAC3C;AAEH,MAAI,aAAa,KACf,QAAO,EAAE;AAEX,MAAI,aAAa,OACf,QAAO,EAAE;AAEX,SAAO,EAAE;;CAGX,AAAU,WACR,UACA,UACM;AACN,WAAS,QAAQ,OAAO;AACxB,WAAS,QAAQ,sBAAsB;AACvC,WAAS,QAAQ,mBAAmB;;;;;;;;;;;ACtJxC,MAAa,uBAAuB,QAAQ;CAC1C,MAAM;CACN,UAAU,CAAC,cAAc,uBAAuB;CACjD,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/server/compress/providers/ServerCompressProvider.ts","../../../src/server/compress/index.ts"],"sourcesContent":["import { Readable, type Transform } from \"node:stream\";\nimport { ReadableStream } from \"node:stream/web\";\nimport { promisify } from \"node:util\";\nimport * as zlib from \"node:zlib\";\nimport { $hook, $inject, Alepha } from \"alepha\";\nimport type { ServerResponse } from \"alepha/server\";\n\nconst gzip = promisify(zlib.gzip);\nconst createGzip = zlib.createGzip;\nconst brotli = promisify(zlib.brotliCompress);\nconst createBrotliCompress = zlib.createBrotliCompress;\nconst zstd = zlib.zstdCompress ? promisify(zlib.zstdCompress) : undefined;\nconst createZstdCompress = zstd ? zlib.createZstdCompress : undefined;\n\ndeclare module \"alepha\" {\n interface State {\n \"alepha.server.compress.options\"?: ServerCompressProviderOptions;\n }\n}\n\nexport class ServerCompressProvider {\n static compressors: Record<\n string,\n | {\n compress: (...args: any[]) => Promise<Buffer>;\n stream: (options?: any) => Transform;\n }\n | undefined\n > = {\n gzip: {\n compress: gzip,\n stream: createGzip,\n },\n br: {\n compress: brotli,\n stream: createBrotliCompress,\n },\n zstd:\n zstd && createZstdCompress\n ? {\n compress: zstd,\n stream: createZstdCompress,\n }\n : undefined,\n };\n\n protected readonly alepha = $inject(Alepha);\n\n protected get options(): ServerCompressProviderOptions {\n return {\n allowedContentTypes: [\n \"application/json\",\n \"text/html\",\n \"application/javascript\",\n \"text/plain\",\n \"text/css\",\n ],\n ...this.alepha.store.get(\"alepha.server.compress.options\"),\n };\n }\n\n public readonly onResponse = $hook({\n on: \"server:onResponse\",\n handler: async ({ request, response }) => {\n // skip if already compressed\n if (response.headers[\"content-encoding\"]) {\n return;\n }\n\n const acceptEncoding = request.headers[\"accept-encoding\"]; // skip if no accept-encoding header\n if (!acceptEncoding) {\n return;\n }\n\n // skip if not json or html (for now)\n if (!this.isAllowedContentType(response.headers[\"content-type\"])) {\n return;\n }\n\n for (const encoding of [\"zstd\", \"br\", \"gzip\"] as const) {\n if (\n acceptEncoding.includes(encoding) &&\n ServerCompressProvider.compressors[encoding]\n ) {\n await this.compress(encoding, response);\n return;\n }\n }\n },\n });\n\n protected isAllowedContentType(contentType: string | undefined): boolean {\n if (!contentType) {\n return false;\n }\n\n const lowerContentType = contentType.toLowerCase();\n\n return !!this.options.allowedContentTypes.find((it) =>\n lowerContentType.includes(it),\n );\n }\n\n protected async compress(\n encoding: keyof typeof ServerCompressProvider.compressors,\n response: ServerResponse,\n ): Promise<void> {\n const body = response.body; // can be string or Buffer or ArrayBuffer or Readable\n\n const compressor = ServerCompressProvider.compressors[encoding];\n if (!compressor) {\n return;\n }\n\n const params = this.getParams(encoding);\n\n if (\n typeof body === \"string\" ||\n Buffer.isBuffer(body) ||\n body instanceof ArrayBuffer\n ) {\n const compressed = await compressor.compress(body, {\n params,\n });\n this.setHeaders(response, encoding);\n response.headers[\"content-length\"] = compressed.length.toString();\n response.body = compressed;\n return;\n }\n\n if (typeof body === \"object\" && body instanceof Readable) {\n this.setHeaders(response, encoding);\n response.body = body.pipe(compressor.stream({ params }));\n return;\n }\n\n if (typeof body === \"object\" && body instanceof ReadableStream) {\n this.setHeaders(response, encoding);\n // For streaming responses, use flush mode to avoid buffering\n response.body = this.createFlushingCompressStream(\n body,\n compressor.stream,\n encoding,\n params,\n );\n }\n }\n\n /**\n * Create a compressed stream that flushes after each chunk.\n * This is essential for streaming SSR - ensures each chunk is sent immediately.\n */\n protected createFlushingCompressStream(\n input: ReadableStream,\n createCompressor: (options?: any) => Transform,\n encoding: string,\n params: Record<number, any>,\n ): ReadableStream<Uint8Array> {\n const compressor = createCompressor({\n params,\n flush: zlib.constants.Z_SYNC_FLUSH,\n });\n const reader = Readable.fromWeb(input);\n\n return new ReadableStream<Uint8Array>({\n start(controller) {\n compressor.on(\"data\", (chunk: Buffer) => {\n controller.enqueue(new Uint8Array(chunk));\n });\n\n compressor.on(\"end\", () => {\n controller.close();\n });\n\n compressor.on(\"error\", (err) => {\n controller.error(err);\n });\n\n reader.on(\"data\", (chunk: Buffer) => {\n compressor.write(chunk);\n // Force flush after each chunk for streaming\n // Cast to any because flush() exists on zlib streams but not in Transform type\n const zlibStream = compressor as any;\n if (encoding === \"gzip\") {\n zlibStream.flush(zlib.constants.Z_SYNC_FLUSH);\n } else if (encoding === \"br\") {\n zlibStream.flush(zlib.constants.BROTLI_OPERATION_FLUSH);\n } else if (encoding === \"zstd\") {\n zlibStream.flush();\n }\n });\n\n reader.on(\"end\", () => {\n compressor.end();\n });\n\n reader.on(\"error\", (err) => {\n controller.error(err);\n });\n },\n });\n }\n\n protected getParams(\n encoding: keyof typeof ServerCompressProvider.compressors,\n ): Record<number, any> {\n if (encoding === \"zstd\") {\n return {\n [zlib.constants.ZSTD_c_compressionLevel]: 3, // default compression level for zstd\n };\n }\n if (encoding === \"br\") {\n return {};\n }\n if (encoding === \"gzip\") {\n return {};\n }\n return {};\n }\n\n protected setHeaders(\n response: ServerResponse,\n encoding: keyof typeof ServerCompressProvider.compressors,\n ): void {\n response.headers.vary = \"content-encoding\";\n response.headers[\"content-encoding\"] = encoding;\n response.headers[\"cache-control\"] = \"no-cache\";\n }\n}\n\nexport interface ServerCompressProviderOptions {\n allowedContentTypes: string[];\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { ServerCompressProvider } from \"./providers/ServerCompressProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/ServerCompressProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha Server that provides server-side compression capabilities.\n *\n * Compresses responses using gzip, brotli, or zstd based on the `Accept-Encoding` header.\n */\nexport const AlephaServerCompress = $module({\n name: \"alepha.server.compress\",\n services: [AlephaServer, ServerCompressProvider],\n});\n"],"mappings":"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"}
@@ -405,9 +405,9 @@ var ServerReply = class {
405
405
  status;
406
406
  body;
407
407
  /**
408
- * Redirect to a given URL with optional status code (default 302).
408
+ * Redirect to a given URL with optional status code (default 301).
409
409
  */
410
- redirect(url, status = 302) {
410
+ redirect(url, status = 301) {
411
411
  this.status = status;
412
412
  this.headers.location = url;
413
413
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/server/core/errors/HttpError.ts","../../../src/server/core/helpers/isMultipart.ts","../../../src/server/core/schemas/errorSchema.ts","../../../src/server/core/services/HttpClient.ts","../../../src/server/core/constants/routeMethods.ts","../../../src/server/core/errors/BadRequestError.ts","../../../src/server/core/errors/ConflictError.ts","../../../src/server/core/errors/ForbiddenError.ts","../../../src/server/core/errors/NotFoundError.ts","../../../src/server/core/errors/UnauthorizedError.ts","../../../src/server/core/errors/ValidationError.ts","../../../src/server/core/helpers/ServerReply.ts","../../../src/server/core/schemas/okSchema.ts","../../../src/server/core/index.browser.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\nimport type { ErrorSchema } from \"../schemas/errorSchema.ts\";\n\nexport const isHttpError = (\n error: unknown,\n status?: number,\n): error is HttpErrorLike => {\n const isError =\n !!error &&\n typeof error === \"object\" &&\n \"message\" in error &&\n typeof error.message === \"string\" &&\n \"status\" in error &&\n typeof error.status === \"number\";\n\n if (!isError) {\n return false;\n }\n\n if (status) {\n return (error as HttpErrorLike).status === status;\n }\n\n return true;\n};\n\nexport class HttpError extends AlephaError {\n public name = \"HttpError\";\n\n static is = isHttpError;\n\n static toJSON(error: HttpError): ErrorSchema {\n const json: Record<string, unknown> = {\n error: error.error,\n status: error.status,\n message: error.message,\n };\n\n if (error.details) json.details = error.details;\n if (error.requestId) json.requestId = error.requestId;\n if (error.reason) json.cause = error.reason;\n\n return json as ErrorSchema;\n }\n\n public readonly error: string;\n public readonly status: number;\n\n public readonly requestId?: string;\n public readonly details?: string;\n public readonly reason?: {\n name: string;\n message: string;\n };\n\n constructor(options: Partial<ErrorSchema>, cause?: unknown) {\n super(options.message, {\n cause,\n });\n\n this.status = options.status ?? 500;\n this.details = options.details;\n this.requestId = options.requestId;\n\n if (typeof options.cause === \"object\") {\n this.reason = {\n name: (options.cause as { name: string }).name,\n message: (options.cause as { message: string }).message,\n };\n } else if (cause instanceof Error) {\n this.reason = {\n name: cause.name,\n message: cause.message,\n };\n }\n\n if (this.constructor.name === \"HttpError\") {\n this.error =\n options.error ?? errorNameByStatus[this.status] ?? \"HttpError\";\n } else {\n this.error = this.constructor.name;\n }\n }\n}\n\nexport const errorNameByStatus: Record<number, string> = {\n 400: \"BadRequestError\",\n 401: \"UnauthorizedError\",\n 403: \"ForbiddenError\",\n 404: \"NotFoundError\",\n 405: \"MethodNotAllowedError\",\n 409: \"ConflictError\",\n 410: \"GoneError\",\n 413: \"PayloadTooLargeError\",\n 415: \"UnsupportedMediaTypeError\",\n 429: \"TooManyRequestsError\",\n 500: \"InternalServerError\",\n 501: \"NotImplementedError\",\n 502: \"BadGatewayError\",\n 503: \"ServiceUnavailableError\",\n 504: \"GatewayTimeoutError\",\n};\n\nexport interface HttpErrorLike extends Error {\n status: number;\n}\n","import type { RequestConfigSchema } from \"../interfaces/ServerRequest.ts\";\n\n/**\n * Checks if the route has multipart/form-data request body.\n */\nexport const isMultipart = (options: {\n schema?: RequestConfigSchema;\n requestBodyType?: string;\n}): boolean => {\n if (options.requestBodyType === \"multipart/form-data\") {\n return true;\n }\n\n if (options.schema?.body && \"properties\" in options.schema.body) {\n const properties: Record<string, any> = options.schema.body.properties;\n for (const key in properties) {\n if (properties[key].format === \"binary\") {\n return true;\n }\n }\n }\n\n return false;\n};\n","import { type Static, t } from \"alepha\";\n\nexport const errorSchema = t.object(\n {\n error: t.text({ description: \"HTTP error name\" }),\n status: t.integer({\n description: \"HTTP status code\",\n }),\n message: t.text({\n description: \"Short text which describe the error\",\n size: \"rich\",\n }),\n details: t.optional(\n t.text({\n description: \"Detailed description of the error\",\n size: \"rich\",\n }),\n ),\n requestId: t.optional(t.text()),\n cause: t.optional(\n t.object({\n name: t.text(),\n message: t.text({\n description: \"Cause Error message\",\n size: \"rich\",\n }),\n }),\n ),\n },\n {\n title: \"HttpError\",\n description: \"Generic response after a failed operation\",\n },\n);\n\nexport type ErrorSchema = Static<typeof errorSchema>;\n","import {\n $inject,\n Alepha,\n type FileLike,\n isFileLike,\n type Static,\n type TObject,\n type TSchema,\n} from \"alepha\";\nimport { $cache } from \"alepha/cache\";\nimport type { DurationLike } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { HttpError } from \"../errors/HttpError.ts\";\nimport { isMultipart } from \"../helpers/isMultipart.ts\";\nimport type {\n ServerRequestConfigEntry,\n TRequestBody,\n TResponseBody,\n} from \"../interfaces/ServerRequest.ts\";\nimport type { ClientRequestOptions } from \"../primitives/$action.ts\";\nimport { errorSchema } from \"../schemas/errorSchema.ts\";\n\nexport class HttpClient {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n\n public readonly cache = $cache<HttpClientCache>();\n\n protected readonly pendingRequests: HttpClientPendingRequests = {};\n\n public async fetchAction(args: FetchActionArgs): Promise<FetchResponse> {\n const route = args.action; // our link to fetch\n const options = args.options ?? {}; // fetch standard options, cache, etc.\n const config = args.config ?? {}; // params, query, body, etc.\n const host = args.host ?? \"\"; // remote host, e.g. \"https://api.example.com\" or empty (for browser)\n\n const request: RequestInit = {\n ...options.request,\n };\n\n const method = route.method;\n const headers: Record<string, string> = {};\n const url = this.url(host, route, config);\n\n await this.alepha.events.emit(\"client:onRequest\", {\n route,\n config,\n options,\n headers,\n request,\n });\n\n request.method ??= method;\n\n await this.body(request, headers, route, config);\n\n request.headers = {\n ...config.headers,\n ...Object.fromEntries(new Headers(request.headers).entries()),\n ...headers,\n };\n\n return await this.fetch(url, {\n ...request,\n schema: route.schema,\n ...options,\n });\n }\n\n public async fetch<T extends TSchema>(\n url: string,\n request: RequestInitWithOptions<T> = {}, // standard options\n ): Promise<FetchResponse<Static<T>>> {\n const options = {\n cache: request.localCache,\n schema: request.schema?.response,\n key: request.key,\n };\n\n request.method ??= \"GET\";\n\n this.log.trace(\"Request\", {\n url,\n method: request.method,\n body: request.body,\n headers: request.headers,\n options,\n });\n\n // Only add automatic ETag if user didn't explicitly provide headers\n const cached = await this.cache.get(url);\n if (cached && request.method === \"GET\") {\n if (cached.etag) {\n request.headers = new Headers(request.headers);\n if (!request.headers.has(\"if-none-match\")) {\n request.headers.set(\"if-none-match\", cached.etag);\n }\n } else {\n return {\n data: cached.data as Static<T>,\n status: 200,\n statusText: \"OK\",\n headers: new Headers(),\n };\n }\n }\n\n await this.alepha.events.emit(\"client:beforeFetch\", {\n url,\n options,\n request,\n });\n\n // make a key for the request\n // this will be used to check if the request is already pending\n const key =\n options.key ??\n JSON.stringify({\n url,\n method: request.method,\n body: request.body,\n });\n\n const existing = this.pendingRequests[key];\n if (existing) {\n this.log.info(\"Request already pending\", key);\n return existing;\n }\n\n this.pendingRequests[key] = fetch(url, request)\n .then(async (response) => {\n this.log.debug(\"Response\", {\n url,\n status: response.status,\n });\n\n const fetchResponse: FetchResponse = {\n data: await this.responseData(response, options),\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n raw: response,\n };\n\n if (request.method === \"GET\") {\n if (options.cache) {\n await this.cache.set(\n url,\n { data: fetchResponse.data },\n typeof options.cache === \"boolean\" ? undefined : options.cache,\n );\n } else if (!this.alepha.isBrowser()) {\n // only cache etag on server, browser can handle etag itself\n const etag = response.headers.get(\"etag\") ?? undefined;\n if (etag) {\n await this.cache.set(url, { data: fetchResponse.data, etag });\n }\n }\n }\n\n return fetchResponse;\n })\n .finally(() => {\n delete this.pendingRequests[key];\n });\n\n return this.pendingRequests[key];\n }\n\n protected url(\n host: string,\n action: HttpAction,\n args: ServerRequestConfigEntry,\n ) {\n let url = host;\n\n if (action.prefix) {\n url += action.prefix;\n }\n\n url += action.path;\n url = this.pathVariables(url, action, args);\n url = this.queryParams(url, action, args);\n\n return url;\n }\n\n protected async body(\n init: RequestInit,\n headers: Record<string, string>,\n action: HttpAction,\n args: ServerRequestConfigEntry = {},\n ) {\n const hasHeader =\n typeof init.headers === \"object\" &&\n \"content-type\" in init.headers &&\n init.headers[\"content-type\"] === \"multipart/form-data\";\n\n if (hasHeader || isMultipart(action)) {\n if (typeof init.headers === \"object\" && \"content-type\" in init.headers) {\n delete init.headers[\"content-type\"]; // fetch() will fill this for us\n }\n\n const formData = new FormData();\n\n for (const [key, value] of Object.entries(args.body ?? {})) {\n if (typeof value === \"string\") {\n formData.append(key, value);\n continue;\n }\n if (value instanceof Blob) {\n formData.append(key, value);\n continue;\n }\n if (isFileLike(value)) {\n // FileLike must be transformed to WebFile\n formData.append(\n key,\n new File([await value.arrayBuffer()], value.name, {\n type: value.type,\n }),\n );\n }\n }\n\n init.body = formData;\n\n return;\n }\n\n if (!init.body && action.schema?.body) {\n headers[\"content-type\"] = \"application/json\";\n init.body = this.alepha.codec.encode(action.schema?.body, args.body, {\n as: \"string\",\n });\n }\n }\n\n protected async responseData(\n response: Response,\n options: FetchOptions,\n ): Promise<any> {\n if (response.status === 304) {\n let cacheKey = response.url;\n if (typeof window !== \"undefined\") {\n cacheKey = cacheKey.replace(window.location.origin, \"\");\n }\n\n const cached = await this.cache.get(cacheKey);\n if (cached) {\n return cached.data;\n }\n\n // if no cached data (etag-only routes), return empty string\n return \"\";\n }\n\n if (response.status === 204) {\n return;\n }\n\n if (this.isMaybeFile(response)) {\n return this.createFileLike(response);\n }\n\n if (response.headers.get(\"Content-Type\")?.startsWith(\"text/\")) {\n return await response.text();\n }\n\n if (response.headers.get(\"Content-Type\") === \"application/json\") {\n const json = await response.json();\n\n if (response.status >= 400) {\n const jsonError = this.alepha.codec.decode(errorSchema, json);\n const error = new HttpError(jsonError);\n\n await this.alepha.events.emit(\"client:onError\", {\n error,\n });\n\n throw error;\n }\n\n if (options.schema) {\n return this.alepha.codec.decode(options.schema, json);\n }\n\n return json;\n }\n\n if (response.status >= 400) {\n const error = new HttpError({\n status: response.status,\n message: `An error occurred while fetching the resource. (${response.statusText})`,\n });\n\n await this.alepha.events.emit(\"client:onError\", {\n error,\n });\n\n throw error;\n }\n\n return response;\n }\n\n protected isMaybeFile(response: Response): boolean {\n const contentType = response.headers.get(\"Content-Type\");\n if (!contentType) {\n return false;\n }\n\n if (response.headers.get(\"Content-Disposition\")?.includes(\"attachment\")) {\n return true; // If Content-Disposition indicates an attachment, treat it as a file\n }\n\n return (\n contentType.startsWith(\"application/octet-stream\") ||\n contentType.startsWith(\"application/pdf\") ||\n contentType.startsWith(\"application/zip\") ||\n contentType.startsWith(\"image/\") ||\n contentType.startsWith(\"video/\") ||\n contentType.startsWith(\"audio/\")\n );\n }\n\n protected createFileLike(response: Response, defaultFileName = \"\"): FileLike {\n const match = (response.headers.get(\"Content-Disposition\") ?? \"\").match(\n /filename=\"(.+)\"/,\n );\n return {\n name: match?.[1] ? match[1] : defaultFileName,\n type: response.headers.get(\"Content-Type\") ?? \"application/octet-stream\",\n size: Number(response.headers.get(\"Content-Length\") ?? 0),\n lastModified: Date.now(),\n stream: () => {\n throw new Error(\"Not implemented\");\n },\n arrayBuffer: async () => {\n return await response.arrayBuffer();\n },\n text: async () => {\n return await response.text();\n },\n };\n }\n\n public pathVariables(\n url: string,\n action: { schema?: { params?: TObject } },\n args: ServerRequestConfigEntry = {},\n ): string {\n if (typeof args.params === \"object\") {\n const params = action.schema?.params\n ? (this.alepha.codec.decode(\n action.schema.params,\n args.params,\n ) as Record<string, any>)\n : args.params;\n\n for (const key of Object.keys(params)) {\n url = url.replace(`:${key}`, params[key]);\n url = url.replace(`{${key}}`, params[key]);\n }\n }\n\n return url;\n }\n\n public queryParams(\n url: string,\n action: { schema?: { query?: TObject } },\n args: ServerRequestConfigEntry = {},\n ): string {\n if (typeof args.query === \"object\") {\n const query = action.schema?.query\n ? this.alepha.codec.decode(action.schema.query, args.query ?? {})\n : args.query;\n\n for (const key of Object.keys(query)) {\n if (query[key] === undefined) {\n delete query[key];\n }\n if (typeof query[key] === \"object\") {\n query[key] = JSON.stringify(query[key]);\n }\n }\n\n return `${url}?${new URLSearchParams(\n query as Record<string, string>,\n ).toString()}`;\n }\n return url;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface FetchOptions<T extends TSchema = TSchema> {\n /**\n * Key to identify the request in the pending requests.\n */\n key?: string;\n\n /**\n * The schema to validate the response against.\n */\n schema?: {\n response?: T;\n };\n\n /**\n * Built-in cache options.\n */\n localCache?: boolean | number | DurationLike;\n}\n\nexport type RequestInitWithOptions<T extends TSchema = TSchema> = RequestInit &\n FetchOptions<T>;\n\nexport interface FetchResponse<T = any> {\n data: T;\n status: number;\n statusText: string;\n headers: Headers;\n raw?: Response;\n}\n\nexport type HttpClientPendingRequests = Record<\n string,\n Promise<any> | undefined\n>;\n\ninterface HttpClientCache {\n data: any;\n etag?: string;\n}\n\nexport interface FetchActionArgs {\n action: HttpAction;\n host?: string;\n config?: ServerRequestConfigEntry;\n options?: ClientRequestOptions;\n}\n\nexport interface HttpAction {\n method?: string;\n prefix?: string;\n path: string;\n requestBodyType?: string;\n schema?: {\n params?: TObject;\n query?: TObject;\n body?: TRequestBody;\n response?: TResponseBody;\n };\n}\n","export const routeMethods = [\n // list of supported http methods\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n \"CONNECT\",\n \"TRACE\",\n] as const;\n\nexport type RouteMethod = (typeof routeMethods)[number];\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class BadRequestError extends HttpError {\n constructor(message = \"Invalid request body\", cause?: unknown) {\n super(\n {\n message,\n status: 400,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class ConflictError extends HttpError {\n constructor(message = \"Entity already exists\", cause?: unknown) {\n super(\n {\n message,\n status: 409,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class ForbiddenError extends HttpError {\n constructor(\n message = \"No permission to access this resource\",\n cause?: unknown,\n ) {\n super(\n {\n message,\n status: 403,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class NotFoundError extends HttpError {\n constructor(message = \"Resource not found\", cause?: unknown) {\n super(\n {\n message,\n status: 404,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class UnauthorizedError extends HttpError {\n readonly name = \"UnauthorizedError\";\n\n constructor(\n message = \"Not allowed to access this resource\",\n cause?: unknown,\n ) {\n super(\n {\n message,\n status: 401,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class ValidationError extends HttpError {\n constructor(message = \"Validation has failed\", cause?: unknown) {\n super(\n {\n message,\n status: 400,\n },\n cause,\n );\n }\n}\n","/**\n * Helper for building server replies.\n */\nexport class ServerReply {\n // TODO: make it private\n public headers: Record<string, string> & {\n \"set-cookie\"?: string[];\n } = {};\n\n public status?: number; // default 200, or 204 (no content)\n\n public body?: any;\n\n /**\n * Redirect to a given URL with optional status code (default 302).\n */\n public redirect(url: string, status: number = 302): void {\n this.status = status;\n this.headers.location = url;\n }\n\n // TODO: check if status / header is already set and throw an error if so (for allow to override with force flag)\n\n /**\n * Set the response status code.\n */\n public setStatus(status: number): this {\n this.status = status;\n return this;\n }\n\n /**\n * Set a response header.\n */\n public setHeader(name: string, value: string): this {\n this.headers[name.toLowerCase()] = value;\n return this;\n }\n\n /**\n * Set the response body.\n */\n public setBody(body: any): this {\n this.body = body;\n return this;\n }\n}\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const okSchema = t.object(\n {\n ok: t.boolean({ description: \"True when operation succeed\" }),\n id: t.optional(t.union([t.text(), t.integer()])),\n count: t.optional(\n t.number({ description: \"Number of resources affected\" }),\n ),\n },\n {\n title: \"Ok\",\n description: \"Generic response after a successful operation on a resource\",\n },\n);\n\nexport type Ok = Static<typeof okSchema>;\n","import { $module } from \"alepha\";\nimport { HttpClient } from \"./services/HttpClient.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaServer = $module({\n name: \"alepha.server\",\n primitives: [],\n services: [HttpClient],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/server/core/errors/HttpError.ts","../../../src/server/core/helpers/isMultipart.ts","../../../src/server/core/schemas/errorSchema.ts","../../../src/server/core/services/HttpClient.ts","../../../src/server/core/constants/routeMethods.ts","../../../src/server/core/errors/BadRequestError.ts","../../../src/server/core/errors/ConflictError.ts","../../../src/server/core/errors/ForbiddenError.ts","../../../src/server/core/errors/NotFoundError.ts","../../../src/server/core/errors/UnauthorizedError.ts","../../../src/server/core/errors/ValidationError.ts","../../../src/server/core/helpers/ServerReply.ts","../../../src/server/core/schemas/okSchema.ts","../../../src/server/core/index.browser.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\nimport type { ErrorSchema } from \"../schemas/errorSchema.ts\";\n\nexport const isHttpError = (\n error: unknown,\n status?: number,\n): error is HttpErrorLike => {\n const isError =\n !!error &&\n typeof error === \"object\" &&\n \"message\" in error &&\n typeof error.message === \"string\" &&\n \"status\" in error &&\n typeof error.status === \"number\";\n\n if (!isError) {\n return false;\n }\n\n if (status) {\n return (error as HttpErrorLike).status === status;\n }\n\n return true;\n};\n\nexport class HttpError extends AlephaError {\n public name = \"HttpError\";\n\n static is = isHttpError;\n\n static toJSON(error: HttpError): ErrorSchema {\n const json: Record<string, unknown> = {\n error: error.error,\n status: error.status,\n message: error.message,\n };\n\n if (error.details) json.details = error.details;\n if (error.requestId) json.requestId = error.requestId;\n if (error.reason) json.cause = error.reason;\n\n return json as ErrorSchema;\n }\n\n public readonly error: string;\n public readonly status: number;\n\n public readonly requestId?: string;\n public readonly details?: string;\n public readonly reason?: {\n name: string;\n message: string;\n };\n\n constructor(options: Partial<ErrorSchema>, cause?: unknown) {\n super(options.message, {\n cause,\n });\n\n this.status = options.status ?? 500;\n this.details = options.details;\n this.requestId = options.requestId;\n\n if (typeof options.cause === \"object\") {\n this.reason = {\n name: (options.cause as { name: string }).name,\n message: (options.cause as { message: string }).message,\n };\n } else if (cause instanceof Error) {\n this.reason = {\n name: cause.name,\n message: cause.message,\n };\n }\n\n if (this.constructor.name === \"HttpError\") {\n this.error =\n options.error ?? errorNameByStatus[this.status] ?? \"HttpError\";\n } else {\n this.error = this.constructor.name;\n }\n }\n}\n\nexport const errorNameByStatus: Record<number, string> = {\n 400: \"BadRequestError\",\n 401: \"UnauthorizedError\",\n 403: \"ForbiddenError\",\n 404: \"NotFoundError\",\n 405: \"MethodNotAllowedError\",\n 409: \"ConflictError\",\n 410: \"GoneError\",\n 413: \"PayloadTooLargeError\",\n 415: \"UnsupportedMediaTypeError\",\n 429: \"TooManyRequestsError\",\n 500: \"InternalServerError\",\n 501: \"NotImplementedError\",\n 502: \"BadGatewayError\",\n 503: \"ServiceUnavailableError\",\n 504: \"GatewayTimeoutError\",\n};\n\nexport interface HttpErrorLike extends Error {\n status: number;\n}\n","import type { RequestConfigSchema } from \"../interfaces/ServerRequest.ts\";\n\n/**\n * Checks if the route has multipart/form-data request body.\n */\nexport const isMultipart = (options: {\n schema?: RequestConfigSchema;\n requestBodyType?: string;\n}): boolean => {\n if (options.requestBodyType === \"multipart/form-data\") {\n return true;\n }\n\n if (options.schema?.body && \"properties\" in options.schema.body) {\n const properties: Record<string, any> = options.schema.body.properties;\n for (const key in properties) {\n if (properties[key].format === \"binary\") {\n return true;\n }\n }\n }\n\n return false;\n};\n","import { type Static, t } from \"alepha\";\n\nexport const errorSchema = t.object(\n {\n error: t.text({ description: \"HTTP error name\" }),\n status: t.integer({\n description: \"HTTP status code\",\n }),\n message: t.text({\n description: \"Short text which describe the error\",\n size: \"rich\",\n }),\n details: t.optional(\n t.text({\n description: \"Detailed description of the error\",\n size: \"rich\",\n }),\n ),\n requestId: t.optional(t.text()),\n cause: t.optional(\n t.object({\n name: t.text(),\n message: t.text({\n description: \"Cause Error message\",\n size: \"rich\",\n }),\n }),\n ),\n },\n {\n title: \"HttpError\",\n description: \"Generic response after a failed operation\",\n },\n);\n\nexport type ErrorSchema = Static<typeof errorSchema>;\n","import {\n $inject,\n Alepha,\n type FileLike,\n isFileLike,\n type Static,\n type TObject,\n type TSchema,\n} from \"alepha\";\nimport { $cache } from \"alepha/cache\";\nimport type { DurationLike } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { HttpError } from \"../errors/HttpError.ts\";\nimport { isMultipart } from \"../helpers/isMultipart.ts\";\nimport type {\n ServerRequestConfigEntry,\n TRequestBody,\n TResponseBody,\n} from \"../interfaces/ServerRequest.ts\";\nimport type { ClientRequestOptions } from \"../primitives/$action.ts\";\nimport { errorSchema } from \"../schemas/errorSchema.ts\";\n\nexport class HttpClient {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n\n public readonly cache = $cache<HttpClientCache>();\n\n protected readonly pendingRequests: HttpClientPendingRequests = {};\n\n public async fetchAction(args: FetchActionArgs): Promise<FetchResponse> {\n const route = args.action; // our link to fetch\n const options = args.options ?? {}; // fetch standard options, cache, etc.\n const config = args.config ?? {}; // params, query, body, etc.\n const host = args.host ?? \"\"; // remote host, e.g. \"https://api.example.com\" or empty (for browser)\n\n const request: RequestInit = {\n ...options.request,\n };\n\n const method = route.method;\n const headers: Record<string, string> = {};\n const url = this.url(host, route, config);\n\n await this.alepha.events.emit(\"client:onRequest\", {\n route,\n config,\n options,\n headers,\n request,\n });\n\n request.method ??= method;\n\n await this.body(request, headers, route, config);\n\n request.headers = {\n ...config.headers,\n ...Object.fromEntries(new Headers(request.headers).entries()),\n ...headers,\n };\n\n return await this.fetch(url, {\n ...request,\n schema: route.schema,\n ...options,\n });\n }\n\n public async fetch<T extends TSchema>(\n url: string,\n request: RequestInitWithOptions<T> = {}, // standard options\n ): Promise<FetchResponse<Static<T>>> {\n const options = {\n cache: request.localCache,\n schema: request.schema?.response,\n key: request.key,\n };\n\n request.method ??= \"GET\";\n\n this.log.trace(\"Request\", {\n url,\n method: request.method,\n body: request.body,\n headers: request.headers,\n options,\n });\n\n // Only add automatic ETag if user didn't explicitly provide headers\n const cached = await this.cache.get(url);\n if (cached && request.method === \"GET\") {\n if (cached.etag) {\n request.headers = new Headers(request.headers);\n if (!request.headers.has(\"if-none-match\")) {\n request.headers.set(\"if-none-match\", cached.etag);\n }\n } else {\n return {\n data: cached.data as Static<T>,\n status: 200,\n statusText: \"OK\",\n headers: new Headers(),\n };\n }\n }\n\n await this.alepha.events.emit(\"client:beforeFetch\", {\n url,\n options,\n request,\n });\n\n // make a key for the request\n // this will be used to check if the request is already pending\n const key =\n options.key ??\n JSON.stringify({\n url,\n method: request.method,\n body: request.body,\n });\n\n const existing = this.pendingRequests[key];\n if (existing) {\n this.log.info(\"Request already pending\", key);\n return existing;\n }\n\n this.pendingRequests[key] = fetch(url, request)\n .then(async (response) => {\n this.log.debug(\"Response\", {\n url,\n status: response.status,\n });\n\n const fetchResponse: FetchResponse = {\n data: await this.responseData(response, options),\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n raw: response,\n };\n\n if (request.method === \"GET\") {\n if (options.cache) {\n await this.cache.set(\n url,\n { data: fetchResponse.data },\n typeof options.cache === \"boolean\" ? undefined : options.cache,\n );\n } else if (!this.alepha.isBrowser()) {\n // only cache etag on server, browser can handle etag itself\n const etag = response.headers.get(\"etag\") ?? undefined;\n if (etag) {\n await this.cache.set(url, { data: fetchResponse.data, etag });\n }\n }\n }\n\n return fetchResponse;\n })\n .finally(() => {\n delete this.pendingRequests[key];\n });\n\n return this.pendingRequests[key];\n }\n\n protected url(\n host: string,\n action: HttpAction,\n args: ServerRequestConfigEntry,\n ) {\n let url = host;\n\n if (action.prefix) {\n url += action.prefix;\n }\n\n url += action.path;\n url = this.pathVariables(url, action, args);\n url = this.queryParams(url, action, args);\n\n return url;\n }\n\n protected async body(\n init: RequestInit,\n headers: Record<string, string>,\n action: HttpAction,\n args: ServerRequestConfigEntry = {},\n ) {\n const hasHeader =\n typeof init.headers === \"object\" &&\n \"content-type\" in init.headers &&\n init.headers[\"content-type\"] === \"multipart/form-data\";\n\n if (hasHeader || isMultipart(action)) {\n if (typeof init.headers === \"object\" && \"content-type\" in init.headers) {\n delete init.headers[\"content-type\"]; // fetch() will fill this for us\n }\n\n const formData = new FormData();\n\n for (const [key, value] of Object.entries(args.body ?? {})) {\n if (typeof value === \"string\") {\n formData.append(key, value);\n continue;\n }\n if (value instanceof Blob) {\n formData.append(key, value);\n continue;\n }\n if (isFileLike(value)) {\n // FileLike must be transformed to WebFile\n formData.append(\n key,\n new File([await value.arrayBuffer()], value.name, {\n type: value.type,\n }),\n );\n }\n }\n\n init.body = formData;\n\n return;\n }\n\n if (!init.body && action.schema?.body) {\n headers[\"content-type\"] = \"application/json\";\n init.body = this.alepha.codec.encode(action.schema?.body, args.body, {\n as: \"string\",\n });\n }\n }\n\n protected async responseData(\n response: Response,\n options: FetchOptions,\n ): Promise<any> {\n if (response.status === 304) {\n let cacheKey = response.url;\n if (typeof window !== \"undefined\") {\n cacheKey = cacheKey.replace(window.location.origin, \"\");\n }\n\n const cached = await this.cache.get(cacheKey);\n if (cached) {\n return cached.data;\n }\n\n // if no cached data (etag-only routes), return empty string\n return \"\";\n }\n\n if (response.status === 204) {\n return;\n }\n\n if (this.isMaybeFile(response)) {\n return this.createFileLike(response);\n }\n\n if (response.headers.get(\"Content-Type\")?.startsWith(\"text/\")) {\n return await response.text();\n }\n\n if (response.headers.get(\"Content-Type\") === \"application/json\") {\n const json = await response.json();\n\n if (response.status >= 400) {\n const jsonError = this.alepha.codec.decode(errorSchema, json);\n const error = new HttpError(jsonError);\n\n await this.alepha.events.emit(\"client:onError\", {\n error,\n });\n\n throw error;\n }\n\n if (options.schema) {\n return this.alepha.codec.decode(options.schema, json);\n }\n\n return json;\n }\n\n if (response.status >= 400) {\n const error = new HttpError({\n status: response.status,\n message: `An error occurred while fetching the resource. (${response.statusText})`,\n });\n\n await this.alepha.events.emit(\"client:onError\", {\n error,\n });\n\n throw error;\n }\n\n return response;\n }\n\n protected isMaybeFile(response: Response): boolean {\n const contentType = response.headers.get(\"Content-Type\");\n if (!contentType) {\n return false;\n }\n\n if (response.headers.get(\"Content-Disposition\")?.includes(\"attachment\")) {\n return true; // If Content-Disposition indicates an attachment, treat it as a file\n }\n\n return (\n contentType.startsWith(\"application/octet-stream\") ||\n contentType.startsWith(\"application/pdf\") ||\n contentType.startsWith(\"application/zip\") ||\n contentType.startsWith(\"image/\") ||\n contentType.startsWith(\"video/\") ||\n contentType.startsWith(\"audio/\")\n );\n }\n\n protected createFileLike(response: Response, defaultFileName = \"\"): FileLike {\n const match = (response.headers.get(\"Content-Disposition\") ?? \"\").match(\n /filename=\"(.+)\"/,\n );\n return {\n name: match?.[1] ? match[1] : defaultFileName,\n type: response.headers.get(\"Content-Type\") ?? \"application/octet-stream\",\n size: Number(response.headers.get(\"Content-Length\") ?? 0),\n lastModified: Date.now(),\n stream: () => {\n throw new Error(\"Not implemented\");\n },\n arrayBuffer: async () => {\n return await response.arrayBuffer();\n },\n text: async () => {\n return await response.text();\n },\n };\n }\n\n public pathVariables(\n url: string,\n action: { schema?: { params?: TObject } },\n args: ServerRequestConfigEntry = {},\n ): string {\n if (typeof args.params === \"object\") {\n const params = action.schema?.params\n ? (this.alepha.codec.decode(\n action.schema.params,\n args.params,\n ) as Record<string, any>)\n : args.params;\n\n for (const key of Object.keys(params)) {\n url = url.replace(`:${key}`, params[key]);\n url = url.replace(`{${key}}`, params[key]);\n }\n }\n\n return url;\n }\n\n public queryParams(\n url: string,\n action: { schema?: { query?: TObject } },\n args: ServerRequestConfigEntry = {},\n ): string {\n if (typeof args.query === \"object\") {\n const query = action.schema?.query\n ? this.alepha.codec.decode(action.schema.query, args.query ?? {})\n : args.query;\n\n for (const key of Object.keys(query)) {\n if (query[key] === undefined) {\n delete query[key];\n }\n if (typeof query[key] === \"object\") {\n query[key] = JSON.stringify(query[key]);\n }\n }\n\n return `${url}?${new URLSearchParams(\n query as Record<string, string>,\n ).toString()}`;\n }\n return url;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface FetchOptions<T extends TSchema = TSchema> {\n /**\n * Key to identify the request in the pending requests.\n */\n key?: string;\n\n /**\n * The schema to validate the response against.\n */\n schema?: {\n response?: T;\n };\n\n /**\n * Built-in cache options.\n */\n localCache?: boolean | number | DurationLike;\n}\n\nexport type RequestInitWithOptions<T extends TSchema = TSchema> = RequestInit &\n FetchOptions<T>;\n\nexport interface FetchResponse<T = any> {\n data: T;\n status: number;\n statusText: string;\n headers: Headers;\n raw?: Response;\n}\n\nexport type HttpClientPendingRequests = Record<\n string,\n Promise<any> | undefined\n>;\n\ninterface HttpClientCache {\n data: any;\n etag?: string;\n}\n\nexport interface FetchActionArgs {\n action: HttpAction;\n host?: string;\n config?: ServerRequestConfigEntry;\n options?: ClientRequestOptions;\n}\n\nexport interface HttpAction {\n method?: string;\n prefix?: string;\n path: string;\n requestBodyType?: string;\n schema?: {\n params?: TObject;\n query?: TObject;\n body?: TRequestBody;\n response?: TResponseBody;\n };\n}\n","export const routeMethods = [\n // list of supported http methods\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n \"CONNECT\",\n \"TRACE\",\n] as const;\n\nexport type RouteMethod = (typeof routeMethods)[number];\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class BadRequestError extends HttpError {\n constructor(message = \"Invalid request body\", cause?: unknown) {\n super(\n {\n message,\n status: 400,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class ConflictError extends HttpError {\n constructor(message = \"Entity already exists\", cause?: unknown) {\n super(\n {\n message,\n status: 409,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class ForbiddenError extends HttpError {\n constructor(\n message = \"No permission to access this resource\",\n cause?: unknown,\n ) {\n super(\n {\n message,\n status: 403,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class NotFoundError extends HttpError {\n constructor(message = \"Resource not found\", cause?: unknown) {\n super(\n {\n message,\n status: 404,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class UnauthorizedError extends HttpError {\n readonly name = \"UnauthorizedError\";\n\n constructor(\n message = \"Not allowed to access this resource\",\n cause?: unknown,\n ) {\n super(\n {\n message,\n status: 401,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class ValidationError extends HttpError {\n constructor(message = \"Validation has failed\", cause?: unknown) {\n super(\n {\n message,\n status: 400,\n },\n cause,\n );\n }\n}\n","/**\n * Helper for building server replies.\n */\nexport class ServerReply {\n // TODO: make it private\n public headers: Record<string, string> & {\n \"set-cookie\"?: string[];\n } = {};\n\n public status?: number; // default 200, or 204 (no content)\n\n public body?: any;\n\n /**\n * Redirect to a given URL with optional status code (default 301).\n */\n public redirect(url: string, status: number = 301): void {\n this.status = status;\n this.headers.location = url;\n }\n\n // TODO: check if status / header is already set and throw an error if so (for allow to override with force flag)\n\n /**\n * Set the response status code.\n */\n public setStatus(status: number): this {\n this.status = status;\n return this;\n }\n\n /**\n * Set a response header.\n */\n public setHeader(name: string, value: string): this {\n this.headers[name.toLowerCase()] = value;\n return this;\n }\n\n /**\n * Set the response body.\n */\n public setBody(body: any): this {\n this.body = body;\n return this;\n }\n}\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const okSchema = t.object(\n {\n ok: t.boolean({ description: \"True when operation succeed\" }),\n id: t.optional(t.union([t.text(), t.integer()])),\n count: t.optional(\n t.number({ description: \"Number of resources affected\" }),\n ),\n },\n {\n title: \"Ok\",\n description: \"Generic response after a successful operation on a resource\",\n },\n);\n\nexport type Ok = Static<typeof okSchema>;\n","import { $module } from \"alepha\";\nimport { HttpClient } from \"./services/HttpClient.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaServer = $module({\n name: \"alepha.server\",\n primitives: [],\n services: [HttpClient],\n});\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as alepha19 from "alepha";
2
2
  import { Alepha, AlephaError, Async, FileLike, KIND, Primitive, Static, StreamLike, TArray, TFile, TObject, TRecord, TSchema, TStream, TString, TVoid } from "alepha";
3
- import * as alepha_logger6 from "alepha/logger";
3
+ import * as alepha_logger3 from "alepha/logger";
4
4
  import { Readable } from "node:stream";
5
5
  import { DateTimeProvider, DurationLike } from "alepha/datetime";
6
6
  import { ReadableStream } from "node:stream/web";
@@ -58,7 +58,7 @@ declare class ServerReply {
58
58
  status?: number;
59
59
  body?: any;
60
60
  /**
61
- * Redirect to a given URL with optional status code (default 302).
61
+ * Redirect to a given URL with optional status code (default 301).
62
62
  */
63
63
  redirect(url: string, status?: number): void;
64
64
  /**
@@ -226,7 +226,7 @@ declare class ServerRequestParser {
226
226
  //#region ../../src/server/core/providers/ServerTimingProvider.d.ts
227
227
  type TimingMap = Record<string, [number, number]>;
228
228
  declare class ServerTimingProvider {
229
- protected readonly log: alepha_logger6.Logger;
229
+ protected readonly log: alepha_logger3.Logger;
230
230
  protected readonly alepha: Alepha;
231
231
  options: {
232
232
  prefix: string;
@@ -249,7 +249,7 @@ declare class ServerTimingProvider {
249
249
  * - $page => React route (for SSR)
250
250
  */
251
251
  declare class ServerRouterProvider extends RouterProvider<ServerRouteMatcher> {
252
- protected readonly log: alepha_logger6.Logger;
252
+ protected readonly log: alepha_logger3.Logger;
253
253
  protected readonly alepha: Alepha;
254
254
  protected readonly routes: ServerRoute[];
255
255
  protected readonly serverTimingProvider: ServerTimingProvider;
@@ -288,7 +288,7 @@ declare class ServerRouterProvider extends RouterProvider<ServerRouteMatcher> {
288
288
  * ServerProvider supports both Node.js HTTP requests and Web (Fetch API) requests.
289
289
  */
290
290
  declare class ServerProvider {
291
- protected readonly log: alepha_logger6.Logger;
291
+ protected readonly log: alepha_logger3.Logger;
292
292
  protected readonly alepha: Alepha;
293
293
  protected readonly dateTimeProvider: DateTimeProvider;
294
294
  protected readonly router: ServerRouterProvider;
@@ -320,7 +320,7 @@ declare class ServerProvider {
320
320
  //#endregion
321
321
  //#region ../../src/server/core/services/HttpClient.d.ts
322
322
  declare class HttpClient {
323
- protected readonly log: alepha_logger6.Logger;
323
+ protected readonly log: alepha_logger3.Logger;
324
324
  protected readonly alepha: Alepha;
325
325
  readonly cache: alepha_cache0.CachePrimitiveFn<HttpClientCache, any[]>;
326
326
  protected readonly pendingRequests: HttpClientPendingRequests;
@@ -536,7 +536,7 @@ interface ActionPrimitiveOptions<TConfig extends RequestConfigSchema> extends Om
536
536
  handler: ServerActionHandler<TConfig>;
537
537
  }
538
538
  declare class ActionPrimitive<TConfig extends RequestConfigSchema> extends Primitive<ActionPrimitiveOptions<TConfig>> {
539
- protected readonly log: alepha_logger6.Logger;
539
+ protected readonly log: alepha_logger3.Logger;
540
540
  protected readonly env: {
541
541
  SERVER_API_PREFIX: string;
542
542
  };
@@ -684,7 +684,7 @@ declare module "alepha" {
684
684
  declare class BunHttpServerProvider extends ServerProvider {
685
685
  protected readonly alepha: Alepha;
686
686
  protected readonly dateTimeProvider: DateTimeProvider;
687
- protected readonly log: alepha_logger6.Logger;
687
+ protected readonly log: alepha_logger3.Logger;
688
688
  protected readonly env: {
689
689
  SERVER_PORT: number;
690
690
  SERVER_HOST: string;
@@ -709,7 +709,7 @@ declare module "alepha" {
709
709
  declare class NodeHttpServerProvider extends ServerProvider {
710
710
  protected readonly alepha: Alepha;
711
711
  protected readonly dateTimeProvider: DateTimeProvider;
712
- protected readonly log: alepha_logger6.Logger;
712
+ protected readonly log: alepha_logger3.Logger;
713
713
  protected readonly env: {
714
714
  SERVER_PORT: number;
715
715
  SERVER_HOST: string;
@@ -726,7 +726,7 @@ declare class NodeHttpServerProvider extends ServerProvider {
726
726
  //#endregion
727
727
  //#region ../../src/server/core/providers/ServerLoggerProvider.d.ts
728
728
  declare class ServerLoggerProvider {
729
- protected readonly log: alepha_logger6.Logger;
729
+ protected readonly log: alepha_logger3.Logger;
730
730
  protected readonly alepha: Alepha;
731
731
  readonly onRequest: alepha19.HookPrimitive<"server:onRequest">;
732
732
  readonly onError: alepha19.HookPrimitive<"server:onError">;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/core/schemas/errorSchema.ts","../../../src/server/core/errors/HttpError.ts","../../../src/server/core/constants/routeMethods.ts","../../../src/server/core/helpers/ServerReply.ts","../../../src/server/core/services/UserAgentParser.ts","../../../src/server/core/interfaces/ServerRequest.ts","../../../src/server/core/services/ServerRequestParser.ts","../../../src/server/core/providers/ServerTimingProvider.ts","../../../src/server/core/providers/ServerRouterProvider.ts","../../../src/server/core/providers/ServerProvider.ts","../../../src/server/core/services/HttpClient.ts","../../../src/server/core/primitives/$action.ts","../../../src/server/core/errors/BadRequestError.ts","../../../src/server/core/errors/ConflictError.ts","../../../src/server/core/errors/ForbiddenError.ts","../../../src/server/core/errors/NotFoundError.ts","../../../src/server/core/errors/UnauthorizedError.ts","../../../src/server/core/errors/ValidationError.ts","../../../src/server/core/helpers/isMultipart.ts","../../../src/server/core/schemas/okSchema.ts","../../../src/server/core/primitives/$route.ts","../../../src/server/core/providers/BunHttpServerProvider.ts","../../../src/server/core/providers/NodeHttpServerProvider.ts","../../../src/server/core/providers/ServerLoggerProvider.ts","../../../src/server/core/providers/ServerNotReadyProvider.ts","../../../src/server/core/index.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/core/schemas/errorSchema.ts","../../../src/server/core/errors/HttpError.ts","../../../src/server/core/constants/routeMethods.ts","../../../src/server/core/helpers/ServerReply.ts","../../../src/server/core/services/UserAgentParser.ts","../../../src/server/core/interfaces/ServerRequest.ts","../../../src/server/core/services/ServerRequestParser.ts","../../../src/server/core/providers/ServerTimingProvider.ts","../../../src/server/core/providers/ServerRouterProvider.ts","../../../src/server/core/providers/ServerProvider.ts","../../../src/server/core/services/HttpClient.ts","../../../src/server/core/primitives/$action.ts","../../../src/server/core/errors/BadRequestError.ts","../../../src/server/core/errors/ConflictError.ts","../../../src/server/core/errors/ForbiddenError.ts","../../../src/server/core/errors/NotFoundError.ts","../../../src/server/core/errors/UnauthorizedError.ts","../../../src/server/core/errors/ValidationError.ts","../../../src/server/core/helpers/isMultipart.ts","../../../src/server/core/schemas/okSchema.ts","../../../src/server/core/primitives/$route.ts","../../../src/server/core/providers/BunHttpServerProvider.ts","../../../src/server/core/providers/NodeHttpServerProvider.ts","../../../src/server/core/providers/ServerLoggerProvider.ts","../../../src/server/core/providers/ServerNotReadyProvider.ts","../../../src/server/core/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -31,9 +31,9 @@ var ServerReply = class {
31
31
  status;
32
32
  body;
33
33
  /**
34
- * Redirect to a given URL with optional status code (default 302).
34
+ * Redirect to a given URL with optional status code (default 301).
35
35
  */
36
- redirect(url, status = 302) {
36
+ redirect(url, status = 301) {
37
37
  this.status = status;
38
38
  this.headers.location = url;
39
39
  }
@@ -536,6 +536,7 @@ var ServerProvider = class {
536
536
  router = $inject(ServerRouterProvider);
537
537
  internalServerErrorMessage = "Internal Server Error";
538
538
  get hostname() {
539
+ if (this.alepha.isViteDev()) return `http://localhost:${this.alepha.env.SERVER_PORT}`;
539
540
  return "";
540
541
  }
541
542
  /**
@@ -602,8 +603,10 @@ var ServerProvider = class {
602
603
  }
603
604
  if (response.body instanceof ReadableStream) {
604
605
  res.writeHead(response.status, response.headers);
606
+ res.flushHeaders();
607
+ res.socket?.setNoDelay(true);
605
608
  try {
606
- for await (const chunk of response.body) res.write(chunk);
609
+ for await (const chunk of response.body) if (!res.write(chunk)) await new Promise((resolve) => res.once("drain", resolve));
607
610
  } catch (error) {
608
611
  this.log.error("Error piping proxy response stream", error);
609
612
  } finally {
@@ -665,7 +668,7 @@ var ServerProvider = class {
665
668
  return;
666
669
  }
667
670
  if (Buffer.isBuffer(response.body)) {
668
- ev.res = new Response(response.body.buffer, {
671
+ ev.res = new Response(new Uint8Array(response.body), {
669
672
  status: response.status,
670
673
  headers: response.headers
671
674
  });