alepha 0.15.3 → 0.15.5
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.
- package/README.md +26 -11
- package/dist/api/audits/index.d.ts +335 -335
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +11 -3
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.d.ts +3 -3
- package/dist/api/files/index.js +4 -3
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +198 -155
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +103 -5
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +198 -198
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/keys/index.js +3 -3
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.browser.js +1 -0
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +3 -3
- package/dist/api/notifications/index.js +4 -3
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/parameters/index.d.ts +263 -263
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +41 -30
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/users/index.d.ts +383 -77
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +284 -72
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +131 -131
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +3 -3
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/batch/index.d.ts +3 -3
- package/dist/batch/index.js +3 -3
- package/dist/batch/index.js.map +1 -1
- package/dist/bucket/index.d.ts +3 -3
- package/dist/bucket/index.js +6 -6
- package/dist/bucket/index.js.map +1 -1
- package/dist/cache/core/index.d.ts +3 -3
- package/dist/cache/core/index.js +3 -3
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cli/index.d.ts +5612 -20
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +122 -91
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +11 -4
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +8 -6
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +4 -8
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js.map +1 -1
- package/dist/datetime/index.d.ts +3 -3
- package/dist/datetime/index.js +3 -3
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/index.d.ts +16 -16
- package/dist/email/index.d.ts.map +1 -1
- package/dist/email/index.js +10562 -10
- package/dist/email/index.js.map +1 -1
- package/dist/fake/index.d.ts +3 -3
- package/dist/fake/index.js +3 -3
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +9 -4
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +12 -4
- package/dist/lock/core/index.js.map +1 -1
- package/dist/logger/index.d.ts +3 -3
- package/dist/logger/index.js +6 -3
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +3 -3
- package/dist/mcp/index.js +3 -3
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/index.d.ts +12 -12
- package/dist/orm/index.js +4 -4
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +3 -3
- package/dist/queue/core/index.js +3 -3
- package/dist/queue/core/index.js.map +1 -1
- package/dist/react/auth/index.browser.js +2 -1
- package/dist/react/auth/index.browser.js.map +1 -1
- package/dist/react/auth/index.d.ts +3 -3
- package/dist/react/auth/index.js +5 -4
- package/dist/react/auth/index.js.map +1 -1
- package/dist/react/core/index.d.ts +6 -6
- package/dist/react/core/index.js +3 -3
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +3 -3
- package/dist/react/form/index.js +3 -3
- package/dist/react/form/index.js.map +1 -1
- package/dist/react/head/index.d.ts +3 -3
- package/dist/react/head/index.js +3 -3
- package/dist/react/head/index.js.map +1 -1
- package/dist/react/i18n/index.d.ts +3 -3
- package/dist/react/i18n/index.js +3 -3
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.css +337 -0
- package/dist/react/intro/index.css.map +1 -0
- package/dist/react/intro/index.d.ts +10 -0
- package/dist/react/intro/index.d.ts.map +1 -0
- package/dist/react/intro/index.js +222 -0
- package/dist/react/intro/index.js.map +1 -0
- package/dist/react/router/index.browser.js +2 -2
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +11 -1
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +21 -11
- package/dist/react/router/index.js.map +1 -1
- package/dist/redis/index.d.ts +22 -22
- package/dist/redis/index.js +3 -3
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts +3 -3
- package/dist/retry/index.js +3 -3
- package/dist/retry/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +16 -4
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +45 -7
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.d.ts +3 -3
- package/dist/security/index.js +5 -5
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +3 -3
- package/dist/server/auth/index.js +3 -3
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cache/index.d.ts +3 -3
- package/dist/server/cache/index.js +3 -3
- package/dist/server/cache/index.js.map +1 -1
- package/dist/server/compress/index.d.ts +3 -3
- package/dist/server/compress/index.d.ts.map +1 -1
- package/dist/server/compress/index.js +4 -3
- package/dist/server/compress/index.js.map +1 -1
- package/dist/server/cookies/index.d.ts +3 -3
- package/dist/server/cookies/index.js +3 -3
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.d.ts +14 -25
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +13 -29
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +3 -3
- package/dist/server/cors/index.js +3 -3
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/health/index.d.ts +20 -20
- package/dist/server/health/index.js +3 -3
- package/dist/server/health/index.js.map +1 -1
- package/dist/server/helmet/index.d.ts +3 -3
- package/dist/server/helmet/index.js +3 -3
- package/dist/server/helmet/index.js.map +1 -1
- package/dist/server/links/index.d.ts +42 -42
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +4 -4
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +3 -3
- package/dist/server/metrics/index.js +3 -3
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/multipart/index.d.ts +3 -3
- package/dist/server/multipart/index.js +3 -3
- package/dist/server/multipart/index.js.map +1 -1
- package/dist/server/proxy/index.d.ts +3 -3
- package/dist/server/proxy/index.js +3 -3
- package/dist/server/proxy/index.js.map +1 -1
- package/dist/server/rate-limit/index.d.ts +3 -3
- package/dist/server/rate-limit/index.js +3 -3
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +3 -3
- package/dist/server/static/index.js +6 -6
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts +3 -3
- package/dist/server/swagger/index.js +6 -6
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +3 -3
- package/dist/sms/index.js +6 -6
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.d.ts +3 -3
- package/dist/system/index.js +3 -3
- package/dist/system/index.js.map +1 -1
- package/dist/thread/index.d.ts +3 -3
- package/dist/thread/index.js +3 -3
- package/dist/thread/index.js.map +1 -1
- package/dist/topic/core/index.d.ts +3 -3
- package/dist/topic/core/index.js +3 -3
- package/dist/topic/core/index.js.map +1 -1
- package/dist/vite/index.d.ts +6286 -4
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +28 -2
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.d.ts +37 -37
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +3 -3
- package/dist/websocket/index.js.map +1 -1
- package/package.json +12 -4
- package/src/api/audits/controllers/AdminAuditController.ts +8 -0
- package/src/api/audits/index.ts +3 -3
- package/src/api/files/controllers/AdminFileStatsController.ts +1 -0
- package/src/api/files/index.ts +3 -3
- package/src/api/jobs/controllers/AdminJobController.ts +18 -2
- package/src/api/jobs/index.ts +4 -3
- package/src/api/jobs/services/JobAudits.spec.ts +89 -0
- package/src/api/jobs/services/JobAudits.ts +101 -0
- package/src/api/keys/index.ts +3 -3
- package/src/api/notifications/controllers/AdminNotificationController.ts +1 -0
- package/src/api/notifications/index.ts +3 -3
- package/src/api/parameters/controllers/AdminConfigController.ts +10 -0
- package/src/api/parameters/index.ts +5 -3
- package/src/api/users/__tests__/ApiKeys-integration.spec.ts +1 -1
- package/src/api/users/__tests__/ApiKeys.spec.ts +1 -1
- package/src/api/users/__tests__/EmailVerification.spec.ts +16 -1
- package/src/api/users/__tests__/PasswordReset.spec.ts +11 -0
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +10 -0
- package/src/api/users/controllers/AdminIdentityController.ts +3 -0
- package/src/api/users/controllers/AdminSessionController.ts +3 -0
- package/src/api/users/controllers/AdminUserController.ts +5 -0
- package/src/api/users/index.ts +8 -9
- package/src/api/users/primitives/$realm.ts +117 -19
- package/src/api/users/providers/RealmProvider.ts +15 -7
- package/src/api/users/services/CredentialService.spec.ts +11 -0
- package/src/api/users/services/CredentialService.ts +47 -24
- package/src/api/users/services/IdentityService.ts +12 -4
- package/src/api/users/services/RegistrationService.spec.ts +11 -0
- package/src/api/users/services/RegistrationService.ts +33 -12
- package/src/api/users/services/SessionService.ts +83 -12
- package/src/api/users/services/UserAudits.ts +47 -0
- package/src/api/users/services/UserFiles.ts +19 -0
- package/src/api/users/services/UserJobs.spec.ts +107 -0
- package/src/api/users/services/UserJobs.ts +62 -0
- package/src/api/users/services/UserParameters.ts +23 -0
- package/src/api/users/services/UserService.ts +34 -17
- package/src/api/verifications/index.ts +3 -3
- package/src/batch/index.ts +3 -3
- package/src/bucket/index.ts +3 -3
- package/src/cache/core/index.ts +3 -3
- package/src/cli/commands/build.ts +1 -0
- package/src/cli/commands/db.ts +9 -0
- package/src/cli/commands/init.spec.ts +2 -17
- package/src/cli/commands/init.ts +37 -1
- package/src/cli/providers/ViteDevServerProvider.ts +36 -2
- package/src/cli/services/AlephaCliUtils.ts +17 -0
- package/src/cli/services/PackageManagerUtils.ts +15 -1
- package/src/cli/services/ProjectScaffolder.ts +8 -13
- package/src/cli/templates/agentMd.ts +2 -25
- package/src/cli/templates/apiAppSecurityTs.ts +37 -2
- package/src/cli/templates/mainCss.ts +2 -32
- package/src/cli/templates/webAppRouterTs.ts +5 -5
- package/src/cli/templates/webHomeComponentTsx.ts +10 -0
- package/src/command/helpers/Runner.ts +14 -1
- package/src/command/index.ts +3 -3
- package/src/core/helpers/primitive.ts +0 -5
- package/src/core/index.ts +3 -3
- package/src/datetime/index.ts +3 -3
- package/src/email/index.ts +3 -3
- package/src/email/index.workerd.ts +36 -0
- package/src/email/providers/LocalEmailProvider.ts +2 -2
- package/src/email/providers/WorkermailerEmailProvider.ts +221 -0
- package/src/fake/index.ts +3 -3
- package/src/lock/core/index.ts +3 -3
- package/src/lock/core/primitives/$lock.ts +13 -1
- package/src/logger/index.ts +3 -3
- package/src/logger/providers/PrettyFormatterProvider.ts +7 -0
- package/src/mcp/index.ts +3 -3
- package/src/orm/index.ts +3 -3
- package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
- package/src/queue/core/index.ts +3 -3
- package/src/react/auth/index.ts +3 -3
- package/src/react/auth/services/ReactAuth.ts +3 -1
- package/src/react/core/index.ts +3 -3
- package/src/react/form/index.ts +3 -3
- package/src/react/head/index.ts +3 -3
- package/src/react/i18n/index.ts +3 -3
- package/src/react/intro/components/GettingStarted.css +334 -0
- package/src/react/intro/components/GettingStarted.tsx +276 -0
- package/src/react/intro/index.ts +1 -0
- package/src/react/router/atoms/ssrManifestAtom.ts +7 -0
- package/src/react/router/index.browser.ts +2 -0
- package/src/react/router/index.ts +2 -0
- package/src/react/router/providers/ReactServerProvider.ts +14 -4
- package/src/react/router/providers/SSRManifestProvider.ts +7 -0
- package/src/redis/index.ts +3 -3
- package/src/retry/index.ts +3 -3
- package/src/router/index.ts +3 -3
- package/src/scheduler/index.ts +3 -3
- package/src/scheduler/index.workerd.ts +43 -0
- package/src/scheduler/providers/CronProvider.ts +53 -6
- package/src/scheduler/providers/WorkerdCronProvider.ts +102 -0
- package/src/security/index.ts +3 -3
- package/src/security/providers/JwtProvider.ts +2 -2
- package/src/server/auth/index.ts +3 -3
- package/src/server/cache/index.ts +3 -3
- package/src/server/compress/index.ts +3 -3
- package/src/server/compress/providers/ServerCompressProvider.ts +6 -0
- package/src/server/cookies/index.ts +3 -3
- package/src/server/core/index.ts +3 -3
- package/src/server/core/primitives/$action.spec.ts +3 -2
- package/src/server/core/primitives/$action.ts +6 -2
- package/src/server/core/providers/NodeHttpServerProvider.ts +2 -15
- package/src/server/core/providers/ServerProvider.ts +4 -2
- package/src/server/core/providers/ServerRouterProvider.ts +5 -27
- package/src/server/cors/index.ts +3 -3
- package/src/server/health/index.ts +3 -3
- package/src/server/helmet/index.ts +3 -3
- package/src/server/links/index.ts +3 -3
- package/src/server/links/providers/ServerLinksProvider.spec.ts +332 -0
- package/src/server/links/providers/ServerLinksProvider.ts +1 -1
- package/src/server/metrics/index.ts +3 -3
- package/src/server/multipart/index.ts +3 -3
- package/src/server/proxy/index.ts +3 -3
- package/src/server/rate-limit/index.ts +3 -3
- package/src/server/static/index.ts +3 -3
- package/src/server/swagger/index.ts +3 -3
- package/src/sms/index.ts +3 -3
- package/src/system/index.ts +3 -3
- package/src/thread/index.ts +3 -3
- package/src/topic/core/index.ts +3 -3
- package/src/vite/tasks/generateCloudflare.ts +38 -2
- package/src/websocket/index.ts +3 -3
- package/src/cli/templates/webHelloComponentTsx.ts +0 -30
- /package/src/api/users/{notifications → services}/UserNotifications.ts +0 -0
package/dist/vite/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["gzipCb","brotliCompress","brotliCompressCb","fs","viteAnalyzer","viteAnalyzer","WARNING_COMMENT"],"sources":["../../src/vite/helpers/createBufferedLogger.ts","../../src/vite/helpers/importVite.ts","../../src/vite/helpers/importViteReact.ts","../../src/vite/plugins/viteAlephaSsrPreload.ts","../../src/vite/plugins/viteCompress.ts","../../src/vite/tasks/buildClient.ts","../../src/vite/tasks/generateExternals.ts","../../src/vite/tasks/buildServer.ts","../../src/vite/tasks/copyAssets.ts","../../src/vite/tasks/generateCloudflare.ts","../../src/vite/helpers/fileExists.ts","../../src/vite/tasks/generateDocker.ts","../../src/vite/tasks/generateSitemap.ts","../../src/vite/tasks/generateVercel.ts","../../src/vite/tasks/prerenderPages.ts"],"sourcesContent":["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 { 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 { createRequire } from \"node:module\";\n\nexport const importViteReact = async (): Promise<any> => {\n // Add React plugin for JSX/TSX compilation\n try {\n const { default: viteReact } = createRequire(import.meta.url)(\n \"@vitejs/plugin-react\",\n );\n return viteReact;\n } catch {\n // @vitejs/plugin-react not installed, skip\n }\n};\n","import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport type { Plugin } from \"vite\";\n\n/**\n * Preload manifest mapping short keys to source paths.\n * Generated at build time, consumed by SSRManifestProvider at runtime.\n */\nexport interface PreloadManifest {\n [key: string]: string;\n}\n\n/**\n * Vite plugin that generates a preload manifest for SSR module preloading.\n *\n * Instead of injecting source paths directly into $page definitions (which would\n * leak component paths in the browser bundle), this plugin:\n *\n * 1. Collects all lazy import paths from $page definitions during transform\n * 2. Generates a manifest file mapping short keys to resolved source paths\n * 3. Injects only the short key into $page definitions\n *\n * The manifest is written to `.vite/preload-manifest.json` alongside Vite's\n * other manifests. The CLI build command moves all manifests to\n * `dist/server/.ssr/` where SSRManifestProvider loads them at runtime.\n *\n * Before:\n * ```typescript\n * $page({\n * path: '/users/:id',\n * lazy: () => import('./UserDetail.tsx'),\n * })\n * ```\n *\n * After:\n * ```typescript\n * $page({\n * path: '/users/:id',\n * lazy: () => import('./UserDetail.tsx'),\n * [Symbol.for(\"alepha.page.preload\")]: \"a1b2c3\",\n * })\n * ```\n *\n * Manifest (.alepha/preload-manifest.json):\n * ```json\n * {\n * \"a1b2c3\": \"src/pages/UserDetail.tsx\"\n * }\n * ```\n */\nexport function viteAlephaSsrPreload(): Plugin {\n let root = \"\";\n const preloadMap = new Map<string, string>(); // key -> sourcePath\n\n /**\n * Generate a short hash key for a source path.\n * Uses first 8 chars of MD5 hash for brevity while avoiding collisions.\n */\n function generateKey(sourcePath: string): string {\n return createHash(\"md5\").update(sourcePath).digest(\"hex\").slice(0, 8);\n }\n\n return {\n name: \"alepha-preload\",\n configResolved(config) {\n root = config.root;\n },\n transform(code, id) {\n // Only process TypeScript/JavaScript files\n if (!id.match(/\\.[tj]sx?$/)) {\n return null;\n }\n\n // Skip node_modules\n if (id.includes(\"node_modules\")) {\n return null;\n }\n\n // Quick check if file contains $page with lazy\n if (!code.includes(\"$page\") || !code.includes(\"lazy\")) {\n return null;\n }\n\n // Collect all insertions first, then apply in reverse order\n const insertions: Array<{ position: number; text: string }> = [];\n\n // Find all $page({ occurrences\n const pageStartRegex = /\\$page\\s*\\(\\s*\\{/g;\n let pageMatch: RegExpExecArray | null = pageStartRegex.exec(code);\n\n while (pageMatch !== null) {\n const startIndex = pageMatch.index;\n const objectStartIndex = startIndex + pageMatch[0].length - 1; // Position of '{'\n\n // Find the matching closing brace using brace counting\n let braceCount = 1;\n let i = objectStartIndex + 1;\n while (i < code.length && braceCount > 0) {\n if (code[i] === \"{\") braceCount++;\n else if (code[i] === \"}\") braceCount--;\n i++;\n }\n\n // Malformed, skip\n if (braceCount !== 0) {\n pageMatch = pageStartRegex.exec(code);\n continue;\n }\n\n const objectEndIndex = i - 1; // Position of matching '}'\n const pageContent = code.slice(objectStartIndex, objectEndIndex + 1);\n\n // Skip if already has preload symbol\n if (pageContent.includes(\"alepha.page.preload\")) {\n pageMatch = pageStartRegex.exec(code);\n continue;\n }\n\n // Find lazy: () => import('...') within this $page block\n const lazyRegex =\n /lazy\\s*:\\s*\\(\\s*\\)\\s*=>\\s*import\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/;\n const lazyMatch = lazyRegex.exec(pageContent);\n\n if (!lazyMatch) {\n pageMatch = pageStartRegex.exec(code);\n continue;\n }\n\n const importPath = lazyMatch[1];\n\n // Resolve the import path relative to the current file\n const currentDir = dirname(id);\n let resolvedPath: string;\n\n if (importPath.startsWith(\".\")) {\n // Relative import\n resolvedPath = resolve(currentDir, importPath);\n } else if (importPath.startsWith(\"/\")) {\n // Absolute import from root\n resolvedPath = resolve(root, importPath.slice(1));\n } else {\n // Package import - skip preloading for external packages\n pageMatch = pageStartRegex.exec(code);\n continue;\n }\n\n // Make path relative to root for SSR manifest lookup\n let relativePath = relative(root, resolvedPath);\n\n // Normalize path separators for cross-platform compatibility\n relativePath = relativePath.replace(/\\\\/g, \"/\");\n\n // Handle extension - Vite resolves .jsx imports to .tsx files\n // Try to use .tsx when the source has .jsx since TypeScript is more common\n if (!relativePath.match(/\\.[tj]sx?$/)) {\n relativePath = `${relativePath}.tsx`;\n } else if (relativePath.endsWith(\".jsx\")) {\n // Import said .jsx but actual file is likely .tsx\n relativePath = relativePath.replace(/\\.jsx$/, \".tsx\");\n } else if (relativePath.endsWith(\".js\")) {\n // Import said .js but actual file is likely .ts\n relativePath = relativePath.replace(/\\.js$/, \".ts\");\n }\n\n // Generate short key and store mapping\n const key = generateKey(relativePath);\n preloadMap.set(key, relativePath);\n\n // Check if we need a comma (look at character before closing brace)\n const beforeBrace = code.slice(0, objectEndIndex).trimEnd();\n const needsComma = !beforeBrace.endsWith(\",\");\n // Use Symbol.for() so it can be looked up at runtime without importing\n // Only inject the short key, not the full path\n const preloadProperty = `${needsComma ? \",\" : \"\"} [Symbol.for(\"alepha.page.preload\")]: \"${key}\"`;\n\n insertions.push({ position: objectEndIndex, text: preloadProperty });\n\n pageMatch = pageStartRegex.exec(code);\n }\n\n if (insertions.length === 0) {\n return null;\n }\n\n // Apply insertions in reverse order to preserve positions\n let result = code;\n for (let j = insertions.length - 1; j >= 0; j--) {\n const { position, text } = insertions[j];\n result = result.slice(0, position) + text + result.slice(position);\n }\n\n return {\n code: result,\n map: null,\n };\n },\n writeBundle(options) {\n // Only process client build (outputs to dist/public or similar)\n // Skip server build which outputs to dist/server\n const outDir = options.dir || \"\";\n if (outDir.includes(\"server\")) {\n return;\n }\n\n // Write the preload manifest to the same .vite directory Vite uses\n // The CLI build command will move all manifests to dist/server/.ssr/\n if (preloadMap.size > 0) {\n const viteDir = join(outDir, \".vite\");\n\n // Ensure .vite directory exists\n if (!existsSync(viteDir)) {\n mkdirSync(viteDir, { recursive: true });\n }\n\n const manifest: PreloadManifest = Object.fromEntries(preloadMap);\n const manifestPath = join(viteDir, \"preload-manifest.json\");\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));\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 { importViteReact } from \"../helpers/importViteReact.ts\";\nimport { viteAlephaSsrPreload } from \"../plugins/viteAlephaSsrPreload.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 * 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 } = await importVite();\n const plugins: any[] = [];\n\n const viteReact = await importViteReact();\n if (viteReact) plugins.push(viteReact());\n\n // Add preload plugin for SSR module preloading\n plugins.push(viteAlephaSsrPreload());\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 // Generate manifest for SSR module preloading\n manifest: true,\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(viteBuildClientConfig);\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, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type Alepha, 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 { importViteReact } from \"../helpers/importViteReact.ts\";\nimport { viteAlephaSsrPreload } from \"../plugins/viteAlephaSsrPreload.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 SSR manifest will be embedded in the server output.\n */\n clientDir?: string;\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 * Add more entry point conditions for SSR module resolution (e.g., \"bun\").\n */\n conditions?: string[];\n\n /**\n * Alepha instance to set SSR manifest for pre-rendering.\n */\n alepha: Alepha;\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 * SSR manifest data for module preloading.\n * Can be used to set in alepha store for pre-rendering.\n */\n manifest?: {\n base?: string;\n client?: Record<string, any>;\n preload?: Record<string, string>;\n };\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, resolveConfig } = await importVite();\n const plugins: any[] = [];\n\n const viteReact = await importViteReact();\n if (viteReact && opts.clientDir) {\n plugins.push(viteReact());\n }\n\n plugins.push(viteAlephaSsrPreload());\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 conditions = [\"node\", \"import\", \"module\", \"default\"];\n if (opts.conditions) {\n conditions.unshift(...opts.conditions);\n }\n\n // note: we still can override this config via config file (vite.config.ts)\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 resolve: { conditions },\n },\n build: {\n sourcemap: true,\n ssr: opts.entry,\n outDir: `${opts.distDir}/server`,\n minify: true,\n chunkSizeWarningLimit: 10000,\n rollupOptions: {\n external: [/^bun(:|$)/, /^cloudflare:/],\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, // mock logger to avoid noisy output\n plugins,\n };\n\n // create inline config by merging alepha built-in + extended config\n\n let result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];\n try {\n result = (await viteBuild(viteBuildServerConfig)) as\n | vite.Rollup.RollupOutput\n | 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 // resolve final config to read externals\n const resolvedConfig = await resolveConfig(viteBuildServerConfig, \"build\");\n\n // extract resolved config to get externals\n const externals: string[] = [];\n\n if (Array.isArray(resolvedConfig?.ssr?.external)) {\n externals.push(...resolvedConfig.ssr.external);\n }\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 SSR manifests if client was built\n // This bundles all manifest data into index.js for serverless deployments\n let manifest = \"\";\n let manifestData:\n | {\n base?: string;\n client?: Record<string, any>;\n preload?: Record<string, string>;\n }\n | undefined;\n\n if (opts.clientDir) {\n const viteDir = `${opts.distDir}/${opts.clientDir}/.vite`;\n const clientManifest = await loadJsonFile(`${viteDir}/manifest.json`);\n const preloadManifest = await loadJsonFile(\n `${viteDir}/preload-manifest.json`,\n );\n\n // Strip unused fields from client manifest to reduce bundle size\n const strippedClientManifest = stripClientManifest(clientManifest);\n\n // Get base path from resolved config (defaults to \"/\" if not set)\n // Normalize: ensure it starts with \"/\" and doesn't end with \"/\" (unless it's just \"/\")\n let base = resolvedConfig.base || \"/\";\n if (!base.startsWith(\"/\")) {\n base = `/${base}`;\n }\n if (base.length > 1 && base.endsWith(\"/\")) {\n base = base.slice(0, -1);\n }\n\n manifestData = {\n base: base !== \"/\" ? base : undefined, // Only include if not default\n client: strippedClientManifest,\n preload: preloadManifest,\n };\n\n manifest = `__alepha.set(\"alepha.react.ssr.manifest\", ${JSON.stringify(manifestData)});\\n`;\n\n // Set manifest in alepha store for pre-rendering\n opts.alepha.store.set(\"alepha.react.ssr.manifest\" as any, manifestData);\n\n // Remove .vite directory - no longer needed at runtime\n await rm(viteDir, { recursive: true, force: true });\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 await writeFile(\n `${opts.distDir}/index.js`,\n `${warning}\\n${manifest}import './server/${entryFile}';\\n`.trim(),\n );\n\n return { entryFile, manifest: manifestData };\n}\n\n/**\n * Load a JSON file, returning undefined if it doesn't exist.\n */\nasync function loadJsonFile(path: string): Promise<any> {\n try {\n const content = await readFile(path, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Strip unused fields from client manifest to reduce bundle size.\n * Only keeps: file, isEntry, imports, css\n */\nfunction stripClientManifest(\n manifest: Record<string, any> | undefined,\n): Record<string, any> | undefined {\n if (!manifest) return undefined;\n\n const stripped: Record<string, any> = {};\n for (const [key, entry] of Object.entries(manifest)) {\n stripped[key] = {\n file: entry.file,\n ...(entry.isEntry && { isEntry: entry.isEntry }),\n ...(entry.imports?.length && { imports: entry.imports }),\n ...(entry.css?.length && { css: entry.css }),\n };\n }\n return stripped;\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 { cp, mkdir } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { Alepha } from \"alepha\";\n\nexport interface CopyAssetsOptions {\n alepha: Alepha;\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 * @default process.cwd()\n */\n root: string;\n\n /**\n * Add Runner for logging (@see Alepha CLI)\n */\n run?: (opts: {\n name: string;\n handler: () => Promise<void>;\n }) => Promise<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 = opts.root;\n const alepha = opts.alepha;\n const assets = alepha.store.get(\"alepha.build.assets\");\n\n if (!assets || assets.length === 0) {\n return;\n }\n\n const fn = async () => {\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\n if (opts.run) {\n await opts.run({\n name: \"copy assets\",\n handler: fn,\n });\n } else {\n await fn();\n }\n}\n","import { access, writeFile } from \"node:fs/promises\";\nimport { basename, 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 /**\n * Additional Wrangler configuration options to merge into wrangler.jsonc.\n */\n config?: WranglerConfig;\n}\n\nexport interface WranglerConfig {\n [key: string]: any;\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 distDir = opts.distDir ?? \"dist\";\n const root = process.cwd();\n const name = basename(root);\n const hasAssets = await access(join(root, distDir, \"public\"))\n .then(() => true)\n .catch(() => false);\n\n const wrangler: WranglerConfig = {\n name,\n main: \"./main.cloudflare.js\",\n compatibility_flags: [\"nodejs_compat\"],\n compatibility_date: \"2025-11-17\",\n no_bundle: true,\n rules: [\n {\n type: \"ESModule\",\n globs: [\"index.js\", \"server/*.js\"],\n },\n ],\n ...opts.config,\n };\n\n if (hasAssets) {\n wrangler.assets ??= {\n directory: \"./public\",\n binding: \"ASSETS\",\n };\n }\n\n const url = process.env.DATABASE_URL;\n if (url?.startsWith(\"d1:\")) {\n const [name, id] = url.replace(\"d1://\", \"\").replace(\"d1:\", \"\").split(\":\");\n wrangler.d1_databases = wrangler.d1_databases || [];\n wrangler.d1_databases.push({\n binding: name,\n database_name: name,\n database_id: id,\n });\n wrangler.vars ??= {};\n wrangler.vars.DATABASE_URL = `d1://${name}:${id}`;\n }\n\n await writeFile(\n join(root, distDir, \"wrangler.jsonc\"),\n JSON.stringify(wrangler, null, 2),\n );\n\n await writeWorkerEntryPoint(root, distDir);\n}\n\n/**\n * Write the worker entry point that bootstraps Alepha and handles fetch requests\n */\nasync function writeWorkerEntryPoint(\n root: string,\n distDir: string,\n): Promise<void> {\n const workerCode = `\nimport \"./index.js\";\n\nexport default {\n fetch: async (request, env) => {\n const ctx = { req: request, res: undefined };\n\n __alepha.set(\"cloudflare.env\", env);\n\n try {\n await __alepha.start();\n } catch (err) {\n console.error(err);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n\n await __alepha.events.emit(\"web:request\", ctx);\n\n return ctx.res;\n },\n};\n`.trim();\n\n await writeFile(\n join(root, distDir, \"main.cloudflare.js\"),\n `${WARNING_COMMENT}\\n${workerCode}`.trim(),\n );\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 { 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 await copyDrizzleMigrations(distDir);\n await writeDockerfile(distDir, image, command);\n}\n\n/**\n * Copy drizzle migrations to the dist directory if they exist\n */\nasync function copyDrizzleMigrations(distDir: string): Promise<void> {\n const hasMigrations = await fileExists(\"drizzle\");\n if (hasMigrations) {\n await cp(\"drizzle\", `${distDir}/drizzle`, { recursive: true });\n }\n}\n\n/**\n * Write the Dockerfile with the specified base image and command\n */\nasync function writeDockerfile(\n distDir: string,\n image: string,\n command: string,\n): Promise<void> {\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\nRUN ${command === \"bun\" ? \"bun\" : \"npm\"} install\n\nENV SERVER_HOST=0.0.0.0\n\nCMD [\"${command}\", \"index.js\"]\n`;\n\n await writeFile(`${distDir}/Dockerfile`, dockerfile);\n}\n","import { writeFile } from \"node:fs/promises\";\nimport type { Alepha } from \"alepha\";\n\nexport interface GenerateSitemapOptions {\n /**\n * Alepha instance to use for generating the sitemap.\n */\n alepha: Alepha;\n\n /**\n * Base URL for the sitemap (e.g., \"https://example.com\").\n */\n baseUrl: string;\n\n /**\n * Output file path for the sitemap. If provided, writes the sitemap to disk.\n */\n output?: string;\n\n /**\n * Add Runner for logging (@see Alepha CLI)\n */\n run?: (opts: {\n name: string;\n handler: () => Promise<void>;\n }) => Promise<string>;\n}\n\n/**\n * Generate sitemap.xml from Alepha page primitives.\n *\n * Queries all page primitives 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 pages = getSitemapPages(opts.alepha);\n\n // Nothing to generate\n if (pages.length === 0) {\n return \"\";\n }\n\n let result = \"\";\n\n const fn = async () => {\n result = generateSitemapFromPages(pages, opts.baseUrl);\n if (opts.output) {\n await writeFile(opts.output, result);\n }\n };\n\n if (opts.run) {\n await opts.run({\n name: \"generate sitemap\",\n handler: fn,\n });\n } else {\n await fn();\n }\n\n return result;\n}\n\n/**\n * Get all pages that should be included in the sitemap.\n */\nfunction getSitemapPages(alepha: Alepha): any[] {\n const pages = alepha.primitives(\"page\") as any[];\n return pages.filter((page) => {\n const options = page.options;\n // Skip pages with children (parent pages that can't be rendered directly)\n if (options.children) {\n return false;\n }\n // Include pages without parameters or static pages with entries\n if (!options.schema?.params) {\n return true;\n }\n if (\n options.static &&\n typeof options.static === \"object\" &&\n options.static.entries\n ) {\n return true;\n }\n return false;\n });\n}\n\nfunction generateSitemapFromPages(pages: any[], baseUrl: string): string {\n const urls: string[] = [];\n const normalizedBaseUrl = baseUrl.replace(/\\/$/, \"\");\n\n for (const page of pages) {\n const options = page.options;\n\n if (!options.schema?.params) {\n // Simple page without parameters\n const path = options.path || \"\";\n const url = `${normalizedBaseUrl}${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 = `${normalizedBaseUrl}${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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n","import { mkdir, stat, writeFile } from \"node:fs/promises\";\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 const env = loadEnv(\"production\", process.cwd(), \"\");\n\n await writeApiEntryPoint(distDir);\n await writeVercelConfig(distDir, clientDir, opts.config?.config);\n\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 await writeProjectConfig(distDir, projectId, projectName, orgId);\n }\n\n await ensureClientDir(distDir, clientDir);\n}\n\n/**\n * Check if a file or directory exists at the given path\n */\nasync function exists(path: string): Promise<boolean> {\n return stat(path)\n .then(() => true)\n .catch(() => false);\n}\n\n/**\n * Create the serverless function entry point that bootstraps Alepha and handles requests\n */\nasync function writeApiEntryPoint(distDir: string): Promise<void> {\n await mkdir(`${distDir}/api`, { recursive: true });\n await writeFile(\n `${distDir}/api/index.js`,\n `${WARNING_COMMENT}\nimport \"../index.js\";\n\nexport default async (req, res) => {\n\\tawait __alepha.start();\n\\tawait __alepha.events.emit(\"node:request\", { req, res });\n}\n`,\n );\n}\n\n/**\n * Generate vercel.json with route rewrites to direct all traffic to the serverless function\n */\nasync function writeVercelConfig(\n distDir: string,\n clientDir: string,\n config?: VercelConfig[\"config\"],\n): Promise<void> {\n await writeFile(\n `${distDir}/vercel.json`,\n JSON.stringify(\n {\n ...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\n/**\n * Generate .vercel/project.json to link the deployment to a Vercel project\n */\nasync function writeProjectConfig(\n distDir: string,\n projectId: string,\n projectName: string | undefined,\n orgId: string,\n): Promise<void> {\n await mkdir(`${distDir}/.vercel`, { recursive: true });\n await writeFile(\n `${distDir}/.vercel/project.json`,\n JSON.stringify(\n {\n projectId,\n projectName,\n orgId,\n },\n null,\n \" \",\n ),\n );\n}\n\n/**\n * Create the client directory with a .keep file if it doesn't exist to avoid Vercel errors\n */\nasync function ensureClientDir(\n distDir: string,\n clientDir: string,\n): Promise<void> {\n const path = `${distDir}/${clientDir}`;\n if (!(await exists(path))) {\n await mkdir(path, { recursive: true });\n await writeFile(`${path}/.keep`, \"\");\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport type { Alepha } from \"alepha\";\nimport {\n compressFile,\n type ViteCompressOptions,\n} from \"../plugins/viteCompress.ts\";\n\nexport interface PrerenderPagesOptions {\n /**\n * Alepha instance to use for pre-rendering.\n */\n alepha: Alepha;\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 /**\n * Add Runner for logging (@see Alepha CLI)\n */\n run?: (opts: {\n name: string;\n handler: () => Promise<void>;\n }) => Promise<string>;\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 * Queries all page primitives with `static: true` and generates\n * static HTML files for each page. Supports pages with parameterized\n * routes via `static.entries` configuration.\n */\nexport async function prerenderPages(\n opts: PrerenderPagesOptions,\n): Promise<PrerenderPagesResult> {\n const alepha = opts.alepha;\n const pages = getStaticPages(alepha);\n\n // Nothing to pre-render\n if (pages.length === 0) {\n return { count: 0 };\n }\n\n let result: PrerenderPagesResult = { count: 0 };\n\n const fn = async () => {\n // TODO: running configure here is a temporary workaround\n if (!alepha.isConfigured()) {\n await alepha.events.emit(\"configure\", alepha);\n }\n result = await prerenderFromAlepha(pages, opts.dist, opts.compress);\n };\n\n if (opts.run) {\n await opts.run({\n name: \"pre-render pages\",\n handler: fn,\n });\n } else {\n await fn();\n }\n\n return result;\n}\n\n/**\n * Get all static pages from the Alepha instance.\n */\nfunction getStaticPages(alepha: Alepha): any[] {\n const pages = alepha.primitives(\"page\") as any[];\n return pages.filter((page) => {\n const options = page.options;\n return options.static && !options.children;\n });\n}\n\nasync function prerenderFromAlepha(\n pages: any[],\n dist: string,\n compress?: ViteCompressOptions | boolean,\n): Promise<PrerenderPagesResult> {\n let count = 0;\n\n for (const page of pages) {\n const options = page.options;\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["gzipCb","brotliCompress","brotliCompressCb","fs","viteAnalyzer","viteAnalyzer","WARNING_COMMENT"],"sources":["../../src/vite/helpers/createBufferedLogger.ts","../../src/vite/helpers/importVite.ts","../../src/vite/helpers/importViteReact.ts","../../src/vite/plugins/viteAlephaSsrPreload.ts","../../src/vite/plugins/viteCompress.ts","../../src/vite/tasks/buildClient.ts","../../src/vite/tasks/generateExternals.ts","../../src/vite/tasks/buildServer.ts","../../src/vite/tasks/copyAssets.ts","../../src/vite/tasks/generateCloudflare.ts","../../src/vite/helpers/fileExists.ts","../../src/vite/tasks/generateDocker.ts","../../src/vite/tasks/generateSitemap.ts","../../src/vite/tasks/generateVercel.ts","../../src/vite/tasks/prerenderPages.ts"],"sourcesContent":["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 { 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 { createRequire } from \"node:module\";\n\nexport const importViteReact = async (): Promise<any> => {\n // Add React plugin for JSX/TSX compilation\n try {\n const { default: viteReact } = createRequire(import.meta.url)(\n \"@vitejs/plugin-react\",\n );\n return viteReact;\n } catch {\n // @vitejs/plugin-react not installed, skip\n }\n};\n","import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport type { Plugin } from \"vite\";\n\n/**\n * Preload manifest mapping short keys to source paths.\n * Generated at build time, consumed by SSRManifestProvider at runtime.\n */\nexport interface PreloadManifest {\n [key: string]: string;\n}\n\n/**\n * Vite plugin that generates a preload manifest for SSR module preloading.\n *\n * Instead of injecting source paths directly into $page definitions (which would\n * leak component paths in the browser bundle), this plugin:\n *\n * 1. Collects all lazy import paths from $page definitions during transform\n * 2. Generates a manifest file mapping short keys to resolved source paths\n * 3. Injects only the short key into $page definitions\n *\n * The manifest is written to `.vite/preload-manifest.json` alongside Vite's\n * other manifests. The CLI build command moves all manifests to\n * `dist/server/.ssr/` where SSRManifestProvider loads them at runtime.\n *\n * Before:\n * ```typescript\n * $page({\n * path: '/users/:id',\n * lazy: () => import('./UserDetail.tsx'),\n * })\n * ```\n *\n * After:\n * ```typescript\n * $page({\n * path: '/users/:id',\n * lazy: () => import('./UserDetail.tsx'),\n * [Symbol.for(\"alepha.page.preload\")]: \"a1b2c3\",\n * })\n * ```\n *\n * Manifest (.alepha/preload-manifest.json):\n * ```json\n * {\n * \"a1b2c3\": \"src/pages/UserDetail.tsx\"\n * }\n * ```\n */\nexport function viteAlephaSsrPreload(): Plugin {\n let root = \"\";\n const preloadMap = new Map<string, string>(); // key -> sourcePath\n\n /**\n * Generate a short hash key for a source path.\n * Uses first 8 chars of MD5 hash for brevity while avoiding collisions.\n */\n function generateKey(sourcePath: string): string {\n return createHash(\"md5\").update(sourcePath).digest(\"hex\").slice(0, 8);\n }\n\n return {\n name: \"alepha-preload\",\n configResolved(config) {\n root = config.root;\n },\n transform(code, id) {\n // Only process TypeScript/JavaScript files\n if (!id.match(/\\.[tj]sx?$/)) {\n return null;\n }\n\n // Skip node_modules\n if (id.includes(\"node_modules\")) {\n return null;\n }\n\n // Quick check if file contains $page with lazy\n if (!code.includes(\"$page\") || !code.includes(\"lazy\")) {\n return null;\n }\n\n // Collect all insertions first, then apply in reverse order\n const insertions: Array<{ position: number; text: string }> = [];\n\n // Find all $page({ occurrences\n const pageStartRegex = /\\$page\\s*\\(\\s*\\{/g;\n let pageMatch: RegExpExecArray | null = pageStartRegex.exec(code);\n\n while (pageMatch !== null) {\n const startIndex = pageMatch.index;\n const objectStartIndex = startIndex + pageMatch[0].length - 1; // Position of '{'\n\n // Find the matching closing brace using brace counting\n let braceCount = 1;\n let i = objectStartIndex + 1;\n while (i < code.length && braceCount > 0) {\n if (code[i] === \"{\") braceCount++;\n else if (code[i] === \"}\") braceCount--;\n i++;\n }\n\n // Malformed, skip\n if (braceCount !== 0) {\n pageMatch = pageStartRegex.exec(code);\n continue;\n }\n\n const objectEndIndex = i - 1; // Position of matching '}'\n const pageContent = code.slice(objectStartIndex, objectEndIndex + 1);\n\n // Skip if already has preload symbol\n if (pageContent.includes(\"alepha.page.preload\")) {\n pageMatch = pageStartRegex.exec(code);\n continue;\n }\n\n // Find lazy: () => import('...') within this $page block\n const lazyRegex =\n /lazy\\s*:\\s*\\(\\s*\\)\\s*=>\\s*import\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/;\n const lazyMatch = lazyRegex.exec(pageContent);\n\n if (!lazyMatch) {\n pageMatch = pageStartRegex.exec(code);\n continue;\n }\n\n const importPath = lazyMatch[1];\n\n // Resolve the import path relative to the current file\n const currentDir = dirname(id);\n let resolvedPath: string;\n\n if (importPath.startsWith(\".\")) {\n // Relative import\n resolvedPath = resolve(currentDir, importPath);\n } else if (importPath.startsWith(\"/\")) {\n // Absolute import from root\n resolvedPath = resolve(root, importPath.slice(1));\n } else {\n // Package import - skip preloading for external packages\n pageMatch = pageStartRegex.exec(code);\n continue;\n }\n\n // Make path relative to root for SSR manifest lookup\n let relativePath = relative(root, resolvedPath);\n\n // Normalize path separators for cross-platform compatibility\n relativePath = relativePath.replace(/\\\\/g, \"/\");\n\n // Handle extension - Vite resolves .jsx imports to .tsx files\n // Try to use .tsx when the source has .jsx since TypeScript is more common\n if (!relativePath.match(/\\.[tj]sx?$/)) {\n relativePath = `${relativePath}.tsx`;\n } else if (relativePath.endsWith(\".jsx\")) {\n // Import said .jsx but actual file is likely .tsx\n relativePath = relativePath.replace(/\\.jsx$/, \".tsx\");\n } else if (relativePath.endsWith(\".js\")) {\n // Import said .js but actual file is likely .ts\n relativePath = relativePath.replace(/\\.js$/, \".ts\");\n }\n\n // Generate short key and store mapping\n const key = generateKey(relativePath);\n preloadMap.set(key, relativePath);\n\n // Check if we need a comma (look at character before closing brace)\n const beforeBrace = code.slice(0, objectEndIndex).trimEnd();\n const needsComma = !beforeBrace.endsWith(\",\");\n // Use Symbol.for() so it can be looked up at runtime without importing\n // Only inject the short key, not the full path\n const preloadProperty = `${needsComma ? \",\" : \"\"} [Symbol.for(\"alepha.page.preload\")]: \"${key}\"`;\n\n insertions.push({ position: objectEndIndex, text: preloadProperty });\n\n pageMatch = pageStartRegex.exec(code);\n }\n\n if (insertions.length === 0) {\n return null;\n }\n\n // Apply insertions in reverse order to preserve positions\n let result = code;\n for (let j = insertions.length - 1; j >= 0; j--) {\n const { position, text } = insertions[j];\n result = result.slice(0, position) + text + result.slice(position);\n }\n\n return {\n code: result,\n map: null,\n };\n },\n writeBundle(options) {\n // Only process client build (outputs to dist/public or similar)\n // Skip server build which outputs to dist/server\n const outDir = options.dir || \"\";\n if (outDir.includes(\"server\")) {\n return;\n }\n\n // Write the preload manifest to the same .vite directory Vite uses\n // The CLI build command will move all manifests to dist/server/.ssr/\n if (preloadMap.size > 0) {\n const viteDir = join(outDir, \".vite\");\n\n // Ensure .vite directory exists\n if (!existsSync(viteDir)) {\n mkdirSync(viteDir, { recursive: true });\n }\n\n const manifest: PreloadManifest = Object.fromEntries(preloadMap);\n const manifestPath = join(viteDir, \"preload-manifest.json\");\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));\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 { importViteReact } from \"../helpers/importViteReact.ts\";\nimport { viteAlephaSsrPreload } from \"../plugins/viteAlephaSsrPreload.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 * 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 } = await importVite();\n const plugins: any[] = [];\n\n const viteReact = await importViteReact();\n if (viteReact) plugins.push(viteReact());\n\n // Add preload plugin for SSR module preloading\n plugins.push(viteAlephaSsrPreload());\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 // Generate manifest for SSR module preloading\n manifest: true,\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(viteBuildClientConfig);\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, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type Alepha, 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 { importViteReact } from \"../helpers/importViteReact.ts\";\nimport { viteAlephaSsrPreload } from \"../plugins/viteAlephaSsrPreload.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 SSR manifest will be embedded in the server output.\n */\n clientDir?: string;\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 * Add more entry point conditions for SSR module resolution (e.g., \"bun\").\n */\n conditions?: string[];\n\n /**\n * Alepha instance to set SSR manifest for pre-rendering.\n */\n alepha: Alepha;\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 * SSR manifest data for module preloading.\n * Can be used to set in alepha store for pre-rendering.\n */\n manifest?: {\n base?: string;\n client?: Record<string, any>;\n preload?: Record<string, string>;\n };\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, resolveConfig } = await importVite();\n const plugins: any[] = [];\n\n const viteReact = await importViteReact();\n if (viteReact && opts.clientDir) {\n plugins.push(viteReact());\n }\n\n plugins.push(viteAlephaSsrPreload());\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 conditions = [\"node\", \"import\", \"module\", \"default\"];\n if (opts.conditions) {\n conditions.unshift(...opts.conditions);\n }\n\n // note: we still can override this config via config file (vite.config.ts)\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 resolve: { conditions },\n },\n build: {\n sourcemap: true,\n ssr: opts.entry,\n outDir: `${opts.distDir}/server`,\n minify: true,\n chunkSizeWarningLimit: 10000,\n rollupOptions: {\n external: [/^bun(:|$)/, /^cloudflare:/],\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, // mock logger to avoid noisy output\n plugins,\n };\n\n // create inline config by merging alepha built-in + extended config\n\n let result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];\n try {\n result = (await viteBuild(viteBuildServerConfig)) as\n | vite.Rollup.RollupOutput\n | 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 // resolve final config to read externals\n const resolvedConfig = await resolveConfig(viteBuildServerConfig, \"build\");\n\n // extract resolved config to get externals\n const externals: string[] = [];\n\n if (Array.isArray(resolvedConfig?.ssr?.external)) {\n externals.push(...resolvedConfig.ssr.external);\n }\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 SSR manifests if client was built\n // This bundles all manifest data into index.js for serverless deployments\n let manifest = \"\";\n let manifestData:\n | {\n base?: string;\n client?: Record<string, any>;\n preload?: Record<string, string>;\n }\n | undefined;\n\n if (opts.clientDir) {\n const viteDir = `${opts.distDir}/${opts.clientDir}/.vite`;\n const clientManifest = await loadJsonFile(`${viteDir}/manifest.json`);\n const preloadManifest = await loadJsonFile(\n `${viteDir}/preload-manifest.json`,\n );\n\n // Strip unused fields from client manifest to reduce bundle size\n const strippedClientManifest = stripClientManifest(clientManifest);\n\n // Get base path from resolved config (defaults to \"/\" if not set)\n // Normalize: ensure it starts with \"/\" and doesn't end with \"/\" (unless it's just \"/\")\n let base = resolvedConfig.base || \"/\";\n if (!base.startsWith(\"/\")) {\n base = `/${base}`;\n }\n if (base.length > 1 && base.endsWith(\"/\")) {\n base = base.slice(0, -1);\n }\n\n manifestData = {\n base: base !== \"/\" ? base : undefined, // Only include if not default\n client: strippedClientManifest,\n preload: preloadManifest,\n };\n\n manifest = `__alepha.set(\"alepha.react.ssr.manifest\", ${JSON.stringify(manifestData)});\\n`;\n\n // Set manifest in alepha store for pre-rendering\n opts.alepha.store.set(\"alepha.react.ssr.manifest\" as any, manifestData);\n\n // Remove .vite directory - no longer needed at runtime\n await rm(viteDir, { recursive: true, force: true });\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 await writeFile(\n `${opts.distDir}/index.js`,\n `${warning}\\n${manifest}import './server/${entryFile}';\\n`.trim(),\n );\n\n return { entryFile, manifest: manifestData };\n}\n\n/**\n * Load a JSON file, returning undefined if it doesn't exist.\n */\nasync function loadJsonFile(path: string): Promise<any> {\n try {\n const content = await readFile(path, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Strip unused fields from client manifest to reduce bundle size.\n * Only keeps: file, isEntry, imports, css\n */\nfunction stripClientManifest(\n manifest: Record<string, any> | undefined,\n): Record<string, any> | undefined {\n if (!manifest) return undefined;\n\n const stripped: Record<string, any> = {};\n for (const [key, entry] of Object.entries(manifest)) {\n stripped[key] = {\n file: entry.file,\n ...(entry.isEntry && { isEntry: entry.isEntry }),\n ...(entry.imports?.length && { imports: entry.imports }),\n ...(entry.css?.length && { css: entry.css }),\n };\n }\n return stripped;\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 { cp, mkdir } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { Alepha } from \"alepha\";\n\nexport interface CopyAssetsOptions {\n alepha: Alepha;\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 * @default process.cwd()\n */\n root: string;\n\n /**\n * Add Runner for logging (@see Alepha CLI)\n */\n run?: (opts: {\n name: string;\n handler: () => Promise<void>;\n }) => Promise<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 = opts.root;\n const alepha = opts.alepha;\n const assets = alepha.store.get(\"alepha.build.assets\");\n\n if (!assets || assets.length === 0) {\n return;\n }\n\n const fn = async () => {\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\n if (opts.run) {\n await opts.run({\n name: \"copy assets\",\n handler: fn,\n });\n } else {\n await fn();\n }\n}\n","import { access, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport type { Alepha } from \"alepha\";\nimport type { CronProvider } from \"alepha/scheduler\";\nimport type { WorkerdCronProvider } from \"../../scheduler/providers/WorkerdCronProvider.ts\";\n\nexport interface GenerateCloudflareOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n\n /**\n * Additional Wrangler configuration options to merge into wrangler.jsonc.\n */\n config?: WranglerConfig;\n\n alepha: Alepha;\n}\n\nexport interface WranglerConfig {\n [key: string]: any;\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 distDir = opts.distDir ?? \"dist\";\n const root = process.cwd();\n const name = basename(root);\n const hasAssets = await access(join(root, distDir, \"public\"))\n .then(() => true)\n .catch(() => false);\n\n let workerdCronProvider: CronProvider | undefined;\n try {\n workerdCronProvider = opts.alepha.inject(\n \"CronProvider\",\n ) as WorkerdCronProvider;\n } catch {}\n\n const crons = workerdCronProvider?.getCronJobs();\n\n const wrangler: WranglerConfig = {\n name,\n main: \"./main.cloudflare.js\",\n compatibility_flags: [\"nodejs_compat\"],\n compatibility_date: \"2025-11-17\",\n no_bundle: true,\n rules: [\n {\n type: \"ESModule\",\n globs: [\"index.js\", \"server/*.js\"],\n },\n ],\n ...opts.config,\n };\n\n if (hasAssets) {\n wrangler.assets ??= {\n directory: \"./public\",\n binding: \"ASSETS\",\n };\n }\n\n if (crons && crons.length > 0) {\n const cronExpressions = [...new Set(crons.map((c) => c.expression))];\n wrangler.triggers ??= {};\n wrangler.triggers.crons = cronExpressions;\n }\n\n const url = process.env.DATABASE_URL;\n if (url?.startsWith(\"d1:\")) {\n const [name, id] = url.replace(\"d1://\", \"\").replace(\"d1:\", \"\").split(\":\");\n wrangler.d1_databases = wrangler.d1_databases || [];\n wrangler.d1_databases.push({\n binding: name,\n database_name: name,\n database_id: id,\n });\n wrangler.vars ??= {};\n wrangler.vars.DATABASE_URL = `d1://${name}:${id}`;\n }\n\n await writeFile(\n join(root, distDir, \"wrangler.jsonc\"),\n JSON.stringify(wrangler, null, 2),\n );\n\n await writeWorkerEntryPoint(root, distDir);\n}\n\n/**\n * Write the worker entry point that bootstraps Alepha and handles fetch requests\n */\nasync function writeWorkerEntryPoint(\n root: string,\n distDir: string,\n): Promise<void> {\n const workerCode = `\nimport \"./index.js\";\n\nexport default {\n fetch: async (request, env) => {\n const ctx = { req: request, res: undefined };\n\n __alepha.set(\"cloudflare.env\", env);\n\n try {\n await __alepha.start();\n } catch (err) {\n console.error(\"Failed to start Alepha for fetch event\", err);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n\n await __alepha.events.emit(\"web:request\", ctx);\n\n return ctx.res;\n },\n\n scheduled: async (event, env, ctx) => {\n __alepha.set(\"cloudflare.env\", env);\n\n try {\n await __alepha.start();\n } catch (err) {\n console.error(\"Failed to start Alepha for scheduled event\", err);\n throw err;\n }\n\n await __alepha.events.emit(\"cloudflare:scheduled\", {\n cron: event.cron,\n scheduledTime: event.scheduledTime,\n });\n },\n};\n`.trim();\n\n await writeFile(\n join(root, distDir, \"main.cloudflare.js\"),\n `${WARNING_COMMENT}\\n${workerCode}`.trim(),\n );\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 { 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 await copyDrizzleMigrations(distDir);\n await writeDockerfile(distDir, image, command);\n}\n\n/**\n * Copy drizzle migrations to the dist directory if they exist\n */\nasync function copyDrizzleMigrations(distDir: string): Promise<void> {\n const hasMigrations = await fileExists(\"drizzle\");\n if (hasMigrations) {\n await cp(\"drizzle\", `${distDir}/drizzle`, { recursive: true });\n }\n}\n\n/**\n * Write the Dockerfile with the specified base image and command\n */\nasync function writeDockerfile(\n distDir: string,\n image: string,\n command: string,\n): Promise<void> {\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\nRUN ${command === \"bun\" ? \"bun\" : \"npm\"} install\n\nENV SERVER_HOST=0.0.0.0\n\nCMD [\"${command}\", \"index.js\"]\n`;\n\n await writeFile(`${distDir}/Dockerfile`, dockerfile);\n}\n","import { writeFile } from \"node:fs/promises\";\nimport type { Alepha } from \"alepha\";\n\nexport interface GenerateSitemapOptions {\n /**\n * Alepha instance to use for generating the sitemap.\n */\n alepha: Alepha;\n\n /**\n * Base URL for the sitemap (e.g., \"https://example.com\").\n */\n baseUrl: string;\n\n /**\n * Output file path for the sitemap. If provided, writes the sitemap to disk.\n */\n output?: string;\n\n /**\n * Add Runner for logging (@see Alepha CLI)\n */\n run?: (opts: {\n name: string;\n handler: () => Promise<void>;\n }) => Promise<string>;\n}\n\n/**\n * Generate sitemap.xml from Alepha page primitives.\n *\n * Queries all page primitives 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 pages = getSitemapPages(opts.alepha);\n\n // Nothing to generate\n if (pages.length === 0) {\n return \"\";\n }\n\n let result = \"\";\n\n const fn = async () => {\n result = generateSitemapFromPages(pages, opts.baseUrl);\n if (opts.output) {\n await writeFile(opts.output, result);\n }\n };\n\n if (opts.run) {\n await opts.run({\n name: \"generate sitemap\",\n handler: fn,\n });\n } else {\n await fn();\n }\n\n return result;\n}\n\n/**\n * Get all pages that should be included in the sitemap.\n */\nfunction getSitemapPages(alepha: Alepha): any[] {\n const pages = alepha.primitives(\"page\") as any[];\n return pages.filter((page) => {\n const options = page.options;\n // Skip pages with children (parent pages that can't be rendered directly)\n if (options.children) {\n return false;\n }\n // Include pages without parameters or static pages with entries\n if (!options.schema?.params) {\n return true;\n }\n if (\n options.static &&\n typeof options.static === \"object\" &&\n options.static.entries\n ) {\n return true;\n }\n return false;\n });\n}\n\nfunction generateSitemapFromPages(pages: any[], baseUrl: string): string {\n const urls: string[] = [];\n const normalizedBaseUrl = baseUrl.replace(/\\/$/, \"\");\n\n for (const page of pages) {\n const options = page.options;\n\n if (!options.schema?.params) {\n // Simple page without parameters\n const path = options.path || \"\";\n const url = `${normalizedBaseUrl}${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 = `${normalizedBaseUrl}${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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n","import { mkdir, stat, writeFile } from \"node:fs/promises\";\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 const env = loadEnv(\"production\", process.cwd(), \"\");\n\n await writeApiEntryPoint(distDir);\n await writeVercelConfig(distDir, clientDir, opts.config?.config);\n\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 await writeProjectConfig(distDir, projectId, projectName, orgId);\n }\n\n await ensureClientDir(distDir, clientDir);\n}\n\n/**\n * Check if a file or directory exists at the given path\n */\nasync function exists(path: string): Promise<boolean> {\n return stat(path)\n .then(() => true)\n .catch(() => false);\n}\n\n/**\n * Create the serverless function entry point that bootstraps Alepha and handles requests\n */\nasync function writeApiEntryPoint(distDir: string): Promise<void> {\n await mkdir(`${distDir}/api`, { recursive: true });\n await writeFile(\n `${distDir}/api/index.js`,\n `${WARNING_COMMENT}\nimport \"../index.js\";\n\nexport default async (req, res) => {\n\\tawait __alepha.start();\n\\tawait __alepha.events.emit(\"node:request\", { req, res });\n}\n`,\n );\n}\n\n/**\n * Generate vercel.json with route rewrites to direct all traffic to the serverless function\n */\nasync function writeVercelConfig(\n distDir: string,\n clientDir: string,\n config?: VercelConfig[\"config\"],\n): Promise<void> {\n await writeFile(\n `${distDir}/vercel.json`,\n JSON.stringify(\n {\n ...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\n/**\n * Generate .vercel/project.json to link the deployment to a Vercel project\n */\nasync function writeProjectConfig(\n distDir: string,\n projectId: string,\n projectName: string | undefined,\n orgId: string,\n): Promise<void> {\n await mkdir(`${distDir}/.vercel`, { recursive: true });\n await writeFile(\n `${distDir}/.vercel/project.json`,\n JSON.stringify(\n {\n projectId,\n projectName,\n orgId,\n },\n null,\n \" \",\n ),\n );\n}\n\n/**\n * Create the client directory with a .keep file if it doesn't exist to avoid Vercel errors\n */\nasync function ensureClientDir(\n distDir: string,\n clientDir: string,\n): Promise<void> {\n const path = `${distDir}/${clientDir}`;\n if (!(await exists(path))) {\n await mkdir(path, { recursive: true });\n await writeFile(`${path}/.keep`, \"\");\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport type { Alepha } from \"alepha\";\nimport {\n compressFile,\n type ViteCompressOptions,\n} from \"../plugins/viteCompress.ts\";\n\nexport interface PrerenderPagesOptions {\n /**\n * Alepha instance to use for pre-rendering.\n */\n alepha: Alepha;\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 /**\n * Add Runner for logging (@see Alepha CLI)\n */\n run?: (opts: {\n name: string;\n handler: () => Promise<void>;\n }) => Promise<string>;\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 * Queries all page primitives with `static: true` and generates\n * static HTML files for each page. Supports pages with parameterized\n * routes via `static.entries` configuration.\n */\nexport async function prerenderPages(\n opts: PrerenderPagesOptions,\n): Promise<PrerenderPagesResult> {\n const alepha = opts.alepha;\n const pages = getStaticPages(alepha);\n\n // Nothing to pre-render\n if (pages.length === 0) {\n return { count: 0 };\n }\n\n let result: PrerenderPagesResult = { count: 0 };\n\n const fn = async () => {\n // TODO: running configure here is a temporary workaround\n if (!alepha.isConfigured()) {\n await alepha.events.emit(\"configure\", alepha);\n }\n result = await prerenderFromAlepha(pages, opts.dist, opts.compress);\n };\n\n if (opts.run) {\n await opts.run({\n name: \"pre-render pages\",\n handler: fn,\n });\n } else {\n await fn();\n }\n\n return result;\n}\n\n/**\n * Get all static pages from the Alepha instance.\n */\nfunction getStaticPages(alepha: Alepha): any[] {\n const pages = alepha.primitives(\"page\") as any[];\n return pages.filter((page) => {\n const options = page.options;\n return options.static && !options.children;\n });\n}\n\nasync function prerenderFromAlepha(\n pages: any[],\n dist: string,\n compress?: ViteCompressOptions | boolean,\n): Promise<PrerenderPagesResult> {\n let count = 0;\n\n for (const page of pages) {\n const options = page.options;\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"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as alepha42 from "alepha";
|
|
2
2
|
import { Alepha, KIND, Primitive, Static, TObject, TString, TUnion } from "alepha";
|
|
3
3
|
import * as alepha_topic0 from "alepha/topic";
|
|
4
|
-
import * as
|
|
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 WebSocketPrimitive<TClient extends TWSObject, TServer extends TWSO
|
|
|
452
452
|
* and messages can be targeted to specific rooms.
|
|
453
453
|
*/
|
|
454
454
|
declare class RoomManager {
|
|
455
|
-
protected readonly log:
|
|
455
|
+
protected readonly log: alepha_logger2.Logger;
|
|
456
456
|
/**
|
|
457
457
|
* Maps roomId → Set<connectionId>
|
|
458
458
|
*/
|
|
@@ -509,10 +509,10 @@ declare class RoomManager {
|
|
|
509
509
|
}
|
|
510
510
|
//#endregion
|
|
511
511
|
//#region ../../src/websocket/services/WebSocketClient.d.ts
|
|
512
|
-
declare const envSchema$1:
|
|
513
|
-
WEBSOCKET_URL:
|
|
514
|
-
WEBSOCKET_RECONNECT_INTERVAL:
|
|
515
|
-
WEBSOCKET_MAX_RECONNECT_ATTEMPTS:
|
|
512
|
+
declare const envSchema$1: alepha42.TObject<{
|
|
513
|
+
WEBSOCKET_URL: alepha42.TString;
|
|
514
|
+
WEBSOCKET_RECONNECT_INTERVAL: alepha42.TInteger;
|
|
515
|
+
WEBSOCKET_MAX_RECONNECT_ATTEMPTS: alepha42.TInteger;
|
|
516
516
|
}>;
|
|
517
517
|
declare module "alepha" {
|
|
518
518
|
interface Env extends Partial<Static<typeof envSchema$1>> {}
|
|
@@ -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:
|
|
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:
|
|
610
|
+
protected readonly log: alepha_logger2.Logger;
|
|
611
611
|
protected readonly alepha: Alepha;
|
|
612
612
|
protected readonly env: {
|
|
613
613
|
WEBSOCKET_URL: string;
|
|
@@ -646,35 +646,35 @@ declare class WebSocketClient {
|
|
|
646
646
|
* WebSocket message distribution event
|
|
647
647
|
*/
|
|
648
648
|
declare const webSocketMessageSchema: {
|
|
649
|
-
payload:
|
|
649
|
+
payload: alepha42.TObject<{
|
|
650
650
|
/**
|
|
651
651
|
* Channel path (e.g., "/ws/chat")
|
|
652
652
|
*/
|
|
653
|
-
channelPath:
|
|
653
|
+
channelPath: alepha42.TString;
|
|
654
654
|
/**
|
|
655
655
|
* Target room ID(s)
|
|
656
656
|
*/
|
|
657
|
-
roomIds:
|
|
657
|
+
roomIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
|
|
658
658
|
/**
|
|
659
659
|
* Target user ID(s)
|
|
660
660
|
*/
|
|
661
|
-
userIds:
|
|
661
|
+
userIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
|
|
662
662
|
/**
|
|
663
663
|
* Target connection ID(s)
|
|
664
664
|
*/
|
|
665
|
-
connectionIds:
|
|
665
|
+
connectionIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
|
|
666
666
|
/**
|
|
667
667
|
* Exclude connection ID(s) from receiving the message
|
|
668
668
|
*/
|
|
669
|
-
exceptConnectionIds:
|
|
669
|
+
exceptConnectionIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
|
|
670
670
|
/**
|
|
671
671
|
* Exclude user ID(s) from receiving the message
|
|
672
672
|
*/
|
|
673
|
-
exceptUserIds:
|
|
673
|
+
exceptUserIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
|
|
674
674
|
/**
|
|
675
675
|
* The message payload to send
|
|
676
676
|
*/
|
|
677
|
-
message:
|
|
677
|
+
message: alepha42.TAny;
|
|
678
678
|
}>;
|
|
679
679
|
};
|
|
680
680
|
/**
|
|
@@ -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:
|
|
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
|
|
@@ -704,35 +704,35 @@ declare class WebSocketTopicService {
|
|
|
704
704
|
* Topic for distributing WebSocket messages across server instances
|
|
705
705
|
*/
|
|
706
706
|
readonly topic: alepha_topic0.TopicPrimitive<{
|
|
707
|
-
payload:
|
|
707
|
+
payload: alepha42.TObject<{
|
|
708
708
|
/**
|
|
709
709
|
* Channel path (e.g., "/ws/chat")
|
|
710
710
|
*/
|
|
711
|
-
channelPath:
|
|
711
|
+
channelPath: alepha42.TString;
|
|
712
712
|
/**
|
|
713
713
|
* Target room ID(s)
|
|
714
714
|
*/
|
|
715
|
-
roomIds:
|
|
715
|
+
roomIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
|
|
716
716
|
/**
|
|
717
717
|
* Target user ID(s)
|
|
718
718
|
*/
|
|
719
|
-
userIds:
|
|
719
|
+
userIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
|
|
720
720
|
/**
|
|
721
721
|
* Target connection ID(s)
|
|
722
722
|
*/
|
|
723
|
-
connectionIds:
|
|
723
|
+
connectionIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
|
|
724
724
|
/**
|
|
725
725
|
* Exclude connection ID(s) from receiving the message
|
|
726
726
|
*/
|
|
727
|
-
exceptConnectionIds:
|
|
727
|
+
exceptConnectionIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
|
|
728
728
|
/**
|
|
729
729
|
* Exclude user ID(s) from receiving the message
|
|
730
730
|
*/
|
|
731
|
-
exceptUserIds:
|
|
731
|
+
exceptUserIds: alepha42.TOptional<alepha42.TArray<alepha42.TString>>;
|
|
732
732
|
/**
|
|
733
733
|
* The message payload to send
|
|
734
734
|
*/
|
|
735
|
-
message:
|
|
735
|
+
message: alepha42.TAny;
|
|
736
736
|
}>;
|
|
737
737
|
}>;
|
|
738
738
|
/**
|
|
@@ -746,8 +746,8 @@ declare class WebSocketTopicService {
|
|
|
746
746
|
}
|
|
747
747
|
//#endregion
|
|
748
748
|
//#region ../../src/websocket/providers/NodeWebSocketServerProvider.d.ts
|
|
749
|
-
declare const envSchema:
|
|
750
|
-
WEBSOCKET_PATH:
|
|
749
|
+
declare const envSchema: alepha42.TObject<{
|
|
750
|
+
WEBSOCKET_PATH: alepha42.TString;
|
|
751
751
|
}>;
|
|
752
752
|
declare module "alepha" {
|
|
753
753
|
interface Env extends Partial<Static<typeof envSchema>> {}
|
|
@@ -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:
|
|
759
|
+
protected readonly log: alepha_logger2.Logger;
|
|
760
760
|
protected readonly env: {
|
|
761
761
|
WEBSOCKET_PATH: string;
|
|
762
762
|
};
|
|
@@ -785,9 +785,9 @@ declare class NodeWebSocketServerProvider extends WebSocketServerProvider {
|
|
|
785
785
|
exceptConnectionIds?: string[];
|
|
786
786
|
exceptUserIds?: string[];
|
|
787
787
|
}): Promise<void>;
|
|
788
|
-
protected readonly start:
|
|
789
|
-
protected readonly ready:
|
|
790
|
-
protected readonly stop:
|
|
788
|
+
protected readonly start: alepha42.HookPrimitive<"start">;
|
|
789
|
+
protected readonly ready: alepha42.HookPrimitive<"ready">;
|
|
790
|
+
protected readonly stop: alepha42.HookPrimitive<"stop">;
|
|
791
791
|
}
|
|
792
792
|
declare class NodeWebSocketConnection implements WebSocketConnection {
|
|
793
793
|
readonly id: string;
|
|
@@ -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: WebSocketPrimitiveOptions<any, any>;
|
|
799
|
-
protected readonly log:
|
|
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: WebSocketPrimitiveOptions<any, any>);
|
|
802
802
|
get readyState(): WebSocketState;
|
|
@@ -843,9 +843,9 @@ declare module "alepha" {
|
|
|
843
843
|
}
|
|
844
844
|
}
|
|
845
845
|
/**
|
|
846
|
-
* |
|
|
847
|
-
*
|
|
848
|
-
* |
|
|
846
|
+
* | Stability | Since | Runtime |
|
|
847
|
+
* |-----------|-------|---------|
|
|
848
|
+
* | 1 - experimental | 0.19.0 | node, browser|
|
|
849
849
|
*
|
|
850
850
|
* Real-time bidirectional communication.
|
|
851
851
|
*
|
|
@@ -859,7 +859,7 @@ declare module "alepha" {
|
|
|
859
859
|
*
|
|
860
860
|
* @module alepha.websocket
|
|
861
861
|
*/
|
|
862
|
-
declare const AlephaWebSocket:
|
|
862
|
+
declare const AlephaWebSocket: alepha42.Service<alepha42.Module>;
|
|
863
863
|
//#endregion
|
|
864
864
|
export { $channel, $websocket, AlephaWebSocket, ChannelPrimitive, ChannelPrimitiveOptions, EmitOptions, NodeWebSocketConnection, NodeWebSocketServerProvider, RoomManager, TWSObject, WebSocketChannelConnection, WebSocketClient, WebSocketConnection, WebSocketConnectionError, WebSocketError, WebSocketHandler, WebSocketHandlerContext, WebSocketPrimitive, WebSocketPrimitiveOptions, WebSocketServerProvider, WebSocketState, WebSocketTopicService, WebSocketValidationError };
|
|
865
865
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/websocket/errors/WebSocketError.ts","../../src/websocket/primitives/$channel.ts","../../src/websocket/interfaces/WebSocketInterfaces.ts","../../src/websocket/providers/WebSocketServerProvider.ts","../../src/websocket/primitives/$websocket.ts","../../src/websocket/services/RoomManager.ts","../../src/websocket/services/WebSocketClient.ts","../../src/websocket/services/WebSocketTopicService.ts","../../src/websocket/providers/NodeWebSocketServerProvider.ts","../../src/websocket/index.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/websocket/errors/WebSocketError.ts","../../src/websocket/primitives/$channel.ts","../../src/websocket/interfaces/WebSocketInterfaces.ts","../../src/websocket/providers/WebSocketServerProvider.ts","../../src/websocket/primitives/$websocket.ts","../../src/websocket/services/RoomManager.ts","../../src/websocket/services/WebSocketClient.ts","../../src/websocket/services/WebSocketTopicService.ts","../../src/websocket/providers/NodeWebSocketServerProvider.ts","../../src/websocket/index.ts"],"mappings":"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"}
|
package/dist/websocket/index.js
CHANGED
|
@@ -1066,9 +1066,9 @@ var WebSocketClient = class {
|
|
|
1066
1066
|
//#endregion
|
|
1067
1067
|
//#region ../../src/websocket/index.ts
|
|
1068
1068
|
/**
|
|
1069
|
-
* |
|
|
1070
|
-
*
|
|
1071
|
-
* |
|
|
1069
|
+
* | Stability | Since | Runtime |
|
|
1070
|
+
* |-----------|-------|---------|
|
|
1071
|
+
* | 1 - experimental | 0.19.0 | node, browser|
|
|
1072
1072
|
*
|
|
1073
1073
|
* Real-time bidirectional communication.
|
|
1074
1074
|
*
|