instant-cli 1.0.22 → 1.0.23-branch-cli-codex-update.25390498340.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/__tests__/authClientAddGoogle.test.ts +92 -0
  3. package/__tests__/authClientList.test.ts +90 -0
  4. package/__tests__/authClientUpdate.test.ts +583 -0
  5. package/__tests__/oauthMock.ts +9 -1
  6. package/__tests__/redirectUriPrompt.test.ts +26 -0
  7. package/dist/commands/auth/client/add.d.ts +1 -2
  8. package/dist/commands/auth/client/add.d.ts.map +1 -1
  9. package/dist/commands/auth/client/add.js +173 -276
  10. package/dist/commands/auth/client/add.js.map +1 -1
  11. package/dist/commands/auth/client/delete.d.ts +1 -2
  12. package/dist/commands/auth/client/delete.d.ts.map +1 -1
  13. package/dist/commands/auth/client/delete.js +8 -18
  14. package/dist/commands/auth/client/delete.js.map +1 -1
  15. package/dist/commands/auth/client/list.d.ts.map +1 -1
  16. package/dist/commands/auth/client/list.js +11 -2
  17. package/dist/commands/auth/client/list.js.map +1 -1
  18. package/dist/commands/auth/client/shared.d.ts +72 -0
  19. package/dist/commands/auth/client/shared.d.ts.map +1 -0
  20. package/dist/commands/auth/client/shared.js +145 -0
  21. package/dist/commands/auth/client/shared.js.map +1 -0
  22. package/dist/commands/auth/client/update.d.ts +8 -0
  23. package/dist/commands/auth/client/update.d.ts.map +1 -0
  24. package/dist/commands/auth/client/update.js +515 -0
  25. package/dist/commands/auth/client/update.js.map +1 -0
  26. package/dist/index.d.ts +5 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +60 -13
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/oauth.d.ts +114 -7
  31. package/dist/lib/oauth.d.ts.map +1 -1
  32. package/dist/lib/oauth.js +51 -1
  33. package/dist/lib/oauth.js.map +1 -1
  34. package/package.json +4 -4
  35. package/src/commands/auth/client/add.ts +251 -330
  36. package/src/commands/auth/client/delete.ts +8 -20
  37. package/src/commands/auth/client/list.ts +21 -2
  38. package/src/commands/auth/client/shared.ts +195 -0
  39. package/src/commands/auth/client/update.ts +853 -0
  40. package/src/index.ts +74 -13
  41. package/src/lib/oauth.ts +83 -1
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/add.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, Match, Option, Schema } from 'effect';\nimport { FileSystem } from '@effect/platform';\nimport type { authClientAddDef, OptsFromCommand } from '../../../index.ts';\nimport { BadArgsError } from '../../../errors.ts';\nimport { GlobalOpts } from '../../../context/globalOpts.ts';\nimport {\n optOrPrompt,\n optOrPromptBoolean,\n runUIEffect,\n stripFirstBlankLine,\n validateRequired,\n} from '../../../lib/ui.ts';\nimport {\n addOAuthClient,\n findName,\n getClientNameAndProvider,\n getOrCreateProvider,\n} from '../../../lib/oauth.ts';\nimport {\n DEFAULT_OAUTH_CALLBACK_URL,\n GOOGLE_AUTHORIZATION_ENDPOINT,\n GOOGLE_DISCOVERY_ENDPOINT,\n GOOGLE_TOKEN_ENDPOINT,\n APPLE_AUTHORIZATION_ENDPOINT,\n APPLE_DISCOVERY_ENDPOINT,\n APPLE_TOKEN_ENDPOINT,\n LINKEDIN_AUTHORIZATION_ENDPOINT,\n LINKEDIN_DISCOVERY_ENDPOINT,\n LINKEDIN_TOKEN_ENDPOINT,\n} from '@instantdb/platform';\nimport { UI } from '../../../ui/index.ts';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport { link } from '../../../logging.ts';\n\nexport const ClientTypeSchema = Schema.Literal(\n 'google',\n 'github',\n 'apple',\n 'linkedin',\n 'clerk',\n 'firebase',\n);\n\nconst GoogleAppTypeSchema = Schema.Literal(\n 'web',\n 'ios',\n 'android',\n 'button-for-web',\n);\n\nconst selectGoogleAppType = (value: unknown) =>\n Effect.gen(function* () {\n const { yes } = yield* GlobalOpts;\n\n return yield* Option.fromNullable(value).pipe(\n Effect.catchTag('NoSuchElementException', () => {\n if (yes) {\n return BadArgsError.make({\n message: `Missing required value for --app-type. Expected one of: ${GoogleAppTypeSchema.literals.join(', ')}`,\n });\n }\n\n return runUIEffect(\n new UI.Select({\n options: [\n {\n label:\n 'Web' + chalk.dim(' (Redirect Flows or Expo Auth Session)'),\n value: 'web',\n },\n { label: 'iOS', value: 'ios' },\n { label: 'Android', value: 'android' },\n { label: 'Google Button for Web', value: 'button-for-web' },\n ],\n promptText: 'Select a Google app type:',\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n defaultValue: 'web',\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n }),\n Effect.andThen((raw) => Schema.decodeUnknown(GoogleAppTypeSchema)(raw)),\n Effect.catchTag('ParseError', () =>\n BadArgsError.make({\n message:\n 'Invalid app-type, must be one of: web, ios, android, button-for-web',\n }),\n ),\n );\n });\n\nconst handleGoogleClient = Effect.fn(function* (opts: Record<string, unknown>) {\n // This one requires special logic for getting client name\n // because the suggested name includes the app type\n const appType = yield* selectGoogleAppType(opts['app-type']);\n const { auth, provider } = yield* getOrCreateProvider('google');\n const usedClientNames = new Set(\n (auth.oauth_clients ?? []).map((client) => client.client_name),\n );\n const suggestedClientName = findName(`google-${appType}`, usedClientNames);\n\n const clientName = yield* optOrPrompt(opts.name, {\n simpleName: '--name',\n required: true,\n skipIf: false,\n prompt: {\n prompt: 'Client Name:',\n defaultValue: suggestedClientName,\n placeholder: suggestedClientName,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([UI.modifiers.dimOnComplete]),\n },\n });\n\n if (usedClientNames.has(clientName || '')) {\n return yield* BadArgsError.make({\n message: `The unique name '${clientName}' is already in use.`,\n });\n }\n\n const clientId = yield* optOrPrompt(opts['client-id'], {\n simpleName: '--client-id',\n required: true,\n skipIf: false,\n prompt: {\n prompt: `Client ID: ${chalk.dim(`(from ${link('https://console.developers.google.com/apis/credentials')})`)}`,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n validate: validateRequired,\n },\n });\n\n const clientSecret = yield* optOrPrompt(opts['client-secret'], {\n required: appType === 'web',\n skipIf: appType !== 'web',\n simpleName: '--client-secret',\n prompt: {\n prompt: `Client Secret: ${chalk.dim(`(from ${link('https://console.developers.google.com/apis/credentials')})`)}`,\n validate: validateRequired,\n sensitive: true,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n prompt: {\n prompt: '',\n placeholder: 'https://yoursite.com/oauth/callback',\n modifyOutput: UI.modifiers.piped([\n (output, status) => {\n if (status === 'idle') {\n return (\n `\\nCustom redirect URI (optional):\n${chalk.dim('With a custom redirect URI, users will see \"Redirecting to yoursite.com...\" for a more branded experience.')}\n${chalk.dim(`Your URI must forward to ${DEFAULT_OAUTH_CALLBACK_URL} with all query parameters preserved.`)}\\n\\n` +\n stripFirstBlankLine(output)\n );\n }\n return `\\nCustom redirect URI (optional):\\n${stripFirstBlankLine(output)}`;\n },\n UI.modifiers.dimOnComplete,\n ]),\n },\n simpleName: '--custom-redirect-uri',\n skipIf: appType !== 'web',\n skipMessage: 'Provided custom redirect URI when not using web app type.',\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' }); // Should never reach this\n }\n const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId,\n clientSecret: clientSecret,\n authorizationEndpoint: GOOGLE_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: GOOGLE_TOKEN_ENDPOINT,\n discoveryEndpoint: GOOGLE_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n meta: {\n appType,\n skipNonceChecks: true,\n },\n });\n\n const redirectMessages: string[] = [];\n if (appType === 'web') {\n redirectMessages.push(\n chalk.bold(\n `\\nAdd this redirect URI in Google Console:\\n${redirectUri}\\n`,\n ),\n );\n if (customRedirectUri) {\n redirectMessages.push(\n `Your custom redirect must forward to ${chalk.bold(DEFAULT_OAUTH_CALLBACK_URL)} with all query parameters preserved.`,\n );\n redirectMessages.push(\n `You can test it by visiting: ${chalk.bold(redirectUri + '?test-redirect=true')}`,\n );\n }\n }\n\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client created: ${response.client.client_name}`,\n `App type: ${appType}`,\n `ID: ${response.client.id}`,\n `Google Client ID: ${response.client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleGithubClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'github',\n opts,\n );\n\n const clientId = yield* optOrPrompt(opts['client-id'], {\n simpleName: '--client-id',\n required: true,\n skipIf: false,\n prompt: {\n prompt: `Client ID ${chalk.dim(`(from ${link('https://github.com/settings/developers')})`)}`,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n validate: validateRequired,\n },\n });\n\n const clientSecret = yield* optOrPrompt(opts['client-secret'], {\n required: true,\n skipIf: false,\n simpleName: '--client-secret',\n prompt: {\n prompt: `Client Secret: ${chalk.dim(`(from ${link('https://github.com/settings/developers')})`)}`,\n validate: validateRequired,\n sensitive: true,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n simpleName: '--custom-redirect-uri',\n skipIf: false,\n prompt: {\n prompt: '',\n placeholder: 'https://yoursite.com/oauth/callback',\n modifyOutput: UI.modifiers.piped([\n (output, status) => {\n if (status === 'idle') {\n return (\n `\\nCustom redirect URI (optional):\n${chalk.dim('With a custom redirect URI, users will see \"Redirecting to yoursite.com...\" for a more branded experience.')}\n${chalk.dim(`Your URI must forward to ${DEFAULT_OAUTH_CALLBACK_URL} with all query parameters preserved.`)}\\n\\n` +\n stripFirstBlankLine(output)\n );\n }\n return `\\nCustom redirect URI (optional):\\n${stripFirstBlankLine(output)}`;\n },\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n\n const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n // The backend infers GitHub's authorization/token endpoints from\n // meta.providerName === 'github', so we don't pass them here.\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId,\n clientSecret,\n redirectTo: redirectUri,\n meta: { providerName: 'github' },\n });\n\n const redirectMessages: string[] = [\n chalk.bold(\n `\\nAdd this callback URL in your GitHub OAuth App settings:\\n${redirectUri}\\n`,\n ),\n ];\n if (customRedirectUri) {\n redirectMessages.push(\n `Your custom redirect must forward to ${chalk.bold(DEFAULT_OAUTH_CALLBACK_URL)} with all query parameters preserved.`,\n );\n redirectMessages.push(\n `You can test it by visiting: ${chalk.bold(redirectUri + '?test-redirect=true')}`,\n );\n }\n\n yield* Effect.log(\n boxen(\n [\n `GitHub OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `GitHub Client ID: ${response.client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleLinkedInClient = Effect.fn(function* (\n opts: Record<string, unknown>,\n) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'linkedin',\n opts,\n );\n\n const clientId = yield* optOrPrompt(opts['client-id'], {\n simpleName: '--client-id',\n required: true,\n skipIf: false,\n prompt: {\n prompt: `Client ID: ${chalk.dim(`(from ${link('https://www.linkedin.com/developers/apps')})`)}`,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n validate: validateRequired,\n },\n });\n\n const clientSecret = yield* optOrPrompt(opts['client-secret'], {\n required: true,\n skipIf: false,\n simpleName: '--client-secret',\n prompt: {\n prompt: `Client Secret: ${chalk.dim(`(from ${link('https://www.linkedin.com/developers/apps')})`)}`,\n validate: validateRequired,\n sensitive: true,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n simpleName: '--custom-redirect-uri',\n skipIf: false,\n prompt: {\n prompt: '',\n placeholder: 'https://yoursite.com/oauth/callback',\n modifyOutput: UI.modifiers.piped([\n (output, status) => {\n if (status === 'idle') {\n return (\n `\\nCustom redirect URI (optional):\n${chalk.dim('With a custom redirect URI, users will see \"Redirecting to yoursite.com...\" for a more branded experience.')}\n${chalk.dim(`Your URI must forward to ${DEFAULT_OAUTH_CALLBACK_URL} with all query parameters preserved.`)}\\n\\n` +\n stripFirstBlankLine(output)\n );\n }\n return `\\nCustom redirect URI (optional):\\n${stripFirstBlankLine(output)}`;\n },\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n\n const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId,\n clientSecret,\n authorizationEndpoint: LINKEDIN_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: LINKEDIN_TOKEN_ENDPOINT,\n discoveryEndpoint: LINKEDIN_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n });\n\n const redirectMessages: string[] = [\n chalk.bold(\n `\\nAdd this redirect URI in your LinkedIn app settings:\\n${redirectUri}\\n`,\n ),\n ];\n if (customRedirectUri) {\n redirectMessages.push(\n `Your custom redirect must forward to ${chalk.bold(DEFAULT_OAUTH_CALLBACK_URL)} with all query parameters preserved.`,\n );\n redirectMessages.push(\n `You can test it by visiting: ${chalk.bold(redirectUri + '?test-redirect=true')}`,\n );\n }\n\n yield* Effect.log(\n boxen(\n [\n `LinkedIn OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `LinkedIn Client ID: ${response.client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst readPrivateKeyFile = Effect.fn('readPrivateKeyFile')(function* (\n path: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n // Strip shell-escape backslashes so paths like \"file\\ (2).p8\" resolve correctly.\n // Only on POSIX — Windows uses backslashes as path separators.\n const normalizedPath =\n process.platform === 'win32' ? path : path.replace(/\\\\(.)/g, '$1');\n const contents = yield* fs.readFileString(normalizedPath, 'utf8').pipe(\n Effect.mapError(\n (e) =>\n new BadArgsError({\n message: `Could not read private key file at ${normalizedPath}: ${e.message}`,\n }),\n ),\n );\n\n const trimmed = contents.trim();\n if (!trimmed) {\n return yield* BadArgsError.make({\n message: `Private key file at ${normalizedPath} is empty.`,\n });\n }\n return trimmed;\n});\n\nconst handleAppleClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { yes } = yield* GlobalOpts;\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'apple',\n opts,\n );\n\n const servicesId = yield* optOrPrompt(opts['services-id'], {\n simpleName: '--services-id',\n required: true,\n skipIf: false,\n prompt: {\n prompt: `Services ID ${chalk.dim(`(from ${link('https://developer.apple.com/account/resources/identifiers/list/serviceId')})`)}`,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n validate: validateRequired,\n },\n });\n\n // If any web-flow flag is provided, enable web flow; otherwise ask\n // (non-interactively with --yes we default to native-only).\n const anyWebFlagProvided = Boolean(\n opts['team-id'] || opts['key-id'] || opts['private-key-file'],\n );\n\n const configureWeb = anyWebFlagProvided\n ? true\n : yes\n ? false\n : yield* optOrPromptBoolean(undefined, {\n simpleName: '--configure-web',\n required: false,\n skipIf: false,\n prompt: {\n promptText:\n 'Configure web redirect flow? ' +\n chalk.dim(\n '(requires Team ID, Key ID, and a .p8 private key from Apple)',\n ),\n defaultValue: false,\n },\n });\n\n const skipWeb = !configureWeb;\n const webSkipMessage =\n 'requires configuring the web redirect flow (also provide --team-id, --key-id, and --private-key-file).';\n\n const teamId = yield* optOrPrompt(opts['team-id'], {\n simpleName: '--team-id',\n required: true,\n skipIf: skipWeb,\n skipMessage: `--team-id ${webSkipMessage}`,\n prompt: {\n prompt: `Team ID ${chalk.dim(`(from ${link('https://developer.apple.com/account#MembershipDetailsCard')})`)}`,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n const keyId = yield* optOrPrompt(opts['key-id'], {\n simpleName: '--key-id',\n required: true,\n skipIf: skipWeb,\n skipMessage: `--key-id ${webSkipMessage}`,\n prompt: {\n prompt: `Key ID ${chalk.dim(`(from ${link('https://developer.apple.com/account/resources/authkeys/list')})`)}`,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n const privateKeyPath = yield* optOrPrompt(opts['private-key-file'], {\n simpleName: '--private-key-file',\n required: true,\n skipIf: skipWeb,\n skipMessage: `--private-key-file ${webSkipMessage}`,\n prompt: {\n prompt: `Path to .p8 private key file ${chalk.dim('(downloaded from Apple)')}`,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n const privateKey = privateKeyPath\n ? yield* readPrivateKeyFile(privateKeyPath)\n : undefined;\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n simpleName: '--custom-redirect-uri',\n skipIf: skipWeb,\n skipMessage: `--custom-redirect-uri ${webSkipMessage}`,\n prompt: {\n prompt: '',\n placeholder: 'https://yoursite.com/oauth/callback',\n modifyOutput: UI.modifiers.piped([\n (output, status) => {\n if (status === 'idle') {\n return (\n `\\nCustom redirect URI (optional):\n${chalk.dim('With a custom redirect URI, users will see \"Redirecting to yoursite.com...\" for a more branded experience.')}\n${chalk.dim(`Your URI must forward to ${DEFAULT_OAUTH_CALLBACK_URL} with all query parameters preserved.`)}\\n\\n` +\n stripFirstBlankLine(output)\n );\n }\n return `\\nCustom redirect URI (optional):\\n${stripFirstBlankLine(output)}`;\n },\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n\n const redirectUri = privateKey\n ? customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL\n : undefined;\n\n const meta: { teamId?: string; keyId?: string } = {};\n if (teamId !== undefined) meta.teamId = teamId;\n if (keyId !== undefined) meta.keyId = keyId;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId: servicesId,\n clientSecret: privateKey,\n authorizationEndpoint: APPLE_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: APPLE_TOKEN_ENDPOINT,\n discoveryEndpoint: APPLE_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n ...(Object.keys(meta).length > 0 ? { meta } : {}),\n });\n\n const summaryLines: string[] = [\n `Apple OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Services ID: ${response.client.client_id ?? servicesId}`,\n ];\n\n if (privateKey) {\n summaryLines.push(`Team ID: ${teamId}`);\n summaryLines.push(`Key ID: ${keyId}`);\n summaryLines.push(\n chalk.bold(\n `\\nAdd this return URL under your Services ID on ${link('https://developer.apple.com', 'developer.apple.com')}:\\n${redirectUri}\\n`,\n ),\n );\n if (customRedirectUri) {\n summaryLines.push(\n `Your custom redirect must forward to ${chalk.bold(DEFAULT_OAUTH_CALLBACK_URL)} with all query parameters preserved.`,\n );\n summaryLines.push(\n `You can test it by visiting: ${chalk.bold(redirectUri + '?test-redirect=true')}`,\n );\n }\n }\n yield* Effect.log(\n boxen(summaryLines.join('\\n'), {\n dimBorder: true,\n padding: { right: 1, left: 1 },\n }),\n );\n});\n\nconst handleClerkClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'clerk',\n opts,\n );\n\n const publishableKey = yield* optOrPrompt(opts['publishable-key'], {\n simpleName: '--publishable-key',\n required: true,\n skipIf: false,\n prompt: {\n prompt: `Clerk publishable key ${chalk.dim(`(from ${link('https://dashboard.clerk.com/last-active?path=api-keys')})`)}`,\n placeholder:\n 'pk_********************************************************',\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n validate: (val) => {\n if (!val) {\n return 'Publishable key is required';\n }\n if (!val.startsWith('pk_')) {\n return 'Invalid publishable key. It should start with \"pk_\".';\n }\n },\n },\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n if (!publishableKey) {\n return yield* BadArgsError.make({\n message: 'Publishable key is required.',\n });\n }\n\n const domain = domainFromClerkKey(publishableKey);\n if (!domain) {\n return yield* BadArgsError.make({\n message: 'Invalid publishable key. Could not extract domain.',\n });\n }\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n discoveryEndpoint: `https://${domain}/.well-known/openid-configuration`,\n meta: { clerkPublishableKey: publishableKey },\n });\n\n const clerkDomain = response.client.discovery_endpoint?.replace(\n '/.well-known/openid-configuration',\n '',\n );\n\n yield* Effect.log(\n boxen(\n [\n `Clerk OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Clerk Publishable Key: ${response.client.meta?.clerkPublishableKey}`,\n `Clerk Domain: ${clerkDomain}`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n\n yield* Effect.log(\n '\\nNavigate to your Clerk dashboard. On the Sessions page, click the Edit button in the Customize session token section.\\nEnsure your Claims field has the email claim:\\n' +\n boxen(\n `{\n \"email\": \"{{user.primary_email_address}}\",\n \"email_verified\": \"{{user.email_verified}}\"\n}`,\n { borderStyle: 'none' },\n ),\n );\n});\n\nconst handleFirebaseClient = Effect.fn(function* (\n opts: OptsFromCommand<typeof authClientAddDef> & Record<string, unknown>,\n) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'firebase',\n opts,\n );\n\n const firebaseProjectIdRegex = /^[a-z][a-z0-9-]{4,28}[a-z0-9]$/;\n const projectId = yield* optOrPrompt(opts['project-id'], {\n simpleName: '--project-id',\n required: true,\n skipIf: false,\n prompt: {\n prompt: `Firebase project ID: (From Project Settings page on ${link('https://console.firebase.google.com/')})`,\n placeholder: '',\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n validate: (val) => {\n if (!val) {\n return 'Project ID is required';\n }\n if (!firebaseProjectIdRegex.test(val)) {\n return 'Invalid Firebase project ID. It must be 6-30 characters, start with a lowercase letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen.';\n }\n },\n },\n });\n // typeguard\n if (!clientName || !projectId) {\n return yield* BadArgsError.make({\n message: 'Missing required arguments',\n });\n }\n if (!firebaseProjectIdRegex.test(projectId)) {\n return yield* BadArgsError.make({\n message:\n 'Invalid Firebase project ID. It must be 6-30 characters, start with a lowercase letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen.',\n });\n }\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n discoveryEndpoint: `https://securetoken.google.com/${encodeURIComponent(projectId)}/.well-known/openid-configuration`,\n });\n\n yield* Effect.log(\n boxen(\n [\n `Firebase OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Firebase Project ID: ${projectId}`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nexport const authClientAddCmd = Effect.fn(\n function* (\n opts: OptsFromCommand<typeof authClientAddDef> & Record<string, unknown>,\n ) {\n const { yes } = yield* GlobalOpts;\n if (!opts.type && yes) {\n return yield* BadArgsError.make({\n message: `Missing required value for --type. Expected one of: ${ClientTypeSchema.literals.join(', ')}`,\n });\n }\n const clientType = yield* Option.fromNullable(opts.type).pipe(\n Effect.catchTag('NoSuchElementException', () =>\n runUIEffect(\n new UI.Select({\n options: [\n { label: 'Google', value: 'google' },\n { label: 'GitHub', value: 'github' },\n { label: 'Apple', value: 'apple' },\n { label: 'LinkedIn', value: 'linkedin' },\n { label: 'Clerk', value: 'clerk' },\n { label: 'Firebase', value: 'firebase' },\n ],\n promptText: 'Select a client type:',\n modifyOutput: UI.modifiers.piped([UI.modifiers.dimOnComplete]),\n }),\n ),\n ),\n Effect.andThen((s) => Schema.decodeUnknown(ClientTypeSchema)(s)),\n Effect.catchTag('ParseError', () =>\n BadArgsError.make({\n message: `Invalid client type, must be one of: ${ClientTypeSchema.literals.join(', ')}`,\n }),\n ),\n );\n\n yield* Match.value(clientType).pipe(\n Match.withReturnType<Effect.Effect<void, any, any>>(),\n Match.when('google', () => handleGoogleClient(opts)),\n Match.when('github', () => handleGithubClient(opts)),\n Match.when('apple', () => handleAppleClient(opts)),\n Match.when('linkedin', () => handleLinkedInClient(opts)),\n Match.when('clerk', () => handleClerkClient(opts)),\n Match.when('firebase', () => handleFirebaseClient(opts)),\n Match.exhaustive,\n );\n },\n Effect.catchTag('BadArgsError', (e) =>\n Effect.gen(function* () {\n yield* Effect.logError(e.message);\n yield* Effect.log(\n chalk.dim(\n 'hint: run `instant-cli auth client add --help` for the list of available arguments',\n ),\n );\n }),\n ),\n);\n\nfunction domainFromClerkKey(key: string): string | null {\n try {\n const parts = key.split('_');\n const domainPartB64 = parts[parts.length - 1];\n const domainPart = base64Decode(domainPartB64);\n return domainPart.replace('$', '');\n } catch (e) {\n console.error('Error getting domain from clerk key', e);\n return null;\n }\n}\n\n// Base64 decode, switching to url-safe decode if we hit an error\n// Can't be sure which method Clerk uses because you can't generate\n// `+` or `/` with characters that go in a normal host. Urls with\n// chinese characters exist, they might encode to `+` or `/`, and\n// Clerk might support them, so we'll be safe and do both.\nfunction base64Decode(s: string) {\n try {\n return Buffer.from(s, 'base64').toString('utf-8');\n } catch (e) {\n return Buffer.from(s, 'base64url').toString('utf-8');\n }\n}\n"]}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/add.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, Match, Option, Schema } from 'effect';\nimport type { authClientAddDef, OptsFromCommand } from '../../../index.ts';\nimport { BadArgsError } from '../../../errors.ts';\nimport { GlobalOpts } from '../../../context/globalOpts.ts';\nimport {\n optOrPrompt,\n optOrPromptBoolean,\n runUIEffect,\n validateRequired,\n} from '../../../lib/ui.ts';\nimport {\n addOAuthClient,\n findName,\n getClientNameAndProvider,\n getOrCreateProvider,\n GoogleAppTypeSchema,\n OAuthClient,\n} from '../../../lib/oauth.ts';\nimport {\n DEFAULT_OAUTH_CALLBACK_URL,\n GOOGLE_AUTHORIZATION_ENDPOINT,\n GOOGLE_DISCOVERY_ENDPOINT,\n GOOGLE_TOKEN_ENDPOINT,\n APPLE_AUTHORIZATION_ENDPOINT,\n APPLE_DISCOVERY_ENDPOINT,\n APPLE_TOKEN_ENDPOINT,\n clerkDomainFromPublishableKey,\n LINKEDIN_AUTHORIZATION_ENDPOINT,\n LINKEDIN_DISCOVERY_ENDPOINT,\n LINKEDIN_TOKEN_ENDPOINT,\n} from '@instantdb/platform';\nimport { UI } from '../../../ui/index.ts';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport { link } from '../../../logging.ts';\nimport {\n appleKeyIdPrompt,\n applePrivateKeyFilePrompt,\n appleServicesIdPrompt,\n appleTeamIdPrompt,\n clerkPublishableKeyPrompt,\n clientIdPrompt,\n clientSecretPrompt,\n firebaseDiscoveryEndpoint,\n firebaseProjectIdPrompt,\n getFlag,\n hasAnyFlag,\n isTrueFlag,\n readPrivateKeyFile,\n redirectSetupMessages,\n redirectUriPrompt,\n validateFirebaseProjectId,\n} from './shared.ts';\n\nexport const ClientTypeSchema = Schema.Literal(\n 'google',\n 'github',\n 'apple',\n 'linkedin',\n 'clerk',\n 'firebase',\n);\n\nconst googleConsoleUrl =\n 'https://console.developers.google.com/apis/credentials';\nconst githubDeveloperUrl = 'https://github.com/settings/developers';\nconst linkedinDeveloperUrl = 'https://www.linkedin.com/developers/apps';\nconst optionalRedirectPrompt = redirectUriPrompt({\n heading: 'Custom redirect URI (optional):',\n});\n\nconst selectGoogleAppType = (value: unknown) =>\n Effect.gen(function* () {\n const { yes } = yield* GlobalOpts;\n\n return yield* Option.fromNullable(value).pipe(\n Effect.catchTag('NoSuchElementException', () => {\n if (yes) {\n return BadArgsError.make({\n message: `Missing required value for --app-type. Expected one of: ${GoogleAppTypeSchema.literals.join(', ')}`,\n });\n }\n\n return runUIEffect(\n new UI.Select({\n options: [\n {\n label:\n 'Web' + chalk.dim(' (Redirect Flows or Expo Auth Session)'),\n value: 'web',\n },\n { label: 'iOS', value: 'ios' },\n { label: 'Android', value: 'android' },\n { label: 'Google Button for Web', value: 'button-for-web' },\n ],\n promptText: 'Select a Google app type:',\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n defaultValue: 'web',\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n }),\n Effect.andThen((raw) => Schema.decodeUnknown(GoogleAppTypeSchema)(raw)),\n Effect.catchTag('ParseError', () =>\n BadArgsError.make({\n message:\n 'Invalid app-type, must be one of: web, ios, android, button-for-web',\n }),\n ),\n );\n });\n\nconst selectGoogleCredentialMode = Effect.fn(function* () {\n return yield* runUIEffect(\n new UI.Select({\n options: [\n {\n label:\n 'Use dev credentials' +\n chalk.dim(' (works on localhost and Expo, no Google setup)'),\n value: 'dev' as const,\n },\n {\n label:\n 'Use my own credentials' +\n chalk.dim(' (client ID and secret from Google Console)'),\n value: 'custom' as const,\n },\n ],\n promptText: 'Select Google credential mode:',\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n defaultValue: 'dev' as const,\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n});\n\nconst resolveGoogleCredentialMode = Effect.fn(function* ({\n appType,\n opts,\n}: {\n appType: typeof GoogleAppTypeSchema.Type;\n opts: Record<string, unknown>;\n}): Effect.fn.Return<'custom' | 'dev', BadArgsError, GlobalOpts> {\n const { yes } = yield* GlobalOpts;\n const devCredentialsFlag = isTrueFlag(getFlag(opts, 'dev-credentials'));\n const hasProvidedSomeCustomCredentials = hasAnyFlag(opts, [\n 'client-id',\n 'client-secret',\n 'custom-redirect-uri',\n ]);\n\n if (devCredentialsFlag && appType !== 'web') {\n return yield* BadArgsError.make({\n message:\n '--dev-credentials is only supported for --app-type web. Native Google clients need credentials from Google.',\n });\n }\n\n if (devCredentialsFlag && hasProvidedSomeCustomCredentials) {\n return yield* BadArgsError.make({\n message:\n '--dev-credentials cannot be combined with --client-id, --client-secret, or --custom-redirect-uri.',\n });\n }\n\n if (appType !== 'web') {\n return 'custom';\n }\n\n if (hasProvidedSomeCustomCredentials) {\n return 'custom';\n }\n\n if (devCredentialsFlag) {\n return 'dev';\n }\n\n if (yes) {\n return 'dev';\n }\n\n return yield* selectGoogleCredentialMode();\n});\n\nconst printGoogleDevCredentialsClient = Effect.fn(function* ({\n appType,\n client,\n}: {\n appType: typeof GoogleAppTypeSchema.Type;\n client: typeof OAuthClient.Type;\n}) {\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client created: ${client.client_name}`,\n `App type: ${appType}`,\n `Credentials: Instant dev credentials`,\n `ID: ${client.id}`,\n '',\n 'No Google Console setup required.',\n 'Works on localhost and Expo during development.',\n '',\n chalk.bold('Ready for production? Run:'),\n ` instant-cli auth client update --name ${client.client_name} --client-id <id> --client-secret <secret>`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst printGoogleCustomCredentialsClient = Effect.fn(function* ({\n appType,\n client,\n clientId,\n customRedirectUri,\n redirectUri,\n}: {\n appType: typeof GoogleAppTypeSchema.Type;\n client: typeof OAuthClient.Type;\n clientId: string | undefined;\n customRedirectUri: string | undefined;\n redirectUri: string | undefined;\n}) {\n const redirectMessages: string[] = [];\n if (appType === 'web' && redirectUri) {\n redirectMessages.push(\n ...redirectSetupMessages({\n prompt: 'Add this redirect URI in Google Console',\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n }),\n );\n }\n\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client created: ${client.client_name}`,\n `App type: ${appType}`,\n `ID: ${client.id}`,\n `Google Client ID: ${client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleGoogleClient = Effect.fn(function* (opts: Record<string, unknown>) {\n // This one requires special logic for getting client name\n // because the suggested name includes the app type\n const appType = yield* selectGoogleAppType(opts['app-type']);\n const credentialMode = yield* resolveGoogleCredentialMode({\n appType,\n opts,\n });\n const useSharedCredentials = credentialMode === 'dev';\n\n const { auth, provider } = yield* getOrCreateProvider('google');\n const usedClientNames = new Set(\n (auth.oauth_clients ?? []).map((client) => client.client_name),\n );\n const suggestedClientName = findName(`google-${appType}`, usedClientNames);\n\n const clientName = yield* optOrPrompt(opts.name, {\n simpleName: '--name',\n required: true,\n skipIf: false,\n prompt: {\n prompt: 'Client Name:',\n defaultValue: suggestedClientName,\n placeholder: suggestedClientName,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n if (usedClientNames.has(clientName || '')) {\n return yield* BadArgsError.make({\n message: `The unique name '${clientName}' is already in use.`,\n });\n }\n\n const clientId = yield* optOrPrompt(opts['client-id'], {\n simpleName: '--client-id',\n required: !useSharedCredentials,\n skipIf: useSharedCredentials,\n skipMessage:\n '--client-id is not compatible with --dev-credentials. Drop one or the other.',\n prompt: clientIdPrompt({ providerUrl: googleConsoleUrl }),\n });\n\n const usesCustomWebCredentials = !useSharedCredentials && appType === 'web';\n const clientSecret = yield* optOrPrompt(opts['client-secret'], {\n required: usesCustomWebCredentials,\n skipIf: !usesCustomWebCredentials,\n simpleName: '--client-secret',\n skipMessage: useSharedCredentials\n ? '--client-secret is not compatible with --dev-credentials. Drop one or the other.'\n : undefined,\n prompt: clientSecretPrompt({ providerUrl: googleConsoleUrl }),\n });\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n prompt: optionalRedirectPrompt,\n simpleName: '--custom-redirect-uri',\n skipIf: !usesCustomWebCredentials,\n skipMessage: useSharedCredentials\n ? '--custom-redirect-uri is not compatible with --dev-credentials.'\n : 'Provided custom redirect URI when not using web app type.',\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' }); // Should never reach this\n }\n const redirectUri = useSharedCredentials\n ? undefined\n : customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId: useSharedCredentials ? undefined : clientId,\n clientSecret: useSharedCredentials ? undefined : clientSecret,\n authorizationEndpoint: GOOGLE_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: GOOGLE_TOKEN_ENDPOINT,\n discoveryEndpoint: GOOGLE_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n meta: {\n appType,\n skipNonceChecks: true,\n },\n useSharedCredentials,\n });\n\n if (useSharedCredentials) {\n yield* printGoogleDevCredentialsClient({\n appType,\n client: response.client,\n });\n return;\n }\n\n yield* printGoogleCustomCredentialsClient({\n appType,\n client: response.client,\n clientId,\n customRedirectUri,\n redirectUri,\n });\n});\n\nconst handleGithubClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'github',\n opts,\n );\n\n const clientId = yield* optOrPrompt(opts['client-id'], {\n simpleName: '--client-id',\n required: true,\n skipIf: false,\n prompt: clientIdPrompt({ providerUrl: githubDeveloperUrl }),\n });\n\n const clientSecret = yield* optOrPrompt(opts['client-secret'], {\n required: true,\n skipIf: false,\n simpleName: '--client-secret',\n prompt: clientSecretPrompt({ providerUrl: githubDeveloperUrl }),\n });\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n simpleName: '--custom-redirect-uri',\n skipIf: false,\n prompt: optionalRedirectPrompt,\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n\n const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n // The backend infers GitHub's authorization/token endpoints from\n // meta.providerName === 'github', so we don't pass them here.\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId,\n clientSecret,\n redirectTo: redirectUri,\n meta: { providerName: 'github' },\n });\n\n const redirectMessages = redirectSetupMessages({\n prompt: 'Add this callback URL in your GitHub OAuth App settings',\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n });\n\n yield* Effect.log(\n boxen(\n [\n `GitHub OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `GitHub Client ID: ${response.client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleLinkedInClient = Effect.fn(function* (\n opts: Record<string, unknown>,\n) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'linkedin',\n opts,\n );\n\n const clientId = yield* optOrPrompt(opts['client-id'], {\n simpleName: '--client-id',\n required: true,\n skipIf: false,\n prompt: clientIdPrompt({ providerUrl: linkedinDeveloperUrl }),\n });\n\n const clientSecret = yield* optOrPrompt(opts['client-secret'], {\n required: true,\n skipIf: false,\n simpleName: '--client-secret',\n prompt: clientSecretPrompt({ providerUrl: linkedinDeveloperUrl }),\n });\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n simpleName: '--custom-redirect-uri',\n skipIf: false,\n prompt: optionalRedirectPrompt,\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n\n const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId,\n clientSecret,\n authorizationEndpoint: LINKEDIN_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: LINKEDIN_TOKEN_ENDPOINT,\n discoveryEndpoint: LINKEDIN_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n });\n\n const redirectMessages = redirectSetupMessages({\n prompt: 'Add this redirect URI in your LinkedIn app settings',\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n });\n\n yield* Effect.log(\n boxen(\n [\n `LinkedIn OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `LinkedIn Client ID: ${response.client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleAppleClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { yes } = yield* GlobalOpts;\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'apple',\n opts,\n );\n\n const servicesId = yield* optOrPrompt(opts['services-id'], {\n simpleName: '--services-id',\n required: true,\n skipIf: false,\n prompt: appleServicesIdPrompt({}),\n });\n\n // If any web-flow flag is provided, enable web flow; otherwise ask\n // (non-interactively with --yes we default to native-only).\n const anyWebFlagProvided = Boolean(\n opts['team-id'] || opts['key-id'] || opts['private-key-file'],\n );\n\n const configureWeb = anyWebFlagProvided\n ? true\n : yes\n ? false\n : yield* optOrPromptBoolean(undefined, {\n simpleName: '--configure-web',\n required: false,\n skipIf: false,\n prompt: {\n promptText:\n 'Configure web redirect flow? ' +\n chalk.dim(\n '(requires Team ID, Key ID, and a .p8 private key from Apple)',\n ),\n defaultValue: false,\n },\n });\n\n const skipWeb = !configureWeb;\n const webSkipMessage =\n 'requires configuring the web redirect flow (also provide --team-id, --key-id, and --private-key-file).';\n\n const teamId = yield* optOrPrompt(opts['team-id'], {\n simpleName: '--team-id',\n required: true,\n skipIf: skipWeb,\n skipMessage: `--team-id ${webSkipMessage}`,\n prompt: appleTeamIdPrompt({}),\n });\n\n const keyId = yield* optOrPrompt(opts['key-id'], {\n simpleName: '--key-id',\n required: true,\n skipIf: skipWeb,\n skipMessage: `--key-id ${webSkipMessage}`,\n prompt: appleKeyIdPrompt({}),\n });\n\n const privateKeyPath = yield* optOrPrompt(opts['private-key-file'], {\n simpleName: '--private-key-file',\n required: true,\n skipIf: skipWeb,\n skipMessage: `--private-key-file ${webSkipMessage}`,\n prompt: applePrivateKeyFilePrompt({}),\n });\n\n const privateKey = privateKeyPath\n ? yield* readPrivateKeyFile(privateKeyPath)\n : undefined;\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n simpleName: '--custom-redirect-uri',\n skipIf: skipWeb,\n skipMessage: `--custom-redirect-uri ${webSkipMessage}`,\n prompt: optionalRedirectPrompt,\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n\n const redirectUri = privateKey\n ? customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL\n : undefined;\n\n const meta: { teamId?: string; keyId?: string } = {};\n if (teamId !== undefined) meta.teamId = teamId;\n if (keyId !== undefined) meta.keyId = keyId;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId: servicesId,\n clientSecret: privateKey,\n authorizationEndpoint: APPLE_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: APPLE_TOKEN_ENDPOINT,\n discoveryEndpoint: APPLE_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n ...(Object.keys(meta).length > 0 ? { meta } : {}),\n });\n\n const summaryLines: string[] = [\n `Apple OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Services ID: ${response.client.client_id ?? servicesId}`,\n ];\n\n if (privateKey && redirectUri) {\n summaryLines.push(`Team ID: ${teamId}`);\n summaryLines.push(`Key ID: ${keyId}`);\n summaryLines.push(\n ...redirectSetupMessages({\n prompt: `Add this return URL under your Services ID on ${link('https://developer.apple.com', 'developer.apple.com')}`,\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n }),\n );\n }\n yield* Effect.log(\n boxen(summaryLines.join('\\n'), {\n dimBorder: true,\n padding: { right: 1, left: 1 },\n }),\n );\n});\n\nconst handleClerkClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'clerk',\n opts,\n );\n\n const publishableKey = yield* optOrPrompt(opts['publishable-key'], {\n simpleName: '--publishable-key',\n required: true,\n skipIf: false,\n prompt: clerkPublishableKeyPrompt({}),\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n if (!publishableKey) {\n return yield* BadArgsError.make({\n message: 'Publishable key is required.',\n });\n }\n\n const domain = clerkDomainFromPublishableKey(publishableKey);\n if (!domain) {\n return yield* BadArgsError.make({\n message: 'Invalid publishable key. Could not extract domain.',\n });\n }\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n discoveryEndpoint: `https://${domain}/.well-known/openid-configuration`,\n meta: { clerkPublishableKey: publishableKey },\n });\n\n const clerkDomain = response.client.discovery_endpoint?.replace(\n '/.well-known/openid-configuration',\n '',\n );\n\n yield* Effect.log(\n boxen(\n [\n `Clerk OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Clerk Publishable Key: ${response.client.meta?.clerkPublishableKey}`,\n `Clerk Domain: ${clerkDomain}`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n\n yield* Effect.log(\n '\\nNavigate to your Clerk dashboard. On the Sessions page, click the Edit button in the Customize session token section.\\nEnsure your Claims field has the email claim:\\n' +\n boxen(\n `{\n \"email\": \"{{user.primary_email_address}}\",\n \"email_verified\": \"{{user.email_verified}}\"\n}`,\n { borderStyle: 'none' },\n ),\n );\n});\n\nconst handleFirebaseClient = Effect.fn(function* (\n opts: OptsFromCommand<typeof authClientAddDef> & Record<string, unknown>,\n) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'firebase',\n opts,\n );\n\n const projectId = yield* optOrPrompt(opts['project-id'], {\n simpleName: '--project-id',\n required: true,\n skipIf: false,\n prompt: firebaseProjectIdPrompt({}),\n });\n // typeguard\n if (!clientName || !projectId) {\n return yield* BadArgsError.make({\n message: 'Missing required arguments',\n });\n }\n const validationError = validateFirebaseProjectId(projectId);\n if (validationError) {\n return yield* BadArgsError.make({ message: validationError });\n }\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n discoveryEndpoint: firebaseDiscoveryEndpoint(projectId),\n });\n\n yield* Effect.log(\n boxen(\n [\n `Firebase OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Firebase Project ID: ${projectId}`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nexport const authClientAddCmd = Effect.fn(\n function* (\n opts: OptsFromCommand<typeof authClientAddDef> & Record<string, unknown>,\n ) {\n const { yes } = yield* GlobalOpts;\n if (!opts.type && yes) {\n return yield* BadArgsError.make({\n message: `Missing required value for --type. Expected one of: ${ClientTypeSchema.literals.join(', ')}`,\n });\n }\n const clientType = yield* Option.fromNullable(opts.type).pipe(\n Effect.catchTag('NoSuchElementException', () =>\n runUIEffect(\n new UI.Select({\n options: [\n { label: 'Google', value: 'google' },\n { label: 'GitHub', value: 'github' },\n { label: 'Apple', value: 'apple' },\n { label: 'LinkedIn', value: 'linkedin' },\n { label: 'Clerk', value: 'clerk' },\n { label: 'Firebase', value: 'firebase' },\n ],\n promptText: 'Select a client type:',\n modifyOutput: UI.modifiers.piped([UI.modifiers.dimOnComplete]),\n }),\n ),\n ),\n Effect.andThen((s) => Schema.decodeUnknown(ClientTypeSchema)(s)),\n Effect.catchTag('ParseError', () =>\n BadArgsError.make({\n message: `Invalid client type, must be one of: ${ClientTypeSchema.literals.join(', ')}`,\n }),\n ),\n );\n\n yield* Match.value(clientType).pipe(\n Match.withReturnType<Effect.Effect<void, any, any>>(),\n Match.when('google', () => handleGoogleClient(opts)),\n Match.when('github', () => handleGithubClient(opts)),\n Match.when('apple', () => handleAppleClient(opts)),\n Match.when('linkedin', () => handleLinkedInClient(opts)),\n Match.when('clerk', () => handleClerkClient(opts)),\n Match.when('firebase', () => handleFirebaseClient(opts)),\n Match.exhaustive,\n );\n },\n Effect.catchTag('BadArgsError', (e) =>\n Effect.gen(function* () {\n yield* Effect.logError(e.message);\n yield* Effect.log(\n chalk.dim(\n 'hint: run `instant-cli auth client add --help` for the list of available arguments',\n ),\n );\n }),\n ),\n);\n"]}
@@ -1,12 +1,11 @@
1
1
  import { Effect } from 'effect';
2
2
  import { BadArgsError } from '../../../errors.ts';
3
3
  import { GlobalOpts } from '../../../context/globalOpts.ts';
4
- import { UIError } from '../../../lib/ui.ts';
5
4
  import { InstantHttpAuthed } from '../../../lib/http.ts';
6
5
  import { CurrentApp } from '../../../context/currentApp.ts';
7
6
  export declare const authClientDeleteCmd: (opts: {
8
7
  id?: string | undefined;
9
8
  name?: string | undefined;
10
9
  app?: string | undefined;
11
- }) => Effect.Effect<undefined, BadArgsError | UIError | import("../../../lib/http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("effect/ParseResult").ParseError | import("@effect/platform/HttpClientError").ResponseError, GlobalOpts | InstantHttpAuthed | CurrentApp>;
10
+ }) => Effect.Effect<undefined, BadArgsError | import("../../../lib/ui.ts").UIError | import("../../../lib/http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("effect/ParseResult").ParseError | import("@effect/platform/HttpClientError").ResponseError, GlobalOpts | InstantHttpAuthed | CurrentApp>;
12
11
  //# sourceMappingURL=delete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/client/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAe,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,iBAAiB,EAAe,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,eAAO,MAAM,mBAAmB;;;;8VAmD9B,CAAC"}
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/client/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAI5D,OAAO,EAAE,iBAAiB,EAAe,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,eAAO,MAAM,mBAAmB;;;;2XAuC9B,CAAC"}
@@ -1,20 +1,15 @@
1
1
  import { Effect } from 'effect';
2
2
  import { BadArgsError } from "../../../errors.js";
3
- import { getAppsAuth } from "../../../lib/oauth.js";
3
+ import { findClientByIdOrName, getAppsAuth } from "../../../lib/oauth.js";
4
4
  import { GlobalOpts } from "../../../context/globalOpts.js";
5
- import { runUIEffect, UIError } from "../../../lib/ui.js";
5
+ import { runUIEffect } from "../../../lib/ui.js";
6
6
  import { UI } from "../../../ui/index.js";
7
7
  import chalk from 'chalk';
8
8
  import { InstantHttpAuthed, withCommand } from "../../../lib/http.js";
9
9
  import { CurrentApp } from "../../../context/currentApp.js";
10
10
  export const authClientDeleteCmd = Effect.fn(function* (opts) {
11
- if (opts.id && opts.name) {
12
- return yield* BadArgsError.make({
13
- message: 'Cannot specify both --id and --name',
14
- });
15
- }
16
- const info = yield* getAppsAuth();
17
11
  if (!opts.id && !opts.name) {
12
+ const info = yield* getAppsAuth();
18
13
  // user must pick manually
19
14
  const { yes } = yield* GlobalOpts;
20
15
  if (yes) {
@@ -36,16 +31,11 @@ export const authClientDeleteCmd = Effect.fn(function* (opts) {
36
31
  }));
37
32
  yield* deleteOauthClient(picked.id);
38
33
  }
39
- if (opts.id) {
40
- yield* deleteOauthClient(opts.id);
41
- }
42
- if (opts.name) {
43
- const client = info.oauth_clients?.find((c) => c.client_name === opts.name);
44
- if (!client) {
45
- return yield* BadArgsError.make({
46
- message: `OAuth client not found: ${opts.name}`,
47
- });
48
- }
34
+ else {
35
+ const { client } = yield* findClientByIdOrName({
36
+ id: opts.id,
37
+ name: opts.name,
38
+ });
49
39
  yield* deleteOauthClient(client.id);
50
40
  }
51
41
  yield* Effect.log('Client Deleted!');
@@ -1 +1 @@
1
- {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/delete.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from 'effect';\nimport type { authClientDeleteDef, OptsFromCommand } from '../../../index.ts';\nimport { BadArgsError } from '../../../errors.ts';\nimport { getAppsAuth } from '../../../lib/oauth.ts';\nimport { GlobalOpts } from '../../../context/globalOpts.ts';\nimport { runUIEffect, UIError } from '../../../lib/ui.ts';\nimport { UI } from '../../../ui/index.ts';\nimport chalk from 'chalk';\nimport { InstantHttpAuthed, withCommand } from '../../../lib/http.ts';\nimport { CurrentApp } from '../../../context/currentApp.ts';\n\nexport const authClientDeleteCmd = Effect.fn(function* (\n opts: OptsFromCommand<typeof authClientDeleteDef>,\n) {\n if (opts.id && opts.name) {\n return yield* BadArgsError.make({\n message: 'Cannot specify both --id and --name',\n });\n }\n const info = yield* getAppsAuth();\n if (!opts.id && !opts.name) {\n // user must pick manually\n const { yes } = yield* GlobalOpts;\n if (yes) {\n return yield* BadArgsError.make({\n message: 'Must specify --id or --name',\n });\n }\n\n if (!info.oauth_clients) {\n yield* Effect.log('No OAuth clients found');\n return;\n }\n\n // Prompt user to select\n const picked = yield* runUIEffect(\n new UI.Select({\n options: info.oauth_clients.map((app) => ({\n label: app.client_name + chalk.dim(` (${app.id})`),\n value: app,\n })),\n promptText: 'Select a client to delete:',\n }),\n );\n\n yield* deleteOauthClient(picked.id);\n }\n\n if (opts.id) {\n yield* deleteOauthClient(opts.id);\n }\n if (opts.name) {\n const client = info.oauth_clients?.find((c) => c.client_name === opts.name);\n if (!client) {\n return yield* BadArgsError.make({\n message: `OAuth client not found: ${opts.name}`,\n });\n }\n yield* deleteOauthClient(client.id);\n }\n\n yield* Effect.log('Client Deleted!');\n});\n\nconst deleteOauthClient = Effect.fn(function* (clientDatabaseId: string) {\n const http = (yield* InstantHttpAuthed).pipe(\n withCommand('auth client delete'),\n );\n const { appId } = yield* CurrentApp;\n\n yield* http.del(`/dash/apps/${appId}/oauth_clients/${clientDatabaseId}`);\n});\n"]}
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EACpD,IAAiD;IAEjD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,0BAA0B;QAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;QAClC,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;gBAC9B,OAAO,EAAE,6BAA6B;aACvC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAC/B,IAAI,EAAE,CAAC,MAAM,CAAC;YACZ,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACxC,KAAK,EAAE,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC;gBAClD,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;YACH,UAAU,EAAE,4BAA4B;SACzC,CAAC,CACH,CAAC;QAEF,KAAK,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,oBAAoB,CAAC;YAC7C,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QACH,KAAK,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,gBAAwB;IACrE,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAC1C,WAAW,CAAC,oBAAoB,CAAC,CAClC,CAAC;IACF,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IAEpC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,KAAK,kBAAkB,gBAAgB,EAAE,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC","sourcesContent":["import { Effect } from 'effect';\nimport type { authClientDeleteDef, OptsFromCommand } from '../../../index.ts';\nimport { BadArgsError } from '../../../errors.ts';\nimport { findClientByIdOrName, getAppsAuth } from '../../../lib/oauth.ts';\nimport { GlobalOpts } from '../../../context/globalOpts.ts';\nimport { runUIEffect } from '../../../lib/ui.ts';\nimport { UI } from '../../../ui/index.ts';\nimport chalk from 'chalk';\nimport { InstantHttpAuthed, withCommand } from '../../../lib/http.ts';\nimport { CurrentApp } from '../../../context/currentApp.ts';\n\nexport const authClientDeleteCmd = Effect.fn(function* (\n opts: OptsFromCommand<typeof authClientDeleteDef>,\n) {\n if (!opts.id && !opts.name) {\n const info = yield* getAppsAuth();\n // user must pick manually\n const { yes } = yield* GlobalOpts;\n if (yes) {\n return yield* BadArgsError.make({\n message: 'Must specify --id or --name',\n });\n }\n\n if (!info.oauth_clients) {\n yield* Effect.log('No OAuth clients found');\n return;\n }\n\n // Prompt user to select\n const picked = yield* runUIEffect(\n new UI.Select({\n options: info.oauth_clients.map((app) => ({\n label: app.client_name + chalk.dim(` (${app.id})`),\n value: app,\n })),\n promptText: 'Select a client to delete:',\n }),\n );\n\n yield* deleteOauthClient(picked.id);\n } else {\n const { client } = yield* findClientByIdOrName({\n id: opts.id,\n name: opts.name,\n });\n yield* deleteOauthClient(client.id);\n }\n\n yield* Effect.log('Client Deleted!');\n});\n\nconst deleteOauthClient = Effect.fn(function* (clientDatabaseId: string) {\n const http = (yield* InstantHttpAuthed).pipe(\n withCommand('auth client delete'),\n );\n const { appId } = yield* CurrentApp;\n\n yield* http.del(`/dash/apps/${appId}/oauth_clients/${clientDatabaseId}`);\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/client/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAMhC,eAAO,MAAM,iBAAiB;;;2XAiC5B,CAAC"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/client/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAMhC,eAAO,MAAM,iBAAiB;;;2XAoD5B,CAAC"}
@@ -21,9 +21,18 @@ export const authClientListCmd = Effect.fn(function* (_opts) {
21
21
  const provider = providersById.get(client.provider_id);
22
22
  yield* Effect.log(chalk.cyan(client.client_name));
23
23
  yield* Effect.log(` Provider: ${provider?.provider_name ?? client.provider_id}`);
24
+ const clientAppType = client.meta?.appType;
25
+ if (clientAppType) {
26
+ yield* Effect.log(` App type: ${clientAppType}`);
27
+ }
28
+ yield* Effect.log(` Credentials: ${client.use_shared_credentials ? 'Instant dev credentials' : 'custom'}`);
24
29
  yield* Effect.log(` ID: ${client.id}`);
25
- yield* Effect.log(` Client id: ${formatValue(client.client_id)}`);
26
- yield* Effect.log(` Redirect URL: ${formatValue(client.redirect_to)}`);
30
+ yield* Effect.log(` Client id: ${client.use_shared_credentials
31
+ ? 'managed by Instant'
32
+ : formatValue(client.client_id)}`);
33
+ yield* Effect.log(` Redirect URL: ${client.use_shared_credentials
34
+ ? 'localhost and Expo allowed automatically'
35
+ : formatValue(client.redirect_to)}`);
27
36
  }
28
37
  });
29
38
  //# sourceMappingURL=list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,WAAW,GAAG,CAAC,KAAgC,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC;AAEzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAClD,KAAgD;IAEhD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,CAAC,IAAI,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrD,QAAQ,CAAC,EAAE;QACX,QAAQ;KACT,CAAC,CACH,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;IAEzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEvD,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,eAAe,QAAQ,EAAE,aAAa,IAAI,MAAM,CAAC,WAAW,EAAE,CAC/D,CAAC;QACF,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnE,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import chalk from 'chalk';\nimport { Effect } from 'effect';\nimport type { authClientListDef, OptsFromCommand } from '../../../index.ts';\nimport { getAppsAuth } from '../../../lib/oauth.ts';\n\nconst formatValue = (value: string | null | undefined) => value ?? 'n/a';\n\nexport const authClientListCmd = Effect.fn(function* (\n _opts: OptsFromCommand<typeof authClientListDef>,\n) {\n const info = yield* getAppsAuth();\n if (_opts.json) {\n yield* Effect.log(JSON.stringify(info.oauth_clients, null, 2));\n return;\n }\n\n const providersById = new Map(\n (info.oauth_service_providers ?? []).map((provider) => [\n provider.id,\n provider,\n ]),\n );\n const clients = info.oauth_clients ?? [];\n\n if (clients.length === 0) {\n yield* Effect.log('No OAuth clients configured.');\n return;\n }\n\n for (const client of clients) {\n const provider = providersById.get(client.provider_id);\n\n yield* Effect.log(chalk.cyan(client.client_name));\n yield* Effect.log(\n ` Provider: ${provider?.provider_name ?? client.provider_id}`,\n );\n yield* Effect.log(` ID: ${client.id}`);\n yield* Effect.log(` Client id: ${formatValue(client.client_id)}`);\n yield* Effect.log(` Redirect URL: ${formatValue(client.redirect_to)}`);\n }\n});\n"]}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,WAAW,GAAG,CAAC,KAAgC,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC;AAEzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAClD,KAAgD;IAEhD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,CAAC,IAAI,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrD,QAAQ,CAAC,EAAE;QACX,QAAQ;KACT,CAAC,CACH,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;IAEzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEvD,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,eAAe,QAAQ,EAAE,aAAa,IAAI,MAAM,CAAC,WAAW,EAAE,CAC/D,CAAC;QACF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;QAC3C,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,kBAAkB,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,QAAQ,EAAE,CACzF,CAAC;QACF,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,gBACE,MAAM,CAAC,sBAAsB;YAC3B,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAClC,EAAE,CACH,CAAC;QACF,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,mBACE,MAAM,CAAC,sBAAsB;YAC3B,CAAC,CAAC,0CAA0C;YAC5C,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CACpC,EAAE,CACH,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import chalk from 'chalk';\nimport { Effect } from 'effect';\nimport type { authClientListDef, OptsFromCommand } from '../../../index.ts';\nimport { getAppsAuth } from '../../../lib/oauth.ts';\n\nconst formatValue = (value: string | null | undefined) => value ?? 'n/a';\n\nexport const authClientListCmd = Effect.fn(function* (\n _opts: OptsFromCommand<typeof authClientListDef>,\n) {\n const info = yield* getAppsAuth();\n if (_opts.json) {\n yield* Effect.log(JSON.stringify(info.oauth_clients, null, 2));\n return;\n }\n\n const providersById = new Map(\n (info.oauth_service_providers ?? []).map((provider) => [\n provider.id,\n provider,\n ]),\n );\n const clients = info.oauth_clients ?? [];\n\n if (clients.length === 0) {\n yield* Effect.log('No OAuth clients configured.');\n return;\n }\n\n for (const client of clients) {\n const provider = providersById.get(client.provider_id);\n\n yield* Effect.log(chalk.cyan(client.client_name));\n yield* Effect.log(\n ` Provider: ${provider?.provider_name ?? client.provider_id}`,\n );\n const clientAppType = client.meta?.appType;\n if (clientAppType) {\n yield* Effect.log(` App type: ${clientAppType}`);\n }\n yield* Effect.log(\n ` Credentials: ${client.use_shared_credentials ? 'Instant dev credentials' : 'custom'}`,\n );\n yield* Effect.log(` ID: ${client.id}`);\n yield* Effect.log(\n ` Client id: ${\n client.use_shared_credentials\n ? 'managed by Instant'\n : formatValue(client.client_id)\n }`,\n );\n yield* Effect.log(\n ` Redirect URL: ${\n client.use_shared_credentials\n ? 'localhost and Expo allowed automatically'\n : formatValue(client.redirect_to)\n }`,\n );\n }\n});\n"]}
@@ -0,0 +1,72 @@
1
+ import { FileSystem } from '@effect/platform';
2
+ import { Effect } from 'effect';
3
+ import { BadArgsError } from '../../../errors.ts';
4
+ type EmptyPromptArgs = Record<string, never>;
5
+ export declare const getFlag: (opts: Record<string, unknown>, flag: string) => unknown;
6
+ export declare const hasFlag: (opts: Record<string, unknown>, flag: string) => boolean;
7
+ export declare const hasAnyFlag: (opts: Record<string, unknown>, flags: string[]) => boolean;
8
+ export declare const isTrueFlag: (value: unknown) => value is true | "true";
9
+ export declare const getMetaString: (meta: unknown, key: string) => string | undefined;
10
+ export declare const clientIdPrompt: ({ providerUrl }: {
11
+ providerUrl: string;
12
+ }) => {
13
+ prompt: string;
14
+ validate: (input: string) => "Value is required" | undefined;
15
+ modifyOutput: import("../../../ui/lib.ts").ModifyOutputFn;
16
+ };
17
+ export declare const clientSecretPrompt: ({ providerUrl, }: {
18
+ providerUrl: string;
19
+ }) => {
20
+ prompt: string;
21
+ validate: (input: string) => "Value is required" | undefined;
22
+ sensitive: boolean;
23
+ modifyOutput: import("../../../ui/lib.ts").ModifyOutputFn;
24
+ };
25
+ export declare const redirectUriPrompt: ({ heading }: {
26
+ heading: string;
27
+ }) => {
28
+ prompt: string;
29
+ placeholder: string;
30
+ modifyOutput: import("../../../ui/lib.ts").ModifyOutputFn;
31
+ };
32
+ export declare const redirectSetupMessages: ({ prompt, redirectUri, showCustomRedirectInstructions, }: {
33
+ prompt: string;
34
+ redirectUri: string;
35
+ showCustomRedirectInstructions?: boolean;
36
+ }) => string[];
37
+ export declare const appleServicesIdPrompt: (_opts: EmptyPromptArgs) => {
38
+ prompt: string;
39
+ validate: (input: string) => "Value is required" | undefined;
40
+ modifyOutput: import("../../../ui/lib.ts").ModifyOutputFn;
41
+ };
42
+ export declare const appleTeamIdPrompt: (_opts: EmptyPromptArgs) => {
43
+ prompt: string;
44
+ validate: (input: string) => "Value is required" | undefined;
45
+ modifyOutput: import("../../../ui/lib.ts").ModifyOutputFn;
46
+ };
47
+ export declare const appleKeyIdPrompt: (_opts: EmptyPromptArgs) => {
48
+ prompt: string;
49
+ validate: (input: string) => "Value is required" | undefined;
50
+ modifyOutput: import("../../../ui/lib.ts").ModifyOutputFn;
51
+ };
52
+ export declare const applePrivateKeyFilePrompt: (_opts: EmptyPromptArgs) => {
53
+ prompt: string;
54
+ validate: (input: string) => "Value is required" | undefined;
55
+ modifyOutput: import("../../../ui/lib.ts").ModifyOutputFn;
56
+ };
57
+ export declare const clerkPublishableKeyPrompt: (_opts: EmptyPromptArgs) => {
58
+ prompt: string;
59
+ placeholder: string;
60
+ validate: (val: string) => "Publishable key is required" | "Invalid publishable key. It should start with \"pk_\"." | undefined;
61
+ modifyOutput: import("../../../ui/lib.ts").ModifyOutputFn;
62
+ };
63
+ export declare const firebaseProjectIdPrompt: (_opts: EmptyPromptArgs) => {
64
+ prompt: string;
65
+ validate: typeof validateFirebaseProjectId;
66
+ modifyOutput: import("../../../ui/lib.ts").ModifyOutputFn;
67
+ };
68
+ export declare const readPrivateKeyFile: (path: string) => Effect.Effect<string, BadArgsError, FileSystem.FileSystem>;
69
+ export declare function validateFirebaseProjectId(value: string): "Project ID is required" | "Invalid Firebase project ID. It must be 6-30 characters, start with a lowercase letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen." | undefined;
70
+ export declare function firebaseDiscoveryEndpoint(projectId: string): string;
71
+ export {};
72
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/client/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE7C,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,YACvD,CAAC;AAEb,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,YACrD,CAAC;AAEf,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,MAAM,EAAE,YAC9B,CAAC;AAE5C,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,2BACL,CAAC;AAErC,eAAO,MAAM,aAAa,GAAI,MAAM,OAAO,EAAE,KAAK,MAAM,uBAIvD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,iBAAiB;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE;;;;CAOrE,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,kBAEhC;IACD,WAAW,EAAE,MAAM,CAAC;CACrB;;;;;CAQC,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,aAAa;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE;;;;CAqBhE,CAAC;AAEH,eAAO,MAAM,qBAAqB,GAAI,0DAInC;IACD,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAC1C,aAcA,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,eAAe;;;;CAO1D,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,OAAO,eAAe;;;;CAOtD,CAAC;AAEH,eAAO,MAAM,gBAAgB,GAAI,OAAO,eAAe;;;;CAOrD,CAAC;AAEH,eAAO,MAAM,yBAAyB,GAAI,OAAO,eAAe;;;;CAO9D,CAAC;AAEH,eAAO,MAAM,yBAAyB,GAAI,OAAO,eAAe;;;oBAG9C,MAAM;;CAUtB,CAAC;AAEH,eAAO,MAAM,uBAAuB,GAAI,OAAO,eAAe;;;;CAO5D,CAAC;AAEH,eAAO,MAAM,kBAAkB,8EAuB7B,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,oNAMtD;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,UAE1D"}
@@ -0,0 +1,145 @@
1
+ import { FileSystem } from '@effect/platform';
2
+ import { Effect } from 'effect';
3
+ import { DEFAULT_OAUTH_CALLBACK_URL } from '@instantdb/platform';
4
+ import chalk from 'chalk';
5
+ import { BadArgsError } from "../../../errors.js";
6
+ import { link } from "../../../logging.js";
7
+ import { stripFirstBlankLine, validateRequired } from "../../../lib/ui.js";
8
+ import { UI } from "../../../ui/index.js";
9
+ export const getFlag = (opts, flag) => opts[flag];
10
+ export const hasFlag = (opts, flag) => flag in opts;
11
+ export const hasAnyFlag = (opts, flags) => flags.some((flag) => hasFlag(opts, flag));
12
+ export const isTrueFlag = (value) => value === true || value === 'true';
13
+ export const getMetaString = (meta, key) => {
14
+ if (!meta || typeof meta !== 'object')
15
+ return undefined;
16
+ const value = meta[key];
17
+ return typeof value === 'string' ? value : undefined;
18
+ };
19
+ export const clientIdPrompt = ({ providerUrl }) => ({
20
+ prompt: `Client ID: ${chalk.dim(`(from ${link(providerUrl)})`)}`,
21
+ validate: validateRequired,
22
+ modifyOutput: UI.modifiers.piped([
23
+ UI.modifiers.topPadding,
24
+ UI.modifiers.dimOnComplete,
25
+ ]),
26
+ });
27
+ export const clientSecretPrompt = ({ providerUrl, }) => ({
28
+ prompt: `Client Secret: ${chalk.dim(`(from ${link(providerUrl)})`)}`,
29
+ validate: validateRequired,
30
+ sensitive: true,
31
+ modifyOutput: UI.modifiers.piped([
32
+ UI.modifiers.topPadding,
33
+ UI.modifiers.dimOnComplete,
34
+ ]),
35
+ });
36
+ export const redirectUriPrompt = ({ heading }) => ({
37
+ prompt: '',
38
+ placeholder: 'https://yoursite.com/oauth/callback',
39
+ modifyOutput: UI.modifiers.piped([
40
+ (output, status) => {
41
+ if (status === 'idle') {
42
+ return (`\n${heading}
43
+ ${chalk.dim('With a custom redirect URI, users will see "Redirecting to yoursite.com..." for a more branded experience.')}
44
+ ${chalk.dim(`Your URI must forward to ${DEFAULT_OAUTH_CALLBACK_URL} with all query parameters preserved.`)}\n\n` +
45
+ stripFirstBlankLine(output));
46
+ }
47
+ const answer = stripFirstBlankLine(output);
48
+ if (status === 'submitted' && answer.trim() === '') {
49
+ return `\n${heading}\n(skipped)`;
50
+ }
51
+ return `\n${heading}\n${answer}`;
52
+ },
53
+ UI.modifiers.dimOnComplete,
54
+ ]),
55
+ });
56
+ export const redirectSetupMessages = ({ prompt, redirectUri, showCustomRedirectInstructions, }) => {
57
+ const messages = ['', chalk.bold(`${prompt}:`), chalk.bold(redirectUri)];
58
+ if (showCustomRedirectInstructions) {
59
+ messages.push('', `Your custom redirect must forward to ${chalk.bold(DEFAULT_OAUTH_CALLBACK_URL)} with all query parameters preserved.`);
60
+ messages.push(`You can test it by visiting: ${chalk.bold(redirectUri + '?test-redirect=true')}`);
61
+ }
62
+ return messages;
63
+ };
64
+ export const appleServicesIdPrompt = (_opts) => ({
65
+ prompt: `Services ID ${chalk.dim(`(from ${link('https://developer.apple.com/account/resources/identifiers/list/serviceId')})`)}`,
66
+ validate: validateRequired,
67
+ modifyOutput: UI.modifiers.piped([
68
+ UI.modifiers.topPadding,
69
+ UI.modifiers.dimOnComplete,
70
+ ]),
71
+ });
72
+ export const appleTeamIdPrompt = (_opts) => ({
73
+ prompt: `Team ID ${chalk.dim(`(from ${link('https://developer.apple.com/account#MembershipDetailsCard')})`)}`,
74
+ validate: validateRequired,
75
+ modifyOutput: UI.modifiers.piped([
76
+ UI.modifiers.topPadding,
77
+ UI.modifiers.dimOnComplete,
78
+ ]),
79
+ });
80
+ export const appleKeyIdPrompt = (_opts) => ({
81
+ prompt: `Key ID ${chalk.dim(`(from ${link('https://developer.apple.com/account/resources/authkeys/list')})`)}`,
82
+ validate: validateRequired,
83
+ modifyOutput: UI.modifiers.piped([
84
+ UI.modifiers.topPadding,
85
+ UI.modifiers.dimOnComplete,
86
+ ]),
87
+ });
88
+ export const applePrivateKeyFilePrompt = (_opts) => ({
89
+ prompt: `Path to .p8 private key file ${chalk.dim('(downloaded from Apple)')}`,
90
+ validate: validateRequired,
91
+ modifyOutput: UI.modifiers.piped([
92
+ UI.modifiers.topPadding,
93
+ UI.modifiers.dimOnComplete,
94
+ ]),
95
+ });
96
+ export const clerkPublishableKeyPrompt = (_opts) => ({
97
+ prompt: `Clerk publishable key ${chalk.dim(`(from ${link('https://dashboard.clerk.com/last-active?path=api-keys')})`)}`,
98
+ placeholder: 'pk_********************************************************',
99
+ validate: (val) => {
100
+ if (!val)
101
+ return 'Publishable key is required';
102
+ if (!val.startsWith('pk_')) {
103
+ return 'Invalid publishable key. It should start with "pk_".';
104
+ }
105
+ },
106
+ modifyOutput: UI.modifiers.piped([
107
+ UI.modifiers.topPadding,
108
+ UI.modifiers.dimOnComplete,
109
+ ]),
110
+ });
111
+ export const firebaseProjectIdPrompt = (_opts) => ({
112
+ prompt: `Firebase project ID: (From Project Settings page on ${link('https://console.firebase.google.com/')})`,
113
+ validate: validateFirebaseProjectId,
114
+ modifyOutput: UI.modifiers.piped([
115
+ UI.modifiers.topPadding,
116
+ UI.modifiers.dimOnComplete,
117
+ ]),
118
+ });
119
+ export const readPrivateKeyFile = Effect.fn('readPrivateKeyFile')(function* (path) {
120
+ const fs = yield* FileSystem.FileSystem;
121
+ // Strip shell escapes so paths like "file\ (2).p8" resolve on POSIX.
122
+ const normalizedPath = process.platform === 'win32' ? path : path.replace(/\\(.)/g, '$1');
123
+ const contents = yield* fs.readFileString(normalizedPath, 'utf8').pipe(Effect.mapError((e) => new BadArgsError({
124
+ message: `Could not read private key file at ${normalizedPath}: ${e.message}`,
125
+ })));
126
+ const trimmed = contents.trim();
127
+ if (!trimmed) {
128
+ return yield* BadArgsError.make({
129
+ message: `Private key file at ${normalizedPath} is empty.`,
130
+ });
131
+ }
132
+ return trimmed;
133
+ });
134
+ export function validateFirebaseProjectId(value) {
135
+ const projectIdRegex = /^[a-z][a-z0-9-]{4,28}[a-z0-9]$/;
136
+ if (!value)
137
+ return 'Project ID is required';
138
+ if (!projectIdRegex.test(value)) {
139
+ return 'Invalid Firebase project ID. It must be 6-30 characters, start with a lowercase letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen.';
140
+ }
141
+ }
142
+ export function firebaseDiscoveryEndpoint(projectId) {
143
+ return `https://securetoken.google.com/${encodeURIComponent(projectId)}/.well-known/openid-configuration`;
144
+ }
145
+ //# sourceMappingURL=shared.js.map