@moneydevkit/create 0.3.3 → 0.4.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -9
- package/dist/index.cjs +16 -181
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +15 -181
- package/dist/index.js.map +1 -1
- package/dist/templates/nextjs/app/api/mdk/route.js +1 -0
- package/dist/templates/nextjs/app/api/mdk/route.ts +1 -0
- package/dist/templates/nextjs/app/checkout/[id]/page.js +8 -0
- package/dist/templates/nextjs/app/checkout/[id]/page.tsx +8 -0
- package/dist/templates/readme-sync.test.ts +56 -0
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/env-target.ts","../src/utils/nextjs-detector.ts","../src/scaffold/nextjs.ts","../src/utils/package-manager.ts","../src/utils/fs-utils.ts"],"sourcesContent":["import { createORPCClient } from \"@orpc/client\";\nimport { RPCLink } from \"@orpc/client/fetch\";\nimport * as p from \"@clack/prompts\";\nimport minimist from \"minimist\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport open from \"open\";\nimport clipboard from \"clipboardy\";\nimport setCookieParser, { Cookie } from \"set-cookie-parser\";\nimport { generateMnemonic as generateBip39Mnemonic } from \"bip39\";\nimport { contract } from \"@moneydevkit/api-contract\";\nimport type { ContractRouterClient } from \"@orpc/contract\";\nimport type {\n\tBootstrapOnboardingResponse,\n\tStartDeviceAuthResponse,\n} from \"@moneydevkit/api-contract\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { deriveProjectName, resolveEnvTarget } from \"./utils/env-target.js\";\nimport { detectNextJsProject } from \"./utils/nextjs-detector.js\";\nimport { scaffoldNextJs } from \"./scaffold/nextjs.js\";\n\ntype Flags = {\n\tjson: boolean;\n\tnoClipboard: boolean;\n\tnoOpen: boolean;\n\tscaffoldNextjs?: boolean;\n\tbaseUrl?: string;\n\tenvFile?: string;\n\tprojectName?: string;\n\tmanualLogin?: string;\n\tforceNewWebhook?: boolean;\n\twebhookUrl?: string;\n};\n\nconst DEFAULT_BASE_URL = \"https://moneydevkit.com\";\nconst DEFAULT_ENV_FILE = \".env.local\";\n\nclass CookieJar {\n\tprivate store = new Map<string, string>();\n\n\tconstructor(initial?: string) {\n\t\tif (initial) {\n\t\t\tthis.add(initial);\n\t\t}\n\t}\n\n\tadd(input: string | string[]) {\n\t\tconst cookies = Array.isArray(input) ? input : [input];\n\t\tfor (const line of cookies) {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (!trimmed) continue;\n\t\t\tconst parsed = setCookieParser.parse(trimmed);\n\t\t\tconst handle = (cookie: Cookie) => {\n\t\t\t\tif (cookie?.name && cookie.value !== undefined) {\n\t\t\t\t\tthis.store.set(cookie.name, cookie.value);\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (Array.isArray(parsed)) {\n\t\t\t\tfor (const cookie of parsed) {\n\t\t\t\t\thandle(cookie);\n\t\t\t\t}\n\t\t\t} else if (parsed && typeof parsed === \"object\") {\n\t\t\t\thandle(parsed);\n\t\t\t}\n\t\t}\n\t}\n\n\theader(): string | undefined {\n\t\tif (this.store.size === 0) return undefined;\n\t\treturn Array.from(this.store.entries())\n\t\t\t.map(([name, value]) => `${name}=${value}`)\n\t\t\t.join(\"; \");\n\t}\n}\n\nfunction parseFlags(argv: string[]): Flags {\n\tconst result = minimist(argv, {\n\t\tboolean: [\"json\", \"no-clipboard\", \"no-open\", \"force-new-webhook\", \"scaffold-nextjs\"],\n\t\tstring: [\n\t\t\t\"base-url\",\n\t\t\t\"env-target\",\n\t\t\t\"project-name\",\n\t\t\t\"manual-login\",\n\t\t\t\"webhook-url\",\n\t\t],\n\t\talias: {\n\t\t\tjson: \"j\",\n\t\t},\n\t\tdefault: {\n\t\t\t\"no-clipboard\": false,\n\t\t\t\"no-open\": false,\n\t\t\tjson: false,\n\t\t\t\"force-new-webhook\": false,\n\t\t\t\"scaffold-nextjs\": false,\n\t\t},\n\t});\n\nreturn {\n\tjson: Boolean(result.json),\n\tnoClipboard: Boolean(result[\"no-clipboard\"]),\n\tnoOpen: Boolean(result[\"no-open\"]),\n\tscaffoldNextjs: Boolean(result[\"scaffold-nextjs\"]),\n\tbaseUrl: result[\"base-url\"],\n\tenvFile: result[\"env-target\"],\n\t\tprojectName:\n\t\t\ttypeof result[\"project-name\"] === \"string\"\n\t\t\t\t? result[\"project-name\"]\n\t\t\t\t: undefined,\n\t\tmanualLogin:\n\t\t\ttypeof result[\"manual-login\"] === \"string\"\n\t\t\t\t? result[\"manual-login\"]\n\t\t\t\t: undefined,\n\t\tforceNewWebhook: Boolean(result[\"force-new-webhook\"]),\n\t\twebhookUrl:\n\t\t\ttypeof result[\"webhook-url\"] === \"string\"\n\t\t\t\t? result[\"webhook-url\"]\n\t\t\t\t: undefined,\n\t};\n}\n\nfunction normalizeDirectory(dir: string): string {\n\tif (path.isAbsolute(dir)) return dir;\n\treturn path.resolve(process.cwd(), dir);\n}\n\nfunction ensureDirectoryExists(dir: string) {\n\tif (!fs.existsSync(dir)) {\n\t\tfs.mkdirSync(dir, { recursive: true });\n\t}\n}\n\nfunction readEnvFile(filePath: string): Map<string, string> {\n\tconst env = new Map<string, string>();\n\tif (!fs.existsSync(filePath)) {\n\t\treturn env;\n\t}\n\tconst contents = fs.readFileSync(filePath, \"utf8\");\n\tfor (const line of contents.split(/\\r?\\n/)) {\n\t\tif (!line || line.startsWith(\"#\")) continue;\n\t\tconst [key, ...rest] = line.split(\"=\");\n\t\tif (!key) continue;\n\t\tenv.set(key.trim(), rest.join(\"=\").trim());\n\t}\n\treturn env;\n}\n\nfunction renderEnvPreview(\n\t_original: Map<string, string>,\n\tupdates: Record<string, string>,\n): string {\n\tconst lines: string[] = [\"Writing the following values:\", \"\"];\n\tfor (const [key, value] of Object.entries(updates)) {\n\t\tlines.push(` ${key}=${value}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction writeEnvFile(\n\tfilePath: string,\n\texisting: Map<string, string>,\n\tupdates: Record<string, string>,\n) {\n\tfor (const [key, value] of Object.entries(updates)) {\n\t\texisting.set(key, value);\n\t}\n\tconst content =\n\t\tArray.from(existing.entries())\n\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t.map(([key, value]) => `${key}=${value}`)\n\t\t\t.join(os.EOL) + os.EOL;\n\tfs.writeFileSync(filePath, content, \"utf8\");\n}\n\nfunction ensureEnvFileExists(filePath: string) {\n\tconst dir = path.dirname(filePath);\n\tensureDirectoryExists(dir);\n\tif (!fs.existsSync(filePath)) {\n\t\tfs.writeFileSync(filePath, \"\", \"utf8\");\n\t}\n}\n\nfunction resolveLocalEnvPath(options: {\n\torganizationId?: string;\n\tapiKeyId?: string;\n}): string | undefined {\n\tconst organization = options.organizationId?.trim();\n\tconst apiKey = options.apiKeyId?.trim();\n\tif (!organization || !apiKey) {\n\t\treturn undefined;\n\t}\n\tconst homeDir = os.homedir();\n\treturn path.join(homeDir, \".mdk\", organization, apiKey, \".env\");\n}\n\nfunction isValidHttpUrl(value?: string): boolean {\n\tif (!value) return false;\n\ttry {\n\t\tconst parsed = new URL(value);\n\t\treturn parsed.protocol === \"https:\" || parsed.protocol === \"http:\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction createRpcClient(\n\tbaseUrl: string,\n\tjar: CookieJar,\n): ContractRouterClient<typeof contract> {\n\tconst link = new RPCLink({\n\t\turl: `${baseUrl.replace(/\\/$/, \"\")}/rpc`,\n\t\theaders: () => {\n\t\t\tconst cookieHeader = jar.header();\n\t\t\treturn cookieHeader ? { Cookie: cookieHeader } : {};\n\t\t},\n\t\tfetch: async (input, init) => {\n\t\t\tconst response = await fetch(input, init);\n\t\t\tconst setCookie = response.headers.getSetCookie?.() ?? [];\n\t\t\tif (setCookie.length > 0) {\n\t\t\t\tjar.add(setCookie);\n\t\t\t}\n\t\t\treturn response;\n\t\t},\n\t});\n\n\treturn createORPCClient(link) as ContractRouterClient<typeof contract>;\n}\n\nasync function runDeviceFlow(options: {\n\tflags: Flags;\n\tbaseUrl: string;\n\tcookies: CookieJar;\n\tprojectName?: string;\n\twebhookUrl: string;\n}): Promise<{\n\tdevice: StartDeviceAuthResponse;\n\tbootstrapToken: string;\n\tcredentials: BootstrapOnboardingResponse;\n\tmnemonic: string;\n}> {\n\tconst client = createRpcClient(options.baseUrl, options.cookies);\nconst manualSessionCookie = options.flags.manualLogin;\nconst webhookUrl = options.webhookUrl;\n\nconst device = await client.onboarding.startDeviceAuth({\n clientDisplayName: options.projectName,\n webhookUrl,\n forceNewWebhook: options.flags.forceNewWebhook,\n});\n\n\tif (manualSessionCookie) {\n\t\tconst response = await fetch(\n\t\t\t`${options.baseUrl.replace(/\\/$/, \"\")}/api/cli/device/authorize`,\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tCookie: manualSessionCookie,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tcode: device.userCode,\n\t\t\t\t\tforceNewWebhook: options.flags.forceNewWebhook ?? false,\n\t\t\t\t}),\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst body = (await response.json().catch(() => ({}))) as {\n\t\t\t\terror?: string;\n\t\t\t};\n\t\t\tthrow new Error(\n\t\t\t\tbody.error ??\n\t\t\t\t\t`Manual authorize failed with status ${response.status}`,\n\t\t\t);\n\t\t}\n\t} else {\n if (!options.flags.json) {\n p.note(\n [\n `Device code: ${device.userCode}`,\n `Webhook URL: ${webhookUrl}`,\n \"Open the authorization page, click Authorize, then return to this terminal.\",\n ].join(\"\\n\"),\n \"Authorize this device\",\n );\n }\n\n\t\tif (!options.flags.noOpen && !options.flags.json) {\n\t\t\ttry {\n\t\t\t\tawait open(device.verificationUri, { wait: false });\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Unable to open browser automatically (${(error as Error).message}).`,\n\t\t\t\t);\n\t\t\t\tconsole.warn(`Open this URL manually: ${device.verificationUri}`);\n\t\t\t}\n\t\t} else if (!options.flags.json) {\n\t\t\tconsole.log(`Open this URL in your browser: ${device.verificationUri}`);\n\t\t}\n\n\t\tconst spinner = options.flags.json ? null : p.spinner();\n\t\tspinner?.start(\"Waiting for authorization...\");\n\n\t\tconst deadline = Date.now() + device.expiresIn * 1000;\n\t\tlet bootstrapToken: string | undefined;\n\n\t\twhile (Date.now() < deadline) {\n\t\t\tconst poll = await client.onboarding.pollDeviceAuth({\n\t\t\t\tdeviceCode: device.deviceCode,\n\t\t\t});\n\n\t\t\tif (poll.status === \"authorized\") {\n\t\t\t\tbootstrapToken = poll.bootstrapToken;\n\t\t\t\tspinner?.stop(\"Device authorized.\");\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (poll.status === \"expired\") {\n\t\t\t\tspinner?.stop(\"Device code expired.\");\n\t\t\t\tthrow new Error(\"Device code expired before authorization.\");\n\t\t\t}\n\n\t\t\tif (poll.status === \"denied\") {\n\t\t\t\tspinner?.stop(\"Authorization denied.\");\n\t\t\t\tthrow new Error(\"Authorization was denied in the dashboard.\");\n\t\t\t}\n\n const secondsLeft = Math.max(\n 0,\n Math.floor((deadline - Date.now()) / 1000),\n );\n spinner?.message(\n `Waiting for authorization (${secondsLeft}s remaining)`,\n\t\t\t);\n\t\t\tawait delay(device.interval * 1000);\n\t\t}\n\n\t\tif (!bootstrapToken) {\n\t\t\tthrow new Error(\"Timed out waiting for authorization.\");\n\t\t}\n\n const credentials = await client.onboarding.bootstrap({\n bootstrapToken,\n projectName: options.projectName,\n webhookUrl,\n forceNewWebhook: options.flags.forceNewWebhook,\n\t\t});\n\n\t\tconst mnemonic = generateBip39Mnemonic(128);\n\n\t\treturn {\n\t\t\tdevice,\n\t\t\tbootstrapToken,\n\t\t\tcredentials,\n\t\t\tmnemonic,\n\t\t};\n\t}\n\n\t// Manual path: poll once to get the bootstrap token.\n\tconst pollResult = await client.onboarding.pollDeviceAuth({\n\t\tdeviceCode: device.deviceCode,\n\t});\n\n\tif (pollResult.status !== \"authorized\") {\n\t\tthrow new Error(\n\t\t\t`Unable to obtain bootstrap token (status: ${pollResult.status}).`,\n\t\t);\n\t}\n\n\tconst credentials = await client.onboarding.bootstrap({\n\t\tbootstrapToken: pollResult.bootstrapToken,\n\t\tprojectName: options.projectName,\n\t\twebhookUrl,\n\t\tforceNewWebhook: options.flags.forceNewWebhook,\n\t});\n\n\tconst mnemonic = generateBip39Mnemonic(128);\n\n\treturn {\n\t\tdevice,\n\t\tbootstrapToken: pollResult.bootstrapToken,\n\t\tcredentials,\n\t\tmnemonic,\n\t};\n}\n\nasync function main() {\n\tconst flags = parseFlags(process.argv.slice(2));\n\tconst jsonMode = flags.json;\n\n\tif (!jsonMode) {\n\t\tp.intro(\"Money Dev Kit – @moneydevkit/create\");\n\t}\n\n\tconst baseUrl = flags.baseUrl ?? DEFAULT_BASE_URL;\n\tconst cookies = new CookieJar(flags.manualLogin);\n\n\tconst envFileOverride = process.env.MDK_ENV_FILE;\n\tconst envResolution = resolveEnvTarget({\n\t\texplicitTarget: flags.envFile,\n\t\toverrideTarget: envFileOverride,\n\t\tcwd: process.cwd(),\n\t\tdefaultFilename: DEFAULT_ENV_FILE,\n\t});\n\tconst { providedExplicitly } = envResolution;\n\tlet projectDir = envResolution.projectDir;\n\tlet envFile = envResolution.envFile;\n\n\tif (!providedExplicitly && !jsonMode && !flags.envFile) {\n\t\tconst dirPrompt = await p.text({\n\t\t\tmessage: \"Where should we store your MDK credentials?\",\n\t\t\tinitialValue: projectDir,\n\t\t});\n\n\t\tif (p.isCancel(dirPrompt)) {\n\t\t\tp.cancel(\"Aborted.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tprojectDir = dirPrompt;\n\t}\n\n\tprojectDir = normalizeDirectory(projectDir);\n\tensureDirectoryExists(projectDir);\n\n\tif (!flags.envFile && !envFileOverride && !jsonMode) {\n\t\tconst envPrompt = await p.text({\n\t\t\tmessage: \"Env file to update\",\n\t\t\tinitialValue: envFile,\n\t\t});\n\n\t\tif (p.isCancel(envPrompt)) {\n\t\t\tp.cancel(\"Aborted.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tenvFile = envPrompt.trim() || DEFAULT_ENV_FILE;\n\t}\n\n\tconst envPath = path.join(projectDir, envFile);\n\tconst existingEnvValues = readEnvFile(envPath);\n\tconst mnemonicAlreadySet = existingEnvValues.get(\"MDK_MNEMONIC\")?.trim();\n\n\tif (mnemonicAlreadySet) {\n\t\tconst warningMessage =\n\t\t\t\"We found MDK_MNEMONIC already set in your project. Your mnemonic is the key to your wallet. If you've already deployed and taken payments with this mnemonic and change it, you will lose access to your funds. If you want to generate a new mnemonic, delete MDK_MNEMONIC from your .env and try again.\";\n\n\t\tif (jsonMode) {\n\t\t\tconsole.error(\n\t\t\t\tJSON.stringify(\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\terror: { message: warningMessage },\n\t\t\t\t\t},\n\t\t\t\t\tnull,\n\t\t\t\t\t2,\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tp.cancel(warningMessage);\n\t\t}\n\n\t\tprocess.exit(1);\n\t}\n\n\tlet webhookUrl = flags.webhookUrl?.trim();\n\tif ((!webhookUrl || !isValidHttpUrl(webhookUrl)) && jsonMode) {\n\t\tthrow new Error(\"Provide a valid --webhook-url when running in --json mode.\");\n\t}\n\n\twhile (!webhookUrl) {\n\t\tconst webhookInput = await p.text({\n\t\t\tmessage: \"Webhook URL for your application\",\n\t\t\tinitialValue: \"https://\",\n\t\t\tplaceholder: \"https://yourapp.com\",\n\t\t\tvalidate: (value) =>\n\t\t\t\tisValidHttpUrl(value?.trim())\n\t\t\t\t\t? undefined\n\t\t\t\t\t: \"Enter a valid http(s) URL (e.g. https://yourapp.com)\",\n\t\t});\n\n\t\tif (p.isCancel(webhookInput)) {\n\t\t\tp.cancel(\"Aborted.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\twebhookUrl = webhookInput.trim();\n\t}\n\n\tlet projectName = flags.projectName?.trim();\n\tif (!projectName && !jsonMode) {\n\t\tconst namePrompt = await p.text({\n\t\t\tmessage: \"Project name (used for the generated API key)\",\n\t\t\tplaceholder: \"Optional: e.g. My Next.js Store\",\n\t\t});\n\t\tif (p.isCancel(namePrompt)) {\n\t\t\tp.cancel(\"Aborted.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tprojectName = namePrompt.trim() || undefined;\n\t}\n\n\tprojectName = deriveProjectName(projectName, webhookUrl);\n\n\tconst nextJsDetection = detectNextJsProject(projectDir);\n\tlet shouldScaffoldNextJs = false;\n\n\tif (flags.scaffoldNextjs) {\n\t\tif (nextJsDetection.found) {\n\t\t\tif (nextJsDetection.versionIsSupported) {\n\t\t\t\tshouldScaffoldNextJs = true;\n\t\t\t} else {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Next.js version ${nextJsDetection.nextVersion ?? \"unknown\"} detected, but @moneydevkit/nextjs requires Next.js 15+. Skipping installation and scaffolding.`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn(\n\t\t\t\t\"No NextJS app found, skipping @moneydevkit/nextjs installation. Please install manually.\",\n\t\t\t);\n\t\t}\n\t} else if (!jsonMode && nextJsDetection.found) {\n\t\tif (!nextJsDetection.versionIsSupported) {\n\t\t\tconsole.warn(\n\t\t\t\t`Next.js version ${nextJsDetection.nextVersion ?? \"unknown\"} detected, but @moneydevkit/nextjs requires Next.js 15+. Skipping scaffolding prompt.`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst scaffoldPrompt = await p.confirm({\n\t\t\t\tmessage: `Next.js application detected at ${\n\t\t\t\t\tnextJsDetection.rootDir ?? projectDir\n\t\t\t\t} (version ${nextJsDetection.nextVersion ?? \"unknown\"}). Install and scaffold @moneydevkit/nextjs?`,\n\t\t\t\tinitialValue: true,\n\t\t\t});\n\n\t\t\tif (p.isCancel(scaffoldPrompt)) {\n\t\t\t\tp.cancel(\"Aborted.\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tshouldScaffoldNextJs = Boolean(scaffoldPrompt);\n\t\t}\n\t}\n\n\ttry {\n\t\tconst result = await runDeviceFlow({\n\t\t\tflags,\n\t\t\tbaseUrl,\n\t\t\tcookies,\n\t\t\tprojectName,\n\t\t\twebhookUrl,\n\t\t});\n\n\t\tconst updates: Record<string, string> = {\n\t\t\tMDK_ACCESS_TOKEN: result.credentials.apiKey,\n\t\t\tMDK_WEBHOOK_SECRET: result.credentials.webhookSecret,\n\t\t\tMDK_MNEMONIC: result.mnemonic,\n\t\t};\n\n\t\tensureEnvFileExists(envPath);\n\t\tconst existingEnv = readEnvFile(envPath);\n\t\tconst preview = renderEnvPreview(existingEnv, updates);\n\n\t\twriteEnvFile(envPath, existingEnv, updates);\n\n\t\tconst localEnvPath = resolveLocalEnvPath({\n\t\t\torganizationId: result.credentials.organizationId,\n\t\t\tapiKeyId: result.credentials.apiKeyId,\n\t\t});\n\t\tif (localEnvPath) {\n\t\t\tensureEnvFileExists(localEnvPath);\n\t\t\tconst localEnv = readEnvFile(localEnvPath);\n\t\t\twriteEnvFile(localEnvPath, localEnv, updates);\n\t\t}\n\n\t\tif (!jsonMode) {\n\t\t\tp.note(preview, \"Env file updated\");\n\t\t}\n\n if (!flags.noClipboard) {\n await clipboard.write(\n\t\t\t\t[`MDK_ACCESS_TOKEN=${updates.MDK_ACCESS_TOKEN}`, `MDK_WEBHOOK_SECRET=${updates.MDK_WEBHOOK_SECRET}`, `MDK_MNEMONIC=${updates.MDK_MNEMONIC}`].join(\n\t\t\t\t\t\"\\n\",\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tlet scaffoldSummary: Awaited<ReturnType<typeof scaffoldNextJs>> | null =\n\t\t\tnull;\n\n\t\tif (shouldScaffoldNextJs && nextJsDetection.found) {\n\t\t\ttry {\n\t\t\t\tscaffoldSummary = await scaffoldNextJs({\n\t\t\t\t\tdetection: nextJsDetection,\n\t\t\t\t\tjsonMode,\n\t\t\t\t});\n\n\t\t\t\tif (!jsonMode && scaffoldSummary) {\n\t\t\t\t\tconst lines = [\n\t\t\t\t\t\tscaffoldSummary.installedPackage\n\t\t\t\t\t\t\t? `Installed @moneydevkit/nextjs with ${scaffoldSummary.packageManager}.`\n\t\t\t\t\t\t\t: scaffoldSummary.installSkipped\n\t\t\t\t\t\t\t\t? \"@moneydevkit/nextjs already installed; skipped package install.\"\n\t\t\t\t\t\t\t\t: \"Skipped @moneydevkit/nextjs installation.\",\n\t\t\t\t\t];\n\n\t\t\t\t\t\tif (scaffoldSummary.config) {\n\t\t\t\t\t\t\tconst cfg = scaffoldSummary.config;\n\t\t\t\t\t\t\tif (cfg.status === \"created\") {\n\t\t\t\t\t\t\t\tlines.push(`Created ${cfg.path} with withMdkCheckout().`);\n\t\t\t\t\t\t\t\tif (cfg.backupPath) {\n\t\t\t\t\t\t\t\t\tlines.push(`Created backup at ${cfg.backupPath}.`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (cfg.status === \"updated\") {\n\t\t\t\t\t\t\t\tlines.push(`Updated ${cfg.path} with withMdkCheckout().`);\n\t\t\t\t\t\t\t\tif (cfg.backupPath) {\n\t\t\t\t\t\t\t\t\tlines.push(`Created backup at ${cfg.backupPath}.`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t\t\t`Could not update ${cfg.path} automatically (${cfg.reason ?? \"unknown reason\"}).`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\tif (scaffoldSummary.addedFiles.length > 0) {\n\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t`Added: ${scaffoldSummary.addedFiles\n\t\t\t\t\t\t\t\t.map((p) => path.relative(projectDir, p))\n\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (scaffoldSummary.skippedFiles.length > 0) {\n\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t`Skipped existing files: ${scaffoldSummary.skippedFiles\n\t\t\t\t\t\t\t\t.map((p) => path.relative(projectDir, p))\n\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tp.note(lines.join(\"\\n\"), \"Next.js scaffolding\");\n\t\t\t\t}\n\n\t\t\t\tif (scaffoldSummary?.warnings.length) {\n\t\t\t\t\tfor (const warning of scaffoldSummary.warnings) {\n\t\t\t\t\t\tconsole.warn(warning);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst message =\n\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\tif (jsonMode) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\t\t\tmessage: `Next.js scaffolding failed: ${message}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(`Next.js scaffolding failed: ${message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst summary = {\n\t\t\tprojectDir,\n\t\t\tenvFile: envPath,\n\t\t\tapiKeyPreview: result.credentials.apiKeyPreview,\n\t\t\twebhookId: result.credentials.webhookId,\n\t\t\torganizationId: result.credentials.organizationId,\n\t\t\twebhookUrl: result.credentials.webhookUrl,\n\t\t\tmnemonic: updates.MDK_MNEMONIC,\n\t\t\tscaffoldedNextjs: Boolean(scaffoldSummary),\n\t\t};\n\n if (jsonMode) {\n console.log(\n JSON.stringify(\n {\n status: \"success\",\n data: {\n\t\t\t\t\t\t\tenvFile: envPath,\n\t\t\t\t\t\t\tapiKeyId: result.credentials.apiKeyId,\n\t\t\t\t\t\t\tapiKeyPreview: result.credentials.apiKeyPreview,\n\t\t\t\t\t\t\twebhookId: result.credentials.webhookId,\n\t\t\t\t\t\t\twebhookSecret: result.credentials.webhookSecret,\n\t\t\t\t\t\t\twebhookUrl: result.credentials.webhookUrl,\n\t\t\t\t\t\t\torganizationId: result.credentials.organizationId,\n\t\t\t\t\t\t\tmnemonic: updates.MDK_MNEMONIC,\n\t\t\t\t\t\t\tscaffoldedNextjs: Boolean(scaffoldSummary),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tnull,\n\t\t\t\t\t2,\n ),\n );\n } else {\n p.outro(\n [\n \"Authorized successfully!\",\n `• Credentials written to ${envPath}`,\n `• Webhook ID: ${result.credentials.webhookId}`,\n `• Organization: ${result.credentials.organizationId}`,\n flags.noClipboard\n ? \"Clipboard copy skipped (--no-clipboard).\"\n : \"Secrets copied to clipboard.\",\n \"Return to your project and continue development.\",\n ].join(\"\\n\"),\n );\n }\n\n return summary;\n\t} catch (error) {\n\t\tif (jsonMode) {\n\t\t\tconsole.error(\n\t\t\t\tJSON.stringify(\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tnull,\n\t\t\t\t\t2,\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tp.cancel(\n\t\t\t\terror instanceof Error ? error.message : `Unexpected error: ${error}`,\n\t\t\t);\n\t\t}\n\t\tprocess.exit(1);\n\t}\n}\n\nvoid main();\n","import path from \"node:path\";\n\nexport type EnvTargetResolution = {\n projectDir: string;\n envFile: string;\n providedExplicitly: boolean;\n};\n\nexport function resolveEnvTarget(options: {\n explicitTarget?: string;\n overrideTarget?: string;\n cwd: string;\n defaultFilename: string;\n}): EnvTargetResolution {\n const { explicitTarget, overrideTarget, cwd, defaultFilename } = options;\n const rawTarget = explicitTarget ?? overrideTarget ?? defaultFilename;\n const hasPathSeparator = rawTarget.includes(\"/\") || rawTarget.includes(\"\\\\\");\n\n let projectDir = cwd;\n let envFile = path.basename(rawTarget);\n let providedExplicitly = Boolean(explicitTarget);\n\n if (path.isAbsolute(rawTarget)) {\n projectDir = path.dirname(rawTarget);\n envFile = path.basename(rawTarget);\n providedExplicitly = true;\n } else if (hasPathSeparator) {\n const relativeDir = path.dirname(rawTarget);\n if (relativeDir && relativeDir !== \".\" && relativeDir !== \"\") {\n projectDir = path.resolve(cwd, relativeDir);\n envFile = path.basename(rawTarget);\n providedExplicitly = true;\n }\n }\n\n return {\n projectDir: path.resolve(projectDir),\n envFile,\n providedExplicitly,\n };\n}\n\nexport function deriveProjectName(input: string | undefined, webhookUrl: string): string {\n const trimmed = input?.trim();\n if (trimmed) {\n return trimmed;\n }\n return webhookUrl;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport semver from \"semver\";\n\nconst NEXT_CONFIG_BASENAMES = [\n\t\"next.config.js\",\n\t\"next.config.cjs\",\n\t\"next.config.mjs\",\n\t\"next.config.ts\",\n\t\"next.config.mts\",\n];\n\nconst APP_DIR_CANDIDATES = [\"app\", path.join(\"src\", \"app\")];\nconst PAGES_DIR_CANDIDATES = [\"pages\", path.join(\"src\", \"pages\")];\n\nexport type NextJsDetection = {\n\tfound: boolean;\n\trootDir?: string;\n\tnextConfigPath?: string;\n\tappDir?: string;\n\tpagesDir?: string;\n\tusesTypeScript: boolean;\n\tnextVersion?: string;\n\tversionIsSupported: boolean;\n};\n\nfunction fileExists(target: string): boolean {\n\ttry {\n\t\treturn fs.existsSync(target);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction readPackageJson(pkgPath: string): Record<string, unknown> | null {\n\ttry {\n\t\tconst content = fs.readFileSync(pkgPath, \"utf8\");\n\t\treturn JSON.parse(content) as Record<string, unknown>;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction hasNextDependency(pkg: Record<string, unknown>): boolean {\n\tconst deps = pkg.dependencies as Record<string, string> | undefined;\n\tconst devDeps = pkg.devDependencies as Record<string, string> | undefined;\n\treturn Boolean(deps?.next || devDeps?.next);\n}\n\nfunction extractNextVersion(pkg: Record<string, unknown>): string | undefined {\n\tconst deps = pkg.dependencies as Record<string, string> | undefined;\n\tconst devDeps = pkg.devDependencies as Record<string, string> | undefined;\n\treturn deps?.next ?? devDeps?.next ?? undefined;\n}\n\nfunction findNearestPackageJson(startDir: string): string | undefined {\n\tlet current = path.resolve(startDir);\n\twhile (true) {\n\t\tconst candidate = path.join(current, \"package.json\");\n\t\tif (fileExists(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t\tconst parent = path.dirname(current);\n\t\tif (parent === current) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcurrent = parent;\n\t}\n}\n\nfunction findNextConfig(rootDir: string): string | undefined {\n\tfor (const basename of NEXT_CONFIG_BASENAMES) {\n\t\tconst candidate = path.join(rootDir, basename);\n\t\tif (fileExists(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function detectNextJsProject(startDir: string): NextJsDetection {\n\tconst pkgPath = findNearestPackageJson(startDir);\n\tconst rootDir = pkgPath ? path.dirname(pkgPath) : path.resolve(startDir);\n\tconst pkg = pkgPath ? readPackageJson(pkgPath) : null;\n\n\tconst hasNext = pkg ? hasNextDependency(pkg) : false;\n\tconst nextVersion = pkg ? extractNextVersion(pkg) : undefined;\n\tlet versionIsSupported = true;\n\n\tif (nextVersion) {\n\t\tconst minVersion = semver.minVersion(nextVersion);\n\t\tif (minVersion) {\n\t\t\tversionIsSupported = semver.gte(minVersion, \"15.0.0\");\n\t\t}\n\t}\n\n\tconst nextConfigPath = findNextConfig(rootDir);\n\tconst appDir =\n\t\tAPP_DIR_CANDIDATES.map((candidate) => path.join(rootDir, candidate)).find(\n\t\t\t(candidate) => fileExists(candidate),\n\t\t);\n\tconst pagesDir =\n\t\tPAGES_DIR_CANDIDATES.map((candidate) => path.join(rootDir, candidate)).find(\n\t\t\t(candidate) => fileExists(candidate),\n\t\t);\n\tconst usesTypeScript =\n\t\tfileExists(path.join(rootDir, \"tsconfig.json\")) ||\n\t\tfileExists(path.join(rootDir, \"next-env.d.ts\"));\n\n\tconst found = Boolean(hasNext || nextConfigPath || appDir || pagesDir);\n\n\treturn {\n\t\tfound,\n\t\trootDir: found ? rootDir : undefined,\n\t\tnextConfigPath,\n\t\tappDir,\n\t\tpagesDir,\n\t\tusesTypeScript,\n\t\tnextVersion,\n\t\tversionIsSupported,\n\t};\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport type { NextJsDetection } from \"../utils/nextjs-detector.js\";\nimport {\n\tdetectPackageManager,\n\thasDependency,\n\ttype PackageManager,\n} from \"../utils/package-manager.js\";\nimport {\n\treadFileSafe,\n\twriteFileIfAbsent,\n\twriteFileWithBackup,\n} from \"../utils/fs-utils.js\";\n\ntype ConfigResult =\n\t| { status: \"created\"; path: string; backupPath?: string }\n\t| { status: \"updated\"; path: string; backupPath?: string }\n\t| { status: \"skipped\"; path: string; reason: string };\n\nexport type ScaffoldSummary = {\n\trootDir: string;\n\tpackageManager: PackageManager;\n\tinstalledPackage: boolean;\n\tinstallSkipped: boolean;\n\taddedFiles: string[];\n\tskippedFiles: string[];\n\tconfig?: ConfigResult;\n\twarnings: string[];\n};\n\nfunction findExistingConfig(rootDir: string, preferred?: string): string | undefined {\n\tif (preferred && fs.existsSync(preferred)) return preferred;\n\tconst candidates = [\n\t\t\"next.config.js\",\n\t\t\"next.config.cjs\",\n\t\t\"next.config.mjs\",\n\t\t\"next.config.ts\",\n\t\t\"next.config.mts\",\n\t];\n\tfor (const candidate of candidates) {\n\t\tconst fullPath = path.join(rootDir, candidate);\n\t\tif (fs.existsSync(fullPath)) {\n\t\t\treturn fullPath;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nasync function installNextjsPackage(\n\trootDir: string,\n\tpackageManager: PackageManager,\n): Promise<{ installed: boolean; skipped: boolean }> {\n\tif (hasDependency(rootDir, \"@moneydevkit/nextjs\")) {\n\t\treturn { installed: false, skipped: true };\n\t}\n\n\tconst commandForPm: Record<PackageManager, [string, string[]]> = {\n\t\tpnpm: [\"pnpm\", [\"add\", \"@moneydevkit/nextjs\"]],\n\t\tyarn: [\"yarn\", [\"add\", \"@moneydevkit/nextjs\"]],\n\t\tnpm: [\"npm\", [\"install\", \"@moneydevkit/nextjs\"]],\n\t\tbun: [\"bun\", [\"add\", \"@moneydevkit/nextjs\"]],\n\t};\n\n\tconst [cmd, args] = commandForPm[packageManager];\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawn(cmd, args, { stdio: \"inherit\", cwd: rootDir });\n\t\tchild.on(\"exit\", (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\treject(new Error(`${cmd} ${args.join(\" \")} failed with code ${code}`));\n\t\t\t}\n\t\t});\n\t\tchild.on(\"error\", reject);\n\t});\n\n\treturn { installed: true, skipped: false };\n}\n\nfunction createAppRouteContent(isTypeScript: boolean): string {\n\tconst ext = isTypeScript ? \"ts\" : \"js\";\n\tif (ext === \"ts\") {\n\t\treturn 'export { POST } from \"@moneydevkit/nextjs/server/route\";\\n';\n\t}\n\treturn 'export { POST } from \"@moneydevkit/nextjs/server/route\";\\n';\n}\n\nfunction createAppCheckoutPageContent(isTypeScript: boolean): string {\n\tif (isTypeScript) {\n\t\treturn [\n\t\t\t'\"use client\";',\n\t\t\t\"\",\n\t\t\t'import { Checkout } from \"@moneydevkit/nextjs\";',\n\t\t\t\"\",\n\t\t\t\"type CheckoutPageProps = { params: { id: string } };\",\n\t\t\t\"\",\n\t\t\t\"export default function CheckoutPage({ params }: CheckoutPageProps) {\",\n\t\t\t\" return <Checkout id={params.id} />;\",\n\t\t\t\"}\",\n\t\t\t\"\",\n\t\t].join(\"\\n\");\n\t}\n\n\treturn [\n\t\t'\"use client\";',\n\t\t\"\",\n\t\t'import { Checkout } from \"@moneydevkit/nextjs\";',\n\t\t\"\",\n\t\t\"export default function CheckoutPage({ params }) {\",\n\t\t\" return <Checkout id={params.id} />;\",\n\t\t\"}\",\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\nfunction createPagesApiRouteContent(isTypeScript: boolean): string {\n\tif (isTypeScript) {\n\t\treturn [\n\t\t\t'import type { NextApiRequest, NextApiResponse } from \"next\";',\n\t\t\t'import { POST as appRouteHandler } from \"@moneydevkit/nextjs/server/route\";',\n\t\t\t\"\",\n\t\t\t\"export default async function handler(req: NextApiRequest, res: NextApiResponse) {\",\n\t\t\t\" const url = `http://${req.headers.host ?? \\\"localhost\\\"}${req.url ?? \\\"/api/mdk\\\"}`;\",\n\t\t\t\" const request = new Request(url, {\",\n\t\t\t\" method: req.method || \\\"POST\\\",\",\n\t\t\t\" headers: req.headers as Record<string, string>,\",\n\t\t\t\" body:\",\n\t\t\t' req.method === \"GET\" || req.method === \"HEAD\"',\n\t\t\t\" ? undefined\",\n\t\t\t\" : typeof req.body === \\\"string\\\"\",\n\t\t\t\" ? req.body\",\n\t\t\t\" : JSON.stringify(req.body ?? {}),\",\n\t\t\t\" });\",\n\t\t\t\"\",\n\t\t\t\" const response = await appRouteHandler(request);\",\n\t\t\t\" res.status(response.status);\",\n\t\t\t\" response.headers.forEach((value, key) => {\",\n\t\t\t\" res.setHeader(key, value);\",\n\t\t\t\" });\",\n\t\t\t\" const body = await response.arrayBuffer();\",\n\t\t\t\" res.send(Buffer.from(body));\",\n\t\t\t\"}\",\n\t\t\t\"\",\n\t\t].join(\"\\n\");\n\t}\n\n\treturn [\n\t\t'import { POST as appRouteHandler } from \"@moneydevkit/nextjs/server/route\";',\n\t\t\"\",\n\t\t\"export default async function handler(req, res) {\",\n\t\t\" const url = `http://${req.headers.host ?? \\\"localhost\\\"}${req.url ?? \\\"/api/mdk\\\"}`;\",\n\t\t\" const request = new Request(url, {\",\n\t\t\" method: req.method || \\\"POST\\\",\",\n\t\t\" headers: req.headers,\",\n\t\t\" body:\",\n\t\t' req.method === \"GET\" || req.method === \"HEAD\"',\n\t\t\" ? undefined\",\n\t\t\" : typeof req.body === \\\"string\\\"\",\n\t\t\" ? req.body\",\n\t\t\" : JSON.stringify(req.body ?? {}),\",\n\t\t\" });\",\n\t\t\"\",\n\t\t\" const response = await appRouteHandler(request);\",\n\t\t\" res.status(response.status);\",\n\t\t\" response.headers.forEach((value, key) => {\",\n\t\t\" res.setHeader(key, value);\",\n\t\t\" });\",\n\t\t\" const body = await response.arrayBuffer();\",\n\t\t\" res.send(Buffer.from(body));\",\n\t\t\"}\",\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\nfunction createPagesCheckoutContent(isTypeScript: boolean): string {\n\tif (isTypeScript) {\n\t\treturn [\n\t\t\t'\"use client\";',\n\t\t\t\"\",\n\t\t\t\"import { useRouter } from \\\"next/router\\\";\",\n\t\t\t'import { Checkout } from \"@moneydevkit/nextjs\";',\n\t\t\t\"\",\n\t\t\t\"export default function CheckoutPage() {\",\n\t\t\t\" const router = useRouter();\",\n\t\t\t\" const id = Array.isArray(router.query.id)\",\n\t\t\t\" ? router.query.id[0]\",\n\t\t\t\" : router.query.id;\",\n\t\t\t\"\",\n\t\t\t\" if (!id) {\",\n\t\t\t\" return null;\",\n\t\t\t\" }\",\n\t\t\t\"\",\n\t\t\t\" return <Checkout id={id as string} />;\",\n\t\t\t\"}\",\n\t\t\t\"\",\n\t\t].join(\"\\n\");\n\t}\n\n\treturn [\n\t\t'\"use client\";',\n\t\t\"\",\n\t\t\"import { useRouter } from \\\"next/router\\\";\",\n\t\t'import { Checkout } from \"@moneydevkit/nextjs\";',\n\t\t\"\",\n\t\t\"export default function CheckoutPage() {\",\n\t\t\" const router = useRouter();\",\n\t\t\" const id = Array.isArray(router.query.id)\",\n\t\t\" ? router.query.id[0]\",\n\t\t\" : router.query.id;\",\n\t\t\"\",\n\t\t\" if (!id) {\",\n\t\t\" return null;\",\n\t\t\" }\",\n\t\t\"\",\n\t\t\" return <Checkout id={id} />;\",\n\t\t\"}\",\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\nfunction isTypeScriptConfig(configPath: string): boolean {\n\treturn configPath.endsWith(\".ts\") || configPath.endsWith(\".mts\");\n}\n\nfunction patchNextConfigTypes(source: string): string {\n\t// Strip NextConfig imports and swap annotations to the plugin's override type.\n\tlet patched = source.replace(\n\t\t/import\\s+type\\s+\\{\\s*NextConfig\\s*\\}\\s+from\\s+[\"']next[\"'];?\\s*\\n?/g,\n\t\t\"\",\n\t);\n\tpatched = patched.replace(/:\\s*NextConfig\\b/g, \": NextConfigOverrides\");\n\treturn patched;\n}\n\nfunction updateConfigFile(configPath: string): ConfigResult {\n\tconst isTs = isTypeScriptConfig(configPath);\n\tconst pluginImport = isTs\n\t\t? 'import withMdkCheckout, { type NextConfigOverrides } from \"@moneydevkit/nextjs/next-plugin\";'\n\t\t: 'import withMdkCheckout from \"@moneydevkit/nextjs/next-plugin\";';\n\n\tif (!fs.existsSync(configPath)) {\n\t\tconst content = [\n\t\t\tpluginImport,\n\t\t\t\"\",\n\t\t\t\"// Wrap your existing Next.js config with withMdkCheckout to enable Money Dev Kit.\",\n\t\t\t\"// Example: export default withMdkCheckout(yourConfig)\",\n\t\t\tisTs\n\t\t\t\t? \"const nextConfig: NextConfigOverrides = {};\"\n\t\t\t\t: \"const nextConfig = {};\",\n\t\t\t\"\",\n\t\t\t\"export default withMdkCheckout(nextConfig);\",\n\t\t\t\"\",\n\t\t].join(\"\\n\");\n\n\t\tconst writeResult = writeFileWithBackup(configPath, content);\n\t\treturn {\n\t\t\tstatus: \"created\",\n\t\t\tpath: configPath,\n\t\t\tbackupPath:\n\t\t\t\twriteResult.status === \"updated-with-backup\"\n\t\t\t\t\t? writeResult.backupPath\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n\n\tconst original = readFileSafe(configPath) ?? \"\";\n\n\tif (\n\t\toriginal.includes(\"@moneydevkit/nextjs/next-plugin\") ||\n\t\toriginal.includes(\"withMdkCheckout\")\n\t) {\n\t\treturn { status: \"skipped\", path: configPath, reason: \"already configured\" };\n\t}\n\n\tif (original.includes(\"module.exports\")) {\n\t\tconst re = /module\\.exports\\s*=\\s*(\\{[\\s\\S]*?\\});?/;\n\t\tconst match = original.match(re);\n\n\t\tif (match) {\n\t\t\tconst prefix =\n\t\t\t\t'const withMdkCheckout = require(\"@moneydevkit/nextjs/next-plugin\").default ?? require(\"@moneydevkit/nextjs/next-plugin\");\\n';\n\t\t\tconst replaced = original.replace(\n\t\t\t\tre,\n\t\t\t\t`module.exports = withMdkCheckout(${match[1]});`,\n\t\t\t);\n\t\t\tconst result = writeFileWithBackup(configPath, `${prefix}${replaced}`);\n\t\t\treturn {\n\t\t\t\tstatus: \"updated\",\n\t\t\t\tpath: configPath,\n\t\t\t\tbackupPath:\n\t\t\t\t\tresult.status === \"updated-with-backup\" ? result.backupPath : undefined,\n\t\t\t};\n\t\t}\n\t}\n\n\tif (original.includes(\"export default\")) {\n\t\tconst reDefaultObject = /export\\s+default\\s+(\\{[\\s\\S]*?\\});?/;\n\t\tconst objectMatch = original.match(reDefaultObject);\n\t\tif (objectMatch) {\n\t\t\tconst content = [\n\t\t\t\tpluginImport,\n\t\t\t\t\"\",\n\t\t\t\tisTs\n\t\t\t\t\t? \"const nextConfig: NextConfigOverrides = \" + objectMatch[1] + \";\"\n\t\t\t\t\t: \"const nextConfig = \" + objectMatch[1] + \";\",\n\t\t\t\t\"\",\n\t\t\t\t\"export default withMdkCheckout(nextConfig);\",\n\t\t\t\t\"\",\n\t\t\t].join(\"\\n\");\n\t\t\tconst writeResult = writeFileWithBackup(configPath, content);\n\t\t\treturn {\n\t\t\t\tstatus: \"updated\",\n\t\t\t\tpath: configPath,\n\t\t\t\tbackupPath:\n\t\t\t\t\twriteResult.status === \"updated-with-backup\"\n\t\t\t\t\t\t? writeResult.backupPath\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t}\n\n\t\tconst reNamed = /export\\s+default\\s+([a-zA-Z0-9_]+)\\s*;?/;\n\t\tconst namedMatch = original.match(reNamed);\n\t\tif (namedMatch) {\n\t\t\tconst name = namedMatch[1];\n\t\t\tconst patched =\n\t\t\t\tisTs && original.includes(\"NextConfig\")\n\t\t\t\t\t? patchNextConfigTypes(original)\n\t\t\t\t\t: original;\n\t\t\tconst lines = [\n\t\t\t\tpluginImport,\n\t\t\t\tpatched.replace(reNamed, `export default withMdkCheckout(${name});`),\n\t\t\t];\n\t\t\tconst writeResult = writeFileWithBackup(configPath, lines.join(\"\\n\"));\n\t\t\treturn {\n\t\t\t\tstatus: \"updated\",\n\t\t\t\tpath: configPath,\n\t\t\t\tbackupPath:\n\t\t\t\t\twriteResult.status === \"updated-with-backup\"\n\t\t\t\t\t\t? writeResult.backupPath\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn {\n\t\tstatus: \"skipped\",\n\t\tpath: configPath,\n\t\treason:\n\t\t\t\"unrecognized format; wrap your export with withMdkCheckout, e.g. export default withMdkCheckout(yourConfig)\",\n\t};\n}\n\nfunction scaffoldAppRouter(\n\tappDir: string,\n\tisTypeScript: boolean,\n): { added: string[]; skipped: string[] } {\n\tconst added: string[] = [];\n\tconst skipped: string[] = [];\n\n\tconst routePath = path.join(\n\t\tappDir,\n\t\t\"api\",\n\t\t\"mdk\",\n\t\t`route.${isTypeScript ? \"ts\" : \"js\"}`,\n\t);\n\tconst routeResult = writeFileIfAbsent(\n\t\troutePath,\n\t\tcreateAppRouteContent(isTypeScript),\n\t);\n\tif (routeResult.status === \"created\") {\n\t\tadded.push(routeResult.path);\n\t} else {\n\t\tskipped.push(routeResult.path);\n\t}\n\n\tconst pagePath = path.join(\n\t\tappDir,\n\t\t\"checkout\",\n\t\t\"[id]\",\n\t\t`page.${isTypeScript ? \"tsx\" : \"js\"}`,\n\t);\n\tconst pageResult = writeFileIfAbsent(\n\t\tpagePath,\n\t\tcreateAppCheckoutPageContent(isTypeScript),\n\t);\n\tif (pageResult.status === \"created\") {\n\t\tadded.push(pageResult.path);\n\t} else {\n\t\tskipped.push(pageResult.path);\n\t}\n\n\treturn { added, skipped };\n}\n\nfunction scaffoldPagesRouter(\n\tpagesDir: string,\n\tisTypeScript: boolean,\n): { added: string[]; skipped: string[] } {\n\tconst added: string[] = [];\n\tconst skipped: string[] = [];\n\n\tconst apiPath = path.join(\n\t\tpagesDir,\n\t\t\"api\",\n\t\t`mdk.${isTypeScript ? \"ts\" : \"js\"}`,\n\t);\n\tconst apiResult = writeFileIfAbsent(\n\t\tapiPath,\n\t\tcreatePagesApiRouteContent(isTypeScript),\n\t);\n\tif (apiResult.status === \"created\") {\n\t\tadded.push(apiResult.path);\n\t} else {\n\t\tskipped.push(apiResult.path);\n\t}\n\n\tconst checkoutPath = path.join(\n\t\tpagesDir,\n\t\t\"checkout\",\n\t\t`[id].${isTypeScript ? \"tsx\" : \"js\"}`,\n\t);\n\tconst checkoutResult = writeFileIfAbsent(\n\t\tcheckoutPath,\n\t\tcreatePagesCheckoutContent(isTypeScript),\n\t);\n\tif (checkoutResult.status === \"created\") {\n\t\tadded.push(checkoutResult.path);\n\t} else {\n\t\tskipped.push(checkoutResult.path);\n\t}\n\n\treturn { added, skipped };\n}\n\nexport async function scaffoldNextJs(options: {\n\tdetection: NextJsDetection;\n\tjsonMode: boolean;\n\tskipInstall?: boolean;\n}): Promise<ScaffoldSummary> {\n\tconst { detection, jsonMode, skipInstall } = options;\n\tif (!detection.rootDir) {\n\t\tthrow new Error(\"Next.js project root not found for scaffolding.\");\n\t}\n\n\tconst warnings: string[] = [];\n\tconst rootDir = detection.rootDir;\n\tconst packageManager = detectPackageManager(rootDir);\n\n\tconst installResult = skipInstall\n\t\t? { installed: false, skipped: true }\n\t\t: await installNextjsPackage(rootDir, packageManager);\n\n\tconst configPath =\n\t\tfindExistingConfig(rootDir, detection.nextConfigPath) ??\n\t\tpath.join(rootDir, \"next.config.js\");\n\tconst configResult = updateConfigFile(configPath);\n\n\tif (configResult.status === \"skipped\") {\n\t\twarnings.push(\n\t\t\t`Could not automatically update ${path.basename(configPath)} (${configResult.reason}). Please wrap your Next.js config with withMdkCheckout manually.`,\n\t\t);\n\t}\n\n\tlet fileResults: { added: string[]; skipped: string[] };\n\tif (detection.appDir) {\n\t\tfileResults = scaffoldAppRouter(detection.appDir, detection.usesTypeScript);\n\t} else if (detection.pagesDir) {\n\t\tfileResults = scaffoldPagesRouter(\n\t\t\tdetection.pagesDir,\n\t\t\tdetection.usesTypeScript,\n\t\t);\n\t} else {\n\t\t// Default to App Router layout.\n\t\tfileResults = scaffoldAppRouter(\n\t\t\tpath.join(rootDir, \"app\"),\n\t\t\tdetection.usesTypeScript,\n\t\t);\n\t\twarnings.push(\n\t\t\t\"No app/ or pages/ directory detected; created App Router scaffolding in app/.\",\n\t\t);\n\t}\n\n\tif (!jsonMode) {\n\t\tif (!installResult.installed && installResult.skipped) {\n\t\t\tconsole.log(\"@moneydevkit/nextjs already present; skipping install.\");\n\t\t}\n\t}\n\n\treturn {\n\t\trootDir,\n\t\tpackageManager,\n\t\tinstalledPackage: installResult.installed,\n\t\tinstallSkipped: installResult.skipped,\n\t\taddedFiles: fileResults.added,\n\t\tskippedFiles: fileResults.skipped,\n\t\tconfig: configResult,\n\t\twarnings,\n\t};\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"yarn\" | \"npm\" | \"bun\";\n\nexport function detectPackageManager(rootDir: string): PackageManager {\n\tif (fs.existsSync(path.join(rootDir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n\tif (fs.existsSync(path.join(rootDir, \"yarn.lock\"))) return \"yarn\";\n\tif (fs.existsSync(path.join(rootDir, \"bun.lockb\"))) return \"bun\";\n\tif (fs.existsSync(path.join(rootDir, \"package-lock.json\"))) return \"npm\";\n\treturn \"npm\";\n}\n\nexport function hasDependency(rootDir: string, depName: string): boolean {\n\ttry {\n\t\tconst pkg = JSON.parse(fs.readFileSync(path.join(rootDir, \"package.json\"), \"utf8\")) as {\n\t\t\tdependencies?: Record<string, string>;\n\t\t\tdevDependencies?: Record<string, string>;\n\t\t};\n\t\treturn Boolean(pkg.dependencies?.[depName] || pkg.devDependencies?.[depName]);\n\t} catch {\n\t\treturn false;\n\t}\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport type WriteResult =\n\t| { status: \"created\"; path: string }\n\t| { status: \"updated-with-backup\"; path: string; backupPath: string }\n\t| { status: \"skipped-exists\"; path: string }\n\t| { status: \"skipped-different\"; path: string };\n\nexport function ensureDir(filePath: string) {\n\tconst dir = path.dirname(filePath);\n\tfs.mkdirSync(dir, { recursive: true });\n}\n\nexport function readFileSafe(filePath: string): string | null {\n\ttry {\n\t\treturn fs.readFileSync(filePath, \"utf8\");\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function writeFileIfAbsent(filePath: string, content: string): WriteResult {\n\tif (fs.existsSync(filePath)) {\n\t\tconst existing = readFileSafe(filePath);\n\t\tif (existing?.trim() === content.trim()) {\n\t\t\treturn { status: \"skipped-exists\", path: filePath };\n\t\t}\n\t\treturn { status: \"skipped-different\", path: filePath };\n\t}\n\tensureDir(filePath);\n\tfs.writeFileSync(filePath, content, \"utf8\");\n\treturn { status: \"created\", path: filePath };\n}\n\nexport function writeFileWithBackup(\n\tfilePath: string,\n\tcontent: string,\n): WriteResult {\n\tif (!fs.existsSync(filePath)) {\n\t\tensureDir(filePath);\n\t\tfs.writeFileSync(filePath, content, \"utf8\");\n\t\treturn { status: \"created\", path: filePath };\n\t}\n\n\tconst existing = readFileSafe(filePath) ?? \"\";\n\n\tif (existing.trim() === content.trim()) {\n\t\treturn { status: \"skipped-exists\", path: filePath };\n\t}\n\n\tconst backupPath = `${filePath}.mdk-backup`;\n\tfs.writeFileSync(backupPath, existing, \"utf8\");\n\tfs.writeFileSync(filePath, content, \"utf8\");\n\n\treturn { status: \"updated-with-backup\", path: filePath, backupPath };\n}\n"],"mappings":"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","names":["path","fs","path","fs","path","fs","path","fs","path","fs","path","path","fs","spinner","credentials","mnemonic","p"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/env-target.ts","../src/utils/nextjs-detector.ts","../src/scaffold/nextjs.ts","../src/utils/package-manager.ts","../src/utils/fs-utils.ts"],"sourcesContent":["import { createORPCClient } from \"@orpc/client\";\nimport { RPCLink } from \"@orpc/client/fetch\";\nimport * as p from \"@clack/prompts\";\nimport minimist from \"minimist\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport open from \"open\";\nimport clipboard from \"clipboardy\";\nimport setCookieParser, { Cookie } from \"set-cookie-parser\";\nimport { generateMnemonic as generateBip39Mnemonic } from \"bip39\";\nimport { contract } from \"@moneydevkit/api-contract\";\nimport type { ContractRouterClient } from \"@orpc/contract\";\nimport type {\n\tBootstrapOnboardingResponse,\n\tStartDeviceAuthResponse,\n} from \"@moneydevkit/api-contract\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { deriveProjectName, resolveEnvTarget } from \"./utils/env-target.js\";\nimport { detectNextJsProject } from \"./utils/nextjs-detector.js\";\nimport { scaffoldNextJs } from \"./scaffold/nextjs.js\";\n\ntype Flags = {\n\tjson: boolean;\n\tnoClipboard: boolean;\n\tnoOpen: boolean;\n\tscaffoldNextjs?: boolean;\n\tbaseUrl?: string;\n\tenvFile?: string;\n\tprojectName?: string;\n\tmanualLogin?: string;\n\tforceNewWebhook?: boolean;\n\twebhookUrl?: string;\n};\n\nconst DEFAULT_BASE_URL = \"https://moneydevkit.com\";\nconst DEFAULT_ENV_FILE = \".env.local\";\n\nclass CookieJar {\n\tprivate store = new Map<string, string>();\n\n\tconstructor(initial?: string) {\n\t\tif (initial) {\n\t\t\tthis.add(initial);\n\t\t}\n\t}\n\n\tadd(input: string | string[]) {\n\t\tconst cookies = Array.isArray(input) ? input : [input];\n\t\tfor (const line of cookies) {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (!trimmed) continue;\n\t\t\tconst parsed = setCookieParser.parse(trimmed);\n\t\t\tconst handle = (cookie: Cookie) => {\n\t\t\t\tif (cookie?.name && cookie.value !== undefined) {\n\t\t\t\t\tthis.store.set(cookie.name, cookie.value);\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (Array.isArray(parsed)) {\n\t\t\t\tfor (const cookie of parsed) {\n\t\t\t\t\thandle(cookie);\n\t\t\t\t}\n\t\t\t} else if (parsed && typeof parsed === \"object\") {\n\t\t\t\thandle(parsed);\n\t\t\t}\n\t\t}\n\t}\n\n\theader(): string | undefined {\n\t\tif (this.store.size === 0) return undefined;\n\t\treturn Array.from(this.store.entries())\n\t\t\t.map(([name, value]) => `${name}=${value}`)\n\t\t\t.join(\"; \");\n\t}\n}\n\nfunction parseFlags(argv: string[]): Flags {\n\tconst result = minimist(argv, {\n\t\tboolean: [\"json\", \"no-clipboard\", \"no-open\", \"force-new-webhook\", \"scaffold-nextjs\"],\n\t\tstring: [\n\t\t\t\"base-url\",\n\t\t\t\"env-target\",\n\t\t\t\"project-name\",\n\t\t\t\"manual-login\",\n\t\t\t\"webhook-url\",\n\t\t],\n\t\talias: {\n\t\t\tjson: \"j\",\n\t\t},\n\t\tdefault: {\n\t\t\t\"no-clipboard\": false,\n\t\t\t\"no-open\": false,\n\t\t\tjson: false,\n\t\t\t\"force-new-webhook\": false,\n\t\t\t\"scaffold-nextjs\": false,\n\t\t},\n\t});\n\nreturn {\n\tjson: Boolean(result.json),\n\tnoClipboard: Boolean(result[\"no-clipboard\"]),\n\tnoOpen: Boolean(result[\"no-open\"]),\n\tscaffoldNextjs: Boolean(result[\"scaffold-nextjs\"]),\n\tbaseUrl: result[\"base-url\"],\n\tenvFile: result[\"env-target\"],\n\t\tprojectName:\n\t\t\ttypeof result[\"project-name\"] === \"string\"\n\t\t\t\t? result[\"project-name\"]\n\t\t\t\t: undefined,\n\t\tmanualLogin:\n\t\t\ttypeof result[\"manual-login\"] === \"string\"\n\t\t\t\t? result[\"manual-login\"]\n\t\t\t\t: undefined,\n\t\tforceNewWebhook: Boolean(result[\"force-new-webhook\"]),\n\t\twebhookUrl:\n\t\t\ttypeof result[\"webhook-url\"] === \"string\"\n\t\t\t\t? result[\"webhook-url\"]\n\t\t\t\t: undefined,\n\t};\n}\n\nfunction normalizeDirectory(dir: string): string {\n\tif (path.isAbsolute(dir)) return dir;\n\treturn path.resolve(process.cwd(), dir);\n}\n\nfunction ensureDirectoryExists(dir: string) {\n\tif (!fs.existsSync(dir)) {\n\t\tfs.mkdirSync(dir, { recursive: true });\n\t}\n}\n\nfunction readEnvFile(filePath: string): Map<string, string> {\n\tconst env = new Map<string, string>();\n\tif (!fs.existsSync(filePath)) {\n\t\treturn env;\n\t}\n\tconst contents = fs.readFileSync(filePath, \"utf8\");\n\tfor (const line of contents.split(/\\r?\\n/)) {\n\t\tif (!line || line.startsWith(\"#\")) continue;\n\t\tconst [key, ...rest] = line.split(\"=\");\n\t\tif (!key) continue;\n\t\tenv.set(key.trim(), rest.join(\"=\").trim());\n\t}\n\treturn env;\n}\n\nfunction renderEnvPreview(\n\t_original: Map<string, string>,\n\tupdates: Record<string, string>,\n): string {\n\tconst lines: string[] = [\"Writing the following values:\", \"\"];\n\tfor (const [key, value] of Object.entries(updates)) {\n\t\tlines.push(` ${key}=${value}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction writeEnvFile(\n\tfilePath: string,\n\texisting: Map<string, string>,\n\tupdates: Record<string, string>,\n) {\n\tfor (const [key, value] of Object.entries(updates)) {\n\t\texisting.set(key, value);\n\t}\n\tconst content =\n\t\tArray.from(existing.entries())\n\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t.map(([key, value]) => `${key}=${value}`)\n\t\t\t.join(os.EOL) + os.EOL;\n\tfs.writeFileSync(filePath, content, \"utf8\");\n}\n\nfunction ensureEnvFileExists(filePath: string) {\n\tconst dir = path.dirname(filePath);\n\tensureDirectoryExists(dir);\n\tif (!fs.existsSync(filePath)) {\n\t\tfs.writeFileSync(filePath, \"\", \"utf8\");\n\t}\n}\n\nfunction resolveLocalEnvPath(options: {\n\torganizationId?: string;\n\tapiKeyId?: string;\n}): string | undefined {\n\tconst organization = options.organizationId?.trim();\n\tconst apiKey = options.apiKeyId?.trim();\n\tif (!organization || !apiKey) {\n\t\treturn undefined;\n\t}\n\tconst homeDir = os.homedir();\n\treturn path.join(homeDir, \".mdk\", organization, apiKey, \".env\");\n}\n\nfunction isValidHttpUrl(value?: string): boolean {\n\tif (!value) return false;\n\ttry {\n\t\tconst parsed = new URL(value);\n\t\treturn parsed.protocol === \"https:\" || parsed.protocol === \"http:\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction createRpcClient(\n\tbaseUrl: string,\n\tjar: CookieJar,\n): ContractRouterClient<typeof contract> {\n\tconst link = new RPCLink({\n\t\turl: `${baseUrl.replace(/\\/$/, \"\")}/rpc`,\n\t\theaders: () => {\n\t\t\tconst cookieHeader = jar.header();\n\t\t\treturn cookieHeader ? { Cookie: cookieHeader } : {};\n\t\t},\n\t\tfetch: async (input, init) => {\n\t\t\tconst response = await fetch(input, init);\n\t\t\tconst setCookie = response.headers.getSetCookie?.() ?? [];\n\t\t\tif (setCookie.length > 0) {\n\t\t\t\tjar.add(setCookie);\n\t\t\t}\n\t\t\treturn response;\n\t\t},\n\t});\n\n\treturn createORPCClient(link) as ContractRouterClient<typeof contract>;\n}\n\nasync function runDeviceFlow(options: {\n\tflags: Flags;\n\tbaseUrl: string;\n\tcookies: CookieJar;\n\tprojectName?: string;\n\twebhookUrl: string;\n}): Promise<{\n\tdevice: StartDeviceAuthResponse;\n\tbootstrapToken: string;\n\tcredentials: BootstrapOnboardingResponse;\n\tmnemonic: string;\n}> {\n\tconst client = createRpcClient(options.baseUrl, options.cookies);\nconst manualSessionCookie = options.flags.manualLogin;\nconst webhookUrl = options.webhookUrl;\n\nconst device = await client.onboarding.startDeviceAuth({\n clientDisplayName: options.projectName,\n webhookUrl,\n forceNewWebhook: options.flags.forceNewWebhook,\n});\n\n\tif (manualSessionCookie) {\n\t\tconst response = await fetch(\n\t\t\t`${options.baseUrl.replace(/\\/$/, \"\")}/api/cli/device/authorize`,\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tCookie: manualSessionCookie,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tcode: device.userCode,\n\t\t\t\t\tforceNewWebhook: options.flags.forceNewWebhook ?? false,\n\t\t\t\t}),\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst body = (await response.json().catch(() => ({}))) as {\n\t\t\t\terror?: string;\n\t\t\t};\n\t\t\tthrow new Error(\n\t\t\t\tbody.error ??\n\t\t\t\t\t`Manual authorize failed with status ${response.status}`,\n\t\t\t);\n\t\t}\n\t} else {\n if (!options.flags.json) {\n p.note(\n [\n `Device code: ${device.userCode}`,\n `Domain: ${webhookUrl}`,\n \"Open the authorization page, click Authorize, then return to this terminal.\",\n ].join(\"\\n\"),\n \"Authorize this device\",\n );\n }\n\n\t\tif (!options.flags.noOpen && !options.flags.json) {\n\t\t\ttry {\n\t\t\t\tawait open(device.verificationUri, { wait: false });\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Unable to open browser automatically (${(error as Error).message}).`,\n\t\t\t\t);\n\t\t\t\tconsole.warn(`Open this URL manually: ${device.verificationUri}`);\n\t\t\t}\n\t\t} else if (!options.flags.json) {\n\t\t\tconsole.log(`Open this URL in your browser: ${device.verificationUri}`);\n\t\t}\n\n\t\tconst spinner = options.flags.json ? null : p.spinner();\n\t\tspinner?.start(\"Waiting for authorization...\");\n\n\t\tconst deadline = Date.now() + device.expiresIn * 1000;\n\t\tlet bootstrapToken: string | undefined;\n\n\t\twhile (Date.now() < deadline) {\n\t\t\tconst poll = await client.onboarding.pollDeviceAuth({\n\t\t\t\tdeviceCode: device.deviceCode,\n\t\t\t});\n\n\t\t\tif (poll.status === \"authorized\") {\n\t\t\t\tbootstrapToken = poll.bootstrapToken;\n\t\t\t\tspinner?.stop(\"Device authorized.\");\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (poll.status === \"expired\") {\n\t\t\t\tspinner?.stop(\"Device code expired.\");\n\t\t\t\tthrow new Error(\"Device code expired before authorization.\");\n\t\t\t}\n\n\t\t\tif (poll.status === \"denied\") {\n\t\t\t\tspinner?.stop(\"Authorization denied.\");\n\t\t\t\tthrow new Error(\"Authorization was denied in the dashboard.\");\n\t\t\t}\n\n const secondsLeft = Math.max(\n 0,\n Math.floor((deadline - Date.now()) / 1000),\n );\n spinner?.message(\n `Waiting for authorization (${secondsLeft}s remaining)`,\n\t\t\t);\n\t\t\tawait delay(device.interval * 1000);\n\t\t}\n\n\t\tif (!bootstrapToken) {\n\t\t\tthrow new Error(\"Timed out waiting for authorization.\");\n\t\t}\n\n const credentials = await client.onboarding.bootstrap({\n bootstrapToken,\n projectName: options.projectName,\n webhookUrl,\n forceNewWebhook: options.flags.forceNewWebhook,\n\t\t});\n\n\t\tconst mnemonic = generateBip39Mnemonic(128);\n\n\t\treturn {\n\t\t\tdevice,\n\t\t\tbootstrapToken,\n\t\t\tcredentials,\n\t\t\tmnemonic,\n\t\t};\n\t}\n\n\t// Manual path: poll once to get the bootstrap token.\n\tconst pollResult = await client.onboarding.pollDeviceAuth({\n\t\tdeviceCode: device.deviceCode,\n\t});\n\n\tif (pollResult.status !== \"authorized\") {\n\t\tthrow new Error(\n\t\t\t`Unable to obtain bootstrap token (status: ${pollResult.status}).`,\n\t\t);\n\t}\n\n\tconst credentials = await client.onboarding.bootstrap({\n\t\tbootstrapToken: pollResult.bootstrapToken,\n\t\tprojectName: options.projectName,\n\t\twebhookUrl,\n\t\tforceNewWebhook: options.flags.forceNewWebhook,\n\t});\n\n\tconst mnemonic = generateBip39Mnemonic(128);\n\n\treturn {\n\t\tdevice,\n\t\tbootstrapToken: pollResult.bootstrapToken,\n\t\tcredentials,\n\t\tmnemonic,\n\t};\n}\n\nasync function main() {\n\tconst flags = parseFlags(process.argv.slice(2));\n\tconst jsonMode = flags.json;\n\n\tif (!jsonMode) {\n\t\tp.intro(\"Money Dev Kit – @moneydevkit/create\");\n\t}\n\n\tconst baseUrl = flags.baseUrl ?? DEFAULT_BASE_URL;\n\tconst cookies = new CookieJar(flags.manualLogin);\n\n\tconst envFileOverride = process.env.MDK_ENV_FILE;\n\tconst envResolution = resolveEnvTarget({\n\t\texplicitTarget: flags.envFile,\n\t\toverrideTarget: envFileOverride,\n\t\tcwd: process.cwd(),\n\t\tdefaultFilename: DEFAULT_ENV_FILE,\n\t});\n\tconst { providedExplicitly } = envResolution;\n\tlet projectDir = envResolution.projectDir;\n\tlet envFile = envResolution.envFile;\n\n\tif (!providedExplicitly && !jsonMode && !flags.envFile) {\n\t\tconst dirPrompt = await p.text({\n\t\t\tmessage: \"Where should we store your MDK credentials?\",\n\t\t\tinitialValue: projectDir,\n\t\t});\n\n\t\tif (p.isCancel(dirPrompt)) {\n\t\t\tp.cancel(\"Aborted.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tprojectDir = dirPrompt;\n\t}\n\n\tprojectDir = normalizeDirectory(projectDir);\n\tensureDirectoryExists(projectDir);\n\n\tif (!flags.envFile && !envFileOverride && !jsonMode) {\n\t\tconst envPrompt = await p.text({\n\t\t\tmessage: \"Env file to update\",\n\t\t\tinitialValue: envFile,\n\t\t});\n\n\t\tif (p.isCancel(envPrompt)) {\n\t\t\tp.cancel(\"Aborted.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tenvFile = envPrompt.trim() || DEFAULT_ENV_FILE;\n\t}\n\n\tconst envPath = path.join(projectDir, envFile);\n\tconst existingEnvValues = readEnvFile(envPath);\n\tconst mnemonicAlreadySet = existingEnvValues.get(\"MDK_MNEMONIC\")?.trim();\n\n\tif (mnemonicAlreadySet) {\n\t\tconst warningMessage =\n\t\t\t\"We found MDK_MNEMONIC already set in your project. Your mnemonic is the key to your wallet. If you've already deployed and taken payments with this mnemonic and change it, you will lose access to your funds. If you want to generate a new mnemonic, delete MDK_MNEMONIC from your .env and try again.\";\n\n\t\tif (jsonMode) {\n\t\t\tconsole.error(\n\t\t\t\tJSON.stringify(\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\terror: { message: warningMessage },\n\t\t\t\t\t},\n\t\t\t\t\tnull,\n\t\t\t\t\t2,\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tp.cancel(warningMessage);\n\t\t}\n\n\t\tprocess.exit(1);\n\t}\n\n\tlet webhookUrl = flags.webhookUrl?.trim();\n\tif ((!webhookUrl || !isValidHttpUrl(webhookUrl)) && jsonMode) {\n\t\tthrow new Error(\"Provide a valid --webhook-url when running in --json mode.\");\n\t}\n\n\twhile (!webhookUrl) {\n\t\tconst webhookInput = await p.text({\n\t\t\tmessage: \"Domain for your application\",\n\t\t\tinitialValue: \"https://\",\n\t\t\tplaceholder: \"https://yourapp.com\",\n\t\t\tvalidate: (value) =>\n\t\t\t\tisValidHttpUrl(value?.trim())\n\t\t\t\t\t? undefined\n\t\t\t\t\t: \"Enter a valid http(s) URL (e.g. https://yourapp.com)\",\n\t\t});\n\n\t\tif (p.isCancel(webhookInput)) {\n\t\t\tp.cancel(\"Aborted.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\twebhookUrl = webhookInput.trim();\n\t}\n\n\tlet projectName = flags.projectName?.trim();\n\tif (!projectName && !jsonMode) {\n\t\tconst namePrompt = await p.text({\n\t\t\tmessage: \"Project name (used for the generated API key)\",\n\t\t\tplaceholder: \"Optional: e.g. My Next.js Store\",\n\t\t});\n\t\tif (p.isCancel(namePrompt)) {\n\t\t\tp.cancel(\"Aborted.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tprojectName = namePrompt.trim() || undefined;\n\t}\n\n\tprojectName = deriveProjectName(projectName, webhookUrl);\n\n\tconst nextJsDetection = detectNextJsProject(projectDir);\n\tlet shouldScaffoldNextJs = false;\n\n\tif (flags.scaffoldNextjs) {\n\t\tif (nextJsDetection.found) {\n\t\t\tif (nextJsDetection.versionIsSupported) {\n\t\t\t\tshouldScaffoldNextJs = true;\n\t\t\t} else {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Next.js version ${nextJsDetection.nextVersion ?? \"unknown\"} detected, but @moneydevkit/nextjs requires Next.js 15+. Skipping installation and scaffolding.`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn(\n\t\t\t\t\"No NextJS app found, skipping @moneydevkit/nextjs installation. Please install manually.\",\n\t\t\t);\n\t\t}\n\t} else if (!jsonMode && nextJsDetection.found) {\n\t\tif (!nextJsDetection.versionIsSupported) {\n\t\t\tconsole.warn(\n\t\t\t\t`Next.js version ${nextJsDetection.nextVersion ?? \"unknown\"} detected, but @moneydevkit/nextjs requires Next.js 15+. Skipping scaffolding prompt.`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst scaffoldPrompt = await p.confirm({\n\t\t\t\tmessage: `Next.js application detected at ${\n\t\t\t\t\tnextJsDetection.rootDir ?? projectDir\n\t\t\t\t} (version ${nextJsDetection.nextVersion ?? \"unknown\"}). Install and scaffold @moneydevkit/nextjs?`,\n\t\t\t\tinitialValue: true,\n\t\t\t});\n\n\t\t\tif (p.isCancel(scaffoldPrompt)) {\n\t\t\t\tp.cancel(\"Aborted.\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tshouldScaffoldNextJs = Boolean(scaffoldPrompt);\n\t\t}\n\t}\n\n\ttry {\n\t\tconst result = await runDeviceFlow({\n\t\t\tflags,\n\t\t\tbaseUrl,\n\t\t\tcookies,\n\t\t\tprojectName,\n\t\t\twebhookUrl,\n\t\t});\n\n\t\tconst updates: Record<string, string> = {\n\t\t\tMDK_ACCESS_TOKEN: result.credentials.apiKey,\n\t\t\tMDK_MNEMONIC: result.mnemonic,\n\t\t};\n\n\t\tensureEnvFileExists(envPath);\n\t\tconst existingEnv = readEnvFile(envPath);\n\t\tconst preview = renderEnvPreview(existingEnv, updates);\n\n\t\twriteEnvFile(envPath, existingEnv, updates);\n\n\t\tconst localEnvPath = resolveLocalEnvPath({\n\t\t\torganizationId: result.credentials.organizationId,\n\t\t\tapiKeyId: result.credentials.apiKeyId,\n\t\t});\n\t\tif (localEnvPath) {\n\t\t\tensureEnvFileExists(localEnvPath);\n\t\t\tconst localEnv = readEnvFile(localEnvPath);\n\t\t\twriteEnvFile(localEnvPath, localEnv, updates);\n\t\t}\n\n\t\tif (!jsonMode) {\n\t\t\tp.note(preview, \"Env file updated\");\n\t\t}\n\n if (!flags.noClipboard) {\n await clipboard.write(\n\t\t\t\t[`MDK_ACCESS_TOKEN=${updates.MDK_ACCESS_TOKEN}`, `MDK_MNEMONIC=${updates.MDK_MNEMONIC}`].join(\n\t\t\t\t\t\"\\n\",\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tlet scaffoldSummary: Awaited<ReturnType<typeof scaffoldNextJs>> | null =\n\t\t\tnull;\n\n\t\tif (shouldScaffoldNextJs && nextJsDetection.found) {\n\t\t\ttry {\n\t\t\t\tscaffoldSummary = await scaffoldNextJs({\n\t\t\t\t\tdetection: nextJsDetection,\n\t\t\t\t\tjsonMode,\n\t\t\t\t});\n\n\t\t\t\tif (!jsonMode && scaffoldSummary) {\n\t\t\t\t\tconst lines = [\n\t\t\t\t\t\tscaffoldSummary.installedPackage\n\t\t\t\t\t\t\t? `Installed @moneydevkit/nextjs with ${scaffoldSummary.packageManager}.`\n\t\t\t\t\t\t\t: scaffoldSummary.installSkipped\n\t\t\t\t\t\t\t\t? \"@moneydevkit/nextjs already installed; skipped package install.\"\n\t\t\t\t\t\t\t\t: \"Skipped @moneydevkit/nextjs installation.\",\n\t\t\t\t\t];\n\n\t\t\t\t\t\tif (scaffoldSummary.config) {\n\t\t\t\t\t\t\tconst cfg = scaffoldSummary.config;\n\t\t\t\t\t\t\tif (cfg.status === \"created\") {\n\t\t\t\t\t\t\t\tlines.push(`Created ${cfg.path} with withMdkCheckout().`);\n\t\t\t\t\t\t\t\tif (cfg.backupPath) {\n\t\t\t\t\t\t\t\t\tlines.push(`Created backup at ${cfg.backupPath}.`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (cfg.status === \"updated\") {\n\t\t\t\t\t\t\t\tlines.push(`Updated ${cfg.path} with withMdkCheckout().`);\n\t\t\t\t\t\t\t\tif (cfg.backupPath) {\n\t\t\t\t\t\t\t\t\tlines.push(`Created backup at ${cfg.backupPath}.`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t\t\t`Could not update ${cfg.path} automatically (${cfg.reason ?? \"unknown reason\"}).`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\tif (scaffoldSummary.addedFiles.length > 0) {\n\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t`Added: ${scaffoldSummary.addedFiles\n\t\t\t\t\t\t\t\t.map((p) => path.relative(projectDir, p))\n\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (scaffoldSummary.skippedFiles.length > 0) {\n\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t`Skipped existing files: ${scaffoldSummary.skippedFiles\n\t\t\t\t\t\t\t\t.map((p) => path.relative(projectDir, p))\n\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tp.note(lines.join(\"\\n\"), \"Next.js scaffolding\");\n\t\t\t\t}\n\n\t\t\t\tif (scaffoldSummary?.warnings.length) {\n\t\t\t\t\tfor (const warning of scaffoldSummary.warnings) {\n\t\t\t\t\t\tconsole.warn(warning);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst message =\n\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\tif (jsonMode) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\t\t\tmessage: `Next.js scaffolding failed: ${message}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(`Next.js scaffolding failed: ${message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst summary = {\n\t\t\tprojectDir,\n\t\t\tenvFile: envPath,\n\t\t\tapiKeyPreview: result.credentials.apiKeyPreview,\n\t\t\twebhookId: result.credentials.webhookId,\n\t\t\torganizationId: result.credentials.organizationId,\n\t\t\twebhookUrl: result.credentials.webhookUrl,\n\t\t\tmnemonic: updates.MDK_MNEMONIC,\n\t\t\tscaffoldedNextjs: Boolean(scaffoldSummary),\n\t\t};\n\n if (jsonMode) {\n console.log(\n JSON.stringify(\n {\n status: \"success\",\n data: {\n\t\t\t\t\t\t\tenvFile: envPath,\n\t\t\t\t\t\t\tapiKeyId: result.credentials.apiKeyId,\n\t\t\t\t\t\t\tapiKeyPreview: result.credentials.apiKeyPreview,\n\t\t\t\t\t\t\twebhookId: result.credentials.webhookId,\n\t\t\t\t\t\t\twebhookSecret: result.credentials.webhookSecret,\n\t\t\t\t\t\t\twebhookUrl: result.credentials.webhookUrl,\n\t\t\t\t\t\t\torganizationId: result.credentials.organizationId,\n\t\t\t\t\t\t\tmnemonic: updates.MDK_MNEMONIC,\n\t\t\t\t\t\t\tscaffoldedNextjs: Boolean(scaffoldSummary),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tnull,\n\t\t\t\t\t2,\n ),\n );\n } else {\n p.outro(\n [\n \"Authorized successfully!\",\n `• Credentials written to ${envPath}`,\n `• Webhook ID: ${result.credentials.webhookId}`,\n `• Organization: ${result.credentials.organizationId}`,\n flags.noClipboard\n ? \"Clipboard copy skipped (--no-clipboard).\"\n : \"Secrets copied to clipboard.\",\n \"Return to your project and continue development.\",\n ].join(\"\\n\"),\n );\n }\n\n return summary;\n\t} catch (error) {\n\t\tif (jsonMode) {\n\t\t\tconsole.error(\n\t\t\t\tJSON.stringify(\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tnull,\n\t\t\t\t\t2,\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tp.cancel(\n\t\t\t\terror instanceof Error ? error.message : `Unexpected error: ${error}`,\n\t\t\t);\n\t\t}\n\t\tprocess.exit(1);\n\t}\n}\n\nvoid main();\n","import path from \"node:path\";\n\nexport type EnvTargetResolution = {\n projectDir: string;\n envFile: string;\n providedExplicitly: boolean;\n};\n\nexport function resolveEnvTarget(options: {\n explicitTarget?: string;\n overrideTarget?: string;\n cwd: string;\n defaultFilename: string;\n}): EnvTargetResolution {\n const { explicitTarget, overrideTarget, cwd, defaultFilename } = options;\n const rawTarget = explicitTarget ?? overrideTarget ?? defaultFilename;\n const hasPathSeparator = rawTarget.includes(\"/\") || rawTarget.includes(\"\\\\\");\n\n let projectDir = cwd;\n let envFile = path.basename(rawTarget);\n let providedExplicitly = Boolean(explicitTarget);\n\n if (path.isAbsolute(rawTarget)) {\n projectDir = path.dirname(rawTarget);\n envFile = path.basename(rawTarget);\n providedExplicitly = true;\n } else if (hasPathSeparator) {\n const relativeDir = path.dirname(rawTarget);\n if (relativeDir && relativeDir !== \".\" && relativeDir !== \"\") {\n projectDir = path.resolve(cwd, relativeDir);\n envFile = path.basename(rawTarget);\n providedExplicitly = true;\n }\n }\n\n return {\n projectDir: path.resolve(projectDir),\n envFile,\n providedExplicitly,\n };\n}\n\nexport function deriveProjectName(input: string | undefined, webhookUrl: string): string {\n const trimmed = input?.trim();\n if (trimmed) {\n return trimmed;\n }\n return webhookUrl;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport semver from \"semver\";\n\nconst NEXT_CONFIG_BASENAMES = [\n\t\"next.config.js\",\n\t\"next.config.cjs\",\n\t\"next.config.mjs\",\n\t\"next.config.ts\",\n\t\"next.config.mts\",\n];\n\nconst APP_DIR_CANDIDATES = [\"app\", path.join(\"src\", \"app\")];\nconst PAGES_DIR_CANDIDATES = [\"pages\", path.join(\"src\", \"pages\")];\n\nexport type NextJsDetection = {\n\tfound: boolean;\n\trootDir?: string;\n\tnextConfigPath?: string;\n\tappDir?: string;\n\tpagesDir?: string;\n\tusesTypeScript: boolean;\n\tnextVersion?: string;\n\tversionIsSupported: boolean;\n};\n\nfunction fileExists(target: string): boolean {\n\ttry {\n\t\treturn fs.existsSync(target);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction readPackageJson(pkgPath: string): Record<string, unknown> | null {\n\ttry {\n\t\tconst content = fs.readFileSync(pkgPath, \"utf8\");\n\t\treturn JSON.parse(content) as Record<string, unknown>;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction hasNextDependency(pkg: Record<string, unknown>): boolean {\n\tconst deps = pkg.dependencies as Record<string, string> | undefined;\n\tconst devDeps = pkg.devDependencies as Record<string, string> | undefined;\n\treturn Boolean(deps?.next || devDeps?.next);\n}\n\nfunction extractNextVersion(pkg: Record<string, unknown>): string | undefined {\n\tconst deps = pkg.dependencies as Record<string, string> | undefined;\n\tconst devDeps = pkg.devDependencies as Record<string, string> | undefined;\n\treturn deps?.next ?? devDeps?.next ?? undefined;\n}\n\nfunction findNearestPackageJson(startDir: string): string | undefined {\n\tlet current = path.resolve(startDir);\n\twhile (true) {\n\t\tconst candidate = path.join(current, \"package.json\");\n\t\tif (fileExists(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t\tconst parent = path.dirname(current);\n\t\tif (parent === current) {\n\t\t\treturn undefined;\n\t\t}\n\t\tcurrent = parent;\n\t}\n}\n\nfunction findNextConfig(rootDir: string): string | undefined {\n\tfor (const basename of NEXT_CONFIG_BASENAMES) {\n\t\tconst candidate = path.join(rootDir, basename);\n\t\tif (fileExists(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function detectNextJsProject(startDir: string): NextJsDetection {\n\tconst pkgPath = findNearestPackageJson(startDir);\n\tconst rootDir = pkgPath ? path.dirname(pkgPath) : path.resolve(startDir);\n\tconst pkg = pkgPath ? readPackageJson(pkgPath) : null;\n\n\tconst hasNext = pkg ? hasNextDependency(pkg) : false;\n\tconst nextVersion = pkg ? extractNextVersion(pkg) : undefined;\n\tlet versionIsSupported = true;\n\n\tif (nextVersion) {\n\t\tconst minVersion = semver.minVersion(nextVersion);\n\t\tif (minVersion) {\n\t\t\tversionIsSupported = semver.gte(minVersion, \"15.0.0\");\n\t\t}\n\t}\n\n\tconst nextConfigPath = findNextConfig(rootDir);\n\tconst appDir =\n\t\tAPP_DIR_CANDIDATES.map((candidate) => path.join(rootDir, candidate)).find(\n\t\t\t(candidate) => fileExists(candidate),\n\t\t);\n\tconst pagesDir =\n\t\tPAGES_DIR_CANDIDATES.map((candidate) => path.join(rootDir, candidate)).find(\n\t\t\t(candidate) => fileExists(candidate),\n\t\t);\n\tconst usesTypeScript =\n\t\tfileExists(path.join(rootDir, \"tsconfig.json\")) ||\n\t\tfileExists(path.join(rootDir, \"next-env.d.ts\"));\n\n\tconst found = Boolean(hasNext || nextConfigPath || appDir || pagesDir);\n\n\treturn {\n\t\tfound,\n\t\trootDir: found ? rootDir : undefined,\n\t\tnextConfigPath,\n\t\tappDir,\n\t\tpagesDir,\n\t\tusesTypeScript,\n\t\tnextVersion,\n\t\tversionIsSupported,\n\t};\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport type { NextJsDetection } from \"../utils/nextjs-detector.js\";\nimport {\n\tdetectPackageManager,\n\thasDependency,\n\ttype PackageManager,\n} from \"../utils/package-manager.js\";\nimport {\n\treadFileSafe,\n\twriteFileIfAbsent,\n\twriteFileWithBackup,\n} from \"../utils/fs-utils.js\";\n\nconst templateRoot = new URL(\"../templates/nextjs/\", import.meta.url);\n\nfunction readTemplate(relativePath: string): string {\n\treturn fs.readFileSync(new URL(relativePath, templateRoot), \"utf8\");\n}\n\ntype ConfigResult =\n\t| { status: \"created\"; path: string; backupPath?: string }\n\t| { status: \"updated\"; path: string; backupPath?: string }\n\t| { status: \"skipped\"; path: string; reason: string };\n\nexport type ScaffoldSummary = {\n\trootDir: string;\n\tpackageManager: PackageManager;\n\tinstalledPackage: boolean;\n\tinstallSkipped: boolean;\n\taddedFiles: string[];\n\tskippedFiles: string[];\n\tconfig?: ConfigResult;\n\twarnings: string[];\n};\n\nfunction findExistingConfig(rootDir: string, preferred?: string): string | undefined {\n\tif (preferred && fs.existsSync(preferred)) return preferred;\n\tconst candidates = [\n\t\t\"next.config.js\",\n\t\t\"next.config.cjs\",\n\t\t\"next.config.mjs\",\n\t\t\"next.config.ts\",\n\t\t\"next.config.mts\",\n\t];\n\tfor (const candidate of candidates) {\n\t\tconst fullPath = path.join(rootDir, candidate);\n\t\tif (fs.existsSync(fullPath)) {\n\t\t\treturn fullPath;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nasync function installNextjsPackage(\n\trootDir: string,\n\tpackageManager: PackageManager,\n): Promise<{ installed: boolean; skipped: boolean }> {\n\tif (hasDependency(rootDir, \"@moneydevkit/nextjs\")) {\n\t\treturn { installed: false, skipped: true };\n\t}\n\n\tconst commandForPm: Record<PackageManager, [string, string[]]> = {\n\t\tpnpm: [\"pnpm\", [\"add\", \"@moneydevkit/nextjs\"]],\n\t\tyarn: [\"yarn\", [\"add\", \"@moneydevkit/nextjs\"]],\n\t\tnpm: [\"npm\", [\"install\", \"@moneydevkit/nextjs\"]],\n\t\tbun: [\"bun\", [\"add\", \"@moneydevkit/nextjs\"]],\n\t};\n\n\tconst [cmd, args] = commandForPm[packageManager];\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawn(cmd, args, { stdio: \"inherit\", cwd: rootDir });\n\t\tchild.on(\"exit\", (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\treject(new Error(`${cmd} ${args.join(\" \")} failed with code ${code}`));\n\t\t\t}\n\t\t});\n\t\tchild.on(\"error\", reject);\n\t});\n\n\treturn { installed: true, skipped: false };\n}\n\nfunction createAppRouteContent(isTypeScript: boolean): string {\n\treturn readTemplate(`app/api/mdk/route.${isTypeScript ? \"ts\" : \"js\"}`);\n}\n\nfunction createAppCheckoutPageContent(isTypeScript: boolean): string {\n\treturn readTemplate(\n\t\t`app/checkout/[id]/page.${isTypeScript ? \"tsx\" : \"js\"}`,\n\t);\n}\n\nfunction isTypeScriptConfig(configPath: string): boolean {\n\treturn configPath.endsWith(\".ts\") || configPath.endsWith(\".mts\");\n}\n\nfunction patchNextConfigTypes(source: string): string {\n\t// Strip NextConfig imports and swap annotations to the plugin's override type.\n\tlet patched = source.replace(\n\t\t/import\\s+type\\s+\\{\\s*NextConfig\\s*\\}\\s+from\\s+[\"']next[\"'];?\\s*\\n?/g,\n\t\t\"\",\n\t);\n\tpatched = patched.replace(/:\\s*NextConfig\\b/g, \": NextConfigOverrides\");\n\treturn patched;\n}\n\nfunction updateConfigFile(configPath: string): ConfigResult {\n\tconst isTs = isTypeScriptConfig(configPath);\n\tconst pluginImport = isTs\n\t\t? 'import withMdkCheckout, { type NextConfigOverrides } from \"@moneydevkit/nextjs/next-plugin\";'\n\t\t: 'import withMdkCheckout from \"@moneydevkit/nextjs/next-plugin\";';\n\n\tif (!fs.existsSync(configPath)) {\n\t\tconst content = [\n\t\t\tpluginImport,\n\t\t\t\"\",\n\t\t\t\"// Wrap your existing Next.js config with withMdkCheckout to enable Money Dev Kit.\",\n\t\t\t\"// Example: export default withMdkCheckout(yourConfig)\",\n\t\t\tisTs\n\t\t\t\t? \"const nextConfig: NextConfigOverrides = {};\"\n\t\t\t\t: \"const nextConfig = {};\",\n\t\t\t\"\",\n\t\t\t\"export default withMdkCheckout(nextConfig);\",\n\t\t\t\"\",\n\t\t].join(\"\\n\");\n\n\t\tconst writeResult = writeFileWithBackup(configPath, content);\n\t\treturn {\n\t\t\tstatus: \"created\",\n\t\t\tpath: configPath,\n\t\t\tbackupPath:\n\t\t\t\twriteResult.status === \"updated-with-backup\"\n\t\t\t\t\t? writeResult.backupPath\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n\n\tconst original = readFileSafe(configPath) ?? \"\";\n\n\tif (\n\t\toriginal.includes(\"@moneydevkit/nextjs/next-plugin\") ||\n\t\toriginal.includes(\"withMdkCheckout\")\n\t) {\n\t\treturn { status: \"skipped\", path: configPath, reason: \"already configured\" };\n\t}\n\n\tif (original.includes(\"module.exports\")) {\n\t\tconst re = /module\\.exports\\s*=\\s*(\\{[\\s\\S]*?\\});?/;\n\t\tconst match = original.match(re);\n\n\t\tif (match) {\n\t\t\tconst prefix =\n\t\t\t\t'const withMdkCheckout = require(\"@moneydevkit/nextjs/next-plugin\").default ?? require(\"@moneydevkit/nextjs/next-plugin\");\\n';\n\t\t\tconst replaced = original.replace(\n\t\t\t\tre,\n\t\t\t\t`module.exports = withMdkCheckout(${match[1]});`,\n\t\t\t);\n\t\t\tconst result = writeFileWithBackup(configPath, `${prefix}${replaced}`);\n\t\t\treturn {\n\t\t\t\tstatus: \"updated\",\n\t\t\t\tpath: configPath,\n\t\t\t\tbackupPath:\n\t\t\t\t\tresult.status === \"updated-with-backup\" ? result.backupPath : undefined,\n\t\t\t};\n\t\t}\n\t}\n\n\tif (original.includes(\"export default\")) {\n\t\tconst reDefaultObject = /export\\s+default\\s+(\\{[\\s\\S]*?\\});?/;\n\t\tconst objectMatch = original.match(reDefaultObject);\n\t\tif (objectMatch) {\n\t\t\tconst content = [\n\t\t\t\tpluginImport,\n\t\t\t\t\"\",\n\t\t\t\tisTs\n\t\t\t\t\t? \"const nextConfig: NextConfigOverrides = \" + objectMatch[1] + \";\"\n\t\t\t\t\t: \"const nextConfig = \" + objectMatch[1] + \";\",\n\t\t\t\t\"\",\n\t\t\t\t\"export default withMdkCheckout(nextConfig);\",\n\t\t\t\t\"\",\n\t\t\t].join(\"\\n\");\n\t\t\tconst writeResult = writeFileWithBackup(configPath, content);\n\t\t\treturn {\n\t\t\t\tstatus: \"updated\",\n\t\t\t\tpath: configPath,\n\t\t\t\tbackupPath:\n\t\t\t\t\twriteResult.status === \"updated-with-backup\"\n\t\t\t\t\t\t? writeResult.backupPath\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t}\n\n\t\tconst reNamed = /export\\s+default\\s+([a-zA-Z0-9_]+)\\s*;?/;\n\t\tconst namedMatch = original.match(reNamed);\n\t\tif (namedMatch) {\n\t\t\tconst name = namedMatch[1];\n\t\t\tconst patched =\n\t\t\t\tisTs && original.includes(\"NextConfig\")\n\t\t\t\t\t? patchNextConfigTypes(original)\n\t\t\t\t\t: original;\n\t\t\tconst lines = [\n\t\t\t\tpluginImport,\n\t\t\t\tpatched.replace(reNamed, `export default withMdkCheckout(${name});`),\n\t\t\t];\n\t\t\tconst writeResult = writeFileWithBackup(configPath, lines.join(\"\\n\"));\n\t\t\treturn {\n\t\t\t\tstatus: \"updated\",\n\t\t\t\tpath: configPath,\n\t\t\t\tbackupPath:\n\t\t\t\t\twriteResult.status === \"updated-with-backup\"\n\t\t\t\t\t\t? writeResult.backupPath\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn {\n\t\tstatus: \"skipped\",\n\t\tpath: configPath,\n\t\treason:\n\t\t\t\"unrecognized format; wrap your export with withMdkCheckout, e.g. export default withMdkCheckout(yourConfig)\",\n\t};\n}\n\nfunction scaffoldAppRouter(\n\tappDir: string,\n\tisTypeScript: boolean,\n): { added: string[]; skipped: string[] } {\n\tconst added: string[] = [];\n\tconst skipped: string[] = [];\n\n\tconst routePath = path.join(\n\t\tappDir,\n\t\t\"api\",\n\t\t\"mdk\",\n\t\t`route.${isTypeScript ? \"ts\" : \"js\"}`,\n\t);\n\tconst routeResult = writeFileIfAbsent(\n\t\troutePath,\n\t\tcreateAppRouteContent(isTypeScript),\n\t);\n\tif (routeResult.status === \"created\") {\n\t\tadded.push(routeResult.path);\n\t} else {\n\t\tskipped.push(routeResult.path);\n\t}\n\n\tconst pagePath = path.join(\n\t\tappDir,\n\t\t\"checkout\",\n\t\t\"[id]\",\n\t\t`page.${isTypeScript ? \"tsx\" : \"js\"}`,\n\t);\n\tconst pageResult = writeFileIfAbsent(\n\t\tpagePath,\n\t\tcreateAppCheckoutPageContent(isTypeScript),\n\t);\n\tif (pageResult.status === \"created\") {\n\t\tadded.push(pageResult.path);\n\t} else {\n\t\tskipped.push(pageResult.path);\n\t}\n\n\treturn { added, skipped };\n}\n\nexport async function scaffoldNextJs(options: {\n\tdetection: NextJsDetection;\n\tjsonMode: boolean;\n\tskipInstall?: boolean;\n}): Promise<ScaffoldSummary> {\n\tconst { detection, jsonMode, skipInstall } = options;\n\tif (!detection.rootDir) {\n\t\tthrow new Error(\"Next.js project root not found for scaffolding.\");\n\t}\n\n\tconst warnings: string[] = [];\n\tconst rootDir = detection.rootDir;\n\tconst packageManager = detectPackageManager(rootDir);\n\n\tconst installResult = skipInstall\n\t\t? { installed: false, skipped: true }\n\t\t: await installNextjsPackage(rootDir, packageManager);\n\n\tconst configPath =\n\t\tfindExistingConfig(rootDir, detection.nextConfigPath) ??\n\t\tpath.join(rootDir, \"next.config.js\");\n\tconst configResult = updateConfigFile(configPath);\n\n\tif (configResult.status === \"skipped\") {\n\t\twarnings.push(\n\t\t\t`Could not automatically update ${path.basename(configPath)} (${configResult.reason}). Please wrap your Next.js config with withMdkCheckout manually.`,\n\t\t);\n\t}\n\n\t// Always scaffold App Router files (works even in Pages Router projects since Next.js supports both)\n\tconst appDir = detection.appDir ?? path.join(rootDir, \"app\");\n\tconst fileResults = scaffoldAppRouter(appDir, detection.usesTypeScript);\n\n\tif (!detection.appDir) {\n\t\twarnings.push(\n\t\t\t\"No app/ directory detected; created App Router scaffolding in app/.\",\n\t\t);\n\t}\n\n\tif (!jsonMode) {\n\t\tif (!installResult.installed && installResult.skipped) {\n\t\t\tconsole.log(\"@moneydevkit/nextjs already present; skipping install.\");\n\t\t}\n\t}\n\n\treturn {\n\t\trootDir,\n\t\tpackageManager,\n\t\tinstalledPackage: installResult.installed,\n\t\tinstallSkipped: installResult.skipped,\n\t\taddedFiles: fileResults.added,\n\t\tskippedFiles: fileResults.skipped,\n\t\tconfig: configResult,\n\t\twarnings,\n\t};\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"yarn\" | \"npm\" | \"bun\";\n\nexport function detectPackageManager(rootDir: string): PackageManager {\n\tif (fs.existsSync(path.join(rootDir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n\tif (fs.existsSync(path.join(rootDir, \"yarn.lock\"))) return \"yarn\";\n\tif (fs.existsSync(path.join(rootDir, \"bun.lockb\"))) return \"bun\";\n\tif (fs.existsSync(path.join(rootDir, \"package-lock.json\"))) return \"npm\";\n\treturn \"npm\";\n}\n\nexport function hasDependency(rootDir: string, depName: string): boolean {\n\ttry {\n\t\tconst pkg = JSON.parse(fs.readFileSync(path.join(rootDir, \"package.json\"), \"utf8\")) as {\n\t\t\tdependencies?: Record<string, string>;\n\t\t\tdevDependencies?: Record<string, string>;\n\t\t};\n\t\treturn Boolean(pkg.dependencies?.[depName] || pkg.devDependencies?.[depName]);\n\t} catch {\n\t\treturn false;\n\t}\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport type WriteResult =\n\t| { status: \"created\"; path: string }\n\t| { status: \"updated-with-backup\"; path: string; backupPath: string }\n\t| { status: \"skipped-exists\"; path: string }\n\t| { status: \"skipped-different\"; path: string };\n\nexport function ensureDir(filePath: string) {\n\tconst dir = path.dirname(filePath);\n\tfs.mkdirSync(dir, { recursive: true });\n}\n\nexport function readFileSafe(filePath: string): string | null {\n\ttry {\n\t\treturn fs.readFileSync(filePath, \"utf8\");\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function writeFileIfAbsent(filePath: string, content: string): WriteResult {\n\tif (fs.existsSync(filePath)) {\n\t\tconst existing = readFileSafe(filePath);\n\t\tif (existing?.trim() === content.trim()) {\n\t\t\treturn { status: \"skipped-exists\", path: filePath };\n\t\t}\n\t\treturn { status: \"skipped-different\", path: filePath };\n\t}\n\tensureDir(filePath);\n\tfs.writeFileSync(filePath, content, \"utf8\");\n\treturn { status: \"created\", path: filePath };\n}\n\nexport function writeFileWithBackup(\n\tfilePath: string,\n\tcontent: string,\n): WriteResult {\n\tif (!fs.existsSync(filePath)) {\n\t\tensureDir(filePath);\n\t\tfs.writeFileSync(filePath, content, \"utf8\");\n\t\treturn { status: \"created\", path: filePath };\n\t}\n\n\tconst existing = readFileSafe(filePath) ?? \"\";\n\n\tif (existing.trim() === content.trim()) {\n\t\treturn { status: \"skipped-exists\", path: filePath };\n\t}\n\n\tconst backupPath = `${filePath}.mdk-backup`;\n\tfs.writeFileSync(backupPath, existing, \"utf8\");\n\tfs.writeFileSync(filePath, content, \"utf8\");\n\n\treturn { status: \"updated-with-backup\", path: filePath, backupPath };\n}\n"],"mappings":"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","names":["path","fs","path","fs","path","fs","path","fs","path","fs","path","path","fs","spinner","credentials","mnemonic","p"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { POST } from "@moneydevkit/nextjs/server/route";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { POST } from "@moneydevkit/nextjs/server/route";
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const repoRoot = path.resolve(__dirname, "../../../..");
|
|
9
|
+
const templateDir = path.resolve(__dirname, "nextjs/app");
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Extracts code blocks from README that have a file path comment on the first line.
|
|
13
|
+
* Returns a map of file path -> code content (without the comment line).
|
|
14
|
+
*/
|
|
15
|
+
function extractCodeBlocksFromReadme(readmePath: string): Map<string, string> {
|
|
16
|
+
const content = fs.readFileSync(readmePath, "utf8");
|
|
17
|
+
const blocks = new Map<string, string>();
|
|
18
|
+
|
|
19
|
+
// Match code blocks with ```js or ```jsx
|
|
20
|
+
const codeBlockRegex = /```(?:js|jsx|ts|tsx)\n(\/\/ (app\/[^\n]+)\n)([\s\S]*?)```/g;
|
|
21
|
+
let match;
|
|
22
|
+
|
|
23
|
+
while ((match = codeBlockRegex.exec(content)) !== null) {
|
|
24
|
+
const filePath = match[2]; // e.g., "app/api/mdk/route.js"
|
|
25
|
+
const code = match[3].trimEnd(); // Code without the comment line
|
|
26
|
+
blocks.set(filePath, code);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return blocks;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
test("templates match README code examples", () => {
|
|
33
|
+
const readmePath = path.join(repoRoot, "README.md");
|
|
34
|
+
const codeBlocks = extractCodeBlocksFromReadme(readmePath);
|
|
35
|
+
|
|
36
|
+
// Map README paths to template paths
|
|
37
|
+
const pathMappings: Record<string, string> = {
|
|
38
|
+
"app/api/mdk/route.js": path.join(templateDir, "api/mdk/route.js"),
|
|
39
|
+
"app/checkout/[id]/page.js": path.join(templateDir, "checkout/[id]/page.js"),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
for (const [readmePath, templatePath] of Object.entries(pathMappings)) {
|
|
43
|
+
const expectedCode = codeBlocks.get(readmePath);
|
|
44
|
+
if (!expectedCode) {
|
|
45
|
+
throw new Error(`README does not contain code block for ${readmePath}`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const actualCode = fs.readFileSync(templatePath, "utf8").trimEnd();
|
|
49
|
+
|
|
50
|
+
assert.equal(
|
|
51
|
+
actualCode,
|
|
52
|
+
expectedCode,
|
|
53
|
+
`Template ${readmePath} does not match README.\n\nExpected:\n${expectedCode}\n\nActual:\n${actualCode}`,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moneydevkit/create",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0-beta.0",
|
|
4
4
|
"description": "Interactive CLI for bootstrapping Money Dev Kit credentials.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"dist"
|
|
11
11
|
],
|
|
12
12
|
"scripts": {
|
|
13
|
-
"build": "tsup src/index.ts --dts --format esm,cjs --clean",
|
|
13
|
+
"build": "tsup src/index.ts --dts --format esm,cjs --clean && node scripts/copy-templates.mjs",
|
|
14
14
|
"dev": "tsup src/index.ts --watch --format esm,cjs --dts",
|
|
15
15
|
"lint": "eslint \"src/**/*.{ts,tsx}\"",
|
|
16
16
|
"typecheck": "tsc --noEmit",
|