alepha 0.12.1 → 0.13.1

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 (198) hide show
  1. package/dist/api-notifications/index.d.ts +111 -111
  2. package/dist/api-users/index.d.ts +1240 -1240
  3. package/dist/api-verifications/index.d.ts +94 -94
  4. package/dist/cli/{dist-Sz2EXvQX.cjs → dist-Dl9Vl7Ur.js} +17 -13
  5. package/dist/cli/{dist-BBPjuQ56.js.map → dist-Dl9Vl7Ur.js.map} +1 -1
  6. package/dist/cli/index.d.ts +3 -11
  7. package/dist/cli/index.js +106 -74
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/email/index.js +71 -73
  10. package/dist/email/index.js.map +1 -1
  11. package/dist/orm/index.d.ts +1 -1
  12. package/dist/orm/index.js.map +1 -1
  13. package/dist/queue/index.d.ts +4 -4
  14. package/dist/redis/index.d.ts +10 -10
  15. package/dist/retry/index.d.ts +1 -1
  16. package/dist/retry/index.js +2 -2
  17. package/dist/retry/index.js.map +1 -1
  18. package/dist/scheduler/index.d.ts +6 -6
  19. package/dist/server/index.js +1 -1
  20. package/dist/server/index.js.map +1 -1
  21. package/dist/server-auth/index.d.ts +193 -193
  22. package/dist/server-health/index.d.ts +17 -17
  23. package/dist/server-links/index.d.ts +34 -34
  24. package/dist/server-metrics/index.js +170 -174
  25. package/dist/server-metrics/index.js.map +1 -1
  26. package/dist/server-security/index.d.ts +9 -9
  27. package/dist/vite/index.js +4 -5
  28. package/dist/vite/index.js.map +1 -1
  29. package/dist/websocket/index.d.ts +7 -7
  30. package/package.json +52 -103
  31. package/src/cli/apps/AlephaPackageBuilderCli.ts +7 -2
  32. package/src/cli/assets/appRouterTs.ts +9 -0
  33. package/src/cli/assets/indexHtml.ts +2 -1
  34. package/src/cli/assets/mainBrowserTs.ts +10 -0
  35. package/src/cli/commands/CoreCommands.ts +6 -5
  36. package/src/cli/commands/DrizzleCommands.ts +65 -57
  37. package/src/cli/commands/VerifyCommands.ts +1 -1
  38. package/src/cli/services/ProjectUtils.ts +44 -38
  39. package/src/orm/providers/DrizzleKitProvider.ts +1 -1
  40. package/src/retry/descriptors/$retry.ts +5 -3
  41. package/src/server/providers/NodeHttpServerProvider.ts +1 -1
  42. package/src/vite/helpers/boot.ts +3 -3
  43. package/dist/api-files/index.cjs +0 -1293
  44. package/dist/api-files/index.cjs.map +0 -1
  45. package/dist/api-files/index.d.cts +0 -829
  46. package/dist/api-jobs/index.cjs +0 -274
  47. package/dist/api-jobs/index.cjs.map +0 -1
  48. package/dist/api-jobs/index.d.cts +0 -654
  49. package/dist/api-notifications/index.cjs +0 -380
  50. package/dist/api-notifications/index.cjs.map +0 -1
  51. package/dist/api-notifications/index.d.cts +0 -289
  52. package/dist/api-parameters/index.cjs +0 -66
  53. package/dist/api-parameters/index.cjs.map +0 -1
  54. package/dist/api-parameters/index.d.cts +0 -84
  55. package/dist/api-users/index.cjs +0 -6009
  56. package/dist/api-users/index.cjs.map +0 -1
  57. package/dist/api-users/index.d.cts +0 -4740
  58. package/dist/api-verifications/index.cjs +0 -407
  59. package/dist/api-verifications/index.cjs.map +0 -1
  60. package/dist/api-verifications/index.d.cts +0 -207
  61. package/dist/batch/index.cjs +0 -408
  62. package/dist/batch/index.cjs.map +0 -1
  63. package/dist/batch/index.d.cts +0 -330
  64. package/dist/bin/index.cjs +0 -17
  65. package/dist/bin/index.cjs.map +0 -1
  66. package/dist/bin/index.d.cts +0 -1
  67. package/dist/bucket/index.cjs +0 -303
  68. package/dist/bucket/index.cjs.map +0 -1
  69. package/dist/bucket/index.d.cts +0 -355
  70. package/dist/cache/index.cjs +0 -241
  71. package/dist/cache/index.cjs.map +0 -1
  72. package/dist/cache/index.d.cts +0 -202
  73. package/dist/cache-redis/index.cjs +0 -84
  74. package/dist/cache-redis/index.cjs.map +0 -1
  75. package/dist/cache-redis/index.d.cts +0 -40
  76. package/dist/cli/chunk-DSlc6foC.cjs +0 -43
  77. package/dist/cli/dist-BBPjuQ56.js +0 -2778
  78. package/dist/cli/dist-Sz2EXvQX.cjs.map +0 -1
  79. package/dist/cli/index.cjs +0 -1241
  80. package/dist/cli/index.cjs.map +0 -1
  81. package/dist/cli/index.d.cts +0 -422
  82. package/dist/command/index.cjs +0 -693
  83. package/dist/command/index.cjs.map +0 -1
  84. package/dist/command/index.d.cts +0 -340
  85. package/dist/core/index.cjs +0 -2264
  86. package/dist/core/index.cjs.map +0 -1
  87. package/dist/core/index.d.cts +0 -1927
  88. package/dist/datetime/index.cjs +0 -318
  89. package/dist/datetime/index.cjs.map +0 -1
  90. package/dist/datetime/index.d.cts +0 -145
  91. package/dist/email/index.cjs +0 -10874
  92. package/dist/email/index.cjs.map +0 -1
  93. package/dist/email/index.d.cts +0 -186
  94. package/dist/fake/index.cjs +0 -34641
  95. package/dist/fake/index.cjs.map +0 -1
  96. package/dist/fake/index.d.cts +0 -74
  97. package/dist/file/index.cjs +0 -1212
  98. package/dist/file/index.cjs.map +0 -1
  99. package/dist/file/index.d.cts +0 -698
  100. package/dist/lock/index.cjs +0 -226
  101. package/dist/lock/index.cjs.map +0 -1
  102. package/dist/lock/index.d.cts +0 -361
  103. package/dist/lock-redis/index.cjs +0 -113
  104. package/dist/lock-redis/index.cjs.map +0 -1
  105. package/dist/lock-redis/index.d.cts +0 -24
  106. package/dist/logger/index.cjs +0 -521
  107. package/dist/logger/index.cjs.map +0 -1
  108. package/dist/logger/index.d.cts +0 -281
  109. package/dist/orm/index.cjs +0 -2986
  110. package/dist/orm/index.cjs.map +0 -1
  111. package/dist/orm/index.d.cts +0 -2213
  112. package/dist/queue/index.cjs +0 -1044
  113. package/dist/queue/index.cjs.map +0 -1
  114. package/dist/queue/index.d.cts +0 -1265
  115. package/dist/queue-redis/index.cjs +0 -873
  116. package/dist/queue-redis/index.cjs.map +0 -1
  117. package/dist/queue-redis/index.d.cts +0 -82
  118. package/dist/redis/index.cjs +0 -153
  119. package/dist/redis/index.cjs.map +0 -1
  120. package/dist/redis/index.d.cts +0 -82
  121. package/dist/retry/index.cjs +0 -146
  122. package/dist/retry/index.cjs.map +0 -1
  123. package/dist/retry/index.d.cts +0 -172
  124. package/dist/router/index.cjs +0 -111
  125. package/dist/router/index.cjs.map +0 -1
  126. package/dist/router/index.d.cts +0 -46
  127. package/dist/scheduler/index.cjs +0 -576
  128. package/dist/scheduler/index.cjs.map +0 -1
  129. package/dist/scheduler/index.d.cts +0 -145
  130. package/dist/security/index.cjs +0 -2402
  131. package/dist/security/index.cjs.map +0 -1
  132. package/dist/security/index.d.cts +0 -598
  133. package/dist/server/index.cjs +0 -1680
  134. package/dist/server/index.cjs.map +0 -1
  135. package/dist/server/index.d.cts +0 -810
  136. package/dist/server-auth/index.cjs +0 -3146
  137. package/dist/server-auth/index.cjs.map +0 -1
  138. package/dist/server-auth/index.d.cts +0 -1164
  139. package/dist/server-cache/index.cjs +0 -252
  140. package/dist/server-cache/index.cjs.map +0 -1
  141. package/dist/server-cache/index.d.cts +0 -164
  142. package/dist/server-compress/index.cjs +0 -141
  143. package/dist/server-compress/index.cjs.map +0 -1
  144. package/dist/server-compress/index.d.cts +0 -38
  145. package/dist/server-cookies/index.cjs +0 -234
  146. package/dist/server-cookies/index.cjs.map +0 -1
  147. package/dist/server-cookies/index.d.cts +0 -144
  148. package/dist/server-cors/index.cjs +0 -201
  149. package/dist/server-cors/index.cjs.map +0 -1
  150. package/dist/server-cors/index.d.cts +0 -140
  151. package/dist/server-health/index.cjs +0 -62
  152. package/dist/server-health/index.cjs.map +0 -1
  153. package/dist/server-health/index.d.cts +0 -58
  154. package/dist/server-helmet/index.cjs +0 -131
  155. package/dist/server-helmet/index.cjs.map +0 -1
  156. package/dist/server-helmet/index.d.cts +0 -97
  157. package/dist/server-links/index.cjs +0 -992
  158. package/dist/server-links/index.cjs.map +0 -1
  159. package/dist/server-links/index.d.cts +0 -513
  160. package/dist/server-metrics/index.cjs +0 -4535
  161. package/dist/server-metrics/index.cjs.map +0 -1
  162. package/dist/server-metrics/index.d.cts +0 -35
  163. package/dist/server-multipart/index.cjs +0 -237
  164. package/dist/server-multipart/index.cjs.map +0 -1
  165. package/dist/server-multipart/index.d.cts +0 -50
  166. package/dist/server-proxy/index.cjs +0 -186
  167. package/dist/server-proxy/index.cjs.map +0 -1
  168. package/dist/server-proxy/index.d.cts +0 -234
  169. package/dist/server-rate-limit/index.cjs +0 -241
  170. package/dist/server-rate-limit/index.cjs.map +0 -1
  171. package/dist/server-rate-limit/index.d.cts +0 -183
  172. package/dist/server-security/index.cjs +0 -316
  173. package/dist/server-security/index.cjs.map +0 -1
  174. package/dist/server-security/index.d.cts +0 -173
  175. package/dist/server-static/index.cjs +0 -170
  176. package/dist/server-static/index.cjs.map +0 -1
  177. package/dist/server-static/index.d.cts +0 -121
  178. package/dist/server-swagger/index.cjs +0 -1021
  179. package/dist/server-swagger/index.cjs.map +0 -1
  180. package/dist/server-swagger/index.d.cts +0 -382
  181. package/dist/sms/index.cjs +0 -221
  182. package/dist/sms/index.cjs.map +0 -1
  183. package/dist/sms/index.d.cts +0 -130
  184. package/dist/thread/index.cjs +0 -350
  185. package/dist/thread/index.cjs.map +0 -1
  186. package/dist/thread/index.d.cts +0 -260
  187. package/dist/topic/index.cjs +0 -282
  188. package/dist/topic/index.cjs.map +0 -1
  189. package/dist/topic/index.d.cts +0 -523
  190. package/dist/topic-redis/index.cjs +0 -71
  191. package/dist/topic-redis/index.cjs.map +0 -1
  192. package/dist/topic-redis/index.d.cts +0 -42
  193. package/dist/vite/index.cjs +0 -1077
  194. package/dist/vite/index.cjs.map +0 -1
  195. package/dist/vite/index.d.cts +0 -542
  196. package/dist/websocket/index.cjs +0 -1117
  197. package/dist/websocket/index.cjs.map +0 -1
  198. package/dist/websocket/index.d.cts +0 -861
@@ -1,4 +1,4 @@
1
- import * as alepha1 from "alepha";
1
+ import * as alepha5 from "alepha";
2
2
  import { Alepha, Descriptor, KIND } from "alepha";
3
3
  import { JwtProvider, Permission, SecurityProvider, UserAccount, UserAccountToken } from "alepha/security";
4
4
  import { FetchOptions, ServerRequest, ServerRouterProvider } from "alepha/server";
