instant-cli 1.0.22-branch-cli-codex-update.25347454543.1 → 1.0.22-branch-cli-codex-update.25347761204.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/commands/auth/client/shared.d.ts +0 -6
- package/dist/commands/auth/client/shared.d.ts.map +1 -1
- package/dist/commands/auth/client/shared.js +1 -12
- package/dist/commands/auth/client/shared.js.map +1 -1
- package/dist/commands/auth/client/update.d.ts.map +1 -1
- package/dist/commands/auth/client/update.js +27 -16
- package/dist/commands/auth/client/update.js.map +1 -1
- package/package.json +4 -4
- package/src/commands/auth/client/shared.ts +1 -25
- package/src/commands/auth/client/update.ts +59 -28
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> instant-cli@1.0.22-branch-cli-codex-update.
|
|
2
|
+
> instant-cli@1.0.22-branch-cli-codex-update.25347761204.1 build /home/runner/work/instant/instant/client/packages/cli
|
|
3
3
|
> rm -rf dist; tsc -p tsconfig.build.json
|
|
4
4
|
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import { FileSystem } from '@effect/platform';
|
|
2
2
|
import { Effect } from 'effect';
|
|
3
3
|
import { BadArgsError } from '../../../errors.ts';
|
|
4
|
-
import { UI } from '../../../ui/index.ts';
|
|
5
4
|
type EmptyPromptArgs = Record<string, never>;
|
|
6
5
|
export declare const getFlag: (opts: Record<string, unknown>, flag: string) => unknown;
|
|
7
6
|
export declare const hasFlag: (opts: Record<string, unknown>, flag: string) => boolean;
|
|
8
7
|
export declare const hasAnyFlag: (opts: Record<string, unknown>, flags: string[]) => boolean;
|
|
9
8
|
export declare const isTrueFlag: (value: unknown) => value is true | "true";
|
|
10
9
|
export declare const getMetaString: (meta: unknown, key: string) => string | undefined;
|
|
11
|
-
export declare const optOrPromptIf: (opts: Record<string, unknown>, flag: string, params: {
|
|
12
|
-
promptIf: boolean;
|
|
13
|
-
required?: boolean;
|
|
14
|
-
prompt: UI.TextInputProps;
|
|
15
|
-
}) => Effect.Effect<string | undefined, BadArgsError | import("../../../lib/ui.ts").UIError, import("../../../context/globalOpts.ts").GlobalOpts>;
|
|
16
10
|
export declare const clientIdPrompt: ({ providerUrl }: {
|
|
17
11
|
providerUrl: string;
|
|
18
12
|
}) => {
|
|
@@ -1 +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;
|
|
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;;;;CAiBhE,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,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7D;AAUD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,oNAMtD;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,UAE1D"}
|
|
@@ -4,7 +4,7 @@ import { DEFAULT_OAUTH_CALLBACK_URL } from '@instantdb/platform';
|
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import { BadArgsError } from "../../../errors.js";
|
|
6
6
|
import { link } from "../../../logging.js";
|
|
7
|
-
import {
|
|
7
|
+
import { stripFirstBlankLine, validateRequired } from "../../../lib/ui.js";
|
|
8
8
|
import { UI } from "../../../ui/index.js";
|
|
9
9
|
export const getFlag = (opts, flag) => opts[flag];
|
|
10
10
|
export const hasFlag = (opts, flag) => flag in opts;
|
|
@@ -16,17 +16,6 @@ export const getMetaString = (meta, key) => {
|
|
|
16
16
|
const value = meta[key];
|
|
17
17
|
return typeof value === 'string' ? value : undefined;
|
|
18
18
|
};
|
|
19
|
-
export const optOrPromptIf = (opts, flag, params) => Effect.gen(function* () {
|
|
20
|
-
const value = getFlag(opts, flag);
|
|
21
|
-
if (value === undefined && !params.promptIf)
|
|
22
|
-
return undefined;
|
|
23
|
-
return yield* optOrPrompt(value, {
|
|
24
|
-
simpleName: `--${flag}`,
|
|
25
|
-
required: params.required ?? params.promptIf,
|
|
26
|
-
skipIf: false,
|
|
27
|
-
prompt: params.prompt,
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
19
|
export const clientIdPrompt = ({ providerUrl }) => ({
|
|
31
20
|
prompt: `Client ID: ${chalk.dim(`(from ${link(providerUrl)})`)}`,
|
|
32
21
|
validate: validateRequired,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/shared.ts"],"names":[],"mappings":"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","sourcesContent":["import { FileSystem } from '@effect/platform';\nimport { Effect } from 'effect';\nimport { DEFAULT_OAUTH_CALLBACK_URL } from '@instantdb/platform';\nimport chalk from 'chalk';\nimport { BadArgsError } from '../../../errors.ts';\nimport { link } from '../../../logging.ts';\nimport {\n optOrPrompt,\n stripFirstBlankLine,\n validateRequired,\n} from '../../../lib/ui.ts';\nimport { UI } from '../../../ui/index.ts';\n\ntype EmptyPromptArgs = Record<string, never>;\n\nexport const getFlag = (opts: Record<string, unknown>, flag: string) =>\n opts[flag];\n\nexport const hasFlag = (opts: Record<string, unknown>, flag: string) =>\n flag in opts;\n\nexport const hasAnyFlag = (opts: Record<string, unknown>, flags: string[]) =>\n flags.some((flag) => hasFlag(opts, flag));\n\nexport const isTrueFlag = (value: unknown) =>\n value === true || value === 'true';\n\nexport const getMetaString = (meta: unknown, key: string) => {\n if (!meta || typeof meta !== 'object') return undefined;\n const value = (meta as Record<string, unknown>)[key];\n return typeof value === 'string' ? value : undefined;\n};\n\nexport const optOrPromptIf = (\n opts: Record<string, unknown>,\n flag: string,\n params: {\n promptIf: boolean;\n required?: boolean;\n prompt: UI.TextInputProps;\n },\n) =>\n Effect.gen(function* () {\n const value = getFlag(opts, flag);\n if (value === undefined && !params.promptIf) return undefined;\n return yield* optOrPrompt(value, {\n simpleName: `--${flag}`,\n required: params.required ?? params.promptIf,\n skipIf: false,\n prompt: params.prompt,\n });\n });\n\nexport const clientIdPrompt = ({ providerUrl }: { providerUrl: string }) => ({\n prompt: `Client ID: ${chalk.dim(`(from ${link(providerUrl)})`)}`,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const clientSecretPrompt = ({\n providerUrl,\n}: {\n providerUrl: string;\n}) => ({\n prompt: `Client Secret: ${chalk.dim(`(from ${link(providerUrl)})`)}`,\n validate: validateRequired,\n sensitive: true,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const redirectUriPrompt = ({ heading }: { heading: string }) => ({\n prompt: '',\n placeholder: 'https://yoursite.com/oauth/callback',\n modifyOutput: UI.modifiers.piped([\n (output, status) => {\n if (status === 'idle') {\n return (\n `\\n${heading}\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 `\\n${heading}\\n${stripFirstBlankLine(output)}`;\n },\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const redirectSetupMessages = ({\n prompt,\n redirectUri,\n showCustomRedirectInstructions,\n}: {\n prompt: string;\n redirectUri: string;\n showCustomRedirectInstructions?: boolean;\n}) => {\n const messages = ['', chalk.bold(`${prompt}:`), chalk.bold(redirectUri)];\n\n if (showCustomRedirectInstructions) {\n messages.push(\n '',\n `Your custom redirect must forward to ${chalk.bold(DEFAULT_OAUTH_CALLBACK_URL)} with all query parameters preserved.`,\n );\n messages.push(\n `You can test it by visiting: ${chalk.bold(redirectUri + '?test-redirect=true')}`,\n );\n }\n\n return messages;\n};\n\nexport const appleServicesIdPrompt = (_opts: EmptyPromptArgs) => ({\n prompt: `Services ID ${chalk.dim(`(from ${link('https://developer.apple.com/account/resources/identifiers/list/serviceId')})`)}`,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const appleTeamIdPrompt = (_opts: EmptyPromptArgs) => ({\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\nexport const appleKeyIdPrompt = (_opts: EmptyPromptArgs) => ({\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\nexport const applePrivateKeyFilePrompt = (_opts: EmptyPromptArgs) => ({\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\nexport const clerkPublishableKeyPrompt = (_opts: EmptyPromptArgs) => ({\n prompt: `Clerk publishable key ${chalk.dim(`(from ${link('https://dashboard.clerk.com/last-active?path=api-keys')})`)}`,\n placeholder: 'pk_********************************************************',\n validate: (val: string) => {\n if (!val) return 'Publishable key is required';\n if (!val.startsWith('pk_')) {\n return 'Invalid publishable key. It should start with \"pk_\".';\n }\n },\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const firebaseProjectIdPrompt = (_opts: EmptyPromptArgs) => ({\n prompt: `Firebase project ID: (From Project Settings page on ${link('https://console.firebase.google.com/')})`,\n validate: validateFirebaseProjectId,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const readPrivateKeyFile = Effect.fn('readPrivateKeyFile')(function* (\n path: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n // Strip shell escapes so paths like \"file\\ (2).p8\" resolve on POSIX.\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\nexport function 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 {\n return null;\n }\n}\n\nfunction base64Decode(s: string) {\n try {\n return Buffer.from(s, 'base64').toString('utf-8');\n } catch {\n return Buffer.from(s, 'base64url').toString('utf-8');\n }\n}\n\nexport function validateFirebaseProjectId(value: string) {\n const projectIdRegex = /^[a-z][a-z0-9-]{4,28}[a-z0-9]$/;\n if (!value) return 'Project ID is required';\n if (!projectIdRegex.test(value)) {\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\nexport function firebaseDiscoveryEndpoint(projectId: string) {\n return `https://securetoken.google.com/${encodeURIComponent(projectId)}/.well-known/openid-configuration`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/shared.ts"],"names":[],"mappings":"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","sourcesContent":["import { FileSystem } from '@effect/platform';\nimport { Effect } from 'effect';\nimport { DEFAULT_OAUTH_CALLBACK_URL } from '@instantdb/platform';\nimport chalk from 'chalk';\nimport { BadArgsError } from '../../../errors.ts';\nimport { link } from '../../../logging.ts';\nimport { stripFirstBlankLine, validateRequired } from '../../../lib/ui.ts';\nimport { UI } from '../../../ui/index.ts';\n\ntype EmptyPromptArgs = Record<string, never>;\n\nexport const getFlag = (opts: Record<string, unknown>, flag: string) =>\n opts[flag];\n\nexport const hasFlag = (opts: Record<string, unknown>, flag: string) =>\n flag in opts;\n\nexport const hasAnyFlag = (opts: Record<string, unknown>, flags: string[]) =>\n flags.some((flag) => hasFlag(opts, flag));\n\nexport const isTrueFlag = (value: unknown) =>\n value === true || value === 'true';\n\nexport const getMetaString = (meta: unknown, key: string) => {\n if (!meta || typeof meta !== 'object') return undefined;\n const value = (meta as Record<string, unknown>)[key];\n return typeof value === 'string' ? value : undefined;\n};\n\nexport const clientIdPrompt = ({ providerUrl }: { providerUrl: string }) => ({\n prompt: `Client ID: ${chalk.dim(`(from ${link(providerUrl)})`)}`,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const clientSecretPrompt = ({\n providerUrl,\n}: {\n providerUrl: string;\n}) => ({\n prompt: `Client Secret: ${chalk.dim(`(from ${link(providerUrl)})`)}`,\n validate: validateRequired,\n sensitive: true,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const redirectUriPrompt = ({ heading }: { heading: string }) => ({\n prompt: '',\n placeholder: 'https://yoursite.com/oauth/callback',\n modifyOutput: UI.modifiers.piped([\n (output, status) => {\n if (status === 'idle') {\n return (\n `\\n${heading}\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 `\\n${heading}\\n${stripFirstBlankLine(output)}`;\n },\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const redirectSetupMessages = ({\n prompt,\n redirectUri,\n showCustomRedirectInstructions,\n}: {\n prompt: string;\n redirectUri: string;\n showCustomRedirectInstructions?: boolean;\n}) => {\n const messages = ['', chalk.bold(`${prompt}:`), chalk.bold(redirectUri)];\n\n if (showCustomRedirectInstructions) {\n messages.push(\n '',\n `Your custom redirect must forward to ${chalk.bold(DEFAULT_OAUTH_CALLBACK_URL)} with all query parameters preserved.`,\n );\n messages.push(\n `You can test it by visiting: ${chalk.bold(redirectUri + '?test-redirect=true')}`,\n );\n }\n\n return messages;\n};\n\nexport const appleServicesIdPrompt = (_opts: EmptyPromptArgs) => ({\n prompt: `Services ID ${chalk.dim(`(from ${link('https://developer.apple.com/account/resources/identifiers/list/serviceId')})`)}`,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const appleTeamIdPrompt = (_opts: EmptyPromptArgs) => ({\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\nexport const appleKeyIdPrompt = (_opts: EmptyPromptArgs) => ({\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\nexport const applePrivateKeyFilePrompt = (_opts: EmptyPromptArgs) => ({\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\nexport const clerkPublishableKeyPrompt = (_opts: EmptyPromptArgs) => ({\n prompt: `Clerk publishable key ${chalk.dim(`(from ${link('https://dashboard.clerk.com/last-active?path=api-keys')})`)}`,\n placeholder: 'pk_********************************************************',\n validate: (val: string) => {\n if (!val) return 'Publishable key is required';\n if (!val.startsWith('pk_')) {\n return 'Invalid publishable key. It should start with \"pk_\".';\n }\n },\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const firebaseProjectIdPrompt = (_opts: EmptyPromptArgs) => ({\n prompt: `Firebase project ID: (From Project Settings page on ${link('https://console.firebase.google.com/')})`,\n validate: validateFirebaseProjectId,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n});\n\nexport const readPrivateKeyFile = Effect.fn('readPrivateKeyFile')(function* (\n path: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n // Strip shell escapes so paths like \"file\\ (2).p8\" resolve on POSIX.\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\nexport function 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 {\n return null;\n }\n}\n\nfunction base64Decode(s: string) {\n try {\n return Buffer.from(s, 'base64').toString('utf-8');\n } catch {\n return Buffer.from(s, 'base64url').toString('utf-8');\n }\n}\n\nexport function validateFirebaseProjectId(value: string) {\n const projectIdRegex = /^[a-z][a-z0-9-]{4,28}[a-z0-9]$/;\n if (!value) return 'Project ID is required';\n if (!projectIdRegex.test(value)) {\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\nexport function firebaseDiscoveryEndpoint(projectId: string) {\n return `https://securetoken.google.com/${encodeURIComponent(projectId)}/.well-known/openid-configuration`;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/client/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAS,MAAM,QAAQ,CAAC;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/client/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAS,MAAM,QAAQ,CAAC;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAswB5D,eAAO,MAAM,mBAAmB;;;;wgBA6D/B,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Effect, Match } from 'effect';
|
|
2
2
|
import { BadArgsError } from "../../../errors.js";
|
|
3
3
|
import { GlobalOpts } from "../../../context/globalOpts.js";
|
|
4
|
-
import { runUIEffect } from "../../../lib/ui.js";
|
|
4
|
+
import { optOrPrompt, runUIEffect } from "../../../lib/ui.js";
|
|
5
5
|
import { findClientByIdOrName, getAppsAuth, OAuthClient, updateOAuthClient, } from "../../../lib/oauth.js";
|
|
6
6
|
import { UI } from "../../../ui/index.js";
|
|
7
7
|
import { DEFAULT_OAUTH_CALLBACK_URL } from '@instantdb/platform';
|
|
8
8
|
import chalk from 'chalk';
|
|
9
9
|
import boxen from 'boxen';
|
|
10
|
-
import { appleKeyIdPrompt, applePrivateKeyFilePrompt, appleServicesIdPrompt, appleTeamIdPrompt, clerkPublishableKeyPrompt, clientIdPrompt, clientSecretPrompt, domainFromClerkKey, firebaseDiscoveryEndpoint, firebaseProjectIdPrompt, getFlag, getMetaString, hasAnyFlag, hasFlag, isTrueFlag,
|
|
10
|
+
import { appleKeyIdPrompt, applePrivateKeyFilePrompt, appleServicesIdPrompt, appleTeamIdPrompt, clerkPublishableKeyPrompt, clientIdPrompt, clientSecretPrompt, domainFromClerkKey, firebaseDiscoveryEndpoint, firebaseProjectIdPrompt, getFlag, getMetaString, hasAnyFlag, hasFlag, isTrueFlag, readPrivateKeyFile, redirectSetupMessages, redirectUriPrompt, validateFirebaseProjectId, } from "./shared.js";
|
|
11
11
|
import { link } from "../../../logging.js";
|
|
12
12
|
const redirectPrompt = redirectUriPrompt({
|
|
13
13
|
heading: 'Custom redirect URI (optional):',
|
|
@@ -75,6 +75,17 @@ const updateGoogleToDevCredentials = Effect.fn(function* (client) {
|
|
|
75
75
|
const hasGoogleCustomCredentialFlags = (opts) => hasAnyFlag(opts, ['client-id', 'client-secret', 'custom-redirect-uri']);
|
|
76
76
|
const hasGoogleUpdateFlags = (opts) => isTrueFlag(getFlag(opts, 'dev-credentials')) ||
|
|
77
77
|
hasGoogleCustomCredentialFlags(opts);
|
|
78
|
+
const optOrPromptWhenNeeded = (opts, flag, params) => Effect.gen(function* () {
|
|
79
|
+
const value = getFlag(opts, flag);
|
|
80
|
+
if (value === undefined && !params.promptIf)
|
|
81
|
+
return undefined;
|
|
82
|
+
return yield* optOrPrompt(value, {
|
|
83
|
+
simpleName: `--${flag}`,
|
|
84
|
+
required: params.required ?? params.promptIf,
|
|
85
|
+
skipIf: false,
|
|
86
|
+
prompt: params.prompt,
|
|
87
|
+
});
|
|
88
|
+
});
|
|
78
89
|
const selectGoogleUpdateMode = Effect.fn(function* ({ isWeb, switchingFromShared, }) {
|
|
79
90
|
if (switchingFromShared) {
|
|
80
91
|
return yield* runUIEffect(new UI.Select({
|
|
@@ -136,7 +147,7 @@ const resolveGoogleUpdateMode = Effect.fn(function* ({ opts, isWeb, switchingFro
|
|
|
136
147
|
return yield* selectGoogleUpdateMode({ isWeb, switchingFromShared });
|
|
137
148
|
});
|
|
138
149
|
const updateGoogleRedirect = Effect.fn(function* ({ opts, client, }) {
|
|
139
|
-
const redirectTo = yield*
|
|
150
|
+
const redirectTo = yield* optOrPromptWhenNeeded(opts, 'custom-redirect-uri', {
|
|
140
151
|
promptIf: true,
|
|
141
152
|
required: true,
|
|
142
153
|
prompt: newRedirectPrompt,
|
|
@@ -167,18 +178,18 @@ const updateGoogleCustomCredentials = Effect.fn(function* ({ opts, client, isWeb
|
|
|
167
178
|
(promptCredentials ||
|
|
168
179
|
(switchingFromShared && !hasFlag(opts, 'client-secret')));
|
|
169
180
|
const shouldPromptRedirectUri = isWeb && switchingFromShared && promptCredentials;
|
|
170
|
-
const clientId = yield*
|
|
181
|
+
const clientId = yield* optOrPromptWhenNeeded(opts, 'client-id', {
|
|
171
182
|
promptIf: shouldPromptClientId,
|
|
172
183
|
required: mustCollectCredentials,
|
|
173
184
|
prompt: clientIdPrompt({ providerUrl: googleConsoleUrl }),
|
|
174
185
|
});
|
|
175
|
-
const clientSecret = yield*
|
|
186
|
+
const clientSecret = yield* optOrPromptWhenNeeded(opts, 'client-secret', {
|
|
176
187
|
promptIf: shouldPromptClientSecret,
|
|
177
188
|
required: isWeb && mustCollectCredentials,
|
|
178
189
|
prompt: clientSecretPrompt({ providerUrl: googleConsoleUrl }),
|
|
179
190
|
});
|
|
180
191
|
const customRedirectUri = isWeb
|
|
181
|
-
? yield*
|
|
192
|
+
? yield* optOrPromptWhenNeeded(opts, 'custom-redirect-uri', {
|
|
182
193
|
promptIf: shouldPromptRedirectUri,
|
|
183
194
|
required: false,
|
|
184
195
|
prompt: redirectPrompt,
|
|
@@ -270,17 +281,17 @@ const handleClientIdSecretUpdate = Effect.fn(function* (params) {
|
|
|
270
281
|
promptCredentials = action === 'rotate';
|
|
271
282
|
promptRedirect = action === 'redirect';
|
|
272
283
|
}
|
|
273
|
-
const clientId = yield*
|
|
284
|
+
const clientId = yield* optOrPromptWhenNeeded(params.opts, 'client-id', {
|
|
274
285
|
promptIf: promptCredentials,
|
|
275
286
|
required: promptCredentials,
|
|
276
287
|
prompt: clientIdPrompt({ providerUrl: params.providerUrl }),
|
|
277
288
|
});
|
|
278
|
-
const clientSecret = yield*
|
|
289
|
+
const clientSecret = yield* optOrPromptWhenNeeded(params.opts, 'client-secret', {
|
|
279
290
|
promptIf: promptCredentials,
|
|
280
291
|
required: promptCredentials,
|
|
281
292
|
prompt: clientSecretPrompt({ providerUrl: params.providerUrl }),
|
|
282
293
|
});
|
|
283
|
-
const customRedirectUri = yield*
|
|
294
|
+
const customRedirectUri = yield* optOrPromptWhenNeeded(params.opts, 'custom-redirect-uri', {
|
|
284
295
|
promptIf: promptRedirect,
|
|
285
296
|
required: promptRedirect,
|
|
286
297
|
prompt: promptRedirect ? newRedirectPrompt : redirectPrompt,
|
|
@@ -338,17 +349,17 @@ const resolveAppleUpdateConfig = Effect.fn(function* ({ opts, client, yes, }) {
|
|
|
338
349
|
return { promptAll, configureWeb };
|
|
339
350
|
});
|
|
340
351
|
const readAppleWebUpdate = Effect.fn(function* ({ opts, client, promptAll, }) {
|
|
341
|
-
const teamId = yield*
|
|
352
|
+
const teamId = yield* optOrPromptWhenNeeded(opts, 'team-id', {
|
|
342
353
|
promptIf: promptAll,
|
|
343
354
|
required: promptAll,
|
|
344
355
|
prompt: appleTeamIdPrompt({}),
|
|
345
356
|
});
|
|
346
|
-
const keyId = yield*
|
|
357
|
+
const keyId = yield* optOrPromptWhenNeeded(opts, 'key-id', {
|
|
347
358
|
promptIf: promptAll,
|
|
348
359
|
required: promptAll,
|
|
349
360
|
prompt: appleKeyIdPrompt({}),
|
|
350
361
|
});
|
|
351
|
-
const privateKeyPath = yield*
|
|
362
|
+
const privateKeyPath = yield* optOrPromptWhenNeeded(opts, 'private-key-file', {
|
|
352
363
|
promptIf: promptAll,
|
|
353
364
|
required: promptAll,
|
|
354
365
|
prompt: applePrivateKeyFilePrompt({}),
|
|
@@ -356,7 +367,7 @@ const readAppleWebUpdate = Effect.fn(function* ({ opts, client, promptAll, }) {
|
|
|
356
367
|
const privateKey = privateKeyPath
|
|
357
368
|
? yield* readPrivateKeyFile(privateKeyPath)
|
|
358
369
|
: undefined;
|
|
359
|
-
const customRedirectUri = yield*
|
|
370
|
+
const customRedirectUri = yield* optOrPromptWhenNeeded(opts, 'custom-redirect-uri', {
|
|
360
371
|
promptIf: promptAll,
|
|
361
372
|
required: false,
|
|
362
373
|
prompt: redirectPrompt,
|
|
@@ -382,7 +393,7 @@ const handleAppleUpdate = Effect.fn(function* (opts, client) {
|
|
|
382
393
|
client,
|
|
383
394
|
yes,
|
|
384
395
|
});
|
|
385
|
-
const servicesId = yield*
|
|
396
|
+
const servicesId = yield* optOrPromptWhenNeeded(opts, 'services-id', {
|
|
386
397
|
promptIf: promptAll,
|
|
387
398
|
required: promptAll,
|
|
388
399
|
prompt: appleServicesIdPrompt({}),
|
|
@@ -415,7 +426,7 @@ const handleAppleUpdate = Effect.fn(function* (opts, client) {
|
|
|
415
426
|
});
|
|
416
427
|
const handleClerkUpdate = Effect.fn(function* (opts, client) {
|
|
417
428
|
const { yes } = yield* GlobalOpts;
|
|
418
|
-
const publishableKey = yield*
|
|
429
|
+
const publishableKey = yield* optOrPromptWhenNeeded(opts, 'publishable-key', {
|
|
419
430
|
promptIf: !yes && !hasFlag(opts, 'publishable-key'),
|
|
420
431
|
required: true,
|
|
421
432
|
prompt: clerkPublishableKeyPrompt({}),
|
|
@@ -444,7 +455,7 @@ const handleClerkUpdate = Effect.fn(function* (opts, client) {
|
|
|
444
455
|
});
|
|
445
456
|
const handleFirebaseUpdate = Effect.fn(function* (opts, client) {
|
|
446
457
|
const { yes } = yield* GlobalOpts;
|
|
447
|
-
const projectId = yield*
|
|
458
|
+
const projectId = yield* optOrPromptWhenNeeded(opts, 'project-id', {
|
|
448
459
|
promptIf: !yes && !hasFlag(opts, 'project-id'),
|
|
449
460
|
required: true,
|
|
450
461
|
prompt: firebaseProjectIdPrompt({}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/update.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, Match } from 'effect';\nimport type { authClientUpdateDef, OptsFromCommand } from '../../../index.ts';\nimport { BadArgsError } from '../../../errors.ts';\nimport { GlobalOpts } from '../../../context/globalOpts.ts';\nimport { runUIEffect } from '../../../lib/ui.ts';\nimport {\n findClientByIdOrName,\n getAppsAuth,\n OAuthClient,\n updateOAuthClient,\n} from '../../../lib/oauth.ts';\nimport { UI } from '../../../ui/index.ts';\nimport { DEFAULT_OAUTH_CALLBACK_URL } from '@instantdb/platform';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport {\n appleKeyIdPrompt,\n applePrivateKeyFilePrompt,\n appleServicesIdPrompt,\n appleTeamIdPrompt,\n clerkPublishableKeyPrompt,\n clientIdPrompt,\n clientSecretPrompt,\n domainFromClerkKey,\n firebaseDiscoveryEndpoint,\n firebaseProjectIdPrompt,\n getFlag,\n getMetaString,\n hasAnyFlag,\n hasFlag,\n isTrueFlag,\n optOrPromptIf,\n readPrivateKeyFile,\n redirectSetupMessages,\n redirectUriPrompt,\n validateFirebaseProjectId,\n} from './shared.ts';\nimport { link } from '../../../logging.ts';\n\ntype OAuthClientRow = typeof OAuthClient.Type;\n\ntype ProviderRow = {\n id: string;\n provider_name: string;\n};\n\nconst redirectPrompt = redirectUriPrompt({\n heading: 'Custom redirect URI (optional):',\n});\nconst newRedirectPrompt = redirectUriPrompt({ heading: 'New redirect URI:' });\nconst googleConsoleUrl =\n 'https://console.developers.google.com/apis/credentials';\n\nconst resolveClient = Effect.fn(function* (params: {\n id?: string;\n name?: string;\n}) {\n const { yes } = yield* GlobalOpts;\n\n if (params.id || params.name) {\n return yield* findClientByIdOrName({\n id: params.id,\n name: params.name,\n });\n }\n\n if (yes) {\n return yield* BadArgsError.make({ message: 'Must specify --id or --name' });\n }\n\n const auth = yield* getAppsAuth();\n const clients = (auth.oauth_clients ?? []) as OAuthClientRow[];\n\n if (clients.length === 0) {\n return yield* BadArgsError.make({\n message: 'No OAuth clients found for this app.',\n });\n }\n\n return yield* runUIEffect(\n new UI.Select({\n options: clients.map((client) => ({\n label:\n client.client_name +\n (client.use_shared_credentials\n ? chalk.dim(' (dev credentials)')\n : '') +\n chalk.dim(` (${client.id})`),\n value: client,\n })),\n promptText: 'Select a client to update:',\n modifyOutput: UI.modifiers.dimOnComplete,\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n Effect.map((client) => ({ auth, client })),\n );\n});\n\nconst selectUpdateAction = Effect.fn(function* <T extends string>(\n options: { label: string; value: T; secondary?: boolean }[],\n) {\n return yield* runUIEffect(\n new UI.Select({\n options,\n promptText: 'What do you want to update?',\n modifyOutput: UI.modifiers.dimOnComplete,\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n});\n\nconst updateGoogleToDevCredentials = Effect.fn(function* (\n client: OAuthClientRow,\n) {\n const response = yield* updateOAuthClient({\n oauthClientId: client.id,\n clientId: null,\n clientSecret: null,\n useSharedCredentials: true,\n redirectTo: null,\n });\n\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client updated: ${response.client.client_name}`,\n 'Credentials: Instant dev credentials',\n `ID: ${response.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 ${response.client.client_name} --client-id <id> --client-secret <secret>`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\ntype GoogleUpdateMode = 'dev' | 'custom' | 'redirect' | 'none';\n\nconst hasGoogleCustomCredentialFlags = (opts: Record<string, unknown>) =>\n hasAnyFlag(opts, ['client-id', 'client-secret', 'custom-redirect-uri']);\n\nconst hasGoogleUpdateFlags = (opts: Record<string, unknown>) =>\n isTrueFlag(getFlag(opts, 'dev-credentials')) ||\n hasGoogleCustomCredentialFlags(opts);\n\nconst selectGoogleUpdateMode = Effect.fn(function* ({\n isWeb,\n switchingFromShared,\n}: {\n isWeb: boolean;\n switchingFromShared: boolean;\n}) {\n if (switchingFromShared) {\n return yield* runUIEffect(\n new UI.Select({\n options: [\n { label: 'Custom Google credentials', value: 'custom' },\n {\n label: 'Instant dev credentials' + chalk.dim(' (current)'),\n value: 'none',\n },\n ],\n promptText: 'Choose credential mode:',\n modifyOutput: UI.modifiers.dimOnComplete,\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n }\n\n const options: { label: string; value: GoogleUpdateMode }[] = [\n { label: 'Rotate credentials', value: 'custom' },\n ];\n\n if (isWeb) {\n options.push(\n {\n label:\n 'Switch to Instant dev credentials' +\n chalk.dim(' (localhost and Expo, no Google setup)'),\n value: 'dev',\n },\n { label: 'Update redirect URI', value: 'redirect' },\n );\n }\n\n return yield* selectUpdateAction(options);\n});\n\nconst resolveGoogleUpdateMode = Effect.fn(function* ({\n opts,\n isWeb,\n switchingFromShared,\n}: {\n opts: Record<string, unknown>;\n isWeb: boolean;\n switchingFromShared: boolean;\n}) {\n const { yes } = yield* GlobalOpts;\n const devCredentialsFlag = isTrueFlag(getFlag(opts, 'dev-credentials'));\n const hasProvidedSomeCustomCredentials = hasGoogleCustomCredentialFlags(opts);\n\n if (devCredentialsFlag && !isWeb) {\n return yield* BadArgsError.make({\n message: '--dev-credentials is only supported for Google web clients.',\n });\n }\n\n if (\n !isWeb &&\n (hasFlag(opts, 'client-secret') || hasFlag(opts, 'custom-redirect-uri'))\n ) {\n return yield* BadArgsError.make({\n message:\n '--client-secret and --custom-redirect-uri are only supported for Google web clients.',\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 (devCredentialsFlag) {\n return 'dev';\n }\n\n const hasAnyUpdateFlag = hasGoogleUpdateFlags(opts);\n\n if (yes && !hasAnyUpdateFlag) {\n return yield* BadArgsError.make({\n message:\n 'Must specify at least one of --client-id, --client-secret, --custom-redirect-uri, or --dev-credentials.',\n });\n }\n\n if (hasAnyUpdateFlag) {\n return 'custom';\n }\n\n return yield* selectGoogleUpdateMode({ isWeb, switchingFromShared });\n});\n\nconst updateGoogleRedirect = Effect.fn(function* ({\n opts,\n client,\n}: {\n opts: Record<string, unknown>;\n client: OAuthClientRow;\n}) {\n const redirectTo = yield* optOrPromptIf(opts, 'custom-redirect-uri', {\n promptIf: true,\n required: true,\n prompt: newRedirectPrompt,\n });\n if (!redirectTo) {\n return yield* BadArgsError.make({\n message: 'Missing required value for --custom-redirect-uri',\n });\n }\n const response = yield* updateOAuthClient({\n oauthClientId: client.id,\n redirectTo,\n });\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client updated: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n ...redirectSetupMessages({\n prompt: 'Add this redirect URI in Google Console',\n redirectUri: redirectTo,\n showCustomRedirectInstructions: true,\n }),\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst updateGoogleCustomCredentials = Effect.fn(function* ({\n opts,\n client,\n isWeb,\n switchingFromShared,\n promptCredentials,\n}: {\n opts: Record<string, unknown>;\n client: OAuthClientRow;\n isWeb: boolean;\n switchingFromShared: boolean;\n promptCredentials: boolean;\n}) {\n const mustCollectCredentials = promptCredentials || switchingFromShared;\n const shouldPromptClientId =\n promptCredentials || (switchingFromShared && !hasFlag(opts, 'client-id'));\n const shouldPromptClientSecret =\n isWeb &&\n (promptCredentials ||\n (switchingFromShared && !hasFlag(opts, 'client-secret')));\n const shouldPromptRedirectUri =\n isWeb && switchingFromShared && promptCredentials;\n\n const clientId = yield* optOrPromptIf(opts, 'client-id', {\n promptIf: shouldPromptClientId,\n required: mustCollectCredentials,\n prompt: clientIdPrompt({ providerUrl: googleConsoleUrl }),\n });\n const clientSecret = yield* optOrPromptIf(opts, 'client-secret', {\n promptIf: shouldPromptClientSecret,\n required: isWeb && mustCollectCredentials,\n prompt: clientSecretPrompt({ providerUrl: googleConsoleUrl }),\n });\n const customRedirectUri = isWeb\n ? yield* optOrPromptIf(opts, 'custom-redirect-uri', {\n promptIf: shouldPromptRedirectUri,\n required: false,\n prompt: redirectPrompt,\n })\n : undefined;\n\n const redirectTo = switchingFromShared\n ? customRedirectUri || client.redirect_to || DEFAULT_OAUTH_CALLBACK_URL\n : customRedirectUri;\n\n const response = yield* updateOAuthClient({\n oauthClientId: client.id,\n clientId,\n clientSecret,\n redirectTo,\n useSharedCredentials: switchingFromShared ? false : undefined,\n });\n\n const lines = [\n `Google OAuth client updated: ${response.client.client_name}`,\n 'Credentials: custom',\n `ID: ${response.client.id}`,\n ];\n\n if (switchingFromShared) {\n lines.push('', 'This client no longer uses Instant dev credentials.');\n }\n if (isWeb && redirectTo) {\n lines.push(\n ...redirectSetupMessages({\n prompt: 'Add this redirect URI in Google Console',\n redirectUri: redirectTo,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n }),\n );\n }\n\n yield* Effect.log(\n boxen(lines.join('\\n'), {\n dimBorder: true,\n padding: { right: 1, left: 1 },\n }),\n );\n});\n\nconst handleGoogleUpdate = Effect.fn(function* (\n opts: Record<string, unknown>,\n client: OAuthClientRow,\n) {\n const { yes } = yield* GlobalOpts;\n const appType = getMetaString(client.meta, 'appType');\n const isWeb = appType === 'web' || !appType;\n const switchingFromShared = Boolean(client.use_shared_credentials);\n const hasAnyUpdateFlag = hasGoogleUpdateFlags(opts);\n\n if (!hasAnyUpdateFlag && !yes) {\n yield* Effect.log(\n `\\nCurrent mode: ${\n switchingFromShared\n ? chalk.bold('Instant dev credentials')\n : 'custom credentials'\n }`,\n );\n }\n\n const updateMode = yield* resolveGoogleUpdateMode({\n opts,\n isWeb,\n switchingFromShared,\n });\n\n if (updateMode === 'dev') {\n return yield* updateGoogleToDevCredentials(client);\n }\n\n if (updateMode === 'none') {\n yield* Effect.log(chalk.dim('No changes made.'));\n return;\n }\n\n if (updateMode === 'redirect') {\n return yield* updateGoogleRedirect({ opts, client });\n }\n\n return yield* updateGoogleCustomCredentials({\n opts,\n client,\n isWeb,\n switchingFromShared,\n promptCredentials: !hasAnyUpdateFlag && !yes,\n });\n});\n\nconst handleClientIdSecretUpdate = Effect.fn(function* (params: {\n opts: Record<string, unknown>;\n client: OAuthClientRow;\n providerLabel: string;\n providerUrl: string;\n redirectSetupPrompt: string;\n}) {\n const { yes } = yield* GlobalOpts;\n const hasAnyUpdateFlag = hasAnyFlag(params.opts, [\n 'client-id',\n 'client-secret',\n 'custom-redirect-uri',\n ]);\n if (yes && !hasAnyUpdateFlag) {\n return yield* BadArgsError.make({\n message:\n 'Must specify at least one of --client-id, --client-secret, or --custom-redirect-uri.',\n });\n }\n\n let promptCredentials = false;\n let promptRedirect = false;\n\n if (!hasAnyUpdateFlag && !yes) {\n const action = yield* selectUpdateAction([\n { label: 'Rotate credentials', value: 'rotate' },\n { label: 'Update redirect URI', value: 'redirect' },\n ]);\n promptCredentials = action === 'rotate';\n promptRedirect = action === 'redirect';\n }\n\n const clientId = yield* optOrPromptIf(params.opts, 'client-id', {\n promptIf: promptCredentials,\n required: promptCredentials,\n prompt: clientIdPrompt({ providerUrl: params.providerUrl }),\n });\n const clientSecret = yield* optOrPromptIf(params.opts, 'client-secret', {\n promptIf: promptCredentials,\n required: promptCredentials,\n prompt: clientSecretPrompt({ providerUrl: params.providerUrl }),\n });\n const customRedirectUri = yield* optOrPromptIf(\n params.opts,\n 'custom-redirect-uri',\n {\n promptIf: promptRedirect,\n required: promptRedirect,\n prompt: promptRedirect ? newRedirectPrompt : redirectPrompt,\n },\n );\n\n const response = yield* updateOAuthClient({\n oauthClientId: params.client.id,\n clientId,\n clientSecret,\n redirectTo: customRedirectUri,\n });\n\n const lines = [\n `${params.providerLabel} OAuth client updated: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n ];\n\n if (customRedirectUri) {\n lines.push(\n ...redirectSetupMessages({\n prompt: params.redirectSetupPrompt,\n redirectUri: customRedirectUri,\n showCustomRedirectInstructions: true,\n }),\n );\n }\n\n yield* Effect.log(\n boxen(lines.join('\\n'), {\n dimBorder: true,\n padding: { right: 1, left: 1 },\n }),\n );\n});\n\nconst appleWebFlags = [\n 'team-id',\n 'key-id',\n 'private-key-file',\n 'custom-redirect-uri',\n];\nconst appleUpdateFlags = ['services-id', ...appleWebFlags];\n\nconst hasAppleWebFlags = (opts: Record<string, unknown>) =>\n hasAnyFlag(opts, appleWebFlags);\n\nconst hasAppleUpdateFlags = (opts: Record<string, unknown>) =>\n hasAnyFlag(opts, appleUpdateFlags);\n\nconst appleClientHasWebConfig = (client: OAuthClientRow) =>\n Boolean(\n getMetaString(client.meta, 'teamId') ||\n getMetaString(client.meta, 'keyId') ||\n client.redirect_to,\n );\n\ntype AppleWebUpdate = {\n privateKey?: string;\n redirectTo?: string;\n customRedirectUri?: string;\n meta?: Record<string, string>;\n};\n\nconst resolveAppleUpdateConfig = Effect.fn(function* ({\n opts,\n client,\n yes,\n}: {\n opts: Record<string, unknown>;\n client: OAuthClientRow;\n yes: boolean;\n}) {\n const hasAnyUpdateFlag = hasAppleUpdateFlags(opts);\n\n if (yes && !hasAnyUpdateFlag) {\n return yield* BadArgsError.make({\n message:\n 'Must specify at least one of --services-id, --team-id, --key-id, --private-key-file, or --custom-redirect-uri.',\n });\n }\n\n const promptAll = !hasAnyUpdateFlag && !yes;\n if (!promptAll) {\n return { promptAll, configureWeb: hasAppleWebFlags(opts) };\n }\n\n const configureWeb = yield* runUIEffect(\n new UI.Confirmation({\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: appleClientHasWebConfig(client),\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n\n return { promptAll, configureWeb };\n});\n\nconst readAppleWebUpdate = Effect.fn(function* ({\n opts,\n client,\n promptAll,\n}: {\n opts: Record<string, unknown>;\n client: OAuthClientRow;\n promptAll: boolean;\n}) {\n const teamId = yield* optOrPromptIf(opts, 'team-id', {\n promptIf: promptAll,\n required: promptAll,\n prompt: appleTeamIdPrompt({}),\n });\n const keyId = yield* optOrPromptIf(opts, 'key-id', {\n promptIf: promptAll,\n required: promptAll,\n prompt: appleKeyIdPrompt({}),\n });\n const privateKeyPath = yield* optOrPromptIf(opts, 'private-key-file', {\n promptIf: promptAll,\n required: promptAll,\n prompt: applePrivateKeyFilePrompt({}),\n });\n const privateKey = privateKeyPath\n ? yield* readPrivateKeyFile(privateKeyPath)\n : undefined;\n const customRedirectUri = yield* optOrPromptIf(opts, 'custom-redirect-uri', {\n promptIf: promptAll,\n required: false,\n prompt: redirectPrompt,\n });\n\n const meta: Record<string, string> = {};\n if (teamId) meta.teamId = teamId;\n if (keyId) meta.keyId = keyId;\n\n return {\n privateKey,\n redirectTo: privateKey\n ? customRedirectUri || client.redirect_to || DEFAULT_OAUTH_CALLBACK_URL\n : customRedirectUri,\n customRedirectUri,\n meta: Object.keys(meta).length ? meta : undefined,\n } satisfies AppleWebUpdate;\n});\n\nconst handleAppleUpdate = Effect.fn(function* (\n opts: Record<string, unknown>,\n client: OAuthClientRow,\n) {\n const { yes } = yield* GlobalOpts;\n const { promptAll, configureWeb } = yield* resolveAppleUpdateConfig({\n opts,\n client,\n yes,\n });\n\n const servicesId = yield* optOrPromptIf(opts, 'services-id', {\n promptIf: promptAll,\n required: promptAll,\n prompt: appleServicesIdPrompt({}),\n });\n const webUpdate: AppleWebUpdate = configureWeb\n ? yield* readAppleWebUpdate({ opts, client, promptAll })\n : {};\n\n const response = yield* updateOAuthClient({\n oauthClientId: client.id,\n clientId: servicesId,\n clientSecret: webUpdate.privateKey,\n redirectTo: webUpdate.redirectTo,\n meta: webUpdate.meta,\n });\n\n const lines = [\n `Apple OAuth client updated: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n ];\n\n if (webUpdate.redirectTo) {\n lines.push(\n ...redirectSetupMessages({\n prompt: `Add this return URL under your Services ID on ${link('https://developer.apple.com', 'developer.apple.com')}`,\n redirectUri: webUpdate.redirectTo,\n showCustomRedirectInstructions: Boolean(webUpdate.customRedirectUri),\n }),\n );\n }\n\n yield* Effect.log(\n boxen(lines.join('\\n'), {\n dimBorder: true,\n padding: { right: 1, left: 1 },\n }),\n );\n});\n\nconst handleClerkUpdate = Effect.fn(function* (\n opts: Record<string, unknown>,\n client: OAuthClientRow,\n) {\n const { yes } = yield* GlobalOpts;\n const publishableKey = yield* optOrPromptIf(opts, 'publishable-key', {\n promptIf: !yes && !hasFlag(opts, 'publishable-key'),\n required: true,\n prompt: clerkPublishableKeyPrompt({}),\n });\n\n if (!publishableKey) {\n return yield* BadArgsError.make({\n message: 'Missing required value for --publishable-key',\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* updateOAuthClient({\n oauthClientId: client.id,\n discoveryEndpoint: `https://${domain}/.well-known/openid-configuration`,\n meta: { clerkPublishableKey: publishableKey },\n });\n\n yield* Effect.log(\n boxen(\n [\n `Clerk OAuth client updated: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Clerk Domain: https://${domain}`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleFirebaseUpdate = Effect.fn(function* (\n opts: Record<string, unknown>,\n client: OAuthClientRow,\n) {\n const { yes } = yield* GlobalOpts;\n const projectId = yield* optOrPromptIf(opts, 'project-id', {\n promptIf: !yes && !hasFlag(opts, 'project-id'),\n required: true,\n prompt: firebaseProjectIdPrompt({}),\n });\n\n const validationError = validateFirebaseProjectId(projectId ?? '');\n if (validationError) {\n return yield* BadArgsError.make({ message: validationError });\n }\n\n const response = yield* updateOAuthClient({\n oauthClientId: client.id,\n discoveryEndpoint: firebaseDiscoveryEndpoint(projectId!),\n });\n\n yield* Effect.log(\n boxen(\n [\n `Firebase OAuth client updated: ${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 authClientUpdateCmd = Effect.fn(\n function* (\n opts: OptsFromCommand<typeof authClientUpdateDef> & Record<string, unknown>,\n ) {\n const { auth, client: resolvedClient } = yield* resolveClient({\n id: opts.id,\n name: opts.name,\n });\n const provider = (auth.oauth_service_providers ?? []).find(\n (entry: ProviderRow) => entry.id === resolvedClient.provider_id,\n );\n\n if (!provider) {\n return yield* BadArgsError.make({\n message: `OAuth provider not found for client: ${resolvedClient.client_name}`,\n });\n }\n\n yield* Match.value(provider.provider_name).pipe(\n Match.withReturnType<Effect.Effect<void, any, any>>(),\n Match.when('google', () => handleGoogleUpdate(opts, resolvedClient)),\n Match.when('github', () =>\n handleClientIdSecretUpdate({\n opts,\n client: resolvedClient,\n providerLabel: 'GitHub',\n providerUrl: 'https://github.com/settings/developers',\n redirectSetupPrompt:\n 'Add this callback URL in your GitHub OAuth App settings',\n }),\n ),\n Match.when('linkedin', () =>\n handleClientIdSecretUpdate({\n opts,\n client: resolvedClient,\n providerLabel: 'LinkedIn',\n providerUrl: 'https://www.linkedin.com/developers/apps',\n redirectSetupPrompt:\n 'Add this redirect URI in your LinkedIn app settings',\n }),\n ),\n Match.when('apple', () => handleAppleUpdate(opts, resolvedClient)),\n Match.when('clerk', () => handleClerkUpdate(opts, resolvedClient)),\n Match.when('firebase', () => handleFirebaseUpdate(opts, resolvedClient)),\n Match.orElse((providerName) =>\n BadArgsError.make({\n message: `Updating ${providerName} OAuth clients is not supported.`,\n }),\n ),\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 update --help` for available arguments',\n ),\n );\n }),\n ),\n);\n"]}
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/update.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, Match } from 'effect';\nimport type { authClientUpdateDef, OptsFromCommand } from '../../../index.ts';\nimport { BadArgsError } from '../../../errors.ts';\nimport { GlobalOpts } from '../../../context/globalOpts.ts';\nimport { optOrPrompt, runUIEffect } from '../../../lib/ui.ts';\nimport {\n findClientByIdOrName,\n getAppsAuth,\n OAuthClient,\n updateOAuthClient,\n} from '../../../lib/oauth.ts';\nimport { UI } from '../../../ui/index.ts';\nimport { DEFAULT_OAUTH_CALLBACK_URL } from '@instantdb/platform';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport {\n appleKeyIdPrompt,\n applePrivateKeyFilePrompt,\n appleServicesIdPrompt,\n appleTeamIdPrompt,\n clerkPublishableKeyPrompt,\n clientIdPrompt,\n clientSecretPrompt,\n domainFromClerkKey,\n firebaseDiscoveryEndpoint,\n firebaseProjectIdPrompt,\n getFlag,\n getMetaString,\n hasAnyFlag,\n hasFlag,\n isTrueFlag,\n readPrivateKeyFile,\n redirectSetupMessages,\n redirectUriPrompt,\n validateFirebaseProjectId,\n} from './shared.ts';\nimport { link } from '../../../logging.ts';\n\ntype OAuthClientRow = typeof OAuthClient.Type;\n\ntype ProviderRow = {\n id: string;\n provider_name: string;\n};\n\nconst redirectPrompt = redirectUriPrompt({\n heading: 'Custom redirect URI (optional):',\n});\nconst newRedirectPrompt = redirectUriPrompt({ heading: 'New redirect URI:' });\nconst googleConsoleUrl =\n 'https://console.developers.google.com/apis/credentials';\n\nconst resolveClient = Effect.fn(function* (params: {\n id?: string;\n name?: string;\n}) {\n const { yes } = yield* GlobalOpts;\n\n if (params.id || params.name) {\n return yield* findClientByIdOrName({\n id: params.id,\n name: params.name,\n });\n }\n\n if (yes) {\n return yield* BadArgsError.make({ message: 'Must specify --id or --name' });\n }\n\n const auth = yield* getAppsAuth();\n const clients = (auth.oauth_clients ?? []) as OAuthClientRow[];\n\n if (clients.length === 0) {\n return yield* BadArgsError.make({\n message: 'No OAuth clients found for this app.',\n });\n }\n\n return yield* runUIEffect(\n new UI.Select({\n options: clients.map((client) => ({\n label:\n client.client_name +\n (client.use_shared_credentials\n ? chalk.dim(' (dev credentials)')\n : '') +\n chalk.dim(` (${client.id})`),\n value: client,\n })),\n promptText: 'Select a client to update:',\n modifyOutput: UI.modifiers.dimOnComplete,\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n Effect.map((client) => ({ auth, client })),\n );\n});\n\nconst selectUpdateAction = Effect.fn(function* <T extends string>(\n options: { label: string; value: T; secondary?: boolean }[],\n) {\n return yield* runUIEffect(\n new UI.Select({\n options,\n promptText: 'What do you want to update?',\n modifyOutput: UI.modifiers.dimOnComplete,\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n});\n\nconst updateGoogleToDevCredentials = Effect.fn(function* (\n client: OAuthClientRow,\n) {\n const response = yield* updateOAuthClient({\n oauthClientId: client.id,\n clientId: null,\n clientSecret: null,\n useSharedCredentials: true,\n redirectTo: null,\n });\n\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client updated: ${response.client.client_name}`,\n 'Credentials: Instant dev credentials',\n `ID: ${response.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 ${response.client.client_name} --client-id <id> --client-secret <secret>`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\ntype GoogleUpdateMode = 'dev' | 'custom' | 'redirect' | 'none';\n\nconst hasGoogleCustomCredentialFlags = (opts: Record<string, unknown>) =>\n hasAnyFlag(opts, ['client-id', 'client-secret', 'custom-redirect-uri']);\n\nconst hasGoogleUpdateFlags = (opts: Record<string, unknown>) =>\n isTrueFlag(getFlag(opts, 'dev-credentials')) ||\n hasGoogleCustomCredentialFlags(opts);\n\nconst optOrPromptWhenNeeded = (\n opts: Record<string, unknown>,\n flag: string,\n params: {\n promptIf: boolean;\n required?: boolean;\n prompt: UI.TextInputProps;\n },\n) =>\n Effect.gen(function* () {\n const value = getFlag(opts, flag);\n if (value === undefined && !params.promptIf) return undefined;\n return yield* optOrPrompt(value, {\n simpleName: `--${flag}`,\n required: params.required ?? params.promptIf,\n skipIf: false,\n prompt: params.prompt,\n });\n });\n\nconst selectGoogleUpdateMode = Effect.fn(function* ({\n isWeb,\n switchingFromShared,\n}: {\n isWeb: boolean;\n switchingFromShared: boolean;\n}) {\n if (switchingFromShared) {\n return yield* runUIEffect(\n new UI.Select({\n options: [\n { label: 'Custom Google credentials', value: 'custom' },\n {\n label: 'Instant dev credentials' + chalk.dim(' (current)'),\n value: 'none',\n },\n ],\n promptText: 'Choose credential mode:',\n modifyOutput: UI.modifiers.dimOnComplete,\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n }\n\n const options: { label: string; value: GoogleUpdateMode }[] = [\n { label: 'Rotate credentials', value: 'custom' },\n ];\n\n if (isWeb) {\n options.push(\n {\n label:\n 'Switch to Instant dev credentials' +\n chalk.dim(' (localhost and Expo, no Google setup)'),\n value: 'dev',\n },\n { label: 'Update redirect URI', value: 'redirect' },\n );\n }\n\n return yield* selectUpdateAction(options);\n});\n\nconst resolveGoogleUpdateMode = Effect.fn(function* ({\n opts,\n isWeb,\n switchingFromShared,\n}: {\n opts: Record<string, unknown>;\n isWeb: boolean;\n switchingFromShared: boolean;\n}) {\n const { yes } = yield* GlobalOpts;\n const devCredentialsFlag = isTrueFlag(getFlag(opts, 'dev-credentials'));\n const hasProvidedSomeCustomCredentials = hasGoogleCustomCredentialFlags(opts);\n\n if (devCredentialsFlag && !isWeb) {\n return yield* BadArgsError.make({\n message: '--dev-credentials is only supported for Google web clients.',\n });\n }\n\n if (\n !isWeb &&\n (hasFlag(opts, 'client-secret') || hasFlag(opts, 'custom-redirect-uri'))\n ) {\n return yield* BadArgsError.make({\n message:\n '--client-secret and --custom-redirect-uri are only supported for Google web clients.',\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 (devCredentialsFlag) {\n return 'dev';\n }\n\n const hasAnyUpdateFlag = hasGoogleUpdateFlags(opts);\n\n if (yes && !hasAnyUpdateFlag) {\n return yield* BadArgsError.make({\n message:\n 'Must specify at least one of --client-id, --client-secret, --custom-redirect-uri, or --dev-credentials.',\n });\n }\n\n if (hasAnyUpdateFlag) {\n return 'custom';\n }\n\n return yield* selectGoogleUpdateMode({ isWeb, switchingFromShared });\n});\n\nconst updateGoogleRedirect = Effect.fn(function* ({\n opts,\n client,\n}: {\n opts: Record<string, unknown>;\n client: OAuthClientRow;\n}) {\n const redirectTo = yield* optOrPromptWhenNeeded(opts, 'custom-redirect-uri', {\n promptIf: true,\n required: true,\n prompt: newRedirectPrompt,\n });\n if (!redirectTo) {\n return yield* BadArgsError.make({\n message: 'Missing required value for --custom-redirect-uri',\n });\n }\n const response = yield* updateOAuthClient({\n oauthClientId: client.id,\n redirectTo,\n });\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client updated: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n ...redirectSetupMessages({\n prompt: 'Add this redirect URI in Google Console',\n redirectUri: redirectTo,\n showCustomRedirectInstructions: true,\n }),\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst updateGoogleCustomCredentials = Effect.fn(function* ({\n opts,\n client,\n isWeb,\n switchingFromShared,\n promptCredentials,\n}: {\n opts: Record<string, unknown>;\n client: OAuthClientRow;\n isWeb: boolean;\n switchingFromShared: boolean;\n promptCredentials: boolean;\n}) {\n const mustCollectCredentials = promptCredentials || switchingFromShared;\n const shouldPromptClientId =\n promptCredentials || (switchingFromShared && !hasFlag(opts, 'client-id'));\n const shouldPromptClientSecret =\n isWeb &&\n (promptCredentials ||\n (switchingFromShared && !hasFlag(opts, 'client-secret')));\n const shouldPromptRedirectUri =\n isWeb && switchingFromShared && promptCredentials;\n\n const clientId = yield* optOrPromptWhenNeeded(opts, 'client-id', {\n promptIf: shouldPromptClientId,\n required: mustCollectCredentials,\n prompt: clientIdPrompt({ providerUrl: googleConsoleUrl }),\n });\n const clientSecret = yield* optOrPromptWhenNeeded(opts, 'client-secret', {\n promptIf: shouldPromptClientSecret,\n required: isWeb && mustCollectCredentials,\n prompt: clientSecretPrompt({ providerUrl: googleConsoleUrl }),\n });\n const customRedirectUri = isWeb\n ? yield* optOrPromptWhenNeeded(opts, 'custom-redirect-uri', {\n promptIf: shouldPromptRedirectUri,\n required: false,\n prompt: redirectPrompt,\n })\n : undefined;\n\n const redirectTo = switchingFromShared\n ? customRedirectUri || client.redirect_to || DEFAULT_OAUTH_CALLBACK_URL\n : customRedirectUri;\n\n const response = yield* updateOAuthClient({\n oauthClientId: client.id,\n clientId,\n clientSecret,\n redirectTo,\n useSharedCredentials: switchingFromShared ? false : undefined,\n });\n\n const lines = [\n `Google OAuth client updated: ${response.client.client_name}`,\n 'Credentials: custom',\n `ID: ${response.client.id}`,\n ];\n\n if (switchingFromShared) {\n lines.push('', 'This client no longer uses Instant dev credentials.');\n }\n if (isWeb && redirectTo) {\n lines.push(\n ...redirectSetupMessages({\n prompt: 'Add this redirect URI in Google Console',\n redirectUri: redirectTo,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n }),\n );\n }\n\n yield* Effect.log(\n boxen(lines.join('\\n'), {\n dimBorder: true,\n padding: { right: 1, left: 1 },\n }),\n );\n});\n\nconst handleGoogleUpdate = Effect.fn(function* (\n opts: Record<string, unknown>,\n client: OAuthClientRow,\n) {\n const { yes } = yield* GlobalOpts;\n const appType = getMetaString(client.meta, 'appType');\n const isWeb = appType === 'web' || !appType;\n const switchingFromShared = Boolean(client.use_shared_credentials);\n const hasAnyUpdateFlag = hasGoogleUpdateFlags(opts);\n\n if (!hasAnyUpdateFlag && !yes) {\n yield* Effect.log(\n `\\nCurrent mode: ${\n switchingFromShared\n ? chalk.bold('Instant dev credentials')\n : 'custom credentials'\n }`,\n );\n }\n\n const updateMode = yield* resolveGoogleUpdateMode({\n opts,\n isWeb,\n switchingFromShared,\n });\n\n if (updateMode === 'dev') {\n return yield* updateGoogleToDevCredentials(client);\n }\n\n if (updateMode === 'none') {\n yield* Effect.log(chalk.dim('No changes made.'));\n return;\n }\n\n if (updateMode === 'redirect') {\n return yield* updateGoogleRedirect({ opts, client });\n }\n\n return yield* updateGoogleCustomCredentials({\n opts,\n client,\n isWeb,\n switchingFromShared,\n promptCredentials: !hasAnyUpdateFlag && !yes,\n });\n});\n\nconst handleClientIdSecretUpdate = Effect.fn(function* (params: {\n opts: Record<string, unknown>;\n client: OAuthClientRow;\n providerLabel: string;\n providerUrl: string;\n redirectSetupPrompt: string;\n}) {\n const { yes } = yield* GlobalOpts;\n const hasAnyUpdateFlag = hasAnyFlag(params.opts, [\n 'client-id',\n 'client-secret',\n 'custom-redirect-uri',\n ]);\n if (yes && !hasAnyUpdateFlag) {\n return yield* BadArgsError.make({\n message:\n 'Must specify at least one of --client-id, --client-secret, or --custom-redirect-uri.',\n });\n }\n\n let promptCredentials = false;\n let promptRedirect = false;\n\n if (!hasAnyUpdateFlag && !yes) {\n const action = yield* selectUpdateAction([\n { label: 'Rotate credentials', value: 'rotate' },\n { label: 'Update redirect URI', value: 'redirect' },\n ]);\n promptCredentials = action === 'rotate';\n promptRedirect = action === 'redirect';\n }\n\n const clientId = yield* optOrPromptWhenNeeded(params.opts, 'client-id', {\n promptIf: promptCredentials,\n required: promptCredentials,\n prompt: clientIdPrompt({ providerUrl: params.providerUrl }),\n });\n const clientSecret = yield* optOrPromptWhenNeeded(\n params.opts,\n 'client-secret',\n {\n promptIf: promptCredentials,\n required: promptCredentials,\n prompt: clientSecretPrompt({ providerUrl: params.providerUrl }),\n },\n );\n const customRedirectUri = yield* optOrPromptWhenNeeded(\n params.opts,\n 'custom-redirect-uri',\n {\n promptIf: promptRedirect,\n required: promptRedirect,\n prompt: promptRedirect ? newRedirectPrompt : redirectPrompt,\n },\n );\n\n const response = yield* updateOAuthClient({\n oauthClientId: params.client.id,\n clientId,\n clientSecret,\n redirectTo: customRedirectUri,\n });\n\n const lines = [\n `${params.providerLabel} OAuth client updated: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n ];\n\n if (customRedirectUri) {\n lines.push(\n ...redirectSetupMessages({\n prompt: params.redirectSetupPrompt,\n redirectUri: customRedirectUri,\n showCustomRedirectInstructions: true,\n }),\n );\n }\n\n yield* Effect.log(\n boxen(lines.join('\\n'), {\n dimBorder: true,\n padding: { right: 1, left: 1 },\n }),\n );\n});\n\nconst appleWebFlags = [\n 'team-id',\n 'key-id',\n 'private-key-file',\n 'custom-redirect-uri',\n];\nconst appleUpdateFlags = ['services-id', ...appleWebFlags];\n\nconst hasAppleWebFlags = (opts: Record<string, unknown>) =>\n hasAnyFlag(opts, appleWebFlags);\n\nconst hasAppleUpdateFlags = (opts: Record<string, unknown>) =>\n hasAnyFlag(opts, appleUpdateFlags);\n\nconst appleClientHasWebConfig = (client: OAuthClientRow) =>\n Boolean(\n getMetaString(client.meta, 'teamId') ||\n getMetaString(client.meta, 'keyId') ||\n client.redirect_to,\n );\n\ntype AppleWebUpdate = {\n privateKey?: string;\n redirectTo?: string;\n customRedirectUri?: string;\n meta?: Record<string, string>;\n};\n\nconst resolveAppleUpdateConfig = Effect.fn(function* ({\n opts,\n client,\n yes,\n}: {\n opts: Record<string, unknown>;\n client: OAuthClientRow;\n yes: boolean;\n}) {\n const hasAnyUpdateFlag = hasAppleUpdateFlags(opts);\n\n if (yes && !hasAnyUpdateFlag) {\n return yield* BadArgsError.make({\n message:\n 'Must specify at least one of --services-id, --team-id, --key-id, --private-key-file, or --custom-redirect-uri.',\n });\n }\n\n const promptAll = !hasAnyUpdateFlag && !yes;\n if (!promptAll) {\n return { promptAll, configureWeb: hasAppleWebFlags(opts) };\n }\n\n const configureWeb = yield* runUIEffect(\n new UI.Confirmation({\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: appleClientHasWebConfig(client),\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n\n return { promptAll, configureWeb };\n});\n\nconst readAppleWebUpdate = Effect.fn(function* ({\n opts,\n client,\n promptAll,\n}: {\n opts: Record<string, unknown>;\n client: OAuthClientRow;\n promptAll: boolean;\n}) {\n const teamId = yield* optOrPromptWhenNeeded(opts, 'team-id', {\n promptIf: promptAll,\n required: promptAll,\n prompt: appleTeamIdPrompt({}),\n });\n const keyId = yield* optOrPromptWhenNeeded(opts, 'key-id', {\n promptIf: promptAll,\n required: promptAll,\n prompt: appleKeyIdPrompt({}),\n });\n const privateKeyPath = yield* optOrPromptWhenNeeded(\n opts,\n 'private-key-file',\n {\n promptIf: promptAll,\n required: promptAll,\n prompt: applePrivateKeyFilePrompt({}),\n },\n );\n const privateKey = privateKeyPath\n ? yield* readPrivateKeyFile(privateKeyPath)\n : undefined;\n const customRedirectUri = yield* optOrPromptWhenNeeded(\n opts,\n 'custom-redirect-uri',\n {\n promptIf: promptAll,\n required: false,\n prompt: redirectPrompt,\n },\n );\n\n const meta: Record<string, string> = {};\n if (teamId) meta.teamId = teamId;\n if (keyId) meta.keyId = keyId;\n\n return {\n privateKey,\n redirectTo: privateKey\n ? customRedirectUri || client.redirect_to || DEFAULT_OAUTH_CALLBACK_URL\n : customRedirectUri,\n customRedirectUri,\n meta: Object.keys(meta).length ? meta : undefined,\n } satisfies AppleWebUpdate;\n});\n\nconst handleAppleUpdate = Effect.fn(function* (\n opts: Record<string, unknown>,\n client: OAuthClientRow,\n) {\n const { yes } = yield* GlobalOpts;\n const { promptAll, configureWeb } = yield* resolveAppleUpdateConfig({\n opts,\n client,\n yes,\n });\n\n const servicesId = yield* optOrPromptWhenNeeded(opts, 'services-id', {\n promptIf: promptAll,\n required: promptAll,\n prompt: appleServicesIdPrompt({}),\n });\n const webUpdate: AppleWebUpdate = configureWeb\n ? yield* readAppleWebUpdate({ opts, client, promptAll })\n : {};\n\n const response = yield* updateOAuthClient({\n oauthClientId: client.id,\n clientId: servicesId,\n clientSecret: webUpdate.privateKey,\n redirectTo: webUpdate.redirectTo,\n meta: webUpdate.meta,\n });\n\n const lines = [\n `Apple OAuth client updated: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n ];\n\n if (webUpdate.redirectTo) {\n lines.push(\n ...redirectSetupMessages({\n prompt: `Add this return URL under your Services ID on ${link('https://developer.apple.com', 'developer.apple.com')}`,\n redirectUri: webUpdate.redirectTo,\n showCustomRedirectInstructions: Boolean(webUpdate.customRedirectUri),\n }),\n );\n }\n\n yield* Effect.log(\n boxen(lines.join('\\n'), {\n dimBorder: true,\n padding: { right: 1, left: 1 },\n }),\n );\n});\n\nconst handleClerkUpdate = Effect.fn(function* (\n opts: Record<string, unknown>,\n client: OAuthClientRow,\n) {\n const { yes } = yield* GlobalOpts;\n const publishableKey = yield* optOrPromptWhenNeeded(opts, 'publishable-key', {\n promptIf: !yes && !hasFlag(opts, 'publishable-key'),\n required: true,\n prompt: clerkPublishableKeyPrompt({}),\n });\n\n if (!publishableKey) {\n return yield* BadArgsError.make({\n message: 'Missing required value for --publishable-key',\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* updateOAuthClient({\n oauthClientId: client.id,\n discoveryEndpoint: `https://${domain}/.well-known/openid-configuration`,\n meta: { clerkPublishableKey: publishableKey },\n });\n\n yield* Effect.log(\n boxen(\n [\n `Clerk OAuth client updated: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Clerk Domain: https://${domain}`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleFirebaseUpdate = Effect.fn(function* (\n opts: Record<string, unknown>,\n client: OAuthClientRow,\n) {\n const { yes } = yield* GlobalOpts;\n const projectId = yield* optOrPromptWhenNeeded(opts, 'project-id', {\n promptIf: !yes && !hasFlag(opts, 'project-id'),\n required: true,\n prompt: firebaseProjectIdPrompt({}),\n });\n\n const validationError = validateFirebaseProjectId(projectId ?? '');\n if (validationError) {\n return yield* BadArgsError.make({ message: validationError });\n }\n\n const response = yield* updateOAuthClient({\n oauthClientId: client.id,\n discoveryEndpoint: firebaseDiscoveryEndpoint(projectId!),\n });\n\n yield* Effect.log(\n boxen(\n [\n `Firebase OAuth client updated: ${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 authClientUpdateCmd = Effect.fn(\n function* (\n opts: OptsFromCommand<typeof authClientUpdateDef> & Record<string, unknown>,\n ) {\n const { auth, client: resolvedClient } = yield* resolveClient({\n id: opts.id,\n name: opts.name,\n });\n const provider = (auth.oauth_service_providers ?? []).find(\n (entry: ProviderRow) => entry.id === resolvedClient.provider_id,\n );\n\n if (!provider) {\n return yield* BadArgsError.make({\n message: `OAuth provider not found for client: ${resolvedClient.client_name}`,\n });\n }\n\n yield* Match.value(provider.provider_name).pipe(\n Match.withReturnType<Effect.Effect<void, any, any>>(),\n Match.when('google', () => handleGoogleUpdate(opts, resolvedClient)),\n Match.when('github', () =>\n handleClientIdSecretUpdate({\n opts,\n client: resolvedClient,\n providerLabel: 'GitHub',\n providerUrl: 'https://github.com/settings/developers',\n redirectSetupPrompt:\n 'Add this callback URL in your GitHub OAuth App settings',\n }),\n ),\n Match.when('linkedin', () =>\n handleClientIdSecretUpdate({\n opts,\n client: resolvedClient,\n providerLabel: 'LinkedIn',\n providerUrl: 'https://www.linkedin.com/developers/apps',\n redirectSetupPrompt:\n 'Add this redirect URI in your LinkedIn app settings',\n }),\n ),\n Match.when('apple', () => handleAppleUpdate(opts, resolvedClient)),\n Match.when('clerk', () => handleClerkUpdate(opts, resolvedClient)),\n Match.when('firebase', () => handleFirebaseUpdate(opts, resolvedClient)),\n Match.orElse((providerName) =>\n BadArgsError.make({\n message: `Updating ${providerName} OAuth clients is not supported.`,\n }),\n ),\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 update --help` for available arguments',\n ),\n );\n }),\n ),\n);\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "instant-cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.22-branch-cli-codex-update.
|
|
4
|
+
"version": "1.0.22-branch-cli-codex-update.25347761204.1",
|
|
5
5
|
"description": "Instant's CLI",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"homepage": "https://github.com/instantdb/instant/tree/main/client/packages/cli",
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
"strip-ansi": "^7.1.2",
|
|
51
51
|
"supports-hyperlinks": "^4.4.0",
|
|
52
52
|
"unconfig": "^7.5.0",
|
|
53
|
-
"@instantdb/core": "1.0.22-branch-cli-codex-update.
|
|
54
|
-
"@instantdb/platform": "1.0.22-branch-cli-codex-update.
|
|
55
|
-
"@instantdb/version": "1.0.22-branch-cli-codex-update.
|
|
53
|
+
"@instantdb/core": "1.0.22-branch-cli-codex-update.25347761204.1",
|
|
54
|
+
"@instantdb/platform": "1.0.22-branch-cli-codex-update.25347761204.1",
|
|
55
|
+
"@instantdb/version": "1.0.22-branch-cli-codex-update.25347761204.1"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@babel/core": "^7.17.9",
|
|
@@ -4,11 +4,7 @@ import { DEFAULT_OAUTH_CALLBACK_URL } from '@instantdb/platform';
|
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import { BadArgsError } from '../../../errors.ts';
|
|
6
6
|
import { link } from '../../../logging.ts';
|
|
7
|
-
import {
|
|
8
|
-
optOrPrompt,
|
|
9
|
-
stripFirstBlankLine,
|
|
10
|
-
validateRequired,
|
|
11
|
-
} from '../../../lib/ui.ts';
|
|
7
|
+
import { stripFirstBlankLine, validateRequired } from '../../../lib/ui.ts';
|
|
12
8
|
import { UI } from '../../../ui/index.ts';
|
|
13
9
|
|
|
14
10
|
type EmptyPromptArgs = Record<string, never>;
|
|
@@ -31,26 +27,6 @@ export const getMetaString = (meta: unknown, key: string) => {
|
|
|
31
27
|
return typeof value === 'string' ? value : undefined;
|
|
32
28
|
};
|
|
33
29
|
|
|
34
|
-
export const optOrPromptIf = (
|
|
35
|
-
opts: Record<string, unknown>,
|
|
36
|
-
flag: string,
|
|
37
|
-
params: {
|
|
38
|
-
promptIf: boolean;
|
|
39
|
-
required?: boolean;
|
|
40
|
-
prompt: UI.TextInputProps;
|
|
41
|
-
},
|
|
42
|
-
) =>
|
|
43
|
-
Effect.gen(function* () {
|
|
44
|
-
const value = getFlag(opts, flag);
|
|
45
|
-
if (value === undefined && !params.promptIf) return undefined;
|
|
46
|
-
return yield* optOrPrompt(value, {
|
|
47
|
-
simpleName: `--${flag}`,
|
|
48
|
-
required: params.required ?? params.promptIf,
|
|
49
|
-
skipIf: false,
|
|
50
|
-
prompt: params.prompt,
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
30
|
export const clientIdPrompt = ({ providerUrl }: { providerUrl: string }) => ({
|
|
55
31
|
prompt: `Client ID: ${chalk.dim(`(from ${link(providerUrl)})`)}`,
|
|
56
32
|
validate: validateRequired,
|
|
@@ -2,7 +2,7 @@ import { Effect, Match } from 'effect';
|
|
|
2
2
|
import type { authClientUpdateDef, OptsFromCommand } from '../../../index.ts';
|
|
3
3
|
import { BadArgsError } from '../../../errors.ts';
|
|
4
4
|
import { GlobalOpts } from '../../../context/globalOpts.ts';
|
|
5
|
-
import { runUIEffect } from '../../../lib/ui.ts';
|
|
5
|
+
import { optOrPrompt, runUIEffect } from '../../../lib/ui.ts';
|
|
6
6
|
import {
|
|
7
7
|
findClientByIdOrName,
|
|
8
8
|
getAppsAuth,
|
|
@@ -29,7 +29,6 @@ import {
|
|
|
29
29
|
hasAnyFlag,
|
|
30
30
|
hasFlag,
|
|
31
31
|
isTrueFlag,
|
|
32
|
-
optOrPromptIf,
|
|
33
32
|
readPrivateKeyFile,
|
|
34
33
|
redirectSetupMessages,
|
|
35
34
|
redirectUriPrompt,
|
|
@@ -153,6 +152,26 @@ const hasGoogleUpdateFlags = (opts: Record<string, unknown>) =>
|
|
|
153
152
|
isTrueFlag(getFlag(opts, 'dev-credentials')) ||
|
|
154
153
|
hasGoogleCustomCredentialFlags(opts);
|
|
155
154
|
|
|
155
|
+
const optOrPromptWhenNeeded = (
|
|
156
|
+
opts: Record<string, unknown>,
|
|
157
|
+
flag: string,
|
|
158
|
+
params: {
|
|
159
|
+
promptIf: boolean;
|
|
160
|
+
required?: boolean;
|
|
161
|
+
prompt: UI.TextInputProps;
|
|
162
|
+
},
|
|
163
|
+
) =>
|
|
164
|
+
Effect.gen(function* () {
|
|
165
|
+
const value = getFlag(opts, flag);
|
|
166
|
+
if (value === undefined && !params.promptIf) return undefined;
|
|
167
|
+
return yield* optOrPrompt(value, {
|
|
168
|
+
simpleName: `--${flag}`,
|
|
169
|
+
required: params.required ?? params.promptIf,
|
|
170
|
+
skipIf: false,
|
|
171
|
+
prompt: params.prompt,
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
156
175
|
const selectGoogleUpdateMode = Effect.fn(function* ({
|
|
157
176
|
isWeb,
|
|
158
177
|
switchingFromShared,
|
|
@@ -262,7 +281,7 @@ const updateGoogleRedirect = Effect.fn(function* ({
|
|
|
262
281
|
opts: Record<string, unknown>;
|
|
263
282
|
client: OAuthClientRow;
|
|
264
283
|
}) {
|
|
265
|
-
const redirectTo = yield*
|
|
284
|
+
const redirectTo = yield* optOrPromptWhenNeeded(opts, 'custom-redirect-uri', {
|
|
266
285
|
promptIf: true,
|
|
267
286
|
required: true,
|
|
268
287
|
prompt: newRedirectPrompt,
|
|
@@ -315,18 +334,18 @@ const updateGoogleCustomCredentials = Effect.fn(function* ({
|
|
|
315
334
|
const shouldPromptRedirectUri =
|
|
316
335
|
isWeb && switchingFromShared && promptCredentials;
|
|
317
336
|
|
|
318
|
-
const clientId = yield*
|
|
337
|
+
const clientId = yield* optOrPromptWhenNeeded(opts, 'client-id', {
|
|
319
338
|
promptIf: shouldPromptClientId,
|
|
320
339
|
required: mustCollectCredentials,
|
|
321
340
|
prompt: clientIdPrompt({ providerUrl: googleConsoleUrl }),
|
|
322
341
|
});
|
|
323
|
-
const clientSecret = yield*
|
|
342
|
+
const clientSecret = yield* optOrPromptWhenNeeded(opts, 'client-secret', {
|
|
324
343
|
promptIf: shouldPromptClientSecret,
|
|
325
344
|
required: isWeb && mustCollectCredentials,
|
|
326
345
|
prompt: clientSecretPrompt({ providerUrl: googleConsoleUrl }),
|
|
327
346
|
});
|
|
328
347
|
const customRedirectUri = isWeb
|
|
329
|
-
? yield*
|
|
348
|
+
? yield* optOrPromptWhenNeeded(opts, 'custom-redirect-uri', {
|
|
330
349
|
promptIf: shouldPromptRedirectUri,
|
|
331
350
|
required: false,
|
|
332
351
|
prompt: redirectPrompt,
|
|
@@ -452,17 +471,21 @@ const handleClientIdSecretUpdate = Effect.fn(function* (params: {
|
|
|
452
471
|
promptRedirect = action === 'redirect';
|
|
453
472
|
}
|
|
454
473
|
|
|
455
|
-
const clientId = yield*
|
|
474
|
+
const clientId = yield* optOrPromptWhenNeeded(params.opts, 'client-id', {
|
|
456
475
|
promptIf: promptCredentials,
|
|
457
476
|
required: promptCredentials,
|
|
458
477
|
prompt: clientIdPrompt({ providerUrl: params.providerUrl }),
|
|
459
478
|
});
|
|
460
|
-
const clientSecret = yield*
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
479
|
+
const clientSecret = yield* optOrPromptWhenNeeded(
|
|
480
|
+
params.opts,
|
|
481
|
+
'client-secret',
|
|
482
|
+
{
|
|
483
|
+
promptIf: promptCredentials,
|
|
484
|
+
required: promptCredentials,
|
|
485
|
+
prompt: clientSecretPrompt({ providerUrl: params.providerUrl }),
|
|
486
|
+
},
|
|
487
|
+
);
|
|
488
|
+
const customRedirectUri = yield* optOrPromptWhenNeeded(
|
|
466
489
|
params.opts,
|
|
467
490
|
'custom-redirect-uri',
|
|
468
491
|
{
|
|
@@ -580,29 +603,37 @@ const readAppleWebUpdate = Effect.fn(function* ({
|
|
|
580
603
|
client: OAuthClientRow;
|
|
581
604
|
promptAll: boolean;
|
|
582
605
|
}) {
|
|
583
|
-
const teamId = yield*
|
|
606
|
+
const teamId = yield* optOrPromptWhenNeeded(opts, 'team-id', {
|
|
584
607
|
promptIf: promptAll,
|
|
585
608
|
required: promptAll,
|
|
586
609
|
prompt: appleTeamIdPrompt({}),
|
|
587
610
|
});
|
|
588
|
-
const keyId = yield*
|
|
611
|
+
const keyId = yield* optOrPromptWhenNeeded(opts, 'key-id', {
|
|
589
612
|
promptIf: promptAll,
|
|
590
613
|
required: promptAll,
|
|
591
614
|
prompt: appleKeyIdPrompt({}),
|
|
592
615
|
});
|
|
593
|
-
const privateKeyPath = yield*
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
616
|
+
const privateKeyPath = yield* optOrPromptWhenNeeded(
|
|
617
|
+
opts,
|
|
618
|
+
'private-key-file',
|
|
619
|
+
{
|
|
620
|
+
promptIf: promptAll,
|
|
621
|
+
required: promptAll,
|
|
622
|
+
prompt: applePrivateKeyFilePrompt({}),
|
|
623
|
+
},
|
|
624
|
+
);
|
|
598
625
|
const privateKey = privateKeyPath
|
|
599
626
|
? yield* readPrivateKeyFile(privateKeyPath)
|
|
600
627
|
: undefined;
|
|
601
|
-
const customRedirectUri = yield*
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
628
|
+
const customRedirectUri = yield* optOrPromptWhenNeeded(
|
|
629
|
+
opts,
|
|
630
|
+
'custom-redirect-uri',
|
|
631
|
+
{
|
|
632
|
+
promptIf: promptAll,
|
|
633
|
+
required: false,
|
|
634
|
+
prompt: redirectPrompt,
|
|
635
|
+
},
|
|
636
|
+
);
|
|
606
637
|
|
|
607
638
|
const meta: Record<string, string> = {};
|
|
608
639
|
if (teamId) meta.teamId = teamId;
|
|
@@ -629,7 +660,7 @@ const handleAppleUpdate = Effect.fn(function* (
|
|
|
629
660
|
yes,
|
|
630
661
|
});
|
|
631
662
|
|
|
632
|
-
const servicesId = yield*
|
|
663
|
+
const servicesId = yield* optOrPromptWhenNeeded(opts, 'services-id', {
|
|
633
664
|
promptIf: promptAll,
|
|
634
665
|
required: promptAll,
|
|
635
666
|
prompt: appleServicesIdPrompt({}),
|
|
@@ -674,7 +705,7 @@ const handleClerkUpdate = Effect.fn(function* (
|
|
|
674
705
|
client: OAuthClientRow,
|
|
675
706
|
) {
|
|
676
707
|
const { yes } = yield* GlobalOpts;
|
|
677
|
-
const publishableKey = yield*
|
|
708
|
+
const publishableKey = yield* optOrPromptWhenNeeded(opts, 'publishable-key', {
|
|
678
709
|
promptIf: !yes && !hasFlag(opts, 'publishable-key'),
|
|
679
710
|
required: true,
|
|
680
711
|
prompt: clerkPublishableKeyPrompt({}),
|
|
@@ -716,7 +747,7 @@ const handleFirebaseUpdate = Effect.fn(function* (
|
|
|
716
747
|
client: OAuthClientRow,
|
|
717
748
|
) {
|
|
718
749
|
const { yes } = yield* GlobalOpts;
|
|
719
|
-
const projectId = yield*
|
|
750
|
+
const projectId = yield* optOrPromptWhenNeeded(opts, 'project-id', {
|
|
720
751
|
promptIf: !yes && !hasFlag(opts, 'project-id'),
|
|
721
752
|
required: true,
|
|
722
753
|
prompt: firebaseProjectIdPrompt({}),
|