alepha 0.15.0 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -98
- package/dist/api/audits/index.d.ts +240 -240
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +2 -2
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.d.ts +185 -185
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +2 -2
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +245 -245
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/notifications/index.browser.js +4 -4
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +74 -74
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +4 -4
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/parameters/index.d.ts +221 -221
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/users/index.d.ts +1632 -1631
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +26 -34
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +132 -132
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/batch/index.d.ts +122 -122
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/bucket/index.d.ts +163 -163
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/cache/core/index.d.ts +46 -46
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/cli/index.d.ts +5933 -201
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +609 -169
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +296 -296
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +19 -19
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +268 -79
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +768 -694
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +268 -79
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +268 -79
- package/dist/core/index.native.js.map +1 -1
- package/dist/datetime/index.d.ts +44 -44
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/email/index.d.ts +25 -25
- package/dist/email/index.d.ts.map +1 -1
- package/dist/fake/index.d.ts +5409 -5409
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +22 -22
- package/dist/fake/index.js.map +1 -1
- package/dist/file/index.d.ts +435 -435
- package/dist/file/index.d.ts.map +1 -1
- package/dist/lock/core/index.d.ts +208 -208
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/logger/index.d.ts +24 -24
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +1 -5
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +216 -198
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +28 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/index.browser.js +9 -9
- package/dist/orm/index.browser.js.map +1 -1
- package/dist/orm/index.bun.js +83 -76
- package/dist/orm/index.bun.js.map +1 -1
- package/dist/orm/index.d.ts +961 -960
- package/dist/orm/index.d.ts.map +1 -1
- package/dist/orm/index.js +88 -81
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +244 -244
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/redis/index.d.ts +105 -105
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/retry/index.d.ts +69 -69
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/router/index.d.ts +6 -6
- package/dist/router/index.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +108 -26
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +393 -1
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.d.ts +532 -209
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1422 -11
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +1296 -271
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +1249 -18
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cache/index.d.ts +56 -56
- package/dist/server/cache/index.d.ts.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/cookies/index.d.ts +6 -6
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/core/index.d.ts +196 -186
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +43 -27
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +11 -11
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/helmet/index.d.ts +2 -2
- package/dist/server/helmet/index.d.ts.map +1 -1
- package/dist/server/links/index.browser.js +9 -1
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +83 -83
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +13 -5
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +514 -1
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js +4462 -4
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/multipart/index.d.ts +6 -6
- package/dist/server/multipart/index.d.ts.map +1 -1
- package/dist/server/proxy/index.d.ts +102 -102
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.d.ts +16 -16
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/static/index.d.ts +44 -44
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/swagger/index.d.ts +47 -47
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/sms/index.d.ts +11 -11
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +3 -3
- package/dist/sms/index.js.map +1 -1
- package/dist/thread/index.d.ts +71 -71
- package/dist/thread/index.d.ts.map +1 -1
- package/dist/thread/index.js +2 -2
- package/dist/thread/index.js.map +1 -1
- package/dist/topic/core/index.d.ts +318 -318
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/redis/index.d.ts +6 -6
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/vite/index.d.ts +2324 -1719
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +123 -475
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.browser.js +3 -3
- package/dist/websocket/index.browser.js.map +1 -1
- package/dist/websocket/index.d.ts +275 -275
- 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 +9 -9
- package/src/api/users/services/SessionService.ts +0 -10
- package/src/cli/apps/AlephaCli.ts +2 -2
- package/src/cli/apps/AlephaPackageBuilderCli.ts +9 -1
- package/src/cli/assets/apiHelloControllerTs.ts +2 -1
- package/src/cli/assets/biomeJson.ts +2 -1
- package/src/cli/assets/claudeMd.ts +9 -4
- package/src/cli/assets/dummySpecTs.ts +2 -1
- package/src/cli/assets/editorconfig.ts +2 -1
- package/src/cli/assets/mainBrowserTs.ts +2 -1
- package/src/cli/assets/mainCss.ts +24 -0
- package/src/cli/assets/tsconfigJson.ts +2 -1
- package/src/cli/assets/webAppRouterTs.ts +2 -1
- package/src/cli/assets/webHelloComponentTsx.ts +6 -2
- package/src/cli/atoms/appEntryOptions.ts +13 -0
- package/src/cli/atoms/buildOptions.ts +1 -1
- package/src/cli/atoms/changelogOptions.ts +1 -1
- package/src/cli/commands/build.ts +63 -47
- package/src/cli/commands/dev.ts +16 -33
- package/src/cli/commands/gen/env.ts +1 -1
- package/src/cli/commands/init.ts +17 -8
- package/src/cli/commands/lint.ts +1 -1
- package/src/cli/defineConfig.ts +9 -0
- package/src/cli/index.ts +2 -1
- package/src/cli/providers/AppEntryProvider.ts +131 -0
- package/src/cli/providers/ViteBuildProvider.ts +82 -0
- package/src/cli/providers/ViteDevServerProvider.ts +350 -0
- package/src/cli/providers/ViteTemplateProvider.ts +27 -0
- package/src/cli/services/AlephaCliUtils.ts +33 -2
- package/src/cli/services/PackageManagerUtils.ts +13 -6
- package/src/cli/services/ProjectScaffolder.ts +72 -49
- package/src/core/Alepha.ts +2 -8
- package/src/core/primitives/$module.ts +12 -0
- package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +257 -0
- package/src/core/providers/KeylessJsonSchemaCodec.ts +396 -14
- package/src/core/providers/SchemaValidator.spec.ts +236 -0
- package/src/logger/providers/PrettyFormatterProvider.ts +0 -9
- package/src/mcp/errors/McpError.ts +30 -0
- package/src/mcp/index.ts +3 -0
- package/src/mcp/transports/SseMcpTransport.ts +16 -6
- package/src/orm/providers/DrizzleKitProvider.ts +3 -5
- package/src/orm/services/Repository.ts +11 -0
- package/src/server/core/index.ts +1 -1
- package/src/server/core/providers/BunHttpServerProvider.ts +1 -1
- package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
- package/src/server/core/providers/NodeHttpServerProvider.ts +71 -22
- package/src/server/core/providers/ServerLoggerProvider.ts +2 -2
- package/src/server/core/providers/ServerProvider.ts +9 -12
- package/src/server/links/atoms/apiLinksAtom.ts +7 -0
- package/src/server/links/index.browser.ts +2 -0
- package/src/server/links/index.ts +2 -0
- package/src/vite/index.ts +3 -2
- package/src/vite/tasks/buildClient.ts +0 -1
- package/src/vite/tasks/buildServer.ts +68 -21
- package/src/vite/tasks/copyAssets.ts +5 -4
- package/src/vite/tasks/generateSitemap.ts +64 -23
- package/src/vite/tasks/index.ts +0 -2
- package/src/vite/tasks/prerenderPages.ts +49 -24
- package/src/cli/assets/indexHtml.ts +0 -15
- package/src/cli/commands/format.ts +0 -23
- package/src/vite/helpers/boot.ts +0 -117
- package/src/vite/plugins/viteAlephaDev.ts +0 -177
- package/src/vite/tasks/devServer.ts +0 -71
- package/src/vite/tasks/runAlepha.ts +0 -270
- /package/dist/orm/{chunk-DtkW-qnP.js → chunk-DH6iiROE.js} +0 -0
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["$atom","$atom","app","args","packageJson"],"sources":["../../src/core/constants/KIND.ts","../../src/core/primitives/$atom.ts","../../src/cli/atoms/buildOptions.ts","../../src/cli/services/AlephaCliUtils.ts","../../src/cli/version.ts","../../src/cli/services/PackageManagerUtils.ts","../../src/cli/assets/apiHelloControllerTs.ts","../../src/cli/assets/apiIndexTs.ts","../../src/cli/assets/biomeJson.ts","../../src/cli/assets/claudeMd.ts","../../src/cli/assets/dummySpecTs.ts","../../src/cli/assets/editorconfig.ts","../../src/cli/assets/indexHtml.ts","../../src/cli/assets/mainBrowserTs.ts","../../src/cli/assets/mainServerTs.ts","../../src/cli/assets/tsconfigJson.ts","../../src/cli/assets/webAppRouterTs.ts","../../src/cli/assets/webHelloComponentTsx.ts","../../src/cli/assets/webIndexTs.ts","../../src/cli/services/ProjectScaffolder.ts","../../src/cli/commands/build.ts","../../src/cli/commands/clean.ts","../../src/cli/commands/db.ts","../../src/cli/commands/deploy.ts","../../src/cli/commands/dev.ts","../../src/cli/commands/format.ts","../../src/cli/atoms/changelogOptions.ts","../../src/cli/services/GitMessageParser.ts","../../src/cli/commands/gen/changelog.ts","../../src/cli/commands/gen/env.ts","../../src/cli/commands/gen/openapi.ts","../../src/cli/commands/gen.ts","../../src/cli/commands/init.ts","../../src/cli/commands/lint.ts","../../src/cli/commands/root.ts","../../src/cli/commands/test.ts","../../src/cli/commands/typecheck.ts","../../src/cli/commands/verify.ts","../../src/cli/apps/AlephaCli.ts","../../src/cli/apps/AlephaPackageBuilderCli.ts","../../src/cli/defineConfig.ts"],"sourcesContent":["/**\n * Used for identifying primitives.\n *\n * @internal\n */\nexport const KIND: unique symbol = Symbol.for(\"Alepha.Kind\");\n","import type { TArray } from \"typebox\";\nimport { KIND } from \"../constants/KIND.ts\";\nimport type {\n Static,\n TObject,\n TOptionalAdd,\n} from \"../providers/TypeProvider.ts\";\n\n/**\n * Define an atom for state management.\n *\n * Atom lets you define a piece of state with a name, schema, and default value.\n *\n * By default, Alepha state is just a simple key-value store.\n * Using atoms allows you to have type safety, validation, and default values for your state.\n *\n * You control how state is structured and validated.\n *\n * Features:\n * - Set a schema for validation\n * - Set a default value for initial state\n * - Rules, like read-only, custom validation, etc.\n * - Automatic getter access in services with {@link $use}\n * - SSR support (server state automatically serialized and hydrated on client)\n * - React integration (useAtom hook for automatic component re-renders)\n * - Middleware\n * - Persistence adapters (localStorage, Redis, database, file system, cookie, etc.)\n * - State migrations (version upgrades when schema changes)\n * - Documentation generation & devtools integration\n *\n * Common use cases:\n * - user preferences\n * - feature flags\n * - configuration options\n * - session data\n *\n * Atom must contain only serializable data.\n * Avoid storing complex objects like class instances, functions, or DOM elements.\n * If you need to store complex data, consider using identifiers or references instead.\n */\nexport const $atom = <\n T extends TObject<TProperties> | TArray,\n N extends string,\n>(\n options: AtomOptions<T, N>,\n): Atom<T, N> => {\n return new Atom<T, N>(options);\n};\n\nexport type AtomOptions<T extends TAtomObject, N extends string> = {\n name: N;\n schema: T;\n description?: string;\n} & (T extends TOptionalAdd<T>\n ? {\n default?: Static<T>;\n }\n : {\n default: Static<T>;\n });\n\nexport class Atom<T extends TAtomObject = TObject, N extends string = string> {\n public readonly options: AtomOptions<T, N>;\n\n public get schema(): T {\n return this.options.schema;\n }\n\n public get key(): N {\n return this.options.name;\n }\n\n constructor(options: AtomOptions<T, N>) {\n this.options = options;\n }\n}\n\n$atom[KIND] = \"atom\";\n\ntype TProperties = any; // it's required to avoid required [ string ] error, ...\n\nexport type TAtomObject = TObject<any> | TArray;\nexport type AtomStatic<T extends TAtomObject> =\n T extends TOptionalAdd<T> ? Static<T> | undefined : Static<T>;\n","import { type Static, t } from \"alepha\";\nimport { $atom } from \"../../core/primitives/$atom.ts\";\n\n/**\n * Build options atom for CLI build command.\n *\n * Defines the available build configuration options with their defaults.\n * Options can be overridden via vite.config.ts or CLI flags.\n */\nexport const buildOptions = $atom({\n name: \"alepha.build.options\",\n description: \"Build configuration options\",\n schema: t.object({\n /**\n * Generate build stats report.\n */\n stats: t.optional(t.boolean({ default: false })),\n\n /**\n * Vercel deployment configuration.\n */\n vercel: t.optional(\n t.object({\n projectName: t.optional(t.string()),\n orgId: t.optional(t.string()),\n projectId: t.optional(t.string()),\n config: t.optional(\n t.object({\n crons: t.optional(\n t.array(\n t.object({\n path: t.string(),\n schedule: t.string(),\n }),\n ),\n ),\n }),\n ),\n }),\n ),\n\n /**\n * Cloudflare Workers deployment configuration.\n */\n cloudflare: t.optional(\n t.object({\n config: t.optional(t.json()),\n }),\n ),\n\n /**\n * Docker deployment configuration.\n */\n docker: t.optional(\n t.object({\n /**\n * Docker image name to use in the Dockerfile.\n * @default \"node:24-alpine\"\n */\n image: t.optional(t.string({ default: \"node:24-alpine\" })),\n\n /**\n * Command to run in the Docker container.\n * @default \"node\"\n */\n command: t.optional(t.string({ default: \"node\" })),\n }),\n ),\n\n /**\n * Sitemap generation configuration.\n */\n sitemap: t.optional(\n t.object({\n /**\n * Base URL for sitemap entries.\n */\n hostname: t.string(),\n }),\n ),\n }),\n default: {},\n});\n\n/**\n * Type for build options.\n */\nexport type BuildOptions = Static<typeof buildOptions.schema>;\n","import { spawn } from \"node:child_process\";\nimport { $inject, Alepha, AlephaError } from \"alepha\";\nimport { EnvUtils } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { boot } from \"alepha/vite\";\n\n/**\n * Core utility service for CLI commands.\n *\n * Provides:\n * - Command execution\n * - File editing helpers\n * - Drizzle/ORM utilities\n * - Environment loading\n */\nexport class AlephaCliUtils {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly envUtils = $inject(EnvUtils);\n\n // ===========================================\n // Command Execution\n // ===========================================\n\n /**\n * Execute a command with inherited stdio.\n */\n public async exec(\n command: string,\n options: {\n root?: string;\n env?: Record<string, string>;\n global?: boolean;\n } = {},\n ): Promise<void> {\n const root = options.root ?? process.cwd();\n this.log.debug(`Executing command: ${command}`, { cwd: root });\n\n const runExec = async (app: string, args: string[]) => {\n const prog = spawn(app, args, {\n stdio: \"inherit\",\n cwd: root,\n env: {\n ...process.env,\n ...options.env,\n },\n });\n\n await new Promise<void>((resolve) =>\n prog.on(\"exit\", () => {\n resolve();\n }),\n );\n };\n\n if (options.global) {\n const [app, ...args] = command.split(\" \");\n await runExec(app, args);\n return;\n }\n\n const suffix = process.platform === \"win32\" ? \".cmd\" : \"\";\n const [app, ...args] = command.split(\" \");\n\n // find executable inside project node_modules\n let execPath = await this.checkFileExists(\n root,\n `node_modules/.bin/${app}${suffix}`,\n );\n\n // or, find executable inside alepha package node_modules (pnpm style)\n if (!execPath) {\n execPath = await this.checkFileExists(\n root,\n `node_modules/alepha/node_modules/.bin/${app}${suffix}`,\n );\n }\n\n if (!execPath) {\n throw new AlephaError(\n `Could not find executable for command '${app}'. Make sure the package is installed.`,\n );\n }\n\n await runExec(execPath, args);\n }\n\n /**\n * Write a configuration file to node_modules/.alepha directory.\n */\n public async writeConfigFile(\n name: string,\n content: string,\n root = process.cwd(),\n ): Promise<string> {\n const dir = this.fs.join(root, \"node_modules\", \".alepha\");\n\n await this.fs.mkdir(dir, { recursive: true }).catch(() => null);\n\n const path = this.fs.join(dir, name);\n await this.fs.writeFile(path, content);\n\n this.log.debug(`Config file written: ${path}`);\n\n return path;\n }\n\n /**\n * Load Alepha instance from a server entry file.\n */\n public async loadAlephaFromServerEntryFile(\n rootDir?: string,\n explicitEntry?: string,\n ): Promise<{\n alepha: Alepha;\n entry: string;\n }> {\n process.env.ALEPHA_CLI_IMPORT = \"true\";\n\n const entry = await boot.getServerEntry(rootDir, explicitEntry);\n\n delete (global as any).__alepha;\n\n const mod = await import(entry);\n\n this.log.debug(`Load entry: ${entry}`);\n\n // check if alepha is correctly exported\n if (mod.default instanceof Alepha) {\n return { alepha: mod.default, entry };\n }\n\n // else, try with global variable\n const g: any = global;\n if (g.__alepha) {\n return { alepha: g.__alepha, entry };\n }\n\n throw new AlephaError(\n `Could not find Alepha instance in entry file: ${entry}`,\n );\n }\n\n // ===========================================\n // Drizzle ORM & Kit Utilities\n // ===========================================\n\n /**\n * Generate JavaScript code for Drizzle entities export.\n */\n public generateEntitiesJs(\n entry: string,\n provider: string,\n models: string[] = [],\n ): string {\n return `\nimport \"${entry}\";\nimport { DrizzleKitProvider, Repository } from \"alepha/orm\";\n\nconst alepha = globalThis.__alepha;\nconst kit = alepha.inject(DrizzleKitProvider);\nconst provider = alepha.services(Repository).find((it) => it.provider.name === \"${provider}\").provider;\nconst models = kit.getModels(provider);\n\n${models.map((it: string) => `export const ${it} = models[\"${it}\"];`).join(\"\\n\")}\n\n`.trim();\n }\n\n // ===========================================\n // Environment\n // ===========================================\n\n /**\n * Load environment variables from a .env file.\n */\n public async loadEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<void> {\n await this.envUtils.loadEnv(root, files);\n }\n\n // ===========================================\n // Helpers\n // ===========================================\n\n public async exists(root: string, path: string): Promise<boolean> {\n return this.fs.exists(this.fs.join(root, path));\n }\n\n protected async checkFileExists(\n root: string,\n name: string,\n ): Promise<string | undefined> {\n const configPath = this.fs.join(root, name);\n if (await this.fs.exists(configPath)) {\n return configPath;\n }\n }\n}\n","import { readFileSync } from \"node:fs\";\n\nconst packageJson = JSON.parse(\n readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"),\n);\n\nexport const version = packageJson.version;\n","import { $inject, Alepha } from \"alepha\";\nimport type { RunnerMethod } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { version } from \"../version.ts\";\n\n/**\n * Utility service for package manager operations.\n *\n * Handles detection, installation, and cleanup for:\n * - Yarn\n * - npm\n * - pnpm\n * - Bun\n */\nexport class PackageManagerUtils {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly alepha = $inject(Alepha);\n\n /**\n * Detect the package manager used in the project.\n */\n public async getPackageManager(\n root: string,\n flags?: { yarn?: boolean; pnpm?: boolean; npm?: boolean; bun?: boolean },\n ): Promise<\"yarn\" | \"pnpm\" | \"npm\" | \"bun\"> {\n if (flags?.yarn) return \"yarn\";\n if (flags?.pnpm) return \"pnpm\";\n if (flags?.npm) return \"npm\";\n if (flags?.bun) return \"bun\";\n if (this.alepha.isBun()) return \"bun\";\n if (await this.fs.exists(this.fs.join(root, \"bun.lock\"))) return \"bun\";\n if (await this.fs.exists(this.fs.join(root, \"yarn.lock\"))) return \"yarn\";\n if (await this.fs.exists(this.fs.join(root, \"pnpm-lock.yaml\")))\n return \"pnpm\";\n return \"npm\";\n }\n\n /**\n * Get the install command for a package.\n */\n public async getInstallCommand(\n root: string,\n packageName: string,\n dev = true,\n ): Promise<string> {\n const pm = await this.getPackageManager(root);\n let cmd: string;\n\n switch (pm) {\n case \"yarn\":\n cmd = `yarn add ${dev ? \"-D\" : \"\"} ${packageName}`;\n break;\n case \"pnpm\":\n cmd = `pnpm add ${dev ? \"-D\" : \"\"} ${packageName}`;\n break;\n case \"bun\":\n cmd = `bun add ${dev ? \"-d\" : \"\"} ${packageName}`;\n break;\n default:\n cmd = `npm install ${dev ? \"--save-dev\" : \"\"} ${packageName}`;\n }\n\n return cmd.replace(/\\s+/g, \" \").trim();\n }\n\n /**\n * Check if a dependency is installed in the project.\n */\n public async hasDependency(\n root: string,\n packageName: string,\n ): Promise<boolean> {\n try {\n const pkg = await this.readPackageJson(root);\n return !!(\n pkg.dependencies?.[packageName] || pkg.devDependencies?.[packageName]\n );\n } catch {\n return false;\n }\n }\n\n /**\n * Check if Expo is present in the project.\n */\n public async hasExpo(root: string): Promise<boolean> {\n return this.hasDependency(root, \"expo\");\n }\n\n /**\n * Install a dependency if it's missing from the project.\n */\n public async ensureDependency(\n root: string,\n packageName: string,\n options: {\n dev?: boolean;\n run?: RunnerMethod;\n exec?: (\n cmd: string,\n opts?: { global?: boolean; root?: string },\n ) => Promise<void>;\n } = {},\n ): Promise<void> {\n const { dev = true } = options;\n\n if (await this.hasDependency(root, packageName)) {\n this.log.debug(`Dependency '${packageName}' is already installed`);\n return;\n }\n\n const cmd = await this.getInstallCommand(root, packageName, dev);\n\n if (options.run) {\n await options.run(cmd, { alias: `installing ${packageName}`, root });\n } else if (options.exec) {\n this.log.debug(`Installing ${packageName}`);\n await options.exec(cmd, { global: true, root });\n }\n }\n\n // ===========================================\n // Package Manager Setup & Cleanup\n // ===========================================\n\n public async ensureYarn(root: string): Promise<void> {\n const yarnrcPath = this.fs.join(root, \".yarnrc.yml\");\n if (!(await this.fs.exists(yarnrcPath))) {\n await this.fs.writeFile(yarnrcPath, \"nodeLinker: node-modules\");\n }\n await this.removeAllPmFilesExcept(root, \"yarn\");\n }\n\n public async ensureBun(root: string): Promise<void> {\n await this.removeAllPmFilesExcept(root, \"bun\");\n }\n\n public async ensurePnpm(root: string): Promise<void> {\n await this.removeAllPmFilesExcept(root, \"pnpm\");\n }\n\n public async ensureNpm(root: string): Promise<void> {\n await this.removeAllPmFilesExcept(root, \"npm\");\n }\n\n public async removeAllPmFilesExcept(\n root: string,\n except: string,\n ): Promise<void> {\n if (except !== \"yarn\") await this.removeYarn(root);\n if (except !== \"pnpm\") await this.removePnpm(root);\n if (except !== \"npm\") await this.removeNpm(root);\n if (except !== \"bun\") await this.removeBun(root);\n }\n\n public async removeYarn(root: string): Promise<void> {\n await this.removeFiles(root, [\".yarn\", \".yarnrc.yml\", \"yarn.lock\"]);\n await this.editPackageJson(root, (pkg) => {\n delete pkg.packageManager;\n return pkg;\n });\n }\n\n public async removePnpm(root: string): Promise<void> {\n await this.removeFiles(root, [\"pnpm-lock.yaml\", \"pnpm-workspace.yaml\"]);\n await this.editPackageJson(root, (pkg) => {\n delete pkg.packageManager;\n return pkg;\n });\n }\n\n public async removeNpm(root: string): Promise<void> {\n await this.removeFiles(root, [\"package-lock.json\"]);\n }\n\n public async removeBun(root: string): Promise<void> {\n await this.removeFiles(root, [\"bun.lockb\", \"bun.lock\"]);\n }\n\n // ===========================================\n // Package.json utilities\n // ===========================================\n\n public async readPackageJson(root: string): Promise<Record<string, any>> {\n const content = await this.fs\n .createFile({ path: this.fs.join(root, \"package.json\") })\n .text();\n return JSON.parse(content);\n }\n\n public async writePackageJson(\n root: string,\n content: Record<string, any>,\n ): Promise<void> {\n await this.fs.writeFile(\n this.fs.join(root, \"package.json\"),\n JSON.stringify(content, null, 2),\n );\n }\n\n public async editPackageJson(\n root: string,\n editFn: (pkg: Record<string, any>) => Record<string, any>,\n ): Promise<void> {\n try {\n const pkg = await this.readPackageJson(root);\n const updated = editFn(pkg);\n await this.writePackageJson(root, updated);\n } catch {\n // package.json doesn't exist, skip\n }\n }\n\n public async ensurePackageJson(\n root: string,\n modes: DependencyModes,\n ): Promise<Record<string, any>> {\n const packageJsonPath = this.fs.join(root, \"package.json\");\n\n if (!(await this.fs.exists(packageJsonPath))) {\n const content = this.generatePackageJsonContent(modes);\n await this.writePackageJson(root, content);\n return content;\n }\n\n const packageJson = await this.readPackageJson(root);\n const newContent = this.generatePackageJsonContent(modes);\n\n packageJson.type = \"module\";\n packageJson.dependencies ??= {};\n packageJson.devDependencies ??= {};\n packageJson.scripts ??= {};\n\n Object.assign(packageJson.dependencies, newContent.dependencies);\n Object.assign(packageJson.devDependencies, newContent.devDependencies);\n Object.assign(packageJson.scripts, newContent.scripts);\n\n await this.writePackageJson(root, packageJson);\n return packageJson;\n }\n\n public generatePackageJsonContent(modes: DependencyModes): {\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n scripts: Record<string, string>;\n type: \"module\";\n } {\n const dependencies: Record<string, string> = {\n alepha: `^${version}`,\n };\n\n const devDependencies: Record<string, string> = {};\n\n const scripts: Record<string, string> = {\n dev: \"alepha dev\",\n build: \"alepha build\",\n lint: \"alepha lint\",\n typecheck: \"alepha typecheck\",\n verify: \"alepha verify\",\n };\n\n if (modes.admin) {\n dependencies[\"@alepha/ui\"] = `^${version}`;\n modes.web = true;\n }\n\n if (modes.web) {\n dependencies[\"@alepha/react\"] = `^${version}`;\n dependencies.react = \"^19.2.0\";\n dependencies[\"react-dom\"] = \"^19.2.0\";\n devDependencies[\"@types/react\"] = \"^19.2.0\";\n }\n\n return {\n type: \"module\",\n dependencies,\n devDependencies,\n scripts,\n };\n }\n\n // ===========================================\n // Helper methods\n // ===========================================\n\n protected async removeFiles(root: string, files: string[]): Promise<void> {\n await Promise.all(\n files.map((file) =>\n this.fs.rm(this.fs.join(root, file), { force: true, recursive: true }),\n ),\n );\n }\n}\n\nexport interface DependencyModes {\n web?: boolean;\n admin?: boolean;\n expo?: boolean;\n}\n","export const apiHelloControllerTs = () => `\nimport { t } from \"alepha\";\nimport { $action } from \"alepha/server\";\n\nexport class HelloController {\n hello = $action({\n path: \"/hello\",\n schema: {\n response: t.object({\n message: t.string(),\n }),\n },\n handler: () => ({\n message: \"Hello, Alepha!\",\n }),\n });\n}\n`.trim();\n","export interface ApiIndexTsOptions {\n appName?: string;\n}\n\nexport const apiIndexTs = (options: ApiIndexTsOptions = {}) => {\n const { appName = \"app\" } = options;\n return `\nimport { $module } from \"alepha\";\nimport { HelloController } from \"./controllers/HelloController.ts\";\n\nexport const ApiModule = $module({\n name: \"${appName}.api\",\n services: [HelloController],\n});\n`.trim();\n};\n","export const biomeJson = `\n{\n \"$schema\": \"https://biomejs.dev/schemas/latest/schema.json\",\n \"vcs\": {\n \"enabled\": true,\n \"clientKind\": \"git\"\n },\n \"files\": {\n \"ignoreUnknown\": true,\n \"includes\": [\"**\", \"!node_modules\", \"!dist\"]\n },\n \"formatter\": {\n \"enabled\": true,\n \"useEditorconfig\": true\n },\n \"linter\": {\n \"enabled\": true,\n \"rules\": {\n \"recommended\": true\n },\n \"domains\": {\n \"react\": \"recommended\"\n }\n },\n \"assist\": {\n \"actions\": {\n \"source\": {\n \"organizeImports\": \"on\"\n }\n }\n }\n}\n`.trim();\n","export interface ClaudeMdOptions {\n react?: boolean;\n ui?: boolean;\n projectName?: string;\n}\n\nexport const claudeMd = (options: ClaudeMdOptions = {}) => {\n const { react = false, projectName = \"my-app\" } = options;\n\n const reactSection = react\n ? `\n## React & Frontend\n\n### Pages with \\`$page\\`\n\\`\\`\\`tsx\nimport { $page } from \"@alepha/react/router\";\nimport { $client } from \"alepha/server/links\";\nimport type { UserController } from \"./UserController.ts\";\n\nclass AppRouter {\n api = $client<UserController>();\n\n users = $page({\n path: \"/users\",\n loader: async () => ({ users: await this.api.listUsers() }),\n component: ({ users }) => (\n <ul>{users.map(u => <li key={u.id}>{u.email}</li>)}</ul>\n ),\n });\n\n userDetail = $page({\n path: \"/users/:id\",\n schema: { params: t.object({ id: t.uuid() }) },\n loader: async ({ params }) => ({ user: await this.api.getUser({ params }) }),\n lazy: () => import(\"./UserDetail.tsx\"), // Code splitting\n });\n}\n\\`\\`\\`\n\n### React Hooks\n\\`\\`\\`typescript\nimport { useAlepha, useClient, useStore, useAction, useInject } from \"@alepha/react\";\nimport { useRouter, useActive } from \"@alepha/react/router\";\nimport { useForm } from \"@alepha/react/form\";\n\\`\\`\\`\n\n- \\`useClient<Controller>()\\` - Type-safe API calls\n- \\`useStore(atom)\\` - Global state (returns \\`[value, setValue]\\`)\n- \\`useAction({ handler })\\` - Async operations with loading/error state\n- \\`useRouter<AppRouter>()\\` - Type-safe navigation\n- \\`useForm({ schema, handler })\\` - Type-safe forms with validation\n`\n : \"\";\n\n const projectStructure = react\n ? `\n\\`\\`\\`\n${projectName}/\n├── src/\n│ ├── api/ # Backend\n│ │ ├── controllers/ # API controllers with $action\n│ │ ├── services/ # Business logic\n│ │ ├── entities/ # Database entities with $entity\n│ │ ├── providers/ # External service wrappers\n│ │ └── index.ts # API module definition with $module\n│ ├── web/ # Frontend (React only)\n│ │ ├── components/ # React components\n│ │ ├── atoms/ # State atoms with $atom\n│ │ ├── AppRouter.ts # Routes with $page\n│ │ └── index.ts # Web module definition with $module\n│ ├── main.server.ts # Server entry\n│ └── main.browser.ts # Browser entry (React only)\n├── index.html # (React only)\n├── package.json\n└── tsconfig.json\n\\`\\`\\`\n`\n : `\n\\`\\`\\`\n${projectName}/\n├── src/\n│ ├── api/ # Backend\n│ │ ├── controllers/ # API controllers with $action\n│ │ ├── services/ # Business logic\n│ │ ├── entities/ # Database entities with $entity\n│ │ ├── providers/ # External service wrappers\n│ │ └── index.ts # API module definition with $module\n│ └── main.server.ts # Server entry (always use main.server.ts)\n├── package.json\n└── tsconfig.json\n\\`\\`\\`\n`;\n\n return `# CLAUDE.md\n\nThis file provides guidance to Claude Code when working with this Alepha project.\n\n## Overview\n\nThis is an **Alepha** project - a convention-driven TypeScript framework for type-safe full-stack applications.\n\n**Key Concepts:**\n- **Primitives**: Features defined with \\`$\\`-prefixed functions (\\`$action\\`, \\`$entity\\`, \\`$page\\`)\n- **Class-Based**: Services are classes, primitives are class properties\n- **Zero-Config**: Code structure IS the configuration\n- **End-to-End Types**: Types flow from database → API → ${react ? \"React\" : \"client\"}\n\n## Rules\n\n- Use TypeScript strict mode\n- Use Biome for formatting (\\`alepha lint\\`)\n- Use Vitest for testing\n- One file = one class\n- Primitives are class properties (except \\`$entity\\`, \\`$atom\\`)\n- No decorators, no Express/Fastify patterns\n- No manual instantiation - use dependency injection\n- Use \\`protected\\` instead of \\`private\\` for class members\n- Import with file extensions: \\`import { User } from \"./User.ts\"\\`\n- Use \\`t\\` from Alepha for schemas (not Zod)\n\n## Project Structure\n${projectStructure}\n## Core Primitives\n\n### API with \\`$action\\`\n\\`\\`\\`typescript\nimport { t } from \"alepha\";\nimport { $action } from \"alepha/server\";\n\nclass UserController {\n getUser = $action({\n path: \"/users/:id\", // → GET /api/users/:id\n schema: {\n params: t.object({ id: t.uuid() }),\n response: t.object({ id: t.uuid(), email: t.email() }),\n },\n handler: async ({ params }) => this.userRepo.findById(params.id),\n });\n\n createUser = $action({\n // POST inferred from body schema\n schema: {\n body: t.object({ email: t.email() }),\n response: userEntity.schema,\n },\n handler: async ({ body }) => this.userRepo.create(body),\n });\n}\n\\`\\`\\`\n\n### Database with \\`$entity\\` and \\`$repository\\`\n\\`\\`\\`typescript\nimport { $entity, $repository, db } from \"alepha/orm\";\n\n// Entity defined at module level (for drizzle-kit compatibility)\nexport const userEntity = $entity({\n name: \"users\",\n schema: t.object({\n id: db.primaryKey(),\n email: t.email(),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n }),\n indexes: [{ column: \"email\", unique: true }],\n});\n\nclass UserService {\n repo = $repository(userEntity);\n\n async findById(id: string) {\n return this.repo.findById(id);\n }\n}\n\\`\\`\\`\n\n### Dependency Injection\n\\`\\`\\`typescript\nimport { $inject } from \"alepha\";\n\nclass OrderService {\n userService = $inject(UserService); // Within same module\n\n async createOrder(userId: string) {\n const user = await this.userService.findById(userId);\n // ...\n }\n}\n\n// Cross-module: use $client instead of $inject\nclass AppRouter {\n api = $client<OrderController>(); // Type-safe HTTP client\n}\n\\`\\`\\`\n\n### Modules with \\`$module\\`\n\\`\\`\\`typescript\n// src/api/index.ts - Groups all API services\nimport { $module } from \"alepha\";\n\nexport const ApiModule = $module({\n name: \"app.api\",\n services: [\n UserController,\n OrderController,\n UserService,\n ],\n});\n\n// src/web/index.ts - Groups all web services (React only)\nexport const WebModule = $module({\n name: \"app.web\",\n services: [AppRouter, Toaster],\n register(alepha) {\n // Optional: configure additional services\n alepha.with(SomeLibrary);\n },\n});\n\\`\\`\\`\n\n### Environment Variables\n\\`\\`\\`typescript\nimport { $env, t } from \"alepha\";\n\nclass AppConfig {\n env = $env(t.object({\n DATABASE_URL: t.string(),\n API_KEY: t.optional(t.string()),\n }));\n}\n\\`\\`\\`\n${reactSection}\n## Quick Reference\n\n| Primitive | Import | Purpose |\n|-----------|--------|---------|\n| \\`$inject\\` | \\`alepha\\` | Dependency injection |\n| \\`$env\\` | \\`alepha\\` | Environment variables |\n| \\`$hook\\` | \\`alepha\\` | Lifecycle hooks |\n| \\`$logger\\` | \\`alepha/logger\\` | Structured logging |\n| \\`$action\\` | \\`alepha/server\\` | REST API endpoints |\n| \\`$route\\` | \\`alepha/server\\` | Low-level HTTP routes |\n| \\`$entity\\` | \\`alepha/orm\\` | Database tables |\n| \\`$repository\\` | \\`alepha/orm\\` | Type-safe data access |\n| \\`$queue\\` | \\`alepha/queue\\` | Background jobs |\n| \\`$scheduler\\` | \\`alepha/scheduler\\` | Cron tasks |\n| \\`$cache\\` | \\`alepha/cache\\` | Cached computations |\n| \\`$bucket\\` | \\`alepha/bucket\\` | File storage |\n| \\`$issuer\\` | \\`alepha/security\\` | JWT tokens |\n| \\`$command\\` | \\`alepha/command\\` | CLI commands |${react ? `\n| \\`$page\\` | \\`@alepha/react/router\\` | React pages with SSR |\n| \\`$atom\\` | \\`alepha\\` | Global state |` : \"\"}\n\n## Testing\n\n\\`\\`\\`typescript\nimport { describe, it, expect } from \"vitest\";\nimport { Alepha } from \"alepha\";\n\ndescribe(\"UserService\", () => {\n it(\"should create user\", async () => {\n const alepha = Alepha.create().with(UserService);\n const service = alepha.inject(UserService);\n\n const user = await service.create({ email: \"test@example.com\" });\n expect(user.email).toBe(\"test@example.com\");\n });\n\n it(\"should mock dependencies\", async () => {\n const alepha = Alepha.create()\n .with(OrderService)\n .with({ provide: PaymentGateway, use: MockPaymentGateway });\n\n const service = alepha.inject(OrderService);\n // PaymentGateway is now mocked\n });\n});\n\\`\\`\\`\n\n## Common Mistakes\n\n1. **DON'T use decorators** - Use primitives (\\`$action\\`, not \\`@Get()\\`)\n2. **DON'T use Zod** - Use TypeBox via \\`t\\` from Alepha\n3. **DON'T use Express patterns** - No \\`app.get()\\`, \\`router.use()\\`\n4. **DON'T inject across modules** - Use \\`$client\\` for cross-module calls\n5. **DON'T use async constructors** - Use \\`$hook({ on: \"start\" })\\`\n6. **DON'T instantiate manually** - Let DI container manage instances\n\n## After Code Changes\n\nAlways run:\n\\`\\`\\`bash\nalepha lint # Format and lint\nalepha typecheck # Type checking\nalepha test # Run tests (if applicable)\nalepha build # Build the project\n\\`\\`\\`\n\n## Documentation\n\n- Full docs: https://alepha.dev/llms.txt\n- Detailed docs: https://alepha.dev/llms-full.txt\n`.trim();\n};\n","export const dummySpecTs = () => `\nimport { test, expect } from \"vitest\";\n\ntest(\"dummy test\", () => {\n expect(1 + 1).toBe(2);\n});\n`.trim();\n","export const editorconfig = `\n# https://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nindent_style = space\nindent_size = 2\n`.trim();\n","export const indexHtml = (\n browserEntry: string,\n) => `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>App</title>\n</head>\n<body>\n<div id=\"root\"></div>\n<script type=\"module\" src=\"${browserEntry}\"></script>\n</body>\n</html>\n`.trim();\n","export const mainBrowserTs = () => `\nimport { Alepha, run } from \"alepha\";\nimport { WebModule } from \"./web/index.ts\";\n\nconst alepha = Alepha.create();\n\nalepha.with(WebModule);\n\nrun(alepha);\n`.trim();\n","export interface MainServerTsOptions {\n react?: boolean;\n}\n\nexport const mainServerTs = (options: MainServerTsOptions = {}) => {\n const { react = false } = options;\n\n const webImport = react\n ? `import { WebModule } from \"./web/index.ts\";\\n`\n : \"\";\n\n const webWith = react ? `alepha.with(WebModule);\\n` : \"\";\n\n return `\nimport { Alepha, run } from \"alepha\";\nimport { ApiModule } from \"./api/index.ts\";\n${webImport}\nconst alepha = Alepha.create();\n\nalepha.with(ApiModule);\n${webWith}\nrun(alepha);\n`.trim();\n};\n","export const tsconfigJson = `\n{\n \"extends\": \"alepha/tsconfig.base\"\n}\n`.trim();\n","export const webAppRouterTs = () => `\nimport { $page } from \"@alepha/react/router\";\nimport { $client } from \"alepha/server/links\";\nimport type { HelloController } from \"../api/controllers/HelloController.ts\";\n\nexport class AppRouter {\n api = $client<HelloController>();\n\n home = $page({\n path: \"/\",\n lazy: () => import(\"./components/Hello.tsx\"),\n loader: () => this.api.hello(),\n });\n}\n`.trim();\n","export const webHelloComponentTsx = () => `\ninterface Props {\n message: string;\n}\n\nconst Hello = (props: Props) => {\n return (\n <div>\n <h1>{props.message}</h1>\n <p>Edit this component in src/web/components/Hello.tsx</p>\n </div>\n );\n};\n\nexport default Hello;\n`.trim();\n","export interface WebIndexTsOptions {\n appName?: string;\n}\n\nexport const webIndexTs = (options: WebIndexTsOptions = {}) => {\n const { appName = \"app\" } = options;\n return `\nimport { $module } from \"alepha\";\nimport { AppRouter } from \"./AppRouter.ts\";\n\nexport const WebModule = $module({\n name: \"${appName}.web\",\n services: [AppRouter],\n});\n`.trim();\n};\n","import { basename, dirname } from \"node:path\";\nimport { $inject } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { apiHelloControllerTs } from \"../assets/apiHelloControllerTs.ts\";\nimport { apiIndexTs } from \"../assets/apiIndexTs.ts\";\nimport { biomeJson } from \"../assets/biomeJson.ts\";\nimport { type ClaudeMdOptions, claudeMd } from \"../assets/claudeMd.ts\";\nimport { dummySpecTs } from \"../assets/dummySpecTs.ts\";\nimport { editorconfig } from \"../assets/editorconfig.ts\";\nimport { indexHtml } from \"../assets/indexHtml.ts\";\nimport { mainBrowserTs } from \"../assets/mainBrowserTs.ts\";\nimport { mainServerTs } from \"../assets/mainServerTs.ts\";\nimport { tsconfigJson } from \"../assets/tsconfigJson.ts\";\nimport { webAppRouterTs } from \"../assets/webAppRouterTs.ts\";\nimport { webHelloComponentTsx } from \"../assets/webHelloComponentTsx.ts\";\nimport { webIndexTs } from \"../assets/webIndexTs.ts\";\nimport {\n type DependencyModes,\n PackageManagerUtils,\n} from \"./PackageManagerUtils.ts\";\n\n/**\n * Service for scaffolding new Alepha projects.\n *\n * Handles creation of:\n * - Project structure (src/api, src/web)\n * - Configuration files (tsconfig, biome, editorconfig)\n * - Entry points (main.server.ts, main.browser.ts)\n * - Example code (HelloController, Hello component)\n */\nexport class ProjectScaffolder {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly pm = $inject(PackageManagerUtils);\n\n /**\n * Get the app name from the directory name.\n *\n * Converts the directory name to a valid module name:\n * - Converts to lowercase\n * - Replaces spaces, dashes, underscores with nothing\n * - Falls back to \"app\" if empty\n */\n public getAppName(root: string): string {\n const dirName = basename(root);\n const appName = dirName.toLowerCase().replace(/[\\s\\-_]/g, \"\");\n return appName || \"app\";\n }\n\n /**\n * Ensure all configuration files exist.\n */\n public async ensureConfig(\n root: string,\n opts: {\n packageJson?: boolean | DependencyModes;\n tsconfigJson?: boolean;\n indexHtml?: boolean;\n biomeJson?: boolean;\n editorconfig?: boolean;\n claudeMd?: boolean | ClaudeMdOptions;\n },\n ): Promise<void> {\n const tasks: Promise<void>[] = [];\n\n if (opts.packageJson) {\n tasks.push(\n this.pm\n .ensurePackageJson(\n root,\n typeof opts.packageJson === \"boolean\" ? {} : opts.packageJson,\n )\n .then(() => {}),\n );\n }\n if (opts.tsconfigJson) {\n tasks.push(this.ensureTsConfig(root));\n }\n if (opts.indexHtml) {\n tasks.push(this.ensureReactProject(root));\n }\n if (opts.biomeJson) {\n tasks.push(this.ensureBiomeConfig(root));\n }\n if (opts.editorconfig) {\n tasks.push(this.ensureEditorConfig(root));\n }\n if (opts.claudeMd) {\n tasks.push(\n this.ensureClaudeMd(\n root,\n typeof opts.claudeMd === \"boolean\" ? {} : opts.claudeMd,\n ),\n );\n }\n\n await Promise.all(tasks);\n }\n\n // ===========================================\n // Config Files\n // ===========================================\n\n public async ensureTsConfig(root: string): Promise<void> {\n // Check if tsconfig.json exists in current or parent directories\n if (await this.existsInParents(root, \"tsconfig.json\")) {\n return;\n }\n await this.fs.writeFile(this.fs.join(root, \"tsconfig.json\"), tsconfigJson);\n }\n\n public async ensureBiomeConfig(root: string): Promise<void> {\n await this.ensureFileIfNotExists(root, \"biome.json\", biomeJson);\n }\n\n public async ensureEditorConfig(root: string): Promise<void> {\n await this.ensureFileIfNotExists(root, \".editorconfig\", editorconfig);\n }\n\n public async ensureClaudeMd(\n root: string,\n options: ClaudeMdOptions = {},\n ): Promise<void> {\n const path = this.fs.join(root, \"CLAUDE.md\");\n if (!(await this.fs.exists(path))) {\n await this.fs.writeFile(path, claudeMd(options));\n }\n }\n\n // ===========================================\n // API Project Structure\n // ===========================================\n\n /**\n * Ensure src/main.server.ts exists with full API structure.\n *\n * Creates:\n * - src/main.server.ts (entry point)\n * - src/api/index.ts (API module)\n * - src/api/controllers/HelloController.ts (example controller)\n */\n public async ensureApiProject(root: string): Promise<void> {\n const srcDir = this.fs.join(root, \"src\");\n\n // Don't overwrite existing content\n if (await this.fs.exists(srcDir)) {\n const files = await this.fs.ls(srcDir);\n if (files.length > 0) return;\n }\n\n const appName = this.getAppName(root);\n\n // Create directories\n await this.fs.mkdir(this.fs.join(root, \"src/api/controllers\"), {\n recursive: true,\n });\n\n // Create files\n await this.fs.writeFile(\n this.fs.join(srcDir, \"main.server.ts\"),\n mainServerTs(),\n );\n await this.fs.writeFile(\n this.fs.join(srcDir, \"api/index.ts\"),\n apiIndexTs({ appName }),\n );\n await this.fs.writeFile(\n this.fs.join(srcDir, \"api/controllers/HelloController.ts\"),\n apiHelloControllerTs(),\n );\n }\n\n // ===========================================\n // React Project Structure\n // ===========================================\n\n /**\n * Ensure full React project structure exists.\n *\n * Creates:\n * - index.html\n * - src/main.server.ts, src/main.browser.ts\n * - src/api/index.ts, src/api/controllers/HelloController.ts\n * - src/web/index.ts, src/web/AppRouter.ts, src/web/components/Hello.tsx\n */\n public async ensureReactProject(root: string): Promise<void> {\n if (await this.fs.exists(this.fs.join(root, \"index.html\"))) {\n return;\n }\n\n const appName = this.getAppName(root);\n\n // Create directories\n await this.fs.mkdir(this.fs.join(root, \"src/api/controllers\"), {\n recursive: true,\n });\n await this.fs.mkdir(this.fs.join(root, \"src/web/components\"), {\n recursive: true,\n });\n\n // index.html\n await this.fs.writeFile(\n this.fs.join(root, \"index.html\"),\n indexHtml(\"src/main.browser.ts\"),\n );\n\n // API structure\n await this.ensureFileIfNotExists(\n root,\n \"src/api/index.ts\",\n apiIndexTs({ appName }),\n );\n await this.ensureFileIfNotExists(\n root,\n \"src/api/controllers/HelloController.ts\",\n apiHelloControllerTs(),\n );\n await this.ensureFileIfNotExists(\n root,\n \"src/main.server.ts\",\n mainServerTs({ react: true }),\n );\n\n // Web structure\n await this.ensureFileIfNotExists(\n root,\n \"src/web/index.ts\",\n webIndexTs({ appName }),\n );\n await this.ensureFileIfNotExists(\n root,\n \"src/web/AppRouter.ts\",\n webAppRouterTs(),\n );\n await this.ensureFileIfNotExists(\n root,\n \"src/web/components/Hello.tsx\",\n webHelloComponentTsx(),\n );\n await this.ensureFileIfNotExists(\n root,\n \"src/main.browser.ts\",\n mainBrowserTs(),\n );\n }\n\n // ===========================================\n // Test Directory\n // ===========================================\n\n /**\n * Ensure test directory exists with a dummy test file.\n */\n public async ensureTestDir(root: string): Promise<void> {\n const testDir = this.fs.join(root, \"test\");\n const dummyPath = this.fs.join(testDir, \"dummy.spec.ts\");\n\n if (!(await this.fs.exists(testDir))) {\n await this.fs.mkdir(testDir, { recursive: true });\n await this.fs.writeFile(dummyPath, dummySpecTs());\n return;\n }\n\n const files = await this.fs.ls(testDir);\n if (files.length === 0) {\n await this.fs.writeFile(dummyPath, dummySpecTs());\n }\n }\n\n // ===========================================\n // Helpers\n // ===========================================\n\n protected async ensureFileIfNotExists(\n root: string,\n relativePath: string,\n content: string,\n ): Promise<void> {\n const fullPath = this.fs.join(root, relativePath);\n if (!(await this.fs.exists(fullPath))) {\n await this.fs.writeFile(fullPath, content);\n }\n }\n\n /**\n * Check if a file exists in the given directory or any parent directory.\n */\n protected async existsInParents(\n root: string,\n filename: string,\n ): Promise<boolean> {\n let current = root;\n while (true) {\n if (await this.fs.exists(this.fs.join(current, filename))) {\n return true;\n }\n const parent = dirname(current);\n if (parent === current) {\n // Reached filesystem root\n return false;\n }\n current = parent;\n }\n }\n}\n","import { $inject, $use, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport {\n boot,\n buildClient,\n buildServer,\n copyAssets,\n generateCloudflare,\n generateDocker,\n generateSitemap,\n generateVercel,\n prerenderPages,\n} from \"alepha/vite\";\nimport { buildOptions } from \"../atoms/buildOptions.ts\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class BuildCommand {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n protected readonly options = $use(buildOptions);\n\n public readonly build = $command({\n name: \"build\",\n mode: \"production\",\n description: \"Build the project for production\",\n args: t.optional(\n t.text({ title: \"path\", description: \"Filepath to build\" }),\n ),\n flags: t.object({\n stats: t.optional(\n t.boolean({\n description: \"Generate build stats report\",\n }),\n ),\n vercel: t.optional(\n t.boolean({\n description: \"Generate Vercel deployment configuration\",\n }),\n ),\n cloudflare: t.optional(\n t.boolean({\n description: \"Generate Cloudflare Workers configuration\",\n }),\n ),\n docker: t.optional(\n t.boolean({\n description: \"Generate Docker configuration\",\n }),\n ),\n sitemap: t.optional(\n t.text({\n description: \"Generate sitemap.xml with base URL\",\n }),\n ),\n bun: t.optional(\n t.boolean({\n description: \"Prioritize .bun.ts entry files for Bun runtime\",\n }),\n ),\n }),\n handler: async ({ flags, args, run, root }) => {\n // Tell viteAlephaBuild plugin to skip - CLI handles all tasks\n process.env.ALEPHA_BUILD_MODE = \"cli\";\n process.env.NODE_ENV = \"production\";\n\n if (await this.pm.hasExpo(root)) {\n // will come soon\n return;\n }\n\n await this.scaffolder.ensureConfig(root, {\n tsconfigJson: true,\n });\n\n const entry = await boot.getServerEntry(root, args);\n this.log.trace(\"Entry file found\", { entry });\n\n const distDir = \"dist\";\n const clientDir = \"public\";\n\n await this.pm.ensureDependency(root, \"vite\", {\n run,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n await run.rm(\"dist\", { alias: \"clean dist\" });\n\n const options = this.options;\n await this.utils.loadEnv(root, [\".env\", \".env.production\"]);\n\n const stats = flags.stats ?? options.stats ?? false;\n const hasClient = await this.fs.exists(this.fs.join(root, \"index.html\"));\n\n // Build client (precompress always enabled)\n if (hasClient) {\n await run({\n name: \"vite build client\",\n handler: () =>\n buildClient({\n silent: true,\n dist: `${distDir}/${clientDir}`,\n stats,\n precompress: true,\n }),\n });\n }\n\n // Build server\n await run({\n name: \"vite build server\",\n handler: async () => {\n const clientIndexPath = `${distDir}/${clientDir}/index.html`;\n const clientBuilt = await this.fs.exists(clientIndexPath);\n\n const conditions: string[] = [];\n\n // bun:\n // - alepha\n // - react-dom\n\n if (flags.bun) {\n conditions.push(\"bun\");\n }\n\n // workerd:\n // - react-dom\n // - postgres\n\n // TODO: investigate if we have more conditions like 'edge' to add here\n if (options.cloudflare) {\n conditions.push(\"workerd\");\n }\n\n await buildServer({\n silent: true,\n entry,\n distDir,\n clientDir: clientBuilt ? clientDir : undefined,\n stats,\n conditions,\n });\n\n // Server will handle index.html if both client & server are built\n if (clientBuilt) {\n await this.fs.rm(clientIndexPath);\n }\n },\n });\n\n // Copy assets\n await copyAssets({\n root,\n entry: `${distDir}/index.js`,\n distDir,\n run,\n });\n\n if (hasClient) {\n // Generate sitemap\n const sitemapHostname = flags.sitemap ?? options.sitemap?.hostname;\n if (sitemapHostname) {\n await run({\n name: \"add sitemap\",\n handler: async () => {\n await this.fs.writeFile(\n `${distDir}/${clientDir}/sitemap.xml`,\n await generateSitemap({\n entry: `${distDir}/index.js`,\n baseUrl: sitemapHostname,\n }),\n );\n },\n });\n }\n\n // Pre-render static pages (always enabled)\n await run({\n name: \"pre-render pages\",\n handler: async () => {\n await prerenderPages({\n dist: `${distDir}/${clientDir}`,\n entry: `${distDir}/index.js`,\n compress: true,\n });\n },\n });\n }\n\n // Generate deployment configurations\n if (flags.vercel || options.vercel) {\n await run({\n name: \"add Vercel config\",\n handler: () =>\n generateVercel({\n distDir,\n clientDir,\n config: options.vercel,\n }),\n });\n }\n\n if (flags.cloudflare || options.cloudflare) {\n await run({\n name: \"add Cloudflare config\",\n handler: () =>\n generateCloudflare({\n distDir,\n config: options.cloudflare?.config,\n }),\n });\n }\n\n if (flags.docker || options.docker) {\n await run({\n name: \"add Docker config\",\n handler: () =>\n generateDocker({\n distDir,\n ...options.docker,\n }),\n });\n }\n },\n });\n}\n","import { $command } from \"alepha/command\";\n\nexport class CleanCommand {\n /**\n * Clean the project, removing the \"dist\" directory\n */\n public readonly clean = $command({\n name: \"clean\",\n description: \"Clean the project\",\n handler: async ({ run }) => {\n await run.rm(\"./dist\");\n },\n });\n}\n","import { $inject, AlephaError, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport type {\n DatabaseProvider,\n DrizzleKitProvider,\n RepositoryProvider,\n} from \"alepha/orm\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nconst drizzleCommandFlags = t.object({\n provider: t.optional(\n t.text({\n description:\n \"Database provider name to target (e.g., 'postgres', 'sqlite')\",\n }),\n ),\n mode: t.optional(\n t.text({\n description:\n \"Environment variable file(s) to load (e.g., 'production' to load .env.production) https://vite.dev/guide/env-and-mode\",\n }),\n ),\n});\n\nexport class DbCommand {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly utils = $inject(AlephaCliUtils);\n\n /**\n * Check if database migrations are up to date.\n */\n protected readonly check = $command({\n name: \"check-migrations\",\n description: \"Check if database migration files are up to date\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ args, root }) => {\n const rootDir = root;\n this.log.debug(`Using project root: ${rootDir}`);\n\n const { alepha } = await this.utils.loadAlephaFromServerEntryFile(\n rootDir,\n args,\n );\n\n const repositoryProvider =\n alepha.inject<RepositoryProvider>(\"RepositoryProvider\");\n const drizzleKitProvider =\n alepha.inject<DrizzleKitProvider>(\"DrizzleKitProvider\");\n const accepted = new Set<string>([]);\n\n for (const primitive of repositoryProvider.getRepositories()) {\n const provider = primitive.provider;\n const providerName = provider.name;\n if (accepted.has(providerName)) {\n continue;\n }\n\n accepted.add(providerName);\n\n const migrationDir = this.fs.join(rootDir, \"migrations\", providerName);\n\n const journalBuffer = await this.fs\n .readFile(`${migrationDir}/meta/_journal.json`)\n .catch(() => null);\n\n if (!journalBuffer) {\n this.log.info(\"No migration journal found.\");\n return;\n }\n\n const journal = JSON.parse(journalBuffer.toString(\"utf-8\"));\n const lastMigration = journal.entries[journal.entries.length - 1];\n const snapshotBuffer = await this.fs.readFile(\n `${migrationDir}/meta/${String(lastMigration.idx).padStart(4, \"0\")}_snapshot.json`,\n );\n const lastSnapshot = JSON.parse(snapshotBuffer.toString(\"utf-8\"));\n\n const models = drizzleKitProvider.getModels(provider);\n const kit = drizzleKitProvider.importDrizzleKit();\n const now = kit.generateDrizzleJson(models, lastSnapshot.id);\n\n const migrationStatements = await new Promise<Array<any>>((resolve) => {\n (async () => {\n const timer = setTimeout(() => {\n resolve([{ message: \"Migration generation timed out.\" }]);\n }, 5000);\n const statements = await kit.generateMigration(lastSnapshot, now);\n clearTimeout(timer);\n resolve(statements);\n })();\n });\n\n if (migrationStatements.length === 0) {\n this.log.info(\"No changes detected.\");\n return;\n }\n\n this.log.info(\"\");\n this.log.info(\"Detected migration statements:\");\n this.log.info(\"\");\n for (const stmt of migrationStatements) {\n this.log.info(stmt);\n }\n this.log.info(\"\");\n\n this.log.info(\n `At least ${migrationStatements.length} change(s) detected.`,\n );\n this.log.info(\n \"Please, run 'alepha db:generate' to update the migration files.\",\n );\n this.log.info(\"\");\n\n throw new AlephaError(\"Database migrations are not up to date.\");\n }\n },\n });\n\n /**\n * Generate database migration files\n */\n protected readonly generate = $command({\n name: \"generate\",\n description: \"Generate migration files based on current database schema\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: t.extend(drizzleCommandFlags, {\n custom: t.optional(\n t.text({\n description:\n \"Custom migration name for drizzle-kit generate --custom\",\n }),\n ),\n }),\n handler: async ({ args, flags, root }) => {\n const commandFlags = flags.custom\n ? `--custom=${flags.custom}`\n : undefined;\n\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"generate\",\n commandFlags,\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Generate '${providerName}' migrations (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Push database schema changes directly to the database\n */\n protected readonly push = $command({\n name: \"push\",\n description: \"Push database schema changes directly to the database\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"push\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Push '${providerName}' schema (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Apply pending database migrations\n */\n protected readonly migrate = $command({\n name: \"migrate\",\n description: \"Apply pending database migrations\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"migrate\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Migrate '${providerName}' database (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Launch Drizzle Studio database browser\n */\n protected readonly studio = $command({\n name: \"studio\",\n description: \"Launch Drizzle Studio database browser\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"studio\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Launch Studio for '${providerName}' (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Parent command for database operations.\n */\n public readonly db = $command({\n name: \"db\",\n description: \"Database management commands\",\n children: [this.check, this.generate, this.push, this.migrate, this.studio],\n handler: async ({ help }) => {\n help();\n },\n });\n\n /**\n * Run a drizzle-kit command for all database providers in an Alepha instance.\n */\n public async runDrizzleKitCommand(options: {\n root: string;\n args?: string;\n command: string;\n commandFlags?: string;\n provider?: string;\n logMessage: (providerName: string, dialect: string) => string;\n env?: string;\n }): Promise<void> {\n const rootDir = options.root;\n\n const envFiles = [\".env\"];\n if (options.env) {\n envFiles.push(`.env.${options.env}`);\n }\n\n await this.utils.loadEnv(rootDir, envFiles);\n\n this.log.debug(`Using project root: ${rootDir}`);\n\n const { alepha, entry } = await this.utils.loadAlephaFromServerEntryFile(\n rootDir,\n options.args,\n );\n\n const drizzleKitProvider =\n alepha.inject<DrizzleKitProvider>(\"DrizzleKitProvider\");\n const repositoryProvider =\n alepha.inject<RepositoryProvider>(\"RepositoryProvider\");\n const accepted = new Set<string>([]);\n\n for (const primitive of repositoryProvider.getRepositories()) {\n const provider = primitive.provider;\n const providerName = provider.name;\n const dialect = provider.dialect;\n\n if (providerName === \"\") {\n continue;\n }\n\n if (accepted.has(providerName)) {\n continue;\n }\n accepted.add(providerName);\n\n // Skip if provider filter is set and doesn't match\n if (options.provider && options.provider !== providerName) {\n this.log.debug(\n `Skipping provider '${providerName}' (filter: ${options.provider})`,\n );\n continue;\n }\n\n this.log.info(\"\");\n this.log.info(options.logMessage(providerName, dialect));\n\n const drizzleConfigJsPath = await this.prepareDrizzleConfig({\n kit: drizzleKitProvider,\n provider,\n providerName,\n providerUrl: provider.url,\n providerDriver: provider.driver,\n dialect,\n entry,\n rootDir,\n });\n\n const flags = options.commandFlags ? ` ${options.commandFlags}` : \"\";\n await this.utils.exec(\n `drizzle-kit ${options.command} --config=${drizzleConfigJsPath}${flags}`,\n {\n env: {\n NODE_OPTIONS: \"--import tsx\",\n },\n },\n );\n }\n }\n\n /**\n * Prepare Drizzle configuration files for a database provider.\n */\n public async prepareDrizzleConfig(options: {\n kit: any;\n provider: DatabaseProvider;\n providerName: string;\n providerUrl: string;\n providerDriver: string;\n dialect: string;\n entry: string;\n rootDir: string;\n }): Promise<string> {\n const models = Object.keys(options.kit.getModels(options.provider));\n const entitiesJs = this.utils.generateEntitiesJs(\n options.entry,\n options.providerName,\n models,\n );\n\n const entitiesJsPath = await this.utils.writeConfigFile(\n \"entities.js\",\n entitiesJs,\n options.rootDir,\n );\n\n const config: Record<string, any> = {\n schema: entitiesJsPath,\n out: `./migrations/${options.providerName}`,\n dialect: options.dialect,\n dbCredentials: {\n url: options.providerUrl,\n },\n };\n\n if (options.provider.schema) {\n config.schemaFilter = options.provider.schema;\n }\n\n if (options.providerDriver === \"d1\") {\n config.driver = \"d1-http\";\n }\n\n if (options.providerDriver === \"pglite\") {\n config.driver = \"pglite\";\n }\n\n if (options.dialect === \"sqlite\") {\n if (options.providerDriver === \"d1\") {\n const token = process.env.CLOUDFLARE_API_TOKEN;\n if (!token) {\n throw new AlephaError(\n \"CLOUDFLARE_API_TOKEN environment variable is not set. https://orm.drizzle.team/docs/guides/d1-http-with-drizzle-kit\",\n );\n }\n\n const accountId = process.env.CLOUDFLARE_ACCOUNT_ID;\n if (!accountId) {\n throw new AlephaError(\n \"CLOUDFLARE_ACCOUNT_ID environment variable is not set. https://orm.drizzle.team/docs/guides/d1-http-with-drizzle-kit\",\n );\n }\n\n const url = options.providerUrl;\n if (!url.startsWith(\"cloudflare-d1://\")) {\n throw new AlephaError(\n \"D1 provider URL must start with 'cloudflare-d1://'.\",\n );\n }\n\n const [, databaseId] = url\n .replace(\"cloudflare-d1://\", \"\")\n .replace(\"cloudflare-d1:\", \"\")\n .split(\":\");\n\n if (!databaseId) {\n throw new AlephaError(\n \"Database ID is missing in the D1 provider URL. Cloudflare D1 URL format: cloudflare-d1://<database_name>:<database_id>\",\n );\n }\n\n config.dbCredentials = {\n accountId,\n databaseId,\n token,\n };\n } else {\n let url = options.providerUrl;\n url = url.replace(\"sqlite://\", \"\").replace(\"file://\", \"\");\n url = this.fs.join(options.rootDir, url);\n\n config.dbCredentials = {\n url,\n };\n }\n }\n\n const drizzleConfigJs = `export default ${JSON.stringify(config, null, 2)}`;\n\n return await this.utils.writeConfigFile(\n \"drizzle.config.js\",\n drizzleConfigJs,\n options.rootDir,\n );\n }\n}\n","import { $inject, AlephaError, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\n\nexport class DeployCommand {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n\n /**\n * Deploy the project to a hosting platform (e.g., Vercel, Cloudflare, Surge)\n *\n * Deploy command can be overridden by creating a alepha.config.ts in the project root:\n *\n * ```ts\n * import { defineConfig } from \"alepha/cli\";\n *\n * export default defineConfig({\n * commands: {\n * deploy: {\n * handler: async ({ root, mode, flags }) => {\n * // Custom deployment logic here\n * },\n * },\n * },\n * });\n * ```\n */\n public readonly deploy = $command({\n name: \"deploy\",\n description:\n \"Deploy the project to a hosting platform (e.g., Vercel, Cloudflare, Surge)\",\n mode: true,\n flags: t.object({\n build: t.boolean({\n description: \"Build the project before deployment\",\n default: false,\n }),\n migrate: t.boolean({\n description:\n \"Run database migrations before deployment (if applicable)\",\n default: false,\n }),\n }),\n env: t.object({\n VERCEL_TOKEN: t.optional(\n t.text({\n description: \"Vercel API token (e.g., xxxxxxxxxxxxxxxxxxxx)\",\n }),\n ),\n VERCEL_ORG_ID: t.optional(\n t.text({\n description: \"Vercel organization ID (e.g., team_abc123...)\",\n }),\n ),\n VERCEL_PROJECT_ID: t.optional(\n t.text({ description: \"Vercel project ID (e.g., prj_abc123...)\" }),\n ),\n CLOUDFLARE_API_TOKEN: t.optional(\n t.text({\n description: \"Cloudflare API token (e.g., xxxx-xxxx-xxxx-xxxx)\",\n }),\n ),\n CLOUDFLARE_ACCOUNT_ID: t.optional(\n t.text({\n description: \"Cloudflare account ID (e.g., abc123def456...)\",\n }),\n ),\n }),\n handler: async ({ root, mode, flags }) => {\n if (flags.build) {\n await this.utils.exec(\"alepha build\");\n }\n\n // Vercel deployment\n if (await this.utils.exists(root, \"dist/vercel.json\")) {\n if (flags.migrate) {\n this.log.debug(\"Running database migrations before deployment...\");\n await this.utils.exec(`alepha db migrate --mode=${mode}`);\n }\n await this.pm.ensureDependency(root, \"vercel\", {\n dev: true,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n const command =\n `vercel . --cwd=dist ${mode === \"production\" ? \"--prod\" : \"\"}`.trim();\n this.log.debug(`Deploying to Vercel with command: ${command}`);\n await this.utils.exec(command);\n return;\n }\n\n // Cloudflare deployment\n if (await this.utils.exists(root, \"dist/wrangler.jsonc\")) {\n if (flags.migrate) {\n this.log.debug(\"Running database migrations before deployment...\");\n await this.utils.exec(`alepha db migrate --mode=${mode}`);\n }\n await this.pm.ensureDependency(root, \"wrangler\", {\n dev: true,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n const command =\n `wrangler deploy ${mode === \"production\" ? \"\" : \"--env preview\"} --config=dist/wrangler.jsonc`.trim();\n this.log.info(`Deploying to Cloudflare with command: ${command}`);\n await this.utils.exec(command);\n return;\n }\n\n // Surge deployment\n if (await this.utils.exists(root, \"dist/public/404.html\")) {\n await this.pm.ensureDependency(root, \"surge\", {\n dev: true,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n const distPath = this.fs.join(root, \"dist/public\");\n this.log.debug(`Deploying to Surge from directory: ${distPath}`);\n await this.utils.exec(`surge ${distPath}`);\n return;\n }\n\n throw new AlephaError(\n \"No deployment configuration found in the dist folder.\",\n );\n },\n });\n}\n","import { $inject, Alepha, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { boot, devServer } from \"alepha/vite\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class DevCommand {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n protected readonly alepha = $inject(Alepha);\n\n /**\n * Will run the project in watch mode.\n *\n * - If an index.html file is found in the project root, it will run Vite in dev mode.\n * - Otherwise, it will look for a server entry file and run it with tsx in watch mode.\n */\n public readonly dev = $command({\n name: \"dev\",\n description: \"Run the project in development mode\",\n args: t.optional(t.text({ title: \"path\", description: \"Filepath to run\" })),\n handler: async ({ args, root }) => {\n const expo = await this.pm.hasExpo(root);\n\n await this.scaffolder.ensureConfig(root, {\n tsconfigJson: true,\n });\n\n if (expo) {\n await this.utils.exec(\"expo start\");\n return;\n }\n\n const entry = await boot.getServerEntry(root, args);\n this.log.trace(\"Entry file found\", { entry });\n\n const isFullstack = await this.isFullstackProject(root);\n\n if (!isFullstack) {\n const exe = (await this.isBunProject(root)) ? \"bun\" : \"tsx\";\n let cmd = `${exe} --watch`;\n if (await this.utils.exists(root, \".env\")) {\n cmd += \" --env-file=./.env\";\n }\n cmd += ` ${entry}`;\n await this.utils.exec(cmd, {\n global: exe === \"bun\",\n });\n return;\n }\n\n // Ensure vite is installed before running\n await this.pm.ensureDependency(root, \"vite\", {\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n\n await devServer();\n },\n });\n\n protected async isBunProject(root: string): Promise<boolean> {\n if (this.alepha.isBun()) {\n return true;\n }\n return this.fs.exists(this.fs.join(root, \"bun.lock\"));\n }\n\n protected async isFullstackProject(root: string): Promise<boolean> {\n return this.fs.exists(this.fs.join(root, \"index.html\"));\n }\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class FormatCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n\n public readonly format = $command({\n name: \"format\",\n description: \"Format the codebase using Biome\",\n handler: async ({ root }) => {\n await this.scaffolder.ensureConfig(root, { biomeJson: true });\n await this.pm.ensureDependency(root, \"@biomejs/biome\", {\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n await this.utils.exec(\"biome format --fix\");\n },\n });\n}\n","import { $atom, type Static, t } from \"alepha\";\n\n/**\n * Default scopes to ignore in changelog generation.\n * Commits with these scopes won't appear in release notes.\n */\nexport const DEFAULT_IGNORE = [\n \"project\",\n \"release\",\n \"starter\",\n \"example\",\n \"chore\",\n \"ci\",\n \"build\",\n \"test\",\n \"style\",\n];\n\n/**\n * Changelog configuration atom.\n *\n * Configure in `alepha.config.ts`:\n * ```ts\n * import { changelogOptions } from \"alepha/cli\";\n *\n * alepha.set(changelogOptions, {\n * ignore: [\"project\", \"release\", \"chore\", \"docs\"],\n * });\n * ```\n */\nexport const changelogOptions = $atom({\n name: \"alepha.changelog\",\n schema: t.object({\n /**\n * Scopes to ignore (e.g., \"project\", \"release\", \"chore\").\n * Commits like `feat(chore): ...` will be excluded from changelog.\n */\n ignore: t.optional(t.array(t.string())),\n }),\n default: {\n ignore: DEFAULT_IGNORE,\n },\n});\n\nexport type ChangelogOptions = Static<typeof changelogOptions.schema>;\n","import { $logger } from \"alepha/logger\";\nimport {\n type ChangelogOptions,\n DEFAULT_IGNORE,\n} from \"../atoms/changelogOptions.ts\";\nimport type { Commit } from \"../commands/gen/changelog.ts\";\n\n/**\n * Service for parsing git commit messages into structured format.\n *\n * Only parses **conventional commits with a scope**:\n * - `feat(scope): description` → feature\n * - `fix(scope): description` → bug fix\n * - `feat(scope)!: description` → breaking change\n *\n * Commits without scope are ignored, allowing developers to commit\n * work-in-progress changes without polluting release notes:\n * - `cli: work in progress` → ignored (no type)\n * - `fix: quick patch` → ignored (no scope)\n * - `feat(cli): add command` → included\n */\nexport class GitMessageParser {\n protected readonly log = $logger();\n\n /**\n * Parse a git commit line into a structured Commit object.\n *\n * **Format:** `type(scope): description` or `type(scope)!: description`\n *\n * **Supported types:** feat, fix, docs, refactor, perf, revert\n *\n * **Breaking changes:** Use `!` before `:` (e.g., `feat(api)!: remove endpoint`)\n *\n * @returns Commit object or null if not matching/ignored\n */\n parseCommit(line: string, config: ChangelogOptions): Commit | null {\n // Extract hash and message from git log --oneline format\n const match = line.match(/^([a-f0-9]+)\\s+(.+)$/);\n if (!match) return null;\n\n const [, hash, message] = match;\n const ignore = config.ignore ?? DEFAULT_IGNORE;\n\n // Conventional commit with REQUIRED scope: type(scope): description\n // The `!` before `:` marks a breaking change\n const conventionalMatch = message.match(\n /^(feat|fix|docs|refactor|perf|revert)\\(([^)]+)\\)(!)?:\\s*(.+)$/i,\n );\n\n if (!conventionalMatch) {\n // No match - commit doesn't follow required format\n return null;\n }\n\n const [, type, scope, breakingMark, description] = conventionalMatch;\n\n // Check if scope should be ignored\n const baseScope = scope.split(\"/\")[0];\n if (ignore.includes(baseScope) || ignore.includes(scope)) {\n return null;\n }\n\n // Breaking change detection:\n // 1. Explicit `!` marker: feat(api)!: change\n // 2. Word \"breaking\" in description: feat(api): breaking change to auth\n const breaking =\n breakingMark === \"!\" || description.toLowerCase().includes(\"breaking\");\n\n return {\n hash: hash.substring(0, 8),\n type: type.toLowerCase(),\n scope,\n description: description.trim(),\n breaking,\n };\n }\n}\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { $inject, $use, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { changelogOptions } from \"../../atoms/changelogOptions.ts\";\nimport { GitMessageParser } from \"../../services/GitMessageParser.ts\";\n\nexport {\n type ChangelogOptions,\n changelogOptions,\n DEFAULT_IGNORE,\n} from \"../../atoms/changelogOptions.ts\";\nexport { GitMessageParser } from \"../../services/GitMessageParser.ts\";\n\nconst execAsync = promisify(exec);\n\n// =============================================================================\n// GIT PROVIDER\n// =============================================================================\n\n/**\n * Git provider for executing git commands.\n * Can be substituted in tests with a mock implementation.\n */\nexport class GitProvider {\n async exec(cmd: string, cwd: string): Promise<string> {\n const { stdout } = await execAsync(`git ${cmd}`, { cwd });\n return stdout;\n }\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface Commit {\n hash: string;\n type: string;\n scope: string | null;\n description: string;\n breaking: boolean;\n}\n\ninterface ChangelogEntry {\n features: Commit[];\n fixes: Commit[];\n}\n\n// =============================================================================\n// CHANGELOG COMMAND\n// =============================================================================\n\n/**\n * Changelog command for generating release notes from git commits.\n *\n * Usage:\n * - `alepha gen changelog` - Show unreleased changes since latest tag to HEAD\n * - `alepha gen changelog --from=1.0.0` - Show changes from version to HEAD\n * - `alepha gen changelog --from=1.0.0 --to=1.1.0` - Show changes between two refs\n * - `alepha gen changelog | tee -a CHANGELOG.md` - Append to file\n */\nexport class ChangelogCommand {\n protected readonly log = $logger();\n protected readonly git = $inject(GitProvider);\n protected readonly parser = $inject(GitMessageParser);\n protected readonly config = $use(changelogOptions);\n\n // ---------------------------------------------------------------------------\n // FORMATTING\n // ---------------------------------------------------------------------------\n\n /**\n * Format a single commit line.\n * Example: `- **cli**: add new command (\\`abc1234\\`)`\n * Breaking changes are flagged: `- **cli**: add new command [BREAKING] (\\`abc1234\\`)`\n */\n protected formatCommit(commit: Commit): string {\n const breaking = commit.breaking ? \" [BREAKING]\" : \"\";\n return `- **${commit.scope}**: ${commit.description}${breaking} (\\`${commit.hash}\\`)`;\n }\n\n /**\n * Format the changelog entry with sections.\n */\n protected formatEntry(entry: ChangelogEntry): string {\n const sections: string[] = [];\n\n if (entry.features.length > 0) {\n sections.push(\"### Features\\n\");\n for (const commit of entry.features) {\n sections.push(this.formatCommit(commit));\n }\n sections.push(\"\");\n }\n\n if (entry.fixes.length > 0) {\n sections.push(\"### Bug Fixes\\n\");\n for (const commit of entry.fixes) {\n sections.push(this.formatCommit(commit));\n }\n sections.push(\"\");\n }\n\n return sections.join(\"\\n\");\n }\n\n // ---------------------------------------------------------------------------\n // PARSING\n // ---------------------------------------------------------------------------\n\n /**\n * Parse git log output into a changelog entry.\n */\n protected parseCommits(commitsOutput: string): ChangelogEntry {\n const entry: ChangelogEntry = {\n features: [],\n fixes: [],\n };\n\n for (const line of commitsOutput.trim().split(\"\\n\")) {\n if (!line.trim()) continue;\n\n const commit = this.parser.parseCommit(line, this.config);\n if (!commit) {\n this.log.trace(\"Skipping commit\", { line });\n continue;\n }\n\n this.log.trace(\"Parsed commit\", { commit });\n\n // Categorize commit (breaking flag is preserved on the commit itself)\n if (commit.type === \"feat\") {\n entry.features.push(commit);\n } else if (commit.type === \"fix\") {\n entry.fixes.push(commit);\n }\n }\n\n return entry;\n }\n\n /**\n * Check if entry has any public commits.\n */\n protected hasChanges(entry: ChangelogEntry): boolean {\n return entry.features.length > 0 || entry.fixes.length > 0;\n }\n\n /**\n * Get the latest version tag.\n */\n protected async getLatestTag(\n git: (cmd: string) => Promise<string>,\n ): Promise<string | null> {\n const tagsOutput = await git(\"tag --sort=-version:refname\");\n const tags = tagsOutput\n .trim()\n .split(\"\\n\")\n .filter((tag) => tag.match(/^\\d+\\.\\d+\\.\\d+$/));\n\n return tags[0] || null;\n }\n\n // ---------------------------------------------------------------------------\n // COMMAND\n // ---------------------------------------------------------------------------\n\n public readonly command = $command({\n name: \"changelog\",\n description:\n \"Generate changelog from conventional commits (outputs to stdout)\",\n flags: t.object({\n /**\n * Show changes from this ref (tag, commit, branch).\n * Defaults to the latest version tag.\n * Example: --from=1.0.0\n */\n from: t.optional(\n t.string({\n aliases: [\"f\"],\n description: \"Starting ref (default: latest tag)\",\n }),\n ),\n /**\n * Show changes up to this ref (tag, commit, branch).\n * Defaults to HEAD.\n * Example: --to=main\n */\n to: t.optional(\n t.string({\n aliases: [\"t\"],\n description: \"Ending ref (default: HEAD)\",\n }),\n ),\n }),\n handler: async ({ flags, root }) => {\n const git = (cmd: string) => this.git.exec(cmd, root);\n\n // Determine the starting point\n let fromRef: string;\n\n if (flags.from) {\n // User specified a ref\n fromRef = flags.from;\n this.log.debug(\"Using specified from ref\", { from: fromRef });\n } else {\n // Use latest tag\n const latestTag = await this.getLatestTag(git);\n if (!latestTag) {\n process.stdout.write(\"No version tags found in repository\\n\");\n return;\n }\n fromRef = latestTag;\n this.log.debug(\"Using latest tag\", { from: fromRef });\n }\n\n // Determine the ending point\n const toRef = flags.to || \"HEAD\";\n this.log.debug(\"Using to ref\", { to: toRef });\n\n // Get commits in range\n const commitsOutput = await git(`log ${fromRef}..${toRef} --oneline`);\n\n if (!commitsOutput.trim()) {\n process.stdout.write(`No changes in range ${fromRef}..${toRef}\\n`);\n return;\n }\n\n // Parse and format\n const entry = this.parseCommits(commitsOutput);\n\n if (!this.hasChanges(entry)) {\n process.stdout.write(\n `No public changes in range ${fromRef}..${toRef}\\n`,\n );\n return;\n }\n\n // Output the formatted changelog (no header - caller adds it if needed)\n process.stdout.write(this.formatEntry(entry));\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../../services/AlephaCliUtils.ts\";\n\nexport class GenEnvCommand {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly fs = $inject(FileSystemProvider);\n\n public readonly command = $command({\n name: \"env\",\n description: \"Extract environment variables from server entry file\",\n flags: t.object({\n out: t.optional(\n t.text({\n aliases: [\"o\"],\n description: \"Output file path (e.g., .env)\",\n }),\n ),\n }),\n handler: async ({ root, flags }) => {\n const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);\n\n try {\n const { env } = alepha.dump();\n\n let dotEnvFile = \"\";\n for (const [key, value] of Object.entries(env)) {\n if (value.description) {\n dotEnvFile += `# ${value.description.split(\"\\n\").join(\"\\n# \")}\\n`;\n }\n if (value.required && !value.default) {\n dotEnvFile += `# (required)\\n`;\n }\n if (value.enum) {\n dotEnvFile += `# Possible values: ${value.enum.join(\", \")}\\n`;\n }\n dotEnvFile += `${key}=${value.default || \"\"}\\n\\n`;\n }\n\n if (flags.out) {\n await this.fs.writeFile(this.fs.join(root, flags.out), dotEnvFile);\n } else {\n this.log.info(dotEnvFile);\n }\n } catch (err) {\n this.log.error(\"Failed to extract environment variables\", err);\n }\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { ServerSwaggerProvider } from \"alepha/server/swagger\";\nimport { AlephaCliUtils } from \"../../services/AlephaCliUtils.ts\";\n\nexport class OpenApiCommand {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly fs = $inject(FileSystemProvider);\n\n public readonly command = $command({\n name: \"openapi\",\n description: \"Generate OpenAPI specification from actions\",\n flags: t.object({\n out: t.optional(\n t.text({\n aliases: [\"o\"],\n description: \"Output file path\",\n }),\n ),\n }),\n handler: async ({ root, flags }) => {\n const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);\n\n try {\n const openapiProvider = alepha.inject(\n ServerSwaggerProvider,\n ) as ServerSwaggerProvider;\n\n await alepha.events.emit(\"configure\", alepha);\n\n let json: any = openapiProvider.json;\n\n if (!json) {\n json = openapiProvider.generateSwaggerDoc({\n info: {\n title: \"API Documentation\",\n version: \"1.0.0\",\n },\n });\n }\n\n if (!json) {\n this.log.error(\"No actions found to generate OpenAPI specification.\");\n return;\n }\n\n if (flags.out) {\n await this.fs.writeFile(\n this.fs.join(root, flags.out),\n JSON.stringify(json, null, 2),\n );\n } else {\n this.log.info(JSON.stringify(json, null, 2));\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes(\"Service not found\")) {\n this.log.error(\n \"Missing $swagger() primitive in your server configuration.\",\n );\n return;\n }\n\n this.log.error(`OpenAPI generation failed - ${message}`, err);\n }\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { ChangelogCommand } from \"./gen/changelog.ts\";\nimport { GenEnvCommand } from \"./gen/env.ts\";\nimport { OpenApiCommand } from \"./gen/openapi.ts\";\n\nexport class GenCommand {\n protected readonly changelog = $inject(ChangelogCommand);\n protected readonly openapi = $inject(OpenApiCommand);\n protected readonly genEnv = $inject(GenEnvCommand);\n\n public readonly gen = $command({\n name: \"gen\",\n description: \"Generate code, documentation, ...\",\n children: [\n this.changelog.command,\n this.openapi.command,\n this.genEnv.command,\n ],\n handler: async ({ help }) => {\n help();\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class InitCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n protected readonly fs = $inject(FileSystemProvider);\n\n /**\n * Ensure the project has the necessary Alepha configuration files.\n * Add the correct dependencies to package.json and install them.\n */\n public readonly init = $command({\n name: \"init\",\n description: \"Add missing Alepha configuration files to the project\",\n args: t.optional(\n t.text({\n title: \"path\",\n trim: true,\n lowercase: true,\n }),\n ),\n flags: t.object({\n agent: t.optional(\n t.boolean({\n aliases: [\"a\"],\n description: \"Add CLAUDE.md for Claude Code AI assistant\",\n }),\n ),\n // choose package manager\n yarn: t.optional(t.boolean({ description: \"Use Yarn package manager\" })),\n pnpm: t.optional(t.boolean({ description: \"Use pnpm package manager\" })),\n npm: t.optional(t.boolean({ description: \"Use npm package manager\" })),\n bun: t.optional(t.boolean({ description: \"Use Bun package manager\" })),\n // choose which dependencies to add\n web: t.optional(\n t.boolean({\n aliases: [\"r\"],\n description: \"Include Alepha React dependencies\",\n }),\n ),\n admin: t.optional(\n t.boolean({ description: \"Include Alepha UI dependencies\" }),\n ),\n test: t.optional(\n t.boolean({ description: \"Include Vitest and create test directory\" }),\n ),\n }),\n handler: async ({ run, flags, root, args }) => {\n if (flags.admin) {\n flags.web = true;\n }\n\n if (args) {\n root = this.fs.join(root, args);\n await this.fs.mkdir(root);\n }\n\n const isExpo = await this.pm.hasExpo(root);\n\n await run({\n name: \"ensuring configuration files\",\n handler: async () => {\n await this.scaffolder.ensureConfig(root, {\n tsconfigJson: true,\n packageJson: flags,\n biomeJson: true,\n editorconfig: true,\n indexHtml: !!flags.web && !isExpo,\n claudeMd: flags.agent\n ? { react: !!flags.web, ui: !!flags.admin }\n : false,\n });\n\n // Create API project structure if not React\n if (!flags.web) {\n await this.scaffolder.ensureApiProject(root);\n }\n },\n });\n\n // TODO: check if all alepha dependencies are same version\n\n const pmName = await this.pm.getPackageManager(root, flags);\n if (pmName === \"yarn\") {\n await this.pm.ensureYarn(root);\n await run(\"yarn set version stable\", { root });\n } else if (pmName === \"bun\") {\n await this.pm.ensureBun(root);\n } else if (pmName === \"pnpm\") {\n await this.pm.ensurePnpm(root);\n } else {\n await this.pm.ensureNpm(root);\n }\n\n await run(`${pmName} install`, {\n alias: `installing dependencies with ${pmName}`,\n root,\n });\n\n if (!isExpo) {\n await this.pm.ensureDependency(root, \"vite\", {\n run,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n }\n\n await this.pm.ensureDependency(root, \"@biomejs/biome\", {\n run,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n\n // Install vitest and create test directory if --test flag is set\n if (flags.test) {\n await this.scaffolder.ensureTestDir(root);\n await run(\n `${pmName} ${pmName === \"yarn\" ? \"add\" : \"install\"} -D vitest`,\n {\n alias: \"setup testing with Vitest\",\n },\n );\n }\n\n await run(`${pmName} run lint`, {\n alias: \"running linter\",\n root,\n });\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class LintCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n\n public readonly lint = $command({\n name: \"lint\",\n description: \"Run linter across the codebase using Biome\",\n handler: async ({ root }) => {\n await this.scaffolder.ensureConfig(root, { biomeJson: true });\n await this.pm.ensureDependency(root, \"@biomejs/biome\", {\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n await this.utils.exec(\"biome check --formatter-enabled=false --fix\");\n },\n });\n}\n","import { $inject, Alepha, t } from \"alepha\";\nimport { $command, CliProvider } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { version } from \"../version.ts\";\n\nexport class RootCommand {\n protected readonly log = $logger();\n protected readonly cli = $inject(CliProvider);\n protected readonly alepha = $inject(Alepha);\n protected readonly color = $inject(ConsoleColorProvider);\n\n /**\n * Called when no command is provided\n */\n public readonly root = $command({\n root: true,\n flags: t.object({\n version: t.optional(\n t.boolean({\n description: \"Show Alepha CLI version\",\n aliases: [\"v\"],\n }),\n ),\n }),\n handler: async ({ flags }) => {\n if (flags.version) {\n this.log.info(this.color.set(\"WHITE_BOLD\", `Alepha v${version}`));\n if (this.alepha.isBun()) {\n this.log.info(this.color.set(\"GREY_DARK\", `└─ Bun v${Bun.version}`));\n } else {\n this.log.info(\n this.color.set(\"GREY_DARK\", `└─ Node ${process.version}`),\n );\n }\n return;\n }\n\n this.cli.printHelp();\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class TestCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n\n public readonly test = $command({\n name: \"test\",\n description: \"Run tests using Vitest\",\n flags: t.object({\n config: t.optional(\n t.string({\n description: \"Path to Vitest config file\",\n alias: \"c\",\n }),\n ),\n }),\n env: t.object({\n VITEST_ARGS: t.optional(\n t.string({\n default: \"\",\n description:\n \"Additional arguments to pass to Vitest. E.g., --coverage\",\n }),\n ),\n }),\n handler: async ({ root, flags, env }) => {\n await this.scaffolder.ensureConfig(root, {\n tsconfigJson: true,\n });\n\n // Ensure vitest is installed before running\n await this.pm.ensureDependency(root, \"vitest\", {\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n\n const config = flags.config ? `--config=${flags.config}` : \"\";\n\n await this.utils.exec(`vitest run ${config} ${env.VITEST_ARGS}`);\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\n\nexport class TypecheckCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly log = $logger();\n\n /**\n * Run TypeScript type checking across the codebase with no emit.\n */\n public readonly typecheck = $command({\n name: \"typecheck\",\n aliases: [\"tc\"],\n description: \"Check TypeScript types across the codebase\",\n handler: async ({ root }) => {\n this.log.info(\"Starting TypeScript type checking...\");\n await this.pm.ensureDependency(root, \"typescript\", {\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n await this.utils.exec(\"tsc --noEmit\");\n this.log.info(\"TypeScript type checking completed successfully.\");\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\n\nexport class VerifyCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n\n /**\n * Run a series of verification commands to ensure code quality and correctness.\n *\n * This command runs the following checks in order:\n * - Clean the project\n * - Format the code\n * - Lint the code\n * - Run tests (if Vitest is a dev dependency)\n * - Check database migrations (if a migrations directory exists)\n * - Type check the code\n * - Build the project\n * - Clean the project again\n */\n public readonly verify = $command({\n name: \"verify\",\n description: \"Verify the Alepha project\",\n handler: async ({ root, run }) => {\n await run(\"alepha clean\");\n await run(\"alepha format\");\n await run(\"alepha lint\");\n\n await run(\"alepha typecheck\");\n\n const pkg = await this.pm.readPackageJson(root);\n if (pkg.devDependencies?.vitest) {\n await run(\"alepha test\");\n }\n\n if (await this.utils.exists(root, \"migrations\")) {\n await run(\"alepha db check-migrations\");\n }\n\n const isExpo = await this.pm.hasExpo(root);\n if (!isExpo) {\n await run(\"alepha build\");\n }\n await run(\"alepha clean\");\n },\n });\n}\n","import { $hook, $inject, $module, Alepha } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { BuildCommand } from \"../commands/build.ts\";\nimport { CleanCommand } from \"../commands/clean.ts\";\nimport { DbCommand } from \"../commands/db.ts\";\nimport { DeployCommand } from \"../commands/deploy.ts\";\nimport { DevCommand } from \"../commands/dev.ts\";\nimport { FormatCommand } from \"../commands/format.ts\";\nimport { GitProvider } from \"../commands/gen/changelog.ts\";\nimport { GenCommand } from \"../commands/gen.ts\";\nimport { InitCommand } from \"../commands/init.ts\";\nimport { LintCommand } from \"../commands/lint.ts\";\nimport { RootCommand } from \"../commands/root.ts\";\nimport { TestCommand } from \"../commands/test.ts\";\nimport { TypecheckCommand } from \"../commands/typecheck.ts\";\nimport { VerifyCommand } from \"../commands/verify.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Register `tsx` when running in Node.js, ignore for Bun.\n *\n * It's required to have a full TypeScript support. (mostly .tsx files)\n */\n\nif (typeof Bun === \"undefined\") {\n const { register } = await import(\"tsx/esm/api\");\n register();\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Allow to extend Alepha CLI via `alepha.config.ts` file located in the project root.\n */\n\nclass AlephaCliExtension {\n protected readonly alepha = $inject(Alepha);\n protected readonly fs = $inject(FileSystemProvider);\n\n protected readonly onConfigure = $hook({\n on: \"configure\",\n handler: async () => {\n const root = process.cwd();\n const extensionPath = this.fs.join(root, \"alepha.config.ts\");\n const hasExtension = await this.fs.exists(extensionPath);\n if (!hasExtension) {\n return;\n }\n\n // import\n const { default: Extension } = await import(extensionPath);\n if (typeof Extension !== \"function\") {\n return;\n }\n\n this.alepha.inject(Extension, {\n args: [this.alepha],\n });\n },\n });\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaCli = $module({\n name: \"alepha.cli\",\n services: [\n AlephaCliExtension,\n // Commands (one per file)\n BuildCommand,\n CleanCommand,\n DbCommand,\n DeployCommand,\n DevCommand,\n FormatCommand,\n InitCommand,\n LintCommand,\n RootCommand,\n TestCommand,\n TypecheckCommand,\n VerifyCommand,\n GenCommand,\n // Support services\n GitProvider,\n ],\n});\n","import { access, readdir, readFile } from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport { join } from \"node:path\";\nimport { $inject, AlephaError } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport type { InlineConfig } from \"tsdown\";\n\ninterface Module {\n name: string;\n dependencies: string[];\n native?: boolean;\n browser?: boolean;\n bun?: boolean;\n node?: boolean;\n}\n\nexport class AlephaPackageBuilderCli {\n src = \"src\";\n dist = \"dist\";\n fs = $inject(FileSystemProvider);\n\n make = $command({\n root: true,\n handler: async ({ run, root }) => {\n const modules: Array<Module> = [];\n\n const pkgBuffer = await this.fs.readFile(\"package.json\");\n const pkgData = JSON.parse(pkgBuffer.toString(\"utf-8\"));\n const packageName = pkgData.name as string;\n\n await run(\"analyze modules\", async () => {\n modules.push(\n ...(await analyzeModules(this.fs.join(root, this.src), packageName)),\n );\n });\n\n pkgData.exports = {};\n\n for (const item of modules) {\n let m = `./${item.name.replace(\"core\", \"\")}`;\n if (m.endsWith(\"/\")) m = m.slice(0, -1);\n const path = m;\n\n pkgData.exports[path] = {};\n // order is important here for compatibility\n pkgData.exports[path].types = `./src/${item.name}/index.ts`;\n if (item.native) {\n pkgData.exports[path][\"react-native\"] =\n `./src/${item.name}/index.native.ts`;\n } else if (item.browser) {\n pkgData.exports[path][\"react-native\"] =\n `./src/${item.name}/index.browser.ts`;\n }\n\n if (item.browser) {\n pkgData.exports[path].browser = `./src/${item.name}/index.browser.ts`;\n }\n\n if (item.bun) {\n pkgData.exports[path].bun = `./src/${item.name}/index.bun.ts`;\n }\n\n pkgData.exports[path].import = `./src/${item.name}/index.ts`;\n pkgData.exports[path].default = `./src/${item.name}/index.ts`;\n }\n\n if (packageName === \"alepha\") {\n pkgData.exports[\"./tsconfig.base\"] = \"./tsconfig.base.json\";\n pkgData.exports[\"./package.json\"] = \"./package.json\";\n }\n\n if (packageName === \"@alepha/ui\") {\n pkgData.exports[\"./styles\"] = \"./src/core/styles.css\";\n pkgData.exports[\"./json/styles\"] = \"./src/json/styles.css\";\n }\n\n await this.fs.writeFile(\"package.json\", JSON.stringify(pkgData, null, 2));\n\n const tmpDir = this.fs.join(root, \"node_modules/.alepha\");\n await this.fs.mkdir(tmpDir, { recursive: true }).catch(() => {});\n\n await this.fs.writeFile(\n this.fs.join(tmpDir, \"module-dependencies.json\"),\n JSON.stringify(modules, null, 2),\n );\n\n const tsconfigBuffer = await this.fs.readFile(\n this.fs.join(root, \"../../tsconfig.json\"),\n );\n\n const external: string[] = Object.keys(\n JSON.parse(tsconfigBuffer.toString(\"utf-8\")).compilerOptions.paths,\n );\n\n external.push(\"bun\");\n external.push(\"bun:sqlite\");\n\n await run.rm(this.dist);\n\n const build = async (item: Module) => {\n const entries: InlineConfig[] = [];\n const src = this.fs.join(root, this.src, item.name);\n const dest = this.fs.join(root, this.dist, item.name);\n\n entries.push({\n entry: this.fs.join(src, \"index.ts\"),\n outDir: dest,\n format: [\"esm\"],\n sourcemap: true,\n fixedExtension: false,\n platform: \"node\", // TODO: node must be enabled only if index.node.ts exists\n external,\n dts: {\n sourcemap: true,\n },\n });\n\n if (item.native) {\n entries.push({\n entry: this.fs.join(src, \"index.native.ts\"),\n outDir: dest,\n platform: \"neutral\",\n sourcemap: true,\n dts: false,\n external,\n });\n }\n\n if (item.browser) {\n entries.push({\n entry: this.fs.join(src, \"index.browser.ts\"),\n outDir: dest,\n platform: \"browser\",\n sourcemap: true,\n dts: false,\n external,\n });\n }\n\n if (item.bun) {\n entries.push({\n entry: this.fs.join(src, \"index.bun.ts\"),\n outDir: dest,\n platform: \"node\",\n sourcemap: true,\n fixedExtension: false,\n dts: false,\n external,\n });\n }\n\n const config = this.fs.join(\n tmpDir,\n `tsdown-${item.name.replace(\"/\", \"-\")}.config.js`,\n );\n await this.fs.writeFile(\n config,\n `export default ${JSON.stringify(entries, null, 2)};`,\n );\n await run(`npx tsdown -c=${config}`);\n //await this.fs.rm(config);\n };\n\n const concurrency = Math.ceil(os.cpus().length / 2);\n const queue = modules.slice();\n const workers: Promise<void>[] = [];\n for (let i = 0; i < concurrency; i++) {\n const worker = (async () => {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n await build(item);\n } else {\n await new Promise((r) => setTimeout(r, 100));\n }\n }\n })();\n workers.push(worker);\n }\n await Promise.all(workers);\n },\n });\n}\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n async function scan(currentDir: string) {\n const entries = await readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n await scan(fullPath);\n } else if (entry.isFile() && /\\.(ts|tsx)$/.test(entry.name)) {\n files.push(fullPath);\n }\n }\n }\n\n await scan(dir);\n return files;\n}\n\nfunction removeComments(content: string): string {\n // Remove single-line comments\n let cleaned = content.replace(/\\/\\/.*$/gm, \"\");\n\n // Remove multi-line comments\n cleaned = cleaned.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n\n return cleaned;\n}\n\nfunction extractAlephaDependencies(\n content: string,\n packageName: string,\n moduleName: string,\n): string[] {\n const deps = new Set<string>();\n const cleanedContent = removeComments(content);\n\n // Match: from \"alepha/xxx\" or from 'alepha/xxx'\n const importRegex = new RegExp(\n `from \"${packageName}/([a-zA-Z0-9_/]+)\";`,\n \"g\",\n );\n\n const matches = cleanedContent.matchAll(importRegex);\n for (const match of matches) {\n deps.add(match[1]);\n }\n\n return Array.from(deps);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction detectCircularDependencies(modules: Module[]): void {\n const moduleMap = new Map(modules.map((m) => [m.name, m.dependencies]));\n\n function hasCycle(\n moduleName: string,\n visited: Set<string> = new Set(),\n path: string[] = [],\n ): string[] | null {\n if (visited.has(moduleName)) {\n // Found a cycle, return the path\n const cycleStart = path.indexOf(moduleName);\n return [...path.slice(cycleStart), moduleName];\n }\n\n const deps = moduleMap.get(moduleName);\n if (!deps) return null;\n\n visited.add(moduleName);\n path.push(moduleName);\n\n for (const dep of deps) {\n const cycle = hasCycle(dep, new Set(visited), [...path]);\n if (cycle) return cycle;\n }\n\n return null;\n }\n\n for (const module of modules) {\n const cycle = hasCycle(module.name);\n if (cycle) {\n throw new AlephaError(\n `Circular dependency detected: ${cycle.join(\" -> \")}`,\n );\n }\n }\n}\n\nexport async function analyzeModules(\n srcDir: string,\n packageName: string,\n): Promise<Module[]> {\n const modules: Module[] = [];\n\n async function scanDirectory(dir: string, prefix: string): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const moduleName = prefix ? `${prefix}/${entry.name}` : entry.name;\n const modulePath = join(dir, entry.name);\n\n // Check if this directory has an index.ts (is a module)\n const hasIndex = await fileExists(join(modulePath, \"index.ts\"));\n\n if (hasIndex) {\n // This is a module\n const dependencies = new Set<string>();\n\n // Check for browser/node/bun entry points\n const hasBrowser = await fileExists(\n join(modulePath, \"index.browser.ts\"),\n );\n const hasNative = await fileExists(\n join(modulePath, \"index.native.ts\"),\n );\n const hasBun = await fileExists(join(modulePath, \"index.bun.ts\"));\n const hasNode = await fileExists(join(modulePath, \"index.node.ts\"));\n\n // Get all .ts/.tsx files in this module\n const files = await getAllFiles(modulePath);\n\n for (const file of files) {\n const content = await readFile(file, \"utf-8\");\n const deps = extractAlephaDependencies(\n content,\n packageName,\n moduleName,\n );\n for (const dep of deps) {\n if (dep.endsWith(\".ts\")) {\n throw new Error(\n `Invalid dependency '${dep}' in module '${moduleName}'. Do not include file extensions in Alepha module imports.`,\n );\n }\n if (dep.includes(\"-\")) {\n throw new Error(\n `Invalid dependency '${dep}' in module '${moduleName}'. Use '/' instead of '-' in Alepha module imports.`,\n );\n }\n dependencies.add(dep);\n }\n }\n\n const module: Module = {\n name: moduleName,\n dependencies: Array.from(dependencies),\n };\n\n if (hasNative) module.native = true;\n if (hasBrowser) module.browser = true;\n if (hasBun) module.bun = true;\n if (hasNode) module.node = true;\n\n modules.push(module);\n } else {\n // No index.ts, check subdirectories for modules\n await scanDirectory(modulePath, moduleName);\n }\n }\n }\n }\n\n await scanDirectory(srcDir, \"\");\n\n // Check for circular dependencies\n detectCircularDependencies(modules);\n\n return modules;\n}\n","import type { Alepha } from \"alepha\";\nimport type { CommandPrimitive } from \"alepha/command\";\nimport { type BuildOptions, buildOptions } from \"./atoms/buildOptions.ts\";\n\nexport interface AlephaCliConfig {\n /**\n * Add custom commands to the Alepha CLI.\n *\n * You can override 'deploy', 'build', 'dev', 'start' commands this way.\n * But you can also add your own commands and run them via `alepha <command>`.\n */\n commands?: Record<string, CommandPrimitive>;\n\n /**\n * Register more services to the Alepha CLI (enhancements, commands, etc.).\n */\n services?: Array<any>;\n\n /**\n * Configure Alepha build command.\n */\n build?: BuildOptions;\n\n /**\n * Environment variables to set before running commands.\n *\n * Always use .env files by default, this is only for dynamic values.\n */\n env?: Record<string, unknown>;\n}\n\nexport type AlephaCliConfigFn = (alepha: Alepha) => AlephaCliConfig;\n\nexport const defineConfig = (\n runConfig: AlephaCliConfig | AlephaCliConfigFn,\n) => {\n return (alepha: Alepha) => {\n const config =\n typeof runConfig === \"function\" ? runConfig(alepha) : runConfig;\n\n if (config.services) {\n for (const it of config.services) {\n alepha.with(it);\n }\n }\n\n if (config.env) {\n for (const [key, value] of Object.entries(config.env)) {\n process.env[key] = String(value);\n }\n }\n\n if (config.build) {\n alepha.set(buildOptions, config.build);\n }\n\n return {\n ...config.commands,\n };\n };\n};\n\n/**\n * @alias defineConfig\n */\nexport const defineAlephaConfig = defineConfig;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["$atom","$atom"],"sources":["../../src/core/constants/KIND.ts","../../src/core/primitives/$atom.ts","../../src/cli/atoms/buildOptions.ts","../../src/cli/atoms/appEntryOptions.ts","../../src/cli/providers/AppEntryProvider.ts","../../src/cli/providers/ViteTemplateProvider.ts","../../src/cli/providers/ViteBuildProvider.ts","../../src/cli/services/AlephaCliUtils.ts","../../src/cli/version.ts","../../src/cli/services/PackageManagerUtils.ts","../../src/cli/assets/apiHelloControllerTs.ts","../../src/cli/assets/apiIndexTs.ts","../../src/cli/assets/biomeJson.ts","../../src/cli/assets/claudeMd.ts","../../src/cli/assets/dummySpecTs.ts","../../src/cli/assets/editorconfig.ts","../../src/cli/assets/mainBrowserTs.ts","../../src/cli/assets/mainCss.ts","../../src/cli/assets/mainServerTs.ts","../../src/cli/assets/tsconfigJson.ts","../../src/cli/assets/webAppRouterTs.ts","../../src/cli/assets/webHelloComponentTsx.ts","../../src/cli/assets/webIndexTs.ts","../../src/cli/services/ProjectScaffolder.ts","../../src/cli/commands/build.ts","../../src/cli/commands/clean.ts","../../src/cli/commands/db.ts","../../src/cli/commands/deploy.ts","../../src/cli/providers/ViteDevServerProvider.ts","../../src/cli/commands/dev.ts","../../src/cli/atoms/changelogOptions.ts","../../src/cli/services/GitMessageParser.ts","../../src/cli/commands/gen/changelog.ts","../../src/cli/commands/gen/env.ts","../../src/cli/commands/gen/openapi.ts","../../src/cli/commands/gen.ts","../../src/cli/commands/init.ts","../../src/cli/commands/lint.ts","../../src/cli/commands/root.ts","../../src/cli/commands/test.ts","../../src/cli/commands/typecheck.ts","../../src/cli/commands/verify.ts","../../src/cli/apps/AlephaCli.ts","../../src/cli/apps/AlephaPackageBuilderCli.ts","../../src/cli/defineConfig.ts"],"sourcesContent":["/**\n * Used for identifying primitives.\n *\n * @internal\n */\nexport const KIND: unique symbol = Symbol.for(\"Alepha.Kind\");\n","import type { TArray } from \"typebox\";\nimport { KIND } from \"../constants/KIND.ts\";\nimport type {\n Static,\n TObject,\n TOptionalAdd,\n} from \"../providers/TypeProvider.ts\";\n\n/**\n * Define an atom for state management.\n *\n * Atom lets you define a piece of state with a name, schema, and default value.\n *\n * By default, Alepha state is just a simple key-value store.\n * Using atoms allows you to have type safety, validation, and default values for your state.\n *\n * You control how state is structured and validated.\n *\n * Features:\n * - Set a schema for validation\n * - Set a default value for initial state\n * - Rules, like read-only, custom validation, etc.\n * - Automatic getter access in services with {@link $use}\n * - SSR support (server state automatically serialized and hydrated on client)\n * - React integration (useAtom hook for automatic component re-renders)\n * - Middleware\n * - Persistence adapters (localStorage, Redis, database, file system, cookie, etc.)\n * - State migrations (version upgrades when schema changes)\n * - Documentation generation & devtools integration\n *\n * Common use cases:\n * - user preferences\n * - feature flags\n * - configuration options\n * - session data\n *\n * Atom must contain only serializable data.\n * Avoid storing complex objects like class instances, functions, or DOM elements.\n * If you need to store complex data, consider using identifiers or references instead.\n */\nexport const $atom = <\n T extends TObject<TProperties> | TArray,\n N extends string,\n>(\n options: AtomOptions<T, N>,\n): Atom<T, N> => {\n return new Atom<T, N>(options);\n};\n\nexport type AtomOptions<T extends TAtomObject, N extends string> = {\n name: N;\n schema: T;\n description?: string;\n} & (T extends TOptionalAdd<T>\n ? {\n default?: Static<T>;\n }\n : {\n default: Static<T>;\n });\n\nexport class Atom<T extends TAtomObject = TObject, N extends string = string> {\n public readonly options: AtomOptions<T, N>;\n\n public get schema(): T {\n return this.options.schema;\n }\n\n public get key(): N {\n return this.options.name;\n }\n\n constructor(options: AtomOptions<T, N>) {\n this.options = options;\n }\n}\n\n$atom[KIND] = \"atom\";\n\ntype TProperties = any; // it's required to avoid required [ string ] error, ...\n\nexport type TAtomObject = TObject<any> | TArray;\nexport type AtomStatic<T extends TAtomObject> =\n T extends TOptionalAdd<T> ? Static<T> | undefined : Static<T>;\n","import { type Static, t } from \"alepha\";\nimport { $atom } from \"../../core/primitives/$atom.ts\";\n\n/**\n * Build options atom for CLI build command.\n *\n * Defines the available build configuration options with their defaults.\n * Options can be overridden via vite.config.ts or CLI flags.\n */\nexport const buildOptions = $atom({\n name: \"alepha.cli.build.options\",\n description: \"Build configuration options\",\n schema: t.object({\n /**\n * Generate build stats report.\n */\n stats: t.optional(t.boolean({ default: false })),\n\n /**\n * Vercel deployment configuration.\n */\n vercel: t.optional(\n t.object({\n projectName: t.optional(t.string()),\n orgId: t.optional(t.string()),\n projectId: t.optional(t.string()),\n config: t.optional(\n t.object({\n crons: t.optional(\n t.array(\n t.object({\n path: t.string(),\n schedule: t.string(),\n }),\n ),\n ),\n }),\n ),\n }),\n ),\n\n /**\n * Cloudflare Workers deployment configuration.\n */\n cloudflare: t.optional(\n t.object({\n config: t.optional(t.json()),\n }),\n ),\n\n /**\n * Docker deployment configuration.\n */\n docker: t.optional(\n t.object({\n /**\n * Docker image name to use in the Dockerfile.\n * @default \"node:24-alpine\"\n */\n image: t.optional(t.string({ default: \"node:24-alpine\" })),\n\n /**\n * Command to run in the Docker container.\n * @default \"node\"\n */\n command: t.optional(t.string({ default: \"node\" })),\n }),\n ),\n\n /**\n * Sitemap generation configuration.\n */\n sitemap: t.optional(\n t.object({\n /**\n * Base URL for sitemap entries.\n */\n hostname: t.string(),\n }),\n ),\n }),\n default: {},\n});\n\n/**\n * Type for build options.\n */\nexport type BuildOptions = Static<typeof buildOptions.schema>;\n","import { $atom, type Static, t } from \"alepha\";\n\nexport const appEntryOptions = $atom({\n name: \"alepha.cli.appEntry.options\",\n schema: t.object({\n server: t.optional(t.text()),\n browser: t.optional(t.text()),\n style: t.optional(t.text()),\n }),\n default: {},\n});\n\nexport type AppEntryOptions = Static<typeof appEntryOptions.schema>;\n","import { $inject, $use, AlephaError } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { appEntryOptions } from \"../atoms/appEntryOptions.ts\";\n\n/**\n * Service for locating entry files in Alepha projects.\n *\n * Originally in alepha/vite, moved to CLI to avoid cli -> vite dependency.\n */\nexport class AppEntryProvider {\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly options = $use(appEntryOptions);\n\n protected readonly serverEntries = [\n \"main.server.ts\",\n \"main.server.tsx\",\n \"main.ts\",\n \"main.tsx\",\n ] as const;\n\n protected readonly browserEntries = [\n \"main.browser.ts\",\n \"main.browser.tsx\",\n \"main.ts\",\n \"main.tsx\",\n ] as const;\n\n protected readonly styleEntries = [\n \"main.css\",\n \"styles.css\",\n \"style.css\",\n ] as const;\n\n /**\n * Get application entry points.\n *\n * Server entry is required, an error is thrown if not found.\n * Browser entry is optional.\n *\n * It will first check for custom entries in options, see appEntryOptions.\n */\n public async getAppEntry(root: string): Promise<AppEntry> {\n const appEntry: AppEntry = {\n root,\n server: \"\",\n };\n\n if (this.options.server) {\n const serverExists = await this.fs.exists(\n this.fs.join(root, this.options.server),\n );\n if (!serverExists) {\n throw new AlephaError(\n `Custom server entry \"${this.options.server}\" not found.`,\n );\n }\n appEntry.server = this.options.server;\n }\n\n if (this.options.browser) {\n const browserExists = await this.fs.exists(\n this.fs.join(root, this.options.browser),\n );\n if (!browserExists) {\n throw new AlephaError(\n `Custom browser entry \"${this.options.browser}\" not found.`,\n );\n }\n appEntry.browser = this.options.browser;\n }\n\n if (this.options.style) {\n const styleExists = await this.fs.exists(\n this.fs.join(root, this.options.style),\n );\n if (!styleExists) {\n throw new AlephaError(\n `Custom style entry \"${this.options.style}\" not found.`,\n );\n }\n appEntry.style = this.options.style;\n }\n\n const srcFiles = await this.fs.ls(this.fs.join(root, \"src\"));\n\n if (!appEntry.server) {\n // find in conventional locations\n for (const entry of this.serverEntries) {\n if (srcFiles.includes(entry)) {\n appEntry.server = this.fs.join(\"src\", entry);\n break;\n }\n }\n }\n\n if (!appEntry.server) {\n throw new AlephaError(\n \"No server entry found. Please, add a main.server.ts file in the src/ directory or configure a custom entry in alepha.config.ts.\",\n );\n }\n\n if (!appEntry.browser) {\n // find in conventional locations\n for (const entry of this.browserEntries) {\n if (srcFiles.includes(entry)) {\n appEntry.browser = this.fs.join(\"src\", entry);\n break;\n }\n }\n }\n\n if (!appEntry.style) {\n // find in conventional locations\n for (const entry of this.styleEntries) {\n if (srcFiles.includes(entry)) {\n appEntry.style = this.fs.join(\"src\", entry);\n break;\n }\n }\n }\n\n return appEntry;\n }\n}\n\nexport interface AppEntry {\n root: string;\n server: string;\n browser?: string;\n style?: string;\n}\n","import { $inject } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport type { AppEntry } from \"./AppEntryProvider.ts\";\n\nexport class ViteTemplateProvider {\n protected readonly fs = $inject(FileSystemProvider);\n\n public generateIndexHtml(entry: AppEntry): string {\n const style = entry.style;\n const browser = entry.browser ?? entry.server;\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\" />\n<title>App</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n${style ? `<link rel=\"stylesheet\" href=\"/${style}\" />` : \"\"}\n</head>\n<body>\n<div id=\"root\"></div>\n<script type=\"module\" src=\"/${browser}\"></script>\n</body>\n</html>\n`.trim();\n }\n}\n","import { $hook, $inject, type Alepha, AlephaError } from \"alepha\";\nimport { importVite } from \"alepha/vite\";\nimport type { InlineConfig, ViteDevServer } from \"vite\";\nimport type { AppEntry } from \"./AppEntryProvider.ts\";\nimport { ViteTemplateProvider } from \"./ViteTemplateProvider.ts\";\n\nexport class ViteBuildProvider {\n protected alepha?: Alepha;\n protected appEntry?: AppEntry;\n protected viteDevServer?: ViteDevServer;\n protected readonly templateProvider = $inject(ViteTemplateProvider);\n\n /**\n * We need to close the Vite dev server after build is done.\n */\n protected onReady = $hook({\n on: \"ready\",\n priority: \"last\",\n handler: async () => {\n await this.viteDevServer?.close();\n },\n });\n protected onStop = $hook({\n on: \"stop\",\n handler: async () => {\n await this.viteDevServer?.close();\n },\n });\n\n public async init(opts: { entry: AppEntry }) {\n const { createServer } = await importVite();\n\n process.env.ALEPHA_CLI_IMPORT = \"true\"; // signal Alepha App about CLI import, run(alepha) won't start server\n process.env.NODE_ENV = \"production\"; // force Alepha App in production mode for getting \"production\" metadata\n process.env.LOG_LEVEL ??= \"warn\"; // reduce log noise\n\n /**\n * 01/26 Vite 7\n * \"runnerImport\" doesn't work as expected here. (e.g. build docs fail)\n * -> We still use devServer and ssrLoadModule for now.\n * -> This is clearly a bad stuff, we need to find better way.\n */\n this.viteDevServer = await createServer({\n server: { middlewareMode: true },\n appType: \"custom\",\n logLevel: \"silent\",\n } satisfies InlineConfig);\n\n await this.viteDevServer.ssrLoadModule(opts.entry.server);\n\n const alepha: Alepha = (globalThis as any).__alepha;\n if (!alepha) {\n throw new AlephaError(\n \"Alepha instance not found after loading entry module\",\n );\n }\n\n this.alepha = alepha;\n this.appEntry = opts.entry;\n\n return alepha;\n }\n\n public hasClient(): boolean {\n if (!this.alepha) {\n throw new AlephaError(\"ViteBuildProvider not initialized\");\n }\n try {\n this.alepha.inject(\"ReactServerProvider\");\n return true;\n } catch {\n return false;\n }\n }\n\n public generateIndexHtml(): string {\n if (!this.appEntry) {\n throw new AlephaError(\"ViteBuildProvider not initialized\");\n }\n return this.templateProvider.generateIndexHtml(this.appEntry);\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { $inject, Alepha, AlephaError } from \"alepha\";\nimport { EnvUtils } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { AppEntryProvider } from \"../providers/AppEntryProvider.ts\";\n\n/**\n * Core utility service for CLI commands.\n *\n * Provides:\n * - Command execution\n * - File editing helpers\n * - Drizzle/ORM utilities\n * - Environment loading\n */\nexport class AlephaCliUtils {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly envUtils = $inject(EnvUtils);\n protected readonly boot = $inject(AppEntryProvider);\n\n // ===========================================\n // Command Execution\n // ===========================================\n\n /**\n * Execute a command with inherited stdio.\n */\n public async exec(\n command: string,\n options: {\n root?: string;\n env?: Record<string, string>;\n global?: boolean;\n } = {},\n ): Promise<void> {\n const root = options.root ?? process.cwd();\n this.log.debug(`Executing command: ${command}`, { cwd: root });\n\n const runExec = async (app: string, args: string[]) => {\n const prog = spawn(app, args, {\n stdio: \"inherit\",\n cwd: root,\n env: {\n ...process.env,\n ...options.env,\n },\n });\n\n await new Promise<void>((resolve) =>\n prog.on(\"exit\", () => {\n resolve();\n }),\n );\n };\n\n if (options.global) {\n const [app, ...args] = command.split(\" \");\n await runExec(app, args);\n return;\n }\n\n const suffix = process.platform === \"win32\" ? \".cmd\" : \"\";\n const [app, ...args] = command.split(\" \");\n\n // find executable inside project node_modules\n let execPath = await this.checkFileExists(\n root,\n `node_modules/.bin/${app}${suffix}`,\n );\n\n // or, find executable inside alepha package node_modules (pnpm style)\n if (!execPath) {\n execPath = await this.checkFileExists(\n root,\n `node_modules/alepha/node_modules/.bin/${app}${suffix}`,\n );\n }\n\n // check if parent folder (monorepo) has the executable (check 3 times)\n if (!execPath) {\n let parentDir = this.fs.join(root, \"..\");\n for (let i = 0; i < 3; i++) {\n execPath = await this.checkFileExists(\n parentDir,\n `node_modules/.bin/${app}${suffix}`,\n );\n if (execPath) {\n break;\n }\n parentDir = this.fs.join(parentDir, \"..\");\n }\n }\n\n if (!execPath) {\n throw new AlephaError(\n `Could not find executable for command '${app}'. Make sure the package is installed.`,\n );\n }\n\n await runExec(execPath, args);\n }\n\n /**\n * Write a configuration file to node_modules/.alepha directory.\n */\n public async writeConfigFile(\n name: string,\n content: string,\n root = process.cwd(),\n ): Promise<string> {\n const dir = this.fs.join(root, \"node_modules\", \".alepha\");\n\n await this.fs.mkdir(dir, { recursive: true }).catch(() => null);\n\n const path = this.fs.join(dir, name);\n await this.fs.writeFile(path, content);\n\n this.log.debug(`Config file written: ${path}`);\n\n return path;\n }\n\n /**\n * Load Alepha instance from a server entry file.\n */\n public async loadAlephaFromServerEntryFile(\n rootDir?: string,\n explicitEntry?: string,\n ): Promise<{\n alepha: Alepha;\n entry: string;\n }> {\n process.env.ALEPHA_CLI_IMPORT = \"true\";\n\n const root = rootDir ?? process.cwd();\n let entry: string;\n\n if (explicitEntry) {\n // Explicit entry provided\n entry = this.fs.join(root, explicitEntry);\n if (!(await this.fs.exists(entry))) {\n throw new AlephaError(\n `Explicit server entry file \"${explicitEntry}\" not found.`,\n );\n }\n } else {\n // Auto-discover entry\n const appEntry = await this.boot.getAppEntry(root);\n entry = this.fs.join(root, appEntry.server);\n }\n\n delete (global as any).__alepha;\n\n const mod = await import(entry);\n\n this.log.debug(`Load entry: ${entry}`);\n\n // check if alepha is correctly exported\n if (mod.default instanceof Alepha) {\n return { alepha: mod.default, entry };\n }\n\n // else, try with global variable\n const g: any = global;\n if (g.__alepha) {\n return { alepha: g.__alepha, entry };\n }\n\n throw new AlephaError(\n `Could not find Alepha instance in entry file: ${entry}`,\n );\n }\n\n // ===========================================\n // Drizzle ORM & Kit Utilities\n // ===========================================\n\n /**\n * Generate JavaScript code for Drizzle entities export.\n */\n public generateEntitiesJs(\n entry: string,\n provider: string,\n models: string[] = [],\n ): string {\n return `\nimport \"${entry}\";\nimport { DrizzleKitProvider, Repository } from \"alepha/orm\";\n\nconst alepha = globalThis.__alepha;\nconst kit = alepha.inject(DrizzleKitProvider);\nconst provider = alepha.services(Repository).find((it) => it.provider.name === \"${provider}\").provider;\nconst models = kit.getModels(provider);\n\n${models.map((it: string) => `export const ${it} = models[\"${it}\"];`).join(\"\\n\")}\n\n`.trim();\n }\n\n // ===========================================\n // Environment\n // ===========================================\n\n /**\n * Load environment variables from a .env file.\n */\n public async loadEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<void> {\n await this.envUtils.loadEnv(root, files);\n }\n\n // ===========================================\n // Helpers\n // ===========================================\n\n public async exists(root: string, path: string): Promise<boolean> {\n return this.fs.exists(this.fs.join(root, path));\n }\n\n protected async checkFileExists(\n root: string,\n name: string,\n ): Promise<string | undefined> {\n const configPath = this.fs.join(root, name);\n if (await this.fs.exists(configPath)) {\n return configPath;\n }\n }\n}\n","import { readFileSync } from \"node:fs\";\n\nconst packageJson = JSON.parse(\n readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"),\n);\n\nexport const version = packageJson.version;\n","import { $inject, Alepha } from \"alepha\";\nimport type { RunnerMethod } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { version } from \"../version.ts\";\n\n/**\n * Utility service for package manager operations.\n *\n * Handles detection, installation, and cleanup for:\n * - Yarn\n * - npm\n * - pnpm\n * - Bun\n */\nexport class PackageManagerUtils {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly alepha = $inject(Alepha);\n\n /**\n * Detect the package manager used in the project.\n */\n public async getPackageManager(\n root: string,\n flags?: { yarn?: boolean; pnpm?: boolean; npm?: boolean; bun?: boolean },\n ): Promise<\"yarn\" | \"pnpm\" | \"npm\" | \"bun\"> {\n if (flags?.yarn) return \"yarn\";\n if (flags?.pnpm) return \"pnpm\";\n if (flags?.npm) return \"npm\";\n if (flags?.bun) return \"bun\";\n if (this.alepha.isBun()) return \"bun\";\n if (await this.fs.exists(this.fs.join(root, \"bun.lock\"))) return \"bun\";\n if (await this.fs.exists(this.fs.join(root, \"yarn.lock\"))) return \"yarn\";\n if (await this.fs.exists(this.fs.join(root, \"pnpm-lock.yaml\")))\n return \"pnpm\";\n return \"npm\";\n }\n\n /**\n * Get the install command for a package.\n */\n public async getInstallCommand(\n root: string,\n packageName: string,\n dev = true,\n ): Promise<string> {\n const pm = await this.getPackageManager(root);\n let cmd: string;\n\n switch (pm) {\n case \"yarn\":\n cmd = `yarn add ${dev ? \"-D\" : \"\"} ${packageName}`;\n break;\n case \"pnpm\":\n cmd = `pnpm add ${dev ? \"-D\" : \"\"} ${packageName}`;\n break;\n case \"bun\":\n cmd = `bun add ${dev ? \"-d\" : \"\"} ${packageName}`;\n break;\n default:\n cmd = `npm install ${dev ? \"--save-dev\" : \"\"} ${packageName}`;\n }\n\n return cmd.replace(/\\s+/g, \" \").trim();\n }\n\n /**\n * Check if a dependency is installed in the project.\n */\n public async hasDependency(\n root: string,\n packageName: string,\n ): Promise<boolean> {\n try {\n const pkg = await this.readPackageJson(root);\n return !!(\n pkg.dependencies?.[packageName] || pkg.devDependencies?.[packageName]\n );\n } catch {\n return false;\n }\n }\n\n /**\n * Check if Expo is present in the project.\n */\n public async hasExpo(root: string): Promise<boolean> {\n return this.hasDependency(root, \"expo\");\n }\n\n /**\n * Check if React is present in the project.\n */\n public async hasReact(root: string): Promise<boolean> {\n return this.hasDependency(root, \"react\");\n }\n\n /**\n * Install a dependency if it's missing from the project.\n */\n public async ensureDependency(\n root: string,\n packageName: string,\n options: {\n dev?: boolean;\n run?: RunnerMethod;\n exec?: (\n cmd: string,\n opts?: { global?: boolean; root?: string },\n ) => Promise<void>;\n } = {},\n ): Promise<void> {\n const { dev = true } = options;\n\n if (await this.hasDependency(root, packageName)) {\n this.log.debug(`Dependency '${packageName}' is already installed`);\n return;\n }\n\n const cmd = await this.getInstallCommand(root, packageName, dev);\n\n if (options.run) {\n await options.run(cmd, { alias: `add ${packageName}`, root });\n } else if (options.exec) {\n this.log.debug(`Installing ${packageName}`);\n await options.exec(cmd, { global: true, root });\n }\n }\n\n // ===========================================\n // Package Manager Setup & Cleanup\n // ===========================================\n\n public async ensureYarn(root: string): Promise<void> {\n const yarnrcPath = this.fs.join(root, \".yarnrc.yml\");\n if (!(await this.fs.exists(yarnrcPath))) {\n await this.fs.writeFile(yarnrcPath, \"nodeLinker: node-modules\");\n }\n await this.removeAllPmFilesExcept(root, \"yarn\");\n }\n\n public async ensureBun(root: string): Promise<void> {\n await this.removeAllPmFilesExcept(root, \"bun\");\n }\n\n public async ensurePnpm(root: string): Promise<void> {\n await this.removeAllPmFilesExcept(root, \"pnpm\");\n }\n\n public async ensureNpm(root: string): Promise<void> {\n await this.removeAllPmFilesExcept(root, \"npm\");\n }\n\n public async removeAllPmFilesExcept(\n root: string,\n except: string,\n ): Promise<void> {\n if (except !== \"yarn\") await this.removeYarn(root);\n if (except !== \"pnpm\") await this.removePnpm(root);\n if (except !== \"npm\") await this.removeNpm(root);\n if (except !== \"bun\") await this.removeBun(root);\n }\n\n public async removeYarn(root: string): Promise<void> {\n await this.removeFiles(root, [\".yarn\", \".yarnrc.yml\", \"yarn.lock\"]);\n await this.editPackageJson(root, (pkg) => {\n delete pkg.packageManager;\n return pkg;\n });\n }\n\n public async removePnpm(root: string): Promise<void> {\n await this.removeFiles(root, [\"pnpm-lock.yaml\", \"pnpm-workspace.yaml\"]);\n await this.editPackageJson(root, (pkg) => {\n delete pkg.packageManager;\n return pkg;\n });\n }\n\n public async removeNpm(root: string): Promise<void> {\n await this.removeFiles(root, [\"package-lock.json\"]);\n }\n\n public async removeBun(root: string): Promise<void> {\n await this.removeFiles(root, [\"bun.lockb\", \"bun.lock\"]);\n }\n\n // ===========================================\n // Package.json utilities\n // ===========================================\n\n public async readPackageJson(root: string): Promise<Record<string, any>> {\n const content = await this.fs\n .createFile({ path: this.fs.join(root, \"package.json\") })\n .text();\n return JSON.parse(content);\n }\n\n public async writePackageJson(\n root: string,\n content: Record<string, any>,\n ): Promise<void> {\n await this.fs.writeFile(\n this.fs.join(root, \"package.json\"),\n JSON.stringify(content, null, 2),\n );\n }\n\n public async editPackageJson(\n root: string,\n editFn: (pkg: Record<string, any>) => Record<string, any>,\n ): Promise<void> {\n try {\n const pkg = await this.readPackageJson(root);\n const updated = editFn(pkg);\n await this.writePackageJson(root, updated);\n } catch {\n // package.json doesn't exist, skip\n }\n }\n\n public async ensurePackageJson(\n root: string,\n modes: DependencyModes,\n ): Promise<Record<string, any>> {\n const packageJsonPath = this.fs.join(root, \"package.json\");\n\n if (!(await this.fs.exists(packageJsonPath))) {\n const content = this.generatePackageJsonContent(modes);\n await this.writePackageJson(root, content);\n return content;\n }\n\n const packageJson = await this.readPackageJson(root);\n const newContent = this.generatePackageJsonContent(modes);\n\n packageJson.type = \"module\";\n packageJson.dependencies ??= {};\n packageJson.devDependencies ??= {};\n packageJson.scripts ??= {};\n\n Object.assign(packageJson.dependencies, newContent.dependencies);\n Object.assign(packageJson.devDependencies, newContent.devDependencies);\n Object.assign(packageJson.scripts, newContent.scripts);\n\n await this.writePackageJson(root, packageJson);\n return packageJson;\n }\n\n public generatePackageJsonContent(modes: DependencyModes): {\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n scripts: Record<string, string>;\n type: \"module\";\n } {\n const dependencies: Record<string, string> = {\n alepha: `^${version}`,\n };\n\n const devDependencies: Record<string, string> = {};\n\n const scripts: Record<string, string> = {\n dev: \"alepha dev\",\n build: \"alepha build\",\n lint: \"alepha lint\",\n typecheck: \"alepha typecheck\",\n verify: \"alepha verify\",\n };\n\n if (modes.ui) {\n dependencies[\"@alepha/ui\"] = `^${version}`;\n modes.react = true;\n }\n\n if (modes.react) {\n dependencies[\"@alepha/react\"] = `^${version}`;\n dependencies.react = \"^19.2.0\";\n dependencies[\"react-dom\"] = \"^19.2.0\";\n devDependencies[\"@types/react\"] = \"^19.2.0\";\n }\n\n return {\n type: \"module\",\n dependencies,\n devDependencies,\n scripts,\n };\n }\n\n // ===========================================\n // Helper methods\n // ===========================================\n\n protected async removeFiles(root: string, files: string[]): Promise<void> {\n await Promise.all(\n files.map((file) =>\n this.fs.rm(this.fs.join(root, file), { force: true, recursive: true }),\n ),\n );\n }\n}\n\nexport interface DependencyModes {\n react?: boolean;\n ui?: boolean;\n expo?: boolean;\n}\n","export const apiHelloControllerTs = () =>\n `\nimport { t } from \"alepha\";\nimport { $action } from \"alepha/server\";\n\nexport class HelloController {\n hello = $action({\n path: \"/hello\",\n schema: {\n response: t.object({\n message: t.string(),\n }),\n },\n handler: () => ({\n message: \"Hello, Alepha!\",\n }),\n });\n}\n`.trim();\n","export interface ApiIndexTsOptions {\n appName?: string;\n}\n\nexport const apiIndexTs = (options: ApiIndexTsOptions = {}) => {\n const { appName = \"app\" } = options;\n return `\nimport { $module } from \"alepha\";\nimport { HelloController } from \"./controllers/HelloController.ts\";\n\nexport const ApiModule = $module({\n name: \"${appName}.api\",\n services: [HelloController],\n});\n`.trim();\n};\n","export const biomeJson = () =>\n `\n{\n \"$schema\": \"https://biomejs.dev/schemas/latest/schema.json\",\n \"vcs\": {\n \"enabled\": true,\n \"clientKind\": \"git\"\n },\n \"files\": {\n \"ignoreUnknown\": true,\n \"includes\": [\"**\", \"!node_modules\", \"!dist\"]\n },\n \"formatter\": {\n \"enabled\": true,\n \"useEditorconfig\": true\n },\n \"linter\": {\n \"enabled\": true,\n \"rules\": {\n \"recommended\": true\n },\n \"domains\": {\n \"react\": \"recommended\"\n }\n },\n \"assist\": {\n \"actions\": {\n \"source\": {\n \"organizeImports\": \"on\"\n }\n }\n }\n}\n`.trim();\n","export interface ClaudeMdOptions {\n react?: boolean;\n ui?: boolean;\n projectName?: string;\n}\n\nexport const claudeMd = (options: ClaudeMdOptions = {}) => {\n const { react = false, projectName = \"my-app\" } = options;\n\n const reactSection = react\n ? `\n## React & Frontend\n\n### Pages with \\`$page\\`\n\\`\\`\\`tsx\nimport { $page } from \"@alepha/react/router\";\nimport { $client } from \"alepha/server/links\";\nimport type { UserController } from \"./UserController.ts\";\n\nclass AppRouter {\n api = $client<UserController>();\n\n users = $page({\n path: \"/users\",\n loader: async () => ({ users: await this.api.listUsers() }),\n component: ({ users }) => (\n <ul>{users.map(u => <li key={u.id}>{u.email}</li>)}</ul>\n ),\n });\n\n userDetail = $page({\n path: \"/users/:id\",\n schema: { params: t.object({ id: t.uuid() }) },\n loader: async ({ params }) => ({ user: await this.api.getUser({ params }) }),\n lazy: () => import(\"./UserDetail.tsx\"), // Code splitting\n });\n}\n\\`\\`\\`\n\n### React Hooks\n\\`\\`\\`typescript\nimport { useAlepha, useClient, useStore, useAction, useInject } from \"@alepha/react\";\nimport { useRouter, useActive } from \"@alepha/react/router\";\nimport { useForm } from \"@alepha/react/form\";\n\\`\\`\\`\n\n- \\`useClient<Controller>()\\` - Type-safe API calls\n- \\`useStore(atom)\\` - Global state (returns \\`[value, setValue]\\`)\n- \\`useAction({ handler })\\` - Async operations with loading/error state\n- \\`useRouter<AppRouter>()\\` - Type-safe navigation\n- \\`useForm({ schema, handler })\\` - Type-safe forms with validation\n`\n : \"\";\n\n const projectStructure = react\n ? `\n\\`\\`\\`\n${projectName}/\n├── src/\n│ ├── api/ # Backend\n│ │ ├── controllers/ # API controllers with $action\n│ │ ├── services/ # Business logic\n│ │ ├── entities/ # Database entities with $entity\n│ │ ├── providers/ # External service wrappers\n│ │ └── index.ts # API module definition with $module\n│ ├── web/ # Frontend (React only)\n│ │ ├── components/ # React components\n│ │ ├── atoms/ # State atoms with $atom\n│ │ ├── AppRouter.ts # Routes with $page\n│ │ └── index.ts # Web module definition with $module\n│ ├── main.server.ts # Server entry\n│ ├── main.browser.ts # Browser entry (React only)\n│ └── main.css # CSS entry (React only)\n├── package.json\n└── tsconfig.json\n\\`\\`\\`\n`\n : `\n\\`\\`\\`\n${projectName}/\n├── src/\n│ ├── api/ # Backend\n│ │ ├── controllers/ # API controllers with $action\n│ │ ├── services/ # Business logic\n│ │ ├── entities/ # Database entities with $entity\n│ │ ├── providers/ # External service wrappers\n│ │ └── index.ts # API module definition with $module\n│ └── main.server.ts # Server entry (always use main.server.ts)\n├── package.json\n└── tsconfig.json\n\\`\\`\\`\n`;\n\n return `# CLAUDE.md\n\nThis file provides guidance to Claude Code when working with this Alepha project.\n\n## Overview\n\nThis is an **Alepha** project - a convention-driven TypeScript framework for type-safe full-stack applications.\n\n**Key Concepts:**\n- **Primitives**: Features defined with \\`$\\`-prefixed functions (\\`$action\\`, \\`$entity\\`, \\`$page\\`)\n- **Class-Based**: Services are classes, primitives are class properties\n- **Zero-Config**: Code structure IS the configuration\n- **End-to-End Types**: Types flow from database → API → ${react ? \"React\" : \"client\"}\n\n## Rules\n\n- Use TypeScript strict mode\n- Use Biome for formatting (\\`alepha lint\\`)\n- Use Vitest for testing\n- One file = one class\n- Primitives are class properties (except \\`$entity\\`, \\`$atom\\`)\n- No decorators, no Express/Fastify patterns\n- No manual instantiation - use dependency injection\n- Use \\`protected\\` instead of \\`private\\` for class members\n- Import with file extensions: \\`import { User } from \"./User.ts\"\\`\n- Use \\`t\\` from Alepha for schemas (not Zod)\n- Prefer \\`t.text()\\` over \\`t.string()\\` for user input (has default max length, auto-trim, supports lowercase option)\n\n## Project Structure\n${projectStructure}\n## Core Primitives\n\n### API with \\`$action\\`\n\\`\\`\\`typescript\nimport { t } from \"alepha\";\nimport { $action } from \"alepha/server\";\n\nclass UserController {\n getUser = $action({\n path: \"/users/:id\", // → GET /api/users/:id\n schema: {\n params: t.object({ id: t.uuid() }),\n response: t.object({ id: t.uuid(), email: t.email() }),\n },\n handler: async ({ params }) => this.userRepo.findById(params.id),\n });\n\n createUser = $action({\n // POST inferred from body schema\n schema: {\n body: t.object({ email: t.email() }),\n response: userEntity.schema,\n },\n handler: async ({ body }) => this.userRepo.create(body),\n });\n}\n\\`\\`\\`\n\n### Database with \\`$entity\\` and \\`$repository\\`\n\\`\\`\\`typescript\nimport { $entity, $repository, db } from \"alepha/orm\";\n\n// Entity defined at module level (for drizzle-kit compatibility)\nexport const userEntity = $entity({\n name: \"users\",\n schema: t.object({\n id: db.primaryKey(),\n email: t.email(),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n }),\n indexes: [{ column: \"email\", unique: true }],\n});\n\nclass UserService {\n repo = $repository(userEntity);\n\n async findById(id: string) {\n return this.repo.findById(id);\n }\n}\n\\`\\`\\`\n\n### Dependency Injection\n\\`\\`\\`typescript\nimport { $inject } from \"alepha\";\n\nclass OrderService {\n userService = $inject(UserService); // Within same module\n\n async createOrder(userId: string) {\n const user = await this.userService.findById(userId);\n // ...\n }\n}\n\n// Cross-module: use $client instead of $inject\nclass AppRouter {\n api = $client<OrderController>(); // Type-safe HTTP client\n}\n\\`\\`\\`\n\n### Modules with \\`$module\\`\n\\`\\`\\`typescript\n// src/api/index.ts - Groups all API services\nimport { $module } from \"alepha\";\n\nexport const ApiModule = $module({\n name: \"app.api\",\n services: [\n UserController,\n OrderController,\n UserService,\n ],\n});\n\n// src/web/index.ts - Groups all web services (React only)\nexport const WebModule = $module({\n name: \"app.web\",\n services: [AppRouter, Toaster],\n register(alepha) {\n // Optional: configure additional services\n alepha.with(SomeLibrary);\n },\n});\n\\`\\`\\`\n\n### Environment Variables\n\\`\\`\\`typescript\nimport { $env, t } from \"alepha\";\n\nclass AppConfig {\n env = $env(t.object({\n DATABASE_URL: t.string(),\n API_KEY: t.optional(t.string()),\n }));\n}\n\\`\\`\\`\n${reactSection}\n## Quick Reference\n\n| Primitive | Import | Purpose |\n|-----------|--------|---------|\n| \\`$inject\\` | \\`alepha\\` | Dependency injection |\n| \\`$env\\` | \\`alepha\\` | Environment variables |\n| \\`$hook\\` | \\`alepha\\` | Lifecycle hooks |\n| \\`$logger\\` | \\`alepha/logger\\` | Structured logging |\n| \\`$action\\` | \\`alepha/server\\` | REST API endpoints |\n| \\`$route\\` | \\`alepha/server\\` | Low-level HTTP routes |\n| \\`$entity\\` | \\`alepha/orm\\` | Database tables |\n| \\`$repository\\` | \\`alepha/orm\\` | Type-safe data access |\n| \\`$queue\\` | \\`alepha/queue\\` | Background jobs |\n| \\`$scheduler\\` | \\`alepha/scheduler\\` | Cron tasks |\n| \\`$cache\\` | \\`alepha/cache\\` | Cached computations |\n| \\`$bucket\\` | \\`alepha/bucket\\` | File storage |\n| \\`$issuer\\` | \\`alepha/security\\` | JWT tokens |\n| \\`$command\\` | \\`alepha/command\\` | CLI commands |${\n react\n ? `\n| \\`$page\\` | \\`@alepha/react/router\\` | React pages with SSR |\n| \\`$atom\\` | \\`alepha\\` | Global state |`\n : \"\"\n }\n\n## Testing\n\n\\`\\`\\`typescript\nimport { describe, it, expect } from \"vitest\";\nimport { Alepha } from \"alepha\";\n\ndescribe(\"UserService\", () => {\n it(\"should create user\", async () => {\n const alepha = Alepha.create().with(UserService);\n const service = alepha.inject(UserService);\n\n const user = await service.create({ email: \"test@example.com\" });\n expect(user.email).toBe(\"test@example.com\");\n });\n\n it(\"should mock dependencies\", async () => {\n const alepha = Alepha.create()\n .with(OrderService)\n .with({ provide: PaymentGateway, use: MockPaymentGateway });\n\n const service = alepha.inject(OrderService);\n // PaymentGateway is now mocked\n });\n});\n\\`\\`\\`\n\n## Common Mistakes\n\n1. **DON'T use decorators** - Use primitives (\\`$action\\`, not \\`@Get()\\`)\n2. **DON'T use Zod** - Use TypeBox via \\`t\\` from Alepha\n3. **DON'T use Express patterns** - No \\`app.get()\\`, \\`router.use()\\`\n4. **DON'T inject across modules** - Use \\`$client\\` for cross-module calls\n5. **DON'T use async constructors** - Use \\`$hook({ on: \"start\" })\\`\n6. **DON'T instantiate manually** - Let DI container manage instances\n\n## After Code Changes\n\nAlways run:\n\\`\\`\\`bash\nalepha lint # Format and lint\nalepha typecheck # Type checking\nalepha test # Run tests (if applicable)\nalepha build # Build the project\n\\`\\`\\`\n\n## Documentation\n\n- Full docs: https://alepha.dev/llms.txt\n- Detailed docs: https://alepha.dev/llms-full.txt\n`.trim();\n};\n","export const dummySpecTs = () =>\n `\nimport { test, expect } from \"vitest\";\n\ntest(\"dummy test\", () => {\n expect(1 + 1).toBe(2);\n});\n`.trim();\n","export const editorconfig = () =>\n `\n# https://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nindent_style = space\nindent_size = 2\n`.trim();\n","export const mainBrowserTs = () =>\n `\nimport { Alepha, run } from \"alepha\";\nimport { WebModule } from \"./web/index.ts\";\n\nconst alepha = Alepha.create();\n\nalepha.with(WebModule);\n\nrun(alepha);\n`.trim();\n","export const mainCss = () =>\n `\n* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nhtml,\nbody {\n height: 100%;\n}\n\nbody {\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto,\n \"Helvetica Neue\", Arial, sans-serif;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n}\n\n#root {\n height: 100%;\n}\n`.trim();\n","export interface MainServerTsOptions {\n react?: boolean;\n}\n\nexport const mainServerTs = (options: MainServerTsOptions = {}) => {\n const { react = false } = options;\n\n const webImport = react\n ? `import { WebModule } from \"./web/index.ts\";\\n`\n : \"\";\n\n const webWith = react ? `alepha.with(WebModule);\\n` : \"\";\n\n return `\nimport { Alepha, run } from \"alepha\";\nimport { ApiModule } from \"./api/index.ts\";\n${webImport}\nconst alepha = Alepha.create();\n\nalepha.with(ApiModule);\n${webWith}\nrun(alepha);\n`.trim();\n};\n","export const tsconfigJson = () =>\n `\n{\n \"extends\": \"alepha/tsconfig.base\"\n}\n`.trim();\n","export const webAppRouterTs = () =>\n `\nimport { $page } from \"@alepha/react/router\";\nimport { $client } from \"alepha/server/links\";\nimport type { HelloController } from \"../api/controllers/HelloController.ts\";\n\nexport class AppRouter {\n api = $client<HelloController>();\n\n home = $page({\n path: \"/\",\n lazy: () => import(\"./components/Hello.tsx\"),\n loader: () => this.api.hello(),\n });\n}\n`.trim();\n","export const webHelloComponentTsx = () =>\n `import { useState } from \"react\";\n\ninterface Props {\n message: string;\n}\n\nconst Hello = (props: Props) => {\n const [message, setMessage] = useState(props.message);\n return (\n <div>\n <h1>{message}</h1>\n <input value={message} onChange={e => setMessage(e.target.value)} />\n <p>Edit this component in src/web/components/Hello.tsx</p>\n </div>\n );\n};\n\nexport default Hello;\n`.trim();\n","export interface WebIndexTsOptions {\n appName?: string;\n}\n\nexport const webIndexTs = (options: WebIndexTsOptions = {}) => {\n const { appName = \"app\" } = options;\n return `\nimport { $module } from \"alepha\";\nimport { AppRouter } from \"./AppRouter.ts\";\n\nexport const WebModule = $module({\n name: \"${appName}.web\",\n services: [AppRouter],\n});\n`.trim();\n};\n","import { basename, dirname } from \"node:path\";\nimport { $inject } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { apiHelloControllerTs } from \"../assets/apiHelloControllerTs.ts\";\nimport { apiIndexTs } from \"../assets/apiIndexTs.ts\";\nimport { biomeJson } from \"../assets/biomeJson.ts\";\nimport { type ClaudeMdOptions, claudeMd } from \"../assets/claudeMd.ts\";\nimport { dummySpecTs } from \"../assets/dummySpecTs.ts\";\nimport { editorconfig } from \"../assets/editorconfig.ts\";\nimport { mainBrowserTs } from \"../assets/mainBrowserTs.ts\";\nimport { mainCss } from \"../assets/mainCss.ts\";\nimport { mainServerTs } from \"../assets/mainServerTs.ts\";\nimport { tsconfigJson } from \"../assets/tsconfigJson.ts\";\nimport { webAppRouterTs } from \"../assets/webAppRouterTs.ts\";\nimport { webHelloComponentTsx } from \"../assets/webHelloComponentTsx.ts\";\nimport { webIndexTs } from \"../assets/webIndexTs.ts\";\nimport {\n type DependencyModes,\n PackageManagerUtils,\n} from \"./PackageManagerUtils.ts\";\n\n/**\n * Service for scaffolding new Alepha projects.\n *\n * Handles creation of:\n * - Project structure (src/api, src/web)\n * - Configuration files (tsconfig, biome, editorconfig)\n * - Entry points (main.server.ts, main.browser.ts)\n * - Example code (HelloController, Hello component)\n */\nexport class ProjectScaffolder {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly pm = $inject(PackageManagerUtils);\n\n /**\n * Get the app name from the directory name.\n *\n * Converts the directory name to a valid module name:\n * - Converts to lowercase\n * - Replaces spaces, dashes, underscores with nothing\n * - Falls back to \"app\" if empty\n */\n public getAppName(root: string): string {\n const dirName = basename(root);\n const appName = dirName.toLowerCase().replace(/[\\s\\-_]/g, \"\");\n return appName || \"app\";\n }\n\n /**\n * Ensure all configuration files exist.\n */\n public async ensureConfig(\n root: string,\n opts: {\n force?: boolean;\n packageJson?: boolean | DependencyModes;\n tsconfigJson?: boolean;\n indexHtml?: boolean;\n biomeJson?: boolean;\n editorconfig?: boolean;\n claudeMd?: boolean | ClaudeMdOptions;\n },\n ): Promise<void> {\n const tasks: Promise<void>[] = [];\n const force = opts.force ?? false;\n\n if (opts.packageJson) {\n tasks.push(\n this.pm\n .ensurePackageJson(\n root,\n typeof opts.packageJson === \"boolean\" ? {} : opts.packageJson,\n )\n .then(() => {}),\n );\n }\n if (opts.tsconfigJson) {\n tasks.push(this.ensureTsConfig(root, { force }));\n }\n if (opts.indexHtml) {\n tasks.push(this.ensureReactProject(root, { force }));\n }\n if (opts.biomeJson) {\n tasks.push(this.ensureBiomeConfig(root, { force }));\n }\n if (opts.editorconfig) {\n tasks.push(this.ensureEditorConfig(root, { force }));\n }\n if (opts.claudeMd) {\n tasks.push(\n this.ensureClaudeMd(\n root,\n typeof opts.claudeMd === \"boolean\"\n ? { force }\n : { ...opts.claudeMd, force },\n ),\n );\n }\n\n await Promise.all(tasks);\n }\n\n // ===========================================\n // Config Files\n // ===========================================\n\n public async ensureTsConfig(\n root: string,\n opts: { force?: boolean } = {},\n ): Promise<void> {\n // Check if tsconfig.json exists in current or parent directories\n if (!opts.force && (await this.existsInParents(root, \"tsconfig.json\"))) {\n return;\n }\n await this.fs.writeFile(\n this.fs.join(root, \"tsconfig.json\"),\n tsconfigJson(),\n );\n }\n\n public async ensureBiomeConfig(\n root: string,\n opts: { force?: boolean } = {},\n ): Promise<void> {\n await this.ensureFile(root, \"biome.json\", biomeJson(), opts.force);\n }\n\n public async ensureEditorConfig(\n root: string,\n opts: { force?: boolean } = {},\n ): Promise<void> {\n await this.ensureFile(root, \".editorconfig\", editorconfig(), opts.force);\n }\n\n public async ensureClaudeMd(\n root: string,\n options: ClaudeMdOptions & { force?: boolean } = {},\n ): Promise<void> {\n await this.ensureFile(root, \"CLAUDE.md\", claudeMd(options), options.force);\n }\n\n // ===========================================\n // API Project Structure\n // ===========================================\n\n /**\n * Ensure src/main.server.ts exists with full API structure.\n *\n * Creates:\n * - src/main.server.ts (entry point)\n * - src/api/index.ts (API module)\n * - src/api/controllers/HelloController.ts (example controller)\n */\n public async ensureApiProject(\n root: string,\n opts: { force?: boolean } = {},\n ): Promise<void> {\n const srcDir = this.fs.join(root, \"src\");\n\n // Don't overwrite existing content unless force is set\n if (!opts.force && (await this.fs.exists(srcDir))) {\n const files = await this.fs.ls(srcDir);\n if (files.length > 0) return;\n }\n\n const appName = this.getAppName(root);\n\n // Create directories\n await this.fs.mkdir(this.fs.join(root, \"src/api/controllers\"), {\n recursive: true,\n });\n\n // Create files\n await this.ensureFile(srcDir, \"main.server.ts\", mainServerTs(), opts.force);\n await this.ensureFile(\n srcDir,\n \"api/index.ts\",\n apiIndexTs({ appName }),\n opts.force,\n );\n await this.ensureFile(\n srcDir,\n \"api/controllers/HelloController.ts\",\n apiHelloControllerTs(),\n opts.force,\n );\n }\n\n // ===========================================\n // React Project Structure\n // ===========================================\n\n /**\n * Ensure full React project structure exists.\n *\n * Creates:\n * - src/main.server.ts, src/main.browser.ts\n * - src/api/index.ts, src/api/controllers/HelloController.ts\n * - src/web/index.ts, src/web/AppRouter.ts, src/web/components/Hello.tsx\n */\n public async ensureReactProject(\n root: string,\n opts: { force?: boolean } = {},\n ): Promise<void> {\n const appName = this.getAppName(root);\n\n // Create directories\n await this.fs.mkdir(this.fs.join(root, \"src/api/controllers\"), {\n recursive: true,\n });\n await this.fs.mkdir(this.fs.join(root, \"src/web/components\"), {\n recursive: true,\n });\n\n // src/main.css\n await this.ensureFile(root, \"src/main.css\", mainCss(), opts.force);\n\n // API structure\n await this.ensureFile(\n root,\n \"src/api/index.ts\",\n apiIndexTs({ appName }),\n opts.force,\n );\n await this.ensureFile(\n root,\n \"src/api/controllers/HelloController.ts\",\n apiHelloControllerTs(),\n opts.force,\n );\n await this.ensureFile(\n root,\n \"src/main.server.ts\",\n mainServerTs({ react: true }),\n opts.force,\n );\n\n // Web structure\n await this.ensureFile(\n root,\n \"src/web/index.ts\",\n webIndexTs({ appName }),\n opts.force,\n );\n await this.ensureFile(\n root,\n \"src/web/AppRouter.ts\",\n webAppRouterTs(),\n opts.force,\n );\n await this.ensureFile(\n root,\n \"src/web/components/Hello.tsx\",\n webHelloComponentTsx(),\n opts.force,\n );\n await this.ensureFile(\n root,\n \"src/main.browser.ts\",\n mainBrowserTs(),\n opts.force,\n );\n }\n\n // ===========================================\n // Test Directory\n // ===========================================\n\n /**\n * Ensure test directory exists with a dummy test file.\n */\n public async ensureTestDir(root: string): Promise<void> {\n const testDir = this.fs.join(root, \"test\");\n const dummyPath = this.fs.join(testDir, \"dummy.spec.ts\");\n\n if (!(await this.fs.exists(testDir))) {\n await this.fs.mkdir(testDir, { recursive: true });\n await this.fs.writeFile(dummyPath, dummySpecTs());\n return;\n }\n\n const files = await this.fs.ls(testDir);\n if (files.length === 0) {\n await this.fs.writeFile(dummyPath, dummySpecTs());\n }\n }\n\n // ===========================================\n // Helpers\n // ===========================================\n\n /**\n * Write a file, optionally overriding if it exists.\n */\n protected async ensureFile(\n root: string,\n relativePath: string,\n content: string,\n force?: boolean,\n ): Promise<void> {\n const fullPath = this.fs.join(root, relativePath);\n if (force || !(await this.fs.exists(fullPath))) {\n await this.fs.writeFile(fullPath, content);\n }\n }\n\n /**\n * Check if a file exists in the given directory or any parent directory.\n */\n protected async existsInParents(\n root: string,\n filename: string,\n ): Promise<boolean> {\n let current = root;\n while (true) {\n if (await this.fs.exists(this.fs.join(current, filename))) {\n return true;\n }\n const parent = dirname(current);\n if (parent === current) {\n // Reached filesystem root\n return false;\n }\n current = parent;\n }\n }\n}\n","import { $inject, $use, type Alepha, AlephaError, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport {\n buildClient,\n buildServer,\n copyAssets,\n generateCloudflare,\n generateDocker,\n generateSitemap,\n generateVercel,\n prerenderPages,\n} from \"alepha/vite\";\nimport { buildOptions } from \"../atoms/buildOptions.ts\";\nimport { AppEntryProvider } from \"../providers/AppEntryProvider.ts\";\nimport { ViteBuildProvider } from \"../providers/ViteBuildProvider.ts\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class BuildCommand {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n protected readonly boot = $inject(AppEntryProvider);\n protected readonly viteBuildProvider = $inject(ViteBuildProvider);\n protected readonly options = $use(buildOptions);\n\n public readonly build = $command({\n name: \"build\",\n mode: \"production\",\n description: \"Build the project for production\",\n flags: t.object({\n stats: t.optional(\n t.boolean({\n description: \"Generate build stats report\",\n }),\n ),\n vercel: t.optional(\n t.boolean({\n description: \"Generate Vercel deployment configuration\",\n }),\n ),\n cloudflare: t.optional(\n t.boolean({\n description: \"Generate Cloudflare Workers configuration\",\n }),\n ),\n docker: t.optional(\n t.boolean({\n description: \"Generate Docker configuration\",\n }),\n ),\n sitemap: t.optional(\n t.text({\n description: \"Generate sitemap.xml with base URL\",\n }),\n ),\n bun: t.optional(\n t.boolean({\n description: \"Prioritize .bun.ts entry files for Bun runtime\",\n }),\n ),\n }),\n handler: async ({ flags, run, root }) => {\n process.env.NODE_ENV = \"production\";\n\n if (await this.pm.hasExpo(root)) {\n // will come soon\n return;\n }\n\n await this.scaffolder.ensureConfig(root, {\n tsconfigJson: true,\n });\n\n const entry = await this.boot.getAppEntry(root);\n this.log.trace(\"Entry file found\", { entry });\n\n const distDir = \"dist\";\n const publicDir = \"public\";\n\n await this.pm.ensureDependency(root, \"vite\", {\n run,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n await run.rm(\"dist\", { alias: \"clean dist\" });\n\n const options = this.options;\n await this.utils.loadEnv(root, [\".env\", \".env.production\"]);\n\n const stats = flags.stats ?? options.stats ?? false;\n let template = \"\";\n let hasClient = false;\n let alepha: Alepha | undefined;\n\n await run({\n name: \"analyze app\",\n handler: async () => {\n alepha = await this.viteBuildProvider.init({ entry });\n hasClient = this.viteBuildProvider.hasClient();\n if (hasClient) {\n template = this.viteBuildProvider.generateIndexHtml();\n }\n },\n });\n\n if (!alepha) {\n throw new AlephaError(\"Alepha instance not found\");\n }\n\n // Build client (precompress always enabled)\n if (hasClient) {\n // TODO: find a way to avoid writing index.html to disk\n const indexHtmlPath = this.fs.join(root, \"index.html\");\n await this.fs.writeFile(indexHtmlPath, template);\n try {\n await run({\n name: \"vite build client\",\n handler: () =>\n buildClient({\n silent: true,\n dist: `${distDir}/${publicDir}`,\n stats,\n precompress: true,\n }),\n });\n } finally {\n await this.fs.rm(indexHtmlPath);\n }\n }\n\n // Build server\n await run({\n name: \"vite build server\",\n handler: async () => {\n if (!alepha) {\n throw new AlephaError(\"Alepha instance not found\");\n }\n\n const clientIndexPath = `${distDir}/${publicDir}/index.html`;\n const clientBuilt = await this.fs.exists(clientIndexPath);\n\n const conditions: string[] = [];\n\n // bun:\n // - alepha\n // - react-dom\n\n if (flags.bun) {\n conditions.push(\"bun\");\n }\n\n // workerd:\n // - react-dom\n // - postgres\n if (options.cloudflare) {\n conditions.push(\"workerd\");\n }\n\n await buildServer({\n silent: true,\n entry: entry.server,\n distDir,\n clientDir: clientBuilt ? publicDir : undefined,\n stats,\n conditions,\n alepha,\n });\n\n // Server will handle index.html if both client & server are built\n if (clientBuilt) {\n await this.fs.rm(clientIndexPath);\n }\n },\n });\n\n // Copy assets\n await copyAssets({\n alepha,\n root,\n entry: `${distDir}/index.js`,\n distDir,\n run,\n });\n\n if (hasClient) {\n // Generate sitemap\n const sitemapHostname = flags.sitemap ?? options.sitemap?.hostname;\n if (sitemapHostname) {\n await generateSitemap({\n alepha,\n baseUrl: sitemapHostname,\n output: `${distDir}/${publicDir}/sitemap.xml`,\n run,\n });\n }\n\n // Pre-render static pages (always enabled)\n await prerenderPages({\n alepha,\n dist: `${distDir}/${publicDir}`,\n compress: true,\n run,\n });\n }\n\n // Generate deployment configurations\n if (flags.vercel || options.vercel) {\n await run({\n name: \"add Vercel config\",\n handler: () =>\n generateVercel({\n distDir,\n clientDir: publicDir,\n config: options.vercel,\n }),\n });\n }\n\n if (flags.cloudflare || options.cloudflare) {\n await run({\n name: \"add Cloudflare config\",\n handler: () =>\n generateCloudflare({\n distDir,\n config: options.cloudflare?.config,\n }),\n });\n }\n\n if (flags.docker || options.docker) {\n await run({\n name: \"add Docker config\",\n handler: () =>\n generateDocker({\n distDir,\n ...options.docker,\n }),\n });\n }\n },\n });\n}\n","import { $command } from \"alepha/command\";\n\nexport class CleanCommand {\n /**\n * Clean the project, removing the \"dist\" directory\n */\n public readonly clean = $command({\n name: \"clean\",\n description: \"Clean the project\",\n handler: async ({ run }) => {\n await run.rm(\"./dist\");\n },\n });\n}\n","import { $inject, AlephaError, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport type {\n DatabaseProvider,\n DrizzleKitProvider,\n RepositoryProvider,\n} from \"alepha/orm\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nconst drizzleCommandFlags = t.object({\n provider: t.optional(\n t.text({\n description:\n \"Database provider name to target (e.g., 'postgres', 'sqlite')\",\n }),\n ),\n mode: t.optional(\n t.text({\n description:\n \"Environment variable file(s) to load (e.g., 'production' to load .env.production) https://vite.dev/guide/env-and-mode\",\n }),\n ),\n});\n\nexport class DbCommand {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly utils = $inject(AlephaCliUtils);\n\n /**\n * Check if database migrations are up to date.\n */\n protected readonly check = $command({\n name: \"check-migrations\",\n description: \"Check if database migration files are up to date\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ args, root }) => {\n const rootDir = root;\n this.log.debug(`Using project root: ${rootDir}`);\n\n const { alepha } = await this.utils.loadAlephaFromServerEntryFile(\n rootDir,\n args,\n );\n\n const repositoryProvider =\n alepha.inject<RepositoryProvider>(\"RepositoryProvider\");\n const drizzleKitProvider =\n alepha.inject<DrizzleKitProvider>(\"DrizzleKitProvider\");\n const accepted = new Set<string>([]);\n\n for (const primitive of repositoryProvider.getRepositories()) {\n const provider = primitive.provider;\n const providerName = provider.name;\n if (accepted.has(providerName)) {\n continue;\n }\n\n accepted.add(providerName);\n\n const migrationDir = this.fs.join(rootDir, \"migrations\", providerName);\n\n const journalBuffer = await this.fs\n .readFile(`${migrationDir}/meta/_journal.json`)\n .catch(() => null);\n\n if (!journalBuffer) {\n this.log.info(\"No migration journal found.\");\n return;\n }\n\n const journal = JSON.parse(journalBuffer.toString(\"utf-8\"));\n const lastMigration = journal.entries[journal.entries.length - 1];\n const snapshotBuffer = await this.fs.readFile(\n `${migrationDir}/meta/${String(lastMigration.idx).padStart(4, \"0\")}_snapshot.json`,\n );\n const lastSnapshot = JSON.parse(snapshotBuffer.toString(\"utf-8\"));\n\n const models = drizzleKitProvider.getModels(provider);\n const kit = drizzleKitProvider.importDrizzleKit();\n const now = kit.generateDrizzleJson(models, lastSnapshot.id);\n\n const migrationStatements = await new Promise<Array<any>>((resolve) => {\n (async () => {\n const timer = setTimeout(() => {\n resolve([{ message: \"Migration generation timed out.\" }]);\n }, 5000);\n const statements = await kit.generateMigration(lastSnapshot, now);\n clearTimeout(timer);\n resolve(statements);\n })();\n });\n\n if (migrationStatements.length === 0) {\n this.log.info(\"No changes detected.\");\n return;\n }\n\n this.log.info(\"\");\n this.log.info(\"Detected migration statements:\");\n this.log.info(\"\");\n for (const stmt of migrationStatements) {\n this.log.info(stmt);\n }\n this.log.info(\"\");\n\n this.log.info(\n `At least ${migrationStatements.length} change(s) detected.`,\n );\n this.log.info(\n \"Please, run 'alepha db:generate' to update the migration files.\",\n );\n this.log.info(\"\");\n\n throw new AlephaError(\"Database migrations are not up to date.\");\n }\n },\n });\n\n /**\n * Generate database migration files\n */\n protected readonly generate = $command({\n name: \"generate\",\n description: \"Generate migration files based on current database schema\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: t.extend(drizzleCommandFlags, {\n custom: t.optional(\n t.text({\n description:\n \"Custom migration name for drizzle-kit generate --custom\",\n }),\n ),\n }),\n handler: async ({ args, flags, root }) => {\n const commandFlags = flags.custom\n ? `--custom=${flags.custom}`\n : undefined;\n\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"generate\",\n commandFlags,\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Generate '${providerName}' migrations (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Push database schema changes directly to the database\n */\n protected readonly push = $command({\n name: \"push\",\n description: \"Push database schema changes directly to the database\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"push\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Push '${providerName}' schema (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Apply pending database migrations\n */\n protected readonly migrate = $command({\n name: \"migrate\",\n description: \"Apply pending database migrations\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"migrate\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Migrate '${providerName}' database (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Launch Drizzle Studio database browser\n */\n protected readonly studio = $command({\n name: \"studio\",\n description: \"Launch Drizzle Studio database browser\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"studio\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Launch Studio for '${providerName}' (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Parent command for database operations.\n */\n public readonly db = $command({\n name: \"db\",\n description: \"Database management commands\",\n children: [this.check, this.generate, this.push, this.migrate, this.studio],\n handler: async ({ help }) => {\n help();\n },\n });\n\n /**\n * Run a drizzle-kit command for all database providers in an Alepha instance.\n */\n public async runDrizzleKitCommand(options: {\n root: string;\n args?: string;\n command: string;\n commandFlags?: string;\n provider?: string;\n logMessage: (providerName: string, dialect: string) => string;\n env?: string;\n }): Promise<void> {\n const rootDir = options.root;\n\n const envFiles = [\".env\"];\n if (options.env) {\n envFiles.push(`.env.${options.env}`);\n }\n\n await this.utils.loadEnv(rootDir, envFiles);\n\n this.log.debug(`Using project root: ${rootDir}`);\n\n const { alepha, entry } = await this.utils.loadAlephaFromServerEntryFile(\n rootDir,\n options.args,\n );\n\n const drizzleKitProvider =\n alepha.inject<DrizzleKitProvider>(\"DrizzleKitProvider\");\n const repositoryProvider =\n alepha.inject<RepositoryProvider>(\"RepositoryProvider\");\n const accepted = new Set<string>([]);\n\n for (const primitive of repositoryProvider.getRepositories()) {\n const provider = primitive.provider;\n const providerName = provider.name;\n const dialect = provider.dialect;\n\n if (providerName === \"\") {\n continue;\n }\n\n if (accepted.has(providerName)) {\n continue;\n }\n accepted.add(providerName);\n\n // Skip if provider filter is set and doesn't match\n if (options.provider && options.provider !== providerName) {\n this.log.debug(\n `Skipping provider '${providerName}' (filter: ${options.provider})`,\n );\n continue;\n }\n\n this.log.info(\"\");\n this.log.info(options.logMessage(providerName, dialect));\n\n const drizzleConfigJsPath = await this.prepareDrizzleConfig({\n kit: drizzleKitProvider,\n provider,\n providerName,\n providerUrl: provider.url,\n providerDriver: provider.driver,\n dialect,\n entry,\n rootDir,\n });\n\n const flags = options.commandFlags ? ` ${options.commandFlags}` : \"\";\n await this.utils.exec(\n `drizzle-kit ${options.command} --config=${drizzleConfigJsPath}${flags}`,\n {\n env: {\n NODE_OPTIONS: \"--import tsx\",\n },\n },\n );\n }\n }\n\n /**\n * Prepare Drizzle configuration files for a database provider.\n */\n public async prepareDrizzleConfig(options: {\n kit: any;\n provider: DatabaseProvider;\n providerName: string;\n providerUrl: string;\n providerDriver: string;\n dialect: string;\n entry: string;\n rootDir: string;\n }): Promise<string> {\n const models = Object.keys(options.kit.getModels(options.provider));\n const entitiesJs = this.utils.generateEntitiesJs(\n options.entry,\n options.providerName,\n models,\n );\n\n const entitiesJsPath = await this.utils.writeConfigFile(\n \"entities.js\",\n entitiesJs,\n options.rootDir,\n );\n\n const config: Record<string, any> = {\n schema: entitiesJsPath,\n out: `./migrations/${options.providerName}`,\n dialect: options.dialect,\n dbCredentials: {\n url: options.providerUrl,\n },\n };\n\n if (options.provider.schema) {\n config.schemaFilter = options.provider.schema;\n }\n\n if (options.providerDriver === \"d1\") {\n config.driver = \"d1-http\";\n }\n\n if (options.providerDriver === \"pglite\") {\n config.driver = \"pglite\";\n }\n\n if (options.dialect === \"sqlite\") {\n if (options.providerDriver === \"d1\") {\n const token = process.env.CLOUDFLARE_API_TOKEN;\n if (!token) {\n throw new AlephaError(\n \"CLOUDFLARE_API_TOKEN environment variable is not set. https://orm.drizzle.team/docs/guides/d1-http-with-drizzle-kit\",\n );\n }\n\n const accountId = process.env.CLOUDFLARE_ACCOUNT_ID;\n if (!accountId) {\n throw new AlephaError(\n \"CLOUDFLARE_ACCOUNT_ID environment variable is not set. https://orm.drizzle.team/docs/guides/d1-http-with-drizzle-kit\",\n );\n }\n\n const url = options.providerUrl;\n if (!url.startsWith(\"cloudflare-d1://\")) {\n throw new AlephaError(\n \"D1 provider URL must start with 'cloudflare-d1://'.\",\n );\n }\n\n const [, databaseId] = url\n .replace(\"cloudflare-d1://\", \"\")\n .replace(\"cloudflare-d1:\", \"\")\n .split(\":\");\n\n if (!databaseId) {\n throw new AlephaError(\n \"Database ID is missing in the D1 provider URL. Cloudflare D1 URL format: cloudflare-d1://<database_name>:<database_id>\",\n );\n }\n\n config.dbCredentials = {\n accountId,\n databaseId,\n token,\n };\n } else {\n let url = options.providerUrl;\n url = url.replace(\"sqlite://\", \"\").replace(\"file://\", \"\");\n url = this.fs.join(options.rootDir, url);\n\n config.dbCredentials = {\n url,\n };\n }\n }\n\n const drizzleConfigJs = `export default ${JSON.stringify(config, null, 2)}`;\n\n return await this.utils.writeConfigFile(\n \"drizzle.config.js\",\n drizzleConfigJs,\n options.rootDir,\n );\n }\n}\n","import { $inject, AlephaError, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\n\nexport class DeployCommand {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n\n /**\n * Deploy the project to a hosting platform (e.g., Vercel, Cloudflare, Surge)\n *\n * Deploy command can be overridden by creating a alepha.config.ts in the project root:\n *\n * ```ts\n * import { defineConfig } from \"alepha/cli\";\n *\n * export default defineConfig({\n * commands: {\n * deploy: {\n * handler: async ({ root, mode, flags }) => {\n * // Custom deployment logic here\n * },\n * },\n * },\n * });\n * ```\n */\n public readonly deploy = $command({\n name: \"deploy\",\n description:\n \"Deploy the project to a hosting platform (e.g., Vercel, Cloudflare, Surge)\",\n mode: true,\n flags: t.object({\n build: t.boolean({\n description: \"Build the project before deployment\",\n default: false,\n }),\n migrate: t.boolean({\n description:\n \"Run database migrations before deployment (if applicable)\",\n default: false,\n }),\n }),\n env: t.object({\n VERCEL_TOKEN: t.optional(\n t.text({\n description: \"Vercel API token (e.g., xxxxxxxxxxxxxxxxxxxx)\",\n }),\n ),\n VERCEL_ORG_ID: t.optional(\n t.text({\n description: \"Vercel organization ID (e.g., team_abc123...)\",\n }),\n ),\n VERCEL_PROJECT_ID: t.optional(\n t.text({ description: \"Vercel project ID (e.g., prj_abc123...)\" }),\n ),\n CLOUDFLARE_API_TOKEN: t.optional(\n t.text({\n description: \"Cloudflare API token (e.g., xxxx-xxxx-xxxx-xxxx)\",\n }),\n ),\n CLOUDFLARE_ACCOUNT_ID: t.optional(\n t.text({\n description: \"Cloudflare account ID (e.g., abc123def456...)\",\n }),\n ),\n }),\n handler: async ({ root, mode, flags }) => {\n if (flags.build) {\n await this.utils.exec(\"alepha build\");\n }\n\n // Vercel deployment\n if (await this.utils.exists(root, \"dist/vercel.json\")) {\n if (flags.migrate) {\n this.log.debug(\"Running database migrations before deployment...\");\n await this.utils.exec(`alepha db migrate --mode=${mode}`);\n }\n await this.pm.ensureDependency(root, \"vercel\", {\n dev: true,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n const command =\n `vercel . --cwd=dist ${mode === \"production\" ? \"--prod\" : \"\"}`.trim();\n this.log.debug(`Deploying to Vercel with command: ${command}`);\n await this.utils.exec(command);\n return;\n }\n\n // Cloudflare deployment\n if (await this.utils.exists(root, \"dist/wrangler.jsonc\")) {\n if (flags.migrate) {\n this.log.debug(\"Running database migrations before deployment...\");\n await this.utils.exec(`alepha db migrate --mode=${mode}`);\n }\n await this.pm.ensureDependency(root, \"wrangler\", {\n dev: true,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n const command =\n `wrangler deploy ${mode === \"production\" ? \"\" : \"--env preview\"} --config=dist/wrangler.jsonc`.trim();\n this.log.info(`Deploying to Cloudflare with command: ${command}`);\n await this.utils.exec(command);\n return;\n }\n\n // Surge deployment\n if (await this.utils.exists(root, \"dist/public/404.html\")) {\n await this.pm.ensureDependency(root, \"surge\", {\n dev: true,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n const distPath = this.fs.join(root, \"dist/public\");\n this.log.debug(`Deploying to Surge from directory: ${distPath}`);\n await this.utils.exec(`surge ${distPath}`);\n return;\n }\n\n throw new AlephaError(\n \"No deployment configuration found in the dist folder.\",\n );\n },\n });\n}\n","import { $inject, type Alepha, AlephaError } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { importVite, importViteReact, viteAlephaSsrPreload } from \"alepha/vite\";\nimport type { InlineConfig, Plugin, ViteDevServer } from \"vite\";\nimport type { AppEntry } from \"./AppEntryProvider.ts\";\nimport { ViteTemplateProvider } from \"./ViteTemplateProvider.ts\";\n\nexport interface ViteDevServerOptions {\n /**\n * Root directory of the project.\n */\n root: string;\n\n /**\n * Path to the server entry file.\n */\n entry: AppEntry;\n\n /**\n * Port to run the dev server on.\n */\n port?: number;\n\n /**\n * Host to bind the dev server to.\n */\n host?: string | boolean;\n}\n\n/**\n * Vite development server with Alepha integration.\n *\n * Architecture:\n * - Vite runs in middleware mode (no HTTP server)\n * - Alepha is the HTTP server via server:onRequest event\n * - Request flow: Page requests → Alepha SSR, Assets → Vite middleware\n *\n * HMR Strategy:\n * - Browser-only changes (CSS, client components) → Vite HMR (React Fast Refresh)\n * - Server-only changes → Restart Alepha → Full browser reload\n * - Shared changes → Restart Alepha → Let Vite HMR propagate\n *\n * Features:\n * - Automatic .env reload detection\n * - Error recovery on next file change\n * - Optimized module invalidation (only changed files + importers)\n */\nexport class ViteDevServerProvider {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly templateProvider = $inject(ViteTemplateProvider);\n protected server!: ViteDevServer;\n protected options!: ViteDevServerOptions;\n protected alepha: Alepha | null = null;\n protected hasError = false;\n protected changedFiles = new Set<string>();\n\n public async init(options: ViteDevServerOptions): Promise<Alepha> {\n this.options = options;\n await this.createViteServer();\n return await this.loadAlepha(true);\n }\n\n public async start(): Promise<void> {\n await this.alepha?.start();\n }\n\n /**\n * Create the Vite server in middleware mode.\n */\n protected async createViteServer(): Promise<void> {\n const { createServer } = await importVite();\n const viteReact = await importViteReact();\n\n const plugins: Plugin[] = [];\n if (viteReact) plugins.push(viteReact());\n plugins.push(viteAlephaSsrPreload());\n plugins.push(this.createHmrPlugin());\n\n this.server = await createServer({\n root: this.options.root,\n plugins,\n server: { middlewareMode: true },\n appType: \"custom\",\n customLogger: {\n info: () => {},\n warn: this.log.warn.bind(this.log),\n error: this.log.error.bind(this.log),\n warnOnce: this.log.warn.bind(this.log),\n clearScreen: () => {},\n hasWarned: false,\n hasErrorLogged: () => false,\n },\n } satisfies InlineConfig);\n\n // Intercept .env changes (Vite calls restart() for .env files)\n this.server.restart = async () => {\n const startTime = Date.now();\n try {\n this.hasError = true; // Force full invalidation for env changes\n await this.loadAlepha(false);\n await this.alepha?.start();\n this.log.debug(`Env reloaded in ${Date.now() - startTime}ms`);\n this.sendBrowserReload();\n } catch (err) {\n this.hasError = true;\n this.log.error(\"Reload failed\", err);\n this.log.warn(\"Waiting for file changes to retry...\");\n this.alepha = null;\n }\n };\n }\n\n /**\n * Vite plugin to handle HMR for Alepha.\n */\n protected createHmrPlugin(): Plugin {\n return {\n name: \"alepha-hmr\",\n handleHotUpdate: async (ctx) => {\n if (ctx.file.includes(\"/.idea/\")) return [];\n\n const firstModule = ctx.modules[0] as any;\n const isBrowserOnly = firstModule && !firstModule._ssrModule;\n const isServerOnly = firstModule && !firstModule._clientModule;\n\n // Browser-only: let Vite HMR handle it (React Fast Refresh)\n if (isBrowserOnly) return;\n\n // Server or shared change: restart Alepha\n const startTime = Date.now();\n\n try {\n this.changedFiles.add(ctx.file);\n await this.loadAlepha(false);\n await this.alepha?.start();\n this.log.debug(`Reloaded in ${Date.now() - startTime}ms`);\n\n // Server-only: full browser reload\n if (isServerOnly) {\n this.sendBrowserReload();\n return [];\n }\n\n // Shared: let HMR propagate to browser\n return;\n } catch (err) {\n this.hasError = true;\n this.log.error(\"Reload failed\", err);\n this.log.warn(\"Waiting for file changes to retry...\");\n this.alepha = null;\n return [];\n }\n },\n };\n }\n\n /**\n * Send browser reload signal via custom event.\n * Browser listens for 'alepha:reload' and does window.location.reload()\n */\n protected sendBrowserReload(): void {\n this.server.ws.send({\n type: \"custom\",\n event: \"alepha:reload\",\n data: {},\n });\n }\n\n /**\n * Setup environment variables for dev mode.\n */\n protected async setupEnvironment(): Promise<void> {\n const { loadEnv } = await importVite();\n const mode = process.env.NODE_ENV || \"development\";\n const env = loadEnv(mode, this.options.root, \"\");\n\n process.env.NODE_ENV ??= \"development\";\n process.env.VITE_ALEPHA_DEV = \"true\";\n process.env.SERVER_HOST ??= this.options.host?.toString() ?? \"localhost\";\n process.env.SERVER_PORT ??= String(\n this.options.port ??\n (process.env.SERVER_PORT ? Number(process.env.SERVER_PORT) : 3000),\n );\n\n // Merge into process.env (only set if not already defined)\n for (const [key, value] of Object.entries(env)) {\n process.env[key] ??= value;\n }\n }\n\n /**\n * Load or reload the Alepha instance.\n */\n protected async loadAlepha(isInitialLoad = false): Promise<Alepha> {\n if (this.alepha) {\n await this.alepha\n .stop()\n .catch((err) => this.log.warn(\"Error stopping Alepha\", err));\n this.alepha = null;\n }\n\n if (isInitialLoad || this.hasError) {\n this.server.moduleGraph.invalidateAll();\n } else {\n this.invalidateModulesWithImporters();\n }\n this.changedFiles.clear();\n\n // Snapshot and restore process.env to isolate each reload\n const envSnapshot = { ...process.env };\n await this.setupEnvironment();\n\n await this.server.ssrLoadModule(this.options.entry.server);\n\n const alepha: Alepha = (globalThis as any).__alepha;\n if (!alepha) {\n throw new AlephaError(\n \"Alepha instance not found after loading entry module\",\n );\n }\n\n this.alepha = alepha;\n await this.setupAlepha();\n\n this.hasError = false;\n process.env = envSnapshot;\n\n return alepha;\n }\n\n public hasReact(): boolean {\n try {\n this.alepha?.inject(\"ReactServerProvider\");\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Setup Alepha instance with Vite middleware and template.\n */\n protected async setupAlepha(): Promise<void> {\n if (!this.alepha || !this.hasReact()) {\n return;\n }\n\n const template = await this.server.transformIndexHtml(\n \"/\",\n this.templateProvider.generateIndexHtml(this.options.entry),\n );\n\n this.alepha.store.set(\"alepha.react.server.template\", template);\n\n this.alepha.events.on(\"server:onRequest\", {\n priority: \"first\",\n callback: async ({ request }) => {\n const node = request.raw.node;\n if (!node || this.isPageRequest(node.req)) return;\n\n const handled = await this.runViteMiddleware(\n node.req,\n node.res,\n request,\n );\n if (handled) {\n request.reply.status = node.res.statusCode || 200;\n request.reply.body = null;\n }\n },\n });\n }\n\n /**\n * Check if request is for an HTML page (not an asset).\n */\n protected isPageRequest(req: any): boolean {\n const url = req.url || \"/\";\n\n // Root and index.html are page requests\n if (url === \"/\" || url === \"/index.html\") return true;\n\n // Vite internal routes\n if (url.startsWith(\"/@\") || url.startsWith(\"/__vite\")) return false;\n\n // Files with extensions are assets\n if (/\\.\\w+$/.test(url.split(\"?\")[0])) return false;\n\n return true;\n }\n\n /**\n * Run Vite middleware and detect if it handled the request.\n */\n protected async runViteMiddleware(\n req: any,\n res: any,\n ctx: { metadata: any },\n ): Promise<boolean> {\n return new Promise((resolve) => {\n let resolved = false;\n\n const done = (handled: boolean) => {\n if (resolved) return;\n resolved = true;\n if (handled) ctx.metadata.vite = true;\n resolve(handled);\n };\n\n res.on(\"finish\", () => done(true));\n res.on(\"close\", () => res.headersSent && done(true));\n\n this.server.middlewares(req, res, () => done(false));\n\n // Check after microtask if Vite started writing (for async handlers)\n setImmediate(() => {\n if (res.headersSent || res.writableEnded) {\n done(true);\n }\n });\n });\n }\n\n /**\n * Invalidate modules and all their importers.\n */\n protected invalidateModulesWithImporters(): void {\n const invalidated = new Set<string>();\n const queue: string[] = [...this.changedFiles];\n\n while (queue.length > 0) {\n const file = queue.pop()!;\n if (invalidated.has(file)) continue;\n\n const mod = this.server.moduleGraph.getModuleById(file);\n if (!mod) continue;\n\n this.server.moduleGraph.invalidateModule(mod);\n invalidated.add(file);\n\n for (const importer of mod.importers) {\n if (importer.id && !invalidated.has(importer.id)) {\n queue.push(importer.id);\n }\n }\n }\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { AppEntryProvider } from \"../providers/AppEntryProvider.ts\";\nimport { ViteDevServerProvider } from \"../providers/ViteDevServerProvider.ts\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class DevCommand {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n protected readonly alepha = $inject(Alepha);\n protected readonly viteDevServer = $inject(ViteDevServerProvider);\n protected readonly boot = $inject(AppEntryProvider);\n\n /**\n * Will run the project in watch mode.\n *\n * - If an index.html file is found in the project root, it will run Vite in dev mode.\n * - Otherwise, it will look for a server entry file and run it with tsx in watch mode.\n */\n public readonly dev = $command({\n name: \"dev\",\n description: \"Run the project in development mode\",\n handler: async ({ root }) => {\n const [expo, react] = await Promise.all([\n this.pm.hasExpo(root),\n this.pm.hasReact(root),\n ]);\n\n await this.scaffolder.ensureConfig(root, {\n tsconfigJson: true,\n });\n\n if (expo) {\n await this.utils.exec(\"expo start\");\n return;\n }\n\n const entry = await this.boot.getAppEntry(root);\n this.log.debug(\"Entry file found\", { entry });\n\n // -> here, we assume we use Vite as runner (api or fullstack)\n // but it's planned to support Bun runner in the future as well\n\n // Ensure vite is installed before running\n await this.pm.ensureDependency(root, \"vite\", {\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n\n await this.viteDevServer.init({ root, entry });\n await this.viteDevServer.start();\n },\n });\n}\n","import { $atom, type Static, t } from \"alepha\";\n\n/**\n * Default scopes to ignore in changelog generation.\n * Commits with these scopes won't appear in release notes.\n */\nexport const DEFAULT_IGNORE = [\n \"project\",\n \"release\",\n \"starter\",\n \"example\",\n \"chore\",\n \"ci\",\n \"build\",\n \"test\",\n \"style\",\n];\n\n/**\n * Changelog configuration atom.\n *\n * Configure in `alepha.config.ts`:\n * ```ts\n * import { changelogOptions } from \"alepha/cli\";\n *\n * alepha.set(changelogOptions, {\n * ignore: [\"project\", \"release\", \"chore\", \"docs\"],\n * });\n * ```\n */\nexport const changelogOptions = $atom({\n name: \"alepha.cli.changelog.options\",\n schema: t.object({\n /**\n * Scopes to ignore (e.g., \"project\", \"release\", \"chore\").\n * Commits like `feat(chore): ...` will be excluded from changelog.\n */\n ignore: t.optional(t.array(t.string())),\n }),\n default: {\n ignore: DEFAULT_IGNORE,\n },\n});\n\nexport type ChangelogOptions = Static<typeof changelogOptions.schema>;\n","import { $logger } from \"alepha/logger\";\nimport {\n type ChangelogOptions,\n DEFAULT_IGNORE,\n} from \"../atoms/changelogOptions.ts\";\nimport type { Commit } from \"../commands/gen/changelog.ts\";\n\n/**\n * Service for parsing git commit messages into structured format.\n *\n * Only parses **conventional commits with a scope**:\n * - `feat(scope): description` → feature\n * - `fix(scope): description` → bug fix\n * - `feat(scope)!: description` → breaking change\n *\n * Commits without scope are ignored, allowing developers to commit\n * work-in-progress changes without polluting release notes:\n * - `cli: work in progress` → ignored (no type)\n * - `fix: quick patch` → ignored (no scope)\n * - `feat(cli): add command` → included\n */\nexport class GitMessageParser {\n protected readonly log = $logger();\n\n /**\n * Parse a git commit line into a structured Commit object.\n *\n * **Format:** `type(scope): description` or `type(scope)!: description`\n *\n * **Supported types:** feat, fix, docs, refactor, perf, revert\n *\n * **Breaking changes:** Use `!` before `:` (e.g., `feat(api)!: remove endpoint`)\n *\n * @returns Commit object or null if not matching/ignored\n */\n parseCommit(line: string, config: ChangelogOptions): Commit | null {\n // Extract hash and message from git log --oneline format\n const match = line.match(/^([a-f0-9]+)\\s+(.+)$/);\n if (!match) return null;\n\n const [, hash, message] = match;\n const ignore = config.ignore ?? DEFAULT_IGNORE;\n\n // Conventional commit with REQUIRED scope: type(scope): description\n // The `!` before `:` marks a breaking change\n const conventionalMatch = message.match(\n /^(feat|fix|docs|refactor|perf|revert)\\(([^)]+)\\)(!)?:\\s*(.+)$/i,\n );\n\n if (!conventionalMatch) {\n // No match - commit doesn't follow required format\n return null;\n }\n\n const [, type, scope, breakingMark, description] = conventionalMatch;\n\n // Check if scope should be ignored\n const baseScope = scope.split(\"/\")[0];\n if (ignore.includes(baseScope) || ignore.includes(scope)) {\n return null;\n }\n\n // Breaking change detection:\n // 1. Explicit `!` marker: feat(api)!: change\n // 2. Word \"breaking\" in description: feat(api): breaking change to auth\n const breaking =\n breakingMark === \"!\" || description.toLowerCase().includes(\"breaking\");\n\n return {\n hash: hash.substring(0, 8),\n type: type.toLowerCase(),\n scope,\n description: description.trim(),\n breaking,\n };\n }\n}\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { $inject, $use, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { changelogOptions } from \"../../atoms/changelogOptions.ts\";\nimport { GitMessageParser } from \"../../services/GitMessageParser.ts\";\n\nexport {\n type ChangelogOptions,\n changelogOptions,\n DEFAULT_IGNORE,\n} from \"../../atoms/changelogOptions.ts\";\nexport { GitMessageParser } from \"../../services/GitMessageParser.ts\";\n\nconst execAsync = promisify(exec);\n\n// =============================================================================\n// GIT PROVIDER\n// =============================================================================\n\n/**\n * Git provider for executing git commands.\n * Can be substituted in tests with a mock implementation.\n */\nexport class GitProvider {\n async exec(cmd: string, cwd: string): Promise<string> {\n const { stdout } = await execAsync(`git ${cmd}`, { cwd });\n return stdout;\n }\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface Commit {\n hash: string;\n type: string;\n scope: string | null;\n description: string;\n breaking: boolean;\n}\n\ninterface ChangelogEntry {\n features: Commit[];\n fixes: Commit[];\n}\n\n// =============================================================================\n// CHANGELOG COMMAND\n// =============================================================================\n\n/**\n * Changelog command for generating release notes from git commits.\n *\n * Usage:\n * - `alepha gen changelog` - Show unreleased changes since latest tag to HEAD\n * - `alepha gen changelog --from=1.0.0` - Show changes from version to HEAD\n * - `alepha gen changelog --from=1.0.0 --to=1.1.0` - Show changes between two refs\n * - `alepha gen changelog | tee -a CHANGELOG.md` - Append to file\n */\nexport class ChangelogCommand {\n protected readonly log = $logger();\n protected readonly git = $inject(GitProvider);\n protected readonly parser = $inject(GitMessageParser);\n protected readonly config = $use(changelogOptions);\n\n // ---------------------------------------------------------------------------\n // FORMATTING\n // ---------------------------------------------------------------------------\n\n /**\n * Format a single commit line.\n * Example: `- **cli**: add new command (\\`abc1234\\`)`\n * Breaking changes are flagged: `- **cli**: add new command [BREAKING] (\\`abc1234\\`)`\n */\n protected formatCommit(commit: Commit): string {\n const breaking = commit.breaking ? \" [BREAKING]\" : \"\";\n return `- **${commit.scope}**: ${commit.description}${breaking} (\\`${commit.hash}\\`)`;\n }\n\n /**\n * Format the changelog entry with sections.\n */\n protected formatEntry(entry: ChangelogEntry): string {\n const sections: string[] = [];\n\n if (entry.features.length > 0) {\n sections.push(\"### Features\\n\");\n for (const commit of entry.features) {\n sections.push(this.formatCommit(commit));\n }\n sections.push(\"\");\n }\n\n if (entry.fixes.length > 0) {\n sections.push(\"### Bug Fixes\\n\");\n for (const commit of entry.fixes) {\n sections.push(this.formatCommit(commit));\n }\n sections.push(\"\");\n }\n\n return sections.join(\"\\n\");\n }\n\n // ---------------------------------------------------------------------------\n // PARSING\n // ---------------------------------------------------------------------------\n\n /**\n * Parse git log output into a changelog entry.\n */\n protected parseCommits(commitsOutput: string): ChangelogEntry {\n const entry: ChangelogEntry = {\n features: [],\n fixes: [],\n };\n\n for (const line of commitsOutput.trim().split(\"\\n\")) {\n if (!line.trim()) continue;\n\n const commit = this.parser.parseCommit(line, this.config);\n if (!commit) {\n this.log.trace(\"Skipping commit\", { line });\n continue;\n }\n\n this.log.trace(\"Parsed commit\", { commit });\n\n // Categorize commit (breaking flag is preserved on the commit itself)\n if (commit.type === \"feat\") {\n entry.features.push(commit);\n } else if (commit.type === \"fix\") {\n entry.fixes.push(commit);\n }\n }\n\n return entry;\n }\n\n /**\n * Check if entry has any public commits.\n */\n protected hasChanges(entry: ChangelogEntry): boolean {\n return entry.features.length > 0 || entry.fixes.length > 0;\n }\n\n /**\n * Get the latest version tag.\n */\n protected async getLatestTag(\n git: (cmd: string) => Promise<string>,\n ): Promise<string | null> {\n const tagsOutput = await git(\"tag --sort=-version:refname\");\n const tags = tagsOutput\n .trim()\n .split(\"\\n\")\n .filter((tag) => tag.match(/^\\d+\\.\\d+\\.\\d+$/));\n\n return tags[0] || null;\n }\n\n // ---------------------------------------------------------------------------\n // COMMAND\n // ---------------------------------------------------------------------------\n\n public readonly command = $command({\n name: \"changelog\",\n description:\n \"Generate changelog from conventional commits (outputs to stdout)\",\n flags: t.object({\n /**\n * Show changes from this ref (tag, commit, branch).\n * Defaults to the latest version tag.\n * Example: --from=1.0.0\n */\n from: t.optional(\n t.string({\n aliases: [\"f\"],\n description: \"Starting ref (default: latest tag)\",\n }),\n ),\n /**\n * Show changes up to this ref (tag, commit, branch).\n * Defaults to HEAD.\n * Example: --to=main\n */\n to: t.optional(\n t.string({\n aliases: [\"t\"],\n description: \"Ending ref (default: HEAD)\",\n }),\n ),\n }),\n handler: async ({ flags, root }) => {\n const git = (cmd: string) => this.git.exec(cmd, root);\n\n // Determine the starting point\n let fromRef: string;\n\n if (flags.from) {\n // User specified a ref\n fromRef = flags.from;\n this.log.debug(\"Using specified from ref\", { from: fromRef });\n } else {\n // Use latest tag\n const latestTag = await this.getLatestTag(git);\n if (!latestTag) {\n process.stdout.write(\"No version tags found in repository\\n\");\n return;\n }\n fromRef = latestTag;\n this.log.debug(\"Using latest tag\", { from: fromRef });\n }\n\n // Determine the ending point\n const toRef = flags.to || \"HEAD\";\n this.log.debug(\"Using to ref\", { to: toRef });\n\n // Get commits in range\n const commitsOutput = await git(`log ${fromRef}..${toRef} --oneline`);\n\n if (!commitsOutput.trim()) {\n process.stdout.write(`No changes in range ${fromRef}..${toRef}\\n`);\n return;\n }\n\n // Parse and format\n const entry = this.parseCommits(commitsOutput);\n\n if (!this.hasChanges(entry)) {\n process.stdout.write(\n `No public changes in range ${fromRef}..${toRef}\\n`,\n );\n return;\n }\n\n // Output the formatted changelog (no header - caller adds it if needed)\n process.stdout.write(this.formatEntry(entry));\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../../services/AlephaCliUtils.ts\";\n\nexport class GenEnvCommand {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly fs = $inject(FileSystemProvider);\n\n public readonly command = $command({\n name: \"env\",\n description: \"Extract environment variables from server entry file\",\n flags: t.object({\n out: t.optional(\n t.text({\n aliases: [\"o\"],\n description: \"Output file path (e.g., .env)\",\n }),\n ),\n }),\n handler: async ({ root, flags }) => {\n const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);\n\n try {\n const { env } = alepha.dump();\n\n let dotEnvFile = \"\";\n for (const [key, value] of Object.entries(env)) {\n if (value.description) {\n dotEnvFile += `# ${value.description.split(\"\\n\").join(\"\\n# \")}\\n`;\n }\n if (value.required && !value.default) {\n dotEnvFile += `# (required)\\n`;\n }\n if (value.enum) {\n dotEnvFile += `# Possible values: ${value.enum.join(\", \")}\\n`;\n }\n dotEnvFile += `#${key}=${value.default || \"\"}\\n\\n`;\n }\n\n if (flags.out) {\n await this.fs.writeFile(this.fs.join(root, flags.out), dotEnvFile);\n } else {\n this.log.info(dotEnvFile);\n }\n } catch (err) {\n this.log.error(\"Failed to extract environment variables\", err);\n }\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { ServerSwaggerProvider } from \"alepha/server/swagger\";\nimport { AlephaCliUtils } from \"../../services/AlephaCliUtils.ts\";\n\nexport class OpenApiCommand {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly fs = $inject(FileSystemProvider);\n\n public readonly command = $command({\n name: \"openapi\",\n description: \"Generate OpenAPI specification from actions\",\n flags: t.object({\n out: t.optional(\n t.text({\n aliases: [\"o\"],\n description: \"Output file path\",\n }),\n ),\n }),\n handler: async ({ root, flags }) => {\n const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);\n\n try {\n const openapiProvider = alepha.inject(\n ServerSwaggerProvider,\n ) as ServerSwaggerProvider;\n\n await alepha.events.emit(\"configure\", alepha);\n\n let json: any = openapiProvider.json;\n\n if (!json) {\n json = openapiProvider.generateSwaggerDoc({\n info: {\n title: \"API Documentation\",\n version: \"1.0.0\",\n },\n });\n }\n\n if (!json) {\n this.log.error(\"No actions found to generate OpenAPI specification.\");\n return;\n }\n\n if (flags.out) {\n await this.fs.writeFile(\n this.fs.join(root, flags.out),\n JSON.stringify(json, null, 2),\n );\n } else {\n this.log.info(JSON.stringify(json, null, 2));\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes(\"Service not found\")) {\n this.log.error(\n \"Missing $swagger() primitive in your server configuration.\",\n );\n return;\n }\n\n this.log.error(`OpenAPI generation failed - ${message}`, err);\n }\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { ChangelogCommand } from \"./gen/changelog.ts\";\nimport { GenEnvCommand } from \"./gen/env.ts\";\nimport { OpenApiCommand } from \"./gen/openapi.ts\";\n\nexport class GenCommand {\n protected readonly changelog = $inject(ChangelogCommand);\n protected readonly openapi = $inject(OpenApiCommand);\n protected readonly genEnv = $inject(GenEnvCommand);\n\n public readonly gen = $command({\n name: \"gen\",\n description: \"Generate code, documentation, ...\",\n children: [\n this.changelog.command,\n this.openapi.command,\n this.genEnv.command,\n ],\n handler: async ({ help }) => {\n help();\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class InitCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n protected readonly fs = $inject(FileSystemProvider);\n\n /**\n * Ensure the project has the necessary Alepha configuration files.\n * Add the correct dependencies to package.json and install them.\n */\n public readonly init = $command({\n name: \"init\",\n description: \"Add missing Alepha configuration files to the project\",\n args: t.optional(\n t.text({\n title: \"path\",\n trim: true,\n lowercase: true,\n }),\n ),\n flags: t.object({\n agent: t.optional(\n t.boolean({\n aliases: [\"a\"],\n description: \"Add CLAUDE.md for Claude Code AI assistant\",\n }),\n ),\n // choose package manager\n yarn: t.optional(t.boolean({ description: \"Use Yarn package manager\" })),\n pnpm: t.optional(t.boolean({ description: \"Use pnpm package manager\" })),\n npm: t.optional(t.boolean({ description: \"Use npm package manager\" })),\n bun: t.optional(t.boolean({ description: \"Use Bun package manager\" })),\n // choose which dependencies to add\n react: t.optional(\n t.boolean({\n aliases: [\"r\"],\n description: \"Include Alepha React dependencies\",\n }),\n ),\n ui: t.optional(\n t.boolean({ description: \"Include Alepha UI dependencies\" }),\n ),\n test: t.optional(\n t.boolean({ description: \"Include Vitest and create test directory\" }),\n ),\n force: t.optional(\n t.boolean({\n aliases: [\"f\"],\n description: \"Override existing files\",\n }),\n ),\n }),\n handler: async ({ run, flags, root, args }) => {\n if (flags.react) {\n flags.ui = true;\n }\n\n if (args) {\n root = this.fs.join(root, args);\n await this.fs.mkdir(root);\n }\n\n const isExpo = await this.pm.hasExpo(root);\n\n const force = !!flags.force;\n\n await run({\n name: \"ensuring configuration files\",\n handler: async () => {\n await this.scaffolder.ensureConfig(root, {\n force,\n tsconfigJson: true,\n packageJson: flags,\n biomeJson: true,\n editorconfig: true,\n indexHtml: !!flags.react && !isExpo,\n claudeMd: flags.agent\n ? { react: !!flags.react, ui: !!flags.ui }\n : false,\n });\n\n // Create API project structure if not React\n if (!flags.react) {\n await this.scaffolder.ensureApiProject(root, { force });\n }\n },\n });\n\n // TODO: check if all alepha dependencies are same version\n\n const pmName = await this.pm.getPackageManager(root, flags);\n if (pmName === \"yarn\") {\n await this.pm.ensureYarn(root);\n await run(\"yarn set version stable\", { root });\n } else if (pmName === \"bun\") {\n await this.pm.ensureBun(root);\n } else if (pmName === \"pnpm\") {\n await this.pm.ensurePnpm(root);\n } else {\n await this.pm.ensureNpm(root);\n }\n\n await run(`${pmName} install`, {\n alias: `installing dependencies with ${pmName}`,\n root,\n });\n\n if (!isExpo) {\n await this.pm.ensureDependency(root, \"vite\", {\n run,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n }\n\n await this.pm.ensureDependency(root, \"@biomejs/biome\", {\n run,\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n\n // Install vitest and create test directory if --test flag is set\n if (flags.test) {\n await this.scaffolder.ensureTestDir(root);\n await run(\n `${pmName} ${pmName === \"yarn\" ? \"add\" : \"install\"} -D vitest`,\n {\n alias: \"setup testing with Vitest\",\n },\n );\n }\n\n await run(`${pmName} run lint`, {\n alias: \"running linter\",\n root,\n });\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class LintCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n\n public readonly lint = $command({\n name: \"lint\",\n description: \"Run linter across the codebase using Biome\",\n handler: async ({ root }) => {\n await this.scaffolder.ensureConfig(root, { biomeJson: true });\n await this.pm.ensureDependency(root, \"@biomejs/biome\", {\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n await this.utils.exec(\"biome check --fix\");\n },\n });\n}\n","import { $inject, Alepha, t } from \"alepha\";\nimport { $command, CliProvider } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { version } from \"../version.ts\";\n\nexport class RootCommand {\n protected readonly log = $logger();\n protected readonly cli = $inject(CliProvider);\n protected readonly alepha = $inject(Alepha);\n protected readonly color = $inject(ConsoleColorProvider);\n\n /**\n * Called when no command is provided\n */\n public readonly root = $command({\n root: true,\n flags: t.object({\n version: t.optional(\n t.boolean({\n description: \"Show Alepha CLI version\",\n aliases: [\"v\"],\n }),\n ),\n }),\n handler: async ({ flags }) => {\n if (flags.version) {\n this.log.info(this.color.set(\"WHITE_BOLD\", `Alepha v${version}`));\n if (this.alepha.isBun()) {\n this.log.info(this.color.set(\"GREY_DARK\", `└─ Bun v${Bun.version}`));\n } else {\n this.log.info(\n this.color.set(\"GREY_DARK\", `└─ Node ${process.version}`),\n );\n }\n return;\n }\n\n this.cli.printHelp();\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\nimport { ProjectScaffolder } from \"../services/ProjectScaffolder.ts\";\n\nexport class TestCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly scaffolder = $inject(ProjectScaffolder);\n\n public readonly test = $command({\n name: \"test\",\n description: \"Run tests using Vitest\",\n flags: t.object({\n config: t.optional(\n t.string({\n description: \"Path to Vitest config file\",\n alias: \"c\",\n }),\n ),\n }),\n env: t.object({\n VITEST_ARGS: t.optional(\n t.string({\n default: \"\",\n description:\n \"Additional arguments to pass to Vitest. E.g., --coverage\",\n }),\n ),\n }),\n handler: async ({ root, flags, env }) => {\n await this.scaffolder.ensureConfig(root, {\n tsconfigJson: true,\n });\n\n // Ensure vitest is installed before running\n await this.pm.ensureDependency(root, \"vitest\", {\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n\n const config = flags.config ? `--config=${flags.config}` : \"\";\n\n await this.utils.exec(`vitest run ${config} ${env.VITEST_ARGS}`);\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\n\nexport class TypecheckCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n protected readonly log = $logger();\n\n /**\n * Run TypeScript type checking across the codebase with no emit.\n */\n public readonly typecheck = $command({\n name: \"typecheck\",\n aliases: [\"tc\"],\n description: \"Check TypeScript types across the codebase\",\n handler: async ({ root }) => {\n this.log.info(\"Starting TypeScript type checking...\");\n await this.pm.ensureDependency(root, \"typescript\", {\n exec: (cmd, opts) => this.utils.exec(cmd, opts),\n });\n await this.utils.exec(\"tsc --noEmit\");\n this.log.info(\"TypeScript type checking completed successfully.\");\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { PackageManagerUtils } from \"../services/PackageManagerUtils.ts\";\n\nexport class VerifyCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly pm = $inject(PackageManagerUtils);\n\n /**\n * Run a series of verification commands to ensure code quality and correctness.\n *\n * This command runs the following checks in order:\n * - Clean the project\n * - Format the code\n * - Lint the code\n * - Run tests (if Vitest is a dev dependency)\n * - Check database migrations (if a migrations directory exists)\n * - Type check the code\n * - Build the project\n * - Clean the project again\n */\n public readonly verify = $command({\n name: \"verify\",\n description: \"Verify the Alepha project\",\n handler: async ({ root, run }) => {\n await run(\"alepha clean\");\n await run(\"alepha format\");\n await run(\"alepha lint\");\n\n await run(\"alepha typecheck\");\n\n const pkg = await this.pm.readPackageJson(root);\n if (pkg.devDependencies?.vitest) {\n await run(\"alepha test\");\n }\n\n if (await this.utils.exists(root, \"migrations\")) {\n await run(\"alepha db check-migrations\");\n }\n\n const isExpo = await this.pm.hasExpo(root);\n if (!isExpo) {\n await run(\"alepha build\");\n }\n await run(\"alepha clean\");\n },\n });\n}\n","import { $hook, $inject, $module, Alepha } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { BuildCommand } from \"../commands/build.ts\";\nimport { CleanCommand } from \"../commands/clean.ts\";\nimport { DbCommand } from \"../commands/db.ts\";\nimport { DeployCommand } from \"../commands/deploy.ts\";\nimport { DevCommand } from \"../commands/dev.ts\";\nimport { GitProvider } from \"../commands/gen/changelog.ts\";\nimport { GenCommand } from \"../commands/gen.ts\";\nimport { InitCommand } from \"../commands/init.ts\";\nimport { LintCommand } from \"../commands/lint.ts\";\nimport { RootCommand } from \"../commands/root.ts\";\nimport { TestCommand } from \"../commands/test.ts\";\nimport { TypecheckCommand } from \"../commands/typecheck.ts\";\nimport { VerifyCommand } from \"../commands/verify.ts\";\nimport { AppEntryProvider } from \"../providers/AppEntryProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Register `tsx` when running in Node.js, ignore for Bun.\n *\n * It's required to have a full TypeScript support. (mostly .tsx files)\n */\n\nif (typeof Bun === \"undefined\") {\n const { register } = await import(\"tsx/esm/api\");\n register();\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Allow to extend Alepha CLI via `alepha.config.ts` file located in the project root.\n */\n\nclass AlephaCliExtension {\n protected readonly alepha = $inject(Alepha);\n protected readonly fs = $inject(FileSystemProvider);\n\n protected readonly onConfigure = $hook({\n on: \"configure\",\n handler: async () => {\n const root = process.cwd();\n const extensionPath = this.fs.join(root, \"alepha.config.ts\");\n const hasExtension = await this.fs.exists(extensionPath);\n if (!hasExtension) {\n return;\n }\n\n // import\n const { default: Extension } = await import(extensionPath);\n if (typeof Extension !== \"function\") {\n return;\n }\n\n this.alepha.inject(Extension, {\n args: [this.alepha],\n });\n },\n });\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaCli = $module({\n name: \"alepha.cli\",\n services: [\n AlephaCliExtension,\n // Commands (one per file)\n BuildCommand,\n CleanCommand,\n DbCommand,\n DeployCommand,\n DevCommand,\n InitCommand,\n LintCommand,\n RootCommand,\n TestCommand,\n TypecheckCommand,\n VerifyCommand,\n GenCommand,\n // Support services\n AppEntryProvider,\n GitProvider,\n ],\n});\n","import { access, readdir, readFile } from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport { join } from \"node:path\";\nimport { $inject, AlephaError } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport type { InlineConfig } from \"tsdown\";\n\ninterface Module {\n name: string;\n dependencies: string[];\n native?: boolean;\n browser?: boolean;\n bun?: boolean;\n node?: boolean;\n}\n\nexport class AlephaPackageBuilderCli {\n src = \"src\";\n dist = \"dist\";\n fs = $inject(FileSystemProvider);\n\n make = $command({\n root: true,\n handler: async ({ run, root }) => {\n const modules: Array<Module> = [];\n\n const pkgBuffer = await this.fs.readFile(\"package.json\");\n const pkgData = JSON.parse(pkgBuffer.toString(\"utf-8\"));\n const packageName = pkgData.name as string;\n\n await run(\"analyze modules\", async () => {\n modules.push(\n ...(await analyzeModules(this.fs.join(root, this.src), packageName)),\n );\n });\n\n pkgData.exports = {};\n\n for (const item of modules) {\n let m = `./${item.name.replace(\"core\", \"\")}`;\n if (m.endsWith(\"/\")) m = m.slice(0, -1);\n const path = m;\n\n pkgData.exports[path] = {};\n // order is important here for compatibility\n pkgData.exports[path].types = `./src/${item.name}/index.ts`;\n if (item.native) {\n pkgData.exports[path][\"react-native\"] =\n `./src/${item.name}/index.native.ts`;\n } else if (item.browser) {\n pkgData.exports[path][\"react-native\"] =\n `./src/${item.name}/index.browser.ts`;\n }\n\n if (item.browser) {\n pkgData.exports[path].browser = `./src/${item.name}/index.browser.ts`;\n }\n\n if (item.bun) {\n pkgData.exports[path].bun = `./src/${item.name}/index.bun.ts`;\n }\n\n pkgData.exports[path].import = `./src/${item.name}/index.ts`;\n pkgData.exports[path].default = `./src/${item.name}/index.ts`;\n }\n\n if (packageName === \"alepha\") {\n pkgData.exports[\"./tsconfig.base\"] = \"./tsconfig.base.json\";\n pkgData.exports[\"./package.json\"] = \"./package.json\";\n }\n\n if (packageName === \"@alepha/ui\") {\n pkgData.exports[\"./styles\"] = \"./src/core/styles.css\";\n pkgData.exports[\"./json/styles\"] = \"./src/json/styles.css\";\n }\n\n await this.fs.writeFile(\"package.json\", JSON.stringify(pkgData, null, 2));\n\n const tmpDir = this.fs.join(root, \"node_modules/.alepha\");\n await this.fs.mkdir(tmpDir, { recursive: true }).catch(() => {});\n\n await this.fs.writeFile(\n this.fs.join(tmpDir, \"module-dependencies.json\"),\n JSON.stringify(modules, null, 2),\n );\n\n const tsconfigBuffer = await this.fs.readFile(\n this.fs.join(root, \"../../tsconfig.json\"),\n );\n\n const external: string[] = Object.keys(\n JSON.parse(tsconfigBuffer.toString(\"utf-8\")).compilerOptions.paths,\n );\n\n external.push(\"bun\");\n external.push(\"bun:sqlite\");\n\n await run.rm(this.dist);\n\n const build = async (item: Module) => {\n const entries: InlineConfig[] = [];\n const src = this.fs.join(root, this.src, item.name);\n const dest = this.fs.join(root, this.dist, item.name);\n\n entries.push({\n entry: this.fs.join(src, \"index.ts\"),\n outDir: dest,\n format: [\"esm\"],\n sourcemap: true,\n fixedExtension: false,\n platform: \"node\", // TODO: node must be enabled only if index.node.ts exists\n inlineOnly: false,\n external,\n dts: {\n sourcemap: true,\n },\n });\n\n if (item.native) {\n entries.push({\n entry: this.fs.join(src, \"index.native.ts\"),\n outDir: dest,\n platform: \"neutral\",\n sourcemap: true,\n dts: false,\n inlineOnly: false,\n external,\n });\n }\n\n if (item.browser) {\n entries.push({\n entry: this.fs.join(src, \"index.browser.ts\"),\n outDir: dest,\n platform: \"browser\",\n sourcemap: true,\n dts: false,\n inlineOnly: false,\n external,\n });\n }\n\n if (item.bun) {\n entries.push({\n entry: this.fs.join(src, \"index.bun.ts\"),\n outDir: dest,\n platform: \"node\",\n sourcemap: true,\n fixedExtension: false,\n dts: false,\n inlineOnly: false,\n external,\n });\n }\n\n const config = this.fs.join(\n tmpDir,\n `tsdown-${item.name.replace(\"/\", \"-\")}.config.js`,\n );\n await this.fs.writeFile(\n config,\n `export default ${JSON.stringify(entries, null, 2)};`,\n );\n\n // /!\\ Warning /!\\\n // avoid to call tsdown programmatically, when we spawn 8 processes at once it 'JavaScript heap out of memory' :---)\n await run(`npx tsdown -c=${config}`);\n };\n\n const concurrency = Math.ceil(os.cpus().length / 2);\n const queue = modules.slice();\n const workers: Promise<void>[] = [];\n for (let i = 0; i < concurrency; i++) {\n const worker = (async () => {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n await build(item);\n } else {\n await new Promise((r) => setTimeout(r, 100));\n }\n }\n })();\n workers.push(worker);\n }\n await Promise.all(workers);\n },\n });\n}\n\nexport default AlephaPackageBuilderCli;\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n async function scan(currentDir: string) {\n const entries = await readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n await scan(fullPath);\n } else if (entry.isFile() && /\\.(ts|tsx)$/.test(entry.name)) {\n files.push(fullPath);\n }\n }\n }\n\n await scan(dir);\n return files;\n}\n\nfunction removeComments(content: string): string {\n // Remove single-line comments\n let cleaned = content.replace(/\\/\\/.*$/gm, \"\");\n\n // Remove multi-line comments\n cleaned = cleaned.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n\n return cleaned;\n}\n\nfunction extractAlephaDependencies(\n content: string,\n packageName: string,\n moduleName: string,\n): string[] {\n const deps = new Set<string>();\n const cleanedContent = removeComments(content);\n\n // Match: from \"alepha/xxx\" or from 'alepha/xxx'\n const importRegex = new RegExp(\n `from \"${packageName}/([a-zA-Z0-9_/]+)\";`,\n \"g\",\n );\n\n const matches = cleanedContent.matchAll(importRegex);\n for (const match of matches) {\n deps.add(match[1]);\n }\n\n return Array.from(deps);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction detectCircularDependencies(modules: Module[]): void {\n const moduleMap = new Map(modules.map((m) => [m.name, m.dependencies]));\n\n function hasCycle(\n moduleName: string,\n visited: Set<string> = new Set(),\n path: string[] = [],\n ): string[] | null {\n if (visited.has(moduleName)) {\n // Found a cycle, return the path\n const cycleStart = path.indexOf(moduleName);\n return [...path.slice(cycleStart), moduleName];\n }\n\n const deps = moduleMap.get(moduleName);\n if (!deps) return null;\n\n visited.add(moduleName);\n path.push(moduleName);\n\n for (const dep of deps) {\n const cycle = hasCycle(dep, new Set(visited), [...path]);\n if (cycle) return cycle;\n }\n\n return null;\n }\n\n for (const module of modules) {\n const cycle = hasCycle(module.name);\n if (cycle) {\n throw new AlephaError(\n `Circular dependency detected: ${cycle.join(\" -> \")}`,\n );\n }\n }\n}\n\nexport async function analyzeModules(\n srcDir: string,\n packageName: string,\n): Promise<Module[]> {\n const modules: Module[] = [];\n\n async function scanDirectory(dir: string, prefix: string): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const moduleName = prefix ? `${prefix}/${entry.name}` : entry.name;\n const modulePath = join(dir, entry.name);\n\n // Check if this directory has an index.ts (is a module)\n const hasIndex = await fileExists(join(modulePath, \"index.ts\"));\n\n if (hasIndex) {\n // This is a module\n const dependencies = new Set<string>();\n\n // Check for browser/node/bun entry points\n const hasBrowser = await fileExists(\n join(modulePath, \"index.browser.ts\"),\n );\n const hasNative = await fileExists(\n join(modulePath, \"index.native.ts\"),\n );\n const hasBun = await fileExists(join(modulePath, \"index.bun.ts\"));\n const hasNode = await fileExists(join(modulePath, \"index.node.ts\"));\n\n // Get all .ts/.tsx files in this module\n const files = await getAllFiles(modulePath);\n\n for (const file of files) {\n const content = await readFile(file, \"utf-8\");\n const deps = extractAlephaDependencies(\n content,\n packageName,\n moduleName,\n );\n for (const dep of deps) {\n if (dep.endsWith(\".ts\")) {\n throw new Error(\n `Invalid dependency '${dep}' in module '${moduleName}'. Do not include file extensions in Alepha module imports.`,\n );\n }\n if (dep.includes(\"-\")) {\n throw new Error(\n `Invalid dependency '${dep}' in module '${moduleName}'. Use '/' instead of '-' in Alepha module imports.`,\n );\n }\n dependencies.add(dep);\n }\n }\n\n const module: Module = {\n name: moduleName,\n dependencies: Array.from(dependencies),\n };\n\n if (hasNative) module.native = true;\n if (hasBrowser) module.browser = true;\n if (hasBun) module.bun = true;\n if (hasNode) module.node = true;\n\n modules.push(module);\n } else {\n // No index.ts, check subdirectories for modules\n await scanDirectory(modulePath, moduleName);\n }\n }\n }\n }\n\n await scanDirectory(srcDir, \"\");\n\n // Check for circular dependencies\n detectCircularDependencies(modules);\n\n return modules;\n}\n","import type { Alepha } from \"alepha\";\nimport type { CommandPrimitive } from \"alepha/command\";\nimport {\n type AppEntryOptions,\n appEntryOptions,\n} from \"./atoms/appEntryOptions.ts\";\nimport { type BuildOptions, buildOptions } from \"./atoms/buildOptions.ts\";\n\nexport interface AlephaCliConfig {\n entry?: AppEntryOptions;\n /**\n * Add custom commands to the Alepha CLI.\n *\n * You can override 'deploy', 'build', 'dev', 'start' commands this way.\n * But you can also add your own commands and run them via `alepha <command>`.\n */\n commands?: Record<string, CommandPrimitive>;\n\n /**\n * Register more services to the Alepha CLI (enhancements, commands, etc.).\n */\n services?: Array<any>;\n\n /**\n * Configure Alepha build command.\n */\n build?: BuildOptions;\n\n /**\n * Environment variables to set before running commands.\n *\n * Always use .env files by default, this is only for dynamic values.\n */\n env?: Record<string, unknown>;\n}\n\nexport type AlephaCliConfigFn = (alepha: Alepha) => AlephaCliConfig;\n\nexport const defineConfig = (\n runConfig: AlephaCliConfig | AlephaCliConfigFn,\n) => {\n return (alepha: Alepha) => {\n const config =\n typeof runConfig === \"function\" ? runConfig(alepha) : runConfig;\n\n if (config.services) {\n for (const it of config.services) {\n alepha.with(it);\n }\n }\n\n if (config.env) {\n for (const [key, value] of Object.entries(config.env)) {\n process.env[key] = String(value);\n }\n }\n\n if (config.build) {\n alepha.set(buildOptions, config.build);\n }\n\n if (config.entry) {\n alepha.set(appEntryOptions, config.entry);\n }\n\n return {\n ...config.commands,\n };\n };\n};\n\n/**\n * @alias defineConfig\n */\nexport const defineAlephaConfig = defineConfig;\n"],"mappings":"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"}
|