@@ -28,15 +28,15 @@ declare class ServerBasicAuthProvider {
28
28
  * Register a basic auth configuration (called by descriptors)
29
29
  */
30
30
  registerAuth(config: BasicAuthDescriptorConfig): void;
31
- readonly onStart: alepha1.HookDescriptor<"start">;
31
+ readonly onStart: alepha5.HookDescriptor<"start">;
32
32
  /**
33
33
  * Hook into server:onRequest to check basic auth
34
34
  */
35
- readonly onRequest: alepha1.HookDescriptor<"server:onRequest">;
35
+ readonly onRequest: alepha5.HookDescriptor<"server:onRequest">;
36
36
  /**
37
37
  * Hook into action:onRequest to check basic auth for actions
38
38
  */
39
- readonly onActionRequest: alepha1.HookDescriptor<"action:onRequest">;
39
+ readonly onActionRequest: alepha5.HookDescriptor<"action:onRequest">;
40
40
  /**
41
41
  * Check basic authentication
42
42
  */
@@ -66,9 +66,9 @@ declare class ServerSecurityProvider {
66
66
  protected readonly securityProvider: SecurityProvider;
67
67
  protected readonly jwtProvider: JwtProvider;
68
68
  protected readonly alepha: Alepha;
69
- protected readonly onConfigure: alepha1.HookDescriptor<"configure">;
70
- protected readonly onActionRequest: alepha1.HookDescriptor<"action:onRequest">;
71
- protected readonly onRequest: alepha1.HookDescriptor<"server:onRequest">;
69
+ protected readonly onConfigure: alepha5.HookDescriptor<"configure">;
70
+ protected readonly onActionRequest: alepha5.HookDescriptor<"action:onRequest">;
71
+ protected readonly onRequest: alepha5.HookDescriptor<"server:onRequest">;
72
72
  protected check(user: UserAccountToken, secure: ServerRouteSecure): void;
73
73
  /**
74
74
  * Get the user account token for a local action call.
@@ -85,7 +85,7 @@ declare class ServerSecurityProvider {
85
85
  user?: UserAccountToken | "system" | "context";
86
86
  }, permission?: Permission): UserAccountToken;
87
87
  protected createTestUser(): UserAccountToken;
88
- protected readonly onClientRequest: alepha1.HookDescriptor<"client:onRequest">;
88
+ protected readonly onClientRequest: alepha5.HookDescriptor<"client:onRequest">;
89
89
  }
90
90
  type ServerRouteSecure = {
91
91
  realm?: string;
@@ -167,7 +167,7 @@ declare module "alepha/server" {
167
167
  * @see {@link ServerSecurityProvider}
168
168
  * @module alepha.server.security
169
169
  */
170
- declare const AlephaServerSecurity: alepha1.Service<alepha1.Module>;
170
+ declare const AlephaServerSecurity: alepha5.Service<alepha5.Module>;
171
171
  //#endregion
172
172
  export { $basicAuth, AbstractBasicAuthDescriptor, AlephaServerSecurity, BasicAuthDescriptor, BasicAuthDescriptorConfig, BasicAuthOptions, ServerBasicAuthProvider, ServerRouteSecure, ServerSecurityProvider, isBasicAuth };
173
173
  //# sourceMappingURL=index.d.ts.map
@@ -39,23 +39,22 @@ const getServerEntry = async (root = process.cwd(), explicitEntry) => {
39
39
  throw new AlephaError(`Explicit server entry file "${explicitEntry}" not found.`);
40
40
  }
41
41
  }
42
- for (const entry of [
43
- "src/index.server.ts",
42
+ const maybeEntry = [
44
43
  "src/main.server.ts",
45
44
  "src/server-entry.ts",
46
- "src/index.server.tsx",
47
45
  "src/main.server.tsx",
48
46
  "src/server-entry.tsx",
49
47
  "src/main.ts",
50
48
  "src/main.tsx"
51
- ]) try {
49
+ ];
50
+ for (const entry of maybeEntry) try {
52
51
  const path$1 = join(root, entry).replace(/\\/g, "/");
53
52
  await access(path$1);
54
53
  return path$1;
55
54
  } catch {}
56
55
  const clientEntry = await getClientEntry(root);
57
56
  if (clientEntry) return clientEntry;
58
- throw new AlephaError(`Could not find a server entry file.`);
57
+ throw new AlephaError(`Could not find a server entry file. List of supported entry file: ${maybeEntry.join(", ")}`);
59
58
  };
60
59
  /**
61
60
  * Extract first module script src from HTML.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["path","match: RegExpExecArray | null","entries: BufferedLogEntry[]","path","_error","gzipCb","brotliCompress","brotliCompressCb","compressionTasks: Promise<void>[]","fs","gzip","plugins: any[]","compress: ViteCompressOptions | undefined","viteAnalyzer","viteBuildClientConfig: UserConfig","deps: Record<string, string>","plugins: any[]","viteAnalyzer","viteBuildServerConfig: UserConfig","result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[]","externals: string[]","WARNING_COMMENT","urls: string[]","path","it: any","path","rootConfig: UserConfig","plugins: (Plugin | Promise<Plugin>)[] & { [OPTIONS]?: any }"],"sources":["../../src/vite/helpers/boot.ts","../../src/vite/helpers/createBufferedLogger.ts","../../src/vite/helpers/fileExists.ts","../../src/vite/helpers/importVite.ts","../../src/vite/plugins/viteCompress.ts","../../src/vite/tasks/buildClient.ts","../../src/vite/tasks/generateExternals.ts","../../src/vite/tasks/buildServer.ts","../../src/vite/helpers/importAlepha.ts","../../src/vite/tasks/copyAssets.ts","../../src/vite/tasks/generateCloudflare.ts","../../src/vite/tasks/generateDocker.ts","../../src/vite/tasks/generateSitemap.ts","../../src/vite/tasks/generateVercel.ts","../../src/vite/tasks/prerenderPages.ts","../../src/vite/tasks/runAlepha.ts","../../src/vite/plugins/viteAlephaBuild.ts","../../src/vite/plugins/viteAlephaDev.ts","../../src/vite/plugins/viteAlepha.ts","../../src/vite/index.ts"],"sourcesContent":["import { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AlephaError } from \"alepha\";\n\n/**\n * Remember:\n * At first, functions was inside alepha/vite package, but it's now used in alepha too.\n * For avoiding cli -> vite, all code moved here.\n */\n\n/**\n * Find browser/client entry file path.\n */\nconst getClientEntry = async (\n root = process.cwd(),\n): Promise<string | undefined> => {\n const indexPath = join(root, \"index.html\");\n try {\n const html = await readFile(indexPath, \"utf8\");\n return extractFirstModuleScriptSrc(html).replace(/\\\\/g, \"/\");\n } catch {\n return undefined;\n }\n};\n\n/**\n * Find server entry file path.\n */\nconst getServerEntry = async (\n root = process.cwd(),\n explicitEntry?: string,\n): Promise<string> => {\n if (explicitEntry) {\n const explicitPath = join(root, explicitEntry);\n try {\n await access(explicitPath);\n return explicitPath;\n } catch {\n throw new AlephaError(\n `Explicit server entry file \"${explicitEntry}\" not found.`,\n );\n }\n }\n\n const maybeEntry = [\n \"src/index.server.ts\",\n \"src/main.server.ts\",\n \"src/server-entry.ts\",\n \"src/index.server.tsx\",\n \"src/main.server.tsx\",\n \"src/server-entry.tsx\",\n \"src/main.ts\",\n \"src/main.tsx\",\n ];\n\n for (const entry of maybeEntry) {\n try {\n const path = join(root, entry).replace(/\\\\/g, \"/\");\n await access(path);\n return path;\n } catch {\n // continue to next entry\n }\n }\n\n const clientEntry = await getClientEntry(root);\n if (clientEntry) {\n return clientEntry;\n }\n\n throw new AlephaError(`Could not find a server entry file.`);\n};\n\n/**\n * Extract first module script src from HTML.\n */\nfunction extractFirstModuleScriptSrc(html: string): string {\n const scriptRegex = /<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi;\n let match: RegExpExecArray | null = scriptRegex.exec(html);\n\n while (match) {\n const tag = match[0];\n\n // Check for type=\"module\"\n if (/type=[\"']module[\"']/i.test(tag)) {\n // Extract the src value\n const srcMatch = tag.match(/\\bsrc=[\"']([^\"']+)[\"']/i);\n const entry = srcMatch?.[1];\n if (entry) {\n if (entry.startsWith(\"/\")) {\n return entry.substring(1); // Remove leading slash\n }\n return entry;\n }\n }\n\n match = scriptRegex.exec(html);\n }\n\n throw new AlephaError(`No module script found in the provided HTML.`);\n}\n\nexport const boot = {\n getClientEntry,\n getServerEntry,\n};\n","import type { Logger } from \"vite\";\n\ninterface BufferedLogEntry {\n level: \"info\" | \"warn\" | \"error\";\n msg: string;\n timestamp: Date;\n}\n\nexport interface BufferedLogger extends Logger {\n /**\n * Flush all buffered log messages to console.\n * Call this on build failure to show what happened.\n */\n flush(): void;\n\n /**\n * Get all buffered log entries.\n */\n getEntries(): BufferedLogEntry[];\n\n /**\n * Clear all buffered entries without printing.\n */\n clear(): void;\n}\n\n/**\n * Creates a Vite logger that buffers all messages instead of printing them.\n * Useful for silent builds that only show output on failure.\n *\n * @example\n * ```ts\n * const logger = createBufferedLogger();\n * try {\n * await viteBuild({ customLogger: logger, logLevel: 'info' });\n * } catch (error) {\n * logger.flush(); // Print all buffered logs\n * throw error;\n * }\n * ```\n */\nexport function createBufferedLogger(): BufferedLogger {\n const entries: BufferedLogEntry[] = [];\n const loggedErrors = new WeakSet<Error>();\n const warnedMessages = new Set<string>();\n let hasWarned = false;\n\n const logger: BufferedLogger = {\n get hasWarned() {\n return hasWarned;\n },\n\n info(msg: string) {\n entries.push({ level: \"info\", msg, timestamp: new Date() });\n },\n\n warn(msg: string) {\n hasWarned = true;\n entries.push({ level: \"warn\", msg, timestamp: new Date() });\n },\n\n warnOnce(msg: string) {\n if (warnedMessages.has(msg)) {\n return;\n }\n warnedMessages.add(msg);\n hasWarned = true;\n entries.push({ level: \"warn\", msg, timestamp: new Date() });\n },\n\n error(msg: string, options?: { error?: Error | null }) {\n if (options?.error) {\n loggedErrors.add(options.error);\n }\n entries.push({ level: \"error\", msg, timestamp: new Date() });\n },\n\n clearScreen() {\n // No-op in buffered mode - we don't clear anything\n },\n\n hasErrorLogged(error: Error): boolean {\n return loggedErrors.has(error);\n },\n\n flush() {\n for (const entry of entries) {\n const prefix =\n entry.level === \"error\"\n ? \"\\x1b[31m✖\\x1b[0m\"\n : entry.level === \"warn\"\n ? \"\\x1b[33m⚠\\x1b[0m\"\n : \"\\x1b[36mℹ\\x1b[0m\";\n console.log(`${prefix} ${entry.msg}`);\n }\n },\n\n getEntries() {\n return [...entries];\n },\n\n clear() {\n entries.length = 0;\n warnedMessages.clear();\n hasWarned = false;\n },\n };\n\n return logger;\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const fileExists = async (path: string): Promise<boolean> => {\n return await access(join(process.cwd(), path))\n .then(() => true)\n .catch(() => false);\n};\n","import { createRequire } from \"node:module\";\nimport type * as vite from \"vite\";\n\nexport const importVite = async (): Promise<typeof vite> => {\n try {\n return createRequire(import.meta.url)(\"rolldown-vite\");\n } catch (_error) {\n try {\n return createRequire(import.meta.url)(\"vite\");\n } catch (_error) {\n throw new Error(\n \"Vite is not installed. Please install it with `npm install vite`.\",\n );\n }\n }\n};\n","import { promises as fs } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport {\n type BrotliOptions,\n brotliCompress as brotliCompressCb,\n gzip as gzipCb,\n type ZlibOptions,\n} from \"node:zlib\";\nimport type { Plugin } from \"vite\";\n\nconst gzipCompress = promisify(gzipCb);\nconst brotliCompress = promisify(brotliCompressCb);\n\nexport interface ViteCompressOptions {\n /**\n * If true, the plugin will not compress the files.\n *\n * @default false\n */\n disabled?: boolean;\n\n /**\n * If true, the plugin will compress the files using brotli.\n * Can also be an object with brotli options.\n *\n * @default true\n */\n brotli?: boolean | BrotliOptions;\n\n /**\n * If true, the plugin will compress the files using gzip.\n * Can also be an object with gzip options.\n *\n * @default true\n */\n gzip?: boolean | ZlibOptions;\n\n /**\n * A filter to determine which files to compress.\n * Can be a RegExp or a function that returns true for files to compress.\n *\n * @default /\\.(js|mjs|cjs|css|wasm|svg|html)$/\n */\n filter?: RegExp | ((fileName: string) => boolean);\n}\n\nexport function viteCompress(options: ViteCompressOptions = {}): Plugin {\n const { disabled = false, filter = /\\.(js|mjs|cjs|css|wasm|svg)$/ } = options;\n\n return {\n name: \"compress\",\n apply: \"build\",\n async writeBundle(outputOptions, bundle) {\n if (disabled) {\n return;\n }\n\n const now = Date.now();\n\n const outputDir = outputOptions.dir || resolve(process.cwd(), \"dist\");\n\n const files = Object.keys(bundle)\n .filter((fileName) => {\n // [feature]: filter\n if (typeof filter === \"function\") {\n return filter(fileName);\n }\n return filter.test(fileName);\n })\n .map((fileName) => ({\n fileName,\n filePath: join(outputDir, fileName),\n }));\n\n // Compress each file\n const compressionTasks: Promise<void>[] = [];\n\n for (const { filePath } of files) {\n compressionTasks.push(compressFile(options, filePath));\n }\n\n // Wait for all compression tasks to complete\n await Promise.all(compressionTasks);\n\n this.info(\n `Compressed ${files.length} file${files.length > 1 ? \"s\" : \"\"} in ${Date.now() - now}ms.`,\n );\n },\n };\n}\n\nexport async function compressFile(\n options: ViteCompressOptions = {},\n filePath: string,\n) {\n const { brotli = true, gzip = true } = options;\n\n const compressionTasks: Promise<void>[] = [];\n\n const fileContentPromise = fs.readFile(filePath);\n\n if (gzip) {\n const gzipOptions =\n typeof gzip === \"object\"\n ? gzip\n : {\n level: 9, // default gzip compression level\n };\n compressionTasks.push(\n fileContentPromise.then(async (content) => {\n const compressed = await gzipCompress(content, gzipOptions);\n await fs.writeFile(`${filePath}.gz`, compressed);\n }),\n );\n }\n\n if (brotli) {\n const brotliOptions = typeof brotli === \"object\" ? brotli : {};\n compressionTasks.push(\n fileContentPromise.then(async (content) => {\n const compressed = await brotliCompress(content, brotliOptions);\n await fs.writeFile(`${filePath}.br`, compressed);\n }),\n );\n }\n\n await Promise.all(compressionTasks);\n}\n","import type { UserConfig } from \"vite\";\nimport { analyzer as viteAnalyzer } from \"vite-bundle-analyzer\";\nimport { createBufferedLogger } from \"../helpers/createBufferedLogger.ts\";\nimport { importVite } from \"../helpers/importVite.ts\";\nimport {\n type ViteCompressOptions,\n viteCompress,\n} from \"../plugins/viteCompress.ts\";\n\nexport interface BuildClientOptions {\n /**\n * Output directory for client build.\n */\n dist: string;\n\n /**\n * If true, precompress assets using gzip and brotli compression.\n *\n * @default false\n */\n precompress?: ViteCompressOptions | boolean;\n\n /**\n * If true, prerender all static routes found in the $pages directory.\n *\n * @default false\n */\n prerender?: boolean;\n\n /**\n * Build a sitemap.xml file based on the $pages routes.\n */\n sitemap?: {\n hostname: string;\n };\n\n /**\n * Override Vite config options.\n */\n config?: UserConfig;\n\n /**\n * If true, generate build stats report.\n */\n stats?: boolean;\n\n /**\n * If true, suppress build output. Logs are buffered and only shown on failure.\n *\n * @default false\n */\n silent?: boolean;\n}\n\n/**\n * Build client-side bundle with Vite.\n *\n * This task compiles the browser/client code for production,\n * including code splitting, minification, and optional compression.\n */\nexport async function buildClient(opts: BuildClientOptions): Promise<void> {\n const { build: viteBuild, mergeConfig } = await importVite();\n const plugins: any[] = [];\n\n const compress: ViteCompressOptions | undefined = opts.precompress\n ? typeof opts.precompress === \"object\"\n ? opts.precompress\n : {}\n : undefined;\n\n if (opts.stats) {\n plugins.push(\n viteAnalyzer({\n analyzerMode: \"static\",\n }),\n );\n }\n\n if (opts.precompress && compress) {\n plugins.push(viteCompress(compress));\n }\n\n // Create buffered logger for silent mode\n const logger = opts.silent ? createBufferedLogger() : undefined;\n\n const viteBuildClientConfig: UserConfig = {\n mode: \"production\",\n logLevel: opts.silent ? \"silent\" : undefined,\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n },\n publicDir: \"public\",\n build: {\n chunkSizeWarningLimit: 1000,\n outDir: opts.dist,\n rollupOptions: {\n output: {\n entryFileNames: \"entry.[hash].js\",\n chunkFileNames: \"chunk.[hash].js\",\n assetFileNames: \"asset.[hash][extname]\",\n },\n },\n },\n esbuild: { legalComments: \"none\" },\n customLogger: logger,\n plugins,\n };\n\n try {\n await viteBuild(mergeConfig(viteBuildClientConfig, opts.config ?? {}));\n } catch (error) {\n // Flush buffered logs on failure so user can see what happened\n logger?.flush();\n throw error;\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport m from \"node:module\";\nimport { join } from \"node:path\";\n\nexport interface GenerateExternalsOptions {\n /**\n * Output directory for package.json.\n */\n distDir: string;\n\n /**\n * List of external package names.\n */\n externals: string[];\n}\n\n/**\n * Generate minimal package.json with pinned external dependencies.\n *\n * This task creates a package.json in the dist directory containing\n * only the external dependencies needed at runtime, with their versions\n * pinned to the currently installed versions.\n */\nexport async function generateExternals(\n opts: GenerateExternalsOptions,\n): Promise<void> {\n const require = m.createRequire(import.meta.filename);\n const deps: Record<string, string> = {};\n\n for (const dep of opts.externals) {\n try {\n const requirePath = require.resolve(dep);\n const pkgPath = `${requirePath.split(`node_modules/${dep}`)[0]}node_modules/${dep}/package.json`;\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n deps[dep] = `^${pkg.version}`;\n } catch (_err) {\n console.warn(`[generateExternals] Cannot find '${dep}' in node_modules`);\n }\n }\n\n const minimalPkg = {\n type: \"module\",\n main: \"index.js\",\n dependencies: deps,\n };\n\n await mkdir(opts.distDir, { recursive: true });\n\n const target = join(opts.distDir, \"package.json\");\n await writeFile(target, JSON.stringify(minimalPkg, null, 2), \"utf-8\");\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AlephaError } from \"alepha\";\nimport type * as vite from \"vite\";\nimport type { UserConfig } from \"vite\";\nimport { analyzer as viteAnalyzer } from \"vite-bundle-analyzer\";\nimport { createBufferedLogger } from \"../helpers/createBufferedLogger.ts\";\nimport { importVite } from \"../helpers/importVite.ts\";\nimport { generateExternals } from \"./generateExternals.ts\";\n\nexport interface BuildServerOptions {\n /**\n * Path to the server entry file.\n */\n entry: string;\n\n /**\n * Output directory for server build.\n */\n distDir: string;\n\n /**\n * Optional client directory name (relative to distDir).\n * If provided, the client template will be embedded in the server output.\n */\n clientDir?: string;\n\n /**\n * Override Vite config options.\n */\n config?: UserConfig;\n\n /**\n * If true, generate build stats report.\n */\n stats?: boolean;\n\n /**\n * If true, suppress build output. Logs are buffered and only shown on failure.\n *\n * @default false\n */\n silent?: boolean;\n}\n\nexport interface BuildServerResult {\n /**\n * The filename of the built server entry (e.g., \"abc123.js\").\n */\n entryFile: string;\n}\n\n/**\n * Build server-side SSR bundle with Vite.\n *\n * This task compiles the server code for production,\n * generates the externals package.json, and creates\n * the dist/index.js entry wrapper.\n */\nexport async function buildServer(\n opts: BuildServerOptions,\n): Promise<BuildServerResult> {\n const { build: viteBuild, mergeConfig } = await importVite();\n const plugins: any[] = [];\n\n if (opts.stats) {\n plugins.push(\n viteAnalyzer({\n analyzerMode: \"static\",\n }),\n );\n }\n\n // Create buffered logger for silent mode\n const logger = opts.silent ? createBufferedLogger() : undefined;\n\n const viteBuildServerConfig: UserConfig = {\n mode: \"production\",\n logLevel: opts.silent ? \"silent\" : undefined,\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n },\n publicDir: false,\n ssr: {\n noExternal: true,\n },\n build: {\n ssr: opts.entry,\n outDir: `${opts.distDir}/server`,\n minify: true,\n chunkSizeWarningLimit: 10000,\n rollupOptions: {\n output: {\n entryFileNames: \"[hash].js\",\n chunkFileNames: \"[hash].js\",\n assetFileNames: \"[hash][extname]\",\n format: \"esm\",\n },\n },\n },\n esbuild: { legalComments: \"none\", keepNames: true },\n customLogger: logger,\n plugins,\n };\n\n let result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];\n try {\n result = (await viteBuild(\n mergeConfig(viteBuildServerConfig, opts.config || {}),\n )) as vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];\n } catch (error) {\n // Flush buffered logs on failure so user can see what happened\n logger?.flush();\n throw error;\n }\n\n // Extract resolved config to get externals\n const resolvedConfig = (result as any).resolvedConfig;\n const externals: string[] = resolvedConfig?.ssr?.external ?? [];\n\n // Generate package.json with externals\n await generateExternals({\n distDir: opts.distDir,\n externals,\n });\n\n const entryFile = extractEntryFromBundle(opts.entry, result);\n\n // Embed client template if client was built\n let template = \"\";\n if (opts.clientDir) {\n const index = await readFile(\n `${opts.distDir}/${opts.clientDir}/index.html`,\n \"utf-8\",\n );\n template = `process.env.REACT_SERVER_TEMPLATE ??= \\`${index.replace(/>\\s*</g, \"><\").trim()}\\`;\\n`;\n }\n\n const warning =\n \"// This file was automatically generated. DO NOT MODIFY.\" +\n \"\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n const forceProduction = \"process.env.NODE_ENV ??= 'production';\\n\";\n\n await writeFile(\n `${opts.distDir}/index.js`,\n `${warning}\\n${forceProduction}${template}\\nawait import('./server/${entryFile}');`.trim(),\n );\n\n return { entryFile };\n}\n\n/**\n * Extract entry filename from Vite build result.\n */\nfunction extractEntryFromBundle(\n entry: string,\n result:\n | vite.Rollup.RollupOutput\n | vite.Rollup.RollupOutput[]\n | vite.Rollup.RollupWatcher,\n): string {\n const entryFilePath = entry.startsWith(\"/\")\n ? entry\n : join(process.cwd(), entry);\n\n const rollupOutput = (\n Array.isArray(result) ? result[0] : result\n ) as vite.Rollup.RollupOutput;\n\n const entryFile = rollupOutput.output.find(\n (it) => \"facadeModuleId\" in it && it.facadeModuleId === entryFilePath,\n )?.fileName;\n\n if (!entryFile) {\n throw new AlephaError(\n `Could not find the entry file \"${entryFilePath}\" in the build output. Please check your entry file and try again.`,\n );\n }\n\n return entryFile;\n}\n","import { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { type Alepha, AlephaError } from \"alepha\";\nimport { importVite } from \"./importVite.ts\";\n\n/**\n * Import Alepha instance from a transpiled server entry file.\n */\nexport const importAlepha = async (\n entry: string,\n options?: {\n env: Record<string, string>;\n },\n): Promise<Alepha> => {\n if (global.__cli_alepha) {\n return global.__cli_alepha as Alepha;\n }\n\n const { loadEnv } = await importVite();\n\n const env = loadEnv(\"development\", process.cwd(), \"\");\n\n for (const key in env) {\n process.env[key] = env[key];\n }\n\n if (options?.env) {\n for (const key in options.env) {\n process.env[key] = options.env[key];\n }\n }\n\n process.env.ALEPHA_CLI_IMPORT = \"true\";\n process.env.LOG_LEVEL = \"error\";\n process.env.LOG_FORMAT = \"pretty\";\n process.env.NODE_ENV = \"production\";\n\n const entryFile = pathToFileURL(join(process.cwd(), entry)).href;\n const mod = await import(entryFile);\n\n // check if alepha is correctly exported\n if (mod.default) {\n return mod.default;\n }\n\n // else, try with global variable\n const alepha = global.__cli_alepha as Alepha | undefined;\n if (!alepha) {\n throw new AlephaError(\n \"Alepha instance not found. Ensure Alepha is initialized.\",\n );\n }\n\n return alepha;\n};\n","import { cp, mkdir } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\n\nexport interface CopyAssetsOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Output directory for copied assets.\n */\n distDir: string;\n}\n\n/**\n * Copy assets from Alepha packages to the build output directory.\n *\n * This task loads the built Alepha application, reads the\n * `alepha.build.assets` state to find packages with assets,\n * and copies their `/assets` directories to the build output.\n *\n * Used by modules like AlephaServerSwagger to distribute UI files.\n */\nexport async function copyAssets(opts: CopyAssetsOptions): Promise<void> {\n const root = process.cwd();\n const alepha = await importAlepha(opts.entry);\n const assets = alepha.state.get(\"alepha.build.assets\");\n\n if (!assets || assets.length === 0) {\n return;\n }\n\n const require = createRequire(join(root, opts.entry));\n const buildAssetsDir = join(root, `${opts.distDir}/assets`);\n await mkdir(buildAssetsDir).catch(() => null);\n\n for (const pkgName of assets ?? []) {\n const pkgDir = dirname(require.resolve(`${pkgName}/package.json`));\n const assetsPkgDir = resolve(pkgDir, \"assets\");\n await cp(assetsPkgDir, buildAssetsDir, { recursive: true });\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface GenerateCloudflareOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n}\n\nconst WARNING_COMMENT =\n \"// This file was automatically generated. DO NOT MODIFY.\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n/**\n * Generate Cloudflare Workers deployment configuration.\n *\n * This task creates:\n * - wrangler.jsonc with worker configuration\n * - worker.js entry point for Cloudflare Workers\n */\nexport async function generateCloudflare(\n opts: GenerateCloudflareOptions = {},\n): Promise<void> {\n const dist = opts.distDir ?? \"dist\";\n const root = process.cwd();\n\n // Get current directory name for worker name\n const parts = root.split(\"/\");\n const name = parts[parts.length - 1];\n\n const wrangler = {\n name: name,\n main: \"./worker.js\",\n compatibility_flags: [\"nodejs_compat\"],\n compatibility_date: \"2025-11-17\",\n };\n\n writeFileSync(\n join(root, dist, \"wrangler.jsonc\"),\n JSON.stringify(wrangler, null, 2),\n );\n\n const workerCode = `\nprocess.env.ALEPHA_SERVERLESS = \"true\";\n\nawait import(\"./index.js\");\n\nexport default {\n fetch: async (request, env, ctx) => {\n\n await __alepha.start();\n const ev = { req: request, res: undefined };\n await __alepha.events.emit(\"web:request\", ev);\n return ev.res;\n },\n};\n`.trim();\n\n writeFileSync(\n join(root, dist, \"worker.js\"),\n `${WARNING_COMMENT}\\n${workerCode}`.trim(),\n );\n}\n","import { cp, writeFile } from \"node:fs/promises\";\nimport { fileExists } from \"../helpers/fileExists.ts\";\n\nexport interface GenerateDockerOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n\n /**\n * Docker image name to use in the Dockerfile.\n *\n * @default \"node:24-alpine\"\n */\n image?: string;\n\n /**\n * Command to run in the Docker container.\n *\n * @default \"node\"\n */\n command?: string;\n}\n\n/**\n * Generate Docker deployment configuration.\n *\n * This task creates:\n * - Dockerfile with configurable Node image\n * - Copies drizzle migrations if they exist\n */\nexport async function generateDocker(\n opts: GenerateDockerOptions = {},\n): Promise<void> {\n const distDir = opts.distDir ?? \"dist\";\n const image = opts.image ?? \"node:24-alpine\";\n const command = opts.command ?? \"node\";\n\n // Copy drizzle migrations if they exist\n const hasMigrations = await fileExists(\"drizzle\");\n if (hasMigrations) {\n await cp(\"drizzle\", `${distDir}/drizzle`, {\n recursive: true,\n });\n }\n\n const dockerfile = `# This file was automatically generated. DO NOT MODIFY.\n# Changes to this file will be lost when the code is regenerated.\nFROM ${image}\nWORKDIR /app\n\nCOPY . .\n\nCMD [\"${command}\", \"index.js\"]\n`;\n\n await writeFile(`${distDir}/Dockerfile`, dockerfile);\n}\n","import type { Alepha } from \"alepha\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\n\nexport interface GenerateSitemapOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Base URL for the sitemap (e.g., \"https://example.com\").\n */\n baseUrl: string;\n\n /**\n * Optional HTML template (for React SSR).\n */\n template?: string;\n}\n\n/**\n * Generate sitemap.xml from Alepha page descriptors.\n *\n * This task loads the built Alepha application,\n * queries all page descriptors, and generates a sitemap.xml\n * containing URLs for all accessible pages.\n */\nexport async function generateSitemap(\n opts: GenerateSitemapOptions,\n): Promise<string> {\n const alepha = await importAlepha(opts.entry, {\n env: opts.template\n ? {\n REACT_SERVER_TEMPLATE: opts.template,\n }\n : {},\n });\n\n if (!alepha.isConfigured()) {\n await alepha.events.emit(\"configure\", alepha);\n (alepha as any).configured = true;\n }\n\n return generateSitemapFromAlepha(alepha, opts.baseUrl);\n}\n\nfunction generateSitemapFromAlepha(alepha: Alepha, baseUrl: string): string {\n const pages = alepha.descriptors(\"page\") as any[];\n const urls: string[] = [];\n\n for (const page of pages) {\n const options = page.options;\n\n // Skip pages with children (parent pages that can't be rendered directly)\n if (options.children) {\n continue;\n }\n\n // Only include static pages or pages without parameters\n if (!options.schema?.params) {\n // Simple page without parameters\n const path = options.path || \"\";\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path === \"\" ? \"/\" : path}`;\n urls.push(url);\n } else if (\n options.static &&\n typeof options.static === \"object\" &&\n options.static.entries\n ) {\n // Static page with predefined entries\n for (const entry of options.static.entries) {\n const path = buildPathFromParams(\n options.path || \"\",\n entry.params || {},\n );\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n urls.push(url);\n }\n }\n }\n\n return buildSitemapXml(urls);\n}\n\nfunction buildPathFromParams(\n pathPattern: string,\n params: Record<string, any>,\n): string {\n let path = pathPattern;\n\n for (const [key, value] of Object.entries(params)) {\n path = path.replace(`:${key}`, String(value));\n }\n\n return path || \"/\";\n}\n\nfunction buildSitemapXml(urls: string[]): string {\n const lastMod = new Date().toISOString().split(\"T\")[0];\n const urlEntries = urls\n .map(\n (url) =>\n ` <url>\\n <loc>${escapeXml(url)}</loc>\\n\\t\\t<lastmod>${lastMod}</lastmod>\\n </url>`,\n )\n .join(\"\\n\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${urlEntries}\n</urlset>`;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { importVite } from \"../helpers/importVite.ts\";\n\nexport interface GenerateVercelOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n\n /**\n * The name of the client directory.\n *\n * @default \"public\"\n */\n clientDir?: string;\n\n /**\n * Vercel configuration options.\n */\n config?: VercelConfig;\n}\n\nexport interface VercelConfig {\n projectName?: string;\n orgId?: string;\n projectId?: string;\n config?: Record<string, any> & {\n crons?: Array<{\n path: string;\n schedule: string;\n }>;\n };\n}\n\nconst WARNING_COMMENT =\n \"// This file was automatically generated. DO NOT MODIFY.\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n/**\n * Generate Vercel deployment configuration.\n *\n * This task creates:\n * - vercel.json with route rewrites\n * - api/index.js entry point for Vercel serverless function\n * - .vercel/project.json if VERCEL_PROJECT_ID and VERCEL_ORG_ID are set\n */\nexport async function generateVercel(\n opts: GenerateVercelOptions = {},\n): Promise<void> {\n const distDir = opts.distDir ?? \"dist\";\n const clientDir = opts.clientDir ?? \"public\";\n const { loadEnv } = await importVite();\n\n const env = loadEnv(\"production\", process.cwd(), \"\");\n\n // Ensure the api directory exists\n if (!existsSync(`${distDir}/api`)) {\n mkdirSync(`${distDir}/api`);\n }\n\n // Add the only one entry point for Vercel\n writeFileSync(\n `${distDir}/api/index.js`,\n `${WARNING_COMMENT}\nimport \"../index.js\";\n\nexport default async function (req, res) {\n\\tawait __alepha.start();\n\\t__alepha.events.emit(\"node:request\", { req, res });\n}\n`,\n );\n\n // Always generate a vercel.json file\n writeFileSync(\n `${distDir}/vercel.json`,\n JSON.stringify(\n {\n ...opts?.config?.config,\n rewrites: [\n {\n source: \"/(.*)\",\n destination: \"/api/index.js\",\n },\n ],\n buildCommand: \"\",\n installCommand: \"\",\n outputDirectory: clientDir,\n },\n null,\n \" \",\n ),\n );\n\n // Generate .vercel/project.json if VERCEL_PROJECT_ID and VERCEL_ORG_ID are set\n const projectId = env.VERCEL_PROJECT_ID ?? opts.config?.projectId;\n const projectName = env.VERCEL_PROJECT_NAME ?? opts.config?.projectName;\n const orgId = env.VERCEL_ORG_ID ?? opts.config?.orgId;\n\n if (projectId && orgId) {\n try {\n mkdirSync(`${distDir}/.vercel`, { recursive: true });\n } catch (_e) {\n // Ignore error if directory already exists\n }\n\n writeFileSync(\n `${distDir}/.vercel/project.json`,\n JSON.stringify(\n {\n projectId,\n projectName,\n orgId,\n },\n null,\n \" \",\n ),\n );\n }\n\n // If /public does not exist, create an empty one to avoid Vercel errors\n if (!existsSync(`${distDir}/${clientDir}`)) {\n mkdirSync(`${distDir}/${clientDir}`, { recursive: true });\n writeFileSync(`${distDir}/${clientDir}/.keep`, \"\");\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport type { Alepha } from \"alepha\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\nimport {\n compressFile,\n type ViteCompressOptions,\n} from \"../plugins/viteCompress.ts\";\n\nexport interface PrerenderPagesOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Client dist directory for output files.\n */\n dist: string;\n\n /**\n * Optional compression options.\n */\n compress?: ViteCompressOptions | boolean;\n}\n\nexport interface PrerenderPagesResult {\n /**\n * Number of pages pre-rendered.\n */\n count: number;\n}\n\n/**\n * Pre-render static pages defined in the Alepha application.\n *\n * This task loads the built Alepha application, queries all page\n * descriptors with `static: true`, and generates static HTML files\n * for each page. Supports pages with parameterized routes via\n * `static.entries` configuration.\n */\nexport async function prerenderPages(\n opts: PrerenderPagesOptions,\n): Promise<PrerenderPagesResult> {\n const alepha = await importAlepha(opts.entry);\n\n const now = Date.now();\n\n if (!alepha.isConfigured()) {\n await alepha.events.emit(\"configure\", alepha);\n (alepha as any).configured = true;\n }\n\n return await prerenderFromAlepha(alepha, opts.dist, opts.compress);\n}\n\nasync function prerenderFromAlepha(\n alepha: Alepha,\n dist: string,\n compress?: ViteCompressOptions | boolean,\n): Promise<PrerenderPagesResult> {\n let count = 0;\n const pages = alepha.descriptors(\"page\") as any[];\n\n for (const page of pages) {\n const options = page.options;\n\n if (options.children) {\n continue;\n }\n\n if (!options.static) {\n continue;\n }\n\n const config = typeof options.static === \"object\" ? options.static : {};\n\n if (!options.schema?.params) {\n count += 1;\n await renderFile(page, {}, dist, compress);\n continue;\n }\n\n if (config.entries) {\n for (const entry of config.entries) {\n count += 1;\n await renderFile(page, entry, dist, compress);\n }\n }\n }\n\n return { count };\n}\n\nasync function renderFile(\n page: any,\n options: any,\n dist: string,\n compress?: ViteCompressOptions | boolean,\n) {\n const { html, state } = await page.render({\n html: true,\n ...options,\n });\n\n const pathname = state.url.pathname;\n const filepath = `${dist}${pathname === \"/\" ? \"/index\" : pathname}.html`;\n\n await mkdir(filepath.substring(0, filepath.lastIndexOf(\"/\")), {\n recursive: true,\n });\n\n await writeFile(filepath, html);\n\n if (compress) {\n await compressFile(typeof compress === \"object\" ? compress : {}, filepath);\n }\n}\n","import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Alepha, State } from \"alepha\";\nimport type { ResolvedConfig, ViteDevServer } from \"vite\";\nimport { importVite } from \"../helpers/importVite.ts\";\n\nexport interface AlephaRunnerOptions {\n /**\n * Path to the server entry file.\n */\n entry: string;\n\n /**\n * Enable debug logging.\n */\n debug?: boolean;\n}\n\nexport interface AlephaRunnerState {\n root: string;\n started: boolean;\n app?: Alepha;\n config?: ResolvedConfig;\n lock?: PromiseWithResolvers<void>;\n log: (...msg: string[]) => void;\n entry: string;\n onReload?: () => void;\n}\n\n/**\n * Create an Alepha runner for development.\n *\n * The runner manages the lifecycle of an Alepha application during\n * Vite dev server operation, handling start/stop/restart and HMR.\n */\nexport function createAlephaRunner(opts: AlephaRunnerOptions): AlephaRunner {\n const state: AlephaRunnerState = {\n root: process.cwd().replace(/\\\\/g, \"/\"),\n started: false,\n log: opts.debug ? (...msg: string[]) => console.log(...msg) : () => {},\n entry: opts.entry,\n onReload: () => {},\n };\n\n return new AlephaRunner(state);\n}\n\nexport class AlephaRunner {\n protected state: AlephaRunnerState;\n\n constructor(state: AlephaRunnerState) {\n this.state = state;\n }\n\n /**\n * Set resolved Vite config.\n */\n setConfig(config: ResolvedConfig): void {\n this.state.config = config;\n }\n\n /**\n * Check if SSR is enabled for the running app.\n */\n isSsrEnabled(): boolean {\n if (!this.state.app) return false;\n return (\n (this.state.app.state.get(\"alepha.react.server.ssr\" as keyof State) as\n | boolean\n | undefined) ?? false\n );\n }\n\n /**\n * Check if app is started.\n */\n get isStarted(): boolean {\n return this.state.started;\n }\n\n /**\n * Get the running Alepha app instance.\n */\n get app(): Alepha | undefined {\n return this.state.app;\n }\n\n /**\n * Start the Alepha application.\n */\n async start(server: ViteDevServer): Promise<void> {\n const { loadEnv } = await importVite();\n\n if (this.state.started) {\n await this.restart(server, true);\n return;\n }\n\n if (!this.state.config) {\n this.state.log(\"[DEBUG] No config - skip starting\");\n return;\n }\n\n this.state.onReload?.();\n\n this.state.log(\"[DEBUG] Starting Alepha app...\");\n\n this.state.started = false;\n this.state.app = undefined;\n\n const serverEntryPath = path.resolve(\n this.state.config.root,\n this.state.entry,\n );\n const fileUrl = pathToFileURL(`${serverEntryPath}`).href;\n const env = loadEnv(\"development\", this.state.config.root, \"\");\n const before = { ...process.env };\n\n for (const key in env) {\n process.env[key] = env[key];\n }\n\n process.env.NODE_ENV ??= \"development\";\n process.env.VITE_ALEPHA_DEV = \"true\";\n process.env.SERVER_HOST ??=\n typeof server.config.server.host === \"string\"\n ? server.config.server.host\n : \"localhost\";\n process.env.SERVER_PORT ??= String(server.config.server.port || \"5173\");\n\n try {\n const now = Date.now();\n await server.ssrLoadModule(fileUrl);\n this.state.log(`[DEBUG] Alepha app loaded in ${Date.now() - now}ms`);\n await new Promise((r) => setTimeout(r, 10));\n\n this.state.app = (globalThis as any).__alepha;\n if (!this.state.app) {\n this.state.log(\"[DEBUG] No app found - skip starting\");\n return;\n }\n\n this.state.app.state.set(\"alepha.node.server\" as any, server.httpServer);\n\n await this.state.app.start();\n this.state.started = true;\n\n process.env = { ...before };\n\n this.state.log(\"[DEBUG] Starting Done!\");\n } catch (e) {\n if (e instanceof Error) {\n let it: any = e;\n do {\n server.ssrFixStacktrace(it);\n it = it.cause;\n } while (it instanceof Error);\n\n server.ssrFixStacktrace(e);\n if (e.cause instanceof Error) {\n server.ssrFixStacktrace(e.cause);\n }\n this.state.app?.log?.error(\"App failed to start:\", e);\n this.state.app?.log?.info(\"Waiting for changes to restart...\");\n }\n this.state.log(\"[DEBUG] Alepha app start error\");\n this.state.started = false;\n }\n }\n\n /**\n * Stop the Alepha application.\n */\n async stop(): Promise<void> {\n if (this.state.app?.stop && this.state.started) {\n this.state.log(\"[DEBUG] Stopping Alepha app...\");\n await this.state.app.stop();\n this.state.started = false;\n this.state.log(\"[DEBUG] Stopping Done!\");\n } else {\n this.state.log(\"[DEBUG] Alepha app not started - skip stop\");\n }\n }\n\n /**\n * Restart the Alepha application.\n *\n * @returns true if the restart was skipped due to locking\n */\n async restart(server: ViteDevServer, invalidate?: boolean): Promise<boolean> {\n if (this.state.lock) {\n this.state.log(\"[DEBUG] STILL LOCKING\");\n return true;\n }\n\n this.state.log(\"[DEBUG] LOCK RESTART\");\n this.state.lock = Promise.withResolvers();\n\n const now = Date.now();\n this.state.log(\"[DEBUG] RESTART\");\n await this.stop();\n this.state.log(`[DEBUG] RESTART (stop) in ${Date.now() - now}ms`);\n\n if (invalidate) {\n server.moduleGraph.invalidateAll();\n }\n\n await this.start(server);\n this.state.log(`[DEBUG] RESTART OK in ${Date.now() - now}ms`);\n\n setTimeout(() => {\n this.state.log(\"[DEBUG] UNLOCK RESTART\");\n this.state.lock?.resolve();\n this.state.lock = undefined;\n }, 500);\n\n return false;\n }\n\n /**\n * Send reload event to client.\n */\n sendReload(server: ViteDevServer): void {\n server.ws.send({\n type: \"custom\",\n event: \"alepha:reload\",\n data: {},\n });\n }\n}\n\n/**\n * Check if a URL path is a Vite internal file.\n */\nexport function isViteInternalPath(pathname: string): boolean {\n const [path] = pathname.split(\"?\");\n\n // Vite internal files\n if (\n path.startsWith(\"/@\") ||\n path.startsWith(\"/src\") ||\n path.includes(\"/node_modules/\")\n ) {\n return true;\n }\n\n return false;\n}\n","import { readFile, unlink, writeFile } from \"node:fs/promises\";\nimport type { Plugin, UserConfig } from \"vite\";\nimport { boot } from \"../helpers/boot.ts\";\nimport { fileExists } from \"../helpers/fileExists.ts\";\nimport {\n type BuildClientOptions,\n buildClient,\n buildServer,\n copyAssets,\n type GenerateDockerOptions,\n generateCloudflare,\n generateDocker,\n generateSitemap,\n generateVercel,\n prerenderPages,\n type VercelConfig,\n} from \"../tasks/index.ts\";\n\nexport interface ViteAlephaBuildOptions {\n /**\n * Path to the entry file for the server build.\n * If empty, SSR build will be skipped.\n */\n serverEntry?: string | false;\n\n /**\n * Set false to skip the client build.\n * This is useful if you only want to build the server-side application.\n */\n client?: false | Partial<BuildClientOptions>;\n\n /**\n * If true, the build will be optimized for Vercel deployment.\n *\n * If `VERCEL_PROJECT_ID` and `VERCEL_ORG_ID` environment variables are set, .vercel will be generated with the correct configuration.\n *\n * @default false\n */\n vercel?: boolean | VercelConfig;\n\n /**\n * If true, the build will generate Cloudflare Workers configuration.\n *\n * @default false\n */\n cloudflare?: boolean;\n\n /**\n * If true, the build will be optimized for Docker deployment.\n * Additionally, it will generate a Dockerfile in the dist directory.\n */\n docker?: boolean | Omit<GenerateDockerOptions, \"distDir\">;\n\n /**\n * If true, build statistics will be printed after the build completes.\n */\n stats?: boolean;\n}\n\n/**\n * Build modes controlled by ALEPHA_BUILD_MODE environment variable:\n * - \"cli\": Skip plugin entirely, CLI handles all tasks\n * - \"client\": Only build client bundle\n * - \"server\": Only build server bundle\n * - undefined/other: Full build (default behavior)\n */\nexport type AlephaBuildMode = \"cli\" | \"client\" | \"server\";\n\n/**\n * Alepha build plugin for Vite.\n *\n * This plugin orchestrates the complete build process:\n * 1. Build client (if index.html exists)\n * 2. Build server (SSR)\n * 3. Copy assets from packages\n * 4. Pre-render static pages (if enabled)\n * 5. Generate sitemap (if enabled)\n * 6. Generate deployment config (Vercel/Cloudflare/Docker)\n *\n * Build mode can be controlled via ALEPHA_BUILD_MODE env var for CLI integration.\n */\nexport async function viteAlephaBuild(\n options: ViteAlephaBuildOptions = {},\n): Promise<Plugin> {\n const entry = options.serverEntry ?? (await boot.getServerEntry());\n const distDir = \"dist\";\n const clientDir = \"public\";\n\n let rootConfig: UserConfig = {};\n\n return {\n name: \"alepha-build\",\n apply: \"build\",\n config(config, ctx) {\n const buildMode = process.env.ALEPHA_BUILD_MODE as\n | AlephaBuildMode\n | undefined;\n\n // CLI mode: plugin does nothing, CLI handles everything\n if (buildMode === \"cli\") {\n return;\n }\n\n // For now, we run two separate builds: one for the client and one for the server\n // We distinguish them using an environment variable\n if (!process.env.VITE_DOUBLE_BUILD_DONE) {\n rootConfig = config;\n }\n\n if (ctx.isSsrBuild || !process.env.VITE_DOUBLE_BUILD_DONE) {\n // Server build, so we don't need the public directory\n config.publicDir = false;\n } else {\n // Client build, so we need the public directory\n config.publicDir = \"public\";\n }\n },\n async buildStart() {\n const buildMode = process.env.ALEPHA_BUILD_MODE as\n | AlephaBuildMode\n | undefined;\n\n // CLI mode: skip entirely\n if (buildMode === \"cli\") {\n return;\n }\n\n if (process.env.VITE_DOUBLE_BUILD_DONE === \"true\") {\n return;\n }\n\n process.env.VITE_DOUBLE_BUILD_DONE = \"true\";\n\n const hasClient =\n options.client !== false && (await fileExists(\"index.html\"));\n\n const buildClientOptions =\n typeof options.client === \"object\" ? options.client : {};\n\n const stats = options.stats ?? process.env.ALEPHA_BUILD_STATS === \"true\";\n\n // Client-only mode\n if (buildMode === \"client\") {\n if (hasClient) {\n await buildClient({\n ...buildClientOptions,\n config: rootConfig,\n dist: `${distDir}/${clientDir}`,\n stats,\n });\n }\n process.exit(0);\n }\n\n // Server-only mode\n if (buildMode === \"server\") {\n if (entry) {\n // Check if client was already built (template exists)\n let clientBuilt = false;\n try {\n await readFile(`${distDir}/${clientDir}/index.html`, \"utf-8\");\n clientBuilt = true;\n } catch {\n // No client build\n }\n\n await buildServer({\n config: {\n base: rootConfig.base || \"\",\n },\n entry,\n distDir,\n clientDir: clientBuilt ? clientDir : undefined,\n stats,\n });\n }\n process.exit(0);\n }\n\n // Full build mode (default)\n\n // Task 1: Build client\n if (hasClient) {\n await buildClient({\n ...buildClientOptions,\n config: rootConfig,\n dist: `${distDir}/${clientDir}`,\n stats,\n });\n }\n\n let template = \"\";\n if (hasClient) {\n // Load output index.html for template embedding\n template = await readFile(\n `${distDir}/${clientDir}/index.html`,\n \"utf-8\",\n );\n }\n\n // Task 2: Build server\n if (entry) {\n await buildServer({\n config: {\n base: rootConfig.base || \"\",\n },\n entry,\n distDir,\n clientDir: hasClient ? clientDir : undefined,\n stats,\n });\n\n // Server will handle index.html if both client & server are built\n if (hasClient && options.serverEntry !== false) {\n await unlink(`${distDir}/${clientDir}/index.html`);\n }\n\n // Task 3: Copy assets (swagger ui & others)\n await copyAssets({\n entry: `${distDir}/index.js`,\n distDir,\n });\n }\n\n // Task 4: Generate sitemap\n if (buildClientOptions.sitemap && entry) {\n await writeFile(\n `${distDir}/${clientDir}/sitemap.xml`,\n await generateSitemap({\n entry: `${distDir}/index.js`,\n baseUrl: buildClientOptions.sitemap.hostname,\n }),\n );\n }\n\n // Task 5: Pre-render static pages\n if (buildClientOptions.prerender && template) {\n await prerenderPages({\n dist: `${distDir}/${clientDir}`,\n entry: `${distDir}/index.js`,\n compress: buildClientOptions.precompress,\n });\n }\n\n // Task 6: Generate deployment configurations\n if (options.vercel) {\n const config =\n typeof options.vercel === \"boolean\" ? {} : options.vercel;\n await generateVercel({\n distDir,\n clientDir,\n config,\n });\n }\n\n if (options.cloudflare) {\n await generateCloudflare({\n distDir,\n });\n }\n\n if (options.docker) {\n const dockerOpts =\n typeof options.docker === \"boolean\" ? {} : options.docker;\n await generateDocker({\n distDir,\n ...dockerOpts,\n });\n }\n\n // Prevent the default build from running again\n process.exit(0);\n },\n };\n}\n","import type { Plugin, ResolvedConfig } from \"vite\";\nimport { boot } from \"../helpers/boot.ts\";\nimport { createAlephaRunner, isViteInternalPath } from \"../tasks/runAlepha.ts\";\n\nexport interface ViteAlephaDevOptions {\n /**\n * Path to the entry file for the server build.\n * If empty, plugin will be disabled.\n */\n serverEntry?: string | false;\n\n /**\n * If true, enables debug logging.\n *\n * @default false\n */\n debug?: boolean;\n}\n\n/**\n * Plug Alepha into Vite development server.\n *\n * This plugin manages the Alepha application lifecycle during development,\n * handling hot module replacement and request forwarding.\n */\nexport async function viteAlephaDev(\n options: ViteAlephaDevOptions = {},\n): Promise<Plugin> {\n let entry = options.serverEntry;\n if (!entry) {\n entry = await boot.getServerEntry();\n if (!entry) {\n return {\n name: \"alepha-dev\",\n apply: \"serve\",\n config() {},\n };\n }\n }\n\n const runner = createAlephaRunner({\n entry,\n debug: options.debug,\n });\n\n return {\n name: \"alepha-dev\",\n apply: \"serve\",\n configResolved(resolvedConfig: ResolvedConfig) {\n runner.setConfig(resolvedConfig);\n },\n async handleHotUpdate(ctx) {\n if (options.debug) {\n console.log(\"[DEBUG] HMR\", ctx.file);\n }\n\n if (ctx.file.includes(\"/.idea/\")) {\n return [];\n }\n\n const isServerOnly = !ctx.modules[0]?._clientModule;\n const isBrowserOnly = !ctx.modules[0]?._ssrModule;\n const isSsrEnabled = runner.isSsrEnabled();\n\n if (isBrowserOnly) {\n if (options.debug) {\n console.log(\n \"[DEBUG] HMR - browser only - no reason to reload server\",\n );\n }\n return;\n }\n\n const root = process.cwd().replace(/\\\\/g, \"/\");\n const invalidate = !ctx.file.startsWith(root);\n if (invalidate && options.debug) {\n console.log(\"[DEBUG] HMR - outside root - invalidate all\");\n }\n\n if (!isSsrEnabled && isServerOnly) {\n await runner.restart(ctx.server, invalidate);\n return [];\n }\n\n if (isSsrEnabled && ctx.modules[0]) {\n const skip = await runner.restart(ctx.server, invalidate);\n if (skip) {\n return [];\n }\n\n if (!runner.isStarted) {\n if (options.debug) {\n console.log(\"[DEBUG] HMR - abort due to app not started\");\n }\n return [];\n }\n\n if (isServerOnly && runner.isStarted) {\n runner.sendReload(ctx.server);\n return [];\n }\n }\n },\n async configureServer(server) {\n // Forward vite request to alepha server\n server.middlewares.use((req, res, next) => {\n if (\n runner.isStarted &&\n runner.app &&\n req.url &&\n !isViteInternalPath(req.url)\n ) {\n // Patch res.end to detect if alepha handled the request\n // If not, we call next() to let vite handle it (e.g. for static files)\n let ended = false;\n\n const writeHead = res.writeHead.bind(res);\n res.writeHead = (...args: any[]) => {\n ended = true;\n return writeHead(args[0], args[1], args[2]);\n };\n\n return runner.app.events\n .emit(\"node:request\" as any, { req, res })\n .then(() => {\n if (!ended) {\n next();\n }\n });\n }\n next();\n });\n\n server.config.logger.info = (msg: string) => {\n runner.app?.log?.info(msg.trim());\n };\n\n server.config.logger.clearScreen = () => {};\n\n await runner.start(server);\n },\n async closeBundle() {\n // Cleanup handled by runner\n },\n };\n}\n","import { createRequire } from \"node:module\";\nimport { OPTIONS } from \"alepha\";\nimport type { Plugin } from \"vite\";\nimport {\n type ViteAlephaBuildOptions,\n viteAlephaBuild,\n} from \"./viteAlephaBuild.ts\";\nimport { type ViteAlephaDevOptions, viteAlephaDev } from \"./viteAlephaDev.ts\";\n\nexport type ViteAlephaOptions = ViteAlephaDevOptions &\n ViteAlephaBuildOptions & {\n react?: false;\n };\n\nexport function viteAlepha(\n options: ViteAlephaOptions = {},\n): (Plugin | Promise<Plugin>)[] {\n if (process.env.NODE_ENV === \"test\") {\n return [];\n }\n\n const plugins: (Plugin | Promise<Plugin>)[] & { [OPTIONS]?: any } = [];\n\n if (options.react !== false) {\n try {\n const { default: viteReact } = createRequire(import.meta.url)(\n \"@vitejs/plugin-react\",\n );\n plugins.push(viteReact());\n } catch (e) {}\n }\n\n plugins.push(viteAlephaDev(options), viteAlephaBuild(options));\n plugins[OPTIONS] = options;\n\n return plugins;\n}\n","import type { Alepha } from \"alepha\";\n\n// Vite re-exports\nexport { defineConfig } from \"vite\";\n// Helpers (for advanced use)\nexport * from \"./helpers/boot.ts\";\nexport * from \"./helpers/createBufferedLogger.ts\";\n// Plugins (public API)\nexport * from \"./plugins/viteAlepha.ts\";\nexport * from \"./plugins/viteAlephaBuild.ts\";\nexport * from \"./plugins/viteAlephaDev.ts\";\nexport * from \"./plugins/viteCompress.ts\";\n// Tasks (for CLI integration)\nexport * from \"./tasks/index.ts\";\n\ndeclare global {\n var __cli_alepha: Alepha;\n}\n\n/**\n * Plugin vite for Alepha framework.\n *\n * This module provides Vite plugins and configurations to integrate Alepha applications with Vite's build and development processes.\n *\n * @example\n * ```ts\n * import { defineConfig } from \"vite\";\n * import { viteAlepha } from \"alepha/vite\";\n *\n * export default defineConfig({\n * plugins: [viteAlepha()],\n * // other Vite configurations...\n * });\n * ```\n *\n * @module alepha.vite\n */\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAaA,MAAM,iBAAiB,OACrB,OAAO,QAAQ,KAAK,KACY;CAChC,MAAM,YAAY,KAAK,MAAM,aAAa;AAC1C,KAAI;AAEF,SAAO,4BADM,MAAM,SAAS,WAAW,OAAO,CACN,CAAC,QAAQ,OAAO,IAAI;SACtD;AACN;;;;;;AAOJ,MAAM,iBAAiB,OACrB,OAAO,QAAQ,KAAK,EACpB,kBACoB;AACpB,KAAI,eAAe;EACjB,MAAM,eAAe,KAAK,MAAM,cAAc;AAC9C,MAAI;AACF,SAAM,OAAO,aAAa;AAC1B,UAAO;UACD;AACN,SAAM,IAAI,YACR,+BAA+B,cAAc,cAC9C;;;AAeL,MAAK,MAAM,SAXQ;EACjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAGC,KAAI;EACF,MAAMA,SAAO,KAAK,MAAM,MAAM,CAAC,QAAQ,OAAO,IAAI;AAClD,QAAM,OAAOA,OAAK;AAClB,SAAOA;SACD;CAKV,MAAM,cAAc,MAAM,eAAe,KAAK;AAC9C,KAAI,YACF,QAAO;AAGT,OAAM,IAAI,YAAY,sCAAsC;;;;;AAM9D,SAAS,4BAA4B,MAAsB;CACzD,MAAM,cAAc;CACpB,IAAIC,QAAgC,YAAY,KAAK,KAAK;AAE1D,QAAO,OAAO;EACZ,MAAM,MAAM,MAAM;AAGlB,MAAI,uBAAuB,KAAK,IAAI,EAAE;GAGpC,MAAM,QADW,IAAI,MAAM,0BAA0B,GAC5B;AACzB,OAAI,OAAO;AACT,QAAI,MAAM,WAAW,IAAI,CACvB,QAAO,MAAM,UAAU,EAAE;AAE3B,WAAO;;;AAIX,UAAQ,YAAY,KAAK,KAAK;;AAGhC,OAAM,IAAI,YAAY,+CAA+C;;AAGvE,MAAa,OAAO;CAClB;CACA;CACD;;;;;;;;;;;;;;;;;;;AChED,SAAgB,uBAAuC;CACrD,MAAMC,UAA8B,EAAE;CACtC,MAAM,+BAAe,IAAI,SAAgB;CACzC,MAAM,iCAAiB,IAAI,KAAa;CACxC,IAAI,YAAY;AA+DhB,QA7D+B;EAC7B,IAAI,YAAY;AACd,UAAO;;EAGT,KAAK,KAAa;AAChB,WAAQ,KAAK;IAAE,OAAO;IAAQ;IAAK,2BAAW,IAAI,MAAM;IAAE,CAAC;;EAG7D,KAAK,KAAa;AAChB,eAAY;AACZ,WAAQ,KAAK;IAAE,OAAO;IAAQ;IAAK,2BAAW,IAAI,MAAM;IAAE,CAAC;;EAG7D,SAAS,KAAa;AACpB,OAAI,eAAe,IAAI,IAAI,CACzB;AAEF,kBAAe,IAAI,IAAI;AACvB,eAAY;AACZ,WAAQ,KAAK;IAAE,OAAO;IAAQ;IAAK,2BAAW,IAAI,MAAM;IAAE,CAAC;;EAG7D,MAAM,KAAa,SAAoC;AACrD,OAAI,SAAS,MACX,cAAa,IAAI,QAAQ,MAAM;AAEjC,WAAQ,KAAK;IAAE,OAAO;IAAS;IAAK,2BAAW,IAAI,MAAM;IAAE,CAAC;;EAG9D,cAAc;EAId,eAAe,OAAuB;AACpC,UAAO,aAAa,IAAI,MAAM;;EAGhC,QAAQ;AACN,QAAK,MAAM,SAAS,SAAS;IAC3B,MAAM,SACJ,MAAM,UAAU,UACZ,qBACA,MAAM,UAAU,SACd,qBACA;AACR,YAAQ,IAAI,GAAG,OAAO,GAAG,MAAM,MAAM;;;EAIzC,aAAa;AACX,UAAO,CAAC,GAAG,QAAQ;;EAGrB,QAAQ;AACN,WAAQ,SAAS;AACjB,kBAAe,OAAO;AACtB,eAAY;;EAEf;;;;;ACvGH,MAAa,aAAa,OAAO,WAAmC;AAClE,QAAO,MAAM,OAAO,KAAK,QAAQ,KAAK,EAAEC,OAAK,CAAC,CAC3C,WAAW,KAAK,CAChB,YAAY,MAAM;;;;;ACHvB,MAAa,aAAa,YAAkC;AAC1D,KAAI;AACF,SAAO,cAAc,OAAO,KAAK,IAAI,CAAC,gBAAgB;UAC/C,QAAQ;AACf,MAAI;AACF,UAAO,cAAc,OAAO,KAAK,IAAI,CAAC,OAAO;WACtCC,UAAQ;AACf,SAAM,IAAI,MACR,oEACD;;;;;;;ACDP,MAAM,eAAe,UAAUC,KAAO;AACtC,MAAMC,mBAAiB,UAAUC,eAAiB;AAmClD,SAAgB,aAAa,UAA+B,EAAE,EAAU;CACtE,MAAM,EAAE,WAAW,OAAO,SAAS,mCAAmC;AAEtE,QAAO;EACL,MAAM;EACN,OAAO;EACP,MAAM,YAAY,eAAe,QAAQ;AACvC,OAAI,SACF;GAGF,MAAM,MAAM,KAAK,KAAK;GAEtB,MAAM,YAAY,cAAc,OAAO,QAAQ,QAAQ,KAAK,EAAE,OAAO;GAErE,MAAM,QAAQ,OAAO,KAAK,OAAO,CAC9B,QAAQ,aAAa;AAEpB,QAAI,OAAO,WAAW,WACpB,QAAO,OAAO,SAAS;AAEzB,WAAO,OAAO,KAAK,SAAS;KAC5B,CACD,KAAK,cAAc;IAClB;IACA,UAAU,KAAK,WAAW,SAAS;IACpC,EAAE;GAGL,MAAMC,mBAAoC,EAAE;AAE5C,QAAK,MAAM,EAAE,cAAc,MACzB,kBAAiB,KAAK,aAAa,SAAS,SAAS,CAAC;AAIxD,SAAM,QAAQ,IAAI,iBAAiB;AAEnC,QAAK,KACH,cAAc,MAAM,OAAO,OAAO,MAAM,SAAS,IAAI,MAAM,GAAG,MAAM,KAAK,KAAK,GAAG,IAAI,KACtF;;EAEJ;;AAGH,eAAsB,aACpB,UAA+B,EAAE,EACjC,UACA;CACA,MAAM,EAAE,SAAS,MAAM,eAAO,SAAS;CAEvC,MAAMA,mBAAoC,EAAE;CAE5C,MAAM,qBAAqBC,SAAG,SAAS,SAAS;AAEhD,KAAIC,QAAM;EACR,MAAM,cACJ,OAAOA,WAAS,WACZA,SACA,EACE,OAAO,GACR;AACP,mBAAiB,KACf,mBAAmB,KAAK,OAAO,YAAY;GACzC,MAAM,aAAa,MAAM,aAAa,SAAS,YAAY;AAC3D,SAAMD,SAAG,UAAU,GAAG,SAAS,MAAM,WAAW;IAChD,CACH;;AAGH,KAAI,QAAQ;EACV,MAAM,gBAAgB,OAAO,WAAW,WAAW,SAAS,EAAE;AAC9D,mBAAiB,KACf,mBAAmB,KAAK,OAAO,YAAY;GACzC,MAAM,aAAa,MAAMH,iBAAe,SAAS,cAAc;AAC/D,SAAMG,SAAG,UAAU,GAAG,SAAS,MAAM,WAAW;IAChD,CACH;;AAGH,OAAM,QAAQ,IAAI,iBAAiB;;;;;;;;;;;ACnErC,eAAsB,YAAY,MAAyC;CACzE,MAAM,EAAE,OAAO,WAAW,gBAAgB,MAAM,YAAY;CAC5D,MAAME,UAAiB,EAAE;CAEzB,MAAMC,WAA4C,KAAK,cACnD,OAAO,KAAK,gBAAgB,WAC1B,KAAK,cACL,EAAE,GACJ;AAEJ,KAAI,KAAK,MACP,SAAQ,KACNC,SAAa,EACX,cAAc,UACf,CAAC,CACH;AAGH,KAAI,KAAK,eAAe,SACtB,SAAQ,KAAK,aAAa,SAAS,CAAC;CAItC,MAAM,SAAS,KAAK,SAAS,sBAAsB,GAAG;CAEtD,MAAMC,wBAAoC;EACxC,MAAM;EACN,UAAU,KAAK,SAAS,WAAW;EACnC,QAAQ,EACN,wBAAwB,kBACzB;EACD,WAAW;EACX,OAAO;GACL,uBAAuB;GACvB,QAAQ,KAAK;GACb,eAAe,EACb,QAAQ;IACN,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IACjB,EACF;GACF;EACD,SAAS,EAAE,eAAe,QAAQ;EAClC,cAAc;EACd;EACD;AAED,KAAI;AACF,QAAM,UAAU,YAAY,uBAAuB,KAAK,UAAU,EAAE,CAAC,CAAC;UAC/D,OAAO;AAEd,UAAQ,OAAO;AACf,QAAM;;;;;;;;;;;;;AC1FV,eAAsB,kBACpB,MACe;CACf,MAAM,UAAU,EAAE,cAAc,OAAO,KAAK,SAAS;CACrD,MAAMC,OAA+B,EAAE;AAEvC,MAAK,MAAM,OAAO,KAAK,UACrB,KAAI;EAEF,MAAM,UAAU,GADI,QAAQ,QAAQ,IAAI,CACT,MAAM,gBAAgB,MAAM,CAAC,GAAG,eAAe,IAAI;AAElF,OAAK,OAAO,IADA,KAAK,MAAM,MAAM,SAAS,SAAS,QAAQ,CAAC,CACpC;UACb,MAAM;AACb,UAAQ,KAAK,oCAAoC,IAAI,mBAAmB;;CAI5E,MAAM,aAAa;EACjB,MAAM;EACN,MAAM;EACN,cAAc;EACf;AAED,OAAM,MAAM,KAAK,SAAS,EAAE,WAAW,MAAM,CAAC;AAG9C,OAAM,UADS,KAAK,KAAK,SAAS,eAAe,EACzB,KAAK,UAAU,YAAY,MAAM,EAAE,EAAE,QAAQ;;;;;;;;;;;;ACUvE,eAAsB,YACpB,MAC4B;CAC5B,MAAM,EAAE,OAAO,WAAW,gBAAgB,MAAM,YAAY;CAC5D,MAAMC,UAAiB,EAAE;AAEzB,KAAI,KAAK,MACP,SAAQ,KACNC,SAAa,EACX,cAAc,UACf,CAAC,CACH;CAIH,MAAM,SAAS,KAAK,SAAS,sBAAsB,GAAG;CAEtD,MAAMC,wBAAoC;EACxC,MAAM;EACN,UAAU,KAAK,SAAS,WAAW;EACnC,QAAQ,EACN,wBAAwB,kBACzB;EACD,WAAW;EACX,KAAK,EACH,YAAY,MACb;EACD,OAAO;GACL,KAAK,KAAK;GACV,QAAQ,GAAG,KAAK,QAAQ;GACxB,QAAQ;GACR,uBAAuB;GACvB,eAAe,EACb,QAAQ;IACN,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,QAAQ;IACT,EACF;GACF;EACD,SAAS;GAAE,eAAe;GAAQ,WAAW;GAAM;EACnD,cAAc;EACd;EACD;CAED,IAAIC;AACJ,KAAI;AACF,WAAU,MAAM,UACd,YAAY,uBAAuB,KAAK,UAAU,EAAE,CAAC,CACtD;UACM,OAAO;AAEd,UAAQ,OAAO;AACf,QAAM;;CAKR,MAAMC,YADkB,OAAe,gBACK,KAAK,YAAY,EAAE;AAG/D,OAAM,kBAAkB;EACtB,SAAS,KAAK;EACd;EACD,CAAC;CAEF,MAAM,YAAY,uBAAuB,KAAK,OAAO,OAAO;CAG5D,IAAI,WAAW;AACf,KAAI,KAAK,UAKP,YAAW,4CAJG,MAAM,SAClB,GAAG,KAAK,QAAQ,GAAG,KAAK,UAAU,cAClC,QACD,EAC2D,QAAQ,UAAU,KAAK,CAAC,MAAM,CAAC;AAU7F,OAAM,UACJ,GAAG,KAAK,QAAQ,YAChB;;;EAAiC,SAAS,2BAA2B,UAAU,KAAK,MAAM,CAC3F;AAED,QAAO,EAAE,WAAW;;;;;AAMtB,SAAS,uBACP,OACA,QAIQ;CACR,MAAM,gBAAgB,MAAM,WAAW,IAAI,GACvC,QACA,KAAK,QAAQ,KAAK,EAAE,MAAM;CAM9B,MAAM,aAHJ,MAAM,QAAQ,OAAO,GAAG,OAAO,KAAK,QAGP,OAAO,MACnC,OAAO,oBAAoB,MAAM,GAAG,mBAAmB,cACzD,EAAE;AAEH,KAAI,CAAC,UACH,OAAM,IAAI,YACR,kCAAkC,cAAc,oEACjD;AAGH,QAAO;;;;;;;;AC7KT,MAAa,eAAe,OAC1B,OACA,YAGoB;AACpB,KAAI,OAAO,aACT,QAAO,OAAO;CAGhB,MAAM,EAAE,YAAY,MAAM,YAAY;CAEtC,MAAM,MAAM,QAAQ,eAAe,QAAQ,KAAK,EAAE,GAAG;AAErD,MAAK,MAAM,OAAO,IAChB,SAAQ,IAAI,OAAO,IAAI;AAGzB,KAAI,SAAS,IACX,MAAK,MAAM,OAAO,QAAQ,IACxB,SAAQ,IAAI,OAAO,QAAQ,IAAI;AAInC,SAAQ,IAAI,oBAAoB;AAChC,SAAQ,IAAI,YAAY;AACxB,SAAQ,IAAI,aAAa;AACzB,SAAQ,IAAI,WAAW;CAGvB,MAAM,MAAM,MAAM,OADA,cAAc,KAAK,QAAQ,KAAK,EAAE,MAAM,CAAC,CAAC;AAI5D,KAAI,IAAI,QACN,QAAO,IAAI;CAIb,MAAM,SAAS,OAAO;AACtB,KAAI,CAAC,OACH,OAAM,IAAI,YACR,2DACD;AAGH,QAAO;;;;;;;;;;;;;;AC3BT,eAAsB,WAAW,MAAwC;CACvE,MAAM,OAAO,QAAQ,KAAK;CAE1B,MAAM,UADS,MAAM,aAAa,KAAK,MAAM,EACvB,MAAM,IAAI,sBAAsB;AAEtD,KAAI,CAAC,UAAU,OAAO,WAAW,EAC/B;CAGF,MAAM,UAAU,cAAc,KAAK,MAAM,KAAK,MAAM,CAAC;CACrD,MAAM,iBAAiB,KAAK,MAAM,GAAG,KAAK,QAAQ,SAAS;AAC3D,OAAM,MAAM,eAAe,CAAC,YAAY,KAAK;AAE7C,MAAK,MAAM,WAAW,UAAU,EAAE,CAGhC,OAAM,GADe,QADN,QAAQ,QAAQ,QAAQ,GAAG,QAAQ,eAAe,CAAC,EAC7B,SAAS,EACvB,gBAAgB,EAAE,WAAW,MAAM,CAAC;;;;;AC9B/D,MAAMC,oBACJ;;;;;;;;AAUF,eAAsB,mBACpB,OAAkC,EAAE,EACrB;CACf,MAAM,OAAO,KAAK,WAAW;CAC7B,MAAM,OAAO,QAAQ,KAAK;CAG1B,MAAM,QAAQ,KAAK,MAAM,IAAI;CAG7B,MAAM,WAAW;EACf,MAHW,MAAM,MAAM,SAAS;EAIhC,MAAM;EACN,qBAAqB,CAAC,gBAAgB;EACtC,oBAAoB;EACrB;AAED,eACE,KAAK,MAAM,MAAM,iBAAiB,EAClC,KAAK,UAAU,UAAU,MAAM,EAAE,CAClC;CAED,MAAM,aAAa;;;;;;;;;;;;;;EAcnB,MAAM;AAEN,eACE,KAAK,MAAM,MAAM,YAAY,EAC7B,GAAGA,kBAAgB,IAAI,aAAa,MAAM,CAC3C;;;;;;;;;;;;AC/BH,eAAsB,eACpB,OAA8B,EAAE,EACjB;CACf,MAAM,UAAU,KAAK,WAAW;CAChC,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,UAAU,KAAK,WAAW;AAIhC,KADsB,MAAM,WAAW,UAAU,CAE/C,OAAM,GAAG,WAAW,GAAG,QAAQ,WAAW,EACxC,WAAW,MACZ,CAAC;CAGJ,MAAM,aAAa;;OAEd,MAAM;;;;;QAKL,QAAQ;;AAGd,OAAM,UAAU,GAAG,QAAQ,cAAc,WAAW;;;;;;;;;;;;AC/BtD,eAAsB,gBACpB,MACiB;CACjB,MAAM,SAAS,MAAM,aAAa,KAAK,OAAO,EAC5C,KAAK,KAAK,WACN,EACE,uBAAuB,KAAK,UAC7B,GACD,EAAE,EACP,CAAC;AAEF,KAAI,CAAC,OAAO,cAAc,EAAE;AAC1B,QAAM,OAAO,OAAO,KAAK,aAAa,OAAO;AAC7C,EAAC,OAAe,aAAa;;AAG/B,QAAO,0BAA0B,QAAQ,KAAK,QAAQ;;AAGxD,SAAS,0BAA0B,QAAgB,SAAyB;CAC1E,MAAM,QAAQ,OAAO,YAAY,OAAO;CACxC,MAAMC,OAAiB,EAAE;AAEzB,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,UAAU,KAAK;AAGrB,MAAI,QAAQ,SACV;AAIF,MAAI,CAAC,QAAQ,QAAQ,QAAQ;GAE3B,MAAMC,SAAO,QAAQ,QAAQ;GAC7B,MAAM,MAAM,GAAG,QAAQ,QAAQ,OAAO,GAAG,GAAGA,WAAS,KAAK,MAAMA;AAChE,QAAK,KAAK,IAAI;aAEd,QAAQ,UACR,OAAO,QAAQ,WAAW,YAC1B,QAAQ,OAAO,QAGf,MAAK,MAAM,SAAS,QAAQ,OAAO,SAAS;GAC1C,MAAMA,SAAO,oBACX,QAAQ,QAAQ,IAChB,MAAM,UAAU,EAAE,CACnB;GACD,MAAM,MAAM,GAAG,QAAQ,QAAQ,OAAO,GAAG,GAAGA;AAC5C,QAAK,KAAK,IAAI;;;AAKpB,QAAO,gBAAgB,KAAK;;AAG9B,SAAS,oBACP,aACA,QACQ;CACR,IAAIA,SAAO;AAEX,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAC/C,UAAOA,OAAK,QAAQ,IAAI,OAAO,OAAO,MAAM,CAAC;AAG/C,QAAOA,UAAQ;;AAGjB,SAAS,gBAAgB,MAAwB;CAC/C,MAAM,2BAAU,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,IAAI,CAAC;AAQpD,QAAO;;EAPY,KAChB,KACE,QACC,qBAAqB,UAAU,IAAI,CAAC,uBAAuB,QAAQ,sBACtE,CACA,KAAK,KAAK,CAIF;;;AAIb,SAAS,UAAU,KAAqB;AACtC,QAAO,IACJ,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,SAAS,CACvB,QAAQ,MAAM,QAAQ;;;;;AClF3B,MAAM,kBACJ;;;;;;;;;AAWF,eAAsB,eACpB,OAA8B,EAAE,EACjB;CACf,MAAM,UAAU,KAAK,WAAW;CAChC,MAAM,YAAY,KAAK,aAAa;CACpC,MAAM,EAAE,YAAY,MAAM,YAAY;CAEtC,MAAM,MAAM,QAAQ,cAAc,QAAQ,KAAK,EAAE,GAAG;AAGpD,KAAI,CAAC,WAAW,GAAG,QAAQ,MAAM,CAC/B,WAAU,GAAG,QAAQ,MAAM;AAI7B,eACE,GAAG,QAAQ,gBACX,GAAG,gBAAgB;;;;;;;EAQpB;AAGD,eACE,GAAG,QAAQ,eACX,KAAK,UACH;EACE,GAAG,MAAM,QAAQ;EACjB,UAAU,CACR;GACE,QAAQ;GACR,aAAa;GACd,CACF;EACD,cAAc;EACd,gBAAgB;EAChB,iBAAiB;EAClB,EACD,MACA,KACD,CACF;CAGD,MAAM,YAAY,IAAI,qBAAqB,KAAK,QAAQ;CACxD,MAAM,cAAc,IAAI,uBAAuB,KAAK,QAAQ;CAC5D,MAAM,QAAQ,IAAI,iBAAiB,KAAK,QAAQ;AAEhD,KAAI,aAAa,OAAO;AACtB,MAAI;AACF,aAAU,GAAG,QAAQ,WAAW,EAAE,WAAW,MAAM,CAAC;WAC7C,IAAI;AAIb,gBACE,GAAG,QAAQ,wBACX,KAAK,UACH;GACE;GACA;GACA;GACD,EACD,MACA,KACD,CACF;;AAIH,KAAI,CAAC,WAAW,GAAG,QAAQ,GAAG,YAAY,EAAE;AAC1C,YAAU,GAAG,QAAQ,GAAG,aAAa,EAAE,WAAW,MAAM,CAAC;AACzD,gBAAc,GAAG,QAAQ,GAAG,UAAU,SAAS,GAAG;;;;;;;;;;;;;;ACrFtD,eAAsB,eACpB,MAC+B;CAC/B,MAAM,SAAS,MAAM,aAAa,KAAK,MAAM;AAI7C,KAAI,CAAC,OAAO,cAAc,EAAE;AAC1B,QAAM,OAAO,OAAO,KAAK,aAAa,OAAO;AAC7C,EAAC,OAAe,aAAa;;AAG/B,QAAO,MAAM,oBAAoB,QAAQ,KAAK,MAAM,KAAK,SAAS;;AAGpE,eAAe,oBACb,QACA,MACA,UAC+B;CAC/B,IAAI,QAAQ;CACZ,MAAM,QAAQ,OAAO,YAAY,OAAO;AAExC,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,UAAU,KAAK;AAErB,MAAI,QAAQ,SACV;AAGF,MAAI,CAAC,QAAQ,OACX;EAGF,MAAM,SAAS,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,EAAE;AAEvE,MAAI,CAAC,QAAQ,QAAQ,QAAQ;AAC3B,YAAS;AACT,SAAM,WAAW,MAAM,EAAE,EAAE,MAAM,SAAS;AAC1C;;AAGF,MAAI,OAAO,QACT,MAAK,MAAM,SAAS,OAAO,SAAS;AAClC,YAAS;AACT,SAAM,WAAW,MAAM,OAAO,MAAM,SAAS;;;AAKnD,QAAO,EAAE,OAAO;;AAGlB,eAAe,WACb,MACA,SACA,MACA,UACA;CACA,MAAM,EAAE,MAAM,UAAU,MAAM,KAAK,OAAO;EACxC,MAAM;EACN,GAAG;EACJ,CAAC;CAEF,MAAM,WAAW,MAAM,IAAI;CAC3B,MAAM,WAAW,GAAG,OAAO,aAAa,MAAM,WAAW,SAAS;AAElE,OAAM,MAAM,SAAS,UAAU,GAAG,SAAS,YAAY,IAAI,CAAC,EAAE,EAC5D,WAAW,MACZ,CAAC;AAEF,OAAM,UAAU,UAAU,KAAK;AAE/B,KAAI,SACF,OAAM,aAAa,OAAO,aAAa,WAAW,WAAW,EAAE,EAAE,SAAS;;;;;;;;;;;AC/E9E,SAAgB,mBAAmB,MAAyC;AAS1E,QAAO,IAAI,aARsB;EAC/B,MAAM,QAAQ,KAAK,CAAC,QAAQ,OAAO,IAAI;EACvC,SAAS;EACT,KAAK,KAAK,SAAS,GAAG,QAAkB,QAAQ,IAAI,GAAG,IAAI,SAAS;EACpE,OAAO,KAAK;EACZ,gBAAgB;EACjB,CAE6B;;AAGhC,IAAa,eAAb,MAA0B;CACxB,AAAU;CAEV,YAAY,OAA0B;AACpC,OAAK,QAAQ;;;;;CAMf,UAAU,QAA8B;AACtC,OAAK,MAAM,SAAS;;;;;CAMtB,eAAwB;AACtB,MAAI,CAAC,KAAK,MAAM,IAAK,QAAO;AAC5B,SACG,KAAK,MAAM,IAAI,MAAM,IAAI,0BAAyC,IAEjD;;;;;CAOtB,IAAI,YAAqB;AACvB,SAAO,KAAK,MAAM;;;;;CAMpB,IAAI,MAA0B;AAC5B,SAAO,KAAK,MAAM;;;;;CAMpB,MAAM,MAAM,QAAsC;EAChD,MAAM,EAAE,YAAY,MAAM,YAAY;AAEtC,MAAI,KAAK,MAAM,SAAS;AACtB,SAAM,KAAK,QAAQ,QAAQ,KAAK;AAChC;;AAGF,MAAI,CAAC,KAAK,MAAM,QAAQ;AACtB,QAAK,MAAM,IAAI,oCAAoC;AACnD;;AAGF,OAAK,MAAM,YAAY;AAEvB,OAAK,MAAM,IAAI,iCAAiC;AAEhD,OAAK,MAAM,UAAU;AACrB,OAAK,MAAM,MAAM;EAMjB,MAAM,UAAU,cAAc,GAJN,KAAK,QAC3B,KAAK,MAAM,OAAO,MAClB,KAAK,MAAM,MACZ,GACkD,CAAC;EACpD,MAAM,MAAM,QAAQ,eAAe,KAAK,MAAM,OAAO,MAAM,GAAG;EAC9D,MAAM,SAAS,EAAE,GAAG,QAAQ,KAAK;AAEjC,OAAK,MAAM,OAAO,IAChB,SAAQ,IAAI,OAAO,IAAI;AAGzB,UAAQ,IAAI,aAAa;AACzB,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,gBACV,OAAO,OAAO,OAAO,OAAO,SAAS,WACjC,OAAO,OAAO,OAAO,OACrB;AACN,UAAQ,IAAI,gBAAgB,OAAO,OAAO,OAAO,OAAO,QAAQ,OAAO;AAEvE,MAAI;GACF,MAAM,MAAM,KAAK,KAAK;AACtB,SAAM,OAAO,cAAc,QAAQ;AACnC,QAAK,MAAM,IAAI,gCAAgC,KAAK,KAAK,GAAG,IAAI,IAAI;AACpE,SAAM,IAAI,SAAS,MAAM,WAAW,GAAG,GAAG,CAAC;AAE3C,QAAK,MAAM,MAAO,WAAmB;AACrC,OAAI,CAAC,KAAK,MAAM,KAAK;AACnB,SAAK,MAAM,IAAI,uCAAuC;AACtD;;AAGF,QAAK,MAAM,IAAI,MAAM,IAAI,sBAA6B,OAAO,WAAW;AAExE,SAAM,KAAK,MAAM,IAAI,OAAO;AAC5B,QAAK,MAAM,UAAU;AAErB,WAAQ,MAAM,EAAE,GAAG,QAAQ;AAE3B,QAAK,MAAM,IAAI,yBAAyB;WACjC,GAAG;AACV,OAAI,aAAa,OAAO;IACtB,IAAIC,KAAU;AACd,OAAG;AACD,YAAO,iBAAiB,GAAG;AAC3B,UAAK,GAAG;aACD,cAAc;AAEvB,WAAO,iBAAiB,EAAE;AAC1B,QAAI,EAAE,iBAAiB,MACrB,QAAO,iBAAiB,EAAE,MAAM;AAElC,SAAK,MAAM,KAAK,KAAK,MAAM,wBAAwB,EAAE;AACrD,SAAK,MAAM,KAAK,KAAK,KAAK,oCAAoC;;AAEhE,QAAK,MAAM,IAAI,iCAAiC;AAChD,QAAK,MAAM,UAAU;;;;;;CAOzB,MAAM,OAAsB;AAC1B,MAAI,KAAK,MAAM,KAAK,QAAQ,KAAK,MAAM,SAAS;AAC9C,QAAK,MAAM,IAAI,iCAAiC;AAChD,SAAM,KAAK,MAAM,IAAI,MAAM;AAC3B,QAAK,MAAM,UAAU;AACrB,QAAK,MAAM,IAAI,yBAAyB;QAExC,MAAK,MAAM,IAAI,6CAA6C;;;;;;;CAShE,MAAM,QAAQ,QAAuB,YAAwC;AAC3E,MAAI,KAAK,MAAM,MAAM;AACnB,QAAK,MAAM,IAAI,wBAAwB;AACvC,UAAO;;AAGT,OAAK,MAAM,IAAI,uBAAuB;AACtC,OAAK,MAAM,OAAO,QAAQ,eAAe;EAEzC,MAAM,MAAM,KAAK,KAAK;AACtB,OAAK,MAAM,IAAI,kBAAkB;AACjC,QAAM,KAAK,MAAM;AACjB,OAAK,MAAM,IAAI,6BAA6B,KAAK,KAAK,GAAG,IAAI,IAAI;AAEjE,MAAI,WACF,QAAO,YAAY,eAAe;AAGpC,QAAM,KAAK,MAAM,OAAO;AACxB,OAAK,MAAM,IAAI,yBAAyB,KAAK,KAAK,GAAG,IAAI,IAAI;AAE7D,mBAAiB;AACf,QAAK,MAAM,IAAI,yBAAyB;AACxC,QAAK,MAAM,MAAM,SAAS;AAC1B,QAAK,MAAM,OAAO;KACjB,IAAI;AAEP,SAAO;;;;;CAMT,WAAW,QAA6B;AACtC,SAAO,GAAG,KAAK;GACb,MAAM;GACN,OAAO;GACP,MAAM,EAAE;GACT,CAAC;;;;;;AAON,SAAgB,mBAAmB,UAA2B;CAC5D,MAAM,CAACC,UAAQ,SAAS,MAAM,IAAI;AAGlC,KACEA,OAAK,WAAW,KAAK,IACrBA,OAAK,WAAW,OAAO,IACvBA,OAAK,SAAS,iBAAiB,CAE/B,QAAO;AAGT,QAAO;;;;;;;;;;;;;;;;;;ACrKT,eAAsB,gBACpB,UAAkC,EAAE,EACnB;CACjB,MAAM,QAAQ,QAAQ,eAAgB,MAAM,KAAK,gBAAgB;CACjE,MAAM,UAAU;CAChB,MAAM,YAAY;CAElB,IAAIC,aAAyB,EAAE;AAE/B,QAAO;EACL,MAAM;EACN,OAAO;EACP,OAAO,QAAQ,KAAK;AAMlB,OALkB,QAAQ,IAAI,sBAKZ,MAChB;AAKF,OAAI,CAAC,QAAQ,IAAI,uBACf,cAAa;AAGf,OAAI,IAAI,cAAc,CAAC,QAAQ,IAAI,uBAEjC,QAAO,YAAY;OAGnB,QAAO,YAAY;;EAGvB,MAAM,aAAa;GACjB,MAAM,YAAY,QAAQ,IAAI;AAK9B,OAAI,cAAc,MAChB;AAGF,OAAI,QAAQ,IAAI,2BAA2B,OACzC;AAGF,WAAQ,IAAI,yBAAyB;GAErC,MAAM,YACJ,QAAQ,WAAW,SAAU,MAAM,WAAW,aAAa;GAE7D,MAAM,qBACJ,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,EAAE;GAE1D,MAAM,QAAQ,QAAQ,SAAS,QAAQ,IAAI,uBAAuB;AAGlE,OAAI,cAAc,UAAU;AAC1B,QAAI,UACF,OAAM,YAAY;KAChB,GAAG;KACH,QAAQ;KACR,MAAM,GAAG,QAAQ,GAAG;KACpB;KACD,CAAC;AAEJ,YAAQ,KAAK,EAAE;;AAIjB,OAAI,cAAc,UAAU;AAC1B,QAAI,OAAO;KAET,IAAI,cAAc;AAClB,SAAI;AACF,YAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,cAAc,QAAQ;AAC7D,oBAAc;aACR;AAIR,WAAM,YAAY;MAChB,QAAQ,EACN,MAAM,WAAW,QAAQ,IAC1B;MACD;MACA;MACA,WAAW,cAAc,YAAY;MACrC;MACD,CAAC;;AAEJ,YAAQ,KAAK,EAAE;;AAMjB,OAAI,UACF,OAAM,YAAY;IAChB,GAAG;IACH,QAAQ;IACR,MAAM,GAAG,QAAQ,GAAG;IACpB;IACD,CAAC;GAGJ,IAAI,WAAW;AACf,OAAI,UAEF,YAAW,MAAM,SACf,GAAG,QAAQ,GAAG,UAAU,cACxB,QACD;AAIH,OAAI,OAAO;AACT,UAAM,YAAY;KAChB,QAAQ,EACN,MAAM,WAAW,QAAQ,IAC1B;KACD;KACA;KACA,WAAW,YAAY,YAAY;KACnC;KACD,CAAC;AAGF,QAAI,aAAa,QAAQ,gBAAgB,MACvC,OAAM,OAAO,GAAG,QAAQ,GAAG,UAAU,aAAa;AAIpD,UAAM,WAAW;KACf,OAAO,GAAG,QAAQ;KAClB;KACD,CAAC;;AAIJ,OAAI,mBAAmB,WAAW,MAChC,OAAM,UACJ,GAAG,QAAQ,GAAG,UAAU,eACxB,MAAM,gBAAgB;IACpB,OAAO,GAAG,QAAQ;IAClB,SAAS,mBAAmB,QAAQ;IACrC,CAAC,CACH;AAIH,OAAI,mBAAmB,aAAa,SAClC,OAAM,eAAe;IACnB,MAAM,GAAG,QAAQ,GAAG;IACpB,OAAO,GAAG,QAAQ;IAClB,UAAU,mBAAmB;IAC9B,CAAC;AAIJ,OAAI,QAAQ,OAGV,OAAM,eAAe;IACnB;IACA;IACA,QAJA,OAAO,QAAQ,WAAW,YAAY,EAAE,GAAG,QAAQ;IAKpD,CAAC;AAGJ,OAAI,QAAQ,WACV,OAAM,mBAAmB,EACvB,SACD,CAAC;AAGJ,OAAI,QAAQ,OAGV,OAAM,eAAe;IACnB;IACA,GAHA,OAAO,QAAQ,WAAW,YAAY,EAAE,GAAG,QAAQ;IAIpD,CAAC;AAIJ,WAAQ,KAAK,EAAE;;EAElB;;;;;;;;;;;ACxPH,eAAsB,cACpB,UAAgC,EAAE,EACjB;CACjB,IAAI,QAAQ,QAAQ;AACpB,KAAI,CAAC,OAAO;AACV,UAAQ,MAAM,KAAK,gBAAgB;AACnC,MAAI,CAAC,MACH,QAAO;GACL,MAAM;GACN,OAAO;GACP,SAAS;GACV;;CAIL,MAAM,SAAS,mBAAmB;EAChC;EACA,OAAO,QAAQ;EAChB,CAAC;AAEF,QAAO;EACL,MAAM;EACN,OAAO;EACP,eAAe,gBAAgC;AAC7C,UAAO,UAAU,eAAe;;EAElC,MAAM,gBAAgB,KAAK;AACzB,OAAI,QAAQ,MACV,SAAQ,IAAI,eAAe,IAAI,KAAK;AAGtC,OAAI,IAAI,KAAK,SAAS,UAAU,CAC9B,QAAO,EAAE;GAGX,MAAM,eAAe,CAAC,IAAI,QAAQ,IAAI;GACtC,MAAM,gBAAgB,CAAC,IAAI,QAAQ,IAAI;GACvC,MAAM,eAAe,OAAO,cAAc;AAE1C,OAAI,eAAe;AACjB,QAAI,QAAQ,MACV,SAAQ,IACN,0DACD;AAEH;;GAGF,MAAM,OAAO,QAAQ,KAAK,CAAC,QAAQ,OAAO,IAAI;GAC9C,MAAM,aAAa,CAAC,IAAI,KAAK,WAAW,KAAK;AAC7C,OAAI,cAAc,QAAQ,MACxB,SAAQ,IAAI,8CAA8C;AAG5D,OAAI,CAAC,gBAAgB,cAAc;AACjC,UAAM,OAAO,QAAQ,IAAI,QAAQ,WAAW;AAC5C,WAAO,EAAE;;AAGX,OAAI,gBAAgB,IAAI,QAAQ,IAAI;AAElC,QADa,MAAM,OAAO,QAAQ,IAAI,QAAQ,WAAW,CAEvD,QAAO,EAAE;AAGX,QAAI,CAAC,OAAO,WAAW;AACrB,SAAI,QAAQ,MACV,SAAQ,IAAI,6CAA6C;AAE3D,YAAO,EAAE;;AAGX,QAAI,gBAAgB,OAAO,WAAW;AACpC,YAAO,WAAW,IAAI,OAAO;AAC7B,YAAO,EAAE;;;;EAIf,MAAM,gBAAgB,QAAQ;AAE5B,UAAO,YAAY,KAAK,KAAK,KAAK,SAAS;AACzC,QACE,OAAO,aACP,OAAO,OACP,IAAI,OACJ,CAAC,mBAAmB,IAAI,IAAI,EAC5B;KAGA,IAAI,QAAQ;KAEZ,MAAM,YAAY,IAAI,UAAU,KAAK,IAAI;AACzC,SAAI,aAAa,GAAG,SAAgB;AAClC,cAAQ;AACR,aAAO,UAAU,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG;;AAG7C,YAAO,OAAO,IAAI,OACf,KAAK,gBAAuB;MAAE;MAAK;MAAK,CAAC,CACzC,WAAW;AACV,UAAI,CAAC,MACH,OAAM;OAER;;AAEN,UAAM;KACN;AAEF,UAAO,OAAO,OAAO,QAAQ,QAAgB;AAC3C,WAAO,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC;;AAGnC,UAAO,OAAO,OAAO,oBAAoB;AAEzC,SAAM,OAAO,MAAM,OAAO;;EAE5B,MAAM,cAAc;EAGrB;;;;;AClIH,SAAgB,WACd,UAA6B,EAAE,EACD;AAC9B,KAAI,QAAQ,IAAI,aAAa,OAC3B,QAAO,EAAE;CAGX,MAAMC,UAA8D,EAAE;AAEtE,KAAI,QAAQ,UAAU,MACpB,KAAI;EACF,MAAM,EAAE,SAAS,cAAc,cAAc,OAAO,KAAK,IAAI,CAC3D,uBACD;AACD,UAAQ,KAAK,WAAW,CAAC;UAClB,GAAG;AAGd,SAAQ,KAAK,cAAc,QAAQ,EAAE,gBAAgB,QAAQ,CAAC;AAC9D,SAAQ,WAAW;AAEnB,QAAO"}
1
+ {"version":3,"file":"index.js","names":["path","match: RegExpExecArray | null","entries: BufferedLogEntry[]","path","_error","gzipCb","brotliCompress","brotliCompressCb","compressionTasks: Promise<void>[]","fs","gzip","plugins: any[]","compress: ViteCompressOptions | undefined","viteAnalyzer","viteBuildClientConfig: UserConfig","deps: Record<string, string>","plugins: any[]","viteAnalyzer","viteBuildServerConfig: UserConfig","result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[]","externals: string[]","WARNING_COMMENT","urls: string[]","path","it: any","path","rootConfig: UserConfig","plugins: (Plugin | Promise<Plugin>)[] & { [OPTIONS]?: any }"],"sources":["../../src/vite/helpers/boot.ts","../../src/vite/helpers/createBufferedLogger.ts","../../src/vite/helpers/fileExists.ts","../../src/vite/helpers/importVite.ts","../../src/vite/plugins/viteCompress.ts","../../src/vite/tasks/buildClient.ts","../../src/vite/tasks/generateExternals.ts","../../src/vite/tasks/buildServer.ts","../../src/vite/helpers/importAlepha.ts","../../src/vite/tasks/copyAssets.ts","../../src/vite/tasks/generateCloudflare.ts","../../src/vite/tasks/generateDocker.ts","../../src/vite/tasks/generateSitemap.ts","../../src/vite/tasks/generateVercel.ts","../../src/vite/tasks/prerenderPages.ts","../../src/vite/tasks/runAlepha.ts","../../src/vite/plugins/viteAlephaBuild.ts","../../src/vite/plugins/viteAlephaDev.ts","../../src/vite/plugins/viteAlepha.ts","../../src/vite/index.ts"],"sourcesContent":["import { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AlephaError } from \"alepha\";\n\n/**\n * Remember:\n * At first, functions was inside alepha/vite package, but it's now used in alepha too.\n * For avoiding cli -> vite, all code moved here.\n */\n\n/**\n * Find browser/client entry file path.\n */\nconst getClientEntry = async (\n root = process.cwd(),\n): Promise<string | undefined> => {\n const indexPath = join(root, \"index.html\");\n try {\n const html = await readFile(indexPath, \"utf8\");\n return extractFirstModuleScriptSrc(html).replace(/\\\\/g, \"/\");\n } catch {\n return undefined;\n }\n};\n\n/**\n * Find server entry file path.\n */\nconst getServerEntry = async (\n root = process.cwd(),\n explicitEntry?: string,\n): Promise<string> => {\n if (explicitEntry) {\n const explicitPath = join(root, explicitEntry);\n try {\n await access(explicitPath);\n return explicitPath;\n } catch {\n throw new AlephaError(\n `Explicit server entry file \"${explicitEntry}\" not found.`,\n );\n }\n }\n\n const maybeEntry = [\n \"src/main.server.ts\",\n \"src/server-entry.ts\",\n \"src/main.server.tsx\",\n \"src/server-entry.tsx\",\n \"src/main.ts\",\n \"src/main.tsx\",\n ];\n\n for (const entry of maybeEntry) {\n try {\n const path = join(root, entry).replace(/\\\\/g, \"/\");\n await access(path);\n return path;\n } catch {\n // continue to next entry\n }\n }\n\n const clientEntry = await getClientEntry(root);\n if (clientEntry) {\n return clientEntry;\n }\n\n throw new AlephaError(\n `Could not find a server entry file. List of supported entry file: ${maybeEntry.join(\", \")}`,\n );\n};\n\n/**\n * Extract first module script src from HTML.\n */\nfunction extractFirstModuleScriptSrc(html: string): string {\n const scriptRegex = /<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi;\n let match: RegExpExecArray | null = scriptRegex.exec(html);\n\n while (match) {\n const tag = match[0];\n\n // Check for type=\"module\"\n if (/type=[\"']module[\"']/i.test(tag)) {\n // Extract the src value\n const srcMatch = tag.match(/\\bsrc=[\"']([^\"']+)[\"']/i);\n const entry = srcMatch?.[1];\n if (entry) {\n if (entry.startsWith(\"/\")) {\n return entry.substring(1); // Remove leading slash\n }\n return entry;\n }\n }\n\n match = scriptRegex.exec(html);\n }\n\n throw new AlephaError(`No module script found in the provided HTML.`);\n}\n\nexport const boot = {\n getClientEntry,\n getServerEntry,\n};\n","import type { Logger } from \"vite\";\n\ninterface BufferedLogEntry {\n level: \"info\" | \"warn\" | \"error\";\n msg: string;\n timestamp: Date;\n}\n\nexport interface BufferedLogger extends Logger {\n /**\n * Flush all buffered log messages to console.\n * Call this on build failure to show what happened.\n */\n flush(): void;\n\n /**\n * Get all buffered log entries.\n */\n getEntries(): BufferedLogEntry[];\n\n /**\n * Clear all buffered entries without printing.\n */\n clear(): void;\n}\n\n/**\n * Creates a Vite logger that buffers all messages instead of printing them.\n * Useful for silent builds that only show output on failure.\n *\n * @example\n * ```ts\n * const logger = createBufferedLogger();\n * try {\n * await viteBuild({ customLogger: logger, logLevel: 'info' });\n * } catch (error) {\n * logger.flush(); // Print all buffered logs\n * throw error;\n * }\n * ```\n */\nexport function createBufferedLogger(): BufferedLogger {\n const entries: BufferedLogEntry[] = [];\n const loggedErrors = new WeakSet<Error>();\n const warnedMessages = new Set<string>();\n let hasWarned = false;\n\n const logger: BufferedLogger = {\n get hasWarned() {\n return hasWarned;\n },\n\n info(msg: string) {\n entries.push({ level: \"info\", msg, timestamp: new Date() });\n },\n\n warn(msg: string) {\n hasWarned = true;\n entries.push({ level: \"warn\", msg, timestamp: new Date() });\n },\n\n warnOnce(msg: string) {\n if (warnedMessages.has(msg)) {\n return;\n }\n warnedMessages.add(msg);\n hasWarned = true;\n entries.push({ level: \"warn\", msg, timestamp: new Date() });\n },\n\n error(msg: string, options?: { error?: Error | null }) {\n if (options?.error) {\n loggedErrors.add(options.error);\n }\n entries.push({ level: \"error\", msg, timestamp: new Date() });\n },\n\n clearScreen() {\n // No-op in buffered mode - we don't clear anything\n },\n\n hasErrorLogged(error: Error): boolean {\n return loggedErrors.has(error);\n },\n\n flush() {\n for (const entry of entries) {\n const prefix =\n entry.level === \"error\"\n ? \"\\x1b[31m✖\\x1b[0m\"\n : entry.level === \"warn\"\n ? \"\\x1b[33m⚠\\x1b[0m\"\n : \"\\x1b[36mℹ\\x1b[0m\";\n console.log(`${prefix} ${entry.msg}`);\n }\n },\n\n getEntries() {\n return [...entries];\n },\n\n clear() {\n entries.length = 0;\n warnedMessages.clear();\n hasWarned = false;\n },\n };\n\n return logger;\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const fileExists = async (path: string): Promise<boolean> => {\n return await access(join(process.cwd(), path))\n .then(() => true)\n .catch(() => false);\n};\n","import { createRequire } from \"node:module\";\nimport type * as vite from \"vite\";\n\nexport const importVite = async (): Promise<typeof vite> => {\n try {\n return createRequire(import.meta.url)(\"rolldown-vite\");\n } catch (_error) {\n try {\n return createRequire(import.meta.url)(\"vite\");\n } catch (_error) {\n throw new Error(\n \"Vite is not installed. Please install it with `npm install vite`.\",\n );\n }\n }\n};\n","import { promises as fs } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport {\n type BrotliOptions,\n brotliCompress as brotliCompressCb,\n gzip as gzipCb,\n type ZlibOptions,\n} from \"node:zlib\";\nimport type { Plugin } from \"vite\";\n\nconst gzipCompress = promisify(gzipCb);\nconst brotliCompress = promisify(brotliCompressCb);\n\nexport interface ViteCompressOptions {\n /**\n * If true, the plugin will not compress the files.\n *\n * @default false\n */\n disabled?: boolean;\n\n /**\n * If true, the plugin will compress the files using brotli.\n * Can also be an object with brotli options.\n *\n * @default true\n */\n brotli?: boolean | BrotliOptions;\n\n /**\n * If true, the plugin will compress the files using gzip.\n * Can also be an object with gzip options.\n *\n * @default true\n */\n gzip?: boolean | ZlibOptions;\n\n /**\n * A filter to determine which files to compress.\n * Can be a RegExp or a function that returns true for files to compress.\n *\n * @default /\\.(js|mjs|cjs|css|wasm|svg|html)$/\n */\n filter?: RegExp | ((fileName: string) => boolean);\n}\n\nexport function viteCompress(options: ViteCompressOptions = {}): Plugin {\n const { disabled = false, filter = /\\.(js|mjs|cjs|css|wasm|svg)$/ } = options;\n\n return {\n name: \"compress\",\n apply: \"build\",\n async writeBundle(outputOptions, bundle) {\n if (disabled) {\n return;\n }\n\n const now = Date.now();\n\n const outputDir = outputOptions.dir || resolve(process.cwd(), \"dist\");\n\n const files = Object.keys(bundle)\n .filter((fileName) => {\n // [feature]: filter\n if (typeof filter === \"function\") {\n return filter(fileName);\n }\n return filter.test(fileName);\n })\n .map((fileName) => ({\n fileName,\n filePath: join(outputDir, fileName),\n }));\n\n // Compress each file\n const compressionTasks: Promise<void>[] = [];\n\n for (const { filePath } of files) {\n compressionTasks.push(compressFile(options, filePath));\n }\n\n // Wait for all compression tasks to complete\n await Promise.all(compressionTasks);\n\n this.info(\n `Compressed ${files.length} file${files.length > 1 ? \"s\" : \"\"} in ${Date.now() - now}ms.`,\n );\n },\n };\n}\n\nexport async function compressFile(\n options: ViteCompressOptions = {},\n filePath: string,\n) {\n const { brotli = true, gzip = true } = options;\n\n const compressionTasks: Promise<void>[] = [];\n\n const fileContentPromise = fs.readFile(filePath);\n\n if (gzip) {\n const gzipOptions =\n typeof gzip === \"object\"\n ? gzip\n : {\n level: 9, // default gzip compression level\n };\n compressionTasks.push(\n fileContentPromise.then(async (content) => {\n const compressed = await gzipCompress(content, gzipOptions);\n await fs.writeFile(`${filePath}.gz`, compressed);\n }),\n );\n }\n\n if (brotli) {\n const brotliOptions = typeof brotli === \"object\" ? brotli : {};\n compressionTasks.push(\n fileContentPromise.then(async (content) => {\n const compressed = await brotliCompress(content, brotliOptions);\n await fs.writeFile(`${filePath}.br`, compressed);\n }),\n );\n }\n\n await Promise.all(compressionTasks);\n}\n","import type { UserConfig } from \"vite\";\nimport { analyzer as viteAnalyzer } from \"vite-bundle-analyzer\";\nimport { createBufferedLogger } from \"../helpers/createBufferedLogger.ts\";\nimport { importVite } from \"../helpers/importVite.ts\";\nimport {\n type ViteCompressOptions,\n viteCompress,\n} from \"../plugins/viteCompress.ts\";\n\nexport interface BuildClientOptions {\n /**\n * Output directory for client build.\n */\n dist: string;\n\n /**\n * If true, precompress assets using gzip and brotli compression.\n *\n * @default false\n */\n precompress?: ViteCompressOptions | boolean;\n\n /**\n * If true, prerender all static routes found in the $pages directory.\n *\n * @default false\n */\n prerender?: boolean;\n\n /**\n * Build a sitemap.xml file based on the $pages routes.\n */\n sitemap?: {\n hostname: string;\n };\n\n /**\n * Override Vite config options.\n */\n config?: UserConfig;\n\n /**\n * If true, generate build stats report.\n */\n stats?: boolean;\n\n /**\n * If true, suppress build output. Logs are buffered and only shown on failure.\n *\n * @default false\n */\n silent?: boolean;\n}\n\n/**\n * Build client-side bundle with Vite.\n *\n * This task compiles the browser/client code for production,\n * including code splitting, minification, and optional compression.\n */\nexport async function buildClient(opts: BuildClientOptions): Promise<void> {\n const { build: viteBuild, mergeConfig } = await importVite();\n const plugins: any[] = [];\n\n const compress: ViteCompressOptions | undefined = opts.precompress\n ? typeof opts.precompress === \"object\"\n ? opts.precompress\n : {}\n : undefined;\n\n if (opts.stats) {\n plugins.push(\n viteAnalyzer({\n analyzerMode: \"static\",\n }),\n );\n }\n\n if (opts.precompress && compress) {\n plugins.push(viteCompress(compress));\n }\n\n // Create buffered logger for silent mode\n const logger = opts.silent ? createBufferedLogger() : undefined;\n\n const viteBuildClientConfig: UserConfig = {\n mode: \"production\",\n logLevel: opts.silent ? \"silent\" : undefined,\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n },\n publicDir: \"public\",\n build: {\n chunkSizeWarningLimit: 1000,\n outDir: opts.dist,\n rollupOptions: {\n output: {\n entryFileNames: \"entry.[hash].js\",\n chunkFileNames: \"chunk.[hash].js\",\n assetFileNames: \"asset.[hash][extname]\",\n },\n },\n },\n esbuild: { legalComments: \"none\" },\n customLogger: logger,\n plugins,\n };\n\n try {\n await viteBuild(mergeConfig(viteBuildClientConfig, opts.config ?? {}));\n } catch (error) {\n // Flush buffered logs on failure so user can see what happened\n logger?.flush();\n throw error;\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport m from \"node:module\";\nimport { join } from \"node:path\";\n\nexport interface GenerateExternalsOptions {\n /**\n * Output directory for package.json.\n */\n distDir: string;\n\n /**\n * List of external package names.\n */\n externals: string[];\n}\n\n/**\n * Generate minimal package.json with pinned external dependencies.\n *\n * This task creates a package.json in the dist directory containing\n * only the external dependencies needed at runtime, with their versions\n * pinned to the currently installed versions.\n */\nexport async function generateExternals(\n opts: GenerateExternalsOptions,\n): Promise<void> {\n const require = m.createRequire(import.meta.filename);\n const deps: Record<string, string> = {};\n\n for (const dep of opts.externals) {\n try {\n const requirePath = require.resolve(dep);\n const pkgPath = `${requirePath.split(`node_modules/${dep}`)[0]}node_modules/${dep}/package.json`;\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n deps[dep] = `^${pkg.version}`;\n } catch (_err) {\n console.warn(`[generateExternals] Cannot find '${dep}' in node_modules`);\n }\n }\n\n const minimalPkg = {\n type: \"module\",\n main: \"index.js\",\n dependencies: deps,\n };\n\n await mkdir(opts.distDir, { recursive: true });\n\n const target = join(opts.distDir, \"package.json\");\n await writeFile(target, JSON.stringify(minimalPkg, null, 2), \"utf-8\");\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AlephaError } from \"alepha\";\nimport type * as vite from \"vite\";\nimport type { UserConfig } from \"vite\";\nimport { analyzer as viteAnalyzer } from \"vite-bundle-analyzer\";\nimport { createBufferedLogger } from \"../helpers/createBufferedLogger.ts\";\nimport { importVite } from \"../helpers/importVite.ts\";\nimport { generateExternals } from \"./generateExternals.ts\";\n\nexport interface BuildServerOptions {\n /**\n * Path to the server entry file.\n */\n entry: string;\n\n /**\n * Output directory for server build.\n */\n distDir: string;\n\n /**\n * Optional client directory name (relative to distDir).\n * If provided, the client template will be embedded in the server output.\n */\n clientDir?: string;\n\n /**\n * Override Vite config options.\n */\n config?: UserConfig;\n\n /**\n * If true, generate build stats report.\n */\n stats?: boolean;\n\n /**\n * If true, suppress build output. Logs are buffered and only shown on failure.\n *\n * @default false\n */\n silent?: boolean;\n}\n\nexport interface BuildServerResult {\n /**\n * The filename of the built server entry (e.g., \"abc123.js\").\n */\n entryFile: string;\n}\n\n/**\n * Build server-side SSR bundle with Vite.\n *\n * This task compiles the server code for production,\n * generates the externals package.json, and creates\n * the dist/index.js entry wrapper.\n */\nexport async function buildServer(\n opts: BuildServerOptions,\n): Promise<BuildServerResult> {\n const { build: viteBuild, mergeConfig } = await importVite();\n const plugins: any[] = [];\n\n if (opts.stats) {\n plugins.push(\n viteAnalyzer({\n analyzerMode: \"static\",\n }),\n );\n }\n\n // Create buffered logger for silent mode\n const logger = opts.silent ? createBufferedLogger() : undefined;\n\n const viteBuildServerConfig: UserConfig = {\n mode: \"production\",\n logLevel: opts.silent ? \"silent\" : undefined,\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n },\n publicDir: false,\n ssr: {\n noExternal: true,\n },\n build: {\n ssr: opts.entry,\n outDir: `${opts.distDir}/server`,\n minify: true,\n chunkSizeWarningLimit: 10000,\n rollupOptions: {\n output: {\n entryFileNames: \"[hash].js\",\n chunkFileNames: \"[hash].js\",\n assetFileNames: \"[hash][extname]\",\n format: \"esm\",\n },\n },\n },\n esbuild: { legalComments: \"none\", keepNames: true },\n customLogger: logger,\n plugins,\n };\n\n let result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];\n try {\n result = (await viteBuild(\n mergeConfig(viteBuildServerConfig, opts.config || {}),\n )) as vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];\n } catch (error) {\n // Flush buffered logs on failure so user can see what happened\n logger?.flush();\n throw error;\n }\n\n // Extract resolved config to get externals\n const resolvedConfig = (result as any).resolvedConfig;\n const externals: string[] = resolvedConfig?.ssr?.external ?? [];\n\n // Generate package.json with externals\n await generateExternals({\n distDir: opts.distDir,\n externals,\n });\n\n const entryFile = extractEntryFromBundle(opts.entry, result);\n\n // Embed client template if client was built\n let template = \"\";\n if (opts.clientDir) {\n const index = await readFile(\n `${opts.distDir}/${opts.clientDir}/index.html`,\n \"utf-8\",\n );\n template = `process.env.REACT_SERVER_TEMPLATE ??= \\`${index.replace(/>\\s*</g, \"><\").trim()}\\`;\\n`;\n }\n\n const warning =\n \"// This file was automatically generated. DO NOT MODIFY.\" +\n \"\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n const forceProduction = \"process.env.NODE_ENV ??= 'production';\\n\";\n\n await writeFile(\n `${opts.distDir}/index.js`,\n `${warning}\\n${forceProduction}${template}\\nawait import('./server/${entryFile}');`.trim(),\n );\n\n return { entryFile };\n}\n\n/**\n * Extract entry filename from Vite build result.\n */\nfunction extractEntryFromBundle(\n entry: string,\n result:\n | vite.Rollup.RollupOutput\n | vite.Rollup.RollupOutput[]\n | vite.Rollup.RollupWatcher,\n): string {\n const entryFilePath = entry.startsWith(\"/\")\n ? entry\n : join(process.cwd(), entry);\n\n const rollupOutput = (\n Array.isArray(result) ? result[0] : result\n ) as vite.Rollup.RollupOutput;\n\n const entryFile = rollupOutput.output.find(\n (it) => \"facadeModuleId\" in it && it.facadeModuleId === entryFilePath,\n )?.fileName;\n\n if (!entryFile) {\n throw new AlephaError(\n `Could not find the entry file \"${entryFilePath}\" in the build output. Please check your entry file and try again.`,\n );\n }\n\n return entryFile;\n}\n","import { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { type Alepha, AlephaError } from \"alepha\";\nimport { importVite } from \"./importVite.ts\";\n\n/**\n * Import Alepha instance from a transpiled server entry file.\n */\nexport const importAlepha = async (\n entry: string,\n options?: {\n env: Record<string, string>;\n },\n): Promise<Alepha> => {\n if (global.__cli_alepha) {\n return global.__cli_alepha as Alepha;\n }\n\n const { loadEnv } = await importVite();\n\n const env = loadEnv(\"development\", process.cwd(), \"\");\n\n for (const key in env) {\n process.env[key] = env[key];\n }\n\n if (options?.env) {\n for (const key in options.env) {\n process.env[key] = options.env[key];\n }\n }\n\n process.env.ALEPHA_CLI_IMPORT = \"true\";\n process.env.LOG_LEVEL = \"error\";\n process.env.LOG_FORMAT = \"pretty\";\n process.env.NODE_ENV = \"production\";\n\n const entryFile = pathToFileURL(join(process.cwd(), entry)).href;\n const mod = await import(entryFile);\n\n // check if alepha is correctly exported\n if (mod.default) {\n return mod.default;\n }\n\n // else, try with global variable\n const alepha = global.__cli_alepha as Alepha | undefined;\n if (!alepha) {\n throw new AlephaError(\n \"Alepha instance not found. Ensure Alepha is initialized.\",\n );\n }\n\n return alepha;\n};\n","import { cp, mkdir } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\n\nexport interface CopyAssetsOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Output directory for copied assets.\n */\n distDir: string;\n}\n\n/**\n * Copy assets from Alepha packages to the build output directory.\n *\n * This task loads the built Alepha application, reads the\n * `alepha.build.assets` state to find packages with assets,\n * and copies their `/assets` directories to the build output.\n *\n * Used by modules like AlephaServerSwagger to distribute UI files.\n */\nexport async function copyAssets(opts: CopyAssetsOptions): Promise<void> {\n const root = process.cwd();\n const alepha = await importAlepha(opts.entry);\n const assets = alepha.state.get(\"alepha.build.assets\");\n\n if (!assets || assets.length === 0) {\n return;\n }\n\n const require = createRequire(join(root, opts.entry));\n const buildAssetsDir = join(root, `${opts.distDir}/assets`);\n await mkdir(buildAssetsDir).catch(() => null);\n\n for (const pkgName of assets ?? []) {\n const pkgDir = dirname(require.resolve(`${pkgName}/package.json`));\n const assetsPkgDir = resolve(pkgDir, \"assets\");\n await cp(assetsPkgDir, buildAssetsDir, { recursive: true });\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface GenerateCloudflareOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n}\n\nconst WARNING_COMMENT =\n \"// This file was automatically generated. DO NOT MODIFY.\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n/**\n * Generate Cloudflare Workers deployment configuration.\n *\n * This task creates:\n * - wrangler.jsonc with worker configuration\n * - worker.js entry point for Cloudflare Workers\n */\nexport async function generateCloudflare(\n opts: GenerateCloudflareOptions = {},\n): Promise<void> {\n const dist = opts.distDir ?? \"dist\";\n const root = process.cwd();\n\n // Get current directory name for worker name\n const parts = root.split(\"/\");\n const name = parts[parts.length - 1];\n\n const wrangler = {\n name: name,\n main: \"./worker.js\",\n compatibility_flags: [\"nodejs_compat\"],\n compatibility_date: \"2025-11-17\",\n };\n\n writeFileSync(\n join(root, dist, \"wrangler.jsonc\"),\n JSON.stringify(wrangler, null, 2),\n );\n\n const workerCode = `\nprocess.env.ALEPHA_SERVERLESS = \"true\";\n\nawait import(\"./index.js\");\n\nexport default {\n fetch: async (request, env, ctx) => {\n\n await __alepha.start();\n const ev = { req: request, res: undefined };\n await __alepha.events.emit(\"web:request\", ev);\n return ev.res;\n },\n};\n`.trim();\n\n writeFileSync(\n join(root, dist, \"worker.js\"),\n `${WARNING_COMMENT}\\n${workerCode}`.trim(),\n );\n}\n","import { cp, writeFile } from \"node:fs/promises\";\nimport { fileExists } from \"../helpers/fileExists.ts\";\n\nexport interface GenerateDockerOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n\n /**\n * Docker image name to use in the Dockerfile.\n *\n * @default \"node:24-alpine\"\n */\n image?: string;\n\n /**\n * Command to run in the Docker container.\n *\n * @default \"node\"\n */\n command?: string;\n}\n\n/**\n * Generate Docker deployment configuration.\n *\n * This task creates:\n * - Dockerfile with configurable Node image\n * - Copies drizzle migrations if they exist\n */\nexport async function generateDocker(\n opts: GenerateDockerOptions = {},\n): Promise<void> {\n const distDir = opts.distDir ?? \"dist\";\n const image = opts.image ?? \"node:24-alpine\";\n const command = opts.command ?? \"node\";\n\n // Copy drizzle migrations if they exist\n const hasMigrations = await fileExists(\"drizzle\");\n if (hasMigrations) {\n await cp(\"drizzle\", `${distDir}/drizzle`, {\n recursive: true,\n });\n }\n\n const dockerfile = `# This file was automatically generated. DO NOT MODIFY.\n# Changes to this file will be lost when the code is regenerated.\nFROM ${image}\nWORKDIR /app\n\nCOPY . .\n\nCMD [\"${command}\", \"index.js\"]\n`;\n\n await writeFile(`${distDir}/Dockerfile`, dockerfile);\n}\n","import type { Alepha } from \"alepha\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\n\nexport interface GenerateSitemapOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Base URL for the sitemap (e.g., \"https://example.com\").\n */\n baseUrl: string;\n\n /**\n * Optional HTML template (for React SSR).\n */\n template?: string;\n}\n\n/**\n * Generate sitemap.xml from Alepha page descriptors.\n *\n * This task loads the built Alepha application,\n * queries all page descriptors, and generates a sitemap.xml\n * containing URLs for all accessible pages.\n */\nexport async function generateSitemap(\n opts: GenerateSitemapOptions,\n): Promise<string> {\n const alepha = await importAlepha(opts.entry, {\n env: opts.template\n ? {\n REACT_SERVER_TEMPLATE: opts.template,\n }\n : {},\n });\n\n if (!alepha.isConfigured()) {\n await alepha.events.emit(\"configure\", alepha);\n (alepha as any).configured = true;\n }\n\n return generateSitemapFromAlepha(alepha, opts.baseUrl);\n}\n\nfunction generateSitemapFromAlepha(alepha: Alepha, baseUrl: string): string {\n const pages = alepha.descriptors(\"page\") as any[];\n const urls: string[] = [];\n\n for (const page of pages) {\n const options = page.options;\n\n // Skip pages with children (parent pages that can't be rendered directly)\n if (options.children) {\n continue;\n }\n\n // Only include static pages or pages without parameters\n if (!options.schema?.params) {\n // Simple page without parameters\n const path = options.path || \"\";\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path === \"\" ? \"/\" : path}`;\n urls.push(url);\n } else if (\n options.static &&\n typeof options.static === \"object\" &&\n options.static.entries\n ) {\n // Static page with predefined entries\n for (const entry of options.static.entries) {\n const path = buildPathFromParams(\n options.path || \"\",\n entry.params || {},\n );\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n urls.push(url);\n }\n }\n }\n\n return buildSitemapXml(urls);\n}\n\nfunction buildPathFromParams(\n pathPattern: string,\n params: Record<string, any>,\n): string {\n let path = pathPattern;\n\n for (const [key, value] of Object.entries(params)) {\n path = path.replace(`:${key}`, String(value));\n }\n\n return path || \"/\";\n}\n\nfunction buildSitemapXml(urls: string[]): string {\n const lastMod = new Date().toISOString().split(\"T\")[0];\n const urlEntries = urls\n .map(\n (url) =>\n ` <url>\\n <loc>${escapeXml(url)}</loc>\\n\\t\\t<lastmod>${lastMod}</lastmod>\\n </url>`,\n )\n .join(\"\\n\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${urlEntries}\n</urlset>`;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { importVite } from \"../helpers/importVite.ts\";\n\nexport interface GenerateVercelOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n\n /**\n * The name of the client directory.\n *\n * @default \"public\"\n */\n clientDir?: string;\n\n /**\n * Vercel configuration options.\n */\n config?: VercelConfig;\n}\n\nexport interface VercelConfig {\n projectName?: string;\n orgId?: string;\n projectId?: string;\n config?: Record<string, any> & {\n crons?: Array<{\n path: string;\n schedule: string;\n }>;\n };\n}\n\nconst WARNING_COMMENT =\n \"// This file was automatically generated. DO NOT MODIFY.\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n/**\n * Generate Vercel deployment configuration.\n *\n * This task creates:\n * - vercel.json with route rewrites\n * - api/index.js entry point for Vercel serverless function\n * - .vercel/project.json if VERCEL_PROJECT_ID and VERCEL_ORG_ID are set\n */\nexport async function generateVercel(\n opts: GenerateVercelOptions = {},\n): Promise<void> {\n const distDir = opts.distDir ?? \"dist\";\n const clientDir = opts.clientDir ?? \"public\";\n const { loadEnv } = await importVite();\n\n const env = loadEnv(\"production\", process.cwd(), \"\");\n\n // Ensure the api directory exists\n if (!existsSync(`${distDir}/api`)) {\n mkdirSync(`${distDir}/api`);\n }\n\n // Add the only one entry point for Vercel\n writeFileSync(\n `${distDir}/api/index.js`,\n `${WARNING_COMMENT}\nimport \"../index.js\";\n\nexport default async function (req, res) {\n\\tawait __alepha.start();\n\\t__alepha.events.emit(\"node:request\", { req, res });\n}\n`,\n );\n\n // Always generate a vercel.json file\n writeFileSync(\n `${distDir}/vercel.json`,\n JSON.stringify(\n {\n ...opts?.config?.config,\n rewrites: [\n {\n source: \"/(.*)\",\n destination: \"/api/index.js\",\n },\n ],\n buildCommand: \"\",\n installCommand: \"\",\n outputDirectory: clientDir,\n },\n null,\n \" \",\n ),\n );\n\n // Generate .vercel/project.json if VERCEL_PROJECT_ID and VERCEL_ORG_ID are set\n const projectId = env.VERCEL_PROJECT_ID ?? opts.config?.projectId;\n const projectName = env.VERCEL_PROJECT_NAME ?? opts.config?.projectName;\n const orgId = env.VERCEL_ORG_ID ?? opts.config?.orgId;\n\n if (projectId && orgId) {\n try {\n mkdirSync(`${distDir}/.vercel`, { recursive: true });\n } catch (_e) {\n // Ignore error if directory already exists\n }\n\n writeFileSync(\n `${distDir}/.vercel/project.json`,\n JSON.stringify(\n {\n projectId,\n projectName,\n orgId,\n },\n null,\n \" \",\n ),\n );\n }\n\n // If /public does not exist, create an empty one to avoid Vercel errors\n if (!existsSync(`${distDir}/${clientDir}`)) {\n mkdirSync(`${distDir}/${clientDir}`, { recursive: true });\n writeFileSync(`${distDir}/${clientDir}/.keep`, \"\");\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport type { Alepha } from \"alepha\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\nimport {\n compressFile,\n type ViteCompressOptions,\n} from \"../plugins/viteCompress.ts\";\n\nexport interface PrerenderPagesOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Client dist directory for output files.\n */\n dist: string;\n\n /**\n * Optional compression options.\n */\n compress?: ViteCompressOptions | boolean;\n}\n\nexport interface PrerenderPagesResult {\n /**\n * Number of pages pre-rendered.\n */\n count: number;\n}\n\n/**\n * Pre-render static pages defined in the Alepha application.\n *\n * This task loads the built Alepha application, queries all page\n * descriptors with `static: true`, and generates static HTML files\n * for each page. Supports pages with parameterized routes via\n * `static.entries` configuration.\n */\nexport async function prerenderPages(\n opts: PrerenderPagesOptions,\n): Promise<PrerenderPagesResult> {\n const alepha = await importAlepha(opts.entry);\n\n const now = Date.now();\n\n if (!alepha.isConfigured()) {\n await alepha.events.emit(\"configure\", alepha);\n (alepha as any).configured = true;\n }\n\n return await prerenderFromAlepha(alepha, opts.dist, opts.compress);\n}\n\nasync function prerenderFromAlepha(\n alepha: Alepha,\n dist: string,\n compress?: ViteCompressOptions | boolean,\n): Promise<PrerenderPagesResult> {\n let count = 0;\n const pages = alepha.descriptors(\"page\") as any[];\n\n for (const page of pages) {\n const options = page.options;\n\n if (options.children) {\n continue;\n }\n\n if (!options.static) {\n continue;\n }\n\n const config = typeof options.static === \"object\" ? options.static : {};\n\n if (!options.schema?.params) {\n count += 1;\n await renderFile(page, {}, dist, compress);\n continue;\n }\n\n if (config.entries) {\n for (const entry of config.entries) {\n count += 1;\n await renderFile(page, entry, dist, compress);\n }\n }\n }\n\n return { count };\n}\n\nasync function renderFile(\n page: any,\n options: any,\n dist: string,\n compress?: ViteCompressOptions | boolean,\n) {\n const { html, state } = await page.render({\n html: true,\n ...options,\n });\n\n const pathname = state.url.pathname;\n const filepath = `${dist}${pathname === \"/\" ? \"/index\" : pathname}.html`;\n\n await mkdir(filepath.substring(0, filepath.lastIndexOf(\"/\")), {\n recursive: true,\n });\n\n await writeFile(filepath, html);\n\n if (compress) {\n await compressFile(typeof compress === \"object\" ? compress : {}, filepath);\n }\n}\n","import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Alepha, State } from \"alepha\";\nimport type { ResolvedConfig, ViteDevServer } from \"vite\";\nimport { importVite } from \"../helpers/importVite.ts\";\n\nexport interface AlephaRunnerOptions {\n /**\n * Path to the server entry file.\n */\n entry: string;\n\n /**\n * Enable debug logging.\n */\n debug?: boolean;\n}\n\nexport interface AlephaRunnerState {\n root: string;\n started: boolean;\n app?: Alepha;\n config?: ResolvedConfig;\n lock?: PromiseWithResolvers<void>;\n log: (...msg: string[]) => void;\n entry: string;\n onReload?: () => void;\n}\n\n/**\n * Create an Alepha runner for development.\n *\n * The runner manages the lifecycle of an Alepha application during\n * Vite dev server operation, handling start/stop/restart and HMR.\n */\nexport function createAlephaRunner(opts: AlephaRunnerOptions): AlephaRunner {\n const state: AlephaRunnerState = {\n root: process.cwd().replace(/\\\\/g, \"/\"),\n started: false,\n log: opts.debug ? (...msg: string[]) => console.log(...msg) : () => {},\n entry: opts.entry,\n onReload: () => {},\n };\n\n return new AlephaRunner(state);\n}\n\nexport class AlephaRunner {\n protected state: AlephaRunnerState;\n\n constructor(state: AlephaRunnerState) {\n this.state = state;\n }\n\n /**\n * Set resolved Vite config.\n */\n setConfig(config: ResolvedConfig): void {\n this.state.config = config;\n }\n\n /**\n * Check if SSR is enabled for the running app.\n */\n isSsrEnabled(): boolean {\n if (!this.state.app) return false;\n return (\n (this.state.app.state.get(\"alepha.react.server.ssr\" as keyof State) as\n | boolean\n | undefined) ?? false\n );\n }\n\n /**\n * Check if app is started.\n */\n get isStarted(): boolean {\n return this.state.started;\n }\n\n /**\n * Get the running Alepha app instance.\n */\n get app(): Alepha | undefined {\n return this.state.app;\n }\n\n /**\n * Start the Alepha application.\n */\n async start(server: ViteDevServer): Promise<void> {\n const { loadEnv } = await importVite();\n\n if (this.state.started) {\n await this.restart(server, true);\n return;\n }\n\n if (!this.state.config) {\n this.state.log(\"[DEBUG] No config - skip starting\");\n return;\n }\n\n this.state.onReload?.();\n\n this.state.log(\"[DEBUG] Starting Alepha app...\");\n\n this.state.started = false;\n this.state.app = undefined;\n\n const serverEntryPath = path.resolve(\n this.state.config.root,\n this.state.entry,\n );\n const fileUrl = pathToFileURL(`${serverEntryPath}`).href;\n const env = loadEnv(\"development\", this.state.config.root, \"\");\n const before = { ...process.env };\n\n for (const key in env) {\n process.env[key] = env[key];\n }\n\n process.env.NODE_ENV ??= \"development\";\n process.env.VITE_ALEPHA_DEV = \"true\";\n process.env.SERVER_HOST ??=\n typeof server.config.server.host === \"string\"\n ? server.config.server.host\n : \"localhost\";\n process.env.SERVER_PORT ??= String(server.config.server.port || \"5173\");\n\n try {\n const now = Date.now();\n await server.ssrLoadModule(fileUrl);\n this.state.log(`[DEBUG] Alepha app loaded in ${Date.now() - now}ms`);\n await new Promise((r) => setTimeout(r, 10));\n\n this.state.app = (globalThis as any).__alepha;\n if (!this.state.app) {\n this.state.log(\"[DEBUG] No app found - skip starting\");\n return;\n }\n\n this.state.app.state.set(\"alepha.node.server\" as any, server.httpServer);\n\n await this.state.app.start();\n this.state.started = true;\n\n process.env = { ...before };\n\n this.state.log(\"[DEBUG] Starting Done!\");\n } catch (e) {\n if (e instanceof Error) {\n let it: any = e;\n do {\n server.ssrFixStacktrace(it);\n it = it.cause;\n } while (it instanceof Error);\n\n server.ssrFixStacktrace(e);\n if (e.cause instanceof Error) {\n server.ssrFixStacktrace(e.cause);\n }\n this.state.app?.log?.error(\"App failed to start:\", e);\n this.state.app?.log?.info(\"Waiting for changes to restart...\");\n }\n this.state.log(\"[DEBUG] Alepha app start error\");\n this.state.started = false;\n }\n }\n\n /**\n * Stop the Alepha application.\n */\n async stop(): Promise<void> {\n if (this.state.app?.stop && this.state.started) {\n this.state.log(\"[DEBUG] Stopping Alepha app...\");\n await this.state.app.stop();\n this.state.started = false;\n this.state.log(\"[DEBUG] Stopping Done!\");\n } else {\n this.state.log(\"[DEBUG] Alepha app not started - skip stop\");\n }\n }\n\n /**\n * Restart the Alepha application.\n *\n * @returns true if the restart was skipped due to locking\n */\n async restart(server: ViteDevServer, invalidate?: boolean): Promise<boolean> {\n if (this.state.lock) {\n this.state.log(\"[DEBUG] STILL LOCKING\");\n return true;\n }\n\n this.state.log(\"[DEBUG] LOCK RESTART\");\n this.state.lock = Promise.withResolvers();\n\n const now = Date.now();\n this.state.log(\"[DEBUG] RESTART\");\n await this.stop();\n this.state.log(`[DEBUG] RESTART (stop) in ${Date.now() - now}ms`);\n\n if (invalidate) {\n server.moduleGraph.invalidateAll();\n }\n\n await this.start(server);\n this.state.log(`[DEBUG] RESTART OK in ${Date.now() - now}ms`);\n\n setTimeout(() => {\n this.state.log(\"[DEBUG] UNLOCK RESTART\");\n this.state.lock?.resolve();\n this.state.lock = undefined;\n }, 500);\n\n return false;\n }\n\n /**\n * Send reload event to client.\n */\n sendReload(server: ViteDevServer): void {\n server.ws.send({\n type: \"custom\",\n event: \"alepha:reload\",\n data: {},\n });\n }\n}\n\n/**\n * Check if a URL path is a Vite internal file.\n */\nexport function isViteInternalPath(pathname: string): boolean {\n const [path] = pathname.split(\"?\");\n\n // Vite internal files\n if (\n path.startsWith(\"/@\") ||\n path.startsWith(\"/src\") ||\n path.includes(\"/node_modules/\")\n ) {\n return true;\n }\n\n return false;\n}\n","import { readFile, unlink, writeFile } from \"node:fs/promises\";\nimport type { Plugin, UserConfig } from \"vite\";\nimport { boot } from \"../helpers/boot.ts\";\nimport { fileExists } from \"../helpers/fileExists.ts\";\nimport {\n type BuildClientOptions,\n buildClient,\n buildServer,\n copyAssets,\n type GenerateDockerOptions,\n generateCloudflare,\n generateDocker,\n generateSitemap,\n generateVercel,\n prerenderPages,\n type VercelConfig,\n} from \"../tasks/index.ts\";\n\nexport interface ViteAlephaBuildOptions {\n /**\n * Path to the entry file for the server build.\n * If empty, SSR build will be skipped.\n */\n serverEntry?: string | false;\n\n /**\n * Set false to skip the client build.\n * This is useful if you only want to build the server-side application.\n */\n client?: false | Partial<BuildClientOptions>;\n\n /**\n * If true, the build will be optimized for Vercel deployment.\n *\n * If `VERCEL_PROJECT_ID` and `VERCEL_ORG_ID` environment variables are set, .vercel will be generated with the correct configuration.\n *\n * @default false\n */\n vercel?: boolean | VercelConfig;\n\n /**\n * If true, the build will generate Cloudflare Workers configuration.\n *\n * @default false\n */\n cloudflare?: boolean;\n\n /**\n * If true, the build will be optimized for Docker deployment.\n * Additionally, it will generate a Dockerfile in the dist directory.\n */\n docker?: boolean | Omit<GenerateDockerOptions, \"distDir\">;\n\n /**\n * If true, build statistics will be printed after the build completes.\n */\n stats?: boolean;\n}\n\n/**\n * Build modes controlled by ALEPHA_BUILD_MODE environment variable:\n * - \"cli\": Skip plugin entirely, CLI handles all tasks\n * - \"client\": Only build client bundle\n * - \"server\": Only build server bundle\n * - undefined/other: Full build (default behavior)\n */\nexport type AlephaBuildMode = \"cli\" | \"client\" | \"server\";\n\n/**\n * Alepha build plugin for Vite.\n *\n * This plugin orchestrates the complete build process:\n * 1. Build client (if index.html exists)\n * 2. Build server (SSR)\n * 3. Copy assets from packages\n * 4. Pre-render static pages (if enabled)\n * 5. Generate sitemap (if enabled)\n * 6. Generate deployment config (Vercel/Cloudflare/Docker)\n *\n * Build mode can be controlled via ALEPHA_BUILD_MODE env var for CLI integration.\n */\nexport async function viteAlephaBuild(\n options: ViteAlephaBuildOptions = {},\n): Promise<Plugin> {\n const entry = options.serverEntry ?? (await boot.getServerEntry());\n const distDir = \"dist\";\n const clientDir = \"public\";\n\n let rootConfig: UserConfig = {};\n\n return {\n name: \"alepha-build\",\n apply: \"build\",\n config(config, ctx) {\n const buildMode = process.env.ALEPHA_BUILD_MODE as\n | AlephaBuildMode\n | undefined;\n\n // CLI mode: plugin does nothing, CLI handles everything\n if (buildMode === \"cli\") {\n return;\n }\n\n // For now, we run two separate builds: one for the client and one for the server\n // We distinguish them using an environment variable\n if (!process.env.VITE_DOUBLE_BUILD_DONE) {\n rootConfig = config;\n }\n\n if (ctx.isSsrBuild || !process.env.VITE_DOUBLE_BUILD_DONE) {\n // Server build, so we don't need the public directory\n config.publicDir = false;\n } else {\n // Client build, so we need the public directory\n config.publicDir = \"public\";\n }\n },\n async buildStart() {\n const buildMode = process.env.ALEPHA_BUILD_MODE as\n | AlephaBuildMode\n | undefined;\n\n // CLI mode: skip entirely\n if (buildMode === \"cli\") {\n return;\n }\n\n if (process.env.VITE_DOUBLE_BUILD_DONE === \"true\") {\n return;\n }\n\n process.env.VITE_DOUBLE_BUILD_DONE = \"true\";\n\n const hasClient =\n options.client !== false && (await fileExists(\"index.html\"));\n\n const buildClientOptions =\n typeof options.client === \"object\" ? options.client : {};\n\n const stats = options.stats ?? process.env.ALEPHA_BUILD_STATS === \"true\";\n\n // Client-only mode\n if (buildMode === \"client\") {\n if (hasClient) {\n await buildClient({\n ...buildClientOptions,\n config: rootConfig,\n dist: `${distDir}/${clientDir}`,\n stats,\n });\n }\n process.exit(0);\n }\n\n // Server-only mode\n if (buildMode === \"server\") {\n if (entry) {\n // Check if client was already built (template exists)\n let clientBuilt = false;\n try {\n await readFile(`${distDir}/${clientDir}/index.html`, \"utf-8\");\n clientBuilt = true;\n } catch {\n // No client build\n }\n\n await buildServer({\n config: {\n base: rootConfig.base || \"\",\n },\n entry,\n distDir,\n clientDir: clientBuilt ? clientDir : undefined,\n stats,\n });\n }\n process.exit(0);\n }\n\n // Full build mode (default)\n\n // Task 1: Build client\n if (hasClient) {\n await buildClient({\n ...buildClientOptions,\n config: rootConfig,\n dist: `${distDir}/${clientDir}`,\n stats,\n });\n }\n\n let template = \"\";\n if (hasClient) {\n // Load output index.html for template embedding\n template = await readFile(\n `${distDir}/${clientDir}/index.html`,\n \"utf-8\",\n );\n }\n\n // Task 2: Build server\n if (entry) {\n await buildServer({\n config: {\n base: rootConfig.base || \"\",\n },\n entry,\n distDir,\n clientDir: hasClient ? clientDir : undefined,\n stats,\n });\n\n // Server will handle index.html if both client & server are built\n if (hasClient && options.serverEntry !== false) {\n await unlink(`${distDir}/${clientDir}/index.html`);\n }\n\n // Task 3: Copy assets (swagger ui & others)\n await copyAssets({\n entry: `${distDir}/index.js`,\n distDir,\n });\n }\n\n // Task 4: Generate sitemap\n if (buildClientOptions.sitemap && entry) {\n await writeFile(\n `${distDir}/${clientDir}/sitemap.xml`,\n await generateSitemap({\n entry: `${distDir}/index.js`,\n baseUrl: buildClientOptions.sitemap.hostname,\n }),\n );\n }\n\n // Task 5: Pre-render static pages\n if (buildClientOptions.prerender && template) {\n await prerenderPages({\n dist: `${distDir}/${clientDir}`,\n entry: `${distDir}/index.js`,\n compress: buildClientOptions.precompress,\n });\n }\n\n // Task 6: Generate deployment configurations\n if (options.vercel) {\n const config =\n typeof options.vercel === \"boolean\" ? {} : options.vercel;\n await generateVercel({\n distDir,\n clientDir,\n config,\n });\n }\n\n if (options.cloudflare) {\n await generateCloudflare({\n distDir,\n });\n }\n\n if (options.docker) {\n const dockerOpts =\n typeof options.docker === \"boolean\" ? {} : options.docker;\n await generateDocker({\n distDir,\n ...dockerOpts,\n });\n }\n\n // Prevent the default build from running again\n process.exit(0);\n },\n };\n}\n","import type { Plugin, ResolvedConfig } from \"vite\";\nimport { boot } from \"../helpers/boot.ts\";\nimport { createAlephaRunner, isViteInternalPath } from \"../tasks/runAlepha.ts\";\n\nexport interface ViteAlephaDevOptions {\n /**\n * Path to the entry file for the server build.\n * If empty, plugin will be disabled.\n */\n serverEntry?: string | false;\n\n /**\n * If true, enables debug logging.\n *\n * @default false\n */\n debug?: boolean;\n}\n\n/**\n * Plug Alepha into Vite development server.\n *\n * This plugin manages the Alepha application lifecycle during development,\n * handling hot module replacement and request forwarding.\n */\nexport async function viteAlephaDev(\n options: ViteAlephaDevOptions = {},\n): Promise<Plugin> {\n let entry = options.serverEntry;\n if (!entry) {\n entry = await boot.getServerEntry();\n if (!entry) {\n return {\n name: \"alepha-dev\",\n apply: \"serve\",\n config() {},\n };\n }\n }\n\n const runner = createAlephaRunner({\n entry,\n debug: options.debug,\n });\n\n return {\n name: \"alepha-dev\",\n apply: \"serve\",\n configResolved(resolvedConfig: ResolvedConfig) {\n runner.setConfig(resolvedConfig);\n },\n async handleHotUpdate(ctx) {\n if (options.debug) {\n console.log(\"[DEBUG] HMR\", ctx.file);\n }\n\n if (ctx.file.includes(\"/.idea/\")) {\n return [];\n }\n\n const isServerOnly = !ctx.modules[0]?._clientModule;\n const isBrowserOnly = !ctx.modules[0]?._ssrModule;\n const isSsrEnabled = runner.isSsrEnabled();\n\n if (isBrowserOnly) {\n if (options.debug) {\n console.log(\n \"[DEBUG] HMR - browser only - no reason to reload server\",\n );\n }\n return;\n }\n\n const root = process.cwd().replace(/\\\\/g, \"/\");\n const invalidate = !ctx.file.startsWith(root);\n if (invalidate && options.debug) {\n console.log(\"[DEBUG] HMR - outside root - invalidate all\");\n }\n\n if (!isSsrEnabled && isServerOnly) {\n await runner.restart(ctx.server, invalidate);\n return [];\n }\n\n if (isSsrEnabled && ctx.modules[0]) {\n const skip = await runner.restart(ctx.server, invalidate);\n if (skip) {\n return [];\n }\n\n if (!runner.isStarted) {\n if (options.debug) {\n console.log(\"[DEBUG] HMR - abort due to app not started\");\n }\n return [];\n }\n\n if (isServerOnly && runner.isStarted) {\n runner.sendReload(ctx.server);\n return [];\n }\n }\n },\n async configureServer(server) {\n // Forward vite request to alepha server\n server.middlewares.use((req, res, next) => {\n if (\n runner.isStarted &&\n runner.app &&\n req.url &&\n !isViteInternalPath(req.url)\n ) {\n // Patch res.end to detect if alepha handled the request\n // If not, we call next() to let vite handle it (e.g. for static files)\n let ended = false;\n\n const writeHead = res.writeHead.bind(res);\n res.writeHead = (...args: any[]) => {\n ended = true;\n return writeHead(args[0], args[1], args[2]);\n };\n\n return runner.app.events\n .emit(\"node:request\" as any, { req, res })\n .then(() => {\n if (!ended) {\n next();\n }\n });\n }\n next();\n });\n\n server.config.logger.info = (msg: string) => {\n runner.app?.log?.info(msg.trim());\n };\n\n server.config.logger.clearScreen = () => {};\n\n await runner.start(server);\n },\n async closeBundle() {\n // Cleanup handled by runner\n },\n };\n}\n","import { createRequire } from \"node:module\";\nimport { OPTIONS } from \"alepha\";\nimport type { Plugin } from \"vite\";\nimport {\n type ViteAlephaBuildOptions,\n viteAlephaBuild,\n} from \"./viteAlephaBuild.ts\";\nimport { type ViteAlephaDevOptions, viteAlephaDev } from \"./viteAlephaDev.ts\";\n\nexport type ViteAlephaOptions = ViteAlephaDevOptions &\n ViteAlephaBuildOptions & {\n react?: false;\n };\n\nexport function viteAlepha(\n options: ViteAlephaOptions = {},\n): (Plugin | Promise<Plugin>)[] {\n if (process.env.NODE_ENV === \"test\") {\n return [];\n }\n\n const plugins: (Plugin | Promise<Plugin>)[] & { [OPTIONS]?: any } = [];\n\n if (options.react !== false) {\n try {\n const { default: viteReact } = createRequire(import.meta.url)(\n \"@vitejs/plugin-react\",\n );\n plugins.push(viteReact());\n } catch (e) {}\n }\n\n plugins.push(viteAlephaDev(options), viteAlephaBuild(options));\n plugins[OPTIONS] = options;\n\n return plugins;\n}\n","import type { Alepha } from \"alepha\";\n\n// Vite re-exports\nexport { defineConfig } from \"vite\";\n// Helpers (for advanced use)\nexport * from \"./helpers/boot.ts\";\nexport * from \"./helpers/createBufferedLogger.ts\";\n// Plugins (public API)\nexport * from \"./plugins/viteAlepha.ts\";\nexport * from \"./plugins/viteAlephaBuild.ts\";\nexport * from \"./plugins/viteAlephaDev.ts\";\nexport * from \"./plugins/viteCompress.ts\";\n// Tasks (for CLI integration)\nexport * from \"./tasks/index.ts\";\n\ndeclare global {\n var __cli_alepha: Alepha;\n}\n\n/**\n * Plugin vite for Alepha framework.\n *\n * This module provides Vite plugins and configurations to integrate Alepha applications with Vite's build and development processes.\n *\n * @example\n * ```ts\n * import { defineConfig } from \"vite\";\n * import { viteAlepha } from \"alepha/vite\";\n *\n * export default defineConfig({\n * plugins: [viteAlepha()],\n * // other Vite configurations...\n * });\n * ```\n *\n * @module alepha.vite\n */\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as alepha42 from "alepha";
2
2
  import { Alepha, Descriptor, KIND, Static, TObject, TString, TUnion } from "alepha";
3
3
  import * as alepha_topic0 from "alepha/topic";
4
- import * as alepha_logger1 from "alepha/logger";
4
+ import * as alepha_logger2 from "alepha/logger";
5
5
  import { WebSocket as WebSocket$1, WebSocketServer } from "ws";
6
6
  import { IncomingMessage } from "node:http";
7
7
 
@@ -452,7 +452,7 @@ declare class WebSocketValidationError extends WebSocketError {
452
452
  * and messages can be targeted to specific rooms.
453
453
  */
454
454
  declare class RoomManager {
455
- protected readonly log: alepha_logger1.Logger;
455
+ protected readonly log: alepha_logger2.Logger;
456
456
  /**
457
457
  * Maps roomId → Set<connectionId>
458
458
  */
@@ -533,7 +533,7 @@ declare class WebSocketChannelConnection<TClient extends TWSObject, TServer exte
533
533
  };
534
534
  protected readonly env: Static<typeof envSchema$1>;
535
535
  protected readonly alepha: Alepha;
536
- protected readonly log: alepha_logger1.Logger;
536
+ protected readonly log: alepha_logger2.Logger;
537
537
  protected ws?: WebSocket;
538
538
  protected reconnectAttempts: number;
539
539
  protected reconnectTimer?: number;
@@ -607,7 +607,7 @@ declare class WebSocketChannelConnection<TClient extends TWSObject, TServer exte
607
607
  * One connection per channel, multiple rooms per connection.
608
608
  */
609
609
  declare class WebSocketClient {
610
- protected readonly log: alepha_logger1.Logger;
610
+ protected readonly log: alepha_logger2.Logger;
611
611
  protected readonly alepha: Alepha;
612
612
  protected readonly env: {
613
613
  WEBSOCKET_URL: string;
@@ -694,7 +694,7 @@ declare const webSocketMessageSchema: {
694
694
  * - Horizontal scaling without losing messages
695
695
  */
696
696
  declare class WebSocketTopicService {
697
- protected readonly log: alepha_logger1.Logger;
697
+ protected readonly log: alepha_logger2.Logger;
698
698
  /**
699
699
  * Handler function to be called when a message is received from the topic
700
700
  * This is set by the WebSocket provider during initialization
@@ -756,7 +756,7 @@ declare class NodeWebSocketServerProvider extends WebSocketServerProvider {
756
756
  protected readonly alepha: Alepha;
757
757
  protected readonly roomManager: RoomManager;
758
758
  protected readonly topicService: WebSocketTopicService;
759
- protected readonly log: alepha_logger1.Logger;
759
+ protected readonly log: alepha_logger2.Logger;
760
760
  protected readonly env: {
761
761
  WEBSOCKET_PATH: string;
762
762
  };
@@ -796,7 +796,7 @@ declare class NodeWebSocketConnection implements WebSocketConnection {
796
796
  protected readonly ws: WebSocket$1;
797
797
  protected readonly provider: NodeWebSocketServerProvider;
798
798
  protected readonly endpoint: WebSocketDescriptorOptions<any, any>;
799
- protected readonly log: alepha_logger1.Logger;
799
+ protected readonly log: alepha_logger2.Logger;
800
800
  metadata?: Record<string, any>;
801
801
  constructor(id: string, userId: string | undefined, roomIds: string[], ws: WebSocket$1, provider: NodeWebSocketServerProvider, endpoint: WebSocketDescriptorOptions<any, any>);
802
802
  get readyState(): WebSocketState;