instant-cli 1.0.23 → 1.0.24-branch-codex-cli-args-combinators.25405829034.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 (43) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/__tests__/args.test.ts +358 -0
  3. package/__tests__/authClientAddApple.test.ts +9 -10
  4. package/__tests__/authClientAddClerk.test.ts +6 -5
  5. package/__tests__/authClientAddGithub.test.ts +6 -5
  6. package/__tests__/authClientAddGoogle.test.ts +5 -4
  7. package/__tests__/authClientAddLinkedin.test.ts +6 -5
  8. package/__tests__/oauthMock.ts +8 -9
  9. package/dist/commands/auth/client/add.d.ts.map +1 -1
  10. package/dist/commands/auth/client/add.js +53 -167
  11. package/dist/commands/auth/client/add.js.map +1 -1
  12. package/dist/commands/auth/client/shared.d.ts +0 -4
  13. package/dist/commands/auth/client/shared.d.ts.map +1 -1
  14. package/dist/commands/auth/client/shared.js +0 -4
  15. package/dist/commands/auth/client/shared.js.map +1 -1
  16. package/dist/commands/auth/client/update.d.ts +1 -1
  17. package/dist/commands/auth/client/update.d.ts.map +1 -1
  18. package/dist/commands/auth/client/update.js +25 -112
  19. package/dist/commands/auth/client/update.js.map +1 -1
  20. package/dist/commands/auth/origin/add.d.ts.map +1 -1
  21. package/dist/commands/auth/origin/add.js +37 -59
  22. package/dist/commands/auth/origin/add.js.map +1 -1
  23. package/dist/lib/args.d.ts +212 -0
  24. package/dist/lib/args.d.ts.map +1 -0
  25. package/dist/lib/args.js +313 -0
  26. package/dist/lib/args.js.map +1 -0
  27. package/dist/lib/oauth.d.ts +2 -2
  28. package/dist/lib/oauth.d.ts.map +1 -1
  29. package/dist/lib/oauth.js +13 -17
  30. package/dist/lib/oauth.js.map +1 -1
  31. package/dist/lib/ui.d.ts +0 -18
  32. package/dist/lib/ui.d.ts.map +1 -1
  33. package/dist/lib/ui.js +0 -76
  34. package/dist/lib/ui.js.map +1 -1
  35. package/package.json +4 -4
  36. package/src/commands/auth/client/add.ts +114 -180
  37. package/src/commands/auth/client/shared.ts +0 -12
  38. package/src/commands/auth/client/update.ts +85 -139
  39. package/src/commands/auth/origin/add.ts +25 -36
  40. package/src/lib/args.ts +453 -0
  41. package/src/lib/oauth.ts +8 -14
  42. package/src/lib/ui.ts +0 -127
  43. package/__tests__/optOrPrompt.test.ts +0 -229
@@ -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;AAoxB5D,eAAO,MAAM,mBAAmB;;;;wgBA6D/B,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;AA8tB5D,eAAO,MAAM,mBAAmB;;;;ieA6D/B,CAAC"}
@@ -1,13 +1,14 @@
1
1
  import { Effect, Match } from 'effect';
2
2
  import { BadArgsError } from "../../../errors.js";
3
3
  import { GlobalOpts } from "../../../context/globalOpts.js";
4
- import { optOrPrompt, runUIEffect } from "../../../lib/ui.js";
4
+ import { Args } from "../../../lib/args.js";
5
+ import { runUIEffect } from "../../../lib/ui.js";
5
6
  import { findClientByIdOrName, getAppsAuth, OAuthClient, updateOAuthClient, } from "../../../lib/oauth.js";
6
7
  import { UI } from "../../../ui/index.js";
7
8
  import { clerkDomainFromPublishableKey, DEFAULT_OAUTH_CALLBACK_URL, } from '@instantdb/platform';
8
9
  import chalk from 'chalk';
9
10
  import boxen from 'boxen';
10
- import { appleKeyIdPrompt, applePrivateKeyFilePrompt, appleServicesIdPrompt, appleTeamIdPrompt, clerkPublishableKeyPrompt, clientIdPrompt, clientSecretPrompt, firebaseDiscoveryEndpoint, firebaseProjectIdPrompt, getFlag, getMetaString, hasAnyFlag, hasFlag, isTrueFlag, readPrivateKeyFile, redirectSetupMessages, redirectUriPrompt, validateFirebaseProjectId, } from "./shared.js";
11
+ import { appleKeyIdPrompt, applePrivateKeyFilePrompt, appleServicesIdPrompt, appleTeamIdPrompt, clerkPublishableKeyPrompt, clientIdPrompt, clientSecretPrompt, firebaseDiscoveryEndpoint, firebaseProjectIdPrompt, getMetaString, readPrivateKeyFile, redirectSetupMessages, redirectUriPrompt, validateFirebaseProjectId, } from "./shared.js";
11
12
  import { link } from "../../../logging.js";
12
13
  const redirectPrompt = redirectUriPrompt({
13
14
  heading: 'Custom redirect URI (optional):',
@@ -72,20 +73,8 @@ const updateGoogleToDevCredentials = Effect.fn(function* (client) {
72
73
  ` instant-cli auth client update --name ${response.client.client_name} --client-id <id> --client-secret <secret>`,
73
74
  ].join('\n'), { dimBorder: true, padding: { right: 1, left: 1 } }));
74
75
  });
75
- const hasGoogleCustomCredentialFlags = (opts) => hasAnyFlag(opts, ['client-id', 'client-secret', 'custom-redirect-uri']);
76
- const hasGoogleUpdateFlags = (opts) => isTrueFlag(getFlag(opts, 'dev-credentials')) ||
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
- });
76
+ const hasGoogleCustomCredentialFlags = (opts) => Args.hasAny(opts, ['client-id', 'client-secret', 'custom-redirect-uri']);
77
+ const hasGoogleUpdateFlags = (opts) => Args.isTrue(opts, 'dev-credentials') || hasGoogleCustomCredentialFlags(opts);
89
78
  const selectGoogleUpdateMode = Effect.fn(function* ({ isWeb, switchingFromShared, }) {
90
79
  if (switchingFromShared) {
91
80
  return yield* runUIEffect(new UI.Select({
@@ -114,7 +103,7 @@ const selectGoogleUpdateMode = Effect.fn(function* ({ isWeb, switchingFromShared
114
103
  });
115
104
  const resolveGoogleUpdateMode = Effect.fn(function* ({ opts, isWeb, switchingFromShared, }) {
116
105
  const { yes } = yield* GlobalOpts;
117
- const devCredentialsFlag = isTrueFlag(getFlag(opts, 'dev-credentials'));
106
+ const devCredentialsFlag = Args.isTrue(opts, 'dev-credentials');
118
107
  const hasProvidedSomeCustomCredentials = hasGoogleCustomCredentialFlags(opts);
119
108
  if (devCredentialsFlag && !isWeb) {
120
109
  return yield* BadArgsError.make({
@@ -122,7 +111,7 @@ const resolveGoogleUpdateMode = Effect.fn(function* ({ opts, isWeb, switchingFro
122
111
  });
123
112
  }
124
113
  if (!isWeb &&
125
- (hasFlag(opts, 'client-secret') || hasFlag(opts, 'custom-redirect-uri'))) {
114
+ (Args.has(opts, 'client-secret') || Args.has(opts, 'custom-redirect-uri'))) {
126
115
  return yield* BadArgsError.make({
127
116
  message: '--client-secret and --custom-redirect-uri are only supported for Google web clients.',
128
117
  });
@@ -144,7 +133,7 @@ const resolveGoogleUpdateMode = Effect.fn(function* ({ opts, isWeb, switchingFro
144
133
  if (yes &&
145
134
  isWeb &&
146
135
  switchingFromShared &&
147
- (!hasFlag(opts, 'client-id') || !hasFlag(opts, 'client-secret'))) {
136
+ (!Args.has(opts, 'client-id') || !Args.has(opts, 'client-secret'))) {
148
137
  return yield* BadArgsError.make({
149
138
  message: 'Must specify both --client-id and --client-secret when switching from Instant dev credentials to custom credentials with --yes.',
150
139
  });
@@ -155,16 +144,7 @@ const resolveGoogleUpdateMode = Effect.fn(function* ({ opts, isWeb, switchingFro
155
144
  return yield* selectGoogleUpdateMode({ isWeb, switchingFromShared });
156
145
  });
157
146
  const updateGoogleRedirect = Effect.fn(function* ({ opts, client, }) {
158
- const redirectTo = yield* optOrPromptWhenNeeded(opts, 'custom-redirect-uri', {
159
- promptIf: true,
160
- required: true,
161
- prompt: newRedirectPrompt,
162
- });
163
- if (!redirectTo) {
164
- return yield* BadArgsError.make({
165
- message: 'Missing required value for --custom-redirect-uri',
166
- });
167
- }
147
+ const redirectTo = yield* Args.text(opts, 'custom-redirect-uri').pipe(Args.prompt(newRedirectPrompt), Args.required());
168
148
  const response = yield* updateOAuthClient({
169
149
  oauthClientId: client.id,
170
150
  redirectTo,
@@ -181,27 +161,11 @@ const updateGoogleRedirect = Effect.fn(function* ({ opts, client, }) {
181
161
  });
182
162
  const updateGoogleCustomCredentials = Effect.fn(function* ({ opts, client, isWeb, switchingFromShared, promptCredentials, }) {
183
163
  const mustCollectCredentials = promptCredentials || switchingFromShared;
184
- const shouldPromptClientId = promptCredentials || (switchingFromShared && !hasFlag(opts, 'client-id'));
185
- const shouldPromptClientSecret = isWeb &&
186
- (promptCredentials ||
187
- (switchingFromShared && !hasFlag(opts, 'client-secret')));
188
164
  const shouldPromptRedirectUri = isWeb && switchingFromShared && promptCredentials;
189
- const clientId = yield* optOrPromptWhenNeeded(opts, 'client-id', {
190
- promptIf: shouldPromptClientId,
191
- required: mustCollectCredentials,
192
- prompt: clientIdPrompt({ providerUrl: googleConsoleUrl }),
193
- });
194
- const clientSecret = yield* optOrPromptWhenNeeded(opts, 'client-secret', {
195
- promptIf: shouldPromptClientSecret,
196
- required: isWeb && mustCollectCredentials,
197
- prompt: clientSecretPrompt({ providerUrl: googleConsoleUrl }),
198
- });
165
+ const clientId = yield* Args.text(opts, 'client-id').pipe(Args.availableWhen(mustCollectCredentials || Args.has(opts, 'client-id')), Args.prompt(clientIdPrompt({ providerUrl: googleConsoleUrl })), Args.required());
166
+ const clientSecret = yield* Args.text(opts, 'client-secret').pipe(Args.availableWhen(isWeb && (mustCollectCredentials || Args.has(opts, 'client-secret'))), Args.prompt(clientSecretPrompt({ providerUrl: googleConsoleUrl })), Args.required());
199
167
  const customRedirectUri = isWeb
200
- ? yield* optOrPromptWhenNeeded(opts, 'custom-redirect-uri', {
201
- promptIf: shouldPromptRedirectUri,
202
- required: false,
203
- prompt: redirectPrompt,
204
- })
168
+ ? yield* Args.text(opts, 'custom-redirect-uri').pipe(Args.availableWhen(shouldPromptRedirectUri || Args.has(opts, 'custom-redirect-uri')), Args.prompt(redirectPrompt), Args.optional())
205
169
  : undefined;
206
170
  const redirectTo = switchingFromShared
207
171
  ? customRedirectUri || client.redirect_to || DEFAULT_OAUTH_CALLBACK_URL
@@ -269,7 +233,7 @@ const handleGoogleUpdate = Effect.fn(function* (opts, client) {
269
233
  });
270
234
  const handleClientIdSecretUpdate = Effect.fn(function* (params) {
271
235
  const { yes } = yield* GlobalOpts;
272
- const hasAnyUpdateFlag = hasAnyFlag(params.opts, [
236
+ const hasAnyUpdateFlag = Args.hasAny(params.opts, [
273
237
  'client-id',
274
238
  'client-secret',
275
239
  'custom-redirect-uri',
@@ -289,21 +253,9 @@ const handleClientIdSecretUpdate = Effect.fn(function* (params) {
289
253
  promptCredentials = action === 'rotate';
290
254
  promptRedirect = action === 'redirect';
291
255
  }
292
- const clientId = yield* optOrPromptWhenNeeded(params.opts, 'client-id', {
293
- promptIf: promptCredentials,
294
- required: promptCredentials,
295
- prompt: clientIdPrompt({ providerUrl: params.providerUrl }),
296
- });
297
- const clientSecret = yield* optOrPromptWhenNeeded(params.opts, 'client-secret', {
298
- promptIf: promptCredentials,
299
- required: promptCredentials,
300
- prompt: clientSecretPrompt({ providerUrl: params.providerUrl }),
301
- });
302
- const customRedirectUri = yield* optOrPromptWhenNeeded(params.opts, 'custom-redirect-uri', {
303
- promptIf: promptRedirect,
304
- required: promptRedirect,
305
- prompt: promptRedirect ? newRedirectPrompt : redirectPrompt,
306
- });
256
+ const clientId = yield* Args.text(params.opts, 'client-id').pipe(Args.availableWhen(promptCredentials || Args.has(params.opts, 'client-id')), Args.prompt(clientIdPrompt({ providerUrl: params.providerUrl })), Args.required());
257
+ const clientSecret = yield* Args.text(params.opts, 'client-secret').pipe(Args.availableWhen(promptCredentials || Args.has(params.opts, 'client-secret')), Args.prompt(clientSecretPrompt({ providerUrl: params.providerUrl })), Args.required());
258
+ const customRedirectUri = yield* Args.text(params.opts, 'custom-redirect-uri').pipe(Args.availableWhen(promptRedirect || Args.has(params.opts, 'custom-redirect-uri')), Args.prompt(promptRedirect ? newRedirectPrompt : redirectPrompt), Args.required());
307
259
  const response = yield* updateOAuthClient({
308
260
  oauthClientId: params.client.id,
309
261
  clientId,
@@ -333,8 +285,8 @@ const appleWebFlags = [
333
285
  'custom-redirect-uri',
334
286
  ];
335
287
  const appleUpdateFlags = ['services-id', ...appleWebFlags];
336
- const hasAppleWebFlags = (opts) => hasAnyFlag(opts, appleWebFlags);
337
- const hasAppleUpdateFlags = (opts) => hasAnyFlag(opts, appleUpdateFlags);
288
+ const hasAppleWebFlags = (opts) => Args.hasAny(opts, appleWebFlags);
289
+ const hasAppleUpdateFlags = (opts) => Args.hasAny(opts, appleUpdateFlags);
338
290
  const appleClientHasWebConfig = (client) => Boolean(getMetaString(client.meta, 'teamId') ||
339
291
  getMetaString(client.meta, 'keyId') ||
340
292
  client.redirect_to);
@@ -357,29 +309,13 @@ const resolveAppleUpdateConfig = Effect.fn(function* ({ opts, client, yes, }) {
357
309
  return { promptAll, configureWeb };
358
310
  });
359
311
  const readAppleWebUpdate = Effect.fn(function* ({ opts, client, promptAll, }) {
360
- const teamId = yield* optOrPromptWhenNeeded(opts, 'team-id', {
361
- promptIf: promptAll,
362
- required: promptAll,
363
- prompt: appleTeamIdPrompt({}),
364
- });
365
- const keyId = yield* optOrPromptWhenNeeded(opts, 'key-id', {
366
- promptIf: promptAll,
367
- required: promptAll,
368
- prompt: appleKeyIdPrompt({}),
369
- });
370
- const privateKeyPath = yield* optOrPromptWhenNeeded(opts, 'private-key-file', {
371
- promptIf: promptAll,
372
- required: promptAll,
373
- prompt: applePrivateKeyFilePrompt({}),
374
- });
312
+ const teamId = yield* Args.text(opts, 'team-id').pipe(Args.availableWhen(promptAll || Args.has(opts, 'team-id')), Args.prompt(appleTeamIdPrompt({})), Args.required());
313
+ const keyId = yield* Args.text(opts, 'key-id').pipe(Args.availableWhen(promptAll || Args.has(opts, 'key-id')), Args.prompt(appleKeyIdPrompt({})), Args.required());
314
+ const privateKeyPath = yield* Args.text(opts, 'private-key-file').pipe(Args.availableWhen(promptAll || Args.has(opts, 'private-key-file')), Args.prompt(applePrivateKeyFilePrompt({})), Args.required());
375
315
  const privateKey = privateKeyPath
376
316
  ? yield* readPrivateKeyFile(privateKeyPath)
377
317
  : undefined;
378
- const customRedirectUri = yield* optOrPromptWhenNeeded(opts, 'custom-redirect-uri', {
379
- promptIf: promptAll,
380
- required: false,
381
- prompt: redirectPrompt,
382
- });
318
+ const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(Args.availableWhen(promptAll || Args.has(opts, 'custom-redirect-uri')), Args.prompt(redirectPrompt), Args.optional());
383
319
  const meta = {};
384
320
  if (teamId)
385
321
  meta.teamId = teamId;
@@ -401,11 +337,7 @@ const handleAppleUpdate = Effect.fn(function* (opts, client) {
401
337
  client,
402
338
  yes,
403
339
  });
404
- const servicesId = yield* optOrPromptWhenNeeded(opts, 'services-id', {
405
- promptIf: promptAll,
406
- required: promptAll,
407
- prompt: appleServicesIdPrompt({}),
408
- });
340
+ const servicesId = yield* Args.text(opts, 'services-id').pipe(Args.availableWhen(promptAll || Args.has(opts, 'services-id')), Args.prompt(appleServicesIdPrompt({})), Args.required());
409
341
  const webUpdate = configureWeb
410
342
  ? yield* readAppleWebUpdate({ opts, client, promptAll })
411
343
  : {};
@@ -433,17 +365,7 @@ const handleAppleUpdate = Effect.fn(function* (opts, client) {
433
365
  }));
434
366
  });
435
367
  const handleClerkUpdate = Effect.fn(function* (opts, client) {
436
- const { yes } = yield* GlobalOpts;
437
- const publishableKey = yield* optOrPromptWhenNeeded(opts, 'publishable-key', {
438
- promptIf: !yes && !hasFlag(opts, 'publishable-key'),
439
- required: true,
440
- prompt: clerkPublishableKeyPrompt({}),
441
- });
442
- if (!publishableKey) {
443
- return yield* BadArgsError.make({
444
- message: 'Missing required value for --publishable-key',
445
- });
446
- }
368
+ const publishableKey = yield* Args.text(opts, 'publishable-key').pipe(Args.prompt(clerkPublishableKeyPrompt({})), Args.required());
447
369
  const domain = clerkDomainFromPublishableKey(publishableKey);
448
370
  if (!domain) {
449
371
  return yield* BadArgsError.make({
@@ -462,16 +384,7 @@ const handleClerkUpdate = Effect.fn(function* (opts, client) {
462
384
  ].join('\n'), { dimBorder: true, padding: { right: 1, left: 1 } }));
463
385
  });
464
386
  const handleFirebaseUpdate = Effect.fn(function* (opts, client) {
465
- const { yes } = yield* GlobalOpts;
466
- const projectId = yield* optOrPromptWhenNeeded(opts, 'project-id', {
467
- promptIf: !yes && !hasFlag(opts, 'project-id'),
468
- required: true,
469
- prompt: firebaseProjectIdPrompt({}),
470
- });
471
- const validationError = validateFirebaseProjectId(projectId ?? '');
472
- if (validationError) {
473
- return yield* BadArgsError.make({ message: validationError });
474
- }
387
+ const projectId = yield* Args.text(opts, 'project-id').pipe(Args.prompt(firebaseProjectIdPrompt({})), Args.validate(validateFirebaseProjectId), Args.required());
475
388
  const response = yield* updateOAuthClient({
476
389
  oauthClientId: client.id,
477
390
  discoveryEndpoint: firebaseDiscoveryEndpoint(projectId),
@@ -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 { 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 {\n clerkDomainFromPublishableKey,\n DEFAULT_OAUTH_CALLBACK_URL,\n} 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 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: 'Update Client ID and Client Secret', 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 (\n yes &&\n isWeb &&\n switchingFromShared &&\n (!hasFlag(opts, 'client-id') || !hasFlag(opts, 'client-secret'))\n ) {\n return yield* BadArgsError.make({\n message:\n 'Must specify both --client-id and --client-secret when switching from Instant dev credentials to custom credentials with --yes.',\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: 'Update Client ID and Client Secret', 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 = 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* 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"]}
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 { Args } from '../../../lib/args.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 {\n clerkDomainFromPublishableKey,\n DEFAULT_OAUTH_CALLBACK_URL,\n} 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 firebaseDiscoveryEndpoint,\n firebaseProjectIdPrompt,\n getMetaString,\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 Args.hasAny(opts, ['client-id', 'client-secret', 'custom-redirect-uri']);\n\nconst hasGoogleUpdateFlags = (opts: Record<string, unknown>) =>\n Args.isTrue(opts, 'dev-credentials') || 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: 'Update Client ID and Client Secret', 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 = Args.isTrue(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 (Args.has(opts, 'client-secret') || Args.has(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 (\n yes &&\n isWeb &&\n switchingFromShared &&\n (!Args.has(opts, 'client-id') || !Args.has(opts, 'client-secret'))\n ) {\n return yield* BadArgsError.make({\n message:\n 'Must specify both --client-id and --client-secret when switching from Instant dev credentials to custom credentials with --yes.',\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* Args.text(opts, 'custom-redirect-uri').pipe(\n Args.prompt(newRedirectPrompt),\n Args.required(),\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 shouldPromptRedirectUri =\n isWeb && switchingFromShared && promptCredentials;\n\n const clientId = yield* Args.text(opts, 'client-id').pipe(\n Args.availableWhen(mustCollectCredentials || Args.has(opts, 'client-id')),\n Args.prompt(clientIdPrompt({ providerUrl: googleConsoleUrl })),\n Args.required(),\n );\n const clientSecret = yield* Args.text(opts, 'client-secret').pipe(\n Args.availableWhen(\n isWeb && (mustCollectCredentials || Args.has(opts, 'client-secret')),\n ),\n Args.prompt(clientSecretPrompt({ providerUrl: googleConsoleUrl })),\n Args.required(),\n );\n const customRedirectUri = isWeb\n ? yield* Args.text(opts, 'custom-redirect-uri').pipe(\n Args.availableWhen(\n shouldPromptRedirectUri || Args.has(opts, 'custom-redirect-uri'),\n ),\n Args.prompt(redirectPrompt),\n Args.optional(),\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 = Args.hasAny(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: 'Update Client ID and Client Secret', value: 'rotate' },\n { label: 'Update redirect URI', value: 'redirect' },\n ]);\n promptCredentials = action === 'rotate';\n promptRedirect = action === 'redirect';\n }\n\n const clientId = yield* Args.text(params.opts, 'client-id').pipe(\n Args.availableWhen(promptCredentials || Args.has(params.opts, 'client-id')),\n Args.prompt(clientIdPrompt({ providerUrl: params.providerUrl })),\n Args.required(),\n );\n const clientSecret = yield* Args.text(params.opts, 'client-secret').pipe(\n Args.availableWhen(\n promptCredentials || Args.has(params.opts, 'client-secret'),\n ),\n Args.prompt(clientSecretPrompt({ providerUrl: params.providerUrl })),\n Args.required(),\n );\n const customRedirectUri = yield* Args.text(\n params.opts,\n 'custom-redirect-uri',\n ).pipe(\n Args.availableWhen(\n promptRedirect || Args.has(params.opts, 'custom-redirect-uri'),\n ),\n Args.prompt(promptRedirect ? newRedirectPrompt : redirectPrompt),\n Args.required(),\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 Args.hasAny(opts, appleWebFlags);\n\nconst hasAppleUpdateFlags = (opts: Record<string, unknown>) =>\n Args.hasAny(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* Args.text(opts, 'team-id').pipe(\n Args.availableWhen(promptAll || Args.has(opts, 'team-id')),\n Args.prompt(appleTeamIdPrompt({})),\n Args.required(),\n );\n const keyId = yield* Args.text(opts, 'key-id').pipe(\n Args.availableWhen(promptAll || Args.has(opts, 'key-id')),\n Args.prompt(appleKeyIdPrompt({})),\n Args.required(),\n );\n const privateKeyPath = yield* Args.text(opts, 'private-key-file').pipe(\n Args.availableWhen(promptAll || Args.has(opts, 'private-key-file')),\n Args.prompt(applePrivateKeyFilePrompt({})),\n Args.required(),\n );\n const privateKey = privateKeyPath\n ? yield* readPrivateKeyFile(privateKeyPath)\n : undefined;\n const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(\n Args.availableWhen(promptAll || Args.has(opts, 'custom-redirect-uri')),\n Args.prompt(redirectPrompt),\n Args.optional(),\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* Args.text(opts, 'services-id').pipe(\n Args.availableWhen(promptAll || Args.has(opts, 'services-id')),\n Args.prompt(appleServicesIdPrompt({})),\n Args.required(),\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 publishableKey = yield* Args.text(opts, 'publishable-key').pipe(\n Args.prompt(clerkPublishableKeyPrompt({})),\n Args.required(),\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* 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 projectId = yield* Args.text(opts, 'project-id').pipe(\n Args.prompt(firebaseProjectIdPrompt({})),\n Args.validate(validateFirebaseProjectId),\n Args.required(),\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 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/origin/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAQ5D,eAAO,MAAM,gBAAgB,mEAK5B,CAAC;AAmLF,eAAO,MAAM,gBAAgB;;;;;;;qdAoD5B,CAAC"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/origin/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAS5D,eAAO,MAAM,gBAAgB,mEAK5B,CAAC;AAuKF,eAAO,MAAM,gBAAgB;;;;;;;qdAoD5B,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import { Effect, Match, Option, Schema } from 'effect';
2
2
  import { BadArgsError } from "../../../errors.js";
3
3
  import { GlobalOpts } from "../../../context/globalOpts.js";
4
- import { optOrPrompt, runUIEffect } from "../../../lib/ui.js";
4
+ import { Args } from "../../../lib/args.js";
5
+ import { runUIEffect } from "../../../lib/ui.js";
5
6
  import { addAuthorizedOrigin } from "../../../lib/oauth.js";
6
7
  import { UI } from "../../../ui/index.js";
7
8
  import chalk from 'chalk';
@@ -66,22 +67,14 @@ const addOriginHandler = Effect.fn(function* (type, validated) {
66
67
  ].join('\n'), { dimBorder: true, padding: { right: 1, left: 1 } }));
67
68
  });
68
69
  const handleGenericOrigin = Effect.fn(function* (opts) {
69
- const url = yield* optOrPrompt(opts.url, {
70
- simpleName: '--url',
71
- required: true,
72
- skipIf: false,
73
- prompt: {
74
- prompt: 'Website URL:',
75
- placeholder: 'example.com',
76
- modifyOutput: UI.modifiers.piped([
77
- UI.modifiers.topPadding,
78
- UI.modifiers.dimOnComplete,
79
- ]),
80
- },
81
- });
82
- if (!url) {
83
- return yield* BadArgsError.make({ message: 'URL is required.' });
84
- }
70
+ const url = yield* Args.text(opts, 'url').pipe(Args.prompt({
71
+ prompt: 'Website URL:',
72
+ placeholder: 'example.com',
73
+ modifyOutput: UI.modifiers.piped([
74
+ UI.modifiers.topPadding,
75
+ UI.modifiers.dimOnComplete,
76
+ ]),
77
+ }), Args.required());
85
78
  const validated = validateGenericUrl(url);
86
79
  if (validated.type === 'error') {
87
80
  return yield* BadArgsError.make({ message: validated.message });
@@ -89,60 +82,45 @@ const handleGenericOrigin = Effect.fn(function* (opts) {
89
82
  yield* addOriginHandler('website', validated);
90
83
  });
91
84
  const handleVercelOrigin = Effect.fn(function* (opts) {
92
- const project = yield* optOrPrompt(opts.project, {
93
- simpleName: '--project',
94
- required: true,
95
- skipIf: false,
96
- prompt: {
97
- prompt: 'Vercel project name:',
98
- placeholder: 'vercel-project-name',
99
- modifyOutput: UI.modifiers.piped([
100
- UI.modifiers.topPadding,
101
- UI.modifiers.dimOnComplete,
102
- ]),
103
- },
104
- });
105
- const validated = validateVercelUrl(project ?? '');
85
+ const project = yield* Args.text(opts, 'project').pipe(Args.prompt({
86
+ prompt: 'Vercel project name:',
87
+ placeholder: 'vercel-project-name',
88
+ modifyOutput: UI.modifiers.piped([
89
+ UI.modifiers.topPadding,
90
+ UI.modifiers.dimOnComplete,
91
+ ]),
92
+ }), Args.required());
93
+ const validated = validateVercelUrl(project);
106
94
  if (validated.type === 'error') {
107
95
  return yield* BadArgsError.make({ message: validated.message });
108
96
  }
109
97
  yield* addOriginHandler('vercel', validated);
110
98
  });
111
99
  const handleNetlifyOrigin = Effect.fn(function* (opts) {
112
- const site = yield* optOrPrompt(opts.site, {
113
- simpleName: '--site',
114
- required: true,
115
- skipIf: false,
116
- prompt: {
117
- prompt: 'Netlify site name:',
118
- placeholder: 'netlify-site-name',
119
- modifyOutput: UI.modifiers.piped([
120
- UI.modifiers.topPadding,
121
- UI.modifiers.dimOnComplete,
122
- ]),
123
- },
124
- });
125
- const validated = validateNetlifyUrl(site ?? '');
100
+ const site = yield* Args.text(opts, 'site').pipe(Args.prompt({
101
+ prompt: 'Netlify site name:',
102
+ placeholder: 'netlify-site-name',
103
+ modifyOutput: UI.modifiers.piped([
104
+ UI.modifiers.topPadding,
105
+ UI.modifiers.dimOnComplete,
106
+ ]),
107
+ }), Args.required());
108
+ const validated = validateNetlifyUrl(site);
126
109
  if (validated.type === 'error') {
127
110
  return yield* BadArgsError.make({ message: validated.message });
128
111
  }
129
112
  yield* addOriginHandler('netlify', validated);
130
113
  });
131
114
  const handleCustomSchemeOrigin = Effect.fn(function* (opts) {
132
- const scheme = yield* optOrPrompt(opts.scheme, {
133
- simpleName: '--scheme',
134
- required: true,
135
- skipIf: false,
136
- prompt: {
137
- prompt: 'App scheme:',
138
- placeholder: 'app-scheme://',
139
- modifyOutput: UI.modifiers.piped([
140
- UI.modifiers.topPadding,
141
- UI.modifiers.dimOnComplete,
142
- ]),
143
- },
144
- });
145
- const validated = validateCustomScheme(scheme ?? '');
115
+ const scheme = yield* Args.text(opts, 'scheme').pipe(Args.prompt({
116
+ prompt: 'App scheme:',
117
+ placeholder: 'app-scheme://',
118
+ modifyOutput: UI.modifiers.piped([
119
+ UI.modifiers.topPadding,
120
+ UI.modifiers.dimOnComplete,
121
+ ]),
122
+ }), Args.required());
123
+ const validated = validateCustomScheme(scheme);
146
124
  if (validated.type === 'error') {
147
125
  return yield* BadArgsError.make({ message: validated.message });
148
126
  }