@moneydevkit/create 0.3.0 → 0.3.2

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 CHANGED
@@ -2,22 +2,33 @@
2
2
 
3
3
  Developer onboarding CLI for Money Dev Kit. This package publishes the interactive `npx @moneydevkit/create` flow that provisions API keys, webhook secrets, and a Lightning mnemonic for local development.
4
4
 
5
- ## Local Development
5
+ ## Getting Started
6
+
7
+ 1. Run `npx @moneydevkit/create@latest` from the root of your project. The CLI walks you through login, webhook verification, and writes your secrets to `.env.local` (or a path you pick) while also copying them to the clipboard by default.
8
+ 2. Follow the prompts. When you reach your editor again, `MDK_ACCESS_TOKEN`, `MDK_WEBHOOK_SECRET`, and `MDK_MNEMONIC` are ready to go.
9
+
10
+ ### Customize the flow with flags
11
+
12
+ Pass any of the options from the table below to skip prompts or run non-interactively (add `--json` for machine-readable output). Example:
6
13
 
7
14
  ```bash
8
- npm install
9
- npm run dev # watch mode via tsup
10
- npm run build # produce dist/ bundle + types
11
- npm run run:local # talk to a dashboard at http://localhost:3900
15
+ npx @moneydevkit/create@latest \
16
+ --dir ./apps/storefront \
17
+ --env-target .env.production \
18
+ --webhook-url https://example.com/webhooks/mdk \
19
+ --project-name "Storefront" \
20
+ --no-open --no-clipboard
12
21
  ```
13
22
 
14
- ## Releasing to npm
23
+ ### Manual login (optional)
15
24
 
16
- 1. Bump the version in `packages/create/package.json` (for example: `npm version 0.2.0 --workspace packages/create --no-git-tag-version`) and commit the resulting `package-lock.json` change.
17
- 2. Push the commit, then create a GitHub release (or annotated tag) named `create-vX.Y.Z` that matches the new version string.
18
- 3. The `publish-create` workflow will detect that tag, run the build, and execute `npm publish packages/create --access public` using the repo’s `NPM_TOKEN`.
25
+ You can reuse an existing dashboard session instead of waiting for device auth:
19
26
 
20
- Once that workflow succeeds, `npx @moneydevkit/create` automatically downloads the freshly published build.
27
+ 1. Sign into https://moneydevkit.com in the browser and keep the tab open.
28
+ 2. Copy the `better-auth.session_token` cookie (`name=value`).
29
+ 3. Run `npx @moneydevkit/create@latest --manual-login "better-auth.session_token=..." --webhook-url https://yourapp.com --no-open` (combine with `--json` for scripts).
30
+
31
+ The CLI still creates a device code but immediately authorises it using your cookie, then prints the same outputs as the interactive flow.
21
32
 
22
33
  ## What the CLI does
23
34
 
@@ -26,28 +37,6 @@ Once that workflow succeeds, `npx @moneydevkit/create` automatically downloads t
26
37
  3. Polls until the dashboard authorises the device, then provisions an API key + webhook secret, and generates a mnemonic locally via BIP-39.
27
38
  4. Shows an env diff, writes `.env.local` (or a user-specified file), and optionally copies secrets to the clipboard.
28
39
 
29
- ### Running headlessly (for LLMs/automation)
30
-
31
- Manual mode still uses the device-auth flow—the only difference is that you reuse an *existing* dashboard session instead of waiting for a browser round trip. The steps are:
32
-
33
- 1. **Sign in via the dashboard UI** (browser) and keep the tab open.
34
- 2. **Copy the `better-auth.session_token` cookie** from your browser’s developer tools (Application → Storage → Cookies or the Network panel). Copy the full `name=value` pair.
35
- 3. **Pass that cookie to the CLI** using `--manual-login`. Example:
36
-
37
- ```bash
38
- SESSION_COOKIE='better-auth.session_token=eyJhbGciOiJI...'
39
-
40
- npx @moneydevkit/create \
41
- --base-url http://localhost:3900 \
42
- --dir /tmp/mdk-demo \
43
- --env-target .env.local \
44
- --webhook-url https://example.com \
45
- --manual-login "$SESSION_COOKIE" \
46
- --json --no-open --no-clipboard
47
- ```
48
-
49
- The CLI still requests a device code, immediately authorises it using the provided cookie, and emits a JSON payload containing the secrets plus the env-file path—no username/password ever touch the terminal.
50
-
51
40
  ## Flags
52
41
 
53
42
  | Flag | Description |
@@ -64,3 +53,20 @@ The CLI still requests a device code, immediately authorises it using the provid
64
53
  | `--force-new-webhook` | Force creation of a new webhook even if one already exists for the URL. |
65
54
 
66
55
  Manual login mode calls `POST /api/cli/device/authorize` with the supplied session cookie. When used with `--json`, pass `--webhook-url` to avoid interactive prompts.
56
+
57
+ ## Local Development
58
+
59
+ ```bash
60
+ npm install
61
+ npm run dev # watch mode via tsup
62
+ npm run build # produce dist/ bundle + types
63
+ npm run run:local # talk to a dashboard at http://localhost:3900
64
+ ```
65
+
66
+ ## Releasing to npm
67
+
68
+ 1. Bump the version in `packages/create/package.json` (for example: `npm version 0.2.0 --workspace packages/create --no-git-tag-version`) and commit the resulting `package-lock.json` change.
69
+ 2. Push the commit, then create a GitHub release (or annotated tag) named `create-vX.Y.Z` that matches the new version string.
70
+ 3. The `publish-create` workflow will detect that tag, run the build, and execute `npm publish packages/create --access public` using trusted publishing.
71
+
72
+ Once that workflow succeeds, `npx @moneydevkit/create@latest` automatically downloads the freshly published build.
package/dist/index.cjs CHANGED
@@ -185,6 +185,14 @@ function ensureEnvFileExists(filePath) {
185
185
  import_node_fs.default.writeFileSync(filePath, "", "utf8");
186
186
  }
187
187
  }
188
+ function resolveLocalEnvPath(options) {
189
+ const trimmed = options.organizationId?.trim();
190
+ if (!trimmed) {
191
+ return void 0;
192
+ }
193
+ const homeDir = import_node_os.default.homedir();
194
+ return import_node_path2.default.join(homeDir, ".mdk", trimmed, ".env");
195
+ }
188
196
  function isValidHttpUrl(value) {
189
197
  if (!value) return false;
190
198
  try {
@@ -444,6 +452,14 @@ async function main() {
444
452
  const existingEnv = readEnvFile(envPath);
445
453
  const preview = renderEnvPreview(existingEnv, updates);
446
454
  writeEnvFile(envPath, existingEnv, updates);
455
+ const localEnvPath = resolveLocalEnvPath({
456
+ organizationId: result.credentials.organizationId
457
+ });
458
+ if (localEnvPath) {
459
+ ensureEnvFileExists(localEnvPath);
460
+ const localEnv = readEnvFile(localEnvPath);
461
+ writeEnvFile(localEnvPath, localEnv, updates);
462
+ }
447
463
  if (!jsonMode) {
448
464
  p.note(preview, "Env file updated");
449
465
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/env-target.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\";\n\ntype Flags = {\n\tjson: boolean;\n\tnoClipboard: boolean;\n\tnoOpen: boolean;\n\tyes: 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\", \"yes\"],\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\tyes: 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\tyes: Boolean(result.yes),\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 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\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\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\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};\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},\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"],"mappings":"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","names":["import_node_path","path","setCookieParser","minimist","path","fs","os","open","spinner","delay","credentials","mnemonic","generateBip39Mnemonic","clipboard"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/env-target.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\";\n\ntype Flags = {\n\tjson: boolean;\n\tnoClipboard: boolean;\n\tnoOpen: boolean;\n\tyes: 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\", \"yes\"],\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\tyes: 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\tyes: Boolean(result.yes),\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}): string | undefined {\n\tconst trimmed = options.organizationId?.trim();\n\tif (!trimmed) {\n\t\treturn undefined;\n\t}\n\tconst homeDir = os.homedir();\n\treturn path.join(homeDir, \".mdk\", trimmed, \".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\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});\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\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};\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},\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"],"mappings":"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","names":["import_node_path","path","setCookieParser","minimist","path","fs","os","open","spinner","delay","credentials","mnemonic","generateBip39Mnemonic","clipboard"]}
package/dist/index.js CHANGED
@@ -162,6 +162,14 @@ function ensureEnvFileExists(filePath) {
162
162
  fs.writeFileSync(filePath, "", "utf8");
163
163
  }
164
164
  }
165
+ function resolveLocalEnvPath(options) {
166
+ const trimmed = options.organizationId?.trim();
167
+ if (!trimmed) {
168
+ return void 0;
169
+ }
170
+ const homeDir = os.homedir();
171
+ return path2.join(homeDir, ".mdk", trimmed, ".env");
172
+ }
165
173
  function isValidHttpUrl(value) {
166
174
  if (!value) return false;
167
175
  try {
@@ -421,6 +429,14 @@ async function main() {
421
429
  const existingEnv = readEnvFile(envPath);
422
430
  const preview = renderEnvPreview(existingEnv, updates);
423
431
  writeEnvFile(envPath, existingEnv, updates);
432
+ const localEnvPath = resolveLocalEnvPath({
433
+ organizationId: result.credentials.organizationId
434
+ });
435
+ if (localEnvPath) {
436
+ ensureEnvFileExists(localEnvPath);
437
+ const localEnv = readEnvFile(localEnvPath);
438
+ writeEnvFile(localEnvPath, localEnv, updates);
439
+ }
424
440
  if (!jsonMode) {
425
441
  p.note(preview, "Env file updated");
426
442
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/env-target.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\";\n\ntype Flags = {\n\tjson: boolean;\n\tnoClipboard: boolean;\n\tnoOpen: boolean;\n\tyes: 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\", \"yes\"],\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\tyes: 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\tyes: Boolean(result.yes),\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 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\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\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\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};\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},\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"],"mappings":"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","names":["path","path","spinner","credentials","mnemonic"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/env-target.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\";\n\ntype Flags = {\n\tjson: boolean;\n\tnoClipboard: boolean;\n\tnoOpen: boolean;\n\tyes: 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\", \"yes\"],\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\tyes: 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\tyes: Boolean(result.yes),\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}): string | undefined {\n\tconst trimmed = options.organizationId?.trim();\n\tif (!trimmed) {\n\t\treturn undefined;\n\t}\n\tconst homeDir = os.homedir();\n\treturn path.join(homeDir, \".mdk\", trimmed, \".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\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});\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\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};\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},\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"],"mappings":"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","names":["path","path","spinner","credentials","mnemonic"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moneydevkit/create",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Interactive CLI for bootstrapping Money Dev Kit credentials.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -50,9 +50,10 @@
50
50
  "license": "Apache-2.0",
51
51
  "repository": {
52
52
  "type": "git",
53
- "url": "git+https://github.com/moneydevkit/nextjs.git",
53
+ "url": "git+https://github.com/moneydevkit/mdk-checkout.git",
54
54
  "directory": "packages/create"
55
55
  },
56
+ "homepage": "https://github.com/moneydevkit/mdk-checkout/blob/main/packages/create/README.md",
56
57
  "publishConfig": {
57
58
  "access": "public"
58
59
  },