@usethrottle/cli 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -218,15 +218,15 @@ async function resolveApiKey(provided) {
218
218
  return res.apiKey;
219
219
  }
220
220
  function printConfig(cfg) {
221
- console.log(pc3.dim(" allowed_origins:"));
222
- if (cfg.allowed_origins.length === 0) {
221
+ console.log(pc3.dim(" allowedOrigins:"));
222
+ if (cfg.allowedOrigins.length === 0) {
223
223
  console.log(pc3.dim(" (none \u2014 embeds are disabled until you add an origin)"));
224
224
  } else {
225
- for (const o of cfg.allowed_origins) console.log(pc3.dim(` ${o}`));
225
+ for (const o of cfg.allowedOrigins) console.log(pc3.dim(` ${o}`));
226
226
  }
227
- console.log(pc3.dim(` primary_color: ${cfg.primary_color ?? "(unset)"}`));
228
- console.log(pc3.dim(` logo_url: ${cfg.logo_url ?? "(unset)"}`));
229
- console.log(pc3.dim(` merchant_name: ${cfg.merchant_name ?? "(unset)"}`));
227
+ console.log(pc3.dim(` primaryColor: ${cfg.primaryColor ?? "(unset)"}`));
228
+ console.log(pc3.dim(` logoUrl: ${cfg.logoUrl ?? "(unset)"}`));
229
+ console.log(pc3.dim(` merchantName: ${cfg.merchantName ?? "(unset)"}`));
230
230
  }
231
231
  async function embedConfigShow(options) {
232
232
  const apiKey = await resolveApiKey(options.apiKey);
@@ -251,11 +251,11 @@ async function embedConfigSet(options) {
251
251
  const apiKey = await resolveApiKey(options.apiKey);
252
252
  const body = {};
253
253
  if (options.origins) {
254
- body.allowed_origins = options.origins.split(",").map((s) => s.trim()).filter(Boolean);
254
+ body.allowedOrigins = options.origins.split(",").map((s) => s.trim()).filter(Boolean);
255
255
  }
256
- if (options.primary) body.primary_color = options.primary;
257
- if (options.logo) body.logo_url = options.logo;
258
- if (options.merchantName) body.merchant_name = options.merchantName;
256
+ if (options.primary) body.primaryColor = options.primary;
257
+ if (options.logo) body.logoUrl = options.logo;
258
+ if (options.merchantName) body.merchantName = options.merchantName;
259
259
  if (Object.keys(body).length === 0) {
260
260
  console.error(
261
261
  pc3.red("\u2717") + " No fields provided. Pass --origins, --primary, --logo, or --merchant-name."
@@ -401,9 +401,16 @@ function printBanner(opts) {
401
401
  `);
402
402
  }
403
403
 
404
+ // src/version.ts
405
+ import { readFileSync as readFileSync2 } from "fs";
406
+ import { fileURLToPath as fileURLToPath2 } from "url";
407
+ var pkg = JSON.parse(
408
+ readFileSync2(fileURLToPath2(new URL("../package.json", import.meta.url)), "utf8")
409
+ );
410
+ var CLI_VERSION = pkg.version;
411
+
404
412
  // src/index.ts
405
413
  var DEFAULT_API_URL = "https://api.usethrottle.dev";
406
- var CLI_VERSION = "1.0.1";
407
414
  initCliSentry();
408
415
  var args = process.argv.slice(2);
409
416
  var isHelpOrVersion = args.length === 0 || args.includes("--help") || args.includes("-h") || args.includes("--version") || args.includes("-V");
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/bc-connect.ts","../../errors/dist/index.js","../src/lib/throttle-api.ts","../src/commands/bc-disconnect.ts","../src/commands/embed-config.ts","../src/sentry.ts","../src/banner.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { bcConnect } from './commands/bc-connect.js';\nimport { bcDisconnect } from './commands/bc-disconnect.js';\nimport { embedConfigShow, embedConfigSet } from './commands/embed-config.js';\nimport { captureCliException, flushCliSentry, initCliSentry } from './sentry.js';\nimport { printBanner } from './banner.js';\n\nconst DEFAULT_API_URL = 'https://api.usethrottle.dev';\n\nconst CLI_VERSION = '1.0.1';\n\ninitCliSentry();\n\nconst args = process.argv.slice(2);\nconst isHelpOrVersion =\n args.length === 0 ||\n args.includes('--help') ||\n args.includes('-h') ||\n args.includes('--version') ||\n args.includes('-V');\n\nif (!isHelpOrVersion) {\n printBanner({ version: CLI_VERSION });\n}\n\nconst program = new Command();\n\nprogram.name('throttle').description('Throttle command-line tool').version(CLI_VERSION);\n\nprogram\n .command('bc-connect')\n .description('Connect a BigCommerce store to throttle')\n .option('--api <url>', 'Throttle API base URL', process.env.THROTTLE_API_URL ?? DEFAULT_API_URL)\n .option('--api-key <sk_*>', 'Throttle API key (else $THROTTLE_API_KEY else interactive prompt)')\n .option('--store-hash <hash>', 'BigCommerce store hash')\n .option('--access-token <token>', 'BigCommerce API token')\n .action(async (opts) => {\n await bcConnect({\n apiBaseUrl: opts.api,\n apiKey: opts.apiKey,\n storeHash: opts.storeHash,\n accessToken: opts.accessToken,\n });\n });\n\nprogram\n .command('bc-disconnect [connectionId]')\n .description('Disconnect a BigCommerce store from throttle')\n .option('--api <url>', 'Throttle API base URL', process.env.THROTTLE_API_URL ?? DEFAULT_API_URL)\n .option('--api-key <sk_*>', 'Throttle API key (else $THROTTLE_API_KEY else interactive prompt)')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (connectionId, opts) => {\n await bcDisconnect({\n apiBaseUrl: opts.api,\n apiKey: opts.apiKey,\n connectionId,\n yes: opts.yes,\n });\n });\n\nconst embedConfig = program\n .command('embed-config')\n .description('Manage embed allowlist + branding (origins permitted to host PaymentEmbed/CheckoutEmbed)');\n\nembedConfig\n .command('show')\n .description('Print the current embed config (allowlist + branding)')\n .option('--api <url>', 'Throttle API base URL', process.env.THROTTLE_API_URL ?? DEFAULT_API_URL)\n .option('--api-key <sk_*>', 'Throttle API key (else $THROTTLE_API_KEY else interactive prompt)')\n .action(async (opts) => {\n await embedConfigShow({ apiBaseUrl: opts.api, apiKey: opts.apiKey });\n });\n\nembedConfig\n .command('set')\n .description('Update the embed config (any combination of --origins, --primary, --logo, --merchant-name)')\n .option('--api <url>', 'Throttle API base URL', process.env.THROTTLE_API_URL ?? DEFAULT_API_URL)\n .option('--api-key <sk_*>', 'Throttle API key (else $THROTTLE_API_KEY else interactive prompt)')\n .option(\n '--origins <list>',\n 'Comma-separated parent origins (e.g. https://shop.example.com,https://staging.example.com). No paths, no trailing slash, no wildcards.',\n )\n .option('--primary <hex>', 'Primary brand color in #rrggbb form')\n .option('--logo <url>', 'Logo URL (https)')\n .option('--merchant-name <name>', 'Merchant display name')\n .action(async (opts) => {\n await embedConfigSet({\n apiBaseUrl: opts.api,\n apiKey: opts.apiKey,\n origins: opts.origins,\n primary: opts.primary,\n logo: opts.logo,\n merchantName: opts.merchantName,\n });\n });\n\nprogram.parseAsync().catch(async (err) => {\n captureCliException(err);\n console.error(err);\n await flushCliSentry();\n process.exit(1);\n});\n","import prompts from 'prompts';\nimport pc from 'picocolors';\nimport { callThrottle, ThrottleApiError } from '../lib/throttle-api.js';\n\nexport interface BcConnectOptions {\n apiBaseUrl: string;\n apiKey?: string;\n storeHash?: string;\n accessToken?: string;\n yes?: boolean;\n}\n\ninterface ConnectResponse {\n connectionId: string;\n storeHash: string;\n webhookRegistrations: number;\n status: string;\n}\n\nexport async function bcConnect(options: BcConnectOptions): Promise<void> {\n const apiKey = options.apiKey ?? process.env.THROTTLE_API_KEY ?? (await promptApiKey());\n const storeHash = options.storeHash ?? (await promptStoreHash());\n const accessToken = options.accessToken ?? (await promptAccessToken());\n\n console.log();\n console.log(pc.dim('Connecting...'));\n\n try {\n const result = await callThrottle<ConnectResponse>(\n { apiBaseUrl: options.apiBaseUrl, apiKey },\n '/api/v1/bigcommerce/connect',\n {\n method: 'POST',\n body: JSON.stringify({ storeHash, accessToken }),\n },\n );\n\n console.log(pc.green('✓') + ` BigCommerce store ${pc.bold(storeHash)} connected`);\n console.log(pc.dim(` Connection id: ${result.connectionId}`));\n console.log(pc.dim(` Webhooks created: ${result.webhookRegistrations}`));\n console.log(pc.dim(` Status: ${result.status}`));\n console.log();\n console.log(pc.dim('Next steps:'));\n console.log(pc.dim(' • Test by placing a sandbox order — throttle should receive a webhook'));\n console.log(pc.dim(' • Run `throttle bc-disconnect` if you ever need to remove this connection'));\n } catch (err) {\n if (err instanceof ThrottleApiError) {\n console.error(pc.red('✗') + ` Failed (${err.code}): ${err.message}`);\n if (err.code === 'invalid_bc_credentials') {\n console.error(\n pc.dim(' Re-check your store hash and API token in your BigCommerce dashboard.'),\n );\n console.error(\n pc.dim(\n ' Store hash: settings → API accounts → store URL contains it (e.g. abc123 in stores/abc123/)',\n ),\n );\n console.error(\n pc.dim(\n ' API token: settings → advanced settings → API accounts → create V2/V3 API token',\n ),\n );\n }\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n}\n\nasync function promptApiKey(): Promise<string> {\n const res = await prompts(\n {\n type: 'password',\n name: 'apiKey',\n message: 'Throttle API key (sk_...)',\n validate: (v: string) =>\n v.startsWith('sk_') && v.length > 20\n ? true\n : 'Must look like sk_… (paste from https://checkout.usethrottle.dev/welcome)',\n },\n { onCancel: () => process.exit(1) },\n );\n return res.apiKey;\n}\n\nasync function promptStoreHash(): Promise<string> {\n const res = await prompts(\n {\n type: 'text',\n name: 'storeHash',\n message: 'BigCommerce store hash (e.g. abc123 from stores/abc123/...)',\n validate: (v: string) => (v.length >= 4 ? true : 'Must be at least 4 characters'),\n },\n { onCancel: () => process.exit(1) },\n );\n return res.storeHash.trim();\n}\n\nasync function promptAccessToken(): Promise<string> {\n console.log(\n pc.dim(\n ' Generate a token at: BigCommerce dashboard → Settings → API accounts → Create API account',\n ),\n );\n console.log(\n pc.dim(\n ' Required scopes: Orders, Customers, Carts, Webhooks (all \"Modify\"); Information & Products (Read-only)',\n ),\n );\n const res = await prompts(\n {\n type: 'password',\n name: 'accessToken',\n message: 'BigCommerce API token',\n validate: (v: string) =>\n v.length >= 10 ? true : 'Token looks too short — paste the full value',\n },\n { onCancel: () => process.exit(1) },\n );\n return res.accessToken;\n}\n","// src/index.ts\nvar ThrottleError = class extends Error {\n code;\n statusCode;\n details;\n body;\n constructor(args) {\n super(args.message);\n this.name = \"ThrottleError\";\n this.code = args.code;\n this.statusCode = args.statusCode;\n this.details = args.details;\n this.body = args.body;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n};\nfunction isThrottleError(value) {\n return value instanceof ThrottleError;\n}\nexport {\n ThrottleError,\n isThrottleError\n};\n","import { ThrottleError } from '@usethrottle/errors';\n\nexport interface ThrottleApiOptions {\n apiBaseUrl: string;\n apiKey: string;\n}\n\n/**\n * Thrown on a non-2xx response from the Throttle API.\n *\n * Extends the shared {@link ThrottleError} so it carries the same\n * `code` / `statusCode` shape as every other Throttle SDK.\n */\nexport class ThrottleApiError extends ThrottleError {\n constructor(code: string, message: string, statusCode: number) {\n super({ code, message, statusCode });\n this.name = 'ThrottleApiError';\n }\n}\n\nexport { ThrottleError, isThrottleError } from '@usethrottle/errors';\n\ninterface ApiResponse<T> {\n data?: T;\n error?: { code: string; message: string };\n}\n\nexport async function callThrottle<T>(\n opts: ThrottleApiOptions,\n path: string,\n init: RequestInit = {},\n): Promise<T> {\n const url = `${opts.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n const headers = {\n 'content-type': 'application/json',\n 'x-api-key': opts.apiKey,\n ...(init.headers ?? {}),\n };\n const res = await fetch(url, { ...init, headers });\n const text = await res.text();\n let body: ApiResponse<T> = {};\n try {\n body = text ? (JSON.parse(text) as ApiResponse<T>) : {};\n } catch {\n // non-JSON response (HTML error page, gateway timeout text, etc.)\n }\n\n if (!res.ok) {\n const code = body.error?.code ?? `http_${res.status}`;\n const message =\n body.error?.message ?? `Request failed (${res.status}): ${text.slice(0, 120)}`;\n throw new ThrottleApiError(code, message, res.status);\n }\n\n return (body.data ?? body) as T;\n}\n","import prompts from 'prompts';\nimport pc from 'picocolors';\nimport { callThrottle, ThrottleApiError } from '../lib/throttle-api.js';\n\nexport interface BcDisconnectOptions {\n apiBaseUrl: string;\n apiKey?: string;\n connectionId?: string;\n yes?: boolean;\n}\n\nexport async function bcDisconnect(options: BcDisconnectOptions): Promise<void> {\n const apiKey = options.apiKey ?? process.env.THROTTLE_API_KEY ?? (await promptApiKey());\n const connectionId = options.connectionId ?? (await promptConnectionId());\n\n if (!options.yes) {\n const confirm = await prompts(\n {\n type: 'confirm',\n name: 'ok',\n message: `Disconnect ${connectionId}? (will be hard-deleted in 90 days)`,\n initial: false,\n },\n { onCancel: () => process.exit(1) },\n );\n if (!confirm.ok) {\n console.log(pc.dim('Aborted.'));\n return;\n }\n }\n\n try {\n await callThrottle(\n { apiBaseUrl: options.apiBaseUrl, apiKey },\n `/api/v1/bigcommerce/connections/${encodeURIComponent(connectionId)}`,\n { method: 'DELETE' },\n );\n console.log(pc.green('✓') + ` Disconnected ${connectionId}`);\n } catch (err) {\n if (err instanceof ThrottleApiError) {\n console.error(pc.red('✗') + ` Failed (${err.code}): ${err.message}`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n}\n\nasync function promptApiKey(): Promise<string> {\n const res = await prompts(\n { type: 'password', name: 'apiKey', message: 'Throttle API key (sk_...)' },\n { onCancel: () => process.exit(1) },\n );\n return res.apiKey;\n}\n\nasync function promptConnectionId(): Promise<string> {\n const res = await prompts(\n { type: 'text', name: 'id', message: 'Connection id (conn_...)' },\n { onCancel: () => process.exit(1) },\n );\n return res.id.trim();\n}\n","import prompts from 'prompts';\nimport pc from 'picocolors';\nimport { callThrottle, ThrottleApiError } from '../lib/throttle-api.js';\n\nexport interface EmbedConfigCommonOptions {\n apiBaseUrl: string;\n apiKey?: string;\n}\n\nexport interface EmbedConfigSetOptions extends EmbedConfigCommonOptions {\n origins?: string;\n primary?: string;\n logo?: string;\n merchantName?: string;\n}\n\ninterface EmbedConfigData {\n allowed_origins: string[];\n primary_color: string | null;\n logo_url: string | null;\n merchant_name: string | null;\n}\n\nasync function resolveApiKey(provided?: string): Promise<string> {\n if (provided) return provided;\n if (process.env.THROTTLE_API_KEY) return process.env.THROTTLE_API_KEY;\n const res = await prompts(\n {\n type: 'password',\n name: 'apiKey',\n message: 'Throttle API key (sk_...)',\n validate: (v: string) =>\n v.startsWith('sk_') && v.length > 20 ? true : 'Must look like sk_… (paste from your dashboard)',\n },\n { onCancel: () => process.exit(1) },\n );\n return res.apiKey;\n}\n\nfunction printConfig(cfg: EmbedConfigData) {\n console.log(pc.dim(' allowed_origins:'));\n if (cfg.allowed_origins.length === 0) {\n console.log(pc.dim(' (none — embeds are disabled until you add an origin)'));\n } else {\n for (const o of cfg.allowed_origins) console.log(pc.dim(` ${o}`));\n }\n console.log(pc.dim(` primary_color: ${cfg.primary_color ?? '(unset)'}`));\n console.log(pc.dim(` logo_url: ${cfg.logo_url ?? '(unset)'}`));\n console.log(pc.dim(` merchant_name: ${cfg.merchant_name ?? '(unset)'}`));\n}\n\nexport async function embedConfigShow(options: EmbedConfigCommonOptions): Promise<void> {\n const apiKey = await resolveApiKey(options.apiKey);\n try {\n const data = await callThrottle<EmbedConfigData>(\n { apiBaseUrl: options.apiBaseUrl, apiKey },\n '/api/v1/embed-config',\n { method: 'GET' },\n );\n console.log(pc.green('✓') + ' Current embed config');\n printConfig(data);\n } catch (err) {\n if (err instanceof ThrottleApiError) {\n console.error(pc.red('✗') + ` Failed (${err.code}): ${err.message}`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n}\n\nexport async function embedConfigSet(options: EmbedConfigSetOptions): Promise<void> {\n const apiKey = await resolveApiKey(options.apiKey);\n\n const body: Record<string, unknown> = {};\n if (options.origins) {\n body.allowed_origins = options.origins\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n if (options.primary) body.primary_color = options.primary;\n if (options.logo) body.logo_url = options.logo;\n if (options.merchantName) body.merchant_name = options.merchantName;\n\n if (Object.keys(body).length === 0) {\n console.error(\n pc.red('✗') + ' No fields provided. Pass --origins, --primary, --logo, or --merchant-name.',\n );\n process.exitCode = 1;\n return;\n }\n\n try {\n const data = await callThrottle<EmbedConfigData>(\n { apiBaseUrl: options.apiBaseUrl, apiKey },\n '/api/v1/embed-config',\n { method: 'PUT', body: JSON.stringify(body) },\n );\n console.log(pc.green('✓') + ' Embed config updated');\n printConfig(data);\n } catch (err) {\n if (err instanceof ThrottleApiError) {\n console.error(pc.red('✗') + ` Failed (${err.code}): ${err.message}`);\n if (err.code === 'invalid_origin') {\n console.error(\n pc.dim(\n ' Origins must be https://host[:port]. No paths, no trailing slash, no wildcards.',\n ),\n );\n }\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport * as Sentry from '@sentry/node';\nimport type { Event, NodeOptions } from '@sentry/node';\n\ntype Env = Record<string, string | undefined>;\ntype EventHeaders = NonNullable<Event['request']>['headers'];\n\nfunction normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nconst DEFAULT_CLI_DSN =\n 'https://519163f0134350c7b5845efee80f457c@o432365.ingest.us.sentry.io/4511401030516736';\n\nconst SENSITIVE_HEADER_KEYS = new Set([\n 'authorization',\n 'cookie',\n 'setcookie',\n 'xapikey',\n 'xthrottleapikey',\n]);\n\nconst SENSITIVE_EXTRA_KEYS = new Set([\n 'apikey',\n 'accesstoken',\n 'authorization',\n 'body',\n 'data',\n 'formdata',\n 'payload',\n 'rawbody',\n 'requestbody',\n 'token',\n]);\n\nfunction removeSensitiveKeys(\n value: Record<string, unknown> | undefined,\n sensitiveKeys: ReadonlySet<string>,\n): Record<string, unknown> | undefined {\n if (!value) return value;\n\n const keptEntries = Object.entries(value).filter(\n ([key]) => !sensitiveKeys.has(normalizeKey(key)),\n );\n return Object.fromEntries(keptEntries);\n}\n\nfunction isOptInValue(value: string | undefined): boolean {\n if (!value) return false;\n return ['1', 'true', 'yes', 'on'].includes(value.toLowerCase());\n}\n\nfunction readCliPackageRelease(): string | undefined {\n try {\n const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: string };\n return packageJson.version ? `@usethrottle/cli@${packageJson.version}` : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function isCliSentryEnabled(env: Env = process.env): boolean {\n return isOptInValue(env.THROTTLE_CLI_TELEMETRY) || isOptInValue(env.THROTTLE_CLI_SENTRY_ENABLED);\n}\n\nexport function scrubCliSentryEvent<T extends Event>(event: T): T {\n if (event.request) {\n delete event.request.data;\n delete event.request.cookies;\n event.request.headers = removeSensitiveKeys(\n event.request.headers as Record<string, unknown> | undefined,\n SENSITIVE_HEADER_KEYS,\n ) as EventHeaders;\n }\n\n if (event.extra) {\n event.extra = removeSensitiveKeys(event.extra, SENSITIVE_EXTRA_KEYS);\n }\n\n if (event.user) {\n event.user = event.user.id ? { id: event.user.id } : undefined;\n }\n\n return event;\n}\n\nexport function buildCliSentryOptions(env: Env = process.env): NodeOptions {\n const enabled = isCliSentryEnabled(env);\n\n return {\n dsn: enabled ? (env.THROTTLE_CLI_SENTRY_DSN ?? env.SENTRY_DSN ?? DEFAULT_CLI_DSN) : undefined,\n enabled,\n environment: env.SENTRY_ENVIRONMENT ?? env.NODE_ENV ?? 'production',\n release: env.SENTRY_RELEASE ?? env.THROTTLE_CLI_RELEASE ?? readCliPackageRelease(),\n sendDefaultPii: false,\n tracesSampleRate: 0,\n beforeSend: scrubCliSentryEvent,\n };\n}\n\nexport function initCliSentry(env: Env = process.env): void {\n if (!isCliSentryEnabled(env) || Sentry.isInitialized()) return;\n\n Sentry.init(buildCliSentryOptions(env));\n}\n\nexport function captureCliException(error: unknown): void {\n if (!Sentry.isInitialized()) return;\n Sentry.captureException(error);\n}\n\nexport async function flushCliSentry(timeout = 2000): Promise<void> {\n if (!Sentry.isInitialized()) return;\n await Sentry.flush(timeout);\n}\n","const BRAND_BLUE = '\\x1b[38;2;29;86;232m';\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\n\nconst ART = [\n ' ┓ ┓ ┓ ',\n ' ┓┣ ┓┏┓╋╋┃┏┓ ',\n ' ┗┛┛┗┛┗┗┗┗ ',\n].join('\\n');\n\nexport function printBanner(opts?: { version?: string }): void {\n if (process.env.THROTTLE_CLI_NO_BANNER === '1') return;\n if (!process.stdout.isTTY) return;\n const v = opts?.version ? `v${opts.version}` : '';\n process.stderr.write(`${BRAND_BLUE}${ART}${RESET}\\n`);\n process.stderr.write(`${BRAND_BLUE}▸${RESET} ${DIM}throttle CLI${v ? ' ' + v : ''} · docs https://docs.usethrottle.dev${RESET}\\n\\n`);\n}\n"],"mappings":"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","names":["args","init","prompts","pc","promptApiKey","prompts","pc","prompts","pc","prompts","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/bc-connect.ts","../../errors/dist/index.js","../src/lib/throttle-api.ts","../src/commands/bc-disconnect.ts","../src/commands/embed-config.ts","../src/sentry.ts","../src/banner.ts","../src/version.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { bcConnect } from './commands/bc-connect.js';\nimport { bcDisconnect } from './commands/bc-disconnect.js';\nimport { embedConfigShow, embedConfigSet } from './commands/embed-config.js';\nimport { captureCliException, flushCliSentry, initCliSentry } from './sentry.js';\nimport { printBanner } from './banner.js';\nimport { CLI_VERSION } from './version.js';\n\nconst DEFAULT_API_URL = 'https://api.usethrottle.dev';\n\ninitCliSentry();\n\nconst args = process.argv.slice(2);\nconst isHelpOrVersion =\n args.length === 0 ||\n args.includes('--help') ||\n args.includes('-h') ||\n args.includes('--version') ||\n args.includes('-V');\n\nif (!isHelpOrVersion) {\n printBanner({ version: CLI_VERSION });\n}\n\nconst program = new Command();\n\nprogram.name('throttle').description('Throttle command-line tool').version(CLI_VERSION);\n\nprogram\n .command('bc-connect')\n .description('Connect a BigCommerce store to throttle')\n .option('--api <url>', 'Throttle API base URL', process.env.THROTTLE_API_URL ?? DEFAULT_API_URL)\n .option('--api-key <sk_*>', 'Throttle API key (else $THROTTLE_API_KEY else interactive prompt)')\n .option('--store-hash <hash>', 'BigCommerce store hash')\n .option('--access-token <token>', 'BigCommerce API token')\n .action(async (opts) => {\n await bcConnect({\n apiBaseUrl: opts.api,\n apiKey: opts.apiKey,\n storeHash: opts.storeHash,\n accessToken: opts.accessToken,\n });\n });\n\nprogram\n .command('bc-disconnect [connectionId]')\n .description('Disconnect a BigCommerce store from throttle')\n .option('--api <url>', 'Throttle API base URL', process.env.THROTTLE_API_URL ?? DEFAULT_API_URL)\n .option('--api-key <sk_*>', 'Throttle API key (else $THROTTLE_API_KEY else interactive prompt)')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (connectionId, opts) => {\n await bcDisconnect({\n apiBaseUrl: opts.api,\n apiKey: opts.apiKey,\n connectionId,\n yes: opts.yes,\n });\n });\n\nconst embedConfig = program\n .command('embed-config')\n .description('Manage embed allowlist + branding (origins permitted to host PaymentEmbed/CheckoutEmbed)');\n\nembedConfig\n .command('show')\n .description('Print the current embed config (allowlist + branding)')\n .option('--api <url>', 'Throttle API base URL', process.env.THROTTLE_API_URL ?? DEFAULT_API_URL)\n .option('--api-key <sk_*>', 'Throttle API key (else $THROTTLE_API_KEY else interactive prompt)')\n .action(async (opts) => {\n await embedConfigShow({ apiBaseUrl: opts.api, apiKey: opts.apiKey });\n });\n\nembedConfig\n .command('set')\n .description('Update the embed config (any combination of --origins, --primary, --logo, --merchant-name)')\n .option('--api <url>', 'Throttle API base URL', process.env.THROTTLE_API_URL ?? DEFAULT_API_URL)\n .option('--api-key <sk_*>', 'Throttle API key (else $THROTTLE_API_KEY else interactive prompt)')\n .option(\n '--origins <list>',\n 'Comma-separated parent origins (e.g. https://shop.example.com,https://staging.example.com). No paths, no trailing slash, no wildcards.',\n )\n .option('--primary <hex>', 'Primary brand color in #rrggbb form')\n .option('--logo <url>', 'Logo URL (https)')\n .option('--merchant-name <name>', 'Merchant display name')\n .action(async (opts) => {\n await embedConfigSet({\n apiBaseUrl: opts.api,\n apiKey: opts.apiKey,\n origins: opts.origins,\n primary: opts.primary,\n logo: opts.logo,\n merchantName: opts.merchantName,\n });\n });\n\nprogram.parseAsync().catch(async (err) => {\n captureCliException(err);\n console.error(err);\n await flushCliSentry();\n process.exit(1);\n});\n","import prompts from 'prompts';\nimport pc from 'picocolors';\nimport { callThrottle, ThrottleApiError } from '../lib/throttle-api.js';\n\nexport interface BcConnectOptions {\n apiBaseUrl: string;\n apiKey?: string;\n storeHash?: string;\n accessToken?: string;\n yes?: boolean;\n}\n\ninterface ConnectResponse {\n connectionId: string;\n storeHash: string;\n webhookRegistrations: number;\n status: string;\n}\n\nexport async function bcConnect(options: BcConnectOptions): Promise<void> {\n const apiKey = options.apiKey ?? process.env.THROTTLE_API_KEY ?? (await promptApiKey());\n const storeHash = options.storeHash ?? (await promptStoreHash());\n const accessToken = options.accessToken ?? (await promptAccessToken());\n\n console.log();\n console.log(pc.dim('Connecting...'));\n\n try {\n const result = await callThrottle<ConnectResponse>(\n { apiBaseUrl: options.apiBaseUrl, apiKey },\n '/api/v1/bigcommerce/connect',\n {\n method: 'POST',\n body: JSON.stringify({ storeHash, accessToken }),\n },\n );\n\n console.log(pc.green('✓') + ` BigCommerce store ${pc.bold(storeHash)} connected`);\n console.log(pc.dim(` Connection id: ${result.connectionId}`));\n console.log(pc.dim(` Webhooks created: ${result.webhookRegistrations}`));\n console.log(pc.dim(` Status: ${result.status}`));\n console.log();\n console.log(pc.dim('Next steps:'));\n console.log(pc.dim(' • Test by placing a sandbox order — throttle should receive a webhook'));\n console.log(pc.dim(' • Run `throttle bc-disconnect` if you ever need to remove this connection'));\n } catch (err) {\n if (err instanceof ThrottleApiError) {\n console.error(pc.red('✗') + ` Failed (${err.code}): ${err.message}`);\n if (err.code === 'invalid_bc_credentials') {\n console.error(\n pc.dim(' Re-check your store hash and API token in your BigCommerce dashboard.'),\n );\n console.error(\n pc.dim(\n ' Store hash: settings → API accounts → store URL contains it (e.g. abc123 in stores/abc123/)',\n ),\n );\n console.error(\n pc.dim(\n ' API token: settings → advanced settings → API accounts → create V2/V3 API token',\n ),\n );\n }\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n}\n\nasync function promptApiKey(): Promise<string> {\n const res = await prompts(\n {\n type: 'password',\n name: 'apiKey',\n message: 'Throttle API key (sk_...)',\n validate: (v: string) =>\n v.startsWith('sk_') && v.length > 20\n ? true\n : 'Must look like sk_… (paste from https://checkout.usethrottle.dev/welcome)',\n },\n { onCancel: () => process.exit(1) },\n );\n return res.apiKey;\n}\n\nasync function promptStoreHash(): Promise<string> {\n const res = await prompts(\n {\n type: 'text',\n name: 'storeHash',\n message: 'BigCommerce store hash (e.g. abc123 from stores/abc123/...)',\n validate: (v: string) => (v.length >= 4 ? true : 'Must be at least 4 characters'),\n },\n { onCancel: () => process.exit(1) },\n );\n return res.storeHash.trim();\n}\n\nasync function promptAccessToken(): Promise<string> {\n console.log(\n pc.dim(\n ' Generate a token at: BigCommerce dashboard → Settings → API accounts → Create API account',\n ),\n );\n console.log(\n pc.dim(\n ' Required scopes: Orders, Customers, Carts, Webhooks (all \"Modify\"); Information & Products (Read-only)',\n ),\n );\n const res = await prompts(\n {\n type: 'password',\n name: 'accessToken',\n message: 'BigCommerce API token',\n validate: (v: string) =>\n v.length >= 10 ? true : 'Token looks too short — paste the full value',\n },\n { onCancel: () => process.exit(1) },\n );\n return res.accessToken;\n}\n","// src/index.ts\nvar ThrottleError = class extends Error {\n code;\n statusCode;\n details;\n body;\n constructor(args) {\n super(args.message);\n this.name = \"ThrottleError\";\n this.code = args.code;\n this.statusCode = args.statusCode;\n this.details = args.details;\n this.body = args.body;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n};\nfunction isThrottleError(value) {\n return value instanceof ThrottleError;\n}\nexport {\n ThrottleError,\n isThrottleError\n};\n","import { ThrottleError } from '@usethrottle/errors';\n\nexport interface ThrottleApiOptions {\n apiBaseUrl: string;\n apiKey: string;\n}\n\n/**\n * Thrown on a non-2xx response from the Throttle API.\n *\n * Extends the shared {@link ThrottleError} so it carries the same\n * `code` / `statusCode` shape as every other Throttle SDK.\n */\nexport class ThrottleApiError extends ThrottleError {\n constructor(code: string, message: string, statusCode: number) {\n super({ code, message, statusCode });\n this.name = 'ThrottleApiError';\n }\n}\n\nexport { ThrottleError, isThrottleError } from '@usethrottle/errors';\n\ninterface ApiResponse<T> {\n data?: T;\n error?: { code: string; message: string };\n}\n\nexport async function callThrottle<T>(\n opts: ThrottleApiOptions,\n path: string,\n init: RequestInit = {},\n): Promise<T> {\n const url = `${opts.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n const headers = {\n 'content-type': 'application/json',\n 'x-api-key': opts.apiKey,\n ...(init.headers ?? {}),\n };\n const res = await fetch(url, { ...init, headers });\n const text = await res.text();\n let body: ApiResponse<T> = {};\n try {\n body = text ? (JSON.parse(text) as ApiResponse<T>) : {};\n } catch {\n // non-JSON response (HTML error page, gateway timeout text, etc.)\n }\n\n if (!res.ok) {\n const code = body.error?.code ?? `http_${res.status}`;\n const message =\n body.error?.message ?? `Request failed (${res.status}): ${text.slice(0, 120)}`;\n throw new ThrottleApiError(code, message, res.status);\n }\n\n return (body.data ?? body) as T;\n}\n","import prompts from 'prompts';\nimport pc from 'picocolors';\nimport { callThrottle, ThrottleApiError } from '../lib/throttle-api.js';\n\nexport interface BcDisconnectOptions {\n apiBaseUrl: string;\n apiKey?: string;\n connectionId?: string;\n yes?: boolean;\n}\n\nexport async function bcDisconnect(options: BcDisconnectOptions): Promise<void> {\n const apiKey = options.apiKey ?? process.env.THROTTLE_API_KEY ?? (await promptApiKey());\n const connectionId = options.connectionId ?? (await promptConnectionId());\n\n if (!options.yes) {\n const confirm = await prompts(\n {\n type: 'confirm',\n name: 'ok',\n message: `Disconnect ${connectionId}? (will be hard-deleted in 90 days)`,\n initial: false,\n },\n { onCancel: () => process.exit(1) },\n );\n if (!confirm.ok) {\n console.log(pc.dim('Aborted.'));\n return;\n }\n }\n\n try {\n await callThrottle(\n { apiBaseUrl: options.apiBaseUrl, apiKey },\n `/api/v1/bigcommerce/connections/${encodeURIComponent(connectionId)}`,\n { method: 'DELETE' },\n );\n console.log(pc.green('✓') + ` Disconnected ${connectionId}`);\n } catch (err) {\n if (err instanceof ThrottleApiError) {\n console.error(pc.red('✗') + ` Failed (${err.code}): ${err.message}`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n}\n\nasync function promptApiKey(): Promise<string> {\n const res = await prompts(\n { type: 'password', name: 'apiKey', message: 'Throttle API key (sk_...)' },\n { onCancel: () => process.exit(1) },\n );\n return res.apiKey;\n}\n\nasync function promptConnectionId(): Promise<string> {\n const res = await prompts(\n { type: 'text', name: 'id', message: 'Connection id (conn_...)' },\n { onCancel: () => process.exit(1) },\n );\n return res.id.trim();\n}\n","import prompts from 'prompts';\nimport pc from 'picocolors';\nimport { callThrottle, ThrottleApiError } from '../lib/throttle-api.js';\n\nexport interface EmbedConfigCommonOptions {\n apiBaseUrl: string;\n apiKey?: string;\n}\n\nexport interface EmbedConfigSetOptions extends EmbedConfigCommonOptions {\n origins?: string;\n primary?: string;\n logo?: string;\n merchantName?: string;\n}\n\ninterface EmbedConfigData {\n allowedOrigins: string[];\n primaryColor: string | null;\n logoUrl: string | null;\n merchantName: string | null;\n}\n\nasync function resolveApiKey(provided?: string): Promise<string> {\n if (provided) return provided;\n if (process.env.THROTTLE_API_KEY) return process.env.THROTTLE_API_KEY;\n const res = await prompts(\n {\n type: 'password',\n name: 'apiKey',\n message: 'Throttle API key (sk_...)',\n validate: (v: string) =>\n v.startsWith('sk_') && v.length > 20 ? true : 'Must look like sk_… (paste from your dashboard)',\n },\n { onCancel: () => process.exit(1) },\n );\n return res.apiKey;\n}\n\nfunction printConfig(cfg: EmbedConfigData) {\n console.log(pc.dim(' allowedOrigins:'));\n if (cfg.allowedOrigins.length === 0) {\n console.log(pc.dim(' (none — embeds are disabled until you add an origin)'));\n } else {\n for (const o of cfg.allowedOrigins) console.log(pc.dim(` ${o}`));\n }\n console.log(pc.dim(` primaryColor: ${cfg.primaryColor ?? '(unset)'}`));\n console.log(pc.dim(` logoUrl: ${cfg.logoUrl ?? '(unset)'}`));\n console.log(pc.dim(` merchantName: ${cfg.merchantName ?? '(unset)'}`));\n}\n\nexport async function embedConfigShow(options: EmbedConfigCommonOptions): Promise<void> {\n const apiKey = await resolveApiKey(options.apiKey);\n try {\n const data = await callThrottle<EmbedConfigData>(\n { apiBaseUrl: options.apiBaseUrl, apiKey },\n '/api/v1/embed-config',\n { method: 'GET' },\n );\n console.log(pc.green('✓') + ' Current embed config');\n printConfig(data);\n } catch (err) {\n if (err instanceof ThrottleApiError) {\n console.error(pc.red('✗') + ` Failed (${err.code}): ${err.message}`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n}\n\nexport async function embedConfigSet(options: EmbedConfigSetOptions): Promise<void> {\n const apiKey = await resolveApiKey(options.apiKey);\n\n const body: Record<string, unknown> = {};\n if (options.origins) {\n body.allowedOrigins = options.origins\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n if (options.primary) body.primaryColor = options.primary;\n if (options.logo) body.logoUrl = options.logo;\n if (options.merchantName) body.merchantName = options.merchantName;\n\n if (Object.keys(body).length === 0) {\n console.error(\n pc.red('✗') + ' No fields provided. Pass --origins, --primary, --logo, or --merchant-name.',\n );\n process.exitCode = 1;\n return;\n }\n\n try {\n const data = await callThrottle<EmbedConfigData>(\n { apiBaseUrl: options.apiBaseUrl, apiKey },\n '/api/v1/embed-config',\n { method: 'PUT', body: JSON.stringify(body) },\n );\n console.log(pc.green('✓') + ' Embed config updated');\n printConfig(data);\n } catch (err) {\n if (err instanceof ThrottleApiError) {\n console.error(pc.red('✗') + ` Failed (${err.code}): ${err.message}`);\n if (err.code === 'invalid_origin') {\n console.error(\n pc.dim(\n ' Origins must be https://host[:port]. No paths, no trailing slash, no wildcards.',\n ),\n );\n }\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport * as Sentry from '@sentry/node';\nimport type { Event, NodeOptions } from '@sentry/node';\n\ntype Env = Record<string, string | undefined>;\ntype EventHeaders = NonNullable<Event['request']>['headers'];\n\nfunction normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nconst DEFAULT_CLI_DSN =\n 'https://519163f0134350c7b5845efee80f457c@o432365.ingest.us.sentry.io/4511401030516736';\n\nconst SENSITIVE_HEADER_KEYS = new Set([\n 'authorization',\n 'cookie',\n 'setcookie',\n 'xapikey',\n 'xthrottleapikey',\n]);\n\nconst SENSITIVE_EXTRA_KEYS = new Set([\n 'apikey',\n 'accesstoken',\n 'authorization',\n 'body',\n 'data',\n 'formdata',\n 'payload',\n 'rawbody',\n 'requestbody',\n 'token',\n]);\n\nfunction removeSensitiveKeys(\n value: Record<string, unknown> | undefined,\n sensitiveKeys: ReadonlySet<string>,\n): Record<string, unknown> | undefined {\n if (!value) return value;\n\n const keptEntries = Object.entries(value).filter(\n ([key]) => !sensitiveKeys.has(normalizeKey(key)),\n );\n return Object.fromEntries(keptEntries);\n}\n\nfunction isOptInValue(value: string | undefined): boolean {\n if (!value) return false;\n return ['1', 'true', 'yes', 'on'].includes(value.toLowerCase());\n}\n\nfunction readCliPackageRelease(): string | undefined {\n try {\n const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: string };\n return packageJson.version ? `@usethrottle/cli@${packageJson.version}` : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function isCliSentryEnabled(env: Env = process.env): boolean {\n return isOptInValue(env.THROTTLE_CLI_TELEMETRY) || isOptInValue(env.THROTTLE_CLI_SENTRY_ENABLED);\n}\n\nexport function scrubCliSentryEvent<T extends Event>(event: T): T {\n if (event.request) {\n delete event.request.data;\n delete event.request.cookies;\n event.request.headers = removeSensitiveKeys(\n event.request.headers as Record<string, unknown> | undefined,\n SENSITIVE_HEADER_KEYS,\n ) as EventHeaders;\n }\n\n if (event.extra) {\n event.extra = removeSensitiveKeys(event.extra, SENSITIVE_EXTRA_KEYS);\n }\n\n if (event.user) {\n event.user = event.user.id ? { id: event.user.id } : undefined;\n }\n\n return event;\n}\n\nexport function buildCliSentryOptions(env: Env = process.env): NodeOptions {\n const enabled = isCliSentryEnabled(env);\n\n return {\n dsn: enabled ? (env.THROTTLE_CLI_SENTRY_DSN ?? env.SENTRY_DSN ?? DEFAULT_CLI_DSN) : undefined,\n enabled,\n environment: env.SENTRY_ENVIRONMENT ?? env.NODE_ENV ?? 'production',\n release: env.SENTRY_RELEASE ?? env.THROTTLE_CLI_RELEASE ?? readCliPackageRelease(),\n sendDefaultPii: false,\n tracesSampleRate: 0,\n beforeSend: scrubCliSentryEvent,\n };\n}\n\nexport function initCliSentry(env: Env = process.env): void {\n if (!isCliSentryEnabled(env) || Sentry.isInitialized()) return;\n\n Sentry.init(buildCliSentryOptions(env));\n}\n\nexport function captureCliException(error: unknown): void {\n if (!Sentry.isInitialized()) return;\n Sentry.captureException(error);\n}\n\nexport async function flushCliSentry(timeout = 2000): Promise<void> {\n if (!Sentry.isInitialized()) return;\n await Sentry.flush(timeout);\n}\n","const BRAND_BLUE = '\\x1b[38;2;29;86;232m';\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\n\nconst ART = [\n ' ┓ ┓ ┓ ',\n ' ┓┣ ┓┏┓╋╋┃┏┓ ',\n ' ┗┛┛┗┛┗┗┗┗ ',\n].join('\\n');\n\nexport function printBanner(opts?: { version?: string }): void {\n if (process.env.THROTTLE_CLI_NO_BANNER === '1') return;\n if (!process.stdout.isTTY) return;\n const v = opts?.version ? `v${opts.version}` : '';\n process.stderr.write(`${BRAND_BLUE}${ART}${RESET}\\n`);\n process.stderr.write(`${BRAND_BLUE}▸${RESET} ${DIM}throttle CLI${v ? ' ' + v : ''} · docs https://docs.usethrottle.dev${RESET}\\n\\n`);\n}\n","import { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\n\n// Read the version from package.json at runtime, resolved relative to this\n// module, so the binary's reported version always matches the published\n// package and can never drift from a hardcoded constant.\n// - bundled: dist/cli.js -> ../package.json = packages/cli/package.json\n// - vitest: src/version.ts -> ../package.json = packages/cli/package.json\nconst pkg = JSON.parse(\n readFileSync(fileURLToPath(new URL('../package.json', import.meta.url)), 'utf8'),\n) as { version: string };\n\nexport const CLI_VERSION: string = pkg.version;\n"],"mappings":"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","names":["args","init","prompts","pc","promptApiKey","prompts","pc","prompts","pc","prompts","pc","readFileSync","fileURLToPath"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usethrottle/cli",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Throttle command-line tool — connect your BigCommerce store, manage embed config, manage your account",
5
5
  "type": "module",
6
6
  "bin": {