alepha 0.20.2 → 0.20.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 (304) hide show
  1. package/README.md +0 -1
  2. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  3. package/assets/swagger-ui/swagger-ui.css +1 -1
  4. package/dist/api/audits/index.browser.js +49 -0
  5. package/dist/api/audits/index.browser.js.map +1 -1
  6. package/dist/api/audits/index.js +49 -0
  7. package/dist/api/audits/index.js.map +1 -1
  8. package/dist/api/files/index.js.map +1 -1
  9. package/dist/api/jobs/index.d.ts +2 -61
  10. package/dist/api/jobs/index.d.ts.map +1 -1
  11. package/dist/api/jobs/index.js.map +1 -1
  12. package/dist/api/keys/index.d.ts +4 -4
  13. package/dist/api/keys/index.js.map +1 -1
  14. package/dist/api/notifications/index.d.ts +1 -10
  15. package/dist/api/notifications/index.d.ts.map +1 -1
  16. package/dist/api/parameters/index.browser.js +37 -0
  17. package/dist/api/parameters/index.browser.js.map +1 -1
  18. package/dist/api/parameters/index.d.ts +12 -68
  19. package/dist/api/parameters/index.d.ts.map +1 -1
  20. package/dist/api/parameters/index.js +57 -4
  21. package/dist/api/parameters/index.js.map +1 -1
  22. package/dist/api/payments/index.js.map +1 -1
  23. package/dist/api/users/index.browser.js +6 -0
  24. package/dist/api/users/index.browser.js.map +1 -1
  25. package/dist/api/users/index.d.ts +148 -227
  26. package/dist/api/users/index.d.ts.map +1 -1
  27. package/dist/api/users/index.js +60 -14
  28. package/dist/api/users/index.js.map +1 -1
  29. package/dist/api/verifications/index.d.ts.map +1 -1
  30. package/dist/api/verifications/index.js +2 -1
  31. package/dist/api/verifications/index.js.map +1 -1
  32. package/dist/bucket/index.d.ts +77 -107
  33. package/dist/bucket/index.d.ts.map +1 -1
  34. package/dist/bucket/index.js +153 -5
  35. package/dist/bucket/index.js.map +1 -1
  36. package/dist/bucket/index.workerd.js +12 -2
  37. package/dist/bucket/index.workerd.js.map +1 -1
  38. package/dist/cache/core/index.d.ts +26 -0
  39. package/dist/cache/core/index.d.ts.map +1 -1
  40. package/dist/cache/core/index.js +11 -1
  41. package/dist/cache/core/index.js.map +1 -1
  42. package/dist/cache/core/index.workerd.js +11 -1
  43. package/dist/cache/core/index.workerd.js.map +1 -1
  44. package/dist/captcha/index.js.map +1 -1
  45. package/dist/cli/config/index.d.ts +7 -5
  46. package/dist/cli/config/index.d.ts.map +1 -1
  47. package/dist/cli/config/index.js +2 -3
  48. package/dist/cli/config/index.js.map +1 -1
  49. package/dist/cli/core/index.d.ts +637 -11660
  50. package/dist/cli/core/index.d.ts.map +1 -1
  51. package/dist/cli/core/index.js +707 -532
  52. package/dist/cli/core/index.js.map +1 -1
  53. package/dist/cli/devtools/index.d.ts +4 -8
  54. package/dist/cli/devtools/index.d.ts.map +1 -1
  55. package/dist/cli/devtools/index.js +20 -16
  56. package/dist/cli/devtools/index.js.map +1 -1
  57. package/dist/cli/platform/index.d.ts +51 -77
  58. package/dist/cli/platform/index.d.ts.map +1 -1
  59. package/dist/cli/platform/index.js +65 -15
  60. package/dist/cli/platform/index.js.map +1 -1
  61. package/dist/cli/vendor/index.d.ts +10 -13
  62. package/dist/cli/vendor/index.d.ts.map +1 -1
  63. package/dist/cli/vendor/index.js +30 -12
  64. package/dist/cli/vendor/index.js.map +1 -1
  65. package/dist/command/index.js +1 -1
  66. package/dist/command/index.js.map +1 -1
  67. package/dist/core/index.browser.js +27 -3
  68. package/dist/core/index.browser.js.map +1 -1
  69. package/dist/core/index.d.ts +8 -11
  70. package/dist/core/index.d.ts.map +1 -1
  71. package/dist/core/index.js +27 -3
  72. package/dist/core/index.js.map +1 -1
  73. package/dist/core/index.native.js +27 -3
  74. package/dist/core/index.native.js.map +1 -1
  75. package/dist/core/index.workerd.js +27 -3
  76. package/dist/core/index.workerd.js.map +1 -1
  77. package/dist/crypto/index.js.map +1 -1
  78. package/dist/datetime/index.d.ts +69 -10
  79. package/dist/datetime/index.d.ts.map +1 -1
  80. package/dist/datetime/index.js +135 -13
  81. package/dist/datetime/index.js.map +1 -1
  82. package/dist/email/core/index.js.map +1 -1
  83. package/dist/email/smtp/index.js +130 -16
  84. package/dist/email/smtp/index.js.map +1 -1
  85. package/dist/fake/index.js.map +1 -1
  86. package/dist/lock/core/index.d.ts +30 -2
  87. package/dist/lock/core/index.d.ts.map +1 -1
  88. package/dist/lock/core/index.js +35 -12
  89. package/dist/lock/core/index.js.map +1 -1
  90. package/dist/lock/redis/index.js.map +1 -1
  91. package/dist/logger/index.js +32 -1
  92. package/dist/logger/index.js.map +1 -1
  93. package/dist/mcp/index.d.ts +238 -31
  94. package/dist/mcp/index.d.ts.map +1 -1
  95. package/dist/mcp/index.js +198 -67
  96. package/dist/mcp/index.js.map +1 -1
  97. package/dist/orm/core/index.browser.js +2 -362
  98. package/dist/orm/core/index.browser.js.map +1 -1
  99. package/dist/orm/core/index.bun.js +18 -409
  100. package/dist/orm/core/index.bun.js.map +1 -1
  101. package/dist/orm/core/index.d.ts +41 -194
  102. package/dist/orm/core/index.d.ts.map +1 -1
  103. package/dist/orm/core/index.js +27 -422
  104. package/dist/orm/core/index.js.map +1 -1
  105. package/dist/orm/postgres/index.bun.js +17 -20
  106. package/dist/orm/postgres/index.bun.js.map +1 -1
  107. package/dist/orm/postgres/index.d.ts +1 -5
  108. package/dist/orm/postgres/index.d.ts.map +1 -1
  109. package/dist/orm/postgres/index.js +17 -20
  110. package/dist/orm/postgres/index.js.map +1 -1
  111. package/dist/react/core/index.d.ts +102 -1
  112. package/dist/react/core/index.d.ts.map +1 -1
  113. package/dist/react/core/index.js +65 -1
  114. package/dist/react/core/index.js.map +1 -1
  115. package/dist/react/form/index.d.ts +6 -0
  116. package/dist/react/form/index.d.ts.map +1 -1
  117. package/dist/react/form/index.js +7 -7
  118. package/dist/react/form/index.js.map +1 -1
  119. package/dist/react/i18n/index.d.ts +7 -1
  120. package/dist/react/i18n/index.d.ts.map +1 -1
  121. package/dist/react/i18n/index.js +6 -0
  122. package/dist/react/i18n/index.js.map +1 -1
  123. package/dist/react/intro/index.js +22 -17
  124. package/dist/react/intro/index.js.map +1 -1
  125. package/dist/react/router/index.browser.js +98 -4
  126. package/dist/react/router/index.browser.js.map +1 -1
  127. package/dist/react/router/index.d.ts +58 -5
  128. package/dist/react/router/index.d.ts.map +1 -1
  129. package/dist/react/router/index.js +122 -6
  130. package/dist/react/router/index.js.map +1 -1
  131. package/dist/react/testing/{chunk-DBEY4PJZ.js → chunk-6Ep1yQYe.js} +1 -1
  132. package/dist/react/testing/index.js +1 -1
  133. package/dist/react/testing/index.js.map +1 -1
  134. package/dist/react/ui/index.d.ts +195 -1
  135. package/dist/react/ui/index.d.ts.map +1 -1
  136. package/dist/react/ui/index.js +64 -1
  137. package/dist/react/ui/index.js.map +1 -1
  138. package/dist/react/websocket/index.js.map +1 -1
  139. package/dist/redis/index.js.map +1 -1
  140. package/dist/scheduler/index.d.ts +1 -2
  141. package/dist/scheduler/index.d.ts.map +1 -1
  142. package/dist/scheduler/index.js +1 -1
  143. package/dist/scheduler/index.js.map +1 -1
  144. package/dist/scheduler/index.workerd.js +1 -1
  145. package/dist/scheduler/index.workerd.js.map +1 -1
  146. package/dist/security/index.browser.js.map +1 -1
  147. package/dist/security/index.d.ts.map +1 -1
  148. package/dist/security/index.js +2 -2
  149. package/dist/security/index.js.map +1 -1
  150. package/dist/server/auth/index.d.ts.map +1 -1
  151. package/dist/server/auth/index.js +24 -10
  152. package/dist/server/auth/index.js.map +1 -1
  153. package/dist/server/cookies/index.js.map +1 -1
  154. package/dist/server/core/index.browser.js +10 -3
  155. package/dist/server/core/index.browser.js.map +1 -1
  156. package/dist/server/core/index.d.ts +1 -4
  157. package/dist/server/core/index.d.ts.map +1 -1
  158. package/dist/server/core/index.js +47 -9
  159. package/dist/server/core/index.js.map +1 -1
  160. package/dist/server/links/index.browser.js.map +1 -1
  161. package/dist/server/links/index.js.map +1 -1
  162. package/dist/server/metrics/index.js +19 -1
  163. package/dist/server/metrics/index.js.map +1 -1
  164. package/dist/server/rate-limit/index.js.map +1 -1
  165. package/dist/server/static/index.js.map +1 -1
  166. package/dist/server/swagger/index.d.ts.map +1 -1
  167. package/dist/server/swagger/index.js +4 -5
  168. package/dist/server/swagger/index.js.map +1 -1
  169. package/dist/sms/index.js.map +1 -1
  170. package/dist/system/index.browser.js.map +1 -1
  171. package/dist/system/index.js.map +1 -1
  172. package/dist/system/index.workerd.js.map +1 -1
  173. package/dist/topic/core/index.js.map +1 -1
  174. package/dist/websocket/index.browser.js +32 -5
  175. package/dist/websocket/index.browser.js.map +1 -1
  176. package/dist/websocket/index.d.ts +3 -1
  177. package/dist/websocket/index.d.ts.map +1 -1
  178. package/dist/websocket/index.js +42 -6
  179. package/dist/websocket/index.js.map +1 -1
  180. package/package.json +685 -274
  181. package/src/api/files/__tests__/FileController.spec.ts +1 -1
  182. package/src/api/jobs/__tests__/$job.spec.ts +5 -1
  183. package/src/api/parameters/services/ParameterProvider.ts +21 -4
  184. package/src/api/users/__tests__/SessionService.spec.ts +99 -0
  185. package/src/api/users/__tests__/UserJobs.spec.ts +67 -0
  186. package/src/api/users/atoms/realmAuthSettingsAtom.ts +15 -0
  187. package/src/api/users/entities/sessions.ts +6 -0
  188. package/src/api/users/jobs/UserJobs.ts +44 -17
  189. package/src/api/users/providers/RealmProvider.ts +4 -0
  190. package/src/api/users/schemas/userQuerySchema.ts +0 -1
  191. package/src/api/users/services/SessionService.ts +27 -0
  192. package/src/api/users/services/UserService.ts +1 -5
  193. package/src/api/verifications/__tests__/CodeVerification.spec.ts +14 -0
  194. package/src/api/verifications/__tests__/LinkVerification.spec.ts +14 -0
  195. package/src/api/verifications/services/VerificationService.ts +1 -0
  196. package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +74 -0
  197. package/src/bucket/index.ts +19 -2
  198. package/src/bucket/primitives/$bucket.ts +9 -1
  199. package/src/bucket/providers/CloudflareR2Provider.ts +2 -137
  200. package/src/bucket/providers/NodeS3BucketProvider.ts +218 -0
  201. package/src/cache/core/index.ts +29 -0
  202. package/src/cache/core/primitives/$cache.ts +14 -1
  203. package/src/cli/config/defineConfig.ts +13 -15
  204. package/src/cli/core/__tests__/init.spec.ts +214 -7
  205. package/src/cli/core/commands/init.ts +12 -0
  206. package/src/cli/core/services/PackageManagerUtils.ts +23 -6
  207. package/src/cli/core/services/ProjectScaffolder.ts +315 -33
  208. package/src/cli/core/tasks/BuildCloudflareTask.ts +5 -0
  209. package/src/cli/core/tasks/BuildDockerTask.ts +9 -10
  210. package/src/cli/core/tasks/BuildServerTask.ts +8 -0
  211. package/src/cli/core/templates/agentMd.ts +2 -10
  212. package/src/cli/core/templates/apiIndexTs.ts +23 -1
  213. package/src/cli/core/templates/componentsJsonTs.ts +39 -0
  214. package/src/cli/core/templates/mainCss.ts +1 -0
  215. package/src/cli/core/templates/saasAdminLayoutTsx.ts +77 -0
  216. package/src/cli/core/templates/saasAdminPagesTsx.ts +26 -0
  217. package/src/cli/core/templates/saasAuthLayoutTsx.ts +20 -0
  218. package/src/cli/core/templates/saasAuthPagesTsx.ts +62 -0
  219. package/src/cli/core/templates/saasRealmProviderTs.ts +46 -0
  220. package/src/cli/core/templates/webAppRouterTs.ts +104 -1
  221. package/src/cli/core/templates/webIndexTs.ts +23 -1
  222. package/src/cli/devtools/index.ts +12 -26
  223. package/src/cli/platform/__tests__/SecretsCommand.spec.ts +2 -0
  224. package/src/cli/platform/index.ts +15 -24
  225. package/src/cli/vendor/atoms/vendorOptions.ts +1 -1
  226. package/src/cli/vendor/index.ts +14 -23
  227. package/src/command/providers/CliProvider.ts +1 -1
  228. package/src/core/Alepha.ts +11 -1
  229. package/src/core/helpers/ref.ts +18 -0
  230. package/src/core/index.shared.ts +1 -0
  231. package/src/core/interfaces/Service.ts +3 -1
  232. package/src/core/providers/SchemaValidator.ts +9 -1
  233. package/src/core/providers/TypeProvider.ts +2 -3
  234. package/src/datetime/REFACTORING.md +118 -0
  235. package/src/datetime/providers/DateTimeProvider.ts +203 -24
  236. package/src/lock/core/index.ts +31 -0
  237. package/src/lock/core/primitives/$lock.ts +14 -1
  238. package/src/logger/services/Logger.ts +1 -1
  239. package/src/mcp/__tests__/$resource.spec.ts +1 -1
  240. package/src/mcp/__tests__/$tool.spec.ts +1 -1
  241. package/src/mcp/__tests__/McpServerProvider.spec.ts +1 -1
  242. package/src/mcp/__tests__/jsonrpc.spec.ts +1 -1
  243. package/src/mcp/helpers/jsonrpc.ts +26 -1
  244. package/src/mcp/index.ts +10 -5
  245. package/src/mcp/interfaces/McpTypes.ts +83 -6
  246. package/src/mcp/primitives/$prompt.ts +18 -1
  247. package/src/mcp/primitives/$resource.ts +18 -1
  248. package/src/mcp/primitives/$tool.ts +83 -7
  249. package/src/mcp/providers/McpServerProvider.ts +74 -16
  250. package/src/mcp/transports/StreamableHttpMcpTransport.ts +226 -0
  251. package/src/orm/REFACTORING.md +330 -0
  252. package/src/orm/__tests__/$repository-tests.ts +1 -0
  253. package/src/orm/__tests__/orm-next-tests.ts +2 -67
  254. package/src/orm/__tests__/orm-next.spec.ts +0 -21
  255. package/src/orm/core/index.shared.ts +0 -2
  256. package/src/orm/core/index.ts +1 -2
  257. package/src/orm/core/primitives/$repository.ts +3 -6
  258. package/src/orm/core/primitives/$transactional.ts +11 -0
  259. package/src/orm/core/providers/drivers/DatabaseProvider.ts +0 -5
  260. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +11 -13
  261. package/src/orm/core/schemas/updateSchema.ts +1 -1
  262. package/src/orm/core/services/ModelBuilder.ts +1 -13
  263. package/src/orm/core/services/PgRelationManager.ts +4 -2
  264. package/src/orm/core/services/Repository.ts +1 -42
  265. package/src/orm/core/services/SqliteModelBuilder.ts +2 -33
  266. package/src/orm/postgres/services/PostgresModelBuilder.ts +10 -45
  267. package/src/react/core/__tests__/useQuery.browser.spec.tsx +86 -0
  268. package/src/react/core/hooks/useQuery.ts +153 -0
  269. package/src/react/core/index.ts +1 -0
  270. package/src/react/form/services/FormModel.ts +15 -6
  271. package/src/react/form/services/parseField.ts +8 -0
  272. package/src/react/i18n/providers/I18nProvider.ts +8 -2
  273. package/src/react/intro/components/GettingStartedAuthSlide.tsx +11 -4
  274. package/src/react/router/__tests__/$page.spec.tsx +0 -16
  275. package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +213 -2
  276. package/src/react/router/__tests__/ssr.spec.tsx +339 -0
  277. package/src/react/router/primitives/$page.ts +28 -4
  278. package/src/react/router/providers/ReactBrowserProvider.ts +73 -0
  279. package/src/react/router/providers/ReactBrowserRouterProvider.ts +1 -1
  280. package/src/react/router/providers/ReactPageProvider.ts +27 -9
  281. package/src/react/router/providers/ReactPreloadProvider.ts +1 -1
  282. package/src/react/router/providers/ReactServerProvider.ts +1 -0
  283. package/src/react/ui/atoms/uiThemeListAtom.ts +36 -0
  284. package/src/react/ui/index.ts +6 -0
  285. package/src/react/ui/services/SchemaControl.ts +209 -0
  286. package/src/scheduler/providers/CronProvider.ts +1 -1
  287. package/src/security/primitives/$basicAuth.ts +1 -1
  288. package/src/security/primitives/$issuer.ts +6 -3
  289. package/src/server/auth/providers/ServerAuthProvider.ts +5 -1
  290. package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +75 -0
  291. package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +306 -0
  292. package/src/server/core/errors/ValidationError.ts +13 -1
  293. package/src/server/core/interfaces/ServerRequest.ts +1 -0
  294. package/src/server/core/primitives/$action.ts +16 -5
  295. package/src/server/core/providers/ServerProvider.ts +1 -1
  296. package/src/server/core/providers/ServerRouterProvider.ts +28 -6
  297. package/src/server/core/services/HttpClient.ts +1 -1
  298. package/src/server/swagger/providers/ServerSwaggerProvider.ts +6 -8
  299. package/src/websocket/providers/NodeWebSocketServerProvider.ts +10 -4
  300. package/src/websocket/services/WebSocketClient.ts +11 -5
  301. package/src/mcp/transports/SseMcpTransport.ts +0 -182
  302. package/src/orm/core/__tests__/parseQueryString.spec.ts +0 -196
  303. package/src/orm/core/helpers/parseQueryString.ts +0 -502
  304. package/src/orm/core/primitives/$view.ts +0 -88
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/server/cookies/services/CookieParser.ts","../../../src/server/cookies/providers/ServerCookiesProvider.ts","../../../src/server/cookies/primitives/$cookie.ts","../../../src/server/cookies/index.ts"],"sourcesContent":["import type { Cookie } from \"../primitives/$cookie.ts\";\n\nexport class CookieParser {\n public parseRequestCookies(header: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n const parts = header.split(\";\");\n for (const part of parts) {\n const eqIndex = part.indexOf(\"=\");\n if (eqIndex === -1) {\n continue;\n }\n\n const key = part.slice(0, eqIndex).trim();\n const value = part.slice(eqIndex + 1).trim();\n\n if (!key || !value) {\n continue;\n }\n\n cookies[key] = value;\n }\n\n return cookies;\n }\n\n public serializeResponseCookies(\n cookies: Record<string, Cookie | null>,\n isHttps: boolean,\n ): string[] {\n const headers = [];\n\n for (const [name, cookie] of Object.entries(cookies)) {\n // If the cookie is null, we need to delete it\n if (cookie == null) {\n headers.push(`${name}=; Path=/; Max-Age=0`);\n continue;\n }\n\n if (!cookie.value) {\n continue;\n }\n\n headers.push(this.cookieToString(name, cookie, isHttps));\n }\n\n return headers;\n }\n\n public cookieToString(\n name: string,\n cookie: Cookie,\n isHttps?: boolean,\n ): string {\n const parts: string[] = [];\n\n parts.push(`${name}=${cookie.value}`);\n\n if (cookie.path) {\n parts.push(`Path=${cookie.path}`);\n }\n if (cookie.maxAge) {\n parts.push(`Max-Age=${cookie.maxAge}`);\n }\n if (cookie.secure !== false && isHttps) {\n parts.push(\"Secure\");\n }\n if (cookie.httpOnly) {\n parts.push(\"HttpOnly\");\n }\n if (cookie.sameSite) {\n parts.push(`SameSite=${cookie.sameSite}`);\n }\n if (cookie.domain) {\n parts.push(`Domain=${cookie.domain}`);\n }\n\n return parts.join(\"; \");\n }\n}\n","import {\n createCipheriv,\n createDecipheriv,\n createHash,\n createHmac,\n randomBytes,\n timingSafeEqual,\n} from \"node:crypto\";\nimport { deflateRawSync, inflateRawSync } from \"node:zlib\";\nimport {\n $hook,\n $inject,\n Alepha,\n AlephaError,\n type Static,\n type TSchema,\n} from \"alepha\";\nimport { SecretProvider } from \"alepha/crypto\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport type {\n Cookie,\n CookiePrimitiveOptions,\n Cookies,\n} from \"../primitives/$cookie.ts\";\nimport { CookieParser } from \"../services/CookieParser.ts\";\n\nexport class ServerCookiesProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly cookieParser = $inject(CookieParser);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly secretProvider = $inject(SecretProvider);\n\n // crypto constants\n protected readonly ALGORITHM = \"aes-256-gcm\";\n protected readonly IV_LENGTH = 16; // For GCM\n protected readonly AUTH_TAG_LENGTH = 16;\n protected readonly SIGNATURE_LENGTH = 32; // For SHA256\n\n public readonly onRequest = $hook({\n on: \"server:onRequest\",\n handler: ({ request }) => {\n request.cookies = {\n req: this.cookieParser.parseRequestCookies(\n request.headers.cookie ?? \"\",\n ),\n res: {},\n };\n },\n });\n\n public readonly onAction = $hook({\n on: \"action:onRequest\",\n handler: ({ request }) => {\n request.cookies = {\n req: this.cookieParser.parseRequestCookies(\n request.headers.cookie ?? \"\",\n ),\n res: {},\n };\n },\n });\n\n public readonly onSend = $hook({\n on: \"server:onSend\",\n handler: ({ request }) => {\n if (request.cookies && Object.keys(request.cookies.res).length > 0) {\n const setCookieHeaders = this.cookieParser.serializeResponseCookies(\n request.cookies.res,\n request.url.protocol === \"https:\",\n );\n if (setCookieHeaders.length > 0) {\n request.reply.headers[\"set-cookie\"] = setCookieHeaders;\n }\n }\n },\n });\n\n protected getCookiesFromContext(cookies?: Cookies): Cookies {\n const contextCookies = this.alepha.store.get(\n \"alepha.http.request\",\n )?.cookies;\n if (cookies) return cookies;\n if (contextCookies) return contextCookies;\n throw new AlephaError(\n \"Cookie context is not available. This method must be called within a server request cycle.\",\n );\n }\n\n public getCookie<T extends TSchema>(\n name: string,\n options: CookiePrimitiveOptions<T>,\n contextCookies?: Cookies,\n ): Static<T> | undefined {\n const cookies = this.getCookiesFromContext(contextCookies);\n let rawValue = cookies.req[name];\n\n if (!rawValue) return undefined;\n\n try {\n rawValue = decodeURIComponent(rawValue);\n\n if (options.sign) {\n const signature = rawValue.substring(0, this.SIGNATURE_LENGTH * 2);\n const value = rawValue.substring(this.SIGNATURE_LENGTH * 2);\n const expectedSignature = this.sign(value);\n\n if (\n !timingSafeEqual(\n Buffer.from(signature, \"hex\"),\n Buffer.from(expectedSignature, \"hex\"),\n )\n ) {\n this.log.warn(`Invalid signature for cookie \"${name}\".`);\n return undefined;\n }\n rawValue = value;\n }\n\n if (options.encrypt) {\n rawValue = this.decrypt(rawValue);\n }\n\n if (options.compress) {\n rawValue = inflateRawSync(Buffer.from(rawValue, \"base64\")).toString(\n \"utf8\",\n );\n }\n\n return this.alepha.codec.decode(options.schema, JSON.parse(rawValue));\n } catch (error) {\n this.log.warn(`Failed to parse cookie \"${name}\"`, error);\n // corrupted or invalid cookie, instruct browser to delete it on next response\n this.deleteCookie(name, cookies);\n return undefined;\n }\n }\n\n public setCookie<T extends TSchema>(\n name: string,\n options: CookiePrimitiveOptions<T>,\n data: Static<T>,\n contextCookies?: Cookies,\n ): void {\n const cookies = this.getCookiesFromContext(contextCookies);\n let value = JSON.stringify(this.alepha.codec.decode(options.schema, data));\n\n if (options.compress) {\n value = deflateRawSync(value).toString(\"base64\");\n }\n\n if (options.encrypt) {\n value = this.encrypt(value);\n }\n\n if (options.sign) {\n value = this.sign(value) + value;\n }\n\n const cookie: Cookie = {\n value: encodeURIComponent(value),\n path: options.path ?? \"/\",\n // \"lax\" is correct here — \"strict\" would break OAuth flows because OAuth callbacks\n // are top-level redirects from the IdP, and strict cookies are not sent on cross-site\n // top-level navigations. \"lax\" is Chrome's own default and the industry standard.\n sameSite: options.sameSite ?? \"lax\",\n secure: options.secure ?? this.alepha.isProduction(),\n httpOnly: options.httpOnly,\n domain: options.domain,\n };\n\n if (options.ttl) {\n cookie.maxAge = this.dateTimeProvider.duration(options.ttl).as(\"seconds\");\n }\n\n cookies.res[name] = cookie;\n }\n\n public deleteCookie<T extends TSchema>(\n name: string,\n contextCookies?: Cookies,\n ): void {\n const cookies = this.getCookiesFromContext(contextCookies);\n cookies.res[name] = null;\n }\n\n // --- Crypto & Parsing ---\n\n protected encrypt(text: string): string {\n const iv = randomBytes(this.IV_LENGTH);\n const cipher = createCipheriv(this.ALGORITHM, this.deriveKey(), iv);\n const encrypted = Buffer.concat([\n cipher.update(text, \"utf8\"),\n cipher.final(),\n ]);\n const authTag = cipher.getAuthTag();\n return Buffer.concat([iv, authTag, encrypted]).toString(\"base64\");\n }\n\n protected decrypt(encryptedText: string): string {\n const data = Buffer.from(encryptedText, \"base64\");\n const iv = data.subarray(0, this.IV_LENGTH);\n const authTag = data.subarray(\n this.IV_LENGTH,\n this.IV_LENGTH + this.AUTH_TAG_LENGTH,\n );\n\n const encrypted = data.subarray(this.IV_LENGTH + this.AUTH_TAG_LENGTH);\n const decipher = createDecipheriv(this.ALGORITHM, this.deriveKey(), iv);\n\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([\n decipher.update(encrypted),\n decipher.final(),\n ]);\n\n return decrypted.toString(\"utf8\");\n }\n\n /**\n * Derives a 32-byte key from APP_SECRET via SHA-256.\n * Accepts any string length — no padding or truncation needed.\n */\n protected deriveKey(): Buffer {\n return createHash(\"sha256\").update(this.secretProvider.secretKey).digest();\n }\n\n protected sign(data: string): string {\n return createHmac(\"sha256\", this.deriveKey()).update(data).digest(\"hex\");\n }\n}\n","import {\n $inject,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TSchema,\n} from \"alepha\";\nimport type { DurationLike } from \"alepha/datetime\";\nimport { ServerCookiesProvider } from \"../providers/ServerCookiesProvider.ts\";\n\n/**\n * Declares a type-safe, configurable HTTP cookie.\n * This primitive provides methods to get, set, and delete the cookie\n * within the server request/response cycle.\n */\nexport const $cookie = <T extends TSchema>(\n options: CookiePrimitiveOptions<T>,\n extendedOptions?: Omit<CookiePrimitiveOptions<T>, \"schema\">,\n): AbstractCookiePrimitive<T> => {\n if (extendedOptions) {\n options = {\n key: options.key,\n schema: options.schema,\n ...extendedOptions,\n };\n }\n return createPrimitive(CookiePrimitive<T>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CookiePrimitiveOptions<T extends TSchema> {\n /**\n * The schema for the cookie's value, used for validation and type safety.\n */\n schema: T;\n\n /**\n * The name of the cookie.\n */\n name?: string;\n\n /**\n * The cookie's path. Defaults to \"/\".\n */\n path?: string;\n\n /**\n * Time-to-live for the cookie. Maps to `Max-Age`.\n */\n ttl?: DurationLike;\n\n /**\n * If true, the cookie is only sent over HTTPS. Defaults to true in production.\n */\n secure?: boolean;\n\n /**\n * If true, the cookie cannot be accessed by client-side scripts.\n */\n httpOnly?: boolean;\n\n /**\n * SameSite policy for the cookie. Defaults to \"lax\".\n */\n sameSite?: \"strict\" | \"lax\" | \"none\";\n\n /**\n * The domain for the cookie.\n */\n domain?: string;\n\n /**\n * If true, the cookie value will be compressed using zlib.\n */\n compress?: boolean;\n\n /**\n * If true, the cookie value will be encrypted. Requires `COOKIE_SECRET` env var.\n */\n encrypt?: boolean;\n\n /**\n * If true, the cookie will be signed to prevent tampering. Requires `COOKIE_SECRET` env var.\n */\n sign?: boolean;\n\n /**\n * Optional key to link this cookie to an Atom, enabling automatic synchronization between the cookie and the Atom's state.\n */\n key?: string;\n}\n\nexport interface AbstractCookiePrimitive<T extends TSchema> {\n readonly name: string;\n readonly options: CookiePrimitiveOptions<T>;\n set(\n value: Static<T>,\n options?: { cookies?: Cookies; ttl?: DurationLike },\n ): void;\n get(options?: { cookies?: Cookies }): Static<T> | undefined;\n del(options?: { cookies?: Cookies }): void;\n}\n\nexport class CookiePrimitive<T extends TSchema>\n extends Primitive<CookiePrimitiveOptions<T>>\n implements AbstractCookiePrimitive<T>\n{\n protected readonly serverCookiesProvider = $inject(ServerCookiesProvider);\n\n protected onInit() {\n if (this.options.key) {\n this.alepha.events.on(\"state:mutate\", ({ key, value }) => {\n if (key === this.options.key) {\n this.set(value);\n }\n });\n this.alepha.events.on(\"server:onRequest\", ({ request }) => {\n try {\n const value = this.get(request);\n if (value !== undefined) {\n this.alepha.store.set(this.options.key as any, value, {\n skipEvents: true,\n });\n }\n } catch {}\n });\n }\n }\n\n public get schema(): T {\n return this.options.schema;\n }\n\n public get name(): string {\n return this.options.name ?? `${this.config.propertyKey}`;\n }\n\n /**\n * Sets the cookie with the given value in the current request's response.\n */\n public set(\n value: Static<T>,\n options?: { cookies?: Cookies; ttl?: DurationLike },\n ): void {\n this.serverCookiesProvider.setCookie(\n this.name,\n {\n ...this.options,\n ttl: options?.ttl ?? this.options.ttl,\n },\n value,\n options?.cookies,\n );\n }\n\n /**\n * Gets the cookie value from the current request. Returns undefined if not found or invalid.\n */\n public get(options?: { cookies?: Cookies }): Static<T> | undefined {\n return this.serverCookiesProvider.getCookie(\n this.name,\n this.options,\n options?.cookies,\n );\n }\n\n /**\n * Deletes the cookie in the current request's response.\n */\n public del(options?: { cookies?: Cookies }): void {\n this.serverCookiesProvider.deleteCookie(this.name, options?.cookies);\n }\n}\n\n$cookie[KIND] = CookiePrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface Cookies {\n req: Record<string, string>;\n res: Record<string, Cookie | null>;\n}\n\nexport interface Cookie {\n value: string;\n path?: string;\n maxAge?: number;\n secure?: boolean;\n httpOnly?: boolean;\n sameSite?: \"strict\" | \"lax\" | \"none\";\n domain?: string;\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { $cookie, type Cookies } from \"./primitives/$cookie.ts\";\nimport { ServerCookiesProvider } from \"./providers/ServerCookiesProvider.ts\";\nimport { CookieParser } from \"./services/CookieParser.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$cookie.ts\";\nexport * from \"./providers/ServerCookiesProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha/server\" {\n interface ServerRequest {\n cookies: Cookies;\n }\n}\n\n/**\n * Server and browser-safe cookie handling.\n *\n * **Features:**\n * - Cookie management on server and browser\n *\n * @module alepha.server.cookies\n */\nexport const AlephaServerCookies = $module({\n name: \"alepha.server.cookies\",\n primitives: [$cookie],\n services: [AlephaServer, ServerCookiesProvider, CookieParser],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/server/cookies/services/CookieParser.ts","../../../src/server/cookies/providers/ServerCookiesProvider.ts","../../../src/server/cookies/primitives/$cookie.ts","../../../src/server/cookies/index.ts"],"sourcesContent":["import type { Cookie } from \"../primitives/$cookie.ts\";\n\nexport class CookieParser {\n public parseRequestCookies(header: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n const parts = header.split(\";\");\n for (const part of parts) {\n const eqIndex = part.indexOf(\"=\");\n if (eqIndex === -1) {\n continue;\n }\n\n const key = part.slice(0, eqIndex).trim();\n const value = part.slice(eqIndex + 1).trim();\n\n if (!key || !value) {\n continue;\n }\n\n cookies[key] = value;\n }\n\n return cookies;\n }\n\n public serializeResponseCookies(\n cookies: Record<string, Cookie | null>,\n isHttps: boolean,\n ): string[] {\n const headers = [];\n\n for (const [name, cookie] of Object.entries(cookies)) {\n // If the cookie is null, we need to delete it\n if (cookie == null) {\n headers.push(`${name}=; Path=/; Max-Age=0`);\n continue;\n }\n\n if (!cookie.value) {\n continue;\n }\n\n headers.push(this.cookieToString(name, cookie, isHttps));\n }\n\n return headers;\n }\n\n public cookieToString(\n name: string,\n cookie: Cookie,\n isHttps?: boolean,\n ): string {\n const parts: string[] = [];\n\n parts.push(`${name}=${cookie.value}`);\n\n if (cookie.path) {\n parts.push(`Path=${cookie.path}`);\n }\n if (cookie.maxAge) {\n parts.push(`Max-Age=${cookie.maxAge}`);\n }\n if (cookie.secure !== false && isHttps) {\n parts.push(\"Secure\");\n }\n if (cookie.httpOnly) {\n parts.push(\"HttpOnly\");\n }\n if (cookie.sameSite) {\n parts.push(`SameSite=${cookie.sameSite}`);\n }\n if (cookie.domain) {\n parts.push(`Domain=${cookie.domain}`);\n }\n\n return parts.join(\"; \");\n }\n}\n","import {\n createCipheriv,\n createDecipheriv,\n createHash,\n createHmac,\n randomBytes,\n timingSafeEqual,\n} from \"node:crypto\";\nimport { deflateRawSync, inflateRawSync } from \"node:zlib\";\nimport {\n $hook,\n $inject,\n Alepha,\n AlephaError,\n type Static,\n type TSchema,\n} from \"alepha\";\nimport { SecretProvider } from \"alepha/crypto\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport type {\n Cookie,\n CookiePrimitiveOptions,\n Cookies,\n} from \"../primitives/$cookie.ts\";\nimport { CookieParser } from \"../services/CookieParser.ts\";\n\nexport class ServerCookiesProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly cookieParser = $inject(CookieParser);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly secretProvider = $inject(SecretProvider);\n\n // crypto constants\n protected readonly ALGORITHM = \"aes-256-gcm\";\n protected readonly IV_LENGTH = 16; // For GCM\n protected readonly AUTH_TAG_LENGTH = 16;\n protected readonly SIGNATURE_LENGTH = 32; // For SHA256\n\n public readonly onRequest = $hook({\n on: \"server:onRequest\",\n handler: ({ request }) => {\n request.cookies = {\n req: this.cookieParser.parseRequestCookies(\n request.headers.cookie ?? \"\",\n ),\n res: {},\n };\n },\n });\n\n public readonly onAction = $hook({\n on: \"action:onRequest\",\n handler: ({ request }) => {\n request.cookies = {\n req: this.cookieParser.parseRequestCookies(\n request.headers.cookie ?? \"\",\n ),\n res: {},\n };\n },\n });\n\n public readonly onSend = $hook({\n on: \"server:onSend\",\n handler: ({ request }) => {\n if (request.cookies && Object.keys(request.cookies.res).length > 0) {\n const setCookieHeaders = this.cookieParser.serializeResponseCookies(\n request.cookies.res,\n request.url.protocol === \"https:\",\n );\n if (setCookieHeaders.length > 0) {\n request.reply.headers[\"set-cookie\"] = setCookieHeaders;\n }\n }\n },\n });\n\n protected getCookiesFromContext(cookies?: Cookies): Cookies {\n const contextCookies = this.alepha.store.get(\n \"alepha.http.request\",\n )?.cookies;\n if (cookies) return cookies;\n if (contextCookies) return contextCookies;\n throw new AlephaError(\n \"Cookie context is not available. This method must be called within a server request cycle.\",\n );\n }\n\n public getCookie<T extends TSchema>(\n name: string,\n options: CookiePrimitiveOptions<T>,\n contextCookies?: Cookies,\n ): Static<T> | undefined {\n const cookies = this.getCookiesFromContext(contextCookies);\n let rawValue = cookies.req[name];\n\n if (!rawValue) return undefined;\n\n try {\n rawValue = decodeURIComponent(rawValue);\n\n if (options.sign) {\n const signature = rawValue.substring(0, this.SIGNATURE_LENGTH * 2);\n const value = rawValue.substring(this.SIGNATURE_LENGTH * 2);\n const expectedSignature = this.sign(value);\n\n if (\n !timingSafeEqual(\n Buffer.from(signature, \"hex\"),\n Buffer.from(expectedSignature, \"hex\"),\n )\n ) {\n this.log.warn(`Invalid signature for cookie \"${name}\".`);\n return undefined;\n }\n rawValue = value;\n }\n\n if (options.encrypt) {\n rawValue = this.decrypt(rawValue);\n }\n\n if (options.compress) {\n rawValue = inflateRawSync(Buffer.from(rawValue, \"base64\")).toString(\n \"utf8\",\n );\n }\n\n return this.alepha.codec.decode(options.schema, JSON.parse(rawValue));\n } catch (error) {\n this.log.warn(`Failed to parse cookie \"${name}\"`, error);\n // corrupted or invalid cookie, instruct browser to delete it on next response\n this.deleteCookie(name, cookies);\n return undefined;\n }\n }\n\n public setCookie<T extends TSchema>(\n name: string,\n options: CookiePrimitiveOptions<T>,\n data: Static<T>,\n contextCookies?: Cookies,\n ): void {\n const cookies = this.getCookiesFromContext(contextCookies);\n let value = JSON.stringify(this.alepha.codec.decode(options.schema, data));\n\n if (options.compress) {\n value = deflateRawSync(value).toString(\"base64\");\n }\n\n if (options.encrypt) {\n value = this.encrypt(value);\n }\n\n if (options.sign) {\n value = this.sign(value) + value;\n }\n\n const cookie: Cookie = {\n value: encodeURIComponent(value),\n path: options.path ?? \"/\",\n // \"lax\" is correct here — \"strict\" would break OAuth flows because OAuth callbacks\n // are top-level redirects from the IdP, and strict cookies are not sent on cross-site\n // top-level navigations. \"lax\" is Chrome's own default and the industry standard.\n sameSite: options.sameSite ?? \"lax\",\n secure: options.secure ?? this.alepha.isProduction(),\n httpOnly: options.httpOnly,\n domain: options.domain,\n };\n\n if (options.ttl) {\n cookie.maxAge = this.dateTimeProvider.duration(options.ttl).as(\"seconds\");\n }\n\n cookies.res[name] = cookie;\n }\n\n public deleteCookie<T extends TSchema>(\n name: string,\n contextCookies?: Cookies,\n ): void {\n const cookies = this.getCookiesFromContext(contextCookies);\n cookies.res[name] = null;\n }\n\n // --- Crypto & Parsing ---\n\n protected encrypt(text: string): string {\n const iv = randomBytes(this.IV_LENGTH);\n const cipher = createCipheriv(this.ALGORITHM, this.deriveKey(), iv);\n const encrypted = Buffer.concat([\n cipher.update(text, \"utf8\"),\n cipher.final(),\n ]);\n const authTag = cipher.getAuthTag();\n return Buffer.concat([iv, authTag, encrypted]).toString(\"base64\");\n }\n\n protected decrypt(encryptedText: string): string {\n const data = Buffer.from(encryptedText, \"base64\");\n const iv = data.subarray(0, this.IV_LENGTH);\n const authTag = data.subarray(\n this.IV_LENGTH,\n this.IV_LENGTH + this.AUTH_TAG_LENGTH,\n );\n\n const encrypted = data.subarray(this.IV_LENGTH + this.AUTH_TAG_LENGTH);\n const decipher = createDecipheriv(this.ALGORITHM, this.deriveKey(), iv);\n\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([\n decipher.update(encrypted),\n decipher.final(),\n ]);\n\n return decrypted.toString(\"utf8\");\n }\n\n /**\n * Derives a 32-byte key from APP_SECRET via SHA-256.\n * Accepts any string length — no padding or truncation needed.\n */\n protected deriveKey(): Buffer {\n return createHash(\"sha256\").update(this.secretProvider.secretKey).digest();\n }\n\n protected sign(data: string): string {\n return createHmac(\"sha256\", this.deriveKey()).update(data).digest(\"hex\");\n }\n}\n","import {\n $inject,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TSchema,\n} from \"alepha\";\nimport type { DurationLike } from \"alepha/datetime\";\nimport { ServerCookiesProvider } from \"../providers/ServerCookiesProvider.ts\";\n\n/**\n * Declares a type-safe, configurable HTTP cookie.\n * This primitive provides methods to get, set, and delete the cookie\n * within the server request/response cycle.\n */\nexport const $cookie = <T extends TSchema>(\n options: CookiePrimitiveOptions<T>,\n extendedOptions?: Omit<CookiePrimitiveOptions<T>, \"schema\">,\n): AbstractCookiePrimitive<T> => {\n if (extendedOptions) {\n options = {\n key: options.key,\n schema: options.schema,\n ...extendedOptions,\n };\n }\n return createPrimitive(CookiePrimitive<T>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CookiePrimitiveOptions<T extends TSchema> {\n /**\n * The schema for the cookie's value, used for validation and type safety.\n */\n schema: T;\n\n /**\n * The name of the cookie.\n */\n name?: string;\n\n /**\n * The cookie's path. Defaults to \"/\".\n */\n path?: string;\n\n /**\n * Time-to-live for the cookie. Maps to `Max-Age`.\n */\n ttl?: DurationLike;\n\n /**\n * If true, the cookie is only sent over HTTPS. Defaults to true in production.\n */\n secure?: boolean;\n\n /**\n * If true, the cookie cannot be accessed by client-side scripts.\n */\n httpOnly?: boolean;\n\n /**\n * SameSite policy for the cookie. Defaults to \"lax\".\n */\n sameSite?: \"strict\" | \"lax\" | \"none\";\n\n /**\n * The domain for the cookie.\n */\n domain?: string;\n\n /**\n * If true, the cookie value will be compressed using zlib.\n */\n compress?: boolean;\n\n /**\n * If true, the cookie value will be encrypted. Requires `COOKIE_SECRET` env var.\n */\n encrypt?: boolean;\n\n /**\n * If true, the cookie will be signed to prevent tampering. Requires `COOKIE_SECRET` env var.\n */\n sign?: boolean;\n\n /**\n * Optional key to link this cookie to an Atom, enabling automatic synchronization between the cookie and the Atom's state.\n */\n key?: string;\n}\n\nexport interface AbstractCookiePrimitive<T extends TSchema> {\n readonly name: string;\n readonly options: CookiePrimitiveOptions<T>;\n set(\n value: Static<T>,\n options?: { cookies?: Cookies; ttl?: DurationLike },\n ): void;\n get(options?: { cookies?: Cookies }): Static<T> | undefined;\n del(options?: { cookies?: Cookies }): void;\n}\n\nexport class CookiePrimitive<T extends TSchema>\n extends Primitive<CookiePrimitiveOptions<T>>\n implements AbstractCookiePrimitive<T>\n{\n protected readonly serverCookiesProvider = $inject(ServerCookiesProvider);\n\n protected onInit() {\n if (this.options.key) {\n this.alepha.events.on(\"state:mutate\", ({ key, value }) => {\n if (key === this.options.key) {\n this.set(value);\n }\n });\n this.alepha.events.on(\"server:onRequest\", ({ request }) => {\n try {\n const value = this.get(request);\n if (value !== undefined) {\n this.alepha.store.set(this.options.key as any, value, {\n skipEvents: true,\n });\n }\n } catch {}\n });\n }\n }\n\n public get schema(): T {\n return this.options.schema;\n }\n\n public get name(): string {\n return this.options.name ?? `${this.config.propertyKey}`;\n }\n\n /**\n * Sets the cookie with the given value in the current request's response.\n */\n public set(\n value: Static<T>,\n options?: { cookies?: Cookies; ttl?: DurationLike },\n ): void {\n this.serverCookiesProvider.setCookie(\n this.name,\n {\n ...this.options,\n ttl: options?.ttl ?? this.options.ttl,\n },\n value,\n options?.cookies,\n );\n }\n\n /**\n * Gets the cookie value from the current request. Returns undefined if not found or invalid.\n */\n public get(options?: { cookies?: Cookies }): Static<T> | undefined {\n return this.serverCookiesProvider.getCookie(\n this.name,\n this.options,\n options?.cookies,\n );\n }\n\n /**\n * Deletes the cookie in the current request's response.\n */\n public del(options?: { cookies?: Cookies }): void {\n this.serverCookiesProvider.deleteCookie(this.name, options?.cookies);\n }\n}\n\n$cookie[KIND] = CookiePrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface Cookies {\n req: Record<string, string>;\n res: Record<string, Cookie | null>;\n}\n\nexport interface Cookie {\n value: string;\n path?: string;\n maxAge?: number;\n secure?: boolean;\n httpOnly?: boolean;\n sameSite?: \"strict\" | \"lax\" | \"none\";\n domain?: string;\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { $cookie, type Cookies } from \"./primitives/$cookie.ts\";\nimport { ServerCookiesProvider } from \"./providers/ServerCookiesProvider.ts\";\nimport { CookieParser } from \"./services/CookieParser.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$cookie.ts\";\nexport * from \"./providers/ServerCookiesProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha/server\" {\n interface ServerRequest {\n cookies: Cookies;\n }\n}\n\n/**\n * Server and browser-safe cookie handling.\n *\n * **Features:**\n * - Cookie management on server and browser\n *\n * @module alepha.server.cookies\n */\nexport const AlephaServerCookies = $module({\n name: \"alepha.server.cookies\",\n primitives: [$cookie],\n services: [AlephaServer, ServerCookiesProvider, CookieParser],\n});\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { $inject, $module, Alepha, AlephaError, isFileLike, t } from "alepha";
1
+ import { $inject, $module, Alepha, AlephaError, TypeBoxError, isFileLike, t } from "alepha";
2
2
  import { $cache } from "alepha/cache";
3
3
  import { $logger } from "alepha/logger";
4
4
  //#region ../../src/server/core/errors/HttpError.ts
@@ -384,9 +384,16 @@ var UnauthorizedError = class extends HttpError {
384
384
  //#region ../../src/server/core/errors/ValidationError.ts
385
385
  var ValidationError = class extends HttpError {
386
386
  constructor(message = "Validation has failed", cause) {
387
+ let fullMessage = message;
388
+ let details;
389
+ if (cause instanceof TypeBoxError) {
390
+ fullMessage = `${message}: ${cause.cause.message}`;
391
+ if (cause.cause.instancePath) details = cause.cause.instancePath;
392
+ }
387
393
  super({
388
- message,
389
- status: 400
394
+ message: fullMessage,
395
+ status: 400,
396
+ details
390
397
  }, cause);
391
398
  }
392
399
  };
@@ -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 contentType?: string;\n requestBodyType?: string;\n}): boolean => {\n if (\n options.contentType === \"multipart/form-data\" ||\n options.requestBodyType === \"multipart/form-data\"\n ) {\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 AlephaError,\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 provider: \"memory\",\n name: \"http:client\",\n });\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 // Deduplicate concurrent identical requests for idempotent methods only.\n // Non-idempotent methods (POST, PUT, PATCH, DELETE) must always execute\n // since each call may produce a different side effect.\n const isIdempotent =\n request.method === \"GET\" ||\n request.method === \"HEAD\" ||\n request.method === \"OPTIONS\";\n const key =\n options.key ??\n (isIdempotent\n ? JSON.stringify({ url, method: request.method })\n : undefined);\n\n if (key) {\n const existing = this.pendingRequests[key];\n if (existing) {\n this.log.info(\"Request already pending\", key);\n return existing;\n }\n }\n\n const promise = 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 if (key) {\n delete this.pendingRequests[key];\n }\n });\n\n if (key) {\n this.pendingRequests[key] = promise;\n }\n\n return promise;\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 AlephaError(\"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 const params = new URLSearchParams(\n query as Record<string, string>,\n ).toString();\n return params ? `${url}?${params}` : url;\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 contentType?: 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 contentType?: string;\n requestBodyType?: string;\n}): boolean => {\n if (\n options.contentType === \"multipart/form-data\" ||\n options.requestBodyType === \"multipart/form-data\"\n ) {\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 AlephaError,\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 provider: \"memory\",\n name: \"http:client\",\n });\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 // Deduplicate concurrent identical requests for idempotent methods only.\n // Non-idempotent methods (POST, PUT, PATCH, DELETE) must always execute\n // since each call may produce a different side effect.\n const isIdempotent =\n request.method === \"GET\" ||\n request.method === \"HEAD\" ||\n request.method === \"OPTIONS\";\n const key =\n options.key ??\n (isIdempotent\n ? JSON.stringify({ url, method: request.method })\n : undefined);\n\n if (key) {\n const existing = this.pendingRequests[key];\n if (existing) {\n this.log.info(\"Request already pending\", key);\n return existing;\n }\n }\n\n const promise = 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 if (key) {\n delete this.pendingRequests[key];\n }\n });\n\n if (key) {\n this.pendingRequests[key] = promise;\n }\n\n return promise;\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 as Record<string, unknown>)[\"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 AlephaError(\"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 const params = new URLSearchParams(\n query as Record<string, string>,\n ).toString();\n return params ? `${url}?${params}` : url;\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 contentType?: 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 { TypeBoxError } from \"alepha\";\nimport { HttpError } from \"./HttpError.ts\";\n\nexport class ValidationError extends HttpError {\n constructor(message = \"Validation has failed\", cause?: unknown) {\n let fullMessage = message;\n let details: string | undefined;\n\n if (cause instanceof TypeBoxError) {\n fullMessage = `${message}: ${cause.cause.message}`;\n if (cause.cause.instancePath) {\n details = cause.cause.instancePath;\n }\n }\n\n super(\n {\n message: fullMessage,\n status: 400,\n details,\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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"}
@@ -10,7 +10,6 @@ import * as _$alepha_cache0 from "alepha/cache";
10
10
  import { IncomingMessage, Server, ServerResponse as ServerResponse$1 } from "node:http";
11
11
  import { ServerResponse as ServerResponse$2, ServerRoute as ServerRoute$1 } from "alepha/server";
12
12
  import { Socket } from "node:net";
13
- import * as _$typebox from "typebox";
14
13
 
15
14
  //#region ../../src/server/core/schemas/errorSchema.d.ts
16
15
  declare const errorSchema: _$alepha.TObject<{
@@ -1419,9 +1418,7 @@ declare class ServerHelmetProvider {
1419
1418
  xFrameOptions?: "DENY" | "SAMEORIGIN" | undefined;
1420
1419
  xXssProtection?: boolean | undefined;
1421
1420
  contentSecurityPolicy?: {
1422
- directives: _$typebox.StaticRecord<[], "Decode", {}, {
1423
- directives: _$alepha.TRecord<"^.*$", _$alepha.TAny>;
1424
- }, "^.*$", _$alepha.TAny>;
1421
+ directives: Record<string, any>;
1425
1422
  } | undefined;
1426
1423
  referrerPolicy?: "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url" | undefined;
1427
1424
  }>;
@@ -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/$circuit.ts","../../../src/server/core/primitives/$middleware.ts","../../../src/server/core/primitives/$route.ts","../../../src/server/core/primitives/$sse.ts","../../../src/server/core/providers/BunHttpServerProvider.ts","../../../src/server/core/providers/NodeHttpServerProvider.ts","../../../src/server/core/providers/ServerCompressProvider.ts","../../../src/server/core/providers/ServerHelmetProvider.ts","../../../src/server/core/providers/ServerLoggerProvider.ts","../../../src/server/core/providers/ServerMultipartProvider.ts","../../../src/server/core/providers/ServerNotReadyProvider.ts","../../../src/server/core/index.ts"],"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/$circuit.ts","../../../src/server/core/primitives/$middleware.ts","../../../src/server/core/primitives/$route.ts","../../../src/server/core/primitives/$sse.ts","../../../src/server/core/providers/BunHttpServerProvider.ts","../../../src/server/core/providers/NodeHttpServerProvider.ts","../../../src/server/core/providers/ServerCompressProvider.ts","../../../src/server/core/providers/ServerHelmetProvider.ts","../../../src/server/core/providers/ServerLoggerProvider.ts","../../../src/server/core/providers/ServerMultipartProvider.ts","../../../src/server/core/providers/ServerNotReadyProvider.ts","../../../src/server/core/index.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { $atom, $env, $hook, $inject, $module, $state, Alepha, AlephaError, KIND, PipelineHandler, PipelinePrimitive, Primitive, createMiddleware, createPrimitive, isFileLike, isTypeFile, t } from "alepha";
1
+ import { $atom, $env, $hook, $inject, $module, $state, Alepha, AlephaError, KIND, PipelineHandler, PipelinePrimitive, Primitive, TypeBoxError, createMiddleware, createPrimitive, isFileLike, isTypeFile, t } from "alepha";
2
2
  import { $logger } from "alepha/logger";
3
3
  import { Readable } from "node:stream";
4
4
  import { DateTimeProvider } from "alepha/datetime";
@@ -126,9 +126,16 @@ const errorNameByStatus = {
126
126
  //#region ../../src/server/core/errors/ValidationError.ts
127
127
  var ValidationError = class extends HttpError {
128
128
  constructor(message = "Validation has failed", cause) {
129
+ let fullMessage = message;
130
+ let details;
131
+ if (cause instanceof TypeBoxError) {
132
+ fullMessage = `${message}: ${cause.cause.message}`;
133
+ if (cause.cause.instancePath) details = cause.cause.instancePath;
134
+ }
129
135
  super({
130
- message,
131
- status: 400
136
+ message: fullMessage,
137
+ status: 400,
138
+ details
132
139
  }, cause);
133
140
  }
134
141
  };
@@ -205,7 +212,16 @@ var UserAgentParser = class {
205
212
  };
206
213
  //#endregion
207
214
  //#region ../../src/server/core/services/ServerRequestParser.ts
208
- const envSchema$2 = t.object({ TRUST_PROXY: t.boolean({
215
+ const envSchema$2 = t.object({
216
+ /**
217
+ * Trust proxy headers (X-Forwarded-For, X-Real-IP) for client IP resolution.
218
+ *
219
+ * Default: true (modern deployments are typically behind a reverse proxy)
220
+ *
221
+ * Set to false only if your server accepts direct connections without a proxy
222
+ * and you want to use the raw connection IP.
223
+ */
224
+ TRUST_PROXY: t.boolean({
209
225
  default: true,
210
226
  description: "Trust proxy headers for client IP"
211
227
  }) });
@@ -770,7 +786,7 @@ var ServerRouterProvider = class extends RouterProvider {
770
786
  reply.body = JSON.stringify(errorJson);
771
787
  return;
772
788
  }
773
- if ("status" in error && typeof error.status === "number" && !!errorNameByStatus[error.status]) {
789
+ if ("status" in error && typeof error.status === "number" && errorNameByStatus[error.status]) {
774
790
  const status = error.status;
775
791
  reply.status = status;
776
792
  reply.headers["content-type"] = "application/json";
@@ -810,7 +826,16 @@ var ServerRouterProvider = class extends RouterProvider {
810
826
  throw new ValidationError("Invalid request query", error);
811
827
  }
812
828
  if (route.schema?.headers) try {
813
- request.headers = this.alepha.codec.validate(route.schema.headers, request.headers);
829
+ const schemaHeaders = route.schema.headers;
830
+ const decoded = {};
831
+ for (const key of Object.keys(schemaHeaders.properties)) {
832
+ const lcKey = key.toLowerCase();
833
+ const value = request.headers[lcKey];
834
+ if (value == null) continue;
835
+ decoded[key] = this.alepha.codec.decode(schemaHeaders.properties[key], value);
836
+ }
837
+ this.alepha.codec.validate(schemaHeaders, decoded);
838
+ for (const [key, value] of Object.entries(decoded)) request.headers[key.toLowerCase()] = value;
814
839
  } catch (error) {
815
840
  throw new ValidationError("Invalid request header", error);
816
841
  }
@@ -1074,7 +1099,7 @@ var ServerProvider = class {
1074
1099
  if (this.alepha.isViteDev()) {
1075
1100
  if (!route) return true;
1076
1101
  url = url?.split("?")[0];
1077
- if (!!params?.["*"] && `/${params?.["*"]}` === url) return true;
1102
+ if (params?.["*"] && `/${params?.["*"]}` === url) return true;
1078
1103
  }
1079
1104
  return false;
1080
1105
  }
@@ -1513,7 +1538,14 @@ var ActionPrimitive = class extends PipelinePrimitive {
1513
1538
  if (serverActionRequest.reply?.body) return serverActionRequest.reply.body;
1514
1539
  const executeHandler = async () => {
1515
1540
  if (serverActionRequest.query && this.options.schema?.query) serverActionRequest.query = this.alepha.codec.encode(this.options.schema.query, serverActionRequest.query);
1516
- if (serverActionRequest.headers && this.options.schema?.headers) serverActionRequest.headers = this.alepha.codec.encode(this.options.schema.headers, serverActionRequest.headers);
1541
+ if (serverActionRequest.headers && this.options.schema?.headers) {
1542
+ const schemaHeaders = this.options.schema.headers;
1543
+ const headers = serverActionRequest.headers;
1544
+ for (const key of Object.keys(schemaHeaders.properties)) {
1545
+ const lcKey = key.toLowerCase();
1546
+ if (headers[lcKey] !== void 0) headers[lcKey] = this.alepha.codec.encode(schemaHeaders.properties[key], headers[lcKey]);
1547
+ }
1548
+ }
1517
1549
  if (serverActionRequest.body && this.options.schema?.body) serverActionRequest.body = this.alepha.codec.encode(this.options.schema.body, serverActionRequest.body);
1518
1550
  if (serverActionRequest.params && this.options.schema?.params) serverActionRequest.params = this.alepha.codec.encode(this.options.schema.params, serverActionRequest.params);
1519
1551
  this.serverRouterProvider.validateRequest(this.options, serverActionRequest);
@@ -2085,7 +2117,13 @@ var NodeHttpServerProvider = class extends ServerProvider {
2085
2117
  /**
2086
2118
  * Server options.
2087
2119
  */
2088
- options = { shutdownTimeout: 1e4 };
2120
+ options = {
2121
+ /**
2122
+ * Graceful shutdown timeout in ms.
2123
+ * After this, remaining connections are forcefully closed.
2124
+ * @default 30000
2125
+ */
2126
+ shutdownTimeout: 1e4 };
2089
2127
  get hostname() {
2090
2128
  if (this.server?.listening) {
2091
2129
  const address = this.server.address();