create-scaffauth 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +74 -1
- package/dist/index.js.map +1 -1
- package/dist/templates/express/drizzle-mysql/src/index.ts +1 -1
- package/dist/templates/express/drizzle-postgres/src/index.ts +1 -1
- package/dist/templates/express/drizzle-sqlite/src/index.ts +1 -1
- package/dist/templates/express/kysely-mysql/src/auth.ts.hbs +3 -3
- package/dist/templates/express/kysely-mysql/src/index.ts +1 -1
- package/dist/templates/express/kysely-postgres/src/auth.ts.hbs +4 -4
- package/dist/templates/express/kysely-postgres/src/index.ts +1 -1
- package/dist/templates/express/kysely-sqlite/src/auth.ts.hbs +3 -3
- package/dist/templates/express/kysely-sqlite/src/index.ts +1 -1
- package/dist/templates/express/prisma-mysql/src/index.ts +1 -1
- package/dist/templates/express/prisma-postgres/src/index.ts +1 -1
- package/dist/templates/express/prisma-sqlite/src/index.ts +1 -1
- package/dist/templates/fastify/kysely-mysql/src/auth.ts.hbs +3 -3
- package/dist/templates/fastify/kysely-postgres/src/auth.ts.hbs +4 -4
- package/dist/templates/fastify/kysely-sqlite/src/auth.ts.hbs +3 -3
- package/dist/templates/hono/kysely-mysql/src/auth.ts.hbs +3 -3
- package/dist/templates/hono/kysely-postgres/src/auth.ts.hbs +4 -4
- package/dist/templates/hono/kysely-sqlite/src/auth.ts.hbs +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1042,9 +1042,82 @@ async function runInit(options) {
|
|
|
1042
1042
|
}
|
|
1043
1043
|
}
|
|
1044
1044
|
|
|
1045
|
+
// package.json
|
|
1046
|
+
var package_default = {
|
|
1047
|
+
name: "create-scaffauth",
|
|
1048
|
+
version: "0.1.4",
|
|
1049
|
+
description: "Scaffold production-ready Better Auth backends",
|
|
1050
|
+
type: "module",
|
|
1051
|
+
bin: {
|
|
1052
|
+
"create-scaffauth": "./dist/index.js"
|
|
1053
|
+
},
|
|
1054
|
+
files: [
|
|
1055
|
+
"dist"
|
|
1056
|
+
],
|
|
1057
|
+
scripts: {
|
|
1058
|
+
build: "tsup",
|
|
1059
|
+
dev: "tsup --watch",
|
|
1060
|
+
start: "node dist/index.js",
|
|
1061
|
+
lint: "eslint src/",
|
|
1062
|
+
"lint:fix": "eslint src/ --fix",
|
|
1063
|
+
format: 'prettier --write "src/**/*.ts"',
|
|
1064
|
+
"format:check": 'prettier --check "src/**/*.ts"',
|
|
1065
|
+
test: "vitest run",
|
|
1066
|
+
"test:watch": "vitest",
|
|
1067
|
+
typecheck: "tsc --noEmit",
|
|
1068
|
+
prepublishOnly: "npm run build"
|
|
1069
|
+
},
|
|
1070
|
+
keywords: [
|
|
1071
|
+
"auth",
|
|
1072
|
+
"authentication",
|
|
1073
|
+
"better-auth",
|
|
1074
|
+
"backend",
|
|
1075
|
+
"cli",
|
|
1076
|
+
"scaffolding",
|
|
1077
|
+
"hono",
|
|
1078
|
+
"fastify",
|
|
1079
|
+
"express",
|
|
1080
|
+
"oauth",
|
|
1081
|
+
"2fa"
|
|
1082
|
+
],
|
|
1083
|
+
repository: {
|
|
1084
|
+
type: "git",
|
|
1085
|
+
url: "https://github.com/scaffauth/create-scaffauth"
|
|
1086
|
+
},
|
|
1087
|
+
bugs: {
|
|
1088
|
+
url: "https://github.com/scaffauth/create-scaffauth/issues"
|
|
1089
|
+
},
|
|
1090
|
+
homepage: "https://scaffauth.xyz",
|
|
1091
|
+
license: "MIT",
|
|
1092
|
+
engines: {
|
|
1093
|
+
node: ">=18.0.0"
|
|
1094
|
+
},
|
|
1095
|
+
dependencies: {
|
|
1096
|
+
"@clack/prompts": "^0.9.1",
|
|
1097
|
+
"@octokit/rest": "^21.1.1",
|
|
1098
|
+
chalk: "^5.4.1",
|
|
1099
|
+
commander: "^13.1.0",
|
|
1100
|
+
execa: "^9.5.2",
|
|
1101
|
+
"fs-extra": "^11.3.0",
|
|
1102
|
+
handlebars: "^4.7.8",
|
|
1103
|
+
ora: "^8.2.0"
|
|
1104
|
+
},
|
|
1105
|
+
devDependencies: {
|
|
1106
|
+
"@types/fs-extra": "^11.0.4",
|
|
1107
|
+
"@types/node": "^22.13.1",
|
|
1108
|
+
eslint: "^9.20.0",
|
|
1109
|
+
"eslint-config-prettier": "^10.0.1",
|
|
1110
|
+
prettier: "^3.5.1",
|
|
1111
|
+
tsup: "^8.3.6",
|
|
1112
|
+
typescript: "^5.7.3",
|
|
1113
|
+
"typescript-eslint": "^8.24.0",
|
|
1114
|
+
vitest: "^3.0.5"
|
|
1115
|
+
}
|
|
1116
|
+
};
|
|
1117
|
+
|
|
1045
1118
|
// src/cli/index.ts
|
|
1046
1119
|
var program = new Command();
|
|
1047
|
-
program.name("create-scaffauth").description("Scaffold production-ready Better Auth backends").version(
|
|
1120
|
+
program.name("create-scaffauth").description("Scaffold production-ready Better Auth backends").version(package_default.version);
|
|
1048
1121
|
program.command("init", { isDefault: true }).description("Initialize a new auth backend project").option("-y, --yes", "Skip prompts and use defaults").option("--no-install", "Skip package installation").option("--no-git", "Skip git initialization").option("-t, --template <template>", "Use a specific template").option("-d, --debug", "Enable debug mode").action(runInit);
|
|
1049
1122
|
program.parse();
|
|
1050
1123
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/init.ts","../src/cli/prompts.ts","../src/utils/validators.ts","../src/generators/template.ts","../src/utils/fileOperations.ts","../src/utils/logger.ts","../src/generators/install.ts","../src/utils/packageManager.ts","../src/utils/gitOperations.ts","../src/utils/github.ts","../src/deployers/vercel.ts","../src/deployers/railway.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { runInit } from \"./commands/init.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"create-scaffauth\")\n .description(\"Scaffold production-ready Better Auth backends\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"init\", { isDefault: true })\n .description(\"Initialize a new auth backend project\")\n .option(\"-y, --yes\", \"Skip prompts and use defaults\")\n .option(\"--no-install\", \"Skip package installation\")\n .option(\"--no-git\", \"Skip git initialization\")\n .option(\"-t, --template <template>\", \"Use a specific template\")\n .option(\"-d, --debug\", \"Enable debug mode\")\n .action(runInit);\n\nprogram.parse();\n","import path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport type { ScaffauthConfig, DeployResult } from \"../../types/index.js\";\nimport { gatherConfig, getDefaultConfig } from \"../prompts.js\";\nimport { generateProject } from \"../../generators/template.js\";\nimport { installDependencies } from \"../../generators/install.js\";\nimport { directoryExists } from \"../../utils/fileOperations.js\";\nimport { logger } from \"../../utils/logger.js\";\nimport { parseTemplateOption } from \"../../utils/validators.js\";\nimport {\n detectPackageManager,\n getInstallCommand,\n getRunCommand,\n} from \"../../utils/packageManager.js\";\nimport { isGitInstalled, initGitRepo } from \"../../utils/gitOperations.js\";\nimport { setupGitHub, type GitHubResult } from \"../../utils/github.js\";\nimport { deployToVercel } from \"../../deployers/vercel.js\";\nimport { deployToRailway } from \"../../deployers/railway.js\";\n\nexport interface InitOptions {\n yes?: boolean;\n install?: boolean; // Commander sets --no-install as install=false\n git?: boolean; // Commander sets --no-git as git=false\n template?: string;\n debug?: boolean;\n}\n\nfunction getErrorMessage(err: unknown): string {\n if (err instanceof Error && err.message.trim().length > 0) {\n return err.message;\n }\n return \"Unknown error occurred\";\n}\n\nfunction logRecoverySuggestion(context: string, err: unknown): void {\n const message = getErrorMessage(err).toLowerCase();\n\n if (context === \"config\") {\n if (message.includes(\"tty\")) {\n logger.info(\"Run in an interactive terminal, or use --yes / --template.\");\n return;\n }\n if (message.includes(\"template\")) {\n logger.info(\n \"Use --template in this format: framework/orm-database (e.g. hono/drizzle-postgres).\",\n );\n return;\n }\n }\n\n if (context === \"generation\") {\n if (\n message.includes(\"enoent\") ||\n message.includes(\"no such file\") ||\n message.includes(\"template\")\n ) {\n logger.info(\n \"Template files were not found. Run npm run build, then try again.\",\n );\n return;\n }\n if (message.includes(\"eacces\") || message.includes(\"permission\")) {\n logger.info(\n \"Check write permissions for the target directory and retry.\",\n );\n return;\n }\n }\n\n if (context === \"install\") {\n logger.info(\n \"You can continue setup manually by installing dependencies in the generated project.\",\n );\n return;\n }\n\n if (context === \"github\") {\n logger.info(\n \"You can continue locally and connect GitHub later with git init/add/commit/remote/push.\",\n );\n return;\n }\n\n if (context === \"deployment\") {\n logger.info(\n \"You can deploy manually later from the generated project directory.\",\n );\n }\n}\n\nasync function resolveConfig(options: InitOptions): Promise<ScaffauthConfig> {\n if (!process.stdin.isTTY && !options.yes && !options.template) {\n throw new Error(\n \"Interactive prompts require a TTY, but none was detected in this environment.\",\n );\n }\n\n if (options.template) {\n const parsedTemplate = parseTemplateOption(options.template);\n const config = getDefaultConfig();\n config.framework = parsedTemplate.framework;\n config.orm = parsedTemplate.orm;\n config.database = parsedTemplate.database;\n logger.info(\n `Using template ${parsedTemplate.framework}/${parsedTemplate.orm}-${parsedTemplate.database}`,\n );\n logger.info(\n `Skipping prompts. Using default project name \"${config.projectName}\".`,\n );\n return config;\n }\n\n if (options.yes) {\n const config = getDefaultConfig();\n logger.info(\"Using default configuration (Hono + Drizzle + PostgreSQL)\");\n return config;\n }\n\n return gatherConfig();\n}\n\nexport async function runInit(options: InitOptions): Promise<void> {\n if (options.debug) {\n process.env.SCAFFAUTH_DEBUG = \"1\";\n }\n\n let config: ScaffauthConfig;\n try {\n config = await resolveConfig(options);\n } catch (err) {\n logger.error(getErrorMessage(err));\n logRecoverySuggestion(\"config\", err);\n process.exit(1);\n }\n\n const targetDir = path.resolve(process.cwd(), config.projectName);\n logger.step(\n `Stack: ${config.framework} + ${config.orm} + ${config.database}`,\n );\n logger.step(`Target: ${targetDir}`);\n\n // Check if directory already exists\n if (await directoryExists(targetDir)) {\n if (!process.stdin.isTTY) {\n logger.error(\n `Directory \"${config.projectName}\" already exists and cannot be confirmed in non-interactive mode.`,\n );\n logger.info(\n \"Use a different working directory or remove the existing directory before rerunning.\",\n );\n process.exit(1);\n }\n\n const overwrite = await p.confirm({\n message: `Directory \"${config.projectName}\" already exists. Overwrite?`,\n initialValue: false,\n });\n if (p.isCancel(overwrite) || !overwrite) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n }\n\n // Generate project\n const spinner = p.spinner();\n spinner.start(\"Generating project files\");\n\n try {\n await generateProject(config, targetDir);\n spinner.stop(\"Project files generated\");\n } catch (err) {\n spinner.stop(\"Failed to generate project files\");\n logger.error(getErrorMessage(err));\n logRecoverySuggestion(\"generation\", err);\n process.exit(1);\n }\n\n // Install dependencies\n if (options.install !== false) {\n const pm = detectPackageManager();\n spinner.start(`Installing dependencies with ${pm}`);\n\n try {\n await installDependencies(targetDir, pm);\n spinner.stop(\"Dependencies installed\");\n } catch (err) {\n spinner.stop(\"Failed to install dependencies\");\n logger.warning(\"Dependency installation failed.\");\n logger.info(`Manual command: ${getInstallCommand(pm)}`);\n logRecoverySuggestion(\"install\", err);\n logger.debug(getErrorMessage(err));\n }\n }\n\n // Git & GitHub\n let githubResult: GitHubResult | undefined;\n const shouldGit = options.git !== false;\n\n if (shouldGit && config.github?.createRepo) {\n // Full GitHub flow: init git + create repo + push\n try {\n githubResult = await setupGitHub(config.github, targetDir);\n } catch (err) {\n logger.error(getErrorMessage(err));\n logRecoverySuggestion(\"github\", err);\n }\n } else if (shouldGit) {\n // Just init a local git repo (no GitHub)\n const gitAvailable = await isGitInstalled();\n if (gitAvailable) {\n spinner.start(\"Initializing git repository\");\n try {\n await initGitRepo(targetDir);\n spinner.stop(\"Git repository initialized\");\n } catch (err) {\n spinner.stop(\"Failed to initialize git\");\n logger.warning(\"Git initialization failed. Skipping git setup.\");\n logger.debug(getErrorMessage(err));\n }\n } else {\n logger.warning(\"Git is not installed. Skipping git initialization.\");\n logger.info(\"Install git and run: git init && git add -A && git commit -m \\\"Initial commit\\\"\");\n }\n }\n\n // Deployment\n let deployResult: DeployResult | undefined;\n\n if (config.deployment) {\n try {\n if (config.deployment.platform === \"vercel\") {\n deployResult = await deployToVercel(config, targetDir);\n } else if (config.deployment.platform === \"railway\") {\n deployResult = await deployToRailway(config, targetDir);\n }\n } catch (err) {\n logger.error(getErrorMessage(err));\n logRecoverySuggestion(\"deployment\", err);\n }\n }\n\n // Success summary\n const pm = detectPackageManager();\n logger.blank();\n p.outro(\"Your auth backend is ready!\");\n logger.blank();\n\n logger.success(`Project created at ./${config.projectName}`);\n logger.info(\n `Configuration: ${config.framework}/${config.orm}-${config.database}`,\n );\n\n if (githubResult) {\n logger.success(`GitHub repository: ${githubResult.repoUrl}`);\n }\n\n if (deployResult) {\n logger.success(`Deployed to ${deployResult.platform}: ${deployResult.url}`);\n }\n\n logger.blank();\n\n if (deployResult) {\n logger.box(\n \"Next steps:\",\n [\n ` 1. Configure OAuth credentials in your ${deployResult.platform} dashboard`,\n ` 2. Test auth endpoints at ${deployResult.url}/api/auth`,\n ` 3. Integrate with your frontend`,\n ].join(\"\\n\"),\n );\n } else {\n logger.box(\n \"Next steps:\",\n [\n ` 1. cd ${config.projectName}`,\n ` 2. cp .env.example .env`,\n ` 3. Update DATABASE_URL in .env`,\n ` 4. ${getRunCommand(pm, \"db:push\")}`,\n ` 5. ${getRunCommand(pm, \"dev\")}`,\n \"\",\n ` Your auth backend will be running at http://localhost:3000`,\n ].join(\"\\n\"),\n );\n }\n}\n","import * as p from \"@clack/prompts\";\nimport type {\n ScaffauthConfig,\n Framework,\n Database,\n ORM,\n SessionStrategy,\n OAuthProvider,\n EmailProvider,\n DeploymentPlatform,\n} from \"../types/index.js\";\nimport { validateProjectName } from \"../utils/validators.js\";\n\nfunction parsePositiveInteger(value: string): number {\n return Number.parseInt(value.trim(), 10);\n}\n\nexport async function gatherConfig(): Promise<ScaffauthConfig> {\n p.intro(\"Welcome to Scaffauth!\");\n\n // --- Project name ---\n const projectName = await p.text({\n message: \"What is your project name?\",\n placeholder: \"my-auth-backend\",\n validate: validateProjectName,\n });\n if (p.isCancel(projectName)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- Framework ---\n const framework = await p.select({\n message: \"Which backend framework?\",\n options: [\n {\n value: \"hono\" as Framework,\n label: \"Hono\",\n hint: \"Modern, fast, edge-compatible (recommended)\",\n },\n {\n value: \"fastify\" as Framework,\n label: \"Fastify\",\n hint: \"Battle-tested, huge ecosystem\",\n },\n {\n value: \"express\" as Framework,\n label: \"Express\",\n hint: \"Most familiar, largest community\",\n },\n ],\n });\n if (p.isCancel(framework)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- Database ---\n const database = await p.select({\n message: \"Which database?\",\n options: [\n {\n value: \"postgres\" as Database,\n label: \"PostgreSQL\",\n hint: \"Production-grade (recommended)\",\n },\n {\n value: \"mysql\" as Database,\n label: \"MySQL\",\n hint: \"Popular alternative\",\n },\n {\n value: \"sqlite\" as Database,\n label: \"SQLite\",\n hint: \"Quick local development\",\n },\n ],\n });\n if (p.isCancel(database)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- ORM ---\n const orm = await p.select({\n message: \"Which ORM / query builder?\",\n options: [\n {\n value: \"drizzle\" as ORM,\n label: \"Drizzle\",\n hint: \"Best TypeScript DX (recommended)\",\n },\n {\n value: \"prisma\" as ORM,\n label: \"Prisma\",\n hint: \"Most popular, great tooling\",\n },\n {\n value: \"kysely\" as ORM,\n label: \"Kysely\",\n hint: \"Type-safe SQL query builder\",\n },\n ],\n });\n if (p.isCancel(orm)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- OAuth providers ---\n const providers = await p.multiselect({\n message: \"Which OAuth providers? (Space to select, Enter to confirm)\",\n options: [\n { value: \"github\" as OAuthProvider, label: \"GitHub\" },\n { value: \"google\" as OAuthProvider, label: \"Google\" },\n { value: \"discord\" as OAuthProvider, label: \"Discord\" },\n { value: \"twitter\" as OAuthProvider, label: \"Twitter/X\" },\n { value: \"apple\" as OAuthProvider, label: \"Apple\" },\n { value: \"microsoft\" as OAuthProvider, label: \"Microsoft\" },\n ],\n required: false,\n });\n if (p.isCancel(providers)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- Two-factor auth ---\n const twoFactor = await p.confirm({\n message: \"Enable two-factor authentication (2FA)?\",\n initialValue: false,\n });\n if (p.isCancel(twoFactor)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- Email provider ---\n const useEmail = await p.confirm({\n message: \"Set up email verification & password reset?\",\n initialValue: false,\n });\n if (p.isCancel(useEmail)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n let emailProvider: EmailProvider | undefined;\n if (useEmail) {\n const provider = await p.select({\n message: \"Which email provider?\",\n options: [\n {\n value: \"resend\" as EmailProvider,\n label: \"Resend\",\n hint: \"Modern email API (recommended)\",\n },\n {\n value: \"sendgrid\" as EmailProvider,\n label: \"SendGrid\",\n hint: \"Enterprise-grade email\",\n },\n {\n value: \"smtp\" as EmailProvider,\n label: \"SMTP\",\n hint: \"Any SMTP server\",\n },\n ],\n });\n if (p.isCancel(provider)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n emailProvider = provider;\n }\n\n // --- RBAC ---\n const rbac = await p.confirm({\n message: \"Enable role-based access control (RBAC)?\",\n initialValue: false,\n });\n if (p.isCancel(rbac)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- Session configuration ---\n const sessionStrategy = await p.select({\n message: \"Session strategy?\",\n options: [\n {\n value: \"database\" as SessionStrategy,\n label: \"Database sessions\",\n hint: \"Store and validate sessions via database (recommended)\",\n },\n {\n value: \"database-cookie-cache\" as SessionStrategy,\n label: \"Database + cookie cache\",\n hint: \"Add short-lived cookie cache for fewer DB reads\",\n },\n ],\n });\n if (p.isCancel(sessionStrategy)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n const sessionLifetimeDays = await p.text({\n message: \"Session lifetime (days)\",\n placeholder: \"7\",\n initialValue: \"7\",\n validate: (value) => {\n const parsed = parsePositiveInteger(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n return \"Enter a positive integer number of days.\";\n }\n },\n });\n if (p.isCancel(sessionLifetimeDays)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n const sessionRefreshHours = await p.text({\n message: \"Session refresh/update age (hours)\",\n placeholder: \"24\",\n initialValue: \"24\",\n validate: (value) => {\n const parsed = parsePositiveInteger(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n return \"Enter a positive integer number of hours.\";\n }\n },\n });\n if (p.isCancel(sessionRefreshHours)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n let cookieCacheMaxAgeSeconds = 300;\n if (sessionStrategy === \"database-cookie-cache\") {\n const cookieCacheMaxAge = await p.text({\n message: \"Cookie cache max age (seconds)\",\n placeholder: \"300\",\n initialValue: \"300\",\n validate: (value) => {\n const parsed = parsePositiveInteger(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n return \"Enter a positive integer number of seconds.\";\n }\n },\n });\n if (p.isCancel(cookieCacheMaxAge)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n cookieCacheMaxAgeSeconds = parsePositiveInteger(cookieCacheMaxAge);\n }\n\n // --- GitHub repo ---\n const createGitHubRepo = await p.confirm({\n message: \"Create a GitHub repository?\",\n initialValue: false,\n });\n if (p.isCancel(createGitHubRepo)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n let githubConfig: ScaffauthConfig[\"github\"] | undefined;\n if (createGitHubRepo) {\n const repoPrivate = await p.confirm({\n message: \"Make the repository private?\",\n initialValue: false,\n });\n if (p.isCancel(repoPrivate)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n githubConfig = {\n createRepo: true,\n repoName: projectName,\n private: repoPrivate,\n };\n }\n\n // --- Deployment ---\n const deploy = await p.confirm({\n message: \"Deploy now?\",\n initialValue: false,\n });\n if (p.isCancel(deploy)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n let deploymentConfig: ScaffauthConfig[\"deployment\"] | undefined;\n if (deploy) {\n const platform = await p.select({\n message: \"Which platform?\",\n options: [\n {\n value: \"vercel\" as DeploymentPlatform,\n label: \"Vercel\",\n hint: \"Serverless, edge-optimized\",\n },\n {\n value: \"railway\" as DeploymentPlatform,\n label: \"Railway\",\n hint: \"Full-stack platform\",\n },\n ],\n });\n if (p.isCancel(platform)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n deploymentConfig = {\n platform,\n environmentVars: {},\n };\n }\n\n return {\n projectName,\n framework,\n database,\n orm,\n authConfig: {\n emailPassword: true,\n providers: providers as OAuthProvider[],\n twoFactor,\n emailProvider,\n rbac,\n session: {\n strategy: sessionStrategy,\n expiresIn: parsePositiveInteger(sessionLifetimeDays) * 24 * 60 * 60,\n updateAge: parsePositiveInteger(sessionRefreshHours) * 60 * 60,\n cookieCacheEnabled: sessionStrategy === \"database-cookie-cache\",\n cookieCacheMaxAge: cookieCacheMaxAgeSeconds,\n },\n },\n deployment: deploymentConfig,\n github: githubConfig,\n };\n}\n\n/**\n * Return a config with sensible defaults (used with --yes flag).\n */\nexport function getDefaultConfig(\n projectName = \"scaffauth-project\",\n): ScaffauthConfig {\n return {\n projectName,\n framework: \"hono\",\n database: \"postgres\",\n orm: \"drizzle\",\n authConfig: {\n emailPassword: true,\n providers: [\"github\"],\n twoFactor: false,\n rbac: false,\n session: {\n strategy: \"database\",\n expiresIn: 7 * 24 * 60 * 60,\n updateAge: 24 * 60 * 60,\n cookieCacheEnabled: false,\n cookieCacheMaxAge: 300,\n },\n },\n };\n}\n","import type { Database, Framework, ORM } from \"../types/index.js\";\n\nexport function validateProjectName(name: string): string | undefined {\n if (!name || name.trim().length === 0) {\n return \"Project name is required\";\n }\n\n if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(name)) {\n return \"Project name must be lowercase alphanumeric with hyphens (e.g. my-auth-api)\";\n }\n\n if (name.length > 100) {\n return \"Project name must be 100 characters or less\";\n }\n\n if (name.includes(\"--\")) {\n return \"Project name cannot contain consecutive hyphens\";\n }\n\n return undefined;\n}\n\nconst VALID_FRAMEWORKS: Framework[] = [\"hono\", \"fastify\", \"express\"];\nconst VALID_ORMS: ORM[] = [\"drizzle\", \"prisma\", \"kysely\"];\nconst VALID_DATABASES: Database[] = [\"postgres\", \"mysql\", \"sqlite\"];\n\nexport interface ParsedTemplate {\n framework: Framework;\n orm: ORM;\n database: Database;\n}\n\n/**\n * Parse a --template value in the format: framework/orm-database\n * Example: hono/drizzle-postgres\n */\nexport function parseTemplateOption(template: string): ParsedTemplate {\n const value = template.trim().toLowerCase();\n const [frameworkPart, ormDatabasePart] = value.split(\"/\");\n\n if (!frameworkPart || !ormDatabasePart || value.split(\"/\").length !== 2) {\n throw new Error(\n `Invalid template \"${template}\". Expected format: framework/orm-database (e.g. hono/drizzle-postgres).`,\n );\n }\n\n const [ormPart, databasePart] = ormDatabasePart.split(\"-\");\n if (!ormPart || !databasePart || ormDatabasePart.split(\"-\").length !== 2) {\n throw new Error(\n `Invalid template \"${template}\". Expected format: framework/orm-database (e.g. hono/drizzle-postgres).`,\n );\n }\n\n if (!VALID_FRAMEWORKS.includes(frameworkPart as Framework)) {\n throw new Error(\n `Unknown framework \"${frameworkPart}\". Supported: ${VALID_FRAMEWORKS.join(\", \")}.`,\n );\n }\n\n if (!VALID_ORMS.includes(ormPart as ORM)) {\n throw new Error(`Unknown ORM \"${ormPart}\". Supported: ${VALID_ORMS.join(\", \")}.`);\n }\n\n if (!VALID_DATABASES.includes(databasePart as Database)) {\n throw new Error(\n `Unknown database \"${databasePart}\". Supported: ${VALID_DATABASES.join(\", \")}.`,\n );\n }\n\n return {\n framework: frameworkPart as Framework,\n orm: ormPart as ORM,\n database: databasePart as Database,\n };\n}\n","import path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport crypto from \"crypto\";\nimport Handlebars from \"handlebars\";\nimport type { ScaffauthConfig, TemplateContext } from \"../types/index.js\";\nimport { copyTemplate } from \"../utils/fileOperations.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Register Handlebars helpers\nHandlebars.registerHelper(\"uppercase\", (str: string) => str.toUpperCase());\nHandlebars.registerHelper(\n \"eq\",\n (a: string, b: string) => a === b,\n);\nHandlebars.registerHelper(\n \"or\",\n (...args: unknown[]) => {\n // Last arg is the Handlebars options object\n const values = args.slice(0, -1);\n return values.some(Boolean);\n },\n);\n\n/**\n * Resolve the path to a template directory based on user selections.\n */\nfunction getTemplatePath(config: ScaffauthConfig): string {\n const { framework, orm, database } = config;\n const templateName = `${orm}-${database}`;\n\n // When running from dist (bundled), templates are in dist/templates/\n // When running from src (dev), templates are in src/templates/\n const templateDir = path.resolve(__dirname, \"templates\", framework, templateName);\n\n logger.debug(`Template path: ${templateDir}`);\n return templateDir;\n}\n\n/**\n * Build a TemplateContext from ScaffauthConfig for Handlebars rendering.\n */\nfunction buildTemplateContext(config: ScaffauthConfig): TemplateContext {\n return {\n projectName: config.projectName,\n framework: config.framework,\n database: config.database,\n orm: config.orm,\n providers: config.authConfig.providers,\n twoFactor: config.authConfig.twoFactor,\n rbac: config.authConfig.rbac,\n emailProvider: config.authConfig.emailProvider,\n sessionExpiresIn: config.authConfig.session.expiresIn,\n sessionUpdateAge: config.authConfig.session.updateAge,\n sessionCookieCacheEnabled: config.authConfig.session.cookieCacheEnabled,\n sessionCookieCacheMaxAge: config.authConfig.session.cookieCacheMaxAge,\n // Generate a random auth secret for the .env.example\n authSecret: crypto.randomBytes(32).toString(\"hex\"),\n };\n}\n\n/**\n * Main generator: scaffolds a full project from user config.\n */\nexport async function generateProject(\n config: ScaffauthConfig,\n targetDir: string,\n): Promise<void> {\n const templatePath = getTemplatePath(config);\n const context = buildTemplateContext(config);\n\n logger.debug(`Generating project at: ${targetDir}`);\n logger.debug(`Using template: ${templatePath}`);\n\n // Copy template files, processing .hbs files with Handlebars\n await copyTemplate(templatePath, targetDir, context);\n\n logger.debug(\"Project generation complete\");\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport Handlebars from \"handlebars\";\nimport type { TemplateContext } from \"../types/index.js\";\n\n/**\n * Copy a template directory to the target, processing .hbs files with Handlebars.\n */\nexport async function copyTemplate(\n templateDir: string,\n targetDir: string,\n context: TemplateContext,\n): Promise<void> {\n await fs.ensureDir(targetDir);\n\n const entries = await fs.readdir(templateDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(templateDir, entry.name);\n let destName = entry.name;\n\n // Strip .hbs extension from destination\n if (destName.endsWith(\".hbs\")) {\n destName = destName.slice(0, -4);\n }\n\n const destPath = path.join(targetDir, destName);\n\n if (entry.isDirectory()) {\n await copyTemplate(srcPath, destPath, context);\n } else if (entry.name.endsWith(\".hbs\")) {\n // Process as Handlebars template\n const content = await fs.readFile(srcPath, \"utf-8\");\n const template = Handlebars.compile(content);\n const rendered = template(context);\n await fs.writeFile(destPath, rendered, \"utf-8\");\n } else {\n // Copy as-is\n await fs.copy(srcPath, destPath);\n }\n }\n}\n\n/**\n * Write a JSON object to a file with pretty formatting.\n */\nexport async function writeJson(\n filePath: string,\n data: Record<string, unknown>,\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/**\n * Write a string to a file, creating parent directories if needed.\n */\nexport async function writeFile(\n filePath: string,\n content: string,\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Check if a directory already exists and is non-empty.\n */\nexport async function directoryExists(dir: string): Promise<boolean> {\n try {\n const stat = await fs.stat(dir);\n if (!stat.isDirectory()) return false;\n const files = await fs.readdir(dir);\n return files.length > 0;\n } catch {\n return false;\n }\n}\n","import chalk from \"chalk\";\n\nexport const logger = {\n info(message: string) {\n console.log(chalk.blue(\"i\"), message);\n },\n\n success(message: string) {\n console.log(chalk.green(\"✓\"), message);\n },\n\n warning(message: string) {\n console.log(chalk.yellow(\"⚠\"), message);\n },\n\n error(message: string) {\n console.log(chalk.red(\"✗\"), message);\n },\n\n step(message: string) {\n console.log(chalk.cyan(\"→\"), message);\n },\n\n debug(message: string) {\n if (process.env.SCAFFAUTH_DEBUG) {\n console.log(chalk.gray(\"[debug]\"), message);\n }\n },\n\n blank() {\n console.log();\n },\n\n box(title: string, content: string) {\n console.log();\n console.log(chalk.bold(title));\n console.log(content);\n console.log();\n },\n};\n","import { execa } from \"execa\";\nimport type { PackageManager } from \"../utils/packageManager.js\";\nimport { getInstallCommand } from \"../utils/packageManager.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Install project dependencies using the detected package manager.\n */\nexport async function installDependencies(\n projectDir: string,\n pm: PackageManager,\n): Promise<void> {\n const command = getInstallCommand(pm);\n const [cmd, ...args] = command.split(\" \");\n\n logger.debug(`Running: ${command} in ${projectDir}`);\n\n await execa(cmd, args, {\n cwd: projectDir,\n stdio: \"pipe\",\n });\n}\n","export type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/**\n * Detect which package manager the user invoked with.\n * Falls back to npm.\n */\nexport function detectPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent;\n\n if (userAgent) {\n if (userAgent.startsWith(\"pnpm\")) return \"pnpm\";\n if (userAgent.startsWith(\"yarn\")) return \"yarn\";\n if (userAgent.startsWith(\"bun\")) return \"bun\";\n }\n\n return \"npm\";\n}\n\nexport function getInstallCommand(pm: PackageManager): string {\n switch (pm) {\n case \"pnpm\":\n return \"pnpm install\";\n case \"yarn\":\n return \"yarn\";\n case \"bun\":\n return \"bun install\";\n default:\n return \"npm install\";\n }\n}\n\nexport function getRunCommand(pm: PackageManager, script: string): string {\n switch (pm) {\n case \"pnpm\":\n return `pnpm ${script}`;\n case \"yarn\":\n return `yarn ${script}`;\n case \"bun\":\n return `bun run ${script}`;\n default:\n return `npm run ${script}`;\n }\n}\n","import { execa } from \"execa\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Check if git is available on the system.\n */\nexport async function isGitInstalled(): Promise<boolean> {\n try {\n await execa(\"git\", [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Initialize a git repository, stage all files, and create an initial commit.\n */\nexport async function initGitRepo(projectDir: string): Promise<void> {\n logger.debug(`Initializing git repo in ${projectDir}`);\n\n await execa(\"git\", [\"init\"], { cwd: projectDir });\n await execa(\"git\", [\"add\", \"-A\"], { cwd: projectDir });\n await execa(\"git\", [\"commit\", \"-m\", \"Initial commit from Scaffauth\"], {\n cwd: projectDir,\n });\n}\n\n/**\n * Add a remote origin and push to it.\n */\nexport async function pushToRemote(\n projectDir: string,\n remoteUrl: string,\n): Promise<void> {\n logger.debug(`Adding remote: ${remoteUrl}`);\n\n await execa(\"git\", [\"remote\", \"add\", \"origin\", remoteUrl], {\n cwd: projectDir,\n });\n await execa(\"git\", [\"branch\", \"-M\", \"main\"], { cwd: projectDir });\n await execa(\"git\", [\"push\", \"-u\", \"origin\", \"main\"], { cwd: projectDir });\n}\n","import { Octokit } from \"@octokit/rest\";\nimport { execa } from \"execa\";\nimport * as p from \"@clack/prompts\";\nimport type { GitHubConfig } from \"../types/index.js\";\nimport { logger } from \"./logger.js\";\nimport { initGitRepo, pushToRemote } from \"./gitOperations.js\";\n\n/**\n * Try to get a GitHub token from the gh CLI, falling back to manual input.\n */\nasync function getGitHubToken(): Promise<string> {\n // Try gh CLI first\n try {\n const { stdout } = await execa(\"gh\", [\"auth\", \"token\"]);\n const token = stdout.trim();\n if (token) {\n logger.debug(\"Using token from gh CLI\");\n return token;\n }\n } catch {\n logger.debug(\"gh CLI not available or not authenticated\");\n }\n\n // Fall back to manual input\n const token = await p.password({\n message: \"Enter your GitHub personal access token:\",\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return \"Token is required\";\n }\n },\n });\n\n if (p.isCancel(token)) {\n throw new Error(\"GitHub authentication cancelled\");\n }\n\n return token;\n}\n\nexport interface GitHubResult {\n repoUrl: string;\n cloneUrl: string;\n}\n\n/**\n * Full GitHub workflow: authenticate, create repo, init git, push.\n */\nexport async function setupGitHub(\n config: GitHubConfig,\n projectDir: string,\n): Promise<GitHubResult> {\n const spinner = p.spinner();\n\n // 1. Authenticate\n spinner.start(\"Authenticating with GitHub\");\n const token = await getGitHubToken();\n const octokit = new Octokit({ auth: token });\n\n let username: string;\n try {\n const { data: user } = await octokit.users.getAuthenticated();\n username = user.login;\n spinner.stop(`Authenticated as ${username}`);\n } catch {\n spinner.stop(\"GitHub authentication failed\");\n throw new Error(\n \"Invalid GitHub token. Make sure it has the 'repo' scope.\",\n );\n }\n\n // 2. Create repository\n spinner.start(\"Creating GitHub repository\");\n let repoUrl: string;\n let cloneUrl: string;\n try {\n const { data: repo } = await octokit.repos.createForAuthenticatedUser({\n name: config.repoName,\n private: config.private,\n description:\n config.description || \"Auth backend powered by Better Auth\",\n auto_init: false,\n });\n repoUrl = repo.html_url;\n cloneUrl = repo.clone_url;\n spinner.stop(`Repository created: ${repoUrl}`);\n } catch (err) {\n spinner.stop(\"Failed to create repository\");\n if (err instanceof Error && err.message.includes(\"name already exists\")) {\n throw new Error(\n `Repository \"${config.repoName}\" already exists on GitHub.`,\n );\n }\n throw err;\n }\n\n // 3. Init git and push\n spinner.start(\"Pushing code to GitHub\");\n try {\n await initGitRepo(projectDir);\n await pushToRemote(projectDir, cloneUrl);\n spinner.stop(\"Code pushed to GitHub\");\n } catch (err) {\n spinner.stop(\"Failed to push to GitHub\");\n logger.debug(err instanceof Error ? err.message : String(err));\n throw new Error(\n \"Failed to push to GitHub. Make sure git is installed and configured.\",\n );\n }\n\n return { repoUrl, cloneUrl };\n}\n","import path from \"path\";\nimport { execa } from \"execa\";\nimport * as p from \"@clack/prompts\";\nimport fs from \"fs-extra\";\nimport type { ScaffauthConfig, DeployResult } from \"../types/index.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Check if the Vercel CLI is installed.\n */\nasync function checkVercelCLI(): Promise<boolean> {\n try {\n await execa(\"vercel\", [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a vercel.json configuration file for the project.\n */\nfunction generateVercelConfig(_config: ScaffauthConfig): Record<string, unknown> {\n return {\n version: 2,\n builds: [\n {\n src: \"src/index.ts\",\n use: \"@vercel/node\",\n },\n ],\n routes: [\n {\n src: \"/(.*)\",\n dest: \"src/index.ts\",\n },\n ],\n };\n}\n\n/**\n * Deploy to Vercel: write config, set env vars, run deploy.\n */\nexport async function deployToVercel(\n config: ScaffauthConfig,\n projectDir: string,\n): Promise<DeployResult> {\n const spinner = p.spinner();\n\n // 1. Check CLI\n spinner.start(\"Checking Vercel CLI\");\n const hasVercel = await checkVercelCLI();\n if (!hasVercel) {\n spinner.stop(\"Vercel CLI not found\");\n p.note(\"Install with: npm i -g vercel\", \"Missing dependency\");\n throw new Error(\n \"Vercel CLI is not installed. Run 'npm i -g vercel' and try again.\",\n );\n }\n spinner.stop(\"Vercel CLI found\");\n\n // 2. Write vercel.json\n spinner.start(\"Configuring Vercel project\");\n const vercelConfig = generateVercelConfig(config);\n await fs.writeFile(\n path.join(projectDir, \"vercel.json\"),\n JSON.stringify(vercelConfig, null, 2) + \"\\n\",\n );\n spinner.stop(\"Vercel configuration written\");\n\n // 3. Link or create project (interactive - Vercel CLI handles auth)\n spinner.start(\"Deploying to Vercel\");\n try {\n const { stdout } = await execa(\"vercel\", [\"--prod\", \"--yes\"], {\n cwd: projectDir,\n // Vercel CLI may need terminal interaction for first-time login\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n\n // Extract URL from output\n const urlMatch = stdout.match(/https:\\/\\/[^\\s]+/);\n const deploymentUrl = urlMatch ? urlMatch[0] : \"deployment URL unavailable\";\n\n spinner.stop(`Deployed to Vercel: ${deploymentUrl}`);\n\n return { url: deploymentUrl, platform: \"vercel\" };\n } catch (err) {\n spinner.stop(\"Vercel deployment failed\");\n logger.debug(err instanceof Error ? err.message : String(err));\n throw new Error(\n \"Vercel deployment failed. Run 'vercel login' first, then try 'vercel --prod' in the project directory.\",\n );\n }\n}\n","import { execa } from \"execa\";\nimport * as p from \"@clack/prompts\";\nimport type { ScaffauthConfig, DeployResult } from \"../types/index.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Check if the Railway CLI is installed.\n */\nasync function checkRailwayCLI(): Promise<boolean> {\n try {\n await execa(\"railway\", [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Deploy to Railway: init project, provision DB, set env vars, deploy.\n */\nexport async function deployToRailway(\n config: ScaffauthConfig,\n projectDir: string,\n): Promise<DeployResult> {\n const spinner = p.spinner();\n\n // 1. Check CLI\n spinner.start(\"Checking Railway CLI\");\n const hasRailway = await checkRailwayCLI();\n if (!hasRailway) {\n spinner.stop(\"Railway CLI not found\");\n p.note(\"Install with: npm i -g @railway/cli\", \"Missing dependency\");\n throw new Error(\n \"Railway CLI is not installed. Run 'npm i -g @railway/cli' and try again.\",\n );\n }\n spinner.stop(\"Railway CLI found\");\n\n // 2. Initialize Railway project\n spinner.start(\"Creating Railway project\");\n try {\n await execa(\"railway\", [\"init\"], {\n cwd: projectDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n spinner.stop(\"Railway project created\");\n } catch (err) {\n spinner.stop(\"Failed to create Railway project\");\n logger.debug(err instanceof Error ? err.message : String(err));\n throw new Error(\n \"Failed to initialize Railway project. Run 'railway login' first.\",\n );\n }\n\n // 3. Provision PostgreSQL if using postgres\n if (config.database === \"postgres\") {\n spinner.start(\"Provisioning PostgreSQL database\");\n try {\n await execa(\"railway\", [\"add\", \"--plugin\", \"postgresql\"], {\n cwd: projectDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n spinner.stop(\"PostgreSQL database provisioned\");\n } catch (err) {\n spinner.stop(\"Failed to provision database\");\n logger.warning(\n \"You may need to add a database manually in the Railway dashboard.\",\n );\n logger.debug(err instanceof Error ? err.message : String(err));\n }\n }\n\n // 4. Deploy\n spinner.start(\"Deploying to Railway\");\n try {\n await execa(\"railway\", [\"up\", \"--detach\"], {\n cwd: projectDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n spinner.stop(\"Deployed to Railway\");\n } catch (err) {\n spinner.stop(\"Railway deployment failed\");\n logger.debug(err instanceof Error ? err.message : String(err));\n throw new Error(\n \"Railway deployment failed. Try running 'railway up' in the project directory.\",\n );\n }\n\n // 5. Get deployment URL\n let deploymentUrl = \"check Railway dashboard for URL\";\n try {\n const { stdout } = await execa(\"railway\", [\"domain\"], {\n cwd: projectDir,\n });\n if (stdout.trim()) {\n deploymentUrl = stdout.trim();\n }\n } catch {\n logger.debug(\"Could not retrieve Railway domain automatically\");\n }\n\n return { url: deploymentUrl, platform: \"railway\" };\n}\n"],"mappings":"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","names":["path","p","path","Handlebars","path","Handlebars","execa","execa","execa","p","execa","token","spinner","path","execa","p","fs","execa","spinner","fs","path","execa","p","execa","spinner","path","spinner","pm"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/init.ts","../src/cli/prompts.ts","../src/utils/validators.ts","../src/generators/template.ts","../src/utils/fileOperations.ts","../src/utils/logger.ts","../src/generators/install.ts","../src/utils/packageManager.ts","../src/utils/gitOperations.ts","../src/utils/github.ts","../src/deployers/vercel.ts","../src/deployers/railway.ts","../package.json"],"sourcesContent":["import { Command } from \"commander\";\nimport { runInit } from \"./commands/init.js\";\nimport packageJson from \"../../package.json\";\n\nconst program = new Command();\n\nprogram\n .name(\"create-scaffauth\")\n .description(\"Scaffold production-ready Better Auth backends\")\n .version(packageJson.version);\n\nprogram\n .command(\"init\", { isDefault: true })\n .description(\"Initialize a new auth backend project\")\n .option(\"-y, --yes\", \"Skip prompts and use defaults\")\n .option(\"--no-install\", \"Skip package installation\")\n .option(\"--no-git\", \"Skip git initialization\")\n .option(\"-t, --template <template>\", \"Use a specific template\")\n .option(\"-d, --debug\", \"Enable debug mode\")\n .action(runInit);\n\nprogram.parse();\n","import path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport type { ScaffauthConfig, DeployResult } from \"../../types/index.js\";\nimport { gatherConfig, getDefaultConfig } from \"../prompts.js\";\nimport { generateProject } from \"../../generators/template.js\";\nimport { installDependencies } from \"../../generators/install.js\";\nimport { directoryExists } from \"../../utils/fileOperations.js\";\nimport { logger } from \"../../utils/logger.js\";\nimport { parseTemplateOption } from \"../../utils/validators.js\";\nimport {\n detectPackageManager,\n getInstallCommand,\n getRunCommand,\n} from \"../../utils/packageManager.js\";\nimport { isGitInstalled, initGitRepo } from \"../../utils/gitOperations.js\";\nimport { setupGitHub, type GitHubResult } from \"../../utils/github.js\";\nimport { deployToVercel } from \"../../deployers/vercel.js\";\nimport { deployToRailway } from \"../../deployers/railway.js\";\n\nexport interface InitOptions {\n yes?: boolean;\n install?: boolean; // Commander sets --no-install as install=false\n git?: boolean; // Commander sets --no-git as git=false\n template?: string;\n debug?: boolean;\n}\n\nfunction getErrorMessage(err: unknown): string {\n if (err instanceof Error && err.message.trim().length > 0) {\n return err.message;\n }\n return \"Unknown error occurred\";\n}\n\nfunction logRecoverySuggestion(context: string, err: unknown): void {\n const message = getErrorMessage(err).toLowerCase();\n\n if (context === \"config\") {\n if (message.includes(\"tty\")) {\n logger.info(\"Run in an interactive terminal, or use --yes / --template.\");\n return;\n }\n if (message.includes(\"template\")) {\n logger.info(\n \"Use --template in this format: framework/orm-database (e.g. hono/drizzle-postgres).\",\n );\n return;\n }\n }\n\n if (context === \"generation\") {\n if (\n message.includes(\"enoent\") ||\n message.includes(\"no such file\") ||\n message.includes(\"template\")\n ) {\n logger.info(\n \"Template files were not found. Run npm run build, then try again.\",\n );\n return;\n }\n if (message.includes(\"eacces\") || message.includes(\"permission\")) {\n logger.info(\n \"Check write permissions for the target directory and retry.\",\n );\n return;\n }\n }\n\n if (context === \"install\") {\n logger.info(\n \"You can continue setup manually by installing dependencies in the generated project.\",\n );\n return;\n }\n\n if (context === \"github\") {\n logger.info(\n \"You can continue locally and connect GitHub later with git init/add/commit/remote/push.\",\n );\n return;\n }\n\n if (context === \"deployment\") {\n logger.info(\n \"You can deploy manually later from the generated project directory.\",\n );\n }\n}\n\nasync function resolveConfig(options: InitOptions): Promise<ScaffauthConfig> {\n if (!process.stdin.isTTY && !options.yes && !options.template) {\n throw new Error(\n \"Interactive prompts require a TTY, but none was detected in this environment.\",\n );\n }\n\n if (options.template) {\n const parsedTemplate = parseTemplateOption(options.template);\n const config = getDefaultConfig();\n config.framework = parsedTemplate.framework;\n config.orm = parsedTemplate.orm;\n config.database = parsedTemplate.database;\n logger.info(\n `Using template ${parsedTemplate.framework}/${parsedTemplate.orm}-${parsedTemplate.database}`,\n );\n logger.info(\n `Skipping prompts. Using default project name \"${config.projectName}\".`,\n );\n return config;\n }\n\n if (options.yes) {\n const config = getDefaultConfig();\n logger.info(\"Using default configuration (Hono + Drizzle + PostgreSQL)\");\n return config;\n }\n\n return gatherConfig();\n}\n\nexport async function runInit(options: InitOptions): Promise<void> {\n if (options.debug) {\n process.env.SCAFFAUTH_DEBUG = \"1\";\n }\n\n let config: ScaffauthConfig;\n try {\n config = await resolveConfig(options);\n } catch (err) {\n logger.error(getErrorMessage(err));\n logRecoverySuggestion(\"config\", err);\n process.exit(1);\n }\n\n const targetDir = path.resolve(process.cwd(), config.projectName);\n logger.step(\n `Stack: ${config.framework} + ${config.orm} + ${config.database}`,\n );\n logger.step(`Target: ${targetDir}`);\n\n // Check if directory already exists\n if (await directoryExists(targetDir)) {\n if (!process.stdin.isTTY) {\n logger.error(\n `Directory \"${config.projectName}\" already exists and cannot be confirmed in non-interactive mode.`,\n );\n logger.info(\n \"Use a different working directory or remove the existing directory before rerunning.\",\n );\n process.exit(1);\n }\n\n const overwrite = await p.confirm({\n message: `Directory \"${config.projectName}\" already exists. Overwrite?`,\n initialValue: false,\n });\n if (p.isCancel(overwrite) || !overwrite) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n }\n\n // Generate project\n const spinner = p.spinner();\n spinner.start(\"Generating project files\");\n\n try {\n await generateProject(config, targetDir);\n spinner.stop(\"Project files generated\");\n } catch (err) {\n spinner.stop(\"Failed to generate project files\");\n logger.error(getErrorMessage(err));\n logRecoverySuggestion(\"generation\", err);\n process.exit(1);\n }\n\n // Install dependencies\n if (options.install !== false) {\n const pm = detectPackageManager();\n spinner.start(`Installing dependencies with ${pm}`);\n\n try {\n await installDependencies(targetDir, pm);\n spinner.stop(\"Dependencies installed\");\n } catch (err) {\n spinner.stop(\"Failed to install dependencies\");\n logger.warning(\"Dependency installation failed.\");\n logger.info(`Manual command: ${getInstallCommand(pm)}`);\n logRecoverySuggestion(\"install\", err);\n logger.debug(getErrorMessage(err));\n }\n }\n\n // Git & GitHub\n let githubResult: GitHubResult | undefined;\n const shouldGit = options.git !== false;\n\n if (shouldGit && config.github?.createRepo) {\n // Full GitHub flow: init git + create repo + push\n try {\n githubResult = await setupGitHub(config.github, targetDir);\n } catch (err) {\n logger.error(getErrorMessage(err));\n logRecoverySuggestion(\"github\", err);\n }\n } else if (shouldGit) {\n // Just init a local git repo (no GitHub)\n const gitAvailable = await isGitInstalled();\n if (gitAvailable) {\n spinner.start(\"Initializing git repository\");\n try {\n await initGitRepo(targetDir);\n spinner.stop(\"Git repository initialized\");\n } catch (err) {\n spinner.stop(\"Failed to initialize git\");\n logger.warning(\"Git initialization failed. Skipping git setup.\");\n logger.debug(getErrorMessage(err));\n }\n } else {\n logger.warning(\"Git is not installed. Skipping git initialization.\");\n logger.info(\"Install git and run: git init && git add -A && git commit -m \\\"Initial commit\\\"\");\n }\n }\n\n // Deployment\n let deployResult: DeployResult | undefined;\n\n if (config.deployment) {\n try {\n if (config.deployment.platform === \"vercel\") {\n deployResult = await deployToVercel(config, targetDir);\n } else if (config.deployment.platform === \"railway\") {\n deployResult = await deployToRailway(config, targetDir);\n }\n } catch (err) {\n logger.error(getErrorMessage(err));\n logRecoverySuggestion(\"deployment\", err);\n }\n }\n\n // Success summary\n const pm = detectPackageManager();\n logger.blank();\n p.outro(\"Your auth backend is ready!\");\n logger.blank();\n\n logger.success(`Project created at ./${config.projectName}`);\n logger.info(\n `Configuration: ${config.framework}/${config.orm}-${config.database}`,\n );\n\n if (githubResult) {\n logger.success(`GitHub repository: ${githubResult.repoUrl}`);\n }\n\n if (deployResult) {\n logger.success(`Deployed to ${deployResult.platform}: ${deployResult.url}`);\n }\n\n logger.blank();\n\n if (deployResult) {\n logger.box(\n \"Next steps:\",\n [\n ` 1. Configure OAuth credentials in your ${deployResult.platform} dashboard`,\n ` 2. Test auth endpoints at ${deployResult.url}/api/auth`,\n ` 3. Integrate with your frontend`,\n ].join(\"\\n\"),\n );\n } else {\n logger.box(\n \"Next steps:\",\n [\n ` 1. cd ${config.projectName}`,\n ` 2. cp .env.example .env`,\n ` 3. Update DATABASE_URL in .env`,\n ` 4. ${getRunCommand(pm, \"db:push\")}`,\n ` 5. ${getRunCommand(pm, \"dev\")}`,\n \"\",\n ` Your auth backend will be running at http://localhost:3000`,\n ].join(\"\\n\"),\n );\n }\n}\n","import * as p from \"@clack/prompts\";\nimport type {\n ScaffauthConfig,\n Framework,\n Database,\n ORM,\n SessionStrategy,\n OAuthProvider,\n EmailProvider,\n DeploymentPlatform,\n} from \"../types/index.js\";\nimport { validateProjectName } from \"../utils/validators.js\";\n\nfunction parsePositiveInteger(value: string): number {\n return Number.parseInt(value.trim(), 10);\n}\n\nexport async function gatherConfig(): Promise<ScaffauthConfig> {\n p.intro(\"Welcome to Scaffauth!\");\n\n // --- Project name ---\n const projectName = await p.text({\n message: \"What is your project name?\",\n placeholder: \"my-auth-backend\",\n validate: validateProjectName,\n });\n if (p.isCancel(projectName)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- Framework ---\n const framework = await p.select({\n message: \"Which backend framework?\",\n options: [\n {\n value: \"hono\" as Framework,\n label: \"Hono\",\n hint: \"Modern, fast, edge-compatible (recommended)\",\n },\n {\n value: \"fastify\" as Framework,\n label: \"Fastify\",\n hint: \"Battle-tested, huge ecosystem\",\n },\n {\n value: \"express\" as Framework,\n label: \"Express\",\n hint: \"Most familiar, largest community\",\n },\n ],\n });\n if (p.isCancel(framework)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- Database ---\n const database = await p.select({\n message: \"Which database?\",\n options: [\n {\n value: \"postgres\" as Database,\n label: \"PostgreSQL\",\n hint: \"Production-grade (recommended)\",\n },\n {\n value: \"mysql\" as Database,\n label: \"MySQL\",\n hint: \"Popular alternative\",\n },\n {\n value: \"sqlite\" as Database,\n label: \"SQLite\",\n hint: \"Quick local development\",\n },\n ],\n });\n if (p.isCancel(database)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- ORM ---\n const orm = await p.select({\n message: \"Which ORM / query builder?\",\n options: [\n {\n value: \"drizzle\" as ORM,\n label: \"Drizzle\",\n hint: \"Best TypeScript DX (recommended)\",\n },\n {\n value: \"prisma\" as ORM,\n label: \"Prisma\",\n hint: \"Most popular, great tooling\",\n },\n {\n value: \"kysely\" as ORM,\n label: \"Kysely\",\n hint: \"Type-safe SQL query builder\",\n },\n ],\n });\n if (p.isCancel(orm)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- OAuth providers ---\n const providers = await p.multiselect({\n message: \"Which OAuth providers? (Space to select, Enter to confirm)\",\n options: [\n { value: \"github\" as OAuthProvider, label: \"GitHub\" },\n { value: \"google\" as OAuthProvider, label: \"Google\" },\n { value: \"discord\" as OAuthProvider, label: \"Discord\" },\n { value: \"twitter\" as OAuthProvider, label: \"Twitter/X\" },\n { value: \"apple\" as OAuthProvider, label: \"Apple\" },\n { value: \"microsoft\" as OAuthProvider, label: \"Microsoft\" },\n ],\n required: false,\n });\n if (p.isCancel(providers)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- Two-factor auth ---\n const twoFactor = await p.confirm({\n message: \"Enable two-factor authentication (2FA)?\",\n initialValue: false,\n });\n if (p.isCancel(twoFactor)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- Email provider ---\n const useEmail = await p.confirm({\n message: \"Set up email verification & password reset?\",\n initialValue: false,\n });\n if (p.isCancel(useEmail)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n let emailProvider: EmailProvider | undefined;\n if (useEmail) {\n const provider = await p.select({\n message: \"Which email provider?\",\n options: [\n {\n value: \"resend\" as EmailProvider,\n label: \"Resend\",\n hint: \"Modern email API (recommended)\",\n },\n {\n value: \"sendgrid\" as EmailProvider,\n label: \"SendGrid\",\n hint: \"Enterprise-grade email\",\n },\n {\n value: \"smtp\" as EmailProvider,\n label: \"SMTP\",\n hint: \"Any SMTP server\",\n },\n ],\n });\n if (p.isCancel(provider)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n emailProvider = provider;\n }\n\n // --- RBAC ---\n const rbac = await p.confirm({\n message: \"Enable role-based access control (RBAC)?\",\n initialValue: false,\n });\n if (p.isCancel(rbac)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n // --- Session configuration ---\n const sessionStrategy = await p.select({\n message: \"Session strategy?\",\n options: [\n {\n value: \"database\" as SessionStrategy,\n label: \"Database sessions\",\n hint: \"Store and validate sessions via database (recommended)\",\n },\n {\n value: \"database-cookie-cache\" as SessionStrategy,\n label: \"Database + cookie cache\",\n hint: \"Add short-lived cookie cache for fewer DB reads\",\n },\n ],\n });\n if (p.isCancel(sessionStrategy)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n const sessionLifetimeDays = await p.text({\n message: \"Session lifetime (days)\",\n placeholder: \"7\",\n initialValue: \"7\",\n validate: (value) => {\n const parsed = parsePositiveInteger(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n return \"Enter a positive integer number of days.\";\n }\n },\n });\n if (p.isCancel(sessionLifetimeDays)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n const sessionRefreshHours = await p.text({\n message: \"Session refresh/update age (hours)\",\n placeholder: \"24\",\n initialValue: \"24\",\n validate: (value) => {\n const parsed = parsePositiveInteger(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n return \"Enter a positive integer number of hours.\";\n }\n },\n });\n if (p.isCancel(sessionRefreshHours)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n let cookieCacheMaxAgeSeconds = 300;\n if (sessionStrategy === \"database-cookie-cache\") {\n const cookieCacheMaxAge = await p.text({\n message: \"Cookie cache max age (seconds)\",\n placeholder: \"300\",\n initialValue: \"300\",\n validate: (value) => {\n const parsed = parsePositiveInteger(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n return \"Enter a positive integer number of seconds.\";\n }\n },\n });\n if (p.isCancel(cookieCacheMaxAge)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n cookieCacheMaxAgeSeconds = parsePositiveInteger(cookieCacheMaxAge);\n }\n\n // --- GitHub repo ---\n const createGitHubRepo = await p.confirm({\n message: \"Create a GitHub repository?\",\n initialValue: false,\n });\n if (p.isCancel(createGitHubRepo)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n let githubConfig: ScaffauthConfig[\"github\"] | undefined;\n if (createGitHubRepo) {\n const repoPrivate = await p.confirm({\n message: \"Make the repository private?\",\n initialValue: false,\n });\n if (p.isCancel(repoPrivate)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n githubConfig = {\n createRepo: true,\n repoName: projectName,\n private: repoPrivate,\n };\n }\n\n // --- Deployment ---\n const deploy = await p.confirm({\n message: \"Deploy now?\",\n initialValue: false,\n });\n if (p.isCancel(deploy)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n let deploymentConfig: ScaffauthConfig[\"deployment\"] | undefined;\n if (deploy) {\n const platform = await p.select({\n message: \"Which platform?\",\n options: [\n {\n value: \"vercel\" as DeploymentPlatform,\n label: \"Vercel\",\n hint: \"Serverless, edge-optimized\",\n },\n {\n value: \"railway\" as DeploymentPlatform,\n label: \"Railway\",\n hint: \"Full-stack platform\",\n },\n ],\n });\n if (p.isCancel(platform)) {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n deploymentConfig = {\n platform,\n environmentVars: {},\n };\n }\n\n return {\n projectName,\n framework,\n database,\n orm,\n authConfig: {\n emailPassword: true,\n providers: providers as OAuthProvider[],\n twoFactor,\n emailProvider,\n rbac,\n session: {\n strategy: sessionStrategy,\n expiresIn: parsePositiveInteger(sessionLifetimeDays) * 24 * 60 * 60,\n updateAge: parsePositiveInteger(sessionRefreshHours) * 60 * 60,\n cookieCacheEnabled: sessionStrategy === \"database-cookie-cache\",\n cookieCacheMaxAge: cookieCacheMaxAgeSeconds,\n },\n },\n deployment: deploymentConfig,\n github: githubConfig,\n };\n}\n\n/**\n * Return a config with sensible defaults (used with --yes flag).\n */\nexport function getDefaultConfig(\n projectName = \"scaffauth-project\",\n): ScaffauthConfig {\n return {\n projectName,\n framework: \"hono\",\n database: \"postgres\",\n orm: \"drizzle\",\n authConfig: {\n emailPassword: true,\n providers: [\"github\"],\n twoFactor: false,\n rbac: false,\n session: {\n strategy: \"database\",\n expiresIn: 7 * 24 * 60 * 60,\n updateAge: 24 * 60 * 60,\n cookieCacheEnabled: false,\n cookieCacheMaxAge: 300,\n },\n },\n };\n}\n","import type { Database, Framework, ORM } from \"../types/index.js\";\n\nexport function validateProjectName(name: string): string | undefined {\n if (!name || name.trim().length === 0) {\n return \"Project name is required\";\n }\n\n if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(name)) {\n return \"Project name must be lowercase alphanumeric with hyphens (e.g. my-auth-api)\";\n }\n\n if (name.length > 100) {\n return \"Project name must be 100 characters or less\";\n }\n\n if (name.includes(\"--\")) {\n return \"Project name cannot contain consecutive hyphens\";\n }\n\n return undefined;\n}\n\nconst VALID_FRAMEWORKS: Framework[] = [\"hono\", \"fastify\", \"express\"];\nconst VALID_ORMS: ORM[] = [\"drizzle\", \"prisma\", \"kysely\"];\nconst VALID_DATABASES: Database[] = [\"postgres\", \"mysql\", \"sqlite\"];\n\nexport interface ParsedTemplate {\n framework: Framework;\n orm: ORM;\n database: Database;\n}\n\n/**\n * Parse a --template value in the format: framework/orm-database\n * Example: hono/drizzle-postgres\n */\nexport function parseTemplateOption(template: string): ParsedTemplate {\n const value = template.trim().toLowerCase();\n const [frameworkPart, ormDatabasePart] = value.split(\"/\");\n\n if (!frameworkPart || !ormDatabasePart || value.split(\"/\").length !== 2) {\n throw new Error(\n `Invalid template \"${template}\". Expected format: framework/orm-database (e.g. hono/drizzle-postgres).`,\n );\n }\n\n const [ormPart, databasePart] = ormDatabasePart.split(\"-\");\n if (!ormPart || !databasePart || ormDatabasePart.split(\"-\").length !== 2) {\n throw new Error(\n `Invalid template \"${template}\". Expected format: framework/orm-database (e.g. hono/drizzle-postgres).`,\n );\n }\n\n if (!VALID_FRAMEWORKS.includes(frameworkPart as Framework)) {\n throw new Error(\n `Unknown framework \"${frameworkPart}\". Supported: ${VALID_FRAMEWORKS.join(\", \")}.`,\n );\n }\n\n if (!VALID_ORMS.includes(ormPart as ORM)) {\n throw new Error(`Unknown ORM \"${ormPart}\". Supported: ${VALID_ORMS.join(\", \")}.`);\n }\n\n if (!VALID_DATABASES.includes(databasePart as Database)) {\n throw new Error(\n `Unknown database \"${databasePart}\". Supported: ${VALID_DATABASES.join(\", \")}.`,\n );\n }\n\n return {\n framework: frameworkPart as Framework,\n orm: ormPart as ORM,\n database: databasePart as Database,\n };\n}\n","import path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport crypto from \"crypto\";\nimport Handlebars from \"handlebars\";\nimport type { ScaffauthConfig, TemplateContext } from \"../types/index.js\";\nimport { copyTemplate } from \"../utils/fileOperations.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Register Handlebars helpers\nHandlebars.registerHelper(\"uppercase\", (str: string) => str.toUpperCase());\nHandlebars.registerHelper(\n \"eq\",\n (a: string, b: string) => a === b,\n);\nHandlebars.registerHelper(\n \"or\",\n (...args: unknown[]) => {\n // Last arg is the Handlebars options object\n const values = args.slice(0, -1);\n return values.some(Boolean);\n },\n);\n\n/**\n * Resolve the path to a template directory based on user selections.\n */\nfunction getTemplatePath(config: ScaffauthConfig): string {\n const { framework, orm, database } = config;\n const templateName = `${orm}-${database}`;\n\n // When running from dist (bundled), templates are in dist/templates/\n // When running from src (dev), templates are in src/templates/\n const templateDir = path.resolve(__dirname, \"templates\", framework, templateName);\n\n logger.debug(`Template path: ${templateDir}`);\n return templateDir;\n}\n\n/**\n * Build a TemplateContext from ScaffauthConfig for Handlebars rendering.\n */\nfunction buildTemplateContext(config: ScaffauthConfig): TemplateContext {\n return {\n projectName: config.projectName,\n framework: config.framework,\n database: config.database,\n orm: config.orm,\n providers: config.authConfig.providers,\n twoFactor: config.authConfig.twoFactor,\n rbac: config.authConfig.rbac,\n emailProvider: config.authConfig.emailProvider,\n sessionExpiresIn: config.authConfig.session.expiresIn,\n sessionUpdateAge: config.authConfig.session.updateAge,\n sessionCookieCacheEnabled: config.authConfig.session.cookieCacheEnabled,\n sessionCookieCacheMaxAge: config.authConfig.session.cookieCacheMaxAge,\n // Generate a random auth secret for the .env.example\n authSecret: crypto.randomBytes(32).toString(\"hex\"),\n };\n}\n\n/**\n * Main generator: scaffolds a full project from user config.\n */\nexport async function generateProject(\n config: ScaffauthConfig,\n targetDir: string,\n): Promise<void> {\n const templatePath = getTemplatePath(config);\n const context = buildTemplateContext(config);\n\n logger.debug(`Generating project at: ${targetDir}`);\n logger.debug(`Using template: ${templatePath}`);\n\n // Copy template files, processing .hbs files with Handlebars\n await copyTemplate(templatePath, targetDir, context);\n\n logger.debug(\"Project generation complete\");\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport Handlebars from \"handlebars\";\nimport type { TemplateContext } from \"../types/index.js\";\n\n/**\n * Copy a template directory to the target, processing .hbs files with Handlebars.\n */\nexport async function copyTemplate(\n templateDir: string,\n targetDir: string,\n context: TemplateContext,\n): Promise<void> {\n await fs.ensureDir(targetDir);\n\n const entries = await fs.readdir(templateDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(templateDir, entry.name);\n let destName = entry.name;\n\n // Strip .hbs extension from destination\n if (destName.endsWith(\".hbs\")) {\n destName = destName.slice(0, -4);\n }\n\n const destPath = path.join(targetDir, destName);\n\n if (entry.isDirectory()) {\n await copyTemplate(srcPath, destPath, context);\n } else if (entry.name.endsWith(\".hbs\")) {\n // Process as Handlebars template\n const content = await fs.readFile(srcPath, \"utf-8\");\n const template = Handlebars.compile(content);\n const rendered = template(context);\n await fs.writeFile(destPath, rendered, \"utf-8\");\n } else {\n // Copy as-is\n await fs.copy(srcPath, destPath);\n }\n }\n}\n\n/**\n * Write a JSON object to a file with pretty formatting.\n */\nexport async function writeJson(\n filePath: string,\n data: Record<string, unknown>,\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/**\n * Write a string to a file, creating parent directories if needed.\n */\nexport async function writeFile(\n filePath: string,\n content: string,\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Check if a directory already exists and is non-empty.\n */\nexport async function directoryExists(dir: string): Promise<boolean> {\n try {\n const stat = await fs.stat(dir);\n if (!stat.isDirectory()) return false;\n const files = await fs.readdir(dir);\n return files.length > 0;\n } catch {\n return false;\n }\n}\n","import chalk from \"chalk\";\n\nexport const logger = {\n info(message: string) {\n console.log(chalk.blue(\"i\"), message);\n },\n\n success(message: string) {\n console.log(chalk.green(\"✓\"), message);\n },\n\n warning(message: string) {\n console.log(chalk.yellow(\"⚠\"), message);\n },\n\n error(message: string) {\n console.log(chalk.red(\"✗\"), message);\n },\n\n step(message: string) {\n console.log(chalk.cyan(\"→\"), message);\n },\n\n debug(message: string) {\n if (process.env.SCAFFAUTH_DEBUG) {\n console.log(chalk.gray(\"[debug]\"), message);\n }\n },\n\n blank() {\n console.log();\n },\n\n box(title: string, content: string) {\n console.log();\n console.log(chalk.bold(title));\n console.log(content);\n console.log();\n },\n};\n","import { execa } from \"execa\";\nimport type { PackageManager } from \"../utils/packageManager.js\";\nimport { getInstallCommand } from \"../utils/packageManager.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Install project dependencies using the detected package manager.\n */\nexport async function installDependencies(\n projectDir: string,\n pm: PackageManager,\n): Promise<void> {\n const command = getInstallCommand(pm);\n const [cmd, ...args] = command.split(\" \");\n\n logger.debug(`Running: ${command} in ${projectDir}`);\n\n await execa(cmd, args, {\n cwd: projectDir,\n stdio: \"pipe\",\n });\n}\n","export type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/**\n * Detect which package manager the user invoked with.\n * Falls back to npm.\n */\nexport function detectPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent;\n\n if (userAgent) {\n if (userAgent.startsWith(\"pnpm\")) return \"pnpm\";\n if (userAgent.startsWith(\"yarn\")) return \"yarn\";\n if (userAgent.startsWith(\"bun\")) return \"bun\";\n }\n\n return \"npm\";\n}\n\nexport function getInstallCommand(pm: PackageManager): string {\n switch (pm) {\n case \"pnpm\":\n return \"pnpm install\";\n case \"yarn\":\n return \"yarn\";\n case \"bun\":\n return \"bun install\";\n default:\n return \"npm install\";\n }\n}\n\nexport function getRunCommand(pm: PackageManager, script: string): string {\n switch (pm) {\n case \"pnpm\":\n return `pnpm ${script}`;\n case \"yarn\":\n return `yarn ${script}`;\n case \"bun\":\n return `bun run ${script}`;\n default:\n return `npm run ${script}`;\n }\n}\n","import { execa } from \"execa\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Check if git is available on the system.\n */\nexport async function isGitInstalled(): Promise<boolean> {\n try {\n await execa(\"git\", [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Initialize a git repository, stage all files, and create an initial commit.\n */\nexport async function initGitRepo(projectDir: string): Promise<void> {\n logger.debug(`Initializing git repo in ${projectDir}`);\n\n await execa(\"git\", [\"init\"], { cwd: projectDir });\n await execa(\"git\", [\"add\", \"-A\"], { cwd: projectDir });\n await execa(\"git\", [\"commit\", \"-m\", \"Initial commit from Scaffauth\"], {\n cwd: projectDir,\n });\n}\n\n/**\n * Add a remote origin and push to it.\n */\nexport async function pushToRemote(\n projectDir: string,\n remoteUrl: string,\n): Promise<void> {\n logger.debug(`Adding remote: ${remoteUrl}`);\n\n await execa(\"git\", [\"remote\", \"add\", \"origin\", remoteUrl], {\n cwd: projectDir,\n });\n await execa(\"git\", [\"branch\", \"-M\", \"main\"], { cwd: projectDir });\n await execa(\"git\", [\"push\", \"-u\", \"origin\", \"main\"], { cwd: projectDir });\n}\n","import { Octokit } from \"@octokit/rest\";\nimport { execa } from \"execa\";\nimport * as p from \"@clack/prompts\";\nimport type { GitHubConfig } from \"../types/index.js\";\nimport { logger } from \"./logger.js\";\nimport { initGitRepo, pushToRemote } from \"./gitOperations.js\";\n\n/**\n * Try to get a GitHub token from the gh CLI, falling back to manual input.\n */\nasync function getGitHubToken(): Promise<string> {\n // Try gh CLI first\n try {\n const { stdout } = await execa(\"gh\", [\"auth\", \"token\"]);\n const token = stdout.trim();\n if (token) {\n logger.debug(\"Using token from gh CLI\");\n return token;\n }\n } catch {\n logger.debug(\"gh CLI not available or not authenticated\");\n }\n\n // Fall back to manual input\n const token = await p.password({\n message: \"Enter your GitHub personal access token:\",\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return \"Token is required\";\n }\n },\n });\n\n if (p.isCancel(token)) {\n throw new Error(\"GitHub authentication cancelled\");\n }\n\n return token;\n}\n\nexport interface GitHubResult {\n repoUrl: string;\n cloneUrl: string;\n}\n\n/**\n * Full GitHub workflow: authenticate, create repo, init git, push.\n */\nexport async function setupGitHub(\n config: GitHubConfig,\n projectDir: string,\n): Promise<GitHubResult> {\n const spinner = p.spinner();\n\n // 1. Authenticate\n spinner.start(\"Authenticating with GitHub\");\n const token = await getGitHubToken();\n const octokit = new Octokit({ auth: token });\n\n let username: string;\n try {\n const { data: user } = await octokit.users.getAuthenticated();\n username = user.login;\n spinner.stop(`Authenticated as ${username}`);\n } catch {\n spinner.stop(\"GitHub authentication failed\");\n throw new Error(\n \"Invalid GitHub token. Make sure it has the 'repo' scope.\",\n );\n }\n\n // 2. Create repository\n spinner.start(\"Creating GitHub repository\");\n let repoUrl: string;\n let cloneUrl: string;\n try {\n const { data: repo } = await octokit.repos.createForAuthenticatedUser({\n name: config.repoName,\n private: config.private,\n description:\n config.description || \"Auth backend powered by Better Auth\",\n auto_init: false,\n });\n repoUrl = repo.html_url;\n cloneUrl = repo.clone_url;\n spinner.stop(`Repository created: ${repoUrl}`);\n } catch (err) {\n spinner.stop(\"Failed to create repository\");\n if (err instanceof Error && err.message.includes(\"name already exists\")) {\n throw new Error(\n `Repository \"${config.repoName}\" already exists on GitHub.`,\n );\n }\n throw err;\n }\n\n // 3. Init git and push\n spinner.start(\"Pushing code to GitHub\");\n try {\n await initGitRepo(projectDir);\n await pushToRemote(projectDir, cloneUrl);\n spinner.stop(\"Code pushed to GitHub\");\n } catch (err) {\n spinner.stop(\"Failed to push to GitHub\");\n logger.debug(err instanceof Error ? err.message : String(err));\n throw new Error(\n \"Failed to push to GitHub. Make sure git is installed and configured.\",\n );\n }\n\n return { repoUrl, cloneUrl };\n}\n","import path from \"path\";\nimport { execa } from \"execa\";\nimport * as p from \"@clack/prompts\";\nimport fs from \"fs-extra\";\nimport type { ScaffauthConfig, DeployResult } from \"../types/index.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Check if the Vercel CLI is installed.\n */\nasync function checkVercelCLI(): Promise<boolean> {\n try {\n await execa(\"vercel\", [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a vercel.json configuration file for the project.\n */\nfunction generateVercelConfig(_config: ScaffauthConfig): Record<string, unknown> {\n return {\n version: 2,\n builds: [\n {\n src: \"src/index.ts\",\n use: \"@vercel/node\",\n },\n ],\n routes: [\n {\n src: \"/(.*)\",\n dest: \"src/index.ts\",\n },\n ],\n };\n}\n\n/**\n * Deploy to Vercel: write config, set env vars, run deploy.\n */\nexport async function deployToVercel(\n config: ScaffauthConfig,\n projectDir: string,\n): Promise<DeployResult> {\n const spinner = p.spinner();\n\n // 1. Check CLI\n spinner.start(\"Checking Vercel CLI\");\n const hasVercel = await checkVercelCLI();\n if (!hasVercel) {\n spinner.stop(\"Vercel CLI not found\");\n p.note(\"Install with: npm i -g vercel\", \"Missing dependency\");\n throw new Error(\n \"Vercel CLI is not installed. Run 'npm i -g vercel' and try again.\",\n );\n }\n spinner.stop(\"Vercel CLI found\");\n\n // 2. Write vercel.json\n spinner.start(\"Configuring Vercel project\");\n const vercelConfig = generateVercelConfig(config);\n await fs.writeFile(\n path.join(projectDir, \"vercel.json\"),\n JSON.stringify(vercelConfig, null, 2) + \"\\n\",\n );\n spinner.stop(\"Vercel configuration written\");\n\n // 3. Link or create project (interactive - Vercel CLI handles auth)\n spinner.start(\"Deploying to Vercel\");\n try {\n const { stdout } = await execa(\"vercel\", [\"--prod\", \"--yes\"], {\n cwd: projectDir,\n // Vercel CLI may need terminal interaction for first-time login\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n\n // Extract URL from output\n const urlMatch = stdout.match(/https:\\/\\/[^\\s]+/);\n const deploymentUrl = urlMatch ? urlMatch[0] : \"deployment URL unavailable\";\n\n spinner.stop(`Deployed to Vercel: ${deploymentUrl}`);\n\n return { url: deploymentUrl, platform: \"vercel\" };\n } catch (err) {\n spinner.stop(\"Vercel deployment failed\");\n logger.debug(err instanceof Error ? err.message : String(err));\n throw new Error(\n \"Vercel deployment failed. Run 'vercel login' first, then try 'vercel --prod' in the project directory.\",\n );\n }\n}\n","import { execa } from \"execa\";\nimport * as p from \"@clack/prompts\";\nimport type { ScaffauthConfig, DeployResult } from \"../types/index.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Check if the Railway CLI is installed.\n */\nasync function checkRailwayCLI(): Promise<boolean> {\n try {\n await execa(\"railway\", [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Deploy to Railway: init project, provision DB, set env vars, deploy.\n */\nexport async function deployToRailway(\n config: ScaffauthConfig,\n projectDir: string,\n): Promise<DeployResult> {\n const spinner = p.spinner();\n\n // 1. Check CLI\n spinner.start(\"Checking Railway CLI\");\n const hasRailway = await checkRailwayCLI();\n if (!hasRailway) {\n spinner.stop(\"Railway CLI not found\");\n p.note(\"Install with: npm i -g @railway/cli\", \"Missing dependency\");\n throw new Error(\n \"Railway CLI is not installed. Run 'npm i -g @railway/cli' and try again.\",\n );\n }\n spinner.stop(\"Railway CLI found\");\n\n // 2. Initialize Railway project\n spinner.start(\"Creating Railway project\");\n try {\n await execa(\"railway\", [\"init\"], {\n cwd: projectDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n spinner.stop(\"Railway project created\");\n } catch (err) {\n spinner.stop(\"Failed to create Railway project\");\n logger.debug(err instanceof Error ? err.message : String(err));\n throw new Error(\n \"Failed to initialize Railway project. Run 'railway login' first.\",\n );\n }\n\n // 3. Provision PostgreSQL if using postgres\n if (config.database === \"postgres\") {\n spinner.start(\"Provisioning PostgreSQL database\");\n try {\n await execa(\"railway\", [\"add\", \"--plugin\", \"postgresql\"], {\n cwd: projectDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n spinner.stop(\"PostgreSQL database provisioned\");\n } catch (err) {\n spinner.stop(\"Failed to provision database\");\n logger.warning(\n \"You may need to add a database manually in the Railway dashboard.\",\n );\n logger.debug(err instanceof Error ? err.message : String(err));\n }\n }\n\n // 4. Deploy\n spinner.start(\"Deploying to Railway\");\n try {\n await execa(\"railway\", [\"up\", \"--detach\"], {\n cwd: projectDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n spinner.stop(\"Deployed to Railway\");\n } catch (err) {\n spinner.stop(\"Railway deployment failed\");\n logger.debug(err instanceof Error ? err.message : String(err));\n throw new Error(\n \"Railway deployment failed. Try running 'railway up' in the project directory.\",\n );\n }\n\n // 5. Get deployment URL\n let deploymentUrl = \"check Railway dashboard for URL\";\n try {\n const { stdout } = await execa(\"railway\", [\"domain\"], {\n cwd: projectDir,\n });\n if (stdout.trim()) {\n deploymentUrl = stdout.trim();\n }\n } catch {\n logger.debug(\"Could not retrieve Railway domain automatically\");\n }\n\n return { url: deploymentUrl, platform: \"railway\" };\n}\n","{\n \"name\": \"create-scaffauth\",\n \"version\": \"0.1.4\",\n \"description\": \"Scaffold production-ready Better Auth backends\",\n \"type\": \"module\",\n \"bin\": {\n \"create-scaffauth\": \"./dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"start\": \"node dist/index.js\",\n \"lint\": \"eslint src/\",\n \"lint:fix\": \"eslint src/ --fix\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.ts\\\"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublishOnly\": \"npm run build\"\n },\n \"keywords\": [\n \"auth\",\n \"authentication\",\n \"better-auth\",\n \"backend\",\n \"cli\",\n \"scaffolding\",\n \"hono\",\n \"fastify\",\n \"express\",\n \"oauth\",\n \"2fa\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/scaffauth/create-scaffauth\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/scaffauth/create-scaffauth/issues\"\n },\n \"homepage\": \"https://scaffauth.xyz\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^0.9.1\",\n \"@octokit/rest\": \"^21.1.1\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"execa\": \"^9.5.2\",\n \"fs-extra\": \"^11.3.0\",\n \"handlebars\": \"^4.7.8\",\n \"ora\": \"^8.2.0\"\n },\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/node\": \"^22.13.1\",\n \"eslint\": \"^9.20.0\",\n \"eslint-config-prettier\": \"^10.0.1\",\n \"prettier\": \"^3.5.1\",\n \"tsup\": \"^8.3.6\",\n \"typescript\": \"^5.7.3\",\n \"typescript-eslint\": \"^8.24.0\",\n \"vitest\": \"^3.0.5\"\n }\n}\n"],"mappings":"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","names":["path","p","path","Handlebars","path","Handlebars","execa","execa","execa","p","execa","token","spinner","path","execa","p","fs","execa","spinner","fs","path","execa","p","execa","spinner","path","spinner","pm"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
|
-
import { kyselyAdapter } from "better-auth/adapters/kysely";
|
|
3
2
|
import { db } from "../db/db";
|
|
4
3
|
{{#if twoFactor}}
|
|
5
4
|
import { twoFactor } from "better-auth/plugins";
|
|
@@ -31,9 +30,10 @@ const transporter = nodemailer.createTransport({
|
|
|
31
30
|
{{/if}}
|
|
32
31
|
|
|
33
32
|
export const auth = betterAuth({
|
|
34
|
-
database:
|
|
33
|
+
database: {
|
|
34
|
+
db,
|
|
35
35
|
type: "mysql",
|
|
36
|
-
}
|
|
36
|
+
},
|
|
37
37
|
emailAndPassword: {
|
|
38
38
|
enabled: true,
|
|
39
39
|
{{#if emailProvider}}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
|
-
import { kyselyAdapter } from "better-auth/adapters/kysely";
|
|
3
2
|
import { db } from "../db/db";
|
|
4
3
|
{{#if twoFactor}}
|
|
5
4
|
import { twoFactor } from "better-auth/plugins";
|
|
@@ -31,9 +30,10 @@ const transporter = nodemailer.createTransport({
|
|
|
31
30
|
{{/if}}
|
|
32
31
|
|
|
33
32
|
export const auth = betterAuth({
|
|
34
|
-
database:
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
database: {
|
|
34
|
+
db,
|
|
35
|
+
type: "postgres",
|
|
36
|
+
},
|
|
37
37
|
emailAndPassword: {
|
|
38
38
|
enabled: true,
|
|
39
39
|
{{#if emailProvider}}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
|
-
import { kyselyAdapter } from "better-auth/adapters/kysely";
|
|
3
2
|
import { db } from "../db/db";
|
|
4
3
|
{{#if twoFactor}}
|
|
5
4
|
import { twoFactor } from "better-auth/plugins";
|
|
@@ -31,9 +30,10 @@ const transporter = nodemailer.createTransport({
|
|
|
31
30
|
{{/if}}
|
|
32
31
|
|
|
33
32
|
export const auth = betterAuth({
|
|
34
|
-
database:
|
|
33
|
+
database: {
|
|
34
|
+
db,
|
|
35
35
|
type: "sqlite",
|
|
36
|
-
}
|
|
36
|
+
},
|
|
37
37
|
emailAndPassword: {
|
|
38
38
|
enabled: true,
|
|
39
39
|
{{#if emailProvider}}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
|
-
import { kyselyAdapter } from "better-auth/adapters/kysely";
|
|
3
2
|
import { db } from "../db/db";
|
|
4
3
|
{{#if twoFactor}}
|
|
5
4
|
import { twoFactor } from "better-auth/plugins";
|
|
@@ -31,9 +30,10 @@ const transporter = nodemailer.createTransport({
|
|
|
31
30
|
{{/if}}
|
|
32
31
|
|
|
33
32
|
export const auth = betterAuth({
|
|
34
|
-
database:
|
|
33
|
+
database: {
|
|
34
|
+
db,
|
|
35
35
|
type: "mysql",
|
|
36
|
-
}
|
|
36
|
+
},
|
|
37
37
|
emailAndPassword: {
|
|
38
38
|
enabled: true,
|
|
39
39
|
{{#if emailProvider}}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
|
-
import { kyselyAdapter } from "better-auth/adapters/kysely";
|
|
3
2
|
import { db } from "../db/db";
|
|
4
3
|
{{#if twoFactor}}
|
|
5
4
|
import { twoFactor } from "better-auth/plugins";
|
|
@@ -31,9 +30,10 @@ const transporter = nodemailer.createTransport({
|
|
|
31
30
|
{{/if}}
|
|
32
31
|
|
|
33
32
|
export const auth = betterAuth({
|
|
34
|
-
database:
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
database: {
|
|
34
|
+
db,
|
|
35
|
+
type: "postgres",
|
|
36
|
+
},
|
|
37
37
|
emailAndPassword: {
|
|
38
38
|
enabled: true,
|
|
39
39
|
{{#if emailProvider}}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
|
-
import { kyselyAdapter } from "better-auth/adapters/kysely";
|
|
3
2
|
import { db } from "../db/db";
|
|
4
3
|
{{#if twoFactor}}
|
|
5
4
|
import { twoFactor } from "better-auth/plugins";
|
|
@@ -31,9 +30,10 @@ const transporter = nodemailer.createTransport({
|
|
|
31
30
|
{{/if}}
|
|
32
31
|
|
|
33
32
|
export const auth = betterAuth({
|
|
34
|
-
database:
|
|
33
|
+
database: {
|
|
34
|
+
db,
|
|
35
35
|
type: "sqlite",
|
|
36
|
-
}
|
|
36
|
+
},
|
|
37
37
|
emailAndPassword: {
|
|
38
38
|
enabled: true,
|
|
39
39
|
{{#if emailProvider}}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
|
-
import { kyselyAdapter } from "better-auth/adapters/kysely";
|
|
3
2
|
import { db } from "../db/db";
|
|
4
3
|
{{#if twoFactor}}
|
|
5
4
|
import { twoFactor } from "better-auth/plugins";
|
|
@@ -31,9 +30,10 @@ const transporter = nodemailer.createTransport({
|
|
|
31
30
|
{{/if}}
|
|
32
31
|
|
|
33
32
|
export const auth = betterAuth({
|
|
34
|
-
database:
|
|
33
|
+
database: {
|
|
34
|
+
db,
|
|
35
35
|
type: "mysql",
|
|
36
|
-
}
|
|
36
|
+
},
|
|
37
37
|
emailAndPassword: {
|
|
38
38
|
enabled: true,
|
|
39
39
|
{{#if emailProvider}}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
|
-
import { kyselyAdapter } from "better-auth/adapters/kysely";
|
|
3
2
|
import { db } from "../db/db";
|
|
4
3
|
{{#if twoFactor}}
|
|
5
4
|
import { twoFactor } from "better-auth/plugins";
|
|
@@ -31,9 +30,10 @@ const transporter = nodemailer.createTransport({
|
|
|
31
30
|
{{/if}}
|
|
32
31
|
|
|
33
32
|
export const auth = betterAuth({
|
|
34
|
-
database:
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
database: {
|
|
34
|
+
db,
|
|
35
|
+
type: "postgres",
|
|
36
|
+
},
|
|
37
37
|
emailAndPassword: {
|
|
38
38
|
enabled: true,
|
|
39
39
|
{{#if emailProvider}}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
|
-
import { kyselyAdapter } from "better-auth/adapters/kysely";
|
|
3
2
|
import { db } from "../db/db";
|
|
4
3
|
{{#if twoFactor}}
|
|
5
4
|
import { twoFactor } from "better-auth/plugins";
|
|
@@ -31,9 +30,10 @@ const transporter = nodemailer.createTransport({
|
|
|
31
30
|
{{/if}}
|
|
32
31
|
|
|
33
32
|
export const auth = betterAuth({
|
|
34
|
-
database:
|
|
33
|
+
database: {
|
|
34
|
+
db,
|
|
35
35
|
type: "sqlite",
|
|
36
|
-
}
|
|
36
|
+
},
|
|
37
37
|
emailAndPassword: {
|
|
38
38
|
enabled: true,
|
|
39
39
|
{{#if emailProvider}}
|