@stackframe/init-stack 2.8.43 → 2.8.44
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/CHANGELOG.md +8 -0
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ import { PostHog } from "posthog-node";
|
|
|
14
14
|
// package.json
|
|
15
15
|
var package_default = {
|
|
16
16
|
name: "@stackframe/init-stack",
|
|
17
|
-
version: "2.8.
|
|
17
|
+
version: "2.8.44",
|
|
18
18
|
description: "The setup wizard for Stack. https://stack-auth.com",
|
|
19
19
|
main: "dist/index.js",
|
|
20
20
|
type: "module",
|
|
@@ -226,8 +226,8 @@ async function main() {
|
|
|
226
226
|
if (type === "next") {
|
|
227
227
|
const projectInfo = await Steps.getNextProjectInfo({ packageJson: projectPackageJson });
|
|
228
228
|
await Steps.updateNextLayoutFile(projectInfo);
|
|
229
|
-
await Steps.writeStackAppFile(projectInfo, "client");
|
|
230
|
-
await Steps.writeStackAppFile(projectInfo, "server");
|
|
229
|
+
await Steps.writeStackAppFile(projectInfo, "client", true);
|
|
230
|
+
await Steps.writeStackAppFile(projectInfo, "server", true);
|
|
231
231
|
await Steps.writeNextHandlerFile(projectInfo);
|
|
232
232
|
await Steps.writeNextLoadingFile(projectInfo);
|
|
233
233
|
nextSteps.push(`Copy the environment variables from the new API key into your .env.local file`);
|
|
@@ -255,7 +255,7 @@ async function main() {
|
|
|
255
255
|
defaultExtension,
|
|
256
256
|
indentation: " ",
|
|
257
257
|
srcPath
|
|
258
|
-
}, w);
|
|
258
|
+
}, w, where.includes("client"));
|
|
259
259
|
appFiles.push(fileName);
|
|
260
260
|
}
|
|
261
261
|
nextSteps.push(
|
|
@@ -578,7 +578,7 @@ STACK_SECRET_SERVER_KEY=
|
|
|
578
578
|
laterWriteFile(res.path, res.updatedContent);
|
|
579
579
|
return res;
|
|
580
580
|
},
|
|
581
|
-
async writeStackAppFile({ type, srcPath, defaultExtension, indentation }, clientOrServer) {
|
|
581
|
+
async writeStackAppFile({ type, srcPath, defaultExtension, indentation }, clientOrServer, alsoHasClient) {
|
|
582
582
|
const packageName = await Steps.getStackPackageName(type);
|
|
583
583
|
const clientOrServerCap = {
|
|
584
584
|
client: "Client",
|
|
@@ -617,15 +617,17 @@ ${indentation}// get your Stack Auth API keys from https://app.stack-auth.com${c
|
|
|
617
617
|
return lines ? `
|
|
618
618
|
${lines}` : "";
|
|
619
619
|
})() : "";
|
|
620
|
+
const shouldInheritFromClient = clientOrServer === "server" && alsoHasClient;
|
|
620
621
|
laterWriteFileIfNotExists(
|
|
621
622
|
stackAppPath,
|
|
622
623
|
`
|
|
623
|
-
${type === "next" && clientOrServer === "server" ? `import "server-only"
|
|
624
|
+
${type === "next" && clientOrServer === "server" ? `import "server-only";
|
|
624
625
|
|
|
625
|
-
import { Stack${clientOrServerCap}App } from ${JSON.stringify(packageName)};
|
|
626
|
+
` : ""}import { Stack${clientOrServerCap}App } from ${JSON.stringify(packageName)};
|
|
627
|
+
${shouldInheritFromClient ? `import { stackClientApp } from "./client";
|
|
626
628
|
|
|
627
|
-
export const stack${clientOrServerCap}App = new Stack${clientOrServerCap}App({
|
|
628
|
-
${indentation}tokenStore: ${tokenStore},${jsOptions}${nextClientOptions}
|
|
629
|
+
` : "\n"}export const stack${clientOrServerCap}App = new Stack${clientOrServerCap}App({
|
|
630
|
+
${shouldInheritFromClient ? `${indentation}inheritsFrom: stackClientApp,` : `${indentation}tokenStore: ${tokenStore},${jsOptions}${nextClientOptions}`}
|
|
629
631
|
});
|
|
630
632
|
`.trim() + "\n"
|
|
631
633
|
);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import * as child_process from \"child_process\";\nimport { Command } from \"commander\";\nimport * as crypto from 'crypto';\nimport * as fs from \"fs\";\nimport inquirer from \"inquirer\";\nimport open from \"open\";\nimport * as os from 'os';\nimport * as path from \"path\";\nimport { PostHog } from 'posthog-node';\nimport packageJson from '../package.json';\n\nconst jsLikeFileExtensions: string[] = [\n \"mtsx\",\n \"ctsx\",\n \"tsx\",\n \"mts\",\n \"cts\",\n \"ts\",\n \"mjsx\",\n \"cjsx\",\n \"jsx\",\n \"mjs\",\n \"cjs\",\n \"js\",\n];\n\nclass UserError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UserError\";\n }\n}\n\nclass UnansweredQuestionError extends UserError {\n constructor(message: string) {\n super(message + \", or use --on-question <guess|ask> to answer questions automatically or interactively\");\n this.name = \"UnansweredQuestionError\";\n }\n}\n\ntype OnQuestionMode = \"ask\" | \"guess\" | \"error\";\n\nfunction isTruthyEnv(name: string): boolean {\n const v = process.env[name];\n if (!v) return false;\n const s = String(v).toLowerCase();\n return s === \"1\" || s === \"true\" || s === \"yes\";\n}\n\nfunction isNonInteractiveEnv(): boolean {\n if (isTruthyEnv(\"CI\")) return true;\n if (isTruthyEnv(\"GITHUB_ACTIONS\")) return true;\n if (isTruthyEnv(\"NONINTERACTIVE\")) return true;\n if (isTruthyEnv(\"NO_INTERACTIVE\")) return true;\n if (isTruthyEnv(\"PNPM_NON_INTERACTIVE\")) return true;\n if (isTruthyEnv(\"YARN_ENABLE_NON_INTERACTIVE\")) return true;\n if (isTruthyEnv(\"CURSOR_AGENT\")) return true;\n if (isTruthyEnv(\"CLAUDECODE\")) return true;\n return false;\n}\n\nfunction resolveOnQuestionMode(opt: string): OnQuestionMode {\n if (!opt || opt === \"default\") {\n return isNonInteractiveEnv() ? \"error\" : \"ask\";\n }\n if (opt === \"ask\" || opt === \"guess\" || opt === \"error\") {\n return opt;\n }\n throw new UserError(`Invalid argument for --on-question: \"${opt}\". Valid modes are: \"ask\", \"guess\", \"error\", \"default\".`);\n}\n\n// Setup command line parsing\nconst program = new Command();\nprogram\n .name(packageJson.name)\n .description(\"Stack Auth Initialization Tool\")\n .version(packageJson.version)\n .argument(\"[project-path]\", \"Path to your project\")\n .usage(`[project-path] [options]`)\n .option(\"--dry-run\", \"Run without making any changes\")\n .option(\"--neon\", \"Use Neon database\")\n .option(\"--js\", \"Initialize for JavaScript project\")\n .option(\"--next\", \"Initialize for Next.js project\")\n .option(\"--react\", \"Initialize for React project\")\n .option(\"--npm\", \"Use npm as package manager\")\n .option(\"--yarn\", \"Use yarn as package manager\")\n .option(\"--pnpm\", \"Use pnpm as package manager\")\n .option(\"--bun\", \"Use bun as package manager\")\n .option(\"--client\", \"Initialize client-side only\")\n .option(\"--server\", \"Initialize server-side only\")\n .option(\"--project-id <project-id>\", \"Project ID to use in setup\")\n .option(\"--publishable-client-key <publishable-client-key>\", \"Publishable client key to use in setup\")\n .option(\"--no-browser\", \"Don't open browser for environment variable setup\")\n .option(\"--on-question <mode>\", \"How to handle interactive questions: ask | guess | error | default\", \"default\")\n .addHelpText('after', `\nFor more information, please visit https://docs.stack-auth.com/getting-started/setup`);\n\nprogram.parse();\n\nconst options = program.opts();\n\n// Keep existing variables but assign from Commander\nlet savedProjectPath: string | undefined = program.args[0] || undefined;\nconst isDryRun: boolean = options.dryRun || false;\nconst isNeon: boolean = options.neon || false;\nconst typeFromArgs: \"js\" | \"next\" | \"react\" | undefined = options.js ? \"js\" : options.next ? \"next\" : options.react ? \"react\" : undefined;\nconst packageManagerFromArgs: string | undefined = options.npm ? \"npm\" : options.yarn ? \"yarn\" : options.pnpm ? \"pnpm\" : options.bun ? \"bun\" : undefined;\nconst isClient: boolean = options.client || false;\nconst isServer: boolean = options.server || false;\nconst projectIdFromArgs: string | undefined = options.projectId;\nconst publishableClientKeyFromArgs: string | undefined = options.publishableClientKey;\nconst onQuestionMode: OnQuestionMode = resolveOnQuestionMode(options.onQuestion);\n\n// Commander negates the boolean options with prefix `--no-`\n// so `--no-browser` becomes `browser: false`\nconst noBrowser: boolean = !options.browser;\n\ntype Ansis = {\n red: string,\n blue: string,\n green: string,\n yellow: string,\n clear: string,\n bold: string,\n};\n\nconst ansis: Ansis = {\n red: \"\\x1b[31m\",\n blue: \"\\x1b[34m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n\n clear: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n};\n\ntype TemplateFunction = (strings: TemplateStringsArray, ...values: any[]) => string;\n\ntype Colorize = {\n red: TemplateFunction,\n blue: TemplateFunction,\n green: TemplateFunction,\n yellow: TemplateFunction,\n bold: TemplateFunction,\n};\n\nconst colorize: Colorize = {\n red: (strings, ...values) => ansis.red + templateIdentity(strings, ...values) + ansis.clear,\n blue: (strings, ...values) => ansis.blue + templateIdentity(strings, ...values) + ansis.clear,\n green: (strings, ...values) => ansis.green + templateIdentity(strings, ...values) + ansis.clear,\n yellow: (strings, ...values) => ansis.yellow + templateIdentity(strings, ...values) + ansis.clear,\n bold: (strings, ...values) => ansis.bold + templateIdentity(strings, ...values) + ansis.clear,\n};\n\nconst filesCreated: string[] = [];\nconst filesModified: string[] = [];\nconst commandsExecuted: string[] = [];\n\nconst packagesToInstall: string[] = [];\nconst writeFileHandlers: Array<() => Promise<void>> = [];\nconst nextSteps: string[] = [\n `Create an account and Stack Auth API key for your project on https://app.stack-auth.com`,\n];\n\n\nconst STACK_AUTH_PUBLIC_HOG_KEY = \"phc_vIUFi0HzHo7oV26OsaZbUASqxvs8qOmap1UBYAutU4k\";\nconst EVENT_PREFIX = \"stack-init-\";\nconst ph_client = new PostHog(STACK_AUTH_PUBLIC_HOG_KEY, {\n host: \"https://eu.i.posthog.com\",\n flushAt: 1,\n flushInterval: 0,\n});\nconst distinctId = crypto.randomUUID();\n\n\nasync function capture(event: string, properties: Record<string, any>) {\n ph_client.capture({\n event: `${EVENT_PREFIX}${event}`,\n distinctId,\n properties,\n });\n}\n\n\nasync function main(): Promise<void> {\n // Welcome message\n console.log();\n console.log(`\n ██████\n ██████████████\n████████████████████\n████████████████████ WELCOME TO\n█████████████████ ╔═╗╔╦╗╔═╗╔═╗╦╔═ ┌─┐┬ ┬┌┬┐┬ ┬\n█████████████ ╚═╗ ║ ╠═╣║ ╠╩╗ ├─┤│ │ │ ├─┤\n█████████████ ████ ╚═╝ ╩ ╩ ╩╚═╝╩ ╩ ┴ ┴└─┘ ┴ ┴ ┴\n █████████████████\n ██████ ██\n████ ████\n █████ █████\n ██████\n `);\n console.log();\n\n await capture(\"start\", {\n version: packageJson.version,\n isDryRun,\n isNeon,\n typeFromArgs,\n packageManagerFromArgs,\n isClient,\n isServer,\n noBrowser,\n platform: os.platform(),\n arch: os.arch(),\n nodeVersion: process.version,\n });\n\n // Wait just briefly so we can use `Steps` in here (it's defined only after the call to `main()`)\n await new Promise<void>((resolve) => resolve());\n\n\n // Prepare some stuff\n await clearStdin();\n const projectPath = await getProjectPath();\n\n\n // Steps\n const { packageJson: projectPackageJson } = await Steps.getProject();\n const type = await Steps.getProjectType({ packageJson: projectPackageJson });\n\n await capture(\"project-type-selected\", {\n type,\n wasSpecifiedInArgs: !!typeFromArgs,\n });\n\n await Steps.addStackPackage(type);\n if (isNeon) packagesToInstall.push('@neondatabase/serverless');\n\n await Steps.writeEnvVars(type);\n const convexIntegration = await Steps.maybeInstallConvexIntegration({ packageJson: projectPackageJson, type });\n if (convexIntegration) {\n nextSteps.push(...convexIntegration.instructions);\n }\n\n if (type === \"next\") {\n const projectInfo = await Steps.getNextProjectInfo({ packageJson: projectPackageJson });\n await Steps.updateNextLayoutFile(projectInfo);\n await Steps.writeStackAppFile(projectInfo, \"client\");\n await Steps.writeStackAppFile(projectInfo, \"server\");\n await Steps.writeNextHandlerFile(projectInfo);\n await Steps.writeNextLoadingFile(projectInfo);\n nextSteps.push(`Copy the environment variables from the new API key into your .env.local file`);\n } else if (type === \"react\") {\n const defaultExtension = await Steps.guessDefaultFileExtension();\n const srcPath = await Steps.guessSrcPath();\n const hasReactRouterDom = !!(projectPackageJson.dependencies?.[\"react-router-dom\"] || projectPackageJson.devDependencies?.[\"react-router-dom\"]);\n const { fileName } = await Steps.writeReactClientFile({\n srcPath,\n defaultExtension,\n indentation: \" \",\n hasReactRouterDom,\n });\n nextSteps.push(\n `Copy the environment variables from the new API key into your own environment and reference them in ${fileName}`,\n );\n } else {\n const defaultExtension = await Steps.guessDefaultFileExtension();\n const where = await Steps.getServerOrClientOrBoth();\n const srcPath = await Steps.guessSrcPath();\n const appFiles: string[] = [];\n for (const w of where) {\n const { fileName } = await Steps.writeStackAppFile({\n type,\n defaultExtension,\n indentation: \" \",\n srcPath,\n }, w);\n appFiles.push(fileName);\n }\n nextSteps.push(\n `Copy the environment variables from the new API key into your own environment and reference them in ${appFiles.join(\" and \")}`,\n `Follow the instructions on how to use Stack Auth's vanilla SDK at http://docs.stack-auth.com/others/js-client`,\n );\n }\n\n const { packageManager } = await Steps.getPackageManager();\n\n await capture(`package-manager-selected`, {\n packageManager,\n wasSpecifiedInArgs: !!packageManagerFromArgs,\n });\n\n await Steps.ensureReady(type);\n\n\n // Install dependencies\n console.log();\n console.log(colorize.bold`Installing dependencies...`);\n const installCommandMap = new Map<string, string>([\n [\"npm\", \"npm install\"],\n [\"yarn\", \"yarn add\"],\n [\"pnpm\", \"pnpm add\"],\n [\"bun\", \"bun add\"],\n ]);\n const installCommand = installCommandMap.get(packageManager) ?? `${packageManager} install`;\n // Quote each package name to avoid shell interpretation of env-overridden values.\n const safePackages = packagesToInstall.map((p) => JSON.stringify(p));\n await shellNicelyFormatted(`${installCommand} ${safePackages.join(' ')}`, {\n shell: true,\n cwd: projectPath,\n });\n\n await capture(`dependencies-installed`, {\n packageManager,\n packages: packagesToInstall,\n });\n\n // Write files\n console.log();\n console.log(colorize.bold`Writing files...`);\n console.log();\n for (const writeFileHandler of writeFileHandlers) {\n await writeFileHandler();\n }\n console.log(`${colorize.green`√`} Done writing files`);\n\n console.log('\\n\\n\\n');\n console.log(colorize.bold`${colorize.green`Installation succeeded!`}`);\n console.log();\n console.log(\"Commands executed:\");\n for (const command of commandsExecuted) {\n console.log(` ${colorize.blue`${command}`}`);\n }\n console.log();\n console.log(\"Files written:\");\n for (const file of filesModified) {\n console.log(` ${colorize.yellow`${file}`}`);\n }\n for (const file of filesCreated) {\n console.log(` ${colorize.green`${file}`}`);\n }\n console.log();\n\n await capture(\"complete\", {\n success: true,\n type,\n packageManager,\n isNeon,\n isClient,\n isServer,\n noBrowser,\n filesCreated,\n filesModified,\n commandsExecuted,\n });\n\n // Success!\n console.log(`\n${colorize.green`===============================================`}\n\n${colorize.green`Successfully installed Stack! 🚀🚀🚀`}\n\n${colorize.bold`Next steps:`}\n\n1. ${noBrowser ?\n `Create a project at https://app.stack-auth.com and get your API keys` :\n `Complete the setup in your browser to get your API keys`}\n2. Add the API keys to your .env.local file\n3. Import the Stack components in your app\n4. Add authentication to your app\n\nFor more information, please visit https://docs.stack-auth.com/getting-started/setup\n `.trim());\n if (!noBrowser) {\n await open(`https://app.stack-auth.com/wizard-congrats?stack-init-id=${encodeURIComponent(distinctId)}`);\n }\n await ph_client.shutdown();\n}\n\n// eslint-disable-next-line no-restricted-syntax\nmain().catch(async (err) => {\n try {\n await capture(\"error\", {\n error: err.message,\n errorType: err instanceof UserError ? \"UserError\" : \"SystemError\",\n stack: err.stack,\n });\n } catch (e) { }\n if (!(err instanceof UserError)) {\n console.error(err);\n }\n console.error('\\n\\n\\n\\n');\n console.log(colorize.red`===============================================`);\n console.error();\n if (err instanceof UserError) {\n console.error(`${colorize.red`ERROR!`} ${err.message}`);\n } else {\n console.error(\"An error occurred during the initialization process.\");\n }\n console.error();\n console.log(colorize.red`===============================================`);\n console.error();\n console.error(\n \"If you need assistance, please try installing Stack manually as described in https://docs.stack-auth.com/getting-started/setup or join our Discord where we're happy to help: https://discord.stack-auth.com\"\n );\n if (!(err instanceof UserError)) {\n console.error(\"\");\n console.error(`Error message: ${err.message}`);\n }\n console.error();\n await ph_client.shutdown();\n process.exit(1);\n});\n\n\ntype PackageJson = {\n dependencies?: Record<string, string>,\n devDependencies?: Record<string, string>,\n [key: string]: any,\n}\n\ntype ProjectInfo = {\n type: \"js\" | \"next\" | \"react\",\n srcPath: string,\n appPath: string,\n defaultExtension: string,\n indentation: string,\n}\n\ntype NextProjectInfoError = {\n error: string,\n}\n\ntype NextProjectInfoResult = ProjectInfo | NextProjectInfoError;\n\ntype StackAppFileOptions = {\n type: \"js\" | \"next\" | \"react\",\n srcPath: string,\n defaultExtension: string,\n indentation: string,\n}\n\ntype StackAppFileResult = {\n fileName: string,\n}\n\ntype ConvexIntegrationResult = {\n instructions: string[],\n}\n\nconst Steps = {\n async getProject(): Promise<{ packageJson: PackageJson }> {\n let projectPath = await getProjectPath();\n if (!fs.existsSync(projectPath)) {\n throw new UserError(`The project path ${projectPath} does not exist`);\n }\n\n const packageJsonPath = path.join(projectPath, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) {\n throw new UserError(\n `The package.json file does not exist in the project path ${projectPath}. You must initialize a new project first before installing Stack.`\n );\n }\n\n const packageJsonText = fs.readFileSync(packageJsonPath, \"utf-8\");\n let packageJson: PackageJson;\n try {\n packageJson = JSON.parse(packageJsonText);\n } catch (e) {\n throw new UserError(`package.json file is not valid JSON: ${e}`);\n }\n\n return { packageJson };\n },\n\n async getProjectType({ packageJson }: { packageJson: PackageJson }): Promise<\"js\" | \"next\" | \"react\"> {\n if (typeFromArgs) return typeFromArgs;\n\n const maybeNextProject = await Steps.maybeGetNextProjectInfo({ packageJson });\n if (!(\"error\" in maybeNextProject)) {\n return \"next\";\n }\n if (packageJson.dependencies?.[\"react\"] || packageJson.dependencies?.[\"react-dom\"]) {\n return \"react\";\n }\n if (onQuestionMode === \"guess\") {\n return \"js\";\n }\n if (onQuestionMode === \"error\") {\n throw new UnansweredQuestionError(\"Unable to auto-detect project type (checked for Next.js and React dependencies). Re-run with one of: --js, --react, or --next.\");\n }\n\n const { type } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"type\",\n message: \"Which integration would you like to install?\",\n choices: [\n { name: \"None (vanilla JS, Node.js, etc)\", value: \"js\" },\n { name: \"React\", value: \"react\" },\n { name: \"Next.js\", value: \"next\" },\n ]\n }\n ]);\n\n return type;\n },\n\n async getStackPackageName(type: \"js\" | \"next\" | \"react\", install = false): Promise<string> {\n const mapping = {\n js: (install && process.env.STACK_JS_INSTALL_PACKAGE_NAME_OVERRIDE) || \"@stackframe/js\",\n next: (install && process.env.STACK_NEXT_INSTALL_PACKAGE_NAME_OVERRIDE) || \"@stackframe/stack\",\n react: (install && process.env.STACK_REACT_INSTALL_PACKAGE_NAME_OVERRIDE) || \"@stackframe/react\",\n } as const;\n return mapping[type];\n },\n\n async addStackPackage(type: \"js\" | \"next\" | \"react\"): Promise<void> {\n packagesToInstall.push(await Steps.getStackPackageName(type, true));\n },\n\n async getNextProjectInfo({ packageJson }: { packageJson: PackageJson }): Promise<ProjectInfo> {\n const maybe = await Steps.maybeGetNextProjectInfo({ packageJson });\n if (\"error\" in maybe) throw new UserError(maybe.error);\n return maybe;\n },\n\n async maybeGetNextProjectInfo({ packageJson }: { packageJson: PackageJson }): Promise<NextProjectInfoResult> {\n const projectPath = await getProjectPath();\n\n const nextVersionInPackageJson = packageJson.dependencies?.[\"next\"] ?? packageJson.devDependencies?.[\"next\"];\n if (!nextVersionInPackageJson) {\n return { error: `The project at ${projectPath} does not appear to be a Next.js project, or does not have 'next' installed as a dependency.` };\n }\n if (\n !nextVersionInPackageJson.includes(\"14\") &&\n !nextVersionInPackageJson.includes(\"15\") &&\n nextVersionInPackageJson !== \"latest\"\n ) {\n return { error: `The project at ${projectPath} is using an unsupported version of Next.js (found ${nextVersionInPackageJson}).\\n\\nOnly Next.js 14 & 15 projects are currently supported. See Next's upgrade guide: https://nextjs.org/docs/app/building-your-application/upgrading/version-14` };\n }\n\n const hasSrcAppFolder = fs.existsSync(path.join(projectPath, \"src/app\"));\n const srcPath = path.join(projectPath, hasSrcAppFolder ? \"src\" : \"\");\n const appPath = path.join(srcPath, \"app\");\n if (!fs.existsSync(appPath)) {\n return { error: `The app path ${appPath} does not exist. Only the Next.js App router is supported — are you maybe on the Pages router instead?` };\n }\n\n const nextConfigPathWithoutExtension = path.join(projectPath, \"next.config\");\n const nextConfigFileExtension = await findJsExtension(\n nextConfigPathWithoutExtension\n );\n const nextConfigPath =\n nextConfigPathWithoutExtension + \".\" + (nextConfigFileExtension ?? \"js\");\n if (!fs.existsSync(nextConfigPath)) {\n return { error: `Expected file at ${nextConfigPath} for Next.js projects.` };\n }\n\n const dryUpdateNextLayoutFileResult = await Steps.dryUpdateNextLayoutFile({ appPath, defaultExtension: \"jsx\" });\n\n return {\n type: \"next\",\n srcPath,\n appPath,\n defaultExtension: dryUpdateNextLayoutFileResult.fileExtension,\n indentation: dryUpdateNextLayoutFileResult.indentation,\n };\n },\n\n async writeEnvVars(type: \"js\" | \"next\" | \"react\"): Promise<boolean> {\n const projectPath = await getProjectPath();\n\n // TODO: in non-Next environments, ask the user what method they prefer for envvars\n if (type !== \"next\") return false;\n\n const envLocalPath = path.join(projectPath, \".env.local\");\n\n const potentialEnvLocations = [\n path.join(projectPath, \".env\"),\n path.join(projectPath, \".env.development\"),\n path.join(projectPath, \".env.default\"),\n path.join(projectPath, \".env.defaults\"),\n path.join(projectPath, \".env.example\"),\n envLocalPath,\n ];\n if (potentialEnvLocations.every((p) => !fs.existsSync(p))) {\n const envContent = noBrowser\n ? \"# Stack Auth keys\\n\" +\n \"# To get these variables:\\n\" +\n \"# 1. Go to https://app.stack-auth.com\\n\" +\n \"# 2. Create a new project\\n\" +\n \"# 3. Copy the keys below\\n\" +\n `NEXT_PUBLIC_STACK_PROJECT_ID=\"${projectIdFromArgs ?? \"\"}\"\\n` +\n `NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=\"${publishableClientKeyFromArgs ?? \"\"}\"\\n` +\n \"STACK_SECRET_SERVER_KEY=\\n\"\n : \"# Stack Auth keys\\n\" +\n \"# Get these variables by creating a project on https://app.stack-auth.com.\\n\" +\n `NEXT_PUBLIC_STACK_PROJECT_ID=\"${projectIdFromArgs ?? \"\"}\"\\n` +\n `NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=\"${publishableClientKeyFromArgs ?? \"\"}\"\\n` +\n \"STACK_SECRET_SERVER_KEY=\\n\";\n\n laterWriteFile(envLocalPath, envContent);\n return true;\n }\n\n return false;\n },\n\n async maybeInstallConvexIntegration({ packageJson, type }: { packageJson: PackageJson, type: \"js\" | \"next\" | \"react\" }): Promise<ConvexIntegrationResult | null> {\n const hasConvexDependency = Boolean(packageJson.dependencies?.[\"convex\"] || packageJson.devDependencies?.[\"convex\"]);\n if (!hasConvexDependency) {\n return null;\n }\n\n const projectPath = await getProjectPath();\n const convexDir = path.join(projectPath, \"convex\");\n if (!fs.existsSync(convexDir)) {\n return null;\n }\n\n const stackPackageName = await Steps.getStackPackageName(type);\n const instructions: string[] = [];\n\n const authConfigPath = path.join(convexDir, \"auth.config.ts\");\n const desiredAuthConfig = createConvexAuthConfigContent({ stackPackageName, type });\n const existingAuthConfig = await readFile(authConfigPath);\n if (!existingAuthConfig || (!existingAuthConfig.includes(\"getConvexProvidersConfig\") && !existingAuthConfig.includes(\"@stackframe/\"))) {\n laterWriteFile(authConfigPath, desiredAuthConfig);\n }\n\n const convexConfigPath = path.join(convexDir, \"convex.config.ts\");\n const existingConvexConfig = await readFile(convexConfigPath);\n const desiredConvexConfig = createConvexIntegrationConvexConfigContent(stackPackageName);\n let needsManualConvexConfig = false;\n\n if (!existingConvexConfig) {\n laterWriteFile(convexConfigPath, desiredConvexConfig);\n } else if (existingConvexConfig.includes(\"app.use(stackAuthComponent\") && existingConvexConfig.includes(\"/convex.config\") && existingConvexConfig.includes(\"stackframe\")) {\n // already integrated\n } else {\n const integratedContent = integrateConvexConfig(existingConvexConfig, stackPackageName);\n if (integratedContent) {\n laterWriteFile(convexConfigPath, integratedContent);\n } else if (isSimpleConvexConfig(existingConvexConfig)) {\n laterWriteFile(convexConfigPath, desiredConvexConfig);\n } else {\n needsManualConvexConfig = true;\n }\n }\n\n if (needsManualConvexConfig) {\n instructions.push(`Update convex/convex.config.ts to import ${stackPackageName}/convex.config and call app.use(stackAuthComponent).`);\n }\n\n const convexClientUpdateResult = await updateConvexClients({ projectPath, type });\n if (convexClientUpdateResult.skippedFiles.length > 0) {\n instructions.push(\"Review your Convex client setup and call stackClientApp.getConvexClientAuth({}) or stackServerApp.getConvexClientAuth({}) manually where needed.\");\n }\n\n instructions.push(\n \"Set the Stack Auth environment variables in Convex (Deployment → Settings → Environment Variables).\",\n \"Verify your Convex clients call stackClientApp.getConvexClientAuth({}) or stackServerApp.getConvexClientAuth({}) so they share authentication with Stack Auth.\"\n );\n\n return { instructions };\n },\n\n async dryUpdateNextLayoutFile({ appPath, defaultExtension }: { appPath: string, defaultExtension: string }): Promise<{\n path: string,\n updatedContent: string,\n fileExtension: string,\n indentation: string,\n }> {\n const layoutPathWithoutExtension = path.join(appPath, \"layout\");\n const layoutFileExtension =\n (await findJsExtension(layoutPathWithoutExtension)) ?? defaultExtension;\n const layoutPath = layoutPathWithoutExtension + \".\" + layoutFileExtension;\n const layoutContent =\n (await readFile(layoutPath)) ??\n throwErr(\n `The layout file at ${layoutPath} does not exist. Stack requires a layout file to be present in the /app folder.`\n );\n const updatedLayoutResult =\n (await getUpdatedLayout(layoutContent)) ??\n throwErr(\n \"Unable to parse root layout file. Make sure it contains a <body> tag. If it still doesn't work, you may need to manually install Stack. See: https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts#root-layout-required\"\n );\n const updatedLayoutContent = updatedLayoutResult.content;\n return {\n path: layoutPath,\n updatedContent: updatedLayoutContent,\n fileExtension: layoutFileExtension,\n indentation: updatedLayoutResult.indentation\n };\n },\n\n async updateNextLayoutFile(projectInfo: ProjectInfo): Promise<{\n path: string,\n updatedContent: string,\n fileExtension: string,\n indentation: string,\n }> {\n const res = await Steps.dryUpdateNextLayoutFile(projectInfo);\n laterWriteFile(res.path, res.updatedContent);\n return res;\n },\n\n async writeStackAppFile({ type, srcPath, defaultExtension, indentation }: StackAppFileOptions, clientOrServer: \"server\" | \"client\"): Promise<StackAppFileResult> {\n const packageName = await Steps.getStackPackageName(type);\n\n const clientOrServerCap = {\n client: \"Client\",\n server: \"Server\",\n }[clientOrServer as \"client\" | \"server\"];\n const relativeStackAppPath = `stack/${clientOrServer}`;\n\n const stackAppPathWithoutExtension = path.join(srcPath, relativeStackAppPath);\n const stackAppFileExtension =\n (await findJsExtension(stackAppPathWithoutExtension)) ?? defaultExtension;\n const stackAppPath =\n stackAppPathWithoutExtension + \".\" + stackAppFileExtension;\n const stackAppContent = await readFile(stackAppPath);\n if (stackAppContent) {\n if (!stackAppContent.includes(\"@stackframe/\")) {\n throw new UserError(\n `A file at the path ${stackAppPath} already exists. Stack uses the stack/${clientOrServer}.ts file to initialize the Stack SDK. Please remove the existing file and try again.`\n );\n }\n throw new UserError(\n `It seems that you already installed Stack in this project.`\n );\n }\n\n const tokenStore = type === \"next\" ? '\"nextjs-cookie\"' : (clientOrServer === \"client\" ? '\"cookie\"' : '\"memory\"');\n const publishableClientKeyWrite = clientOrServer === \"server\"\n ? `process.env.STACK_PUBLISHABLE_CLIENT_KEY ${publishableClientKeyFromArgs ? `|| ${JSON.stringify(publishableClientKeyFromArgs)}` : \"\"}`\n : `'${publishableClientKeyFromArgs ?? 'INSERT_YOUR_PUBLISHABLE_CLIENT_KEY_HERE'}'`;\n const jsOptions = type === \"js\" ? [\n `\\n\\n${indentation}// get your Stack Auth API keys from https://app.stack-auth.com${clientOrServer === \"client\" ? ` and store them in a safe place (eg. environment variables)` : \"\"}`,\n `${projectIdFromArgs ? `${indentation}projectId: ${JSON.stringify(projectIdFromArgs)},` : \"\"}`,\n `${indentation}publishableClientKey: ${publishableClientKeyWrite},`,\n `${clientOrServer === \"server\" ? `${indentation}secretServerKey: process.env.STACK_SECRET_SERVER_KEY,` : \"\"}`,\n ].filter(Boolean).join(\"\\n\") : \"\";\n\n const nextClientOptions = (type === \"next\" && clientOrServer === \"client\")\n ? (() => {\n const lines = [\n projectIdFromArgs ? `${indentation}projectId: process.env.NEXT_PUBLIC_STACK_PROJECT_ID ?? ${JSON.stringify(projectIdFromArgs)},` : \"\",\n publishableClientKeyFromArgs ? `${indentation}publishableClientKey: process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY ?? ${JSON.stringify(publishableClientKeyFromArgs)},` : \"\",\n ].filter(Boolean).join(\"\\n\");\n return lines ? `\\n${lines}` : \"\";\n })()\n : \"\";\n\n\n laterWriteFileIfNotExists(\n stackAppPath,\n `\n${type === \"next\" && clientOrServer === \"server\" ? `import \"server-only\";` : \"\"}\n\nimport { Stack${clientOrServerCap}App } from ${JSON.stringify(packageName)};\n\nexport const stack${clientOrServerCap}App = new Stack${clientOrServerCap}App({\n${indentation}tokenStore: ${tokenStore},${jsOptions}${nextClientOptions}\n});\n `.trim() + \"\\n\"\n );\n return { fileName: stackAppPath };\n },\n\n async writeReactClientFile({ srcPath, defaultExtension, indentation, hasReactRouterDom }: { srcPath: string, defaultExtension: string, indentation: string, hasReactRouterDom: boolean }): Promise<StackAppFileResult> {\n const packageName = await Steps.getStackPackageName(\"react\");\n const relativeStackAppPath = `stack/client`;\n const stackAppPathWithoutExtension = path.join(srcPath, relativeStackAppPath);\n const stackAppFileExtension = (await findJsExtension(stackAppPathWithoutExtension)) ?? defaultExtension;\n const stackAppPath = stackAppPathWithoutExtension + \".\" + stackAppFileExtension;\n const stackAppContent = await readFile(stackAppPath);\n if (stackAppContent) {\n if (!stackAppContent.includes(\"@stackframe/\")) {\n throw new UserError(`A file at the path ${stackAppPath} already exists. Stack uses the stack/client.ts file to initialize the Stack SDK. Please remove the existing file and try again.`);\n }\n throw new UserError(`It seems that you already installed Stack in this project.`);\n }\n\n const publishableClientKeyWrite = `'${publishableClientKeyFromArgs ?? 'INSERT_YOUR_PUBLISHABLE_CLIENT_KEY_HERE'}'`;\n const projectIdWrite = `'${projectIdFromArgs ?? 'INSERT_PROJECT_ID'}'`;\n\n const imports = hasReactRouterDom\n ? `import { StackClientApp } from ${JSON.stringify(packageName)};\\nimport { useNavigate } from \"react-router-dom\";\\n\\n`\n : `import { StackClientApp } from ${JSON.stringify(packageName)};\\n\\n`;\n\n const redirectMethod = hasReactRouterDom\n ? `,\\n${indentation}redirectMethod: {\\n${indentation}${indentation}useNavigate,\\n${indentation}}`\n : \"\";\n\n laterWriteFileIfNotExists(\n stackAppPath,\n `${imports}export const stackClientApp = new StackClientApp({ \\n${indentation}tokenStore: \"cookie\", \\n${indentation}projectId: ${projectIdWrite}, \\n${indentation}publishableClientKey: ${publishableClientKeyWrite}${redirectMethod}, \\n}); \\n`\n );\n return { fileName: stackAppPath };\n },\n\n async writeNextHandlerFile(projectInfo: ProjectInfo): Promise<void> {\n const handlerPathWithoutExtension = path.join(\n projectInfo.appPath,\n \"handler/[...stack]/page\"\n );\n const handlerFileExtension =\n (await findJsExtension(handlerPathWithoutExtension)) ?? projectInfo.defaultExtension;\n const handlerPath = handlerPathWithoutExtension + \".\" + handlerFileExtension;\n const handlerContent = await readFile(handlerPath);\n if (handlerContent && !handlerContent.includes(\"@stackframe/\")) {\n throw new UserError(\n `A file at the path ${handlerPath} already exists.Stack uses the / handler path to handle incoming requests.Please remove the existing file and try again.`\n );\n }\n laterWriteFileIfNotExists(\n handlerPath,\n `import { StackHandler } from \"@stackframe/stack\"; \\nimport { stackServerApp } from \"../../../stack/server\"; \\n\\nexport default function Handler(props${handlerFileExtension.includes(\"ts\") ? \": unknown\" : \"\"\n }) { \\n${projectInfo.indentation} return <StackHandler fullPage app = { stackServerApp } routeProps = { props } />; \\n } \\n`\n );\n },\n\n async writeNextLoadingFile(projectInfo: ProjectInfo): Promise<void> {\n let loadingPathWithoutExtension = path.join(projectInfo.appPath, \"loading\");\n const loadingFileExtension =\n (await findJsExtension(loadingPathWithoutExtension)) ?? projectInfo.defaultExtension;\n const loadingPath = loadingPathWithoutExtension + \".\" + loadingFileExtension;\n laterWriteFileIfNotExists(\n loadingPath,\n `export default function Loading() {\n\\n${projectInfo.indentation}// Stack uses React Suspense, which will render this page while user data is being fetched.\\n${projectInfo.indentation}// See: https://nextjs.org/docs/app/api-reference/file-conventions/loading\\n${projectInfo.indentation}return <></>;\\n}\\n`\n );\n },\n\n async getPackageManager(): Promise<{ packageManager: string }> {\n if (packageManagerFromArgs) return { packageManager: packageManagerFromArgs };\n const packageManager = await promptPackageManager();\n const versionCommand = `${packageManager} --version`;\n\n try {\n await shellNicelyFormatted(versionCommand, { shell: true, quiet: true });\n } catch (err) {\n console.error(err);\n throw new UserError(\n `Could not run the package manager command '${versionCommand}'. Please make sure ${packageManager} is installed on your system.`\n );\n }\n\n return { packageManager };\n },\n\n async ensureReady(type: \"js\" | \"next\" | \"react\"): Promise<void> {\n const projectPath = await getProjectPath();\n\n const typeStringMap = {\n js: \"JavaScript\",\n next: \"Next.js\",\n react: \"React\",\n } as const;\n const typeString = typeStringMap[type];\n const isReady = (onQuestionMode !== \"ask\") || (await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"ready\",\n message: `Found a ${typeString} project at ${projectPath} — ready to install Stack Auth?`,\n default: true,\n },\n ])).ready;\n if (!isReady) {\n throw new UserError(\"Installation aborted.\");\n }\n },\n\n async getServerOrClientOrBoth(): Promise<Array<\"server\" | \"client\">> {\n if (isClient && isServer) return [\"server\", \"client\"];\n if (isServer) return [\"server\"];\n if (isClient) return [\"client\"];\n\n if (onQuestionMode === \"guess\") return [\"server\", \"client\"];\n if (onQuestionMode === \"error\") {\n throw new UnansweredQuestionError(\"Ambiguous installation type. Re-run with --server, --client, or both.\");\n }\n\n return (await inquirer.prompt([{\n type: \"list\",\n name: \"type\",\n message: \"Do you want to use Stack Auth on the server, or on the client?\",\n choices: [\n { name: \"Client (eg. Vite, HTML)\", value: [\"client\"] },\n { name: \"Server (eg. Node.js)\", value: [\"server\"] },\n { name: \"Both\", value: [\"server\", \"client\"] }\n ]\n }])).type;\n },\n\n /**\n * note: this is a heuristic, specific frameworks may have better heuristics (eg. the Next.js code uses the extension of the global layout file)\n */\n async guessDefaultFileExtension(): Promise<string> {\n const projectPath = await getProjectPath();\n const hasTsConfig = fs.existsSync(\n path.join(projectPath, \"tsconfig.json\")\n );\n return hasTsConfig ? \"ts\" : \"js\";\n },\n\n /**\n * note: this is a heuristic, specific frameworks may have better heuristics (eg. the Next.js code uses the location of the app folder)\n */\n async guessSrcPath(): Promise<string> {\n const projectPath = await getProjectPath();\n const potentialSrcPath = path.join(projectPath, \"src\");\n const hasSrcFolder = fs.existsSync(\n path.join(projectPath, \"src\")\n );\n return hasSrcFolder ? potentialSrcPath : projectPath;\n },\n\n\n};\n\n\ntype LayoutResult = {\n content: string,\n indentation: string,\n}\n\nasync function getUpdatedLayout(originalLayout: string): Promise<LayoutResult | undefined> {\n let layout = originalLayout;\n const indentation = guessIndentation(originalLayout);\n\n const firstImportLocationM1 = /\\simport\\s/.exec(layout)?.index;\n const hasStringAsFirstLine = layout.startsWith('\"') || layout.startsWith(\"'\");\n const importInsertLocationM1 =\n firstImportLocationM1 ?? (hasStringAsFirstLine ? layout.indexOf(\"\\n\") : -1);\n const importInsertLocation = importInsertLocationM1 + 1;\n const importStatement = `import { StackProvider, StackTheme } from \"@stackframe/stack\";\\nimport { stackClientApp } from \"../stack/client\";\\n`;\n layout =\n layout.slice(0, importInsertLocation) +\n importStatement +\n layout.slice(importInsertLocation);\n\n const bodyOpenTag = /<\\s*body[^>]*>/.exec(layout);\n const bodyCloseTag = /<\\s*\\/\\s*body[^>]*>/.exec(layout);\n if (!bodyOpenTag || !bodyCloseTag) {\n return undefined;\n }\n const bodyOpenEndIndex = bodyOpenTag.index + bodyOpenTag[0].length;\n const bodyCloseStartIndex = bodyCloseTag.index;\n if (bodyCloseStartIndex <= bodyOpenEndIndex) {\n return undefined;\n }\n\n const lines = layout.split(\"\\n\");\n const [bodyOpenEndLine, bodyOpenEndIndexInLine] = getLineIndex(\n lines,\n bodyOpenEndIndex\n );\n const [bodyCloseStartLine, bodyCloseStartIndexInLine] = getLineIndex(\n lines,\n bodyCloseStartIndex\n );\n\n const insertOpen = \"<StackProvider app={stackClientApp}><StackTheme>\";\n const insertClose = \"</StackTheme></StackProvider>\";\n\n layout =\n layout.slice(0, bodyCloseStartIndex) +\n insertClose +\n layout.slice(bodyCloseStartIndex);\n layout =\n layout.slice(0, bodyOpenEndIndex) +\n insertOpen +\n layout.slice(bodyOpenEndIndex);\n\n return {\n content: `${layout}`,\n indentation,\n };\n}\n\nfunction guessIndentation(str: string): string {\n const lines = str.split(\"\\n\");\n const linesLeadingWhitespaces = lines\n .map((line) => line.match(/^\\s*/)![0])\n .filter((ws) => ws.length > 0);\n const isMostlyTabs =\n linesLeadingWhitespaces.filter((ws) => ws.includes(\"\\t\")).length >=\n (linesLeadingWhitespaces.length * 2) / 3;\n if (isMostlyTabs) return \"\\t\";\n const linesLeadingWhitespacesCount = linesLeadingWhitespaces.map(\n (ws) => ws.length\n );\n const min = Math.min(Infinity, ...linesLeadingWhitespacesCount);\n return Number.isFinite(min) ? \" \".repeat(Math.max(2, min)) : \" \";\n}\n\nfunction getLineIndex(lines: string[], stringIndex: number): [number, number] {\n let lineIndex = 0;\n for (let l = 0; l < lines.length; l++) {\n const line = lines[l];\n if (stringIndex < lineIndex + line.length) {\n return [l, stringIndex - lineIndex];\n }\n lineIndex += line.length + 1;\n }\n throw new Error(\n `Index ${stringIndex} is out of bounds for lines ${JSON.stringify(lines)}`\n );\n}\n\nasync function getProjectPath(): Promise<string> {\n if (savedProjectPath === undefined) {\n savedProjectPath = process.cwd();\n\n const askForPathModification = !fs.existsSync(\n path.join(savedProjectPath, \"package.json\")\n );\n if (askForPathModification) {\n if (onQuestionMode === \"guess\" || onQuestionMode === \"error\") {\n throw new UserError(`No package.json file found in ${savedProjectPath}. Re-run providing the project path argument (e.g. 'init-stack <project-path>').`);\n }\n savedProjectPath = (\n await inquirer.prompt([\n {\n type: \"input\",\n name: \"newPath\",\n message: \"Please enter the path to your project:\",\n default: \".\",\n },\n ])\n ).newPath;\n }\n }\n return savedProjectPath as string;\n}\n\nasync function findJsExtension(fullPathWithoutExtension: string): Promise<string | null> {\n for (const ext of jsLikeFileExtensions) {\n const fullPath = fullPathWithoutExtension + \".\" + ext;\n if (fs.existsSync(fullPath)) {\n return ext;\n }\n }\n return null;\n}\n\nasync function promptPackageManager(): Promise<string> {\n const projectPath = await getProjectPath();\n const yarnLock = fs.existsSync(path.join(projectPath, \"yarn.lock\"));\n const pnpmLock = fs.existsSync(path.join(projectPath, \"pnpm-lock.yaml\"));\n const npmLock = fs.existsSync(path.join(projectPath, \"package-lock.json\"));\n const bunLock = fs.existsSync(path.join(projectPath, \"bun.lockb\")) || fs.existsSync(path.join(projectPath, \"bun.lock\"));\n\n if (yarnLock && !pnpmLock && !npmLock && !bunLock) {\n return \"yarn\";\n } else if (!yarnLock && pnpmLock && !npmLock && !bunLock) {\n return \"pnpm\";\n } else if (!yarnLock && !pnpmLock && npmLock && !bunLock) {\n return \"npm\";\n } else if (!yarnLock && !pnpmLock && !npmLock && bunLock) {\n return \"bun\";\n }\n\n if (onQuestionMode === \"guess\") return \"npm\";\n if (onQuestionMode === \"error\") {\n throw new UnansweredQuestionError(\"Unable to determine the package manager. Re-run with one of: --npm, --yarn, --pnpm, or --bun.\");\n }\n\n const answers = await inquirer.prompt([\n {\n type: \"list\",\n name: \"packageManager\",\n message: \"Which package manager are you using for this project?\",\n choices: [\"npm\", \"yarn\", \"pnpm\", \"bun\"],\n },\n ]);\n return answers.packageManager;\n}\n\ntype ShellOptions = {\n quiet?: boolean,\n shell?: boolean,\n cwd?: string,\n [key: string]: any,\n}\n\nasync function shellNicelyFormatted(command: string, { quiet, ...options }: ShellOptions): Promise<void> {\n let ui: any;\n let interval: NodeJS.Timeout | undefined;\n if (!quiet) {\n console.log();\n ui = new inquirer.ui.BottomBar();\n let dots = 4;\n ui.updateBottomBar(\n colorize.blue`Running command: ${command}...`\n );\n interval = setInterval(() => {\n if (!isDryRun) {\n ui.updateBottomBar(\n colorize.blue`Running command: ${command}${\".\".repeat(dots++ % 5)}`\n );\n }\n }, 700);\n }\n\n try {\n if (!isDryRun) {\n const child = child_process.spawn(command, options);\n if (!quiet) {\n child.stdout.pipe(ui.log);\n child.stderr.pipe(ui.log);\n }\n\n await new Promise<void>((resolve, reject) => {\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command ${command} failed with code ${code}`));\n }\n });\n });\n } else {\n console.log(`[DRY-RUN] Would have run: ${command}`);\n }\n\n if (!quiet) {\n commandsExecuted.push(command);\n ui.updateBottomBar(\n `${colorize.green`√`} Command ${command} succeeded\\n`\n );\n }\n } catch (e) {\n if (!quiet) {\n ui.updateBottomBar(\n `${colorize.red`X`} Command ${command} failed\\n`\n );\n }\n throw e;\n } finally {\n if (interval) {\n clearTimeout(interval);\n }\n if (!quiet) {\n ui.close();\n }\n }\n}\n\nasync function readFile(fullPath: string): Promise<string | null> {\n try {\n if (!isDryRun) {\n return fs.readFileSync(fullPath, \"utf-8\");\n }\n return null;\n } catch (err: any) {\n if (err.code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n}\n\nasync function writeFile(fullPath: string, content: string): Promise<void> {\n let create = !fs.existsSync(fullPath);\n if (!isDryRun) {\n fs.mkdirSync(path.dirname(fullPath), { recursive: true });\n fs.writeFileSync(fullPath, content);\n } else {\n console.log(`[DRY-RUN] Would have written to ${fullPath}`);\n }\n const relativeToProjectPath = path.relative(await getProjectPath(), fullPath);\n if (!create) {\n filesModified.push(relativeToProjectPath);\n } else {\n filesCreated.push(relativeToProjectPath);\n }\n}\n\nfunction laterWriteFile(fullPath: string, content: string): void {\n writeFileHandlers.push(async () => {\n await writeFile(fullPath, content);\n });\n}\n\nasync function writeFileIfNotExists(fullPath: string, content: string): Promise<void> {\n if (!fs.existsSync(fullPath)) {\n await writeFile(fullPath, content);\n }\n}\n\nfunction laterWriteFileIfNotExists(fullPath: string, content: string): void {\n writeFileHandlers.push(async () => {\n await writeFileIfNotExists(fullPath, content);\n });\n}\n\nfunction createConvexAuthConfigContent(options: { stackPackageName: string, type: \"js\" | \"next\" | \"react\" }): string {\n const envVarName = getPublicProjectEnvVarName(options.type);\n return `import { getConvexProvidersConfig } from ${JSON.stringify(options.stackPackageName)};\n\nexport default {\n providers: getConvexProvidersConfig({\n projectId: process.env.${envVarName},\n }),\n};\n`;\n}\n\nfunction createConvexIntegrationConvexConfigContent(stackPackageName: string): string {\n const importPath = `${stackPackageName}/convex.config`;\n return `import stackAuthComponent from ${JSON.stringify(importPath)};\nimport { defineApp } from \"convex/server\";\n\nconst app = defineApp();\napp.use(stackAuthComponent);\n\nexport default app;\n`;\n}\n\nfunction integrateConvexConfig(existingContent: string, stackPackageName: string): string | null {\n if (!existingContent.includes(\"defineApp\")) {\n return null;\n }\n\n const newline = existingContent.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const normalizedLines = existingContent.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const importPath = `${stackPackageName}/convex.config`;\n\n const hasImport = normalizedLines.some((line) => line.includes(importPath));\n if (!hasImport) {\n let insertIndex = 0;\n while (insertIndex < normalizedLines.length && normalizedLines[insertIndex].trim() === \"\") {\n insertIndex++;\n }\n while (insertIndex < normalizedLines.length && normalizedLines[insertIndex].trim().startsWith(\"import\")) {\n insertIndex++;\n }\n normalizedLines.splice(insertIndex, 0, `import stackAuthComponent from \"${importPath}\";`);\n }\n\n let lastImportIndex = -1;\n for (let i = 0; i < normalizedLines.length; i++) {\n if (normalizedLines[i].trim().startsWith(\"import\")) {\n lastImportIndex = i;\n continue;\n }\n if (normalizedLines[i].trim() === \"\") {\n continue;\n }\n break;\n }\n if (lastImportIndex >= 0) {\n const nextIndex = lastImportIndex + 1;\n if (!normalizedLines[nextIndex] || normalizedLines[nextIndex].trim() !== \"\") {\n normalizedLines.splice(nextIndex, 0, \"\");\n }\n }\n\n const hasStackUse = normalizedLines.some((line) => line.includes(\"app.use(stackAuthComponent\"));\n if (!hasStackUse) {\n const appLineIndex = normalizedLines.findIndex((line) => /const\\s+app\\s*=\\s*defineApp/.test(line));\n if (appLineIndex === -1) {\n return null;\n }\n const indent = normalizedLines[appLineIndex].match(/^\\s*/)?.[0] ?? \"\";\n const insertIndexForUse = appLineIndex + 1;\n normalizedLines.splice(insertIndexForUse, 0, `${indent}app.use(stackAuthComponent);`);\n const nextLineIndex = insertIndexForUse + 1;\n if (!normalizedLines[nextLineIndex] || normalizedLines[nextLineIndex].trim() !== \"\") {\n normalizedLines.splice(nextLineIndex, 0, \"\");\n }\n }\n\n let updated = normalizedLines.join(newline);\n if (!updated.endsWith(newline)) {\n updated += newline;\n }\n return updated;\n}\n\nfunction isSimpleConvexConfig(content: string): boolean {\n const normalized = content\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (normalized.length !== 3) {\n return false;\n }\n const [line1, line2, line3] = normalized;\n const importRegex = /^import\\s+\\{\\s*defineApp\\s*\\}\\s+from\\s+['\"]convex\\/server['\"];?$/;\n const appRegex = /^const\\s+app\\s*=\\s*defineApp\\(\\s*\\);?$/;\n const exportRegex = /^export\\s+default\\s+app;?$/;\n return importRegex.test(line1) && appRegex.test(line2) && exportRegex.test(line3);\n}\n\nfunction getPublicProjectEnvVarName(type: \"js\" | \"next\" | \"react\"): string {\n if (type === \"react\") {\n return \"VITE_PUBLIC_STACK_PROJECT_ID\";\n }\n if (type === \"next\") {\n return \"NEXT_PUBLIC_STACK_PROJECT_ID\";\n }\n return \"STACK_PROJECT_ID\";\n}\n\ntype ConvexClientUpdateResult = {\n updatedFiles: string[],\n skippedFiles: string[],\n};\n\ntype AddSetAuthResult = {\n updatedContent: string,\n changed: boolean,\n usedClientApp: boolean,\n usedServerApp: boolean,\n instantiationCount: number,\n skippedHttpCount: number,\n};\n\nasync function updateConvexClients({ projectPath, type }: { projectPath: string, type: \"js\" | \"next\" | \"react\" }): Promise<ConvexClientUpdateResult> {\n const files = collectConvexClientCandidateFiles(projectPath);\n const updatedFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n for (const filePath of files) {\n const fileContent = await readFile(filePath);\n if (!fileContent) continue;\n if (!/new\\s+Convex(?:React|Http)?Client\\b/.test(fileContent)) continue;\n\n const addResult = addSetAuthToConvexClients(fileContent, type);\n if (!addResult.changed) {\n if (addResult.instantiationCount > 0 && addResult.skippedHttpCount > 0) {\n skippedFiles.push(filePath);\n }\n continue;\n }\n\n let finalContent = addResult.updatedContent;\n if (addResult.usedClientApp) {\n finalContent = await ensureStackAppImport(finalContent, filePath, \"client\");\n }\n if (addResult.usedServerApp) {\n finalContent = await ensureStackAppImport(finalContent, filePath, \"server\");\n }\n\n if (finalContent !== fileContent) {\n laterWriteFile(filePath, finalContent);\n updatedFiles.push(filePath);\n }\n }\n\n return {\n updatedFiles,\n skippedFiles,\n };\n}\n\ntype StackAppKind = \"client\" | \"server\";\n\nasync function ensureStackAppImport(content: string, filePath: string, kind: StackAppKind): Promise<string> {\n const identifier = kind === \"client\" ? \"stackClientApp\" : \"stackServerApp\";\n if (new RegExp(`import\\\\s+[^;]*\\\\b${identifier}\\\\b`).test(content)) {\n return content;\n }\n\n const stackBasePath = await getStackAppBasePath(kind);\n const relativeImportPath = convertToModuleSpecifier(path.relative(path.dirname(filePath), stackBasePath));\n const newline = content.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n\n const lines = content.split(/\\r?\\n/);\n const importLine = `import { ${identifier} } from \"${relativeImportPath}\";`;\n\n let insertIndex = 0;\n while (insertIndex < lines.length) {\n const line = lines[insertIndex];\n if (/^\\s*['\"]use (client|server)['\"];?\\s*$/.test(line)) {\n insertIndex += 1;\n continue;\n }\n if (/^\\s*import\\b/.test(line)) {\n insertIndex += 1;\n continue;\n }\n if (line.trim() === \"\") {\n insertIndex += 1;\n continue;\n }\n break;\n }\n\n lines.splice(insertIndex, 0, importLine);\n const nextLine = lines[insertIndex + 1];\n if (nextLine && nextLine.trim() !== \"\" && !/^\\s*import\\b/.test(nextLine)) {\n lines.splice(insertIndex + 1, 0, \"\");\n }\n\n return lines.join(newline);\n}\n\nfunction convertToModuleSpecifier(relativePath: string): string {\n let specifier = relativePath.replace(/\\\\/g, \"/\");\n if (!specifier.startsWith(\".\")) {\n specifier = \"./\" + specifier;\n }\n return specifier;\n}\n\nasync function getStackAppBasePath(kind: StackAppKind): Promise<string> {\n const srcPath = await Steps.guessSrcPath();\n return path.join(srcPath, \"stack\", kind);\n}\n\nfunction addSetAuthToConvexClients(content: string, type: \"js\" | \"next\" | \"react\"): AddSetAuthResult {\n const newline = content.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const instantiationRegex = /^[ \\t]*(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*new\\s+(Convex(?:React|Http)?Client)\\b([\\s\\S]*?);/gm;\n const replacements: Array<{ start: number, end: number, text: string }> = [];\n let instantiationCount = 0;\n let skippedHttpCount = 0;\n let usedClientApp = false;\n let usedServerApp = false;\n\n let match: RegExpExecArray | null;\n while ((match = instantiationRegex.exec(content)) !== null) {\n instantiationCount += 1;\n const fullMatch = match[0];\n const variableName = match[1];\n const className = match[2];\n\n if (className === \"ConvexHttpClient\") {\n skippedHttpCount += 1;\n continue;\n }\n\n const remainder = content.slice(match.index + fullMatch.length);\n const setAuthRegex = new RegExp(`\\\\b${escapeRegExp(variableName)}\\\\s*\\\\.setAuth\\\\s*\\\\(`);\n if (setAuthRegex.test(remainder)) {\n continue;\n }\n\n const indentation = fullMatch.match(/^[\\t ]*/)?.[0] ?? \"\";\n const authCall = determineAuthCallExpression({ type, className, content });\n\n if (authCall.identifier === \"stackClientApp\") {\n usedClientApp = true;\n } else {\n usedServerApp = true;\n }\n\n const replacementText = `${fullMatch}${newline}${indentation}${variableName}.setAuth(${authCall.expression});`;\n replacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n text: replacementText,\n });\n }\n\n if (replacements.length === 0) {\n return {\n updatedContent: content,\n changed: false,\n usedClientApp,\n usedServerApp,\n instantiationCount,\n skippedHttpCount,\n };\n }\n\n let updatedContent = content;\n for (let i = replacements.length - 1; i >= 0; i--) {\n const replacement = replacements[i];\n updatedContent = `${updatedContent.slice(0, replacement.start)}${replacement.text}${updatedContent.slice(replacement.end)}`;\n }\n\n return {\n updatedContent,\n changed: true,\n usedClientApp,\n usedServerApp,\n instantiationCount,\n skippedHttpCount,\n };\n}\n\nfunction determineAuthCallExpression({ type, className, content }: { type: \"js\" | \"next\" | \"react\", className: string, content: string }): { expression: string, identifier: \"stackClientApp\" | \"stackServerApp\" } {\n const hasClientAppReference = /\\bstackClientApp\\b/.test(content);\n const hasServerAppReference = /\\bstackServerApp\\b/.test(content);\n\n if (type === \"js\") {\n return { expression: \"stackServerApp.getConvexClientAuth({})\", identifier: \"stackServerApp\" };\n }\n\n if (hasClientAppReference) {\n return { expression: getClientAuthCall(type), identifier: \"stackClientApp\" };\n }\n if (hasServerAppReference && className !== \"ConvexReactClient\") {\n return { expression: \"stackServerApp.getConvexClientAuth({})\", identifier: \"stackServerApp\" };\n }\n\n return { expression: getClientAuthCall(type), identifier: \"stackClientApp\" };\n}\n\nfunction getClientAuthCall(type: \"js\" | \"next\" | \"react\"): string {\n return \"stackClientApp.getConvexClientAuth({})\";\n}\n\nfunction collectConvexClientCandidateFiles(projectPath: string): string[] {\n const roots = getConvexSearchRoots(projectPath);\n const files = new Set<string>();\n const visited = new Set<string>();\n\n for (const root of roots) {\n walkDirectory(root, files, visited);\n }\n\n return Array.from(files);\n}\n\nfunction getConvexSearchRoots(projectPath: string): string[] {\n const candidateDirs = [\"convex\", \"src\", \"app\", \"components\"];\n const existing = candidateDirs\n .map((dir) => path.join(projectPath, dir))\n .filter((dirPath) => {\n try {\n return fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n } catch {\n return false;\n }\n });\n if (existing.length > 0) {\n return existing;\n }\n return [projectPath];\n}\n\nconst directorySkipList = new Set([\n \"node_modules\",\n \".git\",\n \".next\",\n \".turbo\",\n \".output\",\n \".vercel\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".cache\",\n \".storybook\",\n \"storybook-static\",\n]);\n\nfunction walkDirectory(currentDir: string, files: Set<string>, visited: Set<string>): void {\n const realPath = (() => {\n try {\n return fs.realpathSync(currentDir);\n } catch {\n return currentDir;\n }\n })();\n\n if (visited.has(realPath)) return;\n visited.add(realPath);\n\n let dirEntries: fs.Dirent[];\n try {\n dirEntries = fs.readdirSync(realPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of dirEntries) {\n const entryName = entry.name;\n if (entry.isDirectory()) {\n if (directorySkipList.has(entryName)) continue;\n if (entryName.startsWith(\".\") || entryName.startsWith(\"_\")) continue;\n walkDirectory(path.join(realPath, entryName), files, visited);\n continue;\n }\n if (!entry.isFile()) continue;\n if (entryName.endsWith(\".d.ts\")) continue;\n if (!hasJsLikeExtension(entryName)) continue;\n files.add(path.join(realPath, entryName));\n }\n}\n\nfunction hasJsLikeExtension(fileName: string): boolean {\n return jsLikeFileExtensions.some((ext) => fileName.endsWith(`.${ext}`));\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction throwErr(message: string): never {\n throw new Error(message);\n}\n\n// TODO import this function from stack-shared instead (but that would require us to fix the build to let us import it)\nexport function templateIdentity(strings: TemplateStringsArray, ...values: any[]): string {\n if (strings.length === 0) return \"\";\n if (values.length !== strings.length - 1) throw new Error(\"Invalid number of values; must be one less than strings\");\n\n return strings.slice(1).reduce((result, string, i) => `${result}${values[i] ?? \"n/a\"}${string}`, strings[0]);\n}\n\nasync function clearStdin(): Promise<void> {\n await new Promise<void>((resolve) => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n process.stdin.removeAllListeners('data');\n\n const flush = () => {\n while (process.stdin.read() !== null) { }\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n resolve();\n };\n\n // Add a small delay to allow any buffered input to clear\n setTimeout(flush, 10);\n });\n}\n","{\n \"name\": \"@stackframe/init-stack\",\n \"version\": \"2.8.43\",\n \"description\": \"The setup wizard for Stack. https://stack-auth.com\",\n \"main\": \"dist/index.js\",\n \"type\": \"module\",\n \"bin\": \"./dist/index.js\",\n \"scripts\": {\n \"clean\": \"rimraf test-run-output && rimraf node_modules && rimraf dist\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint --ext .tsx,.ts .\",\n \"typecheck\": \"tsc --noEmit\",\n \"init-stack\": \"node dist/index.js\",\n \"init-stack:local\": \"STACK_NEXT_INSTALL_PACKAGE_NAME_OVERRIDE=../../stack STACK_JS_INSTALL_PACKAGE_NAME_OVERRIDE=../../js STACK_REACT_INSTALL_PACKAGE_NAME_OVERRIDE=../../react node dist/index.js\",\n \"test-run\": \"pnpm run build && pnpm run test-run-js && pnpm run test-run-node && pnpm run test-run-next && pnpm run test-run-neon && pnpm run test-run-no-browser\",\n \"test-run:manual\": \"pnpm run build && pnpm run test-run-js:manual && pnpm run test-run-node:manual && pnpm run test-run-next:manual && pnpm run test-run-neon:manual\",\n \"ensure-neon\": \"grep -q '\\\"@neondatabase/serverless\\\"' ./test-run-output/package.json && echo 'Initialized Neon successfully!'\",\n \"test-run-neon\": \"pnpm run test-run-node --neon && pnpm run ensure-neon\",\n \"test-run-neon:manual\": \"pnpm run test-run-node:manual --neon && pnpm run ensure-neon\",\n \"test-run-no-browser\": \"rimraf test-run-output && mkdir test-run-output && cd test-run-output && npm init --init-author-name example-author --init-license UNLICENSED --init-author-url http://example.com --init-module test-run-output --init-version 1.0.0 -y && cd .. && pnpm run init-stack:local test-run-output --on-question error --js --server --npm --no-browser\",\n \"test-run-node:manual\": \"rimraf test-run-output && mkdir test-run-output && cd test-run-output && npm init && cd .. && pnpm run init-stack:local test-run-output\",\n \"test-run-node\": \"rimraf test-run-output && mkdir test-run-output && cd test-run-output && npm init --init-author-name example-author --init-license UNLICENSED --init-author-url http://example.com --init-module test-run-output --init-version 1.0.0 -y && cd .. && pnpm run init-stack:local test-run-output --on-question error --js --server --npm --no-browser\",\n \"test-run-js:manual\": \"rimraf test-run-output && npx -y sv create test-run-output --no-install && pnpm run init-stack:local test-run-output\",\n \"test-run-js\": \"rimraf test-run-output && npx -y sv create test-run-output --template minimal --types ts --no-add-ons --no-install && pnpm run init-stack:local test-run-output --on-question error --js --client --npm --no-browser\",\n \"test-run-next:manual\": \"rimraf test-run-output && npx -y create-next-app@latest test-run-output && pnpm run init-stack:local test-run-output\",\n \"test-run-next\": \"rimraf test-run-output && npx -y create-next-app@latest test-run-output --app --ts --no-src-dir --tailwind --use-npm --eslint --import-alias '##@#/*' --turbopack && pnpm run init-stack:local test-run-output --on-question error --no-browser\",\n \"test-run-keys-next\": \"rimraf test-run-output && npx -y create-next-app@latest test-run-output --app --ts --no-src-dir --tailwind --use-npm --eslint --import-alias '##@#/*' --turbopack && pnpm run init-stack:local test-run-output --on-question error --project-id my-project-id --publishable-client-key my-publishable-client-key\",\n \"test-run-keys-js\": \"rimraf test-run-output && npx -y sv create test-run-output --template minimal --types ts --no-add-ons --no-install && pnpm run init-stack:local test-run-output --on-question error --js --client --npm --project-id my-project-id --publishable-client-key my-publishable-client-key\",\n \"test-run-react\": \"rimraf test-run-output && npx -y create-vite@latest test-run-output --template react-ts && pnpm run init-stack:local test-run-output --on-question error --no-browser --npm\",\n \"test-run-react:manual\": \"rimraf test-run-output && npx -y create-vite@latest test-run-output --template react-ts && pnpm run init-stack:local test-run-output --react\"\n },\n \"files\": [\n \"README.md\",\n \"dist\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"homepage\": \"https://stack-auth.com\",\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@stackframe/stack-shared\": \"workspace:*\",\n \"commander\": \"^13.1.0\",\n \"inquirer\": \"^9.2.19\",\n \"open\": \"^10.1.0\",\n \"posthog-node\": \"^4.1.0\"\n },\n \"devDependencies\": {\n \"@types/inquirer\": \"^9.0.7\",\n \"@types/node\": \"20.17.6\",\n \"rimraf\": \"^6.0.1\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"5.3.3\"\n }\n}\n"],"mappings":"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","names":["options"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import * as child_process from \"child_process\";\nimport { Command } from \"commander\";\nimport * as crypto from 'crypto';\nimport * as fs from \"fs\";\nimport inquirer from \"inquirer\";\nimport open from \"open\";\nimport * as os from 'os';\nimport * as path from \"path\";\nimport { PostHog } from 'posthog-node';\nimport packageJson from '../package.json';\n\nconst jsLikeFileExtensions: string[] = [\n \"mtsx\",\n \"ctsx\",\n \"tsx\",\n \"mts\",\n \"cts\",\n \"ts\",\n \"mjsx\",\n \"cjsx\",\n \"jsx\",\n \"mjs\",\n \"cjs\",\n \"js\",\n];\n\nclass UserError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UserError\";\n }\n}\n\nclass UnansweredQuestionError extends UserError {\n constructor(message: string) {\n super(message + \", or use --on-question <guess|ask> to answer questions automatically or interactively\");\n this.name = \"UnansweredQuestionError\";\n }\n}\n\ntype OnQuestionMode = \"ask\" | \"guess\" | \"error\";\n\nfunction isTruthyEnv(name: string): boolean {\n const v = process.env[name];\n if (!v) return false;\n const s = String(v).toLowerCase();\n return s === \"1\" || s === \"true\" || s === \"yes\";\n}\n\nfunction isNonInteractiveEnv(): boolean {\n if (isTruthyEnv(\"CI\")) return true;\n if (isTruthyEnv(\"GITHUB_ACTIONS\")) return true;\n if (isTruthyEnv(\"NONINTERACTIVE\")) return true;\n if (isTruthyEnv(\"NO_INTERACTIVE\")) return true;\n if (isTruthyEnv(\"PNPM_NON_INTERACTIVE\")) return true;\n if (isTruthyEnv(\"YARN_ENABLE_NON_INTERACTIVE\")) return true;\n if (isTruthyEnv(\"CURSOR_AGENT\")) return true;\n if (isTruthyEnv(\"CLAUDECODE\")) return true;\n return false;\n}\n\nfunction resolveOnQuestionMode(opt: string): OnQuestionMode {\n if (!opt || opt === \"default\") {\n return isNonInteractiveEnv() ? \"error\" : \"ask\";\n }\n if (opt === \"ask\" || opt === \"guess\" || opt === \"error\") {\n return opt;\n }\n throw new UserError(`Invalid argument for --on-question: \"${opt}\". Valid modes are: \"ask\", \"guess\", \"error\", \"default\".`);\n}\n\n// Setup command line parsing\nconst program = new Command();\nprogram\n .name(packageJson.name)\n .description(\"Stack Auth Initialization Tool\")\n .version(packageJson.version)\n .argument(\"[project-path]\", \"Path to your project\")\n .usage(`[project-path] [options]`)\n .option(\"--dry-run\", \"Run without making any changes\")\n .option(\"--neon\", \"Use Neon database\")\n .option(\"--js\", \"Initialize for JavaScript project\")\n .option(\"--next\", \"Initialize for Next.js project\")\n .option(\"--react\", \"Initialize for React project\")\n .option(\"--npm\", \"Use npm as package manager\")\n .option(\"--yarn\", \"Use yarn as package manager\")\n .option(\"--pnpm\", \"Use pnpm as package manager\")\n .option(\"--bun\", \"Use bun as package manager\")\n .option(\"--client\", \"Initialize client-side only\")\n .option(\"--server\", \"Initialize server-side only\")\n .option(\"--project-id <project-id>\", \"Project ID to use in setup\")\n .option(\"--publishable-client-key <publishable-client-key>\", \"Publishable client key to use in setup\")\n .option(\"--no-browser\", \"Don't open browser for environment variable setup\")\n .option(\"--on-question <mode>\", \"How to handle interactive questions: ask | guess | error | default\", \"default\")\n .addHelpText('after', `\nFor more information, please visit https://docs.stack-auth.com/getting-started/setup`);\n\nprogram.parse();\n\nconst options = program.opts();\n\n// Keep existing variables but assign from Commander\nlet savedProjectPath: string | undefined = program.args[0] || undefined;\nconst isDryRun: boolean = options.dryRun || false;\nconst isNeon: boolean = options.neon || false;\nconst typeFromArgs: \"js\" | \"next\" | \"react\" | undefined = options.js ? \"js\" : options.next ? \"next\" : options.react ? \"react\" : undefined;\nconst packageManagerFromArgs: string | undefined = options.npm ? \"npm\" : options.yarn ? \"yarn\" : options.pnpm ? \"pnpm\" : options.bun ? \"bun\" : undefined;\nconst isClient: boolean = options.client || false;\nconst isServer: boolean = options.server || false;\nconst projectIdFromArgs: string | undefined = options.projectId;\nconst publishableClientKeyFromArgs: string | undefined = options.publishableClientKey;\nconst onQuestionMode: OnQuestionMode = resolveOnQuestionMode(options.onQuestion);\n\n// Commander negates the boolean options with prefix `--no-`\n// so `--no-browser` becomes `browser: false`\nconst noBrowser: boolean = !options.browser;\n\ntype Ansis = {\n red: string,\n blue: string,\n green: string,\n yellow: string,\n clear: string,\n bold: string,\n};\n\nconst ansis: Ansis = {\n red: \"\\x1b[31m\",\n blue: \"\\x1b[34m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n\n clear: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n};\n\ntype TemplateFunction = (strings: TemplateStringsArray, ...values: any[]) => string;\n\ntype Colorize = {\n red: TemplateFunction,\n blue: TemplateFunction,\n green: TemplateFunction,\n yellow: TemplateFunction,\n bold: TemplateFunction,\n};\n\nconst colorize: Colorize = {\n red: (strings, ...values) => ansis.red + templateIdentity(strings, ...values) + ansis.clear,\n blue: (strings, ...values) => ansis.blue + templateIdentity(strings, ...values) + ansis.clear,\n green: (strings, ...values) => ansis.green + templateIdentity(strings, ...values) + ansis.clear,\n yellow: (strings, ...values) => ansis.yellow + templateIdentity(strings, ...values) + ansis.clear,\n bold: (strings, ...values) => ansis.bold + templateIdentity(strings, ...values) + ansis.clear,\n};\n\nconst filesCreated: string[] = [];\nconst filesModified: string[] = [];\nconst commandsExecuted: string[] = [];\n\nconst packagesToInstall: string[] = [];\nconst writeFileHandlers: Array<() => Promise<void>> = [];\nconst nextSteps: string[] = [\n `Create an account and Stack Auth API key for your project on https://app.stack-auth.com`,\n];\n\n\nconst STACK_AUTH_PUBLIC_HOG_KEY = \"phc_vIUFi0HzHo7oV26OsaZbUASqxvs8qOmap1UBYAutU4k\";\nconst EVENT_PREFIX = \"stack-init-\";\nconst ph_client = new PostHog(STACK_AUTH_PUBLIC_HOG_KEY, {\n host: \"https://eu.i.posthog.com\",\n flushAt: 1,\n flushInterval: 0,\n});\nconst distinctId = crypto.randomUUID();\n\n\nasync function capture(event: string, properties: Record<string, any>) {\n ph_client.capture({\n event: `${EVENT_PREFIX}${event}`,\n distinctId,\n properties,\n });\n}\n\n\nasync function main(): Promise<void> {\n // Welcome message\n console.log();\n console.log(`\n ██████\n ██████████████\n████████████████████\n████████████████████ WELCOME TO\n█████████████████ ╔═╗╔╦╗╔═╗╔═╗╦╔═ ┌─┐┬ ┬┌┬┐┬ ┬\n█████████████ ╚═╗ ║ ╠═╣║ ╠╩╗ ├─┤│ │ │ ├─┤\n█████████████ ████ ╚═╝ ╩ ╩ ╩╚═╝╩ ╩ ┴ ┴└─┘ ┴ ┴ ┴\n █████████████████\n ██████ ██\n████ ████\n █████ █████\n ██████\n `);\n console.log();\n\n await capture(\"start\", {\n version: packageJson.version,\n isDryRun,\n isNeon,\n typeFromArgs,\n packageManagerFromArgs,\n isClient,\n isServer,\n noBrowser,\n platform: os.platform(),\n arch: os.arch(),\n nodeVersion: process.version,\n });\n\n // Wait just briefly so we can use `Steps` in here (it's defined only after the call to `main()`)\n await new Promise<void>((resolve) => resolve());\n\n\n // Prepare some stuff\n await clearStdin();\n const projectPath = await getProjectPath();\n\n\n // Steps\n const { packageJson: projectPackageJson } = await Steps.getProject();\n const type = await Steps.getProjectType({ packageJson: projectPackageJson });\n\n await capture(\"project-type-selected\", {\n type,\n wasSpecifiedInArgs: !!typeFromArgs,\n });\n\n await Steps.addStackPackage(type);\n if (isNeon) packagesToInstall.push('@neondatabase/serverless');\n\n await Steps.writeEnvVars(type);\n const convexIntegration = await Steps.maybeInstallConvexIntegration({ packageJson: projectPackageJson, type });\n if (convexIntegration) {\n nextSteps.push(...convexIntegration.instructions);\n }\n\n if (type === \"next\") {\n const projectInfo = await Steps.getNextProjectInfo({ packageJson: projectPackageJson });\n await Steps.updateNextLayoutFile(projectInfo);\n await Steps.writeStackAppFile(projectInfo, \"client\", true);\n await Steps.writeStackAppFile(projectInfo, \"server\", true);\n await Steps.writeNextHandlerFile(projectInfo);\n await Steps.writeNextLoadingFile(projectInfo);\n nextSteps.push(`Copy the environment variables from the new API key into your .env.local file`);\n } else if (type === \"react\") {\n const defaultExtension = await Steps.guessDefaultFileExtension();\n const srcPath = await Steps.guessSrcPath();\n const hasReactRouterDom = !!(projectPackageJson.dependencies?.[\"react-router-dom\"] || projectPackageJson.devDependencies?.[\"react-router-dom\"]);\n const { fileName } = await Steps.writeReactClientFile({\n srcPath,\n defaultExtension,\n indentation: \" \",\n hasReactRouterDom,\n });\n nextSteps.push(\n `Copy the environment variables from the new API key into your own environment and reference them in ${fileName}`,\n );\n } else {\n const defaultExtension = await Steps.guessDefaultFileExtension();\n const where = await Steps.getServerOrClientOrBoth();\n const srcPath = await Steps.guessSrcPath();\n const appFiles: string[] = [];\n for (const w of where) {\n const { fileName } = await Steps.writeStackAppFile({\n type,\n defaultExtension,\n indentation: \" \",\n srcPath,\n }, w, where.includes(\"client\"));\n appFiles.push(fileName);\n }\n nextSteps.push(\n `Copy the environment variables from the new API key into your own environment and reference them in ${appFiles.join(\" and \")}`,\n `Follow the instructions on how to use Stack Auth's vanilla SDK at http://docs.stack-auth.com/others/js-client`,\n );\n }\n\n const { packageManager } = await Steps.getPackageManager();\n\n await capture(`package-manager-selected`, {\n packageManager,\n wasSpecifiedInArgs: !!packageManagerFromArgs,\n });\n\n await Steps.ensureReady(type);\n\n\n // Install dependencies\n console.log();\n console.log(colorize.bold`Installing dependencies...`);\n const installCommandMap = new Map<string, string>([\n [\"npm\", \"npm install\"],\n [\"yarn\", \"yarn add\"],\n [\"pnpm\", \"pnpm add\"],\n [\"bun\", \"bun add\"],\n ]);\n const installCommand = installCommandMap.get(packageManager) ?? `${packageManager} install`;\n // Quote each package name to avoid shell interpretation of env-overridden values.\n const safePackages = packagesToInstall.map((p) => JSON.stringify(p));\n await shellNicelyFormatted(`${installCommand} ${safePackages.join(' ')}`, {\n shell: true,\n cwd: projectPath,\n });\n\n await capture(`dependencies-installed`, {\n packageManager,\n packages: packagesToInstall,\n });\n\n // Write files\n console.log();\n console.log(colorize.bold`Writing files...`);\n console.log();\n for (const writeFileHandler of writeFileHandlers) {\n await writeFileHandler();\n }\n console.log(`${colorize.green`√`} Done writing files`);\n\n console.log('\\n\\n\\n');\n console.log(colorize.bold`${colorize.green`Installation succeeded!`}`);\n console.log();\n console.log(\"Commands executed:\");\n for (const command of commandsExecuted) {\n console.log(` ${colorize.blue`${command}`}`);\n }\n console.log();\n console.log(\"Files written:\");\n for (const file of filesModified) {\n console.log(` ${colorize.yellow`${file}`}`);\n }\n for (const file of filesCreated) {\n console.log(` ${colorize.green`${file}`}`);\n }\n console.log();\n\n await capture(\"complete\", {\n success: true,\n type,\n packageManager,\n isNeon,\n isClient,\n isServer,\n noBrowser,\n filesCreated,\n filesModified,\n commandsExecuted,\n });\n\n // Success!\n console.log(`\n${colorize.green`===============================================`}\n\n${colorize.green`Successfully installed Stack! 🚀🚀🚀`}\n\n${colorize.bold`Next steps:`}\n\n1. ${noBrowser ?\n `Create a project at https://app.stack-auth.com and get your API keys` :\n `Complete the setup in your browser to get your API keys`}\n2. Add the API keys to your .env.local file\n3. Import the Stack components in your app\n4. Add authentication to your app\n\nFor more information, please visit https://docs.stack-auth.com/getting-started/setup\n `.trim());\n if (!noBrowser) {\n await open(`https://app.stack-auth.com/wizard-congrats?stack-init-id=${encodeURIComponent(distinctId)}`);\n }\n await ph_client.shutdown();\n}\n\n// eslint-disable-next-line no-restricted-syntax\nmain().catch(async (err) => {\n try {\n await capture(\"error\", {\n error: err.message,\n errorType: err instanceof UserError ? \"UserError\" : \"SystemError\",\n stack: err.stack,\n });\n } catch (e) { }\n if (!(err instanceof UserError)) {\n console.error(err);\n }\n console.error('\\n\\n\\n\\n');\n console.log(colorize.red`===============================================`);\n console.error();\n if (err instanceof UserError) {\n console.error(`${colorize.red`ERROR!`} ${err.message}`);\n } else {\n console.error(\"An error occurred during the initialization process.\");\n }\n console.error();\n console.log(colorize.red`===============================================`);\n console.error();\n console.error(\n \"If you need assistance, please try installing Stack manually as described in https://docs.stack-auth.com/getting-started/setup or join our Discord where we're happy to help: https://discord.stack-auth.com\"\n );\n if (!(err instanceof UserError)) {\n console.error(\"\");\n console.error(`Error message: ${err.message}`);\n }\n console.error();\n await ph_client.shutdown();\n process.exit(1);\n});\n\n\ntype PackageJson = {\n dependencies?: Record<string, string>,\n devDependencies?: Record<string, string>,\n [key: string]: any,\n}\n\ntype ProjectInfo = {\n type: \"js\" | \"next\" | \"react\",\n srcPath: string,\n appPath: string,\n defaultExtension: string,\n indentation: string,\n}\n\ntype NextProjectInfoError = {\n error: string,\n}\n\ntype NextProjectInfoResult = ProjectInfo | NextProjectInfoError;\n\ntype StackAppFileOptions = {\n type: \"js\" | \"next\" | \"react\",\n srcPath: string,\n defaultExtension: string,\n indentation: string,\n}\n\ntype StackAppFileResult = {\n fileName: string,\n}\n\ntype ConvexIntegrationResult = {\n instructions: string[],\n}\n\nconst Steps = {\n async getProject(): Promise<{ packageJson: PackageJson }> {\n let projectPath = await getProjectPath();\n if (!fs.existsSync(projectPath)) {\n throw new UserError(`The project path ${projectPath} does not exist`);\n }\n\n const packageJsonPath = path.join(projectPath, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) {\n throw new UserError(\n `The package.json file does not exist in the project path ${projectPath}. You must initialize a new project first before installing Stack.`\n );\n }\n\n const packageJsonText = fs.readFileSync(packageJsonPath, \"utf-8\");\n let packageJson: PackageJson;\n try {\n packageJson = JSON.parse(packageJsonText);\n } catch (e) {\n throw new UserError(`package.json file is not valid JSON: ${e}`);\n }\n\n return { packageJson };\n },\n\n async getProjectType({ packageJson }: { packageJson: PackageJson }): Promise<\"js\" | \"next\" | \"react\"> {\n if (typeFromArgs) return typeFromArgs;\n\n const maybeNextProject = await Steps.maybeGetNextProjectInfo({ packageJson });\n if (!(\"error\" in maybeNextProject)) {\n return \"next\";\n }\n if (packageJson.dependencies?.[\"react\"] || packageJson.dependencies?.[\"react-dom\"]) {\n return \"react\";\n }\n if (onQuestionMode === \"guess\") {\n return \"js\";\n }\n if (onQuestionMode === \"error\") {\n throw new UnansweredQuestionError(\"Unable to auto-detect project type (checked for Next.js and React dependencies). Re-run with one of: --js, --react, or --next.\");\n }\n\n const { type } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"type\",\n message: \"Which integration would you like to install?\",\n choices: [\n { name: \"None (vanilla JS, Node.js, etc)\", value: \"js\" },\n { name: \"React\", value: \"react\" },\n { name: \"Next.js\", value: \"next\" },\n ]\n }\n ]);\n\n return type;\n },\n\n async getStackPackageName(type: \"js\" | \"next\" | \"react\", install = false): Promise<string> {\n const mapping = {\n js: (install && process.env.STACK_JS_INSTALL_PACKAGE_NAME_OVERRIDE) || \"@stackframe/js\",\n next: (install && process.env.STACK_NEXT_INSTALL_PACKAGE_NAME_OVERRIDE) || \"@stackframe/stack\",\n react: (install && process.env.STACK_REACT_INSTALL_PACKAGE_NAME_OVERRIDE) || \"@stackframe/react\",\n } as const;\n return mapping[type];\n },\n\n async addStackPackage(type: \"js\" | \"next\" | \"react\"): Promise<void> {\n packagesToInstall.push(await Steps.getStackPackageName(type, true));\n },\n\n async getNextProjectInfo({ packageJson }: { packageJson: PackageJson }): Promise<ProjectInfo> {\n const maybe = await Steps.maybeGetNextProjectInfo({ packageJson });\n if (\"error\" in maybe) throw new UserError(maybe.error);\n return maybe;\n },\n\n async maybeGetNextProjectInfo({ packageJson }: { packageJson: PackageJson }): Promise<NextProjectInfoResult> {\n const projectPath = await getProjectPath();\n\n const nextVersionInPackageJson = packageJson.dependencies?.[\"next\"] ?? packageJson.devDependencies?.[\"next\"];\n if (!nextVersionInPackageJson) {\n return { error: `The project at ${projectPath} does not appear to be a Next.js project, or does not have 'next' installed as a dependency.` };\n }\n if (\n !nextVersionInPackageJson.includes(\"14\") &&\n !nextVersionInPackageJson.includes(\"15\") &&\n nextVersionInPackageJson !== \"latest\"\n ) {\n return { error: `The project at ${projectPath} is using an unsupported version of Next.js (found ${nextVersionInPackageJson}).\\n\\nOnly Next.js 14 & 15 projects are currently supported. See Next's upgrade guide: https://nextjs.org/docs/app/building-your-application/upgrading/version-14` };\n }\n\n const hasSrcAppFolder = fs.existsSync(path.join(projectPath, \"src/app\"));\n const srcPath = path.join(projectPath, hasSrcAppFolder ? \"src\" : \"\");\n const appPath = path.join(srcPath, \"app\");\n if (!fs.existsSync(appPath)) {\n return { error: `The app path ${appPath} does not exist. Only the Next.js App router is supported — are you maybe on the Pages router instead?` };\n }\n\n const nextConfigPathWithoutExtension = path.join(projectPath, \"next.config\");\n const nextConfigFileExtension = await findJsExtension(\n nextConfigPathWithoutExtension\n );\n const nextConfigPath =\n nextConfigPathWithoutExtension + \".\" + (nextConfigFileExtension ?? \"js\");\n if (!fs.existsSync(nextConfigPath)) {\n return { error: `Expected file at ${nextConfigPath} for Next.js projects.` };\n }\n\n const dryUpdateNextLayoutFileResult = await Steps.dryUpdateNextLayoutFile({ appPath, defaultExtension: \"jsx\" });\n\n return {\n type: \"next\",\n srcPath,\n appPath,\n defaultExtension: dryUpdateNextLayoutFileResult.fileExtension,\n indentation: dryUpdateNextLayoutFileResult.indentation,\n };\n },\n\n async writeEnvVars(type: \"js\" | \"next\" | \"react\"): Promise<boolean> {\n const projectPath = await getProjectPath();\n\n // TODO: in non-Next environments, ask the user what method they prefer for envvars\n if (type !== \"next\") return false;\n\n const envLocalPath = path.join(projectPath, \".env.local\");\n\n const potentialEnvLocations = [\n path.join(projectPath, \".env\"),\n path.join(projectPath, \".env.development\"),\n path.join(projectPath, \".env.default\"),\n path.join(projectPath, \".env.defaults\"),\n path.join(projectPath, \".env.example\"),\n envLocalPath,\n ];\n if (potentialEnvLocations.every((p) => !fs.existsSync(p))) {\n const envContent = noBrowser\n ? \"# Stack Auth keys\\n\" +\n \"# To get these variables:\\n\" +\n \"# 1. Go to https://app.stack-auth.com\\n\" +\n \"# 2. Create a new project\\n\" +\n \"# 3. Copy the keys below\\n\" +\n `NEXT_PUBLIC_STACK_PROJECT_ID=\"${projectIdFromArgs ?? \"\"}\"\\n` +\n `NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=\"${publishableClientKeyFromArgs ?? \"\"}\"\\n` +\n \"STACK_SECRET_SERVER_KEY=\\n\"\n : \"# Stack Auth keys\\n\" +\n \"# Get these variables by creating a project on https://app.stack-auth.com.\\n\" +\n `NEXT_PUBLIC_STACK_PROJECT_ID=\"${projectIdFromArgs ?? \"\"}\"\\n` +\n `NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=\"${publishableClientKeyFromArgs ?? \"\"}\"\\n` +\n \"STACK_SECRET_SERVER_KEY=\\n\";\n\n laterWriteFile(envLocalPath, envContent);\n return true;\n }\n\n return false;\n },\n\n async maybeInstallConvexIntegration({ packageJson, type }: { packageJson: PackageJson, type: \"js\" | \"next\" | \"react\" }): Promise<ConvexIntegrationResult | null> {\n const hasConvexDependency = Boolean(packageJson.dependencies?.[\"convex\"] || packageJson.devDependencies?.[\"convex\"]);\n if (!hasConvexDependency) {\n return null;\n }\n\n const projectPath = await getProjectPath();\n const convexDir = path.join(projectPath, \"convex\");\n if (!fs.existsSync(convexDir)) {\n return null;\n }\n\n const stackPackageName = await Steps.getStackPackageName(type);\n const instructions: string[] = [];\n\n const authConfigPath = path.join(convexDir, \"auth.config.ts\");\n const desiredAuthConfig = createConvexAuthConfigContent({ stackPackageName, type });\n const existingAuthConfig = await readFile(authConfigPath);\n if (!existingAuthConfig || (!existingAuthConfig.includes(\"getConvexProvidersConfig\") && !existingAuthConfig.includes(\"@stackframe/\"))) {\n laterWriteFile(authConfigPath, desiredAuthConfig);\n }\n\n const convexConfigPath = path.join(convexDir, \"convex.config.ts\");\n const existingConvexConfig = await readFile(convexConfigPath);\n const desiredConvexConfig = createConvexIntegrationConvexConfigContent(stackPackageName);\n let needsManualConvexConfig = false;\n\n if (!existingConvexConfig) {\n laterWriteFile(convexConfigPath, desiredConvexConfig);\n } else if (existingConvexConfig.includes(\"app.use(stackAuthComponent\") && existingConvexConfig.includes(\"/convex.config\") && existingConvexConfig.includes(\"stackframe\")) {\n // already integrated\n } else {\n const integratedContent = integrateConvexConfig(existingConvexConfig, stackPackageName);\n if (integratedContent) {\n laterWriteFile(convexConfigPath, integratedContent);\n } else if (isSimpleConvexConfig(existingConvexConfig)) {\n laterWriteFile(convexConfigPath, desiredConvexConfig);\n } else {\n needsManualConvexConfig = true;\n }\n }\n\n if (needsManualConvexConfig) {\n instructions.push(`Update convex/convex.config.ts to import ${stackPackageName}/convex.config and call app.use(stackAuthComponent).`);\n }\n\n const convexClientUpdateResult = await updateConvexClients({ projectPath, type });\n if (convexClientUpdateResult.skippedFiles.length > 0) {\n instructions.push(\"Review your Convex client setup and call stackClientApp.getConvexClientAuth({}) or stackServerApp.getConvexClientAuth({}) manually where needed.\");\n }\n\n instructions.push(\n \"Set the Stack Auth environment variables in Convex (Deployment → Settings → Environment Variables).\",\n \"Verify your Convex clients call stackClientApp.getConvexClientAuth({}) or stackServerApp.getConvexClientAuth({}) so they share authentication with Stack Auth.\"\n );\n\n return { instructions };\n },\n\n async dryUpdateNextLayoutFile({ appPath, defaultExtension }: { appPath: string, defaultExtension: string }): Promise<{\n path: string,\n updatedContent: string,\n fileExtension: string,\n indentation: string,\n }> {\n const layoutPathWithoutExtension = path.join(appPath, \"layout\");\n const layoutFileExtension =\n (await findJsExtension(layoutPathWithoutExtension)) ?? defaultExtension;\n const layoutPath = layoutPathWithoutExtension + \".\" + layoutFileExtension;\n const layoutContent =\n (await readFile(layoutPath)) ??\n throwErr(\n `The layout file at ${layoutPath} does not exist. Stack requires a layout file to be present in the /app folder.`\n );\n const updatedLayoutResult =\n (await getUpdatedLayout(layoutContent)) ??\n throwErr(\n \"Unable to parse root layout file. Make sure it contains a <body> tag. If it still doesn't work, you may need to manually install Stack. See: https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts#root-layout-required\"\n );\n const updatedLayoutContent = updatedLayoutResult.content;\n return {\n path: layoutPath,\n updatedContent: updatedLayoutContent,\n fileExtension: layoutFileExtension,\n indentation: updatedLayoutResult.indentation\n };\n },\n\n async updateNextLayoutFile(projectInfo: ProjectInfo): Promise<{\n path: string,\n updatedContent: string,\n fileExtension: string,\n indentation: string,\n }> {\n const res = await Steps.dryUpdateNextLayoutFile(projectInfo);\n laterWriteFile(res.path, res.updatedContent);\n return res;\n },\n\n async writeStackAppFile({ type, srcPath, defaultExtension, indentation }: StackAppFileOptions, clientOrServer: \"server\" | \"client\", alsoHasClient: boolean): Promise<StackAppFileResult> {\n const packageName = await Steps.getStackPackageName(type);\n\n const clientOrServerCap = {\n client: \"Client\",\n server: \"Server\",\n }[clientOrServer as \"client\" | \"server\"];\n const relativeStackAppPath = `stack/${clientOrServer}`;\n\n const stackAppPathWithoutExtension = path.join(srcPath, relativeStackAppPath);\n const stackAppFileExtension =\n (await findJsExtension(stackAppPathWithoutExtension)) ?? defaultExtension;\n const stackAppPath =\n stackAppPathWithoutExtension + \".\" + stackAppFileExtension;\n const stackAppContent = await readFile(stackAppPath);\n if (stackAppContent) {\n if (!stackAppContent.includes(\"@stackframe/\")) {\n throw new UserError(\n `A file at the path ${stackAppPath} already exists. Stack uses the stack/${clientOrServer}.ts file to initialize the Stack SDK. Please remove the existing file and try again.`\n );\n }\n throw new UserError(\n `It seems that you already installed Stack in this project.`\n );\n }\n\n const tokenStore = type === \"next\" ? '\"nextjs-cookie\"' : (clientOrServer === \"client\" ? '\"cookie\"' : '\"memory\"');\n const publishableClientKeyWrite = clientOrServer === \"server\"\n ? `process.env.STACK_PUBLISHABLE_CLIENT_KEY ${publishableClientKeyFromArgs ? `|| ${JSON.stringify(publishableClientKeyFromArgs)}` : \"\"}`\n : `'${publishableClientKeyFromArgs ?? 'INSERT_YOUR_PUBLISHABLE_CLIENT_KEY_HERE'}'`;\n const jsOptions = type === \"js\" ? [\n `\\n\\n${indentation}// get your Stack Auth API keys from https://app.stack-auth.com${clientOrServer === \"client\" ? ` and store them in a safe place (eg. environment variables)` : \"\"}`,\n `${projectIdFromArgs ? `${indentation}projectId: ${JSON.stringify(projectIdFromArgs)},` : \"\"}`,\n `${indentation}publishableClientKey: ${publishableClientKeyWrite},`,\n `${clientOrServer === \"server\" ? `${indentation}secretServerKey: process.env.STACK_SECRET_SERVER_KEY,` : \"\"}`,\n ].filter(Boolean).join(\"\\n\") : \"\";\n\n const nextClientOptions = (type === \"next\" && clientOrServer === \"client\")\n ? (() => {\n const lines = [\n projectIdFromArgs ? `${indentation}projectId: process.env.NEXT_PUBLIC_STACK_PROJECT_ID ?? ${JSON.stringify(projectIdFromArgs)},` : \"\",\n publishableClientKeyFromArgs ? `${indentation}publishableClientKey: process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY ?? ${JSON.stringify(publishableClientKeyFromArgs)},` : \"\",\n ].filter(Boolean).join(\"\\n\");\n return lines ? `\\n${lines}` : \"\";\n })()\n : \"\";\n\n const shouldInheritFromClient = clientOrServer === \"server\" && alsoHasClient;\n\n laterWriteFileIfNotExists(\n stackAppPath,\n `\n${type === \"next\" && clientOrServer === \"server\" ? `import \"server-only\";\\n\\n` : \"\"}import { Stack${clientOrServerCap}App } from ${JSON.stringify(packageName)};\n${shouldInheritFromClient ? `import { stackClientApp } from \"./client\";\\n\\n` : \"\\n\"}export const stack${clientOrServerCap}App = new Stack${clientOrServerCap}App({\n${shouldInheritFromClient ? `${indentation}inheritsFrom: stackClientApp,` : `${indentation}tokenStore: ${tokenStore},${jsOptions}${nextClientOptions}`}\n});\n `.trim() + \"\\n\"\n );\n return { fileName: stackAppPath };\n },\n\n async writeReactClientFile({ srcPath, defaultExtension, indentation, hasReactRouterDom }: { srcPath: string, defaultExtension: string, indentation: string, hasReactRouterDom: boolean }): Promise<StackAppFileResult> {\n const packageName = await Steps.getStackPackageName(\"react\");\n const relativeStackAppPath = `stack/client`;\n const stackAppPathWithoutExtension = path.join(srcPath, relativeStackAppPath);\n const stackAppFileExtension = (await findJsExtension(stackAppPathWithoutExtension)) ?? defaultExtension;\n const stackAppPath = stackAppPathWithoutExtension + \".\" + stackAppFileExtension;\n const stackAppContent = await readFile(stackAppPath);\n if (stackAppContent) {\n if (!stackAppContent.includes(\"@stackframe/\")) {\n throw new UserError(`A file at the path ${stackAppPath} already exists. Stack uses the stack/client.ts file to initialize the Stack SDK. Please remove the existing file and try again.`);\n }\n throw new UserError(`It seems that you already installed Stack in this project.`);\n }\n\n const publishableClientKeyWrite = `'${publishableClientKeyFromArgs ?? 'INSERT_YOUR_PUBLISHABLE_CLIENT_KEY_HERE'}'`;\n const projectIdWrite = `'${projectIdFromArgs ?? 'INSERT_PROJECT_ID'}'`;\n\n const imports = hasReactRouterDom\n ? `import { StackClientApp } from ${JSON.stringify(packageName)};\\nimport { useNavigate } from \"react-router-dom\";\\n\\n`\n : `import { StackClientApp } from ${JSON.stringify(packageName)};\\n\\n`;\n\n const redirectMethod = hasReactRouterDom\n ? `,\\n${indentation}redirectMethod: {\\n${indentation}${indentation}useNavigate,\\n${indentation}}`\n : \"\";\n\n laterWriteFileIfNotExists(\n stackAppPath,\n `${imports}export const stackClientApp = new StackClientApp({ \\n${indentation}tokenStore: \"cookie\", \\n${indentation}projectId: ${projectIdWrite}, \\n${indentation}publishableClientKey: ${publishableClientKeyWrite}${redirectMethod}, \\n}); \\n`\n );\n return { fileName: stackAppPath };\n },\n\n async writeNextHandlerFile(projectInfo: ProjectInfo): Promise<void> {\n const handlerPathWithoutExtension = path.join(\n projectInfo.appPath,\n \"handler/[...stack]/page\"\n );\n const handlerFileExtension =\n (await findJsExtension(handlerPathWithoutExtension)) ?? projectInfo.defaultExtension;\n const handlerPath = handlerPathWithoutExtension + \".\" + handlerFileExtension;\n const handlerContent = await readFile(handlerPath);\n if (handlerContent && !handlerContent.includes(\"@stackframe/\")) {\n throw new UserError(\n `A file at the path ${handlerPath} already exists.Stack uses the / handler path to handle incoming requests.Please remove the existing file and try again.`\n );\n }\n laterWriteFileIfNotExists(\n handlerPath,\n `import { StackHandler } from \"@stackframe/stack\"; \\nimport { stackServerApp } from \"../../../stack/server\"; \\n\\nexport default function Handler(props${handlerFileExtension.includes(\"ts\") ? \": unknown\" : \"\"\n }) { \\n${projectInfo.indentation} return <StackHandler fullPage app = { stackServerApp } routeProps = { props } />; \\n } \\n`\n );\n },\n\n async writeNextLoadingFile(projectInfo: ProjectInfo): Promise<void> {\n let loadingPathWithoutExtension = path.join(projectInfo.appPath, \"loading\");\n const loadingFileExtension =\n (await findJsExtension(loadingPathWithoutExtension)) ?? projectInfo.defaultExtension;\n const loadingPath = loadingPathWithoutExtension + \".\" + loadingFileExtension;\n laterWriteFileIfNotExists(\n loadingPath,\n `export default function Loading() {\n\\n${projectInfo.indentation}// Stack uses React Suspense, which will render this page while user data is being fetched.\\n${projectInfo.indentation}// See: https://nextjs.org/docs/app/api-reference/file-conventions/loading\\n${projectInfo.indentation}return <></>;\\n}\\n`\n );\n },\n\n async getPackageManager(): Promise<{ packageManager: string }> {\n if (packageManagerFromArgs) return { packageManager: packageManagerFromArgs };\n const packageManager = await promptPackageManager();\n const versionCommand = `${packageManager} --version`;\n\n try {\n await shellNicelyFormatted(versionCommand, { shell: true, quiet: true });\n } catch (err) {\n console.error(err);\n throw new UserError(\n `Could not run the package manager command '${versionCommand}'. Please make sure ${packageManager} is installed on your system.`\n );\n }\n\n return { packageManager };\n },\n\n async ensureReady(type: \"js\" | \"next\" | \"react\"): Promise<void> {\n const projectPath = await getProjectPath();\n\n const typeStringMap = {\n js: \"JavaScript\",\n next: \"Next.js\",\n react: \"React\",\n } as const;\n const typeString = typeStringMap[type];\n const isReady = (onQuestionMode !== \"ask\") || (await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"ready\",\n message: `Found a ${typeString} project at ${projectPath} — ready to install Stack Auth?`,\n default: true,\n },\n ])).ready;\n if (!isReady) {\n throw new UserError(\"Installation aborted.\");\n }\n },\n\n async getServerOrClientOrBoth(): Promise<Array<\"server\" | \"client\">> {\n if (isClient && isServer) return [\"server\", \"client\"];\n if (isServer) return [\"server\"];\n if (isClient) return [\"client\"];\n\n if (onQuestionMode === \"guess\") return [\"server\", \"client\"];\n if (onQuestionMode === \"error\") {\n throw new UnansweredQuestionError(\"Ambiguous installation type. Re-run with --server, --client, or both.\");\n }\n\n return (await inquirer.prompt([{\n type: \"list\",\n name: \"type\",\n message: \"Do you want to use Stack Auth on the server, or on the client?\",\n choices: [\n { name: \"Client (eg. Vite, HTML)\", value: [\"client\"] },\n { name: \"Server (eg. Node.js)\", value: [\"server\"] },\n { name: \"Both\", value: [\"server\", \"client\"] }\n ]\n }])).type;\n },\n\n /**\n * note: this is a heuristic, specific frameworks may have better heuristics (eg. the Next.js code uses the extension of the global layout file)\n */\n async guessDefaultFileExtension(): Promise<string> {\n const projectPath = await getProjectPath();\n const hasTsConfig = fs.existsSync(\n path.join(projectPath, \"tsconfig.json\")\n );\n return hasTsConfig ? \"ts\" : \"js\";\n },\n\n /**\n * note: this is a heuristic, specific frameworks may have better heuristics (eg. the Next.js code uses the location of the app folder)\n */\n async guessSrcPath(): Promise<string> {\n const projectPath = await getProjectPath();\n const potentialSrcPath = path.join(projectPath, \"src\");\n const hasSrcFolder = fs.existsSync(\n path.join(projectPath, \"src\")\n );\n return hasSrcFolder ? potentialSrcPath : projectPath;\n },\n\n\n};\n\n\ntype LayoutResult = {\n content: string,\n indentation: string,\n}\n\nasync function getUpdatedLayout(originalLayout: string): Promise<LayoutResult | undefined> {\n let layout = originalLayout;\n const indentation = guessIndentation(originalLayout);\n\n const firstImportLocationM1 = /\\simport\\s/.exec(layout)?.index;\n const hasStringAsFirstLine = layout.startsWith('\"') || layout.startsWith(\"'\");\n const importInsertLocationM1 =\n firstImportLocationM1 ?? (hasStringAsFirstLine ? layout.indexOf(\"\\n\") : -1);\n const importInsertLocation = importInsertLocationM1 + 1;\n const importStatement = `import { StackProvider, StackTheme } from \"@stackframe/stack\";\\nimport { stackClientApp } from \"../stack/client\";\\n`;\n layout =\n layout.slice(0, importInsertLocation) +\n importStatement +\n layout.slice(importInsertLocation);\n\n const bodyOpenTag = /<\\s*body[^>]*>/.exec(layout);\n const bodyCloseTag = /<\\s*\\/\\s*body[^>]*>/.exec(layout);\n if (!bodyOpenTag || !bodyCloseTag) {\n return undefined;\n }\n const bodyOpenEndIndex = bodyOpenTag.index + bodyOpenTag[0].length;\n const bodyCloseStartIndex = bodyCloseTag.index;\n if (bodyCloseStartIndex <= bodyOpenEndIndex) {\n return undefined;\n }\n\n const lines = layout.split(\"\\n\");\n const [bodyOpenEndLine, bodyOpenEndIndexInLine] = getLineIndex(\n lines,\n bodyOpenEndIndex\n );\n const [bodyCloseStartLine, bodyCloseStartIndexInLine] = getLineIndex(\n lines,\n bodyCloseStartIndex\n );\n\n const insertOpen = \"<StackProvider app={stackClientApp}><StackTheme>\";\n const insertClose = \"</StackTheme></StackProvider>\";\n\n layout =\n layout.slice(0, bodyCloseStartIndex) +\n insertClose +\n layout.slice(bodyCloseStartIndex);\n layout =\n layout.slice(0, bodyOpenEndIndex) +\n insertOpen +\n layout.slice(bodyOpenEndIndex);\n\n return {\n content: `${layout}`,\n indentation,\n };\n}\n\nfunction guessIndentation(str: string): string {\n const lines = str.split(\"\\n\");\n const linesLeadingWhitespaces = lines\n .map((line) => line.match(/^\\s*/)![0])\n .filter((ws) => ws.length > 0);\n const isMostlyTabs =\n linesLeadingWhitespaces.filter((ws) => ws.includes(\"\\t\")).length >=\n (linesLeadingWhitespaces.length * 2) / 3;\n if (isMostlyTabs) return \"\\t\";\n const linesLeadingWhitespacesCount = linesLeadingWhitespaces.map(\n (ws) => ws.length\n );\n const min = Math.min(Infinity, ...linesLeadingWhitespacesCount);\n return Number.isFinite(min) ? \" \".repeat(Math.max(2, min)) : \" \";\n}\n\nfunction getLineIndex(lines: string[], stringIndex: number): [number, number] {\n let lineIndex = 0;\n for (let l = 0; l < lines.length; l++) {\n const line = lines[l];\n if (stringIndex < lineIndex + line.length) {\n return [l, stringIndex - lineIndex];\n }\n lineIndex += line.length + 1;\n }\n throw new Error(\n `Index ${stringIndex} is out of bounds for lines ${JSON.stringify(lines)}`\n );\n}\n\nasync function getProjectPath(): Promise<string> {\n if (savedProjectPath === undefined) {\n savedProjectPath = process.cwd();\n\n const askForPathModification = !fs.existsSync(\n path.join(savedProjectPath, \"package.json\")\n );\n if (askForPathModification) {\n if (onQuestionMode === \"guess\" || onQuestionMode === \"error\") {\n throw new UserError(`No package.json file found in ${savedProjectPath}. Re-run providing the project path argument (e.g. 'init-stack <project-path>').`);\n }\n savedProjectPath = (\n await inquirer.prompt([\n {\n type: \"input\",\n name: \"newPath\",\n message: \"Please enter the path to your project:\",\n default: \".\",\n },\n ])\n ).newPath;\n }\n }\n return savedProjectPath as string;\n}\n\nasync function findJsExtension(fullPathWithoutExtension: string): Promise<string | null> {\n for (const ext of jsLikeFileExtensions) {\n const fullPath = fullPathWithoutExtension + \".\" + ext;\n if (fs.existsSync(fullPath)) {\n return ext;\n }\n }\n return null;\n}\n\nasync function promptPackageManager(): Promise<string> {\n const projectPath = await getProjectPath();\n const yarnLock = fs.existsSync(path.join(projectPath, \"yarn.lock\"));\n const pnpmLock = fs.existsSync(path.join(projectPath, \"pnpm-lock.yaml\"));\n const npmLock = fs.existsSync(path.join(projectPath, \"package-lock.json\"));\n const bunLock = fs.existsSync(path.join(projectPath, \"bun.lockb\")) || fs.existsSync(path.join(projectPath, \"bun.lock\"));\n\n if (yarnLock && !pnpmLock && !npmLock && !bunLock) {\n return \"yarn\";\n } else if (!yarnLock && pnpmLock && !npmLock && !bunLock) {\n return \"pnpm\";\n } else if (!yarnLock && !pnpmLock && npmLock && !bunLock) {\n return \"npm\";\n } else if (!yarnLock && !pnpmLock && !npmLock && bunLock) {\n return \"bun\";\n }\n\n if (onQuestionMode === \"guess\") return \"npm\";\n if (onQuestionMode === \"error\") {\n throw new UnansweredQuestionError(\"Unable to determine the package manager. Re-run with one of: --npm, --yarn, --pnpm, or --bun.\");\n }\n\n const answers = await inquirer.prompt([\n {\n type: \"list\",\n name: \"packageManager\",\n message: \"Which package manager are you using for this project?\",\n choices: [\"npm\", \"yarn\", \"pnpm\", \"bun\"],\n },\n ]);\n return answers.packageManager;\n}\n\ntype ShellOptions = {\n quiet?: boolean,\n shell?: boolean,\n cwd?: string,\n [key: string]: any,\n}\n\nasync function shellNicelyFormatted(command: string, { quiet, ...options }: ShellOptions): Promise<void> {\n let ui: any;\n let interval: NodeJS.Timeout | undefined;\n if (!quiet) {\n console.log();\n ui = new inquirer.ui.BottomBar();\n let dots = 4;\n ui.updateBottomBar(\n colorize.blue`Running command: ${command}...`\n );\n interval = setInterval(() => {\n if (!isDryRun) {\n ui.updateBottomBar(\n colorize.blue`Running command: ${command}${\".\".repeat(dots++ % 5)}`\n );\n }\n }, 700);\n }\n\n try {\n if (!isDryRun) {\n const child = child_process.spawn(command, options);\n if (!quiet) {\n child.stdout.pipe(ui.log);\n child.stderr.pipe(ui.log);\n }\n\n await new Promise<void>((resolve, reject) => {\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command ${command} failed with code ${code}`));\n }\n });\n });\n } else {\n console.log(`[DRY-RUN] Would have run: ${command}`);\n }\n\n if (!quiet) {\n commandsExecuted.push(command);\n ui.updateBottomBar(\n `${colorize.green`√`} Command ${command} succeeded\\n`\n );\n }\n } catch (e) {\n if (!quiet) {\n ui.updateBottomBar(\n `${colorize.red`X`} Command ${command} failed\\n`\n );\n }\n throw e;\n } finally {\n if (interval) {\n clearTimeout(interval);\n }\n if (!quiet) {\n ui.close();\n }\n }\n}\n\nasync function readFile(fullPath: string): Promise<string | null> {\n try {\n if (!isDryRun) {\n return fs.readFileSync(fullPath, \"utf-8\");\n }\n return null;\n } catch (err: any) {\n if (err.code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n}\n\nasync function writeFile(fullPath: string, content: string): Promise<void> {\n let create = !fs.existsSync(fullPath);\n if (!isDryRun) {\n fs.mkdirSync(path.dirname(fullPath), { recursive: true });\n fs.writeFileSync(fullPath, content);\n } else {\n console.log(`[DRY-RUN] Would have written to ${fullPath}`);\n }\n const relativeToProjectPath = path.relative(await getProjectPath(), fullPath);\n if (!create) {\n filesModified.push(relativeToProjectPath);\n } else {\n filesCreated.push(relativeToProjectPath);\n }\n}\n\nfunction laterWriteFile(fullPath: string, content: string): void {\n writeFileHandlers.push(async () => {\n await writeFile(fullPath, content);\n });\n}\n\nasync function writeFileIfNotExists(fullPath: string, content: string): Promise<void> {\n if (!fs.existsSync(fullPath)) {\n await writeFile(fullPath, content);\n }\n}\n\nfunction laterWriteFileIfNotExists(fullPath: string, content: string): void {\n writeFileHandlers.push(async () => {\n await writeFileIfNotExists(fullPath, content);\n });\n}\n\nfunction createConvexAuthConfigContent(options: { stackPackageName: string, type: \"js\" | \"next\" | \"react\" }): string {\n const envVarName = getPublicProjectEnvVarName(options.type);\n return `import { getConvexProvidersConfig } from ${JSON.stringify(options.stackPackageName)};\n\nexport default {\n providers: getConvexProvidersConfig({\n projectId: process.env.${envVarName},\n }),\n};\n`;\n}\n\nfunction createConvexIntegrationConvexConfigContent(stackPackageName: string): string {\n const importPath = `${stackPackageName}/convex.config`;\n return `import stackAuthComponent from ${JSON.stringify(importPath)};\nimport { defineApp } from \"convex/server\";\n\nconst app = defineApp();\napp.use(stackAuthComponent);\n\nexport default app;\n`;\n}\n\nfunction integrateConvexConfig(existingContent: string, stackPackageName: string): string | null {\n if (!existingContent.includes(\"defineApp\")) {\n return null;\n }\n\n const newline = existingContent.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const normalizedLines = existingContent.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const importPath = `${stackPackageName}/convex.config`;\n\n const hasImport = normalizedLines.some((line) => line.includes(importPath));\n if (!hasImport) {\n let insertIndex = 0;\n while (insertIndex < normalizedLines.length && normalizedLines[insertIndex].trim() === \"\") {\n insertIndex++;\n }\n while (insertIndex < normalizedLines.length && normalizedLines[insertIndex].trim().startsWith(\"import\")) {\n insertIndex++;\n }\n normalizedLines.splice(insertIndex, 0, `import stackAuthComponent from \"${importPath}\";`);\n }\n\n let lastImportIndex = -1;\n for (let i = 0; i < normalizedLines.length; i++) {\n if (normalizedLines[i].trim().startsWith(\"import\")) {\n lastImportIndex = i;\n continue;\n }\n if (normalizedLines[i].trim() === \"\") {\n continue;\n }\n break;\n }\n if (lastImportIndex >= 0) {\n const nextIndex = lastImportIndex + 1;\n if (!normalizedLines[nextIndex] || normalizedLines[nextIndex].trim() !== \"\") {\n normalizedLines.splice(nextIndex, 0, \"\");\n }\n }\n\n const hasStackUse = normalizedLines.some((line) => line.includes(\"app.use(stackAuthComponent\"));\n if (!hasStackUse) {\n const appLineIndex = normalizedLines.findIndex((line) => /const\\s+app\\s*=\\s*defineApp/.test(line));\n if (appLineIndex === -1) {\n return null;\n }\n const indent = normalizedLines[appLineIndex].match(/^\\s*/)?.[0] ?? \"\";\n const insertIndexForUse = appLineIndex + 1;\n normalizedLines.splice(insertIndexForUse, 0, `${indent}app.use(stackAuthComponent);`);\n const nextLineIndex = insertIndexForUse + 1;\n if (!normalizedLines[nextLineIndex] || normalizedLines[nextLineIndex].trim() !== \"\") {\n normalizedLines.splice(nextLineIndex, 0, \"\");\n }\n }\n\n let updated = normalizedLines.join(newline);\n if (!updated.endsWith(newline)) {\n updated += newline;\n }\n return updated;\n}\n\nfunction isSimpleConvexConfig(content: string): boolean {\n const normalized = content\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (normalized.length !== 3) {\n return false;\n }\n const [line1, line2, line3] = normalized;\n const importRegex = /^import\\s+\\{\\s*defineApp\\s*\\}\\s+from\\s+['\"]convex\\/server['\"];?$/;\n const appRegex = /^const\\s+app\\s*=\\s*defineApp\\(\\s*\\);?$/;\n const exportRegex = /^export\\s+default\\s+app;?$/;\n return importRegex.test(line1) && appRegex.test(line2) && exportRegex.test(line3);\n}\n\nfunction getPublicProjectEnvVarName(type: \"js\" | \"next\" | \"react\"): string {\n if (type === \"react\") {\n return \"VITE_PUBLIC_STACK_PROJECT_ID\";\n }\n if (type === \"next\") {\n return \"NEXT_PUBLIC_STACK_PROJECT_ID\";\n }\n return \"STACK_PROJECT_ID\";\n}\n\ntype ConvexClientUpdateResult = {\n updatedFiles: string[],\n skippedFiles: string[],\n};\n\ntype AddSetAuthResult = {\n updatedContent: string,\n changed: boolean,\n usedClientApp: boolean,\n usedServerApp: boolean,\n instantiationCount: number,\n skippedHttpCount: number,\n};\n\nasync function updateConvexClients({ projectPath, type }: { projectPath: string, type: \"js\" | \"next\" | \"react\" }): Promise<ConvexClientUpdateResult> {\n const files = collectConvexClientCandidateFiles(projectPath);\n const updatedFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n for (const filePath of files) {\n const fileContent = await readFile(filePath);\n if (!fileContent) continue;\n if (!/new\\s+Convex(?:React|Http)?Client\\b/.test(fileContent)) continue;\n\n const addResult = addSetAuthToConvexClients(fileContent, type);\n if (!addResult.changed) {\n if (addResult.instantiationCount > 0 && addResult.skippedHttpCount > 0) {\n skippedFiles.push(filePath);\n }\n continue;\n }\n\n let finalContent = addResult.updatedContent;\n if (addResult.usedClientApp) {\n finalContent = await ensureStackAppImport(finalContent, filePath, \"client\");\n }\n if (addResult.usedServerApp) {\n finalContent = await ensureStackAppImport(finalContent, filePath, \"server\");\n }\n\n if (finalContent !== fileContent) {\n laterWriteFile(filePath, finalContent);\n updatedFiles.push(filePath);\n }\n }\n\n return {\n updatedFiles,\n skippedFiles,\n };\n}\n\ntype StackAppKind = \"client\" | \"server\";\n\nasync function ensureStackAppImport(content: string, filePath: string, kind: StackAppKind): Promise<string> {\n const identifier = kind === \"client\" ? \"stackClientApp\" : \"stackServerApp\";\n if (new RegExp(`import\\\\s+[^;]*\\\\b${identifier}\\\\b`).test(content)) {\n return content;\n }\n\n const stackBasePath = await getStackAppBasePath(kind);\n const relativeImportPath = convertToModuleSpecifier(path.relative(path.dirname(filePath), stackBasePath));\n const newline = content.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n\n const lines = content.split(/\\r?\\n/);\n const importLine = `import { ${identifier} } from \"${relativeImportPath}\";`;\n\n let insertIndex = 0;\n while (insertIndex < lines.length) {\n const line = lines[insertIndex];\n if (/^\\s*['\"]use (client|server)['\"];?\\s*$/.test(line)) {\n insertIndex += 1;\n continue;\n }\n if (/^\\s*import\\b/.test(line)) {\n insertIndex += 1;\n continue;\n }\n if (line.trim() === \"\") {\n insertIndex += 1;\n continue;\n }\n break;\n }\n\n lines.splice(insertIndex, 0, importLine);\n const nextLine = lines[insertIndex + 1];\n if (nextLine && nextLine.trim() !== \"\" && !/^\\s*import\\b/.test(nextLine)) {\n lines.splice(insertIndex + 1, 0, \"\");\n }\n\n return lines.join(newline);\n}\n\nfunction convertToModuleSpecifier(relativePath: string): string {\n let specifier = relativePath.replace(/\\\\/g, \"/\");\n if (!specifier.startsWith(\".\")) {\n specifier = \"./\" + specifier;\n }\n return specifier;\n}\n\nasync function getStackAppBasePath(kind: StackAppKind): Promise<string> {\n const srcPath = await Steps.guessSrcPath();\n return path.join(srcPath, \"stack\", kind);\n}\n\nfunction addSetAuthToConvexClients(content: string, type: \"js\" | \"next\" | \"react\"): AddSetAuthResult {\n const newline = content.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const instantiationRegex = /^[ \\t]*(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*new\\s+(Convex(?:React|Http)?Client)\\b([\\s\\S]*?);/gm;\n const replacements: Array<{ start: number, end: number, text: string }> = [];\n let instantiationCount = 0;\n let skippedHttpCount = 0;\n let usedClientApp = false;\n let usedServerApp = false;\n\n let match: RegExpExecArray | null;\n while ((match = instantiationRegex.exec(content)) !== null) {\n instantiationCount += 1;\n const fullMatch = match[0];\n const variableName = match[1];\n const className = match[2];\n\n if (className === \"ConvexHttpClient\") {\n skippedHttpCount += 1;\n continue;\n }\n\n const remainder = content.slice(match.index + fullMatch.length);\n const setAuthRegex = new RegExp(`\\\\b${escapeRegExp(variableName)}\\\\s*\\\\.setAuth\\\\s*\\\\(`);\n if (setAuthRegex.test(remainder)) {\n continue;\n }\n\n const indentation = fullMatch.match(/^[\\t ]*/)?.[0] ?? \"\";\n const authCall = determineAuthCallExpression({ type, className, content });\n\n if (authCall.identifier === \"stackClientApp\") {\n usedClientApp = true;\n } else {\n usedServerApp = true;\n }\n\n const replacementText = `${fullMatch}${newline}${indentation}${variableName}.setAuth(${authCall.expression});`;\n replacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n text: replacementText,\n });\n }\n\n if (replacements.length === 0) {\n return {\n updatedContent: content,\n changed: false,\n usedClientApp,\n usedServerApp,\n instantiationCount,\n skippedHttpCount,\n };\n }\n\n let updatedContent = content;\n for (let i = replacements.length - 1; i >= 0; i--) {\n const replacement = replacements[i];\n updatedContent = `${updatedContent.slice(0, replacement.start)}${replacement.text}${updatedContent.slice(replacement.end)}`;\n }\n\n return {\n updatedContent,\n changed: true,\n usedClientApp,\n usedServerApp,\n instantiationCount,\n skippedHttpCount,\n };\n}\n\nfunction determineAuthCallExpression({ type, className, content }: { type: \"js\" | \"next\" | \"react\", className: string, content: string }): { expression: string, identifier: \"stackClientApp\" | \"stackServerApp\" } {\n const hasClientAppReference = /\\bstackClientApp\\b/.test(content);\n const hasServerAppReference = /\\bstackServerApp\\b/.test(content);\n\n if (type === \"js\") {\n return { expression: \"stackServerApp.getConvexClientAuth({})\", identifier: \"stackServerApp\" };\n }\n\n if (hasClientAppReference) {\n return { expression: getClientAuthCall(type), identifier: \"stackClientApp\" };\n }\n if (hasServerAppReference && className !== \"ConvexReactClient\") {\n return { expression: \"stackServerApp.getConvexClientAuth({})\", identifier: \"stackServerApp\" };\n }\n\n return { expression: getClientAuthCall(type), identifier: \"stackClientApp\" };\n}\n\nfunction getClientAuthCall(type: \"js\" | \"next\" | \"react\"): string {\n return \"stackClientApp.getConvexClientAuth({})\";\n}\n\nfunction collectConvexClientCandidateFiles(projectPath: string): string[] {\n const roots = getConvexSearchRoots(projectPath);\n const files = new Set<string>();\n const visited = new Set<string>();\n\n for (const root of roots) {\n walkDirectory(root, files, visited);\n }\n\n return Array.from(files);\n}\n\nfunction getConvexSearchRoots(projectPath: string): string[] {\n const candidateDirs = [\"convex\", \"src\", \"app\", \"components\"];\n const existing = candidateDirs\n .map((dir) => path.join(projectPath, dir))\n .filter((dirPath) => {\n try {\n return fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n } catch {\n return false;\n }\n });\n if (existing.length > 0) {\n return existing;\n }\n return [projectPath];\n}\n\nconst directorySkipList = new Set([\n \"node_modules\",\n \".git\",\n \".next\",\n \".turbo\",\n \".output\",\n \".vercel\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".cache\",\n \".storybook\",\n \"storybook-static\",\n]);\n\nfunction walkDirectory(currentDir: string, files: Set<string>, visited: Set<string>): void {\n const realPath = (() => {\n try {\n return fs.realpathSync(currentDir);\n } catch {\n return currentDir;\n }\n })();\n\n if (visited.has(realPath)) return;\n visited.add(realPath);\n\n let dirEntries: fs.Dirent[];\n try {\n dirEntries = fs.readdirSync(realPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of dirEntries) {\n const entryName = entry.name;\n if (entry.isDirectory()) {\n if (directorySkipList.has(entryName)) continue;\n if (entryName.startsWith(\".\") || entryName.startsWith(\"_\")) continue;\n walkDirectory(path.join(realPath, entryName), files, visited);\n continue;\n }\n if (!entry.isFile()) continue;\n if (entryName.endsWith(\".d.ts\")) continue;\n if (!hasJsLikeExtension(entryName)) continue;\n files.add(path.join(realPath, entryName));\n }\n}\n\nfunction hasJsLikeExtension(fileName: string): boolean {\n return jsLikeFileExtensions.some((ext) => fileName.endsWith(`.${ext}`));\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction throwErr(message: string): never {\n throw new Error(message);\n}\n\n// TODO import this function from stack-shared instead (but that would require us to fix the build to let us import it)\nexport function templateIdentity(strings: TemplateStringsArray, ...values: any[]): string {\n if (strings.length === 0) return \"\";\n if (values.length !== strings.length - 1) throw new Error(\"Invalid number of values; must be one less than strings\");\n\n return strings.slice(1).reduce((result, string, i) => `${result}${values[i] ?? \"n/a\"}${string}`, strings[0]);\n}\n\nasync function clearStdin(): Promise<void> {\n await new Promise<void>((resolve) => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n process.stdin.removeAllListeners('data');\n\n const flush = () => {\n while (process.stdin.read() !== null) { }\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n resolve();\n };\n\n // Add a small delay to allow any buffered input to clear\n setTimeout(flush, 10);\n });\n}\n","{\n \"name\": \"@stackframe/init-stack\",\n \"version\": \"2.8.44\",\n \"description\": \"The setup wizard for Stack. https://stack-auth.com\",\n \"main\": \"dist/index.js\",\n \"type\": \"module\",\n \"bin\": \"./dist/index.js\",\n \"scripts\": {\n \"clean\": \"rimraf test-run-output && rimraf node_modules && rimraf dist\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint --ext .tsx,.ts .\",\n \"typecheck\": \"tsc --noEmit\",\n \"init-stack\": \"node dist/index.js\",\n \"init-stack:local\": \"STACK_NEXT_INSTALL_PACKAGE_NAME_OVERRIDE=../../stack STACK_JS_INSTALL_PACKAGE_NAME_OVERRIDE=../../js STACK_REACT_INSTALL_PACKAGE_NAME_OVERRIDE=../../react node dist/index.js\",\n \"test-run\": \"pnpm run build && pnpm run test-run-js && pnpm run test-run-node && pnpm run test-run-next && pnpm run test-run-neon && pnpm run test-run-no-browser\",\n \"test-run:manual\": \"pnpm run build && pnpm run test-run-js:manual && pnpm run test-run-node:manual && pnpm run test-run-next:manual && pnpm run test-run-neon:manual\",\n \"ensure-neon\": \"grep -q '\\\"@neondatabase/serverless\\\"' ./test-run-output/package.json && echo 'Initialized Neon successfully!'\",\n \"test-run-neon\": \"pnpm run test-run-node --neon && pnpm run ensure-neon\",\n \"test-run-neon:manual\": \"pnpm run test-run-node:manual --neon && pnpm run ensure-neon\",\n \"test-run-no-browser\": \"rimraf test-run-output && mkdir test-run-output && cd test-run-output && npm init --init-author-name example-author --init-license UNLICENSED --init-author-url http://example.com --init-module test-run-output --init-version 1.0.0 -y && cd .. && pnpm run init-stack:local test-run-output --on-question error --js --server --npm --no-browser\",\n \"test-run-node:manual\": \"rimraf test-run-output && mkdir test-run-output && cd test-run-output && npm init && cd .. && pnpm run init-stack:local test-run-output\",\n \"test-run-node\": \"rimraf test-run-output && mkdir test-run-output && cd test-run-output && npm init --init-author-name example-author --init-license UNLICENSED --init-author-url http://example.com --init-module test-run-output --init-version 1.0.0 -y && cd .. && pnpm run init-stack:local test-run-output --on-question error --js --server --npm --no-browser\",\n \"test-run-js:manual\": \"rimraf test-run-output && npx -y sv create test-run-output --no-install && pnpm run init-stack:local test-run-output\",\n \"test-run-js\": \"rimraf test-run-output && npx -y sv create test-run-output --template minimal --types ts --no-add-ons --no-install && pnpm run init-stack:local test-run-output --on-question error --js --client --npm --no-browser\",\n \"test-run-next:manual\": \"rimraf test-run-output && npx -y create-next-app@latest test-run-output && pnpm run init-stack:local test-run-output\",\n \"test-run-next\": \"rimraf test-run-output && npx -y create-next-app@latest test-run-output --app --ts --no-src-dir --tailwind --use-npm --eslint --import-alias '##@#/*' --turbopack && pnpm run init-stack:local test-run-output --on-question error --no-browser\",\n \"test-run-keys-next\": \"rimraf test-run-output && npx -y create-next-app@latest test-run-output --app --ts --no-src-dir --tailwind --use-npm --eslint --import-alias '##@#/*' --turbopack && pnpm run init-stack:local test-run-output --on-question error --project-id my-project-id --publishable-client-key my-publishable-client-key\",\n \"test-run-keys-js\": \"rimraf test-run-output && npx -y sv create test-run-output --template minimal --types ts --no-add-ons --no-install && pnpm run init-stack:local test-run-output --on-question error --js --client --npm --project-id my-project-id --publishable-client-key my-publishable-client-key\",\n \"test-run-react\": \"rimraf test-run-output && npx -y create-vite@latest test-run-output --template react-ts && pnpm run init-stack:local test-run-output --on-question error --no-browser --npm\",\n \"test-run-react:manual\": \"rimraf test-run-output && npx -y create-vite@latest test-run-output --template react-ts && pnpm run init-stack:local test-run-output --react\"\n },\n \"files\": [\n \"README.md\",\n \"dist\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"homepage\": \"https://stack-auth.com\",\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@stackframe/stack-shared\": \"workspace:*\",\n \"commander\": \"^13.1.0\",\n \"inquirer\": \"^9.2.19\",\n \"open\": \"^10.1.0\",\n \"posthog-node\": \"^4.1.0\"\n },\n \"devDependencies\": {\n \"@types/inquirer\": \"^9.0.7\",\n \"@types/node\": \"20.17.6\",\n \"rimraf\": \"^6.0.1\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"5.3.3\"\n }\n}\n"],"mappings":"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","names":["options"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stackframe/init-stack",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.44",
|
|
4
4
|
"description": "The setup wizard for Stack. https://stack-auth.com",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"inquirer": "^9.2.19",
|
|
21
21
|
"open": "^10.1.0",
|
|
22
22
|
"posthog-node": "^4.1.0",
|
|
23
|
-
"@stackframe/stack-shared": "2.8.
|
|
23
|
+
"@stackframe/stack-shared": "2.8.44"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/inquirer": "^9.0.7",
|