@moneydevkit/create 0.3.3 → 0.4.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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.cjs.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":["import_node_path","import_node_fs","path","import_node_path","path","fs","semver","import_node_fs","import_node_path","import_node_fs","import_node_path","fs","path","import_node_fs","import_node_path","path","fs","fs","path","setCookieParser","minimist","path","fs","os","open","spinner","delay","credentials","mnemonic","generateBip39Mnemonic","clipboard","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":["import_node_path","import_node_fs","path","import_node_path","path","fs","semver","import_node_fs","import_node_path","import_node_fs","import_node_path","fs","path","import_node_fs","import_node_path","path","fs","fs","path","setCookieParser","minimist","path","fs","os","open","spinner","delay","credentials","mnemonic","generateBip39Mnemonic","clipboard","p"]}
|
package/dist/index.js
CHANGED
|
@@ -211,6 +211,10 @@ function writeFileWithBackup(filePath, content) {
|
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
// src/scaffold/nextjs.ts
|
|
214
|
+
var templateRoot = new URL("../templates/nextjs/", import.meta.url);
|
|
215
|
+
function readTemplate(relativePath) {
|
|
216
|
+
return fs4.readFileSync(new URL(relativePath, templateRoot), "utf8");
|
|
217
|
+
}
|
|
214
218
|
function findExistingConfig(rootDir, preferred) {
|
|
215
219
|
if (preferred && fs4.existsSync(preferred)) return preferred;
|
|
216
220
|
const candidates = [
|
|
@@ -253,138 +257,12 @@ async function installNextjsPackage(rootDir, packageManager) {
|
|
|
253
257
|
return { installed: true, skipped: false };
|
|
254
258
|
}
|
|
255
259
|
function createAppRouteContent(isTypeScript) {
|
|
256
|
-
|
|
257
|
-
if (ext === "ts") {
|
|
258
|
-
return 'export { POST } from "@moneydevkit/nextjs/server/route";\n';
|
|
259
|
-
}
|
|
260
|
-
return 'export { POST } from "@moneydevkit/nextjs/server/route";\n';
|
|
260
|
+
return readTemplate(`app/api/mdk/route.${isTypeScript ? "ts" : "js"}`);
|
|
261
261
|
}
|
|
262
262
|
function createAppCheckoutPageContent(isTypeScript) {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
"",
|
|
267
|
-
'import { Checkout } from "@moneydevkit/nextjs";',
|
|
268
|
-
"",
|
|
269
|
-
"type CheckoutPageProps = { params: { id: string } };",
|
|
270
|
-
"",
|
|
271
|
-
"export default function CheckoutPage({ params }: CheckoutPageProps) {",
|
|
272
|
-
" return <Checkout id={params.id} />;",
|
|
273
|
-
"}",
|
|
274
|
-
""
|
|
275
|
-
].join("\n");
|
|
276
|
-
}
|
|
277
|
-
return [
|
|
278
|
-
'"use client";',
|
|
279
|
-
"",
|
|
280
|
-
'import { Checkout } from "@moneydevkit/nextjs";',
|
|
281
|
-
"",
|
|
282
|
-
"export default function CheckoutPage({ params }) {",
|
|
283
|
-
" return <Checkout id={params.id} />;",
|
|
284
|
-
"}",
|
|
285
|
-
""
|
|
286
|
-
].join("\n");
|
|
287
|
-
}
|
|
288
|
-
function createPagesApiRouteContent(isTypeScript) {
|
|
289
|
-
if (isTypeScript) {
|
|
290
|
-
return [
|
|
291
|
-
'import type { NextApiRequest, NextApiResponse } from "next";',
|
|
292
|
-
'import { POST as appRouteHandler } from "@moneydevkit/nextjs/server/route";',
|
|
293
|
-
"",
|
|
294
|
-
"export default async function handler(req: NextApiRequest, res: NextApiResponse) {",
|
|
295
|
-
' const url = `http://${req.headers.host ?? "localhost"}${req.url ?? "/api/mdk"}`;',
|
|
296
|
-
" const request = new Request(url, {",
|
|
297
|
-
' method: req.method || "POST",',
|
|
298
|
-
" headers: req.headers as Record<string, string>,",
|
|
299
|
-
" body:",
|
|
300
|
-
' req.method === "GET" || req.method === "HEAD"',
|
|
301
|
-
" ? undefined",
|
|
302
|
-
' : typeof req.body === "string"',
|
|
303
|
-
" ? req.body",
|
|
304
|
-
" : JSON.stringify(req.body ?? {}),",
|
|
305
|
-
" });",
|
|
306
|
-
"",
|
|
307
|
-
" const response = await appRouteHandler(request);",
|
|
308
|
-
" res.status(response.status);",
|
|
309
|
-
" response.headers.forEach((value, key) => {",
|
|
310
|
-
" res.setHeader(key, value);",
|
|
311
|
-
" });",
|
|
312
|
-
" const body = await response.arrayBuffer();",
|
|
313
|
-
" res.send(Buffer.from(body));",
|
|
314
|
-
"}",
|
|
315
|
-
""
|
|
316
|
-
].join("\n");
|
|
317
|
-
}
|
|
318
|
-
return [
|
|
319
|
-
'import { POST as appRouteHandler } from "@moneydevkit/nextjs/server/route";',
|
|
320
|
-
"",
|
|
321
|
-
"export default async function handler(req, res) {",
|
|
322
|
-
' const url = `http://${req.headers.host ?? "localhost"}${req.url ?? "/api/mdk"}`;',
|
|
323
|
-
" const request = new Request(url, {",
|
|
324
|
-
' method: req.method || "POST",',
|
|
325
|
-
" headers: req.headers,",
|
|
326
|
-
" body:",
|
|
327
|
-
' req.method === "GET" || req.method === "HEAD"',
|
|
328
|
-
" ? undefined",
|
|
329
|
-
' : typeof req.body === "string"',
|
|
330
|
-
" ? req.body",
|
|
331
|
-
" : JSON.stringify(req.body ?? {}),",
|
|
332
|
-
" });",
|
|
333
|
-
"",
|
|
334
|
-
" const response = await appRouteHandler(request);",
|
|
335
|
-
" res.status(response.status);",
|
|
336
|
-
" response.headers.forEach((value, key) => {",
|
|
337
|
-
" res.setHeader(key, value);",
|
|
338
|
-
" });",
|
|
339
|
-
" const body = await response.arrayBuffer();",
|
|
340
|
-
" res.send(Buffer.from(body));",
|
|
341
|
-
"}",
|
|
342
|
-
""
|
|
343
|
-
].join("\n");
|
|
344
|
-
}
|
|
345
|
-
function createPagesCheckoutContent(isTypeScript) {
|
|
346
|
-
if (isTypeScript) {
|
|
347
|
-
return [
|
|
348
|
-
'"use client";',
|
|
349
|
-
"",
|
|
350
|
-
'import { useRouter } from "next/router";',
|
|
351
|
-
'import { Checkout } from "@moneydevkit/nextjs";',
|
|
352
|
-
"",
|
|
353
|
-
"export default function CheckoutPage() {",
|
|
354
|
-
" const router = useRouter();",
|
|
355
|
-
" const id = Array.isArray(router.query.id)",
|
|
356
|
-
" ? router.query.id[0]",
|
|
357
|
-
" : router.query.id;",
|
|
358
|
-
"",
|
|
359
|
-
" if (!id) {",
|
|
360
|
-
" return null;",
|
|
361
|
-
" }",
|
|
362
|
-
"",
|
|
363
|
-
" return <Checkout id={id as string} />;",
|
|
364
|
-
"}",
|
|
365
|
-
""
|
|
366
|
-
].join("\n");
|
|
367
|
-
}
|
|
368
|
-
return [
|
|
369
|
-
'"use client";',
|
|
370
|
-
"",
|
|
371
|
-
'import { useRouter } from "next/router";',
|
|
372
|
-
'import { Checkout } from "@moneydevkit/nextjs";',
|
|
373
|
-
"",
|
|
374
|
-
"export default function CheckoutPage() {",
|
|
375
|
-
" const router = useRouter();",
|
|
376
|
-
" const id = Array.isArray(router.query.id)",
|
|
377
|
-
" ? router.query.id[0]",
|
|
378
|
-
" : router.query.id;",
|
|
379
|
-
"",
|
|
380
|
-
" if (!id) {",
|
|
381
|
-
" return null;",
|
|
382
|
-
" }",
|
|
383
|
-
"",
|
|
384
|
-
" return <Checkout id={id} />;",
|
|
385
|
-
"}",
|
|
386
|
-
""
|
|
387
|
-
].join("\n");
|
|
263
|
+
return readTemplate(
|
|
264
|
+
`app/checkout/[id]/page.${isTypeScript ? "tsx" : "js"}`
|
|
265
|
+
);
|
|
388
266
|
}
|
|
389
267
|
function isTypeScriptConfig(configPath) {
|
|
390
268
|
return configPath.endsWith(".ts") || configPath.endsWith(".mts");
|
|
@@ -516,39 +394,6 @@ function scaffoldAppRouter(appDir, isTypeScript) {
|
|
|
516
394
|
}
|
|
517
395
|
return { added, skipped };
|
|
518
396
|
}
|
|
519
|
-
function scaffoldPagesRouter(pagesDir, isTypeScript) {
|
|
520
|
-
const added = [];
|
|
521
|
-
const skipped = [];
|
|
522
|
-
const apiPath = path5.join(
|
|
523
|
-
pagesDir,
|
|
524
|
-
"api",
|
|
525
|
-
`mdk.${isTypeScript ? "ts" : "js"}`
|
|
526
|
-
);
|
|
527
|
-
const apiResult = writeFileIfAbsent(
|
|
528
|
-
apiPath,
|
|
529
|
-
createPagesApiRouteContent(isTypeScript)
|
|
530
|
-
);
|
|
531
|
-
if (apiResult.status === "created") {
|
|
532
|
-
added.push(apiResult.path);
|
|
533
|
-
} else {
|
|
534
|
-
skipped.push(apiResult.path);
|
|
535
|
-
}
|
|
536
|
-
const checkoutPath = path5.join(
|
|
537
|
-
pagesDir,
|
|
538
|
-
"checkout",
|
|
539
|
-
`[id].${isTypeScript ? "tsx" : "js"}`
|
|
540
|
-
);
|
|
541
|
-
const checkoutResult = writeFileIfAbsent(
|
|
542
|
-
checkoutPath,
|
|
543
|
-
createPagesCheckoutContent(isTypeScript)
|
|
544
|
-
);
|
|
545
|
-
if (checkoutResult.status === "created") {
|
|
546
|
-
added.push(checkoutResult.path);
|
|
547
|
-
} else {
|
|
548
|
-
skipped.push(checkoutResult.path);
|
|
549
|
-
}
|
|
550
|
-
return { added, skipped };
|
|
551
|
-
}
|
|
552
397
|
async function scaffoldNextJs(options) {
|
|
553
398
|
const { detection, jsonMode, skipInstall } = options;
|
|
554
399
|
if (!detection.rootDir) {
|
|
@@ -565,21 +410,11 @@ async function scaffoldNextJs(options) {
|
|
|
565
410
|
`Could not automatically update ${path5.basename(configPath)} (${configResult.reason}). Please wrap your Next.js config with withMdkCheckout manually.`
|
|
566
411
|
);
|
|
567
412
|
}
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
} else if (detection.pagesDir) {
|
|
572
|
-
fileResults = scaffoldPagesRouter(
|
|
573
|
-
detection.pagesDir,
|
|
574
|
-
detection.usesTypeScript
|
|
575
|
-
);
|
|
576
|
-
} else {
|
|
577
|
-
fileResults = scaffoldAppRouter(
|
|
578
|
-
path5.join(rootDir, "app"),
|
|
579
|
-
detection.usesTypeScript
|
|
580
|
-
);
|
|
413
|
+
const appDir = detection.appDir ?? path5.join(rootDir, "app");
|
|
414
|
+
const fileResults = scaffoldAppRouter(appDir, detection.usesTypeScript);
|
|
415
|
+
if (!detection.appDir) {
|
|
581
416
|
warnings.push(
|
|
582
|
-
"No app/
|
|
417
|
+
"No app/ directory detected; created App Router scaffolding in app/."
|
|
583
418
|
);
|
|
584
419
|
}
|
|
585
420
|
if (!jsonMode) {
|
|
@@ -783,7 +618,7 @@ async function runDeviceFlow(options) {
|
|
|
783
618
|
p.note(
|
|
784
619
|
[
|
|
785
620
|
`Device code: ${device.userCode}`,
|
|
786
|
-
`
|
|
621
|
+
`Domain: ${webhookUrl}`,
|
|
787
622
|
"Open the authorization page, click Authorize, then return to this terminal."
|
|
788
623
|
].join("\n"),
|
|
789
624
|
"Authorize this device"
|
|
@@ -939,7 +774,7 @@ async function main() {
|
|
|
939
774
|
}
|
|
940
775
|
while (!webhookUrl) {
|
|
941
776
|
const webhookInput = await p.text({
|
|
942
|
-
message: "
|
|
777
|
+
message: "Domain for your application",
|
|
943
778
|
initialValue: "https://",
|
|
944
779
|
placeholder: "https://yourapp.com",
|
|
945
780
|
validate: (value) => isValidHttpUrl(value?.trim()) ? void 0 : "Enter a valid http(s) URL (e.g. https://yourapp.com)"
|
|
@@ -1006,7 +841,6 @@ async function main() {
|
|
|
1006
841
|
});
|
|
1007
842
|
const updates = {
|
|
1008
843
|
MDK_ACCESS_TOKEN: result.credentials.apiKey,
|
|
1009
|
-
MDK_WEBHOOK_SECRET: result.credentials.webhookSecret,
|
|
1010
844
|
MDK_MNEMONIC: result.mnemonic
|
|
1011
845
|
};
|
|
1012
846
|
ensureEnvFileExists(envPath);
|
|
@@ -1027,7 +861,7 @@ async function main() {
|
|
|
1027
861
|
}
|
|
1028
862
|
if (!flags.noClipboard) {
|
|
1029
863
|
await clipboard.write(
|
|
1030
|
-
[`MDK_ACCESS_TOKEN=${updates.MDK_ACCESS_TOKEN}`, `
|
|
864
|
+
[`MDK_ACCESS_TOKEN=${updates.MDK_ACCESS_TOKEN}`, `MDK_MNEMONIC=${updates.MDK_MNEMONIC}`].join(
|
|
1031
865
|
"\n"
|
|
1032
866
|
)
|
|
1033
867
|
);
|