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,14 +1,15 @@
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, optOrPromptBoolean, runUIEffect, validateRequired, } from "../../../lib/ui.js";
4
+ import { Args } from "../../../lib/args.js";
5
+ import { runUIEffect, validateRequired } from "../../../lib/ui.js";
5
6
  import { addOAuthClient, findName, getClientNameAndProvider, getOrCreateProvider, GoogleAppTypeSchema, OAuthClient, } from "../../../lib/oauth.js";
6
7
  import { DEFAULT_OAUTH_CALLBACK_URL, GOOGLE_AUTHORIZATION_ENDPOINT, GOOGLE_DISCOVERY_ENDPOINT, GOOGLE_TOKEN_ENDPOINT, APPLE_AUTHORIZATION_ENDPOINT, APPLE_DISCOVERY_ENDPOINT, APPLE_TOKEN_ENDPOINT, clerkDomainFromPublishableKey, LINKEDIN_AUTHORIZATION_ENDPOINT, LINKEDIN_DISCOVERY_ENDPOINT, LINKEDIN_TOKEN_ENDPOINT, } from '@instantdb/platform';
7
8
  import { UI } from "../../../ui/index.js";
8
9
  import chalk from 'chalk';
9
10
  import boxen from 'boxen';
10
11
  import { link } from "../../../logging.js";
11
- import { appleKeyIdPrompt, applePrivateKeyFilePrompt, appleServicesIdPrompt, appleTeamIdPrompt, clerkPublishableKeyPrompt, clientIdPrompt, clientSecretPrompt, firebaseDiscoveryEndpoint, firebaseProjectIdPrompt, getFlag, hasAnyFlag, isTrueFlag, readPrivateKeyFile, redirectSetupMessages, redirectUriPrompt, validateFirebaseProjectId, } from "./shared.js";
12
+ import { appleKeyIdPrompt, applePrivateKeyFilePrompt, appleServicesIdPrompt, appleTeamIdPrompt, clerkPublishableKeyPrompt, clientIdPrompt, clientSecretPrompt, firebaseDiscoveryEndpoint, firebaseProjectIdPrompt, readPrivateKeyFile, redirectSetupMessages, redirectUriPrompt, validateFirebaseProjectId, } from "./shared.js";
12
13
  export const ClientTypeSchema = Schema.Literal('google', 'github', 'apple', 'linkedin', 'clerk', 'firebase');
13
14
  const googleConsoleUrl = 'https://console.developers.google.com/apis/credentials';
14
15
  const githubDeveloperUrl = 'https://github.com/settings/developers';
@@ -69,8 +70,8 @@ const selectGoogleCredentialMode = Effect.fn(function* () {
69
70
  });
70
71
  const resolveGoogleCredentialMode = Effect.fn(function* ({ appType, opts, }) {
71
72
  const { yes } = yield* GlobalOpts;
72
- const devCredentialsFlag = isTrueFlag(getFlag(opts, 'dev-credentials'));
73
- const hasProvidedSomeCustomCredentials = hasAnyFlag(opts, [
73
+ const devCredentialsFlag = Args.isTrue(opts, 'dev-credentials');
74
+ const hasProvidedSomeCustomCredentials = Args.hasAny(opts, [
74
75
  'client-id',
75
76
  'client-secret',
76
77
  'custom-redirect-uri',
@@ -142,55 +143,35 @@ const handleGoogleClient = Effect.fn(function* (opts) {
142
143
  const { auth, provider } = yield* getOrCreateProvider('google');
143
144
  const usedClientNames = new Set((auth.oauth_clients ?? []).map((client) => client.client_name));
144
145
  const suggestedClientName = findName(`google-${appType}`, usedClientNames);
145
- const clientName = yield* optOrPrompt(opts.name, {
146
- simpleName: '--name',
147
- required: true,
148
- skipIf: false,
149
- prompt: {
150
- prompt: 'Client Name:',
151
- defaultValue: suggestedClientName,
152
- placeholder: suggestedClientName,
153
- validate: validateRequired,
154
- modifyOutput: UI.modifiers.piped([
155
- UI.modifiers.topPadding,
156
- UI.modifiers.dimOnComplete,
157
- ]),
158
- },
159
- });
160
- if (usedClientNames.has(clientName || '')) {
146
+ const clientName = yield* Args.text(opts, 'name').pipe(Args.prompt({
147
+ prompt: 'Client Name:',
148
+ defaultValue: suggestedClientName,
149
+ placeholder: suggestedClientName,
150
+ validate: validateRequired,
151
+ modifyOutput: UI.modifiers.piped([
152
+ UI.modifiers.topPadding,
153
+ UI.modifiers.dimOnComplete,
154
+ ]),
155
+ }), Args.required());
156
+ if (usedClientNames.has(clientName)) {
161
157
  return yield* BadArgsError.make({
162
158
  message: `The unique name '${clientName}' is already in use.`,
163
159
  });
164
160
  }
165
- const clientId = yield* optOrPrompt(opts['client-id'], {
166
- simpleName: '--client-id',
167
- required: !useSharedCredentials,
168
- skipIf: useSharedCredentials,
169
- skipMessage: '--client-id is not compatible with --dev-credentials. Drop one or the other.',
170
- prompt: clientIdPrompt({ providerUrl: googleConsoleUrl }),
171
- });
161
+ const clientId = yield* Args.text(opts, 'client-id').pipe(Args.availableWhen(!useSharedCredentials, {
162
+ message: '--client-id is not compatible with --dev-credentials. Drop one or the other.',
163
+ }), Args.prompt(clientIdPrompt({ providerUrl: googleConsoleUrl })), Args.required());
172
164
  const usesCustomWebCredentials = !useSharedCredentials && appType === 'web';
173
- const clientSecret = yield* optOrPrompt(opts['client-secret'], {
174
- required: usesCustomWebCredentials,
175
- skipIf: !usesCustomWebCredentials,
176
- simpleName: '--client-secret',
177
- skipMessage: useSharedCredentials
165
+ const clientSecret = yield* Args.text(opts, 'client-secret').pipe(Args.availableWhen(usesCustomWebCredentials, {
166
+ message: useSharedCredentials
178
167
  ? '--client-secret is not compatible with --dev-credentials. Drop one or the other.'
179
168
  : undefined,
180
- prompt: clientSecretPrompt({ providerUrl: googleConsoleUrl }),
181
- });
182
- const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {
183
- required: false,
184
- prompt: optionalRedirectPrompt,
185
- simpleName: '--custom-redirect-uri',
186
- skipIf: !usesCustomWebCredentials,
187
- skipMessage: useSharedCredentials
169
+ }), Args.prompt(clientSecretPrompt({ providerUrl: googleConsoleUrl })), Args.required());
170
+ const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(Args.availableWhen(usesCustomWebCredentials, {
171
+ message: useSharedCredentials
188
172
  ? '--custom-redirect-uri is not compatible with --dev-credentials.'
189
173
  : 'Provided custom redirect URI when not using web app type.',
190
- });
191
- if (!clientName) {
192
- return yield* BadArgsError.make({ message: 'Client name is required.' }); // Should never reach this
193
- }
174
+ }), Args.prompt(optionalRedirectPrompt), Args.optional());
194
175
  const redirectUri = useSharedCredentials
195
176
  ? undefined
196
177
  : customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;
@@ -226,27 +207,9 @@ const handleGoogleClient = Effect.fn(function* (opts) {
226
207
  });
227
208
  const handleGithubClient = Effect.fn(function* (opts) {
228
209
  const { clientName, provider } = yield* getClientNameAndProvider('github', opts);
229
- const clientId = yield* optOrPrompt(opts['client-id'], {
230
- simpleName: '--client-id',
231
- required: true,
232
- skipIf: false,
233
- prompt: clientIdPrompt({ providerUrl: githubDeveloperUrl }),
234
- });
235
- const clientSecret = yield* optOrPrompt(opts['client-secret'], {
236
- required: true,
237
- skipIf: false,
238
- simpleName: '--client-secret',
239
- prompt: clientSecretPrompt({ providerUrl: githubDeveloperUrl }),
240
- });
241
- const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {
242
- required: false,
243
- simpleName: '--custom-redirect-uri',
244
- skipIf: false,
245
- prompt: optionalRedirectPrompt,
246
- });
247
- if (!clientName) {
248
- return yield* BadArgsError.make({ message: 'Client name is required.' });
249
- }
210
+ const clientId = yield* Args.text(opts, 'client-id').pipe(Args.prompt(clientIdPrompt({ providerUrl: githubDeveloperUrl })), Args.required());
211
+ const clientSecret = yield* Args.text(opts, 'client-secret').pipe(Args.prompt(clientSecretPrompt({ providerUrl: githubDeveloperUrl })), Args.required());
212
+ const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(Args.prompt(optionalRedirectPrompt), Args.optional());
250
213
  const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;
251
214
  // The backend infers GitHub's authorization/token endpoints from
252
215
  // meta.providerName === 'github', so we don't pass them here.
@@ -272,27 +235,9 @@ const handleGithubClient = Effect.fn(function* (opts) {
272
235
  });
273
236
  const handleLinkedInClient = Effect.fn(function* (opts) {
274
237
  const { clientName, provider } = yield* getClientNameAndProvider('linkedin', opts);
275
- const clientId = yield* optOrPrompt(opts['client-id'], {
276
- simpleName: '--client-id',
277
- required: true,
278
- skipIf: false,
279
- prompt: clientIdPrompt({ providerUrl: linkedinDeveloperUrl }),
280
- });
281
- const clientSecret = yield* optOrPrompt(opts['client-secret'], {
282
- required: true,
283
- skipIf: false,
284
- simpleName: '--client-secret',
285
- prompt: clientSecretPrompt({ providerUrl: linkedinDeveloperUrl }),
286
- });
287
- const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {
288
- required: false,
289
- simpleName: '--custom-redirect-uri',
290
- skipIf: false,
291
- prompt: optionalRedirectPrompt,
292
- });
293
- if (!clientName) {
294
- return yield* BadArgsError.make({ message: 'Client name is required.' });
295
- }
238
+ const clientId = yield* Args.text(opts, 'client-id').pipe(Args.prompt(clientIdPrompt({ providerUrl: linkedinDeveloperUrl })), Args.required());
239
+ const clientSecret = yield* Args.text(opts, 'client-secret').pipe(Args.prompt(clientSecretPrompt({ providerUrl: linkedinDeveloperUrl })), Args.required());
240
+ const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(Args.prompt(optionalRedirectPrompt), Args.optional());
296
241
  const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;
297
242
  const response = yield* addOAuthClient({
298
243
  providerId: provider.id,
@@ -317,67 +262,36 @@ const handleLinkedInClient = Effect.fn(function* (opts) {
317
262
  ].join('\n'), { dimBorder: true, padding: { right: 1, left: 1 } }));
318
263
  });
319
264
  const handleAppleClient = Effect.fn(function* (opts) {
320
- const { yes } = yield* GlobalOpts;
321
265
  const { clientName, provider } = yield* getClientNameAndProvider('apple', opts);
322
- const servicesId = yield* optOrPrompt(opts['services-id'], {
323
- simpleName: '--services-id',
324
- required: true,
325
- skipIf: false,
326
- prompt: appleServicesIdPrompt({}),
327
- });
266
+ const servicesId = yield* Args.text(opts, 'services-id').pipe(Args.prompt(appleServicesIdPrompt({})), Args.required());
328
267
  // If any web-flow flag is provided, enable web flow; otherwise ask
329
268
  // (non-interactively with --yes we default to native-only).
330
- const anyWebFlagProvided = Boolean(opts['team-id'] || opts['key-id'] || opts['private-key-file']);
269
+ const anyWebFlagProvided = Args.hasAny(opts, [
270
+ 'team-id',
271
+ 'key-id',
272
+ 'private-key-file',
273
+ 'custom-redirect-uri',
274
+ ]);
331
275
  const configureWeb = anyWebFlagProvided
332
276
  ? true
333
- : yes
334
- ? false
335
- : yield* optOrPromptBoolean(undefined, {
336
- simpleName: '--configure-web',
337
- required: false,
338
- skipIf: false,
339
- prompt: {
340
- promptText: 'Configure web redirect flow? ' +
341
- chalk.dim('(requires Team ID, Key ID, and a .p8 private key from Apple)'),
342
- defaultValue: false,
343
- },
344
- });
277
+ : yield* Args.bool(opts, 'configure-web').pipe(Args.confirm({
278
+ promptText: 'Configure web redirect flow? ' +
279
+ chalk.dim('(requires Team ID, Key ID, and a .p8 private key from Apple)'),
280
+ defaultValue: false,
281
+ }), Args.required());
345
282
  const skipWeb = !configureWeb;
346
283
  const webSkipMessage = 'requires configuring the web redirect flow (also provide --team-id, --key-id, and --private-key-file).';
347
- const teamId = yield* optOrPrompt(opts['team-id'], {
348
- simpleName: '--team-id',
349
- required: true,
350
- skipIf: skipWeb,
351
- skipMessage: `--team-id ${webSkipMessage}`,
352
- prompt: appleTeamIdPrompt({}),
353
- });
354
- const keyId = yield* optOrPrompt(opts['key-id'], {
355
- simpleName: '--key-id',
356
- required: true,
357
- skipIf: skipWeb,
358
- skipMessage: `--key-id ${webSkipMessage}`,
359
- prompt: appleKeyIdPrompt({}),
360
- });
361
- const privateKeyPath = yield* optOrPrompt(opts['private-key-file'], {
362
- simpleName: '--private-key-file',
363
- required: true,
364
- skipIf: skipWeb,
365
- skipMessage: `--private-key-file ${webSkipMessage}`,
366
- prompt: applePrivateKeyFilePrompt({}),
367
- });
284
+ const teamId = yield* Args.text(opts, 'team-id').pipe(Args.availableWhen(!skipWeb, { message: `--team-id ${webSkipMessage}` }), Args.prompt(appleTeamIdPrompt({})), Args.required());
285
+ const keyId = yield* Args.text(opts, 'key-id').pipe(Args.availableWhen(!skipWeb, { message: `--key-id ${webSkipMessage}` }), Args.prompt(appleKeyIdPrompt({})), Args.required());
286
+ const privateKeyPath = yield* Args.text(opts, 'private-key-file').pipe(Args.availableWhen(!skipWeb, {
287
+ message: `--private-key-file ${webSkipMessage}`,
288
+ }), Args.prompt(applePrivateKeyFilePrompt({})), Args.required());
368
289
  const privateKey = privateKeyPath
369
290
  ? yield* readPrivateKeyFile(privateKeyPath)
370
291
  : undefined;
371
- const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {
372
- required: false,
373
- simpleName: '--custom-redirect-uri',
374
- skipIf: skipWeb,
375
- skipMessage: `--custom-redirect-uri ${webSkipMessage}`,
376
- prompt: optionalRedirectPrompt,
377
- });
378
- if (!clientName) {
379
- return yield* BadArgsError.make({ message: 'Client name is required.' });
380
- }
292
+ const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(Args.availableWhen(!skipWeb, {
293
+ message: `--custom-redirect-uri ${webSkipMessage}`,
294
+ }), Args.prompt(optionalRedirectPrompt), Args.optional());
381
295
  const redirectUri = privateKey
382
296
  ? customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL
383
297
  : undefined;
@@ -418,20 +332,7 @@ const handleAppleClient = Effect.fn(function* (opts) {
418
332
  });
419
333
  const handleClerkClient = Effect.fn(function* (opts) {
420
334
  const { clientName, provider } = yield* getClientNameAndProvider('clerk', opts);
421
- const publishableKey = yield* optOrPrompt(opts['publishable-key'], {
422
- simpleName: '--publishable-key',
423
- required: true,
424
- skipIf: false,
425
- prompt: clerkPublishableKeyPrompt({}),
426
- });
427
- if (!clientName) {
428
- return yield* BadArgsError.make({ message: 'Client name is required.' });
429
- }
430
- if (!publishableKey) {
431
- return yield* BadArgsError.make({
432
- message: 'Publishable key is required.',
433
- });
434
- }
335
+ const publishableKey = yield* Args.text(opts, 'publishable-key').pipe(Args.prompt(clerkPublishableKeyPrompt({})), Args.required());
435
336
  const domain = clerkDomainFromPublishableKey(publishableKey);
436
337
  if (!domain) {
437
338
  return yield* BadArgsError.make({
@@ -459,22 +360,7 @@ const handleClerkClient = Effect.fn(function* (opts) {
459
360
  });
460
361
  const handleFirebaseClient = Effect.fn(function* (opts) {
461
362
  const { clientName, provider } = yield* getClientNameAndProvider('firebase', opts);
462
- const projectId = yield* optOrPrompt(opts['project-id'], {
463
- simpleName: '--project-id',
464
- required: true,
465
- skipIf: false,
466
- prompt: firebaseProjectIdPrompt({}),
467
- });
468
- // typeguard
469
- if (!clientName || !projectId) {
470
- return yield* BadArgsError.make({
471
- message: 'Missing required arguments',
472
- });
473
- }
474
- const validationError = validateFirebaseProjectId(projectId);
475
- if (validationError) {
476
- return yield* BadArgsError.make({ message: validationError });
477
- }
363
+ const projectId = yield* Args.text(opts, 'project-id').pipe(Args.prompt(firebaseProjectIdPrompt({})), Args.validate(validateFirebaseProjectId), Args.required());
478
364
  const response = yield* addOAuthClient({
479
365
  providerId: provider.id,
480
366
  clientName,
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,QAAQ,EACR,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,yBAAyB,EACzB,qBAAqB,EACrB,4BAA4B,EAC5B,wBAAwB,EACxB,oBAAoB,EACpB,6BAA6B,EAC7B,+BAA+B,EAC/B,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,OAAO,EACP,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAC5C,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,OAAO,EACP,UAAU,CACX,CAAC;AAEF,MAAM,gBAAgB,GACpB,wDAAwD,CAAC;AAC3D,MAAM,kBAAkB,GAAG,wCAAwC,CAAC;AACpE,MAAM,oBAAoB,GAAG,0CAA0C,CAAC;AACxE,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;IAC/C,OAAO,EAAE,iCAAiC;CAC3C,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAE,EAAE,CAC7C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IAElC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAC3C,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAC7C,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,YAAY,CAAC,IAAI,CAAC;gBACvB,OAAO,EAAE,2DAA2D,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC9G,CAAC,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAChB,IAAI,EAAE,CAAC,MAAM,CAAC;YACZ,OAAO,EAAE;gBACP;oBACE,KAAK,EACH,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC;oBAC7D,KAAK,EAAE,KAAK;iBACb;gBACD,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC9B,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACtC,EAAE,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,gBAAgB,EAAE;aAC5D;YACD,UAAU,EAAE,2BAA2B;YACvC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;gBACvB,EAAE,CAAC,SAAS,CAAC,aAAa;aAC3B,CAAC;YACF,YAAY,EAAE,KAAK;SACpB,CAAC,CACH,CAAC,IAAI,CACJ,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAC/B,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACzD,CACF,CAAC;IACJ,CAAC,CAAC,EACF,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,EACvE,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,CACjC,YAAY,CAAC,IAAI,CAAC;QAChB,OAAO,EACL,qEAAqE;KACxE,CAAC,CACH,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,MAAM,0BAA0B,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,WAAW,CACvB,IAAI,EAAE,CAAC,MAAM,CAAC;QACZ,OAAO,EAAE;YACP;gBACE,KAAK,EACH,qBAAqB;oBACrB,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC;gBAC9D,KAAK,EAAE,KAAc;aACtB;YACD;gBACE,KAAK,EACH,wBAAwB;oBACxB,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC;gBAC1D,KAAK,EAAE,QAAiB;aACzB;SACF;QACD,UAAU,EAAE,gCAAgC;QAC5C,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;YAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;YACvB,EAAE,CAAC,SAAS,CAAC,aAAa;SAC3B,CAAC;QACF,YAAY,EAAE,KAAc;KAC7B,CAAC,CACH,CAAC,IAAI,CACJ,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAC/B,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACzD,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,2BAA2B,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EACvD,OAAO,EACP,IAAI,GAIL;IACC,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IAClC,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACxE,MAAM,gCAAgC,GAAG,UAAU,CAAC,IAAI,EAAE;QACxD,WAAW;QACX,eAAe;QACf,qBAAqB;KACtB,CAAC,CAAC;IAEH,IAAI,kBAAkB,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC9B,OAAO,EACL,6GAA6G;SAChH,CAAC,CAAC;IACL,CAAC;IAED,IAAI,kBAAkB,IAAI,gCAAgC,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC9B,OAAO,EACL,mGAAmG;SACtG,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,gCAAgC,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,0BAA0B,EAAE,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,MAAM,+BAA+B,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAC3D,OAAO,EACP,MAAM,GAIP;IACC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,KAAK,CACH;QACE,gCAAgC,MAAM,CAAC,WAAW,EAAE;QACpD,aAAa,OAAO,EAAE;QACtB,sCAAsC;QACtC,OAAO,MAAM,CAAC,EAAE,EAAE;QAClB,EAAE;QACF,mCAAmC;QACnC,iDAAiD;QACjD,EAAE;QACF,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC;QACxC,2CAA2C,MAAM,CAAC,WAAW,4CAA4C;KAC1G,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CACpD,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,kCAAkC,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAC9D,OAAO,EACP,MAAM,EACN,QAAQ,EACR,iBAAiB,EACjB,WAAW,GAOZ;IACC,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,IAAI,OAAO,KAAK,KAAK,IAAI,WAAW,EAAE,CAAC;QACrC,gBAAgB,CAAC,IAAI,CACnB,GAAG,qBAAqB,CAAC;YACvB,MAAM,EAAE,yCAAyC;YACjD,WAAW;YACX,8BAA8B,EAAE,OAAO,CAAC,iBAAiB,CAAC;SAC3D,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,KAAK,CACH;QACE,gCAAgC,MAAM,CAAC,WAAW,EAAE;QACpD,aAAa,OAAO,EAAE;QACtB,OAAO,MAAM,CAAC,EAAE,EAAE;QAClB,qBAAqB,MAAM,CAAC,SAAS,IAAI,QAAQ,EAAE;QACnD,GAAG,gBAAgB;KACpB,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CACpD,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAA6B;IAC3E,0DAA0D;IAC1D,mDAAmD;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,2BAA2B,CAAC;QACxD,OAAO;QACP,IAAI;KACL,CAAC,CAAC;IACH,MAAM,oBAAoB,GAAG,cAAc,KAAK,KAAK,CAAC;IAEtD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAC/D,CAAC;IACF,MAAM,mBAAmB,GAAG,QAAQ,CAAC,UAAU,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;IAE3E,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE;QAC/C,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,MAAM,EAAE;YACN,MAAM,EAAE,cAAc;YACtB,YAAY,EAAE,mBAAmB;YACjC,WAAW,EAAE,mBAAmB;YAChC,QAAQ,EAAE,gBAAgB;YAC1B,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;gBACvB,EAAE,CAAC,SAAS,CAAC,aAAa;aAC3B,CAAC;SACH;KACF,CAAC,CAAC;IAEH,IAAI,eAAe,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,oBAAoB,UAAU,sBAAsB;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QACrD,UAAU,EAAE,aAAa;QACzB,QAAQ,EAAE,CAAC,oBAAoB;QAC/B,MAAM,EAAE,oBAAoB;QAC5B,WAAW,EACT,8EAA8E;QAChF,MAAM,EAAE,cAAc,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;KAC1D,CAAC,CAAC;IAEH,MAAM,wBAAwB,GAAG,CAAC,oBAAoB,IAAI,OAAO,KAAK,KAAK,CAAC;IAC5E,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;QAC7D,QAAQ,EAAE,wBAAwB;QAClC,MAAM,EAAE,CAAC,wBAAwB;QACjC,UAAU,EAAE,iBAAiB;QAC7B,WAAW,EAAE,oBAAoB;YAC/B,CAAC,CAAC,kFAAkF;YACpF,CAAC,CAAC,SAAS;QACb,MAAM,EAAE,kBAAkB,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;KAC9D,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE;QACxE,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,sBAAsB;QAC9B,UAAU,EAAE,uBAAuB;QACnC,MAAM,EAAE,CAAC,wBAAwB;QACjC,WAAW,EAAE,oBAAoB;YAC/B,CAAC,CAAC,iEAAiE;YACnE,CAAC,CAAC,2DAA2D;KAChE,CAAC,CAAC;IAEH,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC,0BAA0B;IACtG,CAAC;IACD,MAAM,WAAW,GAAG,oBAAoB;QACtC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;IAEpD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;QACrC,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,UAAU;QACV,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;QACrD,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY;QAC7D,qBAAqB,EAAE,6BAA6B;QACpD,aAAa,EAAE,qBAAqB;QACpC,iBAAiB,EAAE,yBAAyB;QAC5C,UAAU,EAAE,WAAW;QACvB,IAAI,EAAE;YACJ,OAAO;YACP,eAAe,EAAE,IAAI;SACtB;QACD,oBAAoB;KACrB,CAAC,CAAC;IAEH,IAAI,oBAAoB,EAAE,CAAC;QACzB,KAAK,CAAC,CAAC,+BAA+B,CAAC;YACrC,OAAO;YACP,MAAM,EAAE,QAAQ,CAAC,MAAM;SACxB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,KAAK,CAAC,CAAC,kCAAkC,CAAC;QACxC,OAAO;QACP,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,QAAQ;QACR,iBAAiB;QACjB,WAAW;KACZ,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAA6B;IAC3E,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,wBAAwB,CAC9D,QAAQ,EACR,IAAI,CACL,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QACrD,UAAU,EAAE,aAAa;QACzB,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,cAAc,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;KAC5D,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;QAC7D,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,iBAAiB;QAC7B,MAAM,EAAE,kBAAkB,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;KAChE,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE;QACxE,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,uBAAuB;QACnC,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,sBAAsB;KAC/B,CAAC,CAAC;IAEH,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,IAAI,0BAA0B,CAAC;IAEpE,iEAAiE;IACjE,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;QACrC,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,UAAU;QACV,QAAQ;QACR,YAAY;QACZ,UAAU,EAAE,WAAW;QACvB,IAAI,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE;KACjC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;QAC7C,MAAM,EAAE,yDAAyD;QACjE,WAAW;QACX,8BAA8B,EAAE,OAAO,CAAC,iBAAiB,CAAC;KAC3D,CAAC,CAAC;IAEH,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,KAAK,CACH;QACE,gCAAgC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE;QAC7D,OAAO,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE;QAC3B,qBAAqB,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,QAAQ,EAAE;QAC5D,GAAG,gBAAgB;KACpB,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CACpD,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAC9C,IAA6B;IAE7B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,wBAAwB,CAC9D,UAAU,EACV,IAAI,CACL,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QACrD,UAAU,EAAE,aAAa;QACzB,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,cAAc,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;KAC9D,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;QAC7D,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,iBAAiB;QAC7B,MAAM,EAAE,kBAAkB,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;KAClE,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE;QACxE,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,uBAAuB;QACnC,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,sBAAsB;KAC/B,CAAC,CAAC;IAEH,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,IAAI,0BAA0B,CAAC;IAEpE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;QACrC,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,UAAU;QACV,QAAQ;QACR,YAAY;QACZ,qBAAqB,EAAE,+BAA+B;QACtD,aAAa,EAAE,uBAAuB;QACtC,iBAAiB,EAAE,2BAA2B;QAC9C,UAAU,EAAE,WAAW;KACxB,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;QAC7C,MAAM,EAAE,qDAAqD;QAC7D,WAAW;QACX,8BAA8B,EAAE,OAAO,CAAC,iBAAiB,CAAC;KAC3D,CAAC,CAAC;IAEH,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,KAAK,CACH;QACE,kCAAkC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE;QAC/D,OAAO,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE;QAC3B,uBAAuB,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,QAAQ,EAAE;QAC9D,GAAG,gBAAgB;KACpB,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CACpD,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAA6B;IAC1E,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IAClC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,wBAAwB,CAC9D,OAAO,EACP,IAAI,CACL,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;QACzD,UAAU,EAAE,eAAe;QAC3B,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,qBAAqB,CAAC,EAAE,CAAC;KAClC,CAAC,CAAC;IAEH,mEAAmE;IACnE,4DAA4D;IAC5D,MAAM,kBAAkB,GAAG,OAAO,CAChC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAC9D,CAAC;IAEF,MAAM,YAAY,GAAG,kBAAkB;QACrC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,GAAG;YACH,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE;gBACnC,UAAU,EAAE,iBAAiB;gBAC7B,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE;oBACN,UAAU,EACR,+BAA+B;wBAC/B,KAAK,CAAC,GAAG,CACP,8DAA8D,CAC/D;oBACH,YAAY,EAAE,KAAK;iBACpB;aACF,CAAC,CAAC;IAET,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC;IAC9B,MAAM,cAAc,GAClB,wGAAwG,CAAC;IAE3G,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QACjD,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,aAAa,cAAc,EAAE;QAC1C,MAAM,EAAE,iBAAiB,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAC/C,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,YAAY,cAAc,EAAE;QACzC,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAAC;KAC7B,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;QAClE,UAAU,EAAE,oBAAoB;QAChC,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,sBAAsB,cAAc,EAAE;QACnD,MAAM,EAAE,yBAAyB,CAAC,EAAE,CAAC;KACtC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,cAAc;QAC/B,CAAC,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC;QAC3C,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE;QACxE,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,uBAAuB;QACnC,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,yBAAyB,cAAc,EAAE;QACtD,MAAM,EAAE,sBAAsB;KAC/B,CAAC,CAAC;IAEH,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,WAAW,GAAG,UAAU;QAC5B,CAAC,CAAC,iBAAiB,IAAI,0BAA0B;QACjD,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,IAAI,GAAwC,EAAE,CAAC;IACrD,IAAI,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAC/C,IAAI,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAE5C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;QACrC,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,UAAU;QACV,QAAQ,EAAE,UAAU;QACpB,YAAY,EAAE,UAAU;QACxB,qBAAqB,EAAE,4BAA4B;QACnD,aAAa,EAAE,oBAAoB;QACnC,iBAAiB,EAAE,wBAAwB;QAC3C,UAAU,EAAE,WAAW;QACvB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC,CAAC;IAEH,MAAM,YAAY,GAAa;QAC7B,+BAA+B,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE;QAC5D,OAAO,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE;QAC3B,gBAAgB,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,UAAU,EAAE;KAC1D,CAAC;IAEF,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;QAC9B,YAAY,CAAC,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC;QACxC,YAAY,CAAC,IAAI,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;QACtC,YAAY,CAAC,IAAI,CACf,GAAG,qBAAqB,CAAC;YACvB,MAAM,EAAE,iDAAiD,IAAI,CAAC,6BAA6B,EAAE,qBAAqB,CAAC,EAAE;YACrH,WAAW;YACX,8BAA8B,EAAE,OAAO,CAAC,iBAAiB,CAAC;SAC3D,CAAC,CACH,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC7B,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;KAC/B,CAAC,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAA6B;IAC1E,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,wBAAwB,CAC9D,OAAO,EACP,IAAI,CACL,CAAC;IAEF,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;QACjE,UAAU,EAAE,mBAAmB;QAC/B,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,yBAAyB,CAAC,EAAE,CAAC;KACtC,CAAC,CAAC;IAEH,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,8BAA8B;SACxC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,6BAA6B,CAAC,cAAc,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,oDAAoD;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;QACrC,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,UAAU;QACV,iBAAiB,EAAE,WAAW,MAAM,mCAAmC;QACvE,IAAI,EAAE,EAAE,mBAAmB,EAAE,cAAc,EAAE;KAC9C,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAC7D,mCAAmC,EACnC,EAAE,CACH,CAAC;IAEF,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,KAAK,CACH;QACE,+BAA+B,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE;QAC5D,OAAO,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE;QAC3B,0BAA0B,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,EAAE;QACrE,iBAAiB,WAAW,EAAE;KAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CACpD,CACF,CAAC;IAEF,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,0KAA0K;QACxK,KAAK,CACH;;;EAGN,EACM,EAAE,WAAW,EAAE,MAAM,EAAE,CACxB,CACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAC9C,IAAwE;IAExE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,wBAAwB,CAC9D,UAAU,EACV,IAAI,CACL,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;QACvD,UAAU,EAAE,cAAc;QAC1B,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,uBAAuB,CAAC,EAAE,CAAC;KACpC,CAAC,CAAC;IACH,YAAY;IACZ,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,4BAA4B;SACtC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,eAAe,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;QACrC,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,UAAU;QACV,iBAAiB,EAAE,yBAAyB,CAAC,SAAS,CAAC;KACxD,CAAC,CAAC;IAEH,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,KAAK,CACH;QACE,kCAAkC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE;QAC/D,OAAO,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE;QAC3B,wBAAwB,SAAS,EAAE;KACpC,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CACpD,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,EAAE,CACvC,QAAQ,CAAC,EACP,IAAwE;IAExE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,uDAAuD,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACvG,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAC3D,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAC7C,WAAW,CACT,IAAI,EAAE,CAAC,MAAM,CAAC;QACZ,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YACpC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YACpC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;YAClC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;YACxC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;YAClC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;SACzC;QACD,UAAU,EAAE,uBAAuB;QACnC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;KAC/D,CAAC,CACH,CACF,EACD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAChE,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,CACjC,YAAY,CAAC,IAAI,CAAC;QAChB,OAAO,EAAE,wCAAwC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACxF,CAAC,CACH,CACF,CAAC;IAEF,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CACjC,KAAK,CAAC,cAAc,EAAiC,EACrD,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EACpD,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EACpD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAClD,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EACxD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAClD,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EACxD,KAAK,CAAC,UAAU,CACjB,CAAC;AACJ,CAAC,EACD,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CACP,oFAAoF,CACrF,CACF,CAAC;AACJ,CAAC,CAAC,CACH,CACF,CAAC","sourcesContent":["import { Effect, Match, Option, Schema } from 'effect';\nimport type { authClientAddDef, OptsFromCommand } from '../../../index.ts';\nimport { BadArgsError } from '../../../errors.ts';\nimport { GlobalOpts } from '../../../context/globalOpts.ts';\nimport {\n optOrPrompt,\n optOrPromptBoolean,\n runUIEffect,\n validateRequired,\n} from '../../../lib/ui.ts';\nimport {\n addOAuthClient,\n findName,\n getClientNameAndProvider,\n getOrCreateProvider,\n GoogleAppTypeSchema,\n OAuthClient,\n} from '../../../lib/oauth.ts';\nimport {\n DEFAULT_OAUTH_CALLBACK_URL,\n GOOGLE_AUTHORIZATION_ENDPOINT,\n GOOGLE_DISCOVERY_ENDPOINT,\n GOOGLE_TOKEN_ENDPOINT,\n APPLE_AUTHORIZATION_ENDPOINT,\n APPLE_DISCOVERY_ENDPOINT,\n APPLE_TOKEN_ENDPOINT,\n clerkDomainFromPublishableKey,\n LINKEDIN_AUTHORIZATION_ENDPOINT,\n LINKEDIN_DISCOVERY_ENDPOINT,\n LINKEDIN_TOKEN_ENDPOINT,\n} from '@instantdb/platform';\nimport { UI } from '../../../ui/index.ts';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport { link } from '../../../logging.ts';\nimport {\n appleKeyIdPrompt,\n applePrivateKeyFilePrompt,\n appleServicesIdPrompt,\n appleTeamIdPrompt,\n clerkPublishableKeyPrompt,\n clientIdPrompt,\n clientSecretPrompt,\n firebaseDiscoveryEndpoint,\n firebaseProjectIdPrompt,\n getFlag,\n hasAnyFlag,\n isTrueFlag,\n readPrivateKeyFile,\n redirectSetupMessages,\n redirectUriPrompt,\n validateFirebaseProjectId,\n} from './shared.ts';\n\nexport const ClientTypeSchema = Schema.Literal(\n 'google',\n 'github',\n 'apple',\n 'linkedin',\n 'clerk',\n 'firebase',\n);\n\nconst googleConsoleUrl =\n 'https://console.developers.google.com/apis/credentials';\nconst githubDeveloperUrl = 'https://github.com/settings/developers';\nconst linkedinDeveloperUrl = 'https://www.linkedin.com/developers/apps';\nconst optionalRedirectPrompt = redirectUriPrompt({\n heading: 'Custom redirect URI (optional):',\n});\n\nconst selectGoogleAppType = (value: unknown) =>\n Effect.gen(function* () {\n const { yes } = yield* GlobalOpts;\n\n return yield* Option.fromNullable(value).pipe(\n Effect.catchTag('NoSuchElementException', () => {\n if (yes) {\n return BadArgsError.make({\n message: `Missing required value for --app-type. Expected one of: ${GoogleAppTypeSchema.literals.join(', ')}`,\n });\n }\n\n return runUIEffect(\n new UI.Select({\n options: [\n {\n label:\n 'Web' + chalk.dim(' (Redirect Flows or Expo Auth Session)'),\n value: 'web',\n },\n { label: 'iOS', value: 'ios' },\n { label: 'Android', value: 'android' },\n { label: 'Google Button for Web', value: 'button-for-web' },\n ],\n promptText: 'Select a Google app type:',\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n defaultValue: 'web',\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n }),\n Effect.andThen((raw) => Schema.decodeUnknown(GoogleAppTypeSchema)(raw)),\n Effect.catchTag('ParseError', () =>\n BadArgsError.make({\n message:\n 'Invalid app-type, must be one of: web, ios, android, button-for-web',\n }),\n ),\n );\n });\n\nconst selectGoogleCredentialMode = Effect.fn(function* () {\n return yield* runUIEffect(\n new UI.Select({\n options: [\n {\n label:\n 'Use dev credentials' +\n chalk.dim(' (works on localhost and Expo, no Google setup)'),\n value: 'dev' as const,\n },\n {\n label:\n 'Use my own credentials' +\n chalk.dim(' (client ID and secret from Google Console)'),\n value: 'custom' as const,\n },\n ],\n promptText: 'Select Google credential mode:',\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n defaultValue: 'dev' as const,\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n});\n\nconst resolveGoogleCredentialMode = Effect.fn(function* ({\n appType,\n opts,\n}: {\n appType: typeof GoogleAppTypeSchema.Type;\n opts: Record<string, unknown>;\n}): Effect.fn.Return<'custom' | 'dev', BadArgsError, GlobalOpts> {\n const { yes } = yield* GlobalOpts;\n const devCredentialsFlag = isTrueFlag(getFlag(opts, 'dev-credentials'));\n const hasProvidedSomeCustomCredentials = hasAnyFlag(opts, [\n 'client-id',\n 'client-secret',\n 'custom-redirect-uri',\n ]);\n\n if (devCredentialsFlag && appType !== 'web') {\n return yield* BadArgsError.make({\n message:\n '--dev-credentials is only supported for --app-type web. Native Google clients need credentials from Google.',\n });\n }\n\n if (devCredentialsFlag && hasProvidedSomeCustomCredentials) {\n return yield* BadArgsError.make({\n message:\n '--dev-credentials cannot be combined with --client-id, --client-secret, or --custom-redirect-uri.',\n });\n }\n\n if (appType !== 'web') {\n return 'custom';\n }\n\n if (hasProvidedSomeCustomCredentials) {\n return 'custom';\n }\n\n if (devCredentialsFlag) {\n return 'dev';\n }\n\n if (yes) {\n return 'dev';\n }\n\n return yield* selectGoogleCredentialMode();\n});\n\nconst printGoogleDevCredentialsClient = Effect.fn(function* ({\n appType,\n client,\n}: {\n appType: typeof GoogleAppTypeSchema.Type;\n client: typeof OAuthClient.Type;\n}) {\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client created: ${client.client_name}`,\n `App type: ${appType}`,\n `Credentials: Instant dev credentials`,\n `ID: ${client.id}`,\n '',\n 'No Google Console setup required.',\n 'Works on localhost and Expo during development.',\n '',\n chalk.bold('Ready for production? Run:'),\n ` instant-cli auth client update --name ${client.client_name} --client-id <id> --client-secret <secret>`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst printGoogleCustomCredentialsClient = Effect.fn(function* ({\n appType,\n client,\n clientId,\n customRedirectUri,\n redirectUri,\n}: {\n appType: typeof GoogleAppTypeSchema.Type;\n client: typeof OAuthClient.Type;\n clientId: string | undefined;\n customRedirectUri: string | undefined;\n redirectUri: string | undefined;\n}) {\n const redirectMessages: string[] = [];\n if (appType === 'web' && redirectUri) {\n redirectMessages.push(\n ...redirectSetupMessages({\n prompt: 'Add this redirect URI in Google Console',\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n }),\n );\n }\n\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client created: ${client.client_name}`,\n `App type: ${appType}`,\n `ID: ${client.id}`,\n `Google Client ID: ${client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleGoogleClient = Effect.fn(function* (opts: Record<string, unknown>) {\n // This one requires special logic for getting client name\n // because the suggested name includes the app type\n const appType = yield* selectGoogleAppType(opts['app-type']);\n const credentialMode = yield* resolveGoogleCredentialMode({\n appType,\n opts,\n });\n const useSharedCredentials = credentialMode === 'dev';\n\n const { auth, provider } = yield* getOrCreateProvider('google');\n const usedClientNames = new Set(\n (auth.oauth_clients ?? []).map((client) => client.client_name),\n );\n const suggestedClientName = findName(`google-${appType}`, usedClientNames);\n\n const clientName = yield* optOrPrompt(opts.name, {\n simpleName: '--name',\n required: true,\n skipIf: false,\n prompt: {\n prompt: 'Client Name:',\n defaultValue: suggestedClientName,\n placeholder: suggestedClientName,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n },\n });\n\n if (usedClientNames.has(clientName || '')) {\n return yield* BadArgsError.make({\n message: `The unique name '${clientName}' is already in use.`,\n });\n }\n\n const clientId = yield* optOrPrompt(opts['client-id'], {\n simpleName: '--client-id',\n required: !useSharedCredentials,\n skipIf: useSharedCredentials,\n skipMessage:\n '--client-id is not compatible with --dev-credentials. Drop one or the other.',\n prompt: clientIdPrompt({ providerUrl: googleConsoleUrl }),\n });\n\n const usesCustomWebCredentials = !useSharedCredentials && appType === 'web';\n const clientSecret = yield* optOrPrompt(opts['client-secret'], {\n required: usesCustomWebCredentials,\n skipIf: !usesCustomWebCredentials,\n simpleName: '--client-secret',\n skipMessage: useSharedCredentials\n ? '--client-secret is not compatible with --dev-credentials. Drop one or the other.'\n : undefined,\n prompt: clientSecretPrompt({ providerUrl: googleConsoleUrl }),\n });\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n prompt: optionalRedirectPrompt,\n simpleName: '--custom-redirect-uri',\n skipIf: !usesCustomWebCredentials,\n skipMessage: useSharedCredentials\n ? '--custom-redirect-uri is not compatible with --dev-credentials.'\n : 'Provided custom redirect URI when not using web app type.',\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' }); // Should never reach this\n }\n const redirectUri = useSharedCredentials\n ? undefined\n : customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId: useSharedCredentials ? undefined : clientId,\n clientSecret: useSharedCredentials ? undefined : clientSecret,\n authorizationEndpoint: GOOGLE_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: GOOGLE_TOKEN_ENDPOINT,\n discoveryEndpoint: GOOGLE_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n meta: {\n appType,\n skipNonceChecks: true,\n },\n useSharedCredentials,\n });\n\n if (useSharedCredentials) {\n yield* printGoogleDevCredentialsClient({\n appType,\n client: response.client,\n });\n return;\n }\n\n yield* printGoogleCustomCredentialsClient({\n appType,\n client: response.client,\n clientId,\n customRedirectUri,\n redirectUri,\n });\n});\n\nconst handleGithubClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'github',\n opts,\n );\n\n const clientId = yield* optOrPrompt(opts['client-id'], {\n simpleName: '--client-id',\n required: true,\n skipIf: false,\n prompt: clientIdPrompt({ providerUrl: githubDeveloperUrl }),\n });\n\n const clientSecret = yield* optOrPrompt(opts['client-secret'], {\n required: true,\n skipIf: false,\n simpleName: '--client-secret',\n prompt: clientSecretPrompt({ providerUrl: githubDeveloperUrl }),\n });\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n simpleName: '--custom-redirect-uri',\n skipIf: false,\n prompt: optionalRedirectPrompt,\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n\n const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n // The backend infers GitHub's authorization/token endpoints from\n // meta.providerName === 'github', so we don't pass them here.\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId,\n clientSecret,\n redirectTo: redirectUri,\n meta: { providerName: 'github' },\n });\n\n const redirectMessages = redirectSetupMessages({\n prompt: 'Add this callback URL in your GitHub OAuth App settings',\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n });\n\n yield* Effect.log(\n boxen(\n [\n `GitHub OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `GitHub Client ID: ${response.client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleLinkedInClient = Effect.fn(function* (\n opts: Record<string, unknown>,\n) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'linkedin',\n opts,\n );\n\n const clientId = yield* optOrPrompt(opts['client-id'], {\n simpleName: '--client-id',\n required: true,\n skipIf: false,\n prompt: clientIdPrompt({ providerUrl: linkedinDeveloperUrl }),\n });\n\n const clientSecret = yield* optOrPrompt(opts['client-secret'], {\n required: true,\n skipIf: false,\n simpleName: '--client-secret',\n prompt: clientSecretPrompt({ providerUrl: linkedinDeveloperUrl }),\n });\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n simpleName: '--custom-redirect-uri',\n skipIf: false,\n prompt: optionalRedirectPrompt,\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n\n const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId,\n clientSecret,\n authorizationEndpoint: LINKEDIN_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: LINKEDIN_TOKEN_ENDPOINT,\n discoveryEndpoint: LINKEDIN_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n });\n\n const redirectMessages = redirectSetupMessages({\n prompt: 'Add this redirect URI in your LinkedIn app settings',\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n });\n\n yield* Effect.log(\n boxen(\n [\n `LinkedIn OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `LinkedIn Client ID: ${response.client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleAppleClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { yes } = yield* GlobalOpts;\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'apple',\n opts,\n );\n\n const servicesId = yield* optOrPrompt(opts['services-id'], {\n simpleName: '--services-id',\n required: true,\n skipIf: false,\n prompt: appleServicesIdPrompt({}),\n });\n\n // If any web-flow flag is provided, enable web flow; otherwise ask\n // (non-interactively with --yes we default to native-only).\n const anyWebFlagProvided = Boolean(\n opts['team-id'] || opts['key-id'] || opts['private-key-file'],\n );\n\n const configureWeb = anyWebFlagProvided\n ? true\n : yes\n ? false\n : yield* optOrPromptBoolean(undefined, {\n simpleName: '--configure-web',\n required: false,\n skipIf: false,\n prompt: {\n promptText:\n 'Configure web redirect flow? ' +\n chalk.dim(\n '(requires Team ID, Key ID, and a .p8 private key from Apple)',\n ),\n defaultValue: false,\n },\n });\n\n const skipWeb = !configureWeb;\n const webSkipMessage =\n 'requires configuring the web redirect flow (also provide --team-id, --key-id, and --private-key-file).';\n\n const teamId = yield* optOrPrompt(opts['team-id'], {\n simpleName: '--team-id',\n required: true,\n skipIf: skipWeb,\n skipMessage: `--team-id ${webSkipMessage}`,\n prompt: appleTeamIdPrompt({}),\n });\n\n const keyId = yield* optOrPrompt(opts['key-id'], {\n simpleName: '--key-id',\n required: true,\n skipIf: skipWeb,\n skipMessage: `--key-id ${webSkipMessage}`,\n prompt: appleKeyIdPrompt({}),\n });\n\n const privateKeyPath = yield* optOrPrompt(opts['private-key-file'], {\n simpleName: '--private-key-file',\n required: true,\n skipIf: skipWeb,\n skipMessage: `--private-key-file ${webSkipMessage}`,\n prompt: applePrivateKeyFilePrompt({}),\n });\n\n const privateKey = privateKeyPath\n ? yield* readPrivateKeyFile(privateKeyPath)\n : undefined;\n\n const customRedirectUri = yield* optOrPrompt(opts['custom-redirect-uri'], {\n required: false,\n simpleName: '--custom-redirect-uri',\n skipIf: skipWeb,\n skipMessage: `--custom-redirect-uri ${webSkipMessage}`,\n prompt: optionalRedirectPrompt,\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n\n const redirectUri = privateKey\n ? customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL\n : undefined;\n\n const meta: { teamId?: string; keyId?: string } = {};\n if (teamId !== undefined) meta.teamId = teamId;\n if (keyId !== undefined) meta.keyId = keyId;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId: servicesId,\n clientSecret: privateKey,\n authorizationEndpoint: APPLE_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: APPLE_TOKEN_ENDPOINT,\n discoveryEndpoint: APPLE_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n ...(Object.keys(meta).length > 0 ? { meta } : {}),\n });\n\n const summaryLines: string[] = [\n `Apple OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Services ID: ${response.client.client_id ?? servicesId}`,\n ];\n\n if (privateKey && redirectUri) {\n summaryLines.push(`Team ID: ${teamId}`);\n summaryLines.push(`Key ID: ${keyId}`);\n summaryLines.push(\n ...redirectSetupMessages({\n prompt: `Add this return URL under your Services ID on ${link('https://developer.apple.com', 'developer.apple.com')}`,\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n }),\n );\n }\n yield* Effect.log(\n boxen(summaryLines.join('\\n'), {\n dimBorder: true,\n padding: { right: 1, left: 1 },\n }),\n );\n});\n\nconst handleClerkClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'clerk',\n opts,\n );\n\n const publishableKey = yield* optOrPrompt(opts['publishable-key'], {\n simpleName: '--publishable-key',\n required: true,\n skipIf: false,\n prompt: clerkPublishableKeyPrompt({}),\n });\n\n if (!clientName) {\n return yield* BadArgsError.make({ message: 'Client name is required.' });\n }\n if (!publishableKey) {\n return yield* BadArgsError.make({\n message: 'Publishable key is required.',\n });\n }\n\n const domain = clerkDomainFromPublishableKey(publishableKey);\n if (!domain) {\n return yield* BadArgsError.make({\n message: 'Invalid publishable key. Could not extract domain.',\n });\n }\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n discoveryEndpoint: `https://${domain}/.well-known/openid-configuration`,\n meta: { clerkPublishableKey: publishableKey },\n });\n\n const clerkDomain = response.client.discovery_endpoint?.replace(\n '/.well-known/openid-configuration',\n '',\n );\n\n yield* Effect.log(\n boxen(\n [\n `Clerk OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Clerk Publishable Key: ${response.client.meta?.clerkPublishableKey}`,\n `Clerk Domain: ${clerkDomain}`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n\n yield* Effect.log(\n '\\nNavigate to your Clerk dashboard. On the Sessions page, click the Edit button in the Customize session token section.\\nEnsure your Claims field has the email claim:\\n' +\n boxen(\n `{\n \"email\": \"{{user.primary_email_address}}\",\n \"email_verified\": \"{{user.email_verified}}\"\n}`,\n { borderStyle: 'none' },\n ),\n );\n});\n\nconst handleFirebaseClient = Effect.fn(function* (\n opts: OptsFromCommand<typeof authClientAddDef> & Record<string, unknown>,\n) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'firebase',\n opts,\n );\n\n const projectId = yield* optOrPrompt(opts['project-id'], {\n simpleName: '--project-id',\n required: true,\n skipIf: false,\n prompt: firebaseProjectIdPrompt({}),\n });\n // typeguard\n if (!clientName || !projectId) {\n return yield* BadArgsError.make({\n message: 'Missing required arguments',\n });\n }\n const validationError = validateFirebaseProjectId(projectId);\n if (validationError) {\n return yield* BadArgsError.make({ message: validationError });\n }\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n discoveryEndpoint: firebaseDiscoveryEndpoint(projectId),\n });\n\n yield* Effect.log(\n boxen(\n [\n `Firebase OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Firebase Project ID: ${projectId}`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nexport const authClientAddCmd = Effect.fn(\n function* (\n opts: OptsFromCommand<typeof authClientAddDef> & Record<string, unknown>,\n ) {\n const { yes } = yield* GlobalOpts;\n if (!opts.type && yes) {\n return yield* BadArgsError.make({\n message: `Missing required value for --type. Expected one of: ${ClientTypeSchema.literals.join(', ')}`,\n });\n }\n const clientType = yield* Option.fromNullable(opts.type).pipe(\n Effect.catchTag('NoSuchElementException', () =>\n runUIEffect(\n new UI.Select({\n options: [\n { label: 'Google', value: 'google' },\n { label: 'GitHub', value: 'github' },\n { label: 'Apple', value: 'apple' },\n { label: 'LinkedIn', value: 'linkedin' },\n { label: 'Clerk', value: 'clerk' },\n { label: 'Firebase', value: 'firebase' },\n ],\n promptText: 'Select a client type:',\n modifyOutput: UI.modifiers.piped([UI.modifiers.dimOnComplete]),\n }),\n ),\n ),\n Effect.andThen((s) => Schema.decodeUnknown(ClientTypeSchema)(s)),\n Effect.catchTag('ParseError', () =>\n BadArgsError.make({\n message: `Invalid client type, must be one of: ${ClientTypeSchema.literals.join(', ')}`,\n }),\n ),\n );\n\n yield* Match.value(clientType).pipe(\n Match.withReturnType<Effect.Effect<void, any, any>>(),\n Match.when('google', () => handleGoogleClient(opts)),\n Match.when('github', () => handleGithubClient(opts)),\n Match.when('apple', () => handleAppleClient(opts)),\n Match.when('linkedin', () => handleLinkedInClient(opts)),\n Match.when('clerk', () => handleClerkClient(opts)),\n Match.when('firebase', () => handleFirebaseClient(opts)),\n Match.exhaustive,\n );\n },\n Effect.catchTag('BadArgsError', (e) =>\n Effect.gen(function* () {\n yield* Effect.logError(e.message);\n yield* Effect.log(\n chalk.dim(\n 'hint: run `instant-cli auth client add --help` for the list of available arguments',\n ),\n );\n }),\n ),\n);\n"]}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/add.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, Match, Option, Schema } from 'effect';\nimport type { authClientAddDef, OptsFromCommand } from '../../../index.ts';\nimport { BadArgsError } from '../../../errors.ts';\nimport { GlobalOpts } from '../../../context/globalOpts.ts';\nimport { Args } from '../../../lib/args.ts';\nimport { runUIEffect, validateRequired } from '../../../lib/ui.ts';\nimport {\n addOAuthClient,\n findName,\n getClientNameAndProvider,\n getOrCreateProvider,\n GoogleAppTypeSchema,\n OAuthClient,\n} from '../../../lib/oauth.ts';\nimport {\n DEFAULT_OAUTH_CALLBACK_URL,\n GOOGLE_AUTHORIZATION_ENDPOINT,\n GOOGLE_DISCOVERY_ENDPOINT,\n GOOGLE_TOKEN_ENDPOINT,\n APPLE_AUTHORIZATION_ENDPOINT,\n APPLE_DISCOVERY_ENDPOINT,\n APPLE_TOKEN_ENDPOINT,\n clerkDomainFromPublishableKey,\n LINKEDIN_AUTHORIZATION_ENDPOINT,\n LINKEDIN_DISCOVERY_ENDPOINT,\n LINKEDIN_TOKEN_ENDPOINT,\n} from '@instantdb/platform';\nimport { UI } from '../../../ui/index.ts';\nimport chalk from 'chalk';\nimport boxen from 'boxen';\nimport { link } from '../../../logging.ts';\nimport {\n appleKeyIdPrompt,\n applePrivateKeyFilePrompt,\n appleServicesIdPrompt,\n appleTeamIdPrompt,\n clerkPublishableKeyPrompt,\n clientIdPrompt,\n clientSecretPrompt,\n firebaseDiscoveryEndpoint,\n firebaseProjectIdPrompt,\n readPrivateKeyFile,\n redirectSetupMessages,\n redirectUriPrompt,\n validateFirebaseProjectId,\n} from './shared.ts';\n\nexport const ClientTypeSchema = Schema.Literal(\n 'google',\n 'github',\n 'apple',\n 'linkedin',\n 'clerk',\n 'firebase',\n);\n\nconst googleConsoleUrl =\n 'https://console.developers.google.com/apis/credentials';\nconst githubDeveloperUrl = 'https://github.com/settings/developers';\nconst linkedinDeveloperUrl = 'https://www.linkedin.com/developers/apps';\nconst optionalRedirectPrompt = redirectUriPrompt({\n heading: 'Custom redirect URI (optional):',\n});\n\nconst selectGoogleAppType = (value: unknown) =>\n Effect.gen(function* () {\n const { yes } = yield* GlobalOpts;\n\n return yield* Option.fromNullable(value).pipe(\n Effect.catchTag('NoSuchElementException', () => {\n if (yes) {\n return BadArgsError.make({\n message: `Missing required value for --app-type. Expected one of: ${GoogleAppTypeSchema.literals.join(', ')}`,\n });\n }\n\n return runUIEffect(\n new UI.Select({\n options: [\n {\n label:\n 'Web' + chalk.dim(' (Redirect Flows or Expo Auth Session)'),\n value: 'web',\n },\n { label: 'iOS', value: 'ios' },\n { label: 'Android', value: 'android' },\n { label: 'Google Button for Web', value: 'button-for-web' },\n ],\n promptText: 'Select a Google app type:',\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n defaultValue: 'web',\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n }),\n Effect.andThen((raw) => Schema.decodeUnknown(GoogleAppTypeSchema)(raw)),\n Effect.catchTag('ParseError', () =>\n BadArgsError.make({\n message:\n 'Invalid app-type, must be one of: web, ios, android, button-for-web',\n }),\n ),\n );\n });\n\nconst selectGoogleCredentialMode = Effect.fn(function* () {\n return yield* runUIEffect(\n new UI.Select({\n options: [\n {\n label:\n 'Use dev credentials' +\n chalk.dim(' (works on localhost and Expo, no Google setup)'),\n value: 'dev' as const,\n },\n {\n label:\n 'Use my own credentials' +\n chalk.dim(' (client ID and secret from Google Console)'),\n value: 'custom' as const,\n },\n ],\n promptText: 'Select Google credential mode:',\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n defaultValue: 'dev' as const,\n }),\n ).pipe(\n Effect.catchTag('UIError', (e) =>\n BadArgsError.make({ message: `UI error: ${e.message}` }),\n ),\n );\n});\n\nconst resolveGoogleCredentialMode = Effect.fn(function* ({\n appType,\n opts,\n}: {\n appType: typeof GoogleAppTypeSchema.Type;\n opts: Record<string, unknown>;\n}): Effect.fn.Return<'custom' | 'dev', BadArgsError, GlobalOpts> {\n const { yes } = yield* GlobalOpts;\n const devCredentialsFlag = Args.isTrue(opts, 'dev-credentials');\n const hasProvidedSomeCustomCredentials = Args.hasAny(opts, [\n 'client-id',\n 'client-secret',\n 'custom-redirect-uri',\n ]);\n\n if (devCredentialsFlag && appType !== 'web') {\n return yield* BadArgsError.make({\n message:\n '--dev-credentials is only supported for --app-type web. Native Google clients need credentials from Google.',\n });\n }\n\n if (devCredentialsFlag && hasProvidedSomeCustomCredentials) {\n return yield* BadArgsError.make({\n message:\n '--dev-credentials cannot be combined with --client-id, --client-secret, or --custom-redirect-uri.',\n });\n }\n\n if (appType !== 'web') {\n return 'custom';\n }\n\n if (hasProvidedSomeCustomCredentials) {\n return 'custom';\n }\n\n if (devCredentialsFlag) {\n return 'dev';\n }\n\n if (yes) {\n return 'dev';\n }\n\n return yield* selectGoogleCredentialMode();\n});\n\nconst printGoogleDevCredentialsClient = Effect.fn(function* ({\n appType,\n client,\n}: {\n appType: typeof GoogleAppTypeSchema.Type;\n client: typeof OAuthClient.Type;\n}) {\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client created: ${client.client_name}`,\n `App type: ${appType}`,\n `Credentials: Instant dev credentials`,\n `ID: ${client.id}`,\n '',\n 'No Google Console setup required.',\n 'Works on localhost and Expo during development.',\n '',\n chalk.bold('Ready for production? Run:'),\n ` instant-cli auth client update --name ${client.client_name} --client-id <id> --client-secret <secret>`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst printGoogleCustomCredentialsClient = Effect.fn(function* ({\n appType,\n client,\n clientId,\n customRedirectUri,\n redirectUri,\n}: {\n appType: typeof GoogleAppTypeSchema.Type;\n client: typeof OAuthClient.Type;\n clientId: string | undefined;\n customRedirectUri: string | undefined;\n redirectUri: string | undefined;\n}) {\n const redirectMessages: string[] = [];\n if (appType === 'web' && redirectUri) {\n redirectMessages.push(\n ...redirectSetupMessages({\n prompt: 'Add this redirect URI in Google Console',\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n }),\n );\n }\n\n yield* Effect.log(\n boxen(\n [\n `Google OAuth client created: ${client.client_name}`,\n `App type: ${appType}`,\n `ID: ${client.id}`,\n `Google Client ID: ${client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleGoogleClient = Effect.fn(function* (opts: Record<string, unknown>) {\n // This one requires special logic for getting client name\n // because the suggested name includes the app type\n const appType = yield* selectGoogleAppType(opts['app-type']);\n const credentialMode = yield* resolveGoogleCredentialMode({\n appType,\n opts,\n });\n const useSharedCredentials = credentialMode === 'dev';\n\n const { auth, provider } = yield* getOrCreateProvider('google');\n const usedClientNames = new Set(\n (auth.oauth_clients ?? []).map((client) => client.client_name),\n );\n const suggestedClientName = findName(`google-${appType}`, usedClientNames);\n\n const clientName = yield* Args.text(opts, 'name').pipe(\n Args.prompt({\n prompt: 'Client Name:',\n defaultValue: suggestedClientName,\n placeholder: suggestedClientName,\n validate: validateRequired,\n modifyOutput: UI.modifiers.piped([\n UI.modifiers.topPadding,\n UI.modifiers.dimOnComplete,\n ]),\n }),\n Args.required(),\n );\n\n if (usedClientNames.has(clientName)) {\n return yield* BadArgsError.make({\n message: `The unique name '${clientName}' is already in use.`,\n });\n }\n\n const clientId = yield* Args.text(opts, 'client-id').pipe(\n Args.availableWhen(!useSharedCredentials, {\n message:\n '--client-id is not compatible with --dev-credentials. Drop one or the other.',\n }),\n Args.prompt(clientIdPrompt({ providerUrl: googleConsoleUrl })),\n Args.required(),\n );\n\n const usesCustomWebCredentials = !useSharedCredentials && appType === 'web';\n const clientSecret = yield* Args.text(opts, 'client-secret').pipe(\n Args.availableWhen(usesCustomWebCredentials, {\n message: useSharedCredentials\n ? '--client-secret is not compatible with --dev-credentials. Drop one or the other.'\n : undefined,\n }),\n Args.prompt(clientSecretPrompt({ providerUrl: googleConsoleUrl })),\n Args.required(),\n );\n\n const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(\n Args.availableWhen(usesCustomWebCredentials, {\n message: useSharedCredentials\n ? '--custom-redirect-uri is not compatible with --dev-credentials.'\n : 'Provided custom redirect URI when not using web app type.',\n }),\n Args.prompt(optionalRedirectPrompt),\n Args.optional(),\n );\n\n const redirectUri = useSharedCredentials\n ? undefined\n : customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId: useSharedCredentials ? undefined : clientId,\n clientSecret: useSharedCredentials ? undefined : clientSecret,\n authorizationEndpoint: GOOGLE_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: GOOGLE_TOKEN_ENDPOINT,\n discoveryEndpoint: GOOGLE_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n meta: {\n appType,\n skipNonceChecks: true,\n },\n useSharedCredentials,\n });\n\n if (useSharedCredentials) {\n yield* printGoogleDevCredentialsClient({\n appType,\n client: response.client,\n });\n return;\n }\n\n yield* printGoogleCustomCredentialsClient({\n appType,\n client: response.client,\n clientId,\n customRedirectUri,\n redirectUri,\n });\n});\n\nconst handleGithubClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'github',\n opts,\n );\n\n const clientId = yield* Args.text(opts, 'client-id').pipe(\n Args.prompt(clientIdPrompt({ providerUrl: githubDeveloperUrl })),\n Args.required(),\n );\n\n const clientSecret = yield* Args.text(opts, 'client-secret').pipe(\n Args.prompt(clientSecretPrompt({ providerUrl: githubDeveloperUrl })),\n Args.required(),\n );\n\n const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(\n Args.prompt(optionalRedirectPrompt),\n Args.optional(),\n );\n\n const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n // The backend infers GitHub's authorization/token endpoints from\n // meta.providerName === 'github', so we don't pass them here.\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId,\n clientSecret,\n redirectTo: redirectUri,\n meta: { providerName: 'github' },\n });\n\n const redirectMessages = redirectSetupMessages({\n prompt: 'Add this callback URL in your GitHub OAuth App settings',\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n });\n\n yield* Effect.log(\n boxen(\n [\n `GitHub OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `GitHub Client ID: ${response.client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleLinkedInClient = Effect.fn(function* (\n opts: Record<string, unknown>,\n) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'linkedin',\n opts,\n );\n\n const clientId = yield* Args.text(opts, 'client-id').pipe(\n Args.prompt(clientIdPrompt({ providerUrl: linkedinDeveloperUrl })),\n Args.required(),\n );\n\n const clientSecret = yield* Args.text(opts, 'client-secret').pipe(\n Args.prompt(clientSecretPrompt({ providerUrl: linkedinDeveloperUrl })),\n Args.required(),\n );\n\n const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(\n Args.prompt(optionalRedirectPrompt),\n Args.optional(),\n );\n\n const redirectUri = customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId,\n clientSecret,\n authorizationEndpoint: LINKEDIN_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: LINKEDIN_TOKEN_ENDPOINT,\n discoveryEndpoint: LINKEDIN_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n });\n\n const redirectMessages = redirectSetupMessages({\n prompt: 'Add this redirect URI in your LinkedIn app settings',\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n });\n\n yield* Effect.log(\n boxen(\n [\n `LinkedIn OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `LinkedIn Client ID: ${response.client.client_id ?? clientId}`,\n ...redirectMessages,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nconst handleAppleClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'apple',\n opts,\n );\n\n const servicesId = yield* Args.text(opts, 'services-id').pipe(\n Args.prompt(appleServicesIdPrompt({})),\n Args.required(),\n );\n\n // If any web-flow flag is provided, enable web flow; otherwise ask\n // (non-interactively with --yes we default to native-only).\n const anyWebFlagProvided = Args.hasAny(opts, [\n 'team-id',\n 'key-id',\n 'private-key-file',\n 'custom-redirect-uri',\n ]);\n\n const configureWeb = anyWebFlagProvided\n ? true\n : yield* Args.bool(opts, 'configure-web').pipe(\n Args.confirm({\n promptText:\n 'Configure web redirect flow? ' +\n chalk.dim(\n '(requires Team ID, Key ID, and a .p8 private key from Apple)',\n ),\n defaultValue: false,\n }),\n Args.required(),\n );\n\n const skipWeb = !configureWeb;\n const webSkipMessage =\n 'requires configuring the web redirect flow (also provide --team-id, --key-id, and --private-key-file).';\n\n const teamId = yield* Args.text(opts, 'team-id').pipe(\n Args.availableWhen(!skipWeb, { message: `--team-id ${webSkipMessage}` }),\n Args.prompt(appleTeamIdPrompt({})),\n Args.required(),\n );\n\n const keyId = yield* Args.text(opts, 'key-id').pipe(\n Args.availableWhen(!skipWeb, { message: `--key-id ${webSkipMessage}` }),\n Args.prompt(appleKeyIdPrompt({})),\n Args.required(),\n );\n\n const privateKeyPath = yield* Args.text(opts, 'private-key-file').pipe(\n Args.availableWhen(!skipWeb, {\n message: `--private-key-file ${webSkipMessage}`,\n }),\n Args.prompt(applePrivateKeyFilePrompt({})),\n Args.required(),\n );\n\n const privateKey = privateKeyPath\n ? yield* readPrivateKeyFile(privateKeyPath)\n : undefined;\n\n const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(\n Args.availableWhen(!skipWeb, {\n message: `--custom-redirect-uri ${webSkipMessage}`,\n }),\n Args.prompt(optionalRedirectPrompt),\n Args.optional(),\n );\n\n const redirectUri = privateKey\n ? customRedirectUri || DEFAULT_OAUTH_CALLBACK_URL\n : undefined;\n\n const meta: { teamId?: string; keyId?: string } = {};\n if (teamId !== undefined) meta.teamId = teamId;\n if (keyId !== undefined) meta.keyId = keyId;\n\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n clientId: servicesId,\n clientSecret: privateKey,\n authorizationEndpoint: APPLE_AUTHORIZATION_ENDPOINT,\n tokenEndpoint: APPLE_TOKEN_ENDPOINT,\n discoveryEndpoint: APPLE_DISCOVERY_ENDPOINT,\n redirectTo: redirectUri,\n ...(Object.keys(meta).length > 0 ? { meta } : {}),\n });\n\n const summaryLines: string[] = [\n `Apple OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Services ID: ${response.client.client_id ?? servicesId}`,\n ];\n\n if (privateKey && redirectUri) {\n summaryLines.push(`Team ID: ${teamId}`);\n summaryLines.push(`Key ID: ${keyId}`);\n summaryLines.push(\n ...redirectSetupMessages({\n prompt: `Add this return URL under your Services ID on ${link('https://developer.apple.com', 'developer.apple.com')}`,\n redirectUri,\n showCustomRedirectInstructions: Boolean(customRedirectUri),\n }),\n );\n }\n yield* Effect.log(\n boxen(summaryLines.join('\\n'), {\n dimBorder: true,\n padding: { right: 1, left: 1 },\n }),\n );\n});\n\nconst handleClerkClient = Effect.fn(function* (opts: Record<string, unknown>) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'clerk',\n opts,\n );\n\n const publishableKey = yield* 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* addOAuthClient({\n providerId: provider.id,\n clientName,\n discoveryEndpoint: `https://${domain}/.well-known/openid-configuration`,\n meta: { clerkPublishableKey: publishableKey },\n });\n\n const clerkDomain = response.client.discovery_endpoint?.replace(\n '/.well-known/openid-configuration',\n '',\n );\n\n yield* Effect.log(\n boxen(\n [\n `Clerk OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Clerk Publishable Key: ${response.client.meta?.clerkPublishableKey}`,\n `Clerk Domain: ${clerkDomain}`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n\n yield* Effect.log(\n '\\nNavigate to your Clerk dashboard. On the Sessions page, click the Edit button in the Customize session token section.\\nEnsure your Claims field has the email claim:\\n' +\n boxen(\n `{\n \"email\": \"{{user.primary_email_address}}\",\n \"email_verified\": \"{{user.email_verified}}\"\n}`,\n { borderStyle: 'none' },\n ),\n );\n});\n\nconst handleFirebaseClient = Effect.fn(function* (\n opts: OptsFromCommand<typeof authClientAddDef> & Record<string, unknown>,\n) {\n const { clientName, provider } = yield* getClientNameAndProvider(\n 'firebase',\n opts,\n );\n\n const projectId = yield* Args.text(opts, 'project-id').pipe(\n Args.prompt(firebaseProjectIdPrompt({})),\n Args.validate(validateFirebaseProjectId),\n Args.required(),\n );\n const response = yield* addOAuthClient({\n providerId: provider.id,\n clientName,\n discoveryEndpoint: firebaseDiscoveryEndpoint(projectId),\n });\n\n yield* Effect.log(\n boxen(\n [\n `Firebase OAuth client created: ${response.client.client_name}`,\n `ID: ${response.client.id}`,\n `Firebase Project ID: ${projectId}`,\n ].join('\\n'),\n { dimBorder: true, padding: { right: 1, left: 1 } },\n ),\n );\n});\n\nexport const authClientAddCmd = Effect.fn(\n function* (\n opts: OptsFromCommand<typeof authClientAddDef> & Record<string, unknown>,\n ) {\n const { yes } = yield* GlobalOpts;\n if (!opts.type && yes) {\n return yield* BadArgsError.make({\n message: `Missing required value for --type. Expected one of: ${ClientTypeSchema.literals.join(', ')}`,\n });\n }\n const clientType = yield* Option.fromNullable(opts.type).pipe(\n Effect.catchTag('NoSuchElementException', () =>\n runUIEffect(\n new UI.Select({\n options: [\n { label: 'Google', value: 'google' },\n { label: 'GitHub', value: 'github' },\n { label: 'Apple', value: 'apple' },\n { label: 'LinkedIn', value: 'linkedin' },\n { label: 'Clerk', value: 'clerk' },\n { label: 'Firebase', value: 'firebase' },\n ],\n promptText: 'Select a client type:',\n modifyOutput: UI.modifiers.piped([UI.modifiers.dimOnComplete]),\n }),\n ),\n ),\n Effect.andThen((s) => Schema.decodeUnknown(ClientTypeSchema)(s)),\n Effect.catchTag('ParseError', () =>\n BadArgsError.make({\n message: `Invalid client type, must be one of: ${ClientTypeSchema.literals.join(', ')}`,\n }),\n ),\n );\n\n yield* Match.value(clientType).pipe(\n Match.withReturnType<Effect.Effect<void, any, any>>(),\n Match.when('google', () => handleGoogleClient(opts)),\n Match.when('github', () => handleGithubClient(opts)),\n Match.when('apple', () => handleAppleClient(opts)),\n Match.when('linkedin', () => handleLinkedInClient(opts)),\n Match.when('clerk', () => handleClerkClient(opts)),\n Match.when('firebase', () => handleFirebaseClient(opts)),\n Match.exhaustive,\n );\n },\n Effect.catchTag('BadArgsError', (e) =>\n Effect.gen(function* () {\n yield* Effect.logError(e.message);\n yield* Effect.log(\n chalk.dim(\n 'hint: run `instant-cli auth client add --help` for the list of available arguments',\n ),\n );\n }),\n ),\n);\n"]}
@@ -2,10 +2,6 @@ import { FileSystem } from '@effect/platform';
2
2
  import { Effect } from 'effect';
3
3
  import { BadArgsError } from '../../../errors.ts';
4
4
  type EmptyPromptArgs = Record<string, never>;
5
- export declare const getFlag: (opts: Record<string, unknown>, flag: string) => unknown;
6
- export declare const hasFlag: (opts: Record<string, unknown>, flag: string) => boolean;
7
- export declare const hasAnyFlag: (opts: Record<string, unknown>, flags: string[]) => boolean;
8
- export declare const isTrueFlag: (value: unknown) => value is true | "true";
9
5
  export declare const getMetaString: (meta: unknown, key: string) => string | undefined;
10
6
  export declare const clientIdPrompt: ({ providerUrl }: {
11
7
  providerUrl: string;
@@ -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;AAKlD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE7C,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,YACvD,CAAC;AAEb,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,YACrD,CAAC;AAEf,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,MAAM,EAAE,YAC9B,CAAC;AAE5C,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,2BACL,CAAC;AAErC,eAAO,MAAM,aAAa,GAAI,MAAM,OAAO,EAAE,KAAK,MAAM,uBAIvD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,iBAAiB;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE;;;;CAOrE,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,kBAEhC;IACD,WAAW,EAAE,MAAM,CAAC;CACrB;;;;;CAQC,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,aAAa;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE;;;;CAqBhE,CAAC;AAEH,eAAO,MAAM,qBAAqB,GAAI,0DAInC;IACD,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAC1C,aAcA,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,eAAe;;;;CAO1D,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,OAAO,eAAe;;;;CAOtD,CAAC;AAEH,eAAO,MAAM,gBAAgB,GAAI,OAAO,eAAe;;;;CAOrD,CAAC;AAEH,eAAO,MAAM,yBAAyB,GAAI,OAAO,eAAe;;;;CAO9D,CAAC;AAEH,eAAO,MAAM,yBAAyB,GAAI,OAAO,eAAe;;;oBAG9C,MAAM;;CAUtB,CAAC;AAEH,eAAO,MAAM,uBAAuB,GAAI,OAAO,eAAe;;;;CAO5D,CAAC;AAEH,eAAO,MAAM,kBAAkB,8EAuB7B,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,oNAMtD;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,UAE1D"}
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,aAAa,GAAI,MAAM,OAAO,EAAE,KAAK,MAAM,uBAIvD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,iBAAiB;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE;;;;CAOrE,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,kBAEhC;IACD,WAAW,EAAE,MAAM,CAAC;CACrB;;;;;CAQC,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,aAAa;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE;;;;CAqBhE,CAAC;AAEH,eAAO,MAAM,qBAAqB,GAAI,0DAInC;IACD,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAC1C,aAcA,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,eAAe;;;;CAO1D,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,OAAO,eAAe;;;;CAOtD,CAAC;AAEH,eAAO,MAAM,gBAAgB,GAAI,OAAO,eAAe;;;;CAOrD,CAAC;AAEH,eAAO,MAAM,yBAAyB,GAAI,OAAO,eAAe;;;;CAO9D,CAAC;AAEH,eAAO,MAAM,yBAAyB,GAAI,OAAO,eAAe;;;oBAG9C,MAAM;;CAUtB,CAAC;AAEH,eAAO,MAAM,uBAAuB,GAAI,OAAO,eAAe;;;;CAO5D,CAAC;AAEH,eAAO,MAAM,kBAAkB,8EAuB7B,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,oNAMtD;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,UAE1D"}
@@ -6,10 +6,6 @@ import { BadArgsError } from "../../../errors.js";
6
6
  import { link } from "../../../logging.js";
7
7
  import { stripFirstBlankLine, validateRequired } from "../../../lib/ui.js";
8
8
  import { UI } from "../../../ui/index.js";
9
- export const getFlag = (opts, flag) => opts[flag];
10
- export const hasFlag = (opts, flag) => flag in opts;
11
- export const hasAnyFlag = (opts, flags) => flags.some((flag) => hasFlag(opts, flag));
12
- export const isTrueFlag = (value) => value === true || value === 'true';
13
9
  export const getMetaString = (meta, key) => {
14
10
  if (!meta || typeof meta !== 'object')
15
11
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","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;AAChC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAI1C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAA6B,EAAE,IAAY,EAAE,EAAE,CACrE,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAA6B,EAAE,IAAY,EAAE,EAAE,CACrE,IAAI,IAAI,IAAI,CAAC;AAEf,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAA6B,EAAE,KAAe,EAAE,EAAE,CAC3E,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAE,EAAE,CAC3C,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC;AAErC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAa,EAAE,GAAW,EAAE,EAAE;IAC1D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxD,MAAM,KAAK,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAC;IACrD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,WAAW,EAA2B,EAAE,EAAE,CAAC,CAAC;IAC3E,MAAM,EAAE,cAAc,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;IAChE,QAAQ,EAAE,gBAAgB;IAC1B,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;QACvB,EAAE,CAAC,SAAS,CAAC,aAAa;KAC3B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,WAAW,GAGZ,EAAE,EAAE,CAAC,CAAC;IACL,MAAM,EAAE,kBAAkB,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;IACpE,QAAQ,EAAE,gBAAgB;IAC1B,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;QACvB,EAAE,CAAC,SAAS,CAAC,aAAa;KAC3B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,OAAO,EAAuB,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,EAAE,EAAE;IACV,WAAW,EAAE,qCAAqC;IAClD,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YACjB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,OAAO,CACL,KAAK,OAAO;EACpB,KAAK,CAAC,GAAG,CAAC,4GAA4G,CAAC;EACvH,KAAK,CAAC,GAAG,CAAC,4BAA4B,0BAA0B,uCAAuC,CAAC,MAAM;oBACtG,mBAAmB,CAAC,MAAM,CAAC,CAC5B,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACnD,OAAO,KAAK,OAAO,aAAa,CAAC;YACnC,CAAC;YACD,OAAO,KAAK,OAAO,KAAK,MAAM,EAAE,CAAC;QACnC,CAAC;QACD,EAAE,CAAC,SAAS,CAAC,aAAa;KAC3B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EACpC,MAAM,EACN,WAAW,EACX,8BAA8B,GAK/B,EAAE,EAAE;IACH,MAAM,QAAQ,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAEzE,IAAI,8BAA8B,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CACX,EAAE,EACF,wCAAwC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,uCAAuC,CACtH,CAAC;QACF,QAAQ,CAAC,IAAI,CACX,gCAAgC,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,qBAAqB,CAAC,EAAE,CAClF,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAsB,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,EAAE,eAAe,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,0EAA0E,CAAC,GAAG,CAAC,EAAE;IAChI,QAAQ,EAAE,gBAAgB;IAC1B,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;QACvB,EAAE,CAAC,SAAS,CAAC,aAAa;KAC3B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAsB,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,WAAW,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,2DAA2D,CAAC,GAAG,CAAC,EAAE;IAC7G,QAAQ,EAAE,gBAAgB;IAC1B,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;QACvB,EAAE,CAAC,SAAS,CAAC,aAAa;KAC3B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAsB,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,EAAE,UAAU,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,6DAA6D,CAAC,GAAG,CAAC,EAAE;IAC9G,QAAQ,EAAE,gBAAgB;IAC1B,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;QACvB,EAAE,CAAC,SAAS,CAAC,aAAa;KAC3B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAsB,EAAE,EAAE,CAAC,CAAC;IACpE,MAAM,EAAE,gCAAgC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE;IAC9E,QAAQ,EAAE,gBAAgB;IAC1B,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;QACvB,EAAE,CAAC,SAAS,CAAC,aAAa;KAC3B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAsB,EAAE,EAAE,CAAC,CAAC;IACpE,MAAM,EAAE,yBAAyB,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,uDAAuD,CAAC,GAAG,CAAC,EAAE;IACvH,WAAW,EAAE,6DAA6D;IAC1E,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE;QACxB,IAAI,CAAC,GAAG;YAAE,OAAO,6BAA6B,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,sDAAsD,CAAC;QAChE,CAAC;IACH,CAAC;IACD,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;QACvB,EAAE,CAAC,SAAS,CAAC,aAAa;KAC3B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAsB,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,EAAE,uDAAuD,IAAI,CAAC,sCAAsC,CAAC,GAAG;IAC9G,QAAQ,EAAE,yBAAyB;IACnC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU;QACvB,EAAE,CAAC,SAAS,CAAC,aAAa;KAC3B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EACzE,IAAY;IAEZ,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,qEAAqE;IACrE,MAAM,cAAc,GAClB,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,CACpE,MAAM,CAAC,QAAQ,CACb,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,YAAY,CAAC;QACf,OAAO,EAAE,sCAAsC,cAAc,KAAK,CAAC,CAAC,OAAO,EAAE;KAC9E,CAAC,CACL,CACF,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,uBAAuB,cAAc,YAAY;SAC3D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC,CAAC;AAEH,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,MAAM,cAAc,GAAG,gCAAgC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,wBAAwB,CAAC;IAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,yKAAyK,CAAC;IACnL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,OAAO,kCAAkC,kBAAkB,CAAC,SAAS,CAAC,mCAAmC,CAAC;AAC5G,CAAC","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 const answer = stripFirstBlankLine(output);\n if (status === 'submitted' && answer.trim() === '') {\n return `\\n${heading}\\n(skipped)`;\n }\n return `\\n${heading}\\n${answer}`;\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 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 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 const answer = stripFirstBlankLine(output);\n if (status === 'submitted' && answer.trim() === '') {\n return `\\n${heading}\\n(skipped)`;\n }\n return `\\n${heading}\\n${answer}`;\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 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"]}
@@ -4,5 +4,5 @@ export declare const authClientUpdateCmd: (opts: {
4
4
  id?: string | undefined;
5
5
  name?: string | undefined;
6
6
  app?: string | undefined;
7
- } & Record<string, unknown>) => Effect.Effect<void | undefined, import("../../../lib/ui.ts").UIError | import("../../../lib/http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("effect/ParseResult").ParseError | import("@effect/platform/HttpClientError").ResponseError, GlobalOpts | import("@effect/platform/FileSystem").FileSystem | import("../../../lib/http.ts").InstantHttpAuthed | import("../../../context/currentApp.ts").CurrentApp>;
7
+ } & Record<string, unknown>) => Effect.Effect<void | undefined, import("../../../lib/http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("effect/ParseResult").ParseError | import("@effect/platform/HttpClientError").ResponseError, GlobalOpts | import("@effect/platform/FileSystem").FileSystem | import("../../../lib/http.ts").InstantHttpAuthed | import("../../../context/currentApp.ts").CurrentApp>;
8
8
  //# sourceMappingURL=update.d.ts.map