instant-cli 1.0.23-branch-codex-cli-args-combinators.25402833936.1 → 1.0.23-branch-codex-cli-args-combinators.25405731325.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/__tests__/args.test.ts +12 -0
- package/__tests__/authClientAddApple.test.ts +9 -10
- package/__tests__/authClientAddClerk.test.ts +6 -5
- package/__tests__/authClientAddGithub.test.ts +6 -5
- package/__tests__/authClientAddGoogle.test.ts +5 -4
- package/__tests__/authClientAddLinkedin.test.ts +6 -5
- package/dist/commands/auth/client/add.d.ts.map +1 -1
- package/dist/commands/auth/client/add.js +1 -0
- package/dist/commands/auth/client/add.js.map +1 -1
- package/dist/lib/args.d.ts +144 -0
- package/dist/lib/args.d.ts.map +1 -1
- package/dist/lib/args.js +128 -2
- package/dist/lib/args.js.map +1 -1
- package/package.json +4 -4
- package/src/commands/auth/client/add.ts +1 -0
- package/src/lib/args.ts +150 -4
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> instant-cli@1.0.23-branch-codex-cli-args-combinators.
|
|
2
|
+
> instant-cli@1.0.23-branch-codex-cli-args-combinators.25405731325.1 build /home/runner/work/instant/instant/client/packages/cli
|
|
3
3
|
> rm -rf dist; tsc -p tsconfig.build.json
|
|
4
4
|
|
package/__tests__/args.test.ts
CHANGED
|
@@ -145,6 +145,18 @@ describe('non-interactive', () => {
|
|
|
145
145
|
expect(err.message).toBe('Missing required value for --client-id');
|
|
146
146
|
});
|
|
147
147
|
|
|
148
|
+
test('required missing value with prompt default -> default value', async () => {
|
|
149
|
+
const result = await run(
|
|
150
|
+
Args.text({}, 'name').pipe(
|
|
151
|
+
Args.prompt({ prompt: 'Client Name:', defaultValue: 'github' }),
|
|
152
|
+
Args.required(),
|
|
153
|
+
),
|
|
154
|
+
true,
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
expect(result).toBe('github');
|
|
158
|
+
});
|
|
159
|
+
|
|
148
160
|
test('number value -> stringified', async () => {
|
|
149
161
|
const result = await run(
|
|
150
162
|
Args.text({ 'client-id': 42 }, 'client-id').pipe(Args.required()),
|
|
@@ -141,17 +141,18 @@ const webFlags = new Map([
|
|
|
141
141
|
|
|
142
142
|
// -- native-only (no web flow): build-up with --yes --
|
|
143
143
|
|
|
144
|
-
describe('native: --yes
|
|
144
|
+
describe('native: --yes handles missing values', () => {
|
|
145
145
|
test('missing --type', async () => {
|
|
146
146
|
await run(without(nativeFlags, 'type'), { yes: true });
|
|
147
147
|
expect(logs.join('\n')).toContain('Missing required value for --type');
|
|
148
148
|
expect(addedClients).toHaveLength(0);
|
|
149
149
|
});
|
|
150
150
|
|
|
151
|
-
test('missing --name', async () => {
|
|
151
|
+
test('missing --name uses suggested default', async () => {
|
|
152
152
|
await run(without(nativeFlags, 'name'), { yes: true });
|
|
153
|
-
expect(
|
|
154
|
-
expect(addedClients).toHaveLength(
|
|
153
|
+
expect(prompts).toHaveLength(0);
|
|
154
|
+
expect(addedClients).toHaveLength(1);
|
|
155
|
+
expect(addedClients[0].clientName).toBe('apple');
|
|
155
156
|
});
|
|
156
157
|
|
|
157
158
|
test('missing --services-id', async () => {
|
|
@@ -361,17 +362,15 @@ describe('private key file errors', () => {
|
|
|
361
362
|
});
|
|
362
363
|
});
|
|
363
364
|
|
|
364
|
-
// --
|
|
365
|
+
// -- web-flow flag detection --
|
|
365
366
|
|
|
366
|
-
describe('
|
|
367
|
-
test('--custom-redirect-uri
|
|
367
|
+
describe('web-flow flag detection', () => {
|
|
368
|
+
test('--custom-redirect-uri enables web flow and requires web credentials', async () => {
|
|
368
369
|
await run(
|
|
369
370
|
withEntry(nativeFlags, 'custom-redirect-uri', 'https://example.com'),
|
|
370
371
|
{ yes: true },
|
|
371
372
|
);
|
|
372
|
-
expect(logs.join('\n')).toContain(
|
|
373
|
-
'--custom-redirect-uri requires configuring the web redirect flow',
|
|
374
|
-
);
|
|
373
|
+
expect(logs.join('\n')).toContain('Missing required value for --team-id');
|
|
375
374
|
expect(addedClients).toHaveLength(0);
|
|
376
375
|
});
|
|
377
376
|
});
|
|
@@ -116,19 +116,20 @@ const webFlags = new Map([
|
|
|
116
116
|
],
|
|
117
117
|
]);
|
|
118
118
|
|
|
119
|
-
// -- --yes: build-up
|
|
119
|
+
// -- --yes: build-up behavior --
|
|
120
120
|
|
|
121
|
-
describe('--yes
|
|
121
|
+
describe('--yes handles missing values', () => {
|
|
122
122
|
test('missing --type', async () => {
|
|
123
123
|
await run(without(webFlags, 'type'), { yes: true });
|
|
124
124
|
expect(logs.join('\n')).toContain('Missing required value for --type');
|
|
125
125
|
expect(addedClients).toHaveLength(0);
|
|
126
126
|
});
|
|
127
127
|
|
|
128
|
-
test('missing --name', async () => {
|
|
128
|
+
test('missing --name uses suggested default', async () => {
|
|
129
129
|
await run(without(webFlags, 'name'), { yes: true });
|
|
130
|
-
expect(
|
|
131
|
-
expect(addedClients).toHaveLength(
|
|
130
|
+
expect(prompts).toHaveLength(0);
|
|
131
|
+
expect(addedClients).toHaveLength(1);
|
|
132
|
+
expect(addedClients[0].clientName).toBe('clerk');
|
|
132
133
|
});
|
|
133
134
|
|
|
134
135
|
test('missing --publishable-key', async () => {
|
|
@@ -105,19 +105,20 @@ const webFlags = new Map([
|
|
|
105
105
|
['client-secret', 'ghs_abc123'],
|
|
106
106
|
]);
|
|
107
107
|
|
|
108
|
-
// -- --yes: build-up
|
|
108
|
+
// -- --yes: build-up behavior --
|
|
109
109
|
|
|
110
|
-
describe('--yes
|
|
110
|
+
describe('--yes handles missing values', () => {
|
|
111
111
|
test('missing --type', async () => {
|
|
112
112
|
await run(without(webFlags, 'type'), { yes: true });
|
|
113
113
|
expect(logs.join('\n')).toContain('Missing required value for --type');
|
|
114
114
|
expect(addedClients).toHaveLength(0);
|
|
115
115
|
});
|
|
116
116
|
|
|
117
|
-
test('missing --name', async () => {
|
|
117
|
+
test('missing --name uses suggested default', async () => {
|
|
118
118
|
await run(without(webFlags, 'name'), { yes: true });
|
|
119
|
-
expect(
|
|
120
|
-
expect(addedClients).toHaveLength(
|
|
119
|
+
expect(prompts).toHaveLength(0);
|
|
120
|
+
expect(addedClients).toHaveLength(1);
|
|
121
|
+
expect(addedClients[0].clientName).toBe('github');
|
|
121
122
|
});
|
|
122
123
|
|
|
123
124
|
test('missing --client-id', async () => {
|
|
@@ -115,7 +115,7 @@ const iosFlags = new Map([
|
|
|
115
115
|
|
|
116
116
|
// -- web: build-up with --yes --
|
|
117
117
|
|
|
118
|
-
describe('web: --yes
|
|
118
|
+
describe('web: --yes handles missing values', () => {
|
|
119
119
|
test('missing --type', async () => {
|
|
120
120
|
await run(without(webFlags, 'type'), { yes: true });
|
|
121
121
|
expect(logs.join('\n')).toContain('Missing required value for --type');
|
|
@@ -128,10 +128,11 @@ describe('web: --yes errors on each missing required flag', () => {
|
|
|
128
128
|
expect(addedClients).toHaveLength(0);
|
|
129
129
|
});
|
|
130
130
|
|
|
131
|
-
test('missing --name', async () => {
|
|
131
|
+
test('missing --name uses suggested default', async () => {
|
|
132
132
|
await run(without(webFlags, 'name'), { yes: true });
|
|
133
|
-
expect(
|
|
134
|
-
expect(addedClients).toHaveLength(
|
|
133
|
+
expect(prompts).toHaveLength(0);
|
|
134
|
+
expect(addedClients).toHaveLength(1);
|
|
135
|
+
expect(addedClients[0].clientName).toBe('google-web');
|
|
135
136
|
});
|
|
136
137
|
|
|
137
138
|
test('missing --client-id', async () => {
|
|
@@ -113,19 +113,20 @@ const webFlags = new Map([
|
|
|
113
113
|
['client-secret', 'secret123'],
|
|
114
114
|
]);
|
|
115
115
|
|
|
116
|
-
// -- --yes: build-up
|
|
116
|
+
// -- --yes: build-up behavior --
|
|
117
117
|
|
|
118
|
-
describe('--yes
|
|
118
|
+
describe('--yes handles missing values', () => {
|
|
119
119
|
test('missing --type', async () => {
|
|
120
120
|
await run(without(webFlags, 'type'), { yes: true });
|
|
121
121
|
expect(logs.join('\n')).toContain('Missing required value for --type');
|
|
122
122
|
expect(addedClients).toHaveLength(0);
|
|
123
123
|
});
|
|
124
124
|
|
|
125
|
-
test('missing --name', async () => {
|
|
125
|
+
test('missing --name uses suggested default', async () => {
|
|
126
126
|
await run(without(webFlags, 'name'), { yes: true });
|
|
127
|
-
expect(
|
|
128
|
-
expect(addedClients).toHaveLength(
|
|
127
|
+
expect(prompts).toHaveLength(0);
|
|
128
|
+
expect(addedClients).toHaveLength(1);
|
|
129
|
+
expect(addedClients[0].clientName).toBe('linkedin');
|
|
129
130
|
});
|
|
130
131
|
|
|
131
132
|
test('missing --client-id', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/client/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AA4C5D,eAAO,MAAM,gBAAgB,gFAO5B,CAAC;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/client/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AA4C5D,eAAO,MAAM,gBAAgB,gFAO5B,CAAC;AAmmBF,eAAO,MAAM,gBAAgB;;;;wgBAwD5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/commands/auth/client/add.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, Match, Option, Schema } from 'effect';\nimport 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 ]);\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"]}
|
|
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"]}
|
package/dist/lib/args.d.ts
CHANGED
|
@@ -35,11 +35,31 @@ type InactiveArg = {
|
|
|
35
35
|
readonly _tag: 'Inactive';
|
|
36
36
|
};
|
|
37
37
|
type ArgState<A, E, R, CanBeInactive extends boolean> = ActiveArg<A, E, R> | (CanBeInactive extends true ? InactiveArg : never);
|
|
38
|
+
/**
|
|
39
|
+
* A parsed CLI arg that can be composed with Args helpers.
|
|
40
|
+
*
|
|
41
|
+
* Commands usually create one with text() or bool(), then finish with
|
|
42
|
+
* required() or optional().
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* const name = yield* Args.text(opts, 'name').pipe(
|
|
46
|
+
* Args.prompt({ prompt: 'Client Name:' }),
|
|
47
|
+
* Args.required(),
|
|
48
|
+
* );
|
|
49
|
+
*/
|
|
38
50
|
export interface Arg<A, E = never, R = never, CanBeInactive extends boolean = false> extends Pipeable {
|
|
39
51
|
readonly flag: string;
|
|
40
52
|
readonly state: Effect.Effect<ArgState<A, E, R, CanBeInactive>, E, R>;
|
|
41
53
|
}
|
|
42
54
|
export type ArgOptions = {
|
|
55
|
+
/**
|
|
56
|
+
* Use when the opts key is not the user-facing flag name.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* Args.text(opts, 'customRedirectUri', {
|
|
60
|
+
* simpleName: '--custom-redirect-uri',
|
|
61
|
+
* })
|
|
62
|
+
*/
|
|
43
63
|
simpleName?: string;
|
|
44
64
|
};
|
|
45
65
|
type MissingOptions = {
|
|
@@ -48,17 +68,141 @@ type MissingOptions = {
|
|
|
48
68
|
type UnavailableOptions = {
|
|
49
69
|
message?: string;
|
|
50
70
|
};
|
|
71
|
+
/**
|
|
72
|
+
* Reads a value directly from opts. Prefer text/bool for values that will be
|
|
73
|
+
* validated or used in an Args pipeline.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* const rawType = Args.raw(opts, 'type');
|
|
77
|
+
*/
|
|
51
78
|
declare function raw(opts: Record<string, unknown>, key: string): unknown;
|
|
79
|
+
/**
|
|
80
|
+
* @example
|
|
81
|
+
* if (Args.has(opts, 'custom-redirect-uri')) {
|
|
82
|
+
* // The user explicitly passed --custom-redirect-uri.
|
|
83
|
+
* }
|
|
84
|
+
*/
|
|
52
85
|
declare function has(opts: Record<string, unknown>, key: string): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* @example
|
|
88
|
+
* const configureWeb = Args.hasAny(opts, [
|
|
89
|
+
* 'team-id',
|
|
90
|
+
* 'key-id',
|
|
91
|
+
* 'private-key-file',
|
|
92
|
+
* ]);
|
|
93
|
+
*/
|
|
53
94
|
declare function hasAny(opts: Record<string, unknown>, keys: string[]): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Returns true only for boolean true or the string "true".
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* const useDevCredentials = Args.isTrue(opts, 'dev-credentials');
|
|
100
|
+
*/
|
|
54
101
|
declare function isTrue(opts: Record<string, unknown>, key: string): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Starts a string arg pipeline. Strings are trimmed, numbers are stringified,
|
|
104
|
+
* empty values become missing values, and other types produce BadArgsError.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* const clientId = yield* Args.text(opts, 'client-id').pipe(
|
|
108
|
+
* Args.prompt(clientIdPrompt({ providerUrl })),
|
|
109
|
+
* Args.required(),
|
|
110
|
+
* );
|
|
111
|
+
*/
|
|
55
112
|
declare function text(opts: Record<string, unknown>, key: string, options?: ArgOptions): Arg<string, BadArgsError>;
|
|
113
|
+
/**
|
|
114
|
+
* Starts a boolean arg pipeline. Accepts booleans and the strings "true" or
|
|
115
|
+
* "false"; other supplied values produce BadArgsError.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* const configureWeb = yield* Args.bool(opts, 'configure-web').pipe(
|
|
119
|
+
* Args.confirm({ promptText: 'Configure web redirect flow?' }),
|
|
120
|
+
* Args.required(),
|
|
121
|
+
* );
|
|
122
|
+
*/
|
|
56
123
|
declare function bool(opts: Record<string, unknown>, key: string, options?: ArgOptions): Arg<boolean, BadArgsError>;
|
|
124
|
+
/**
|
|
125
|
+
* Allows an arg only when a mode or earlier choice makes it valid.
|
|
126
|
+
*
|
|
127
|
+
* When condition is false, a supplied flag fails as incompatible. An omitted
|
|
128
|
+
* flag is ignored, even if the pipeline later calls required(), because that
|
|
129
|
+
* flag does not apply in this mode.
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* const clientSecret = yield* Args.text(opts, 'client-secret').pipe(
|
|
133
|
+
* Args.availableWhen(appType === 'web'),
|
|
134
|
+
* Args.prompt(clientSecretPrompt({ providerUrl })),
|
|
135
|
+
* Args.required(),
|
|
136
|
+
* );
|
|
137
|
+
*/
|
|
57
138
|
declare function availableWhen(condition: boolean, options?: UnavailableOptions): <A, E, R, CanBeInactive extends boolean>(arg: Arg<A, E, R, CanBeInactive>) => Arg<A, BadArgsError | E, R, true>;
|
|
139
|
+
/**
|
|
140
|
+
* Prompts for a missing text value.
|
|
141
|
+
*
|
|
142
|
+
* With --yes, the prompt is skipped. If inputProps.defaultValue is set, that
|
|
143
|
+
* value is used. Otherwise the value stays missing.
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* const clientName = yield* Args.text(opts, 'name').pipe(
|
|
147
|
+
* Args.prompt({
|
|
148
|
+
* prompt: 'Client Name:',
|
|
149
|
+
* defaultValue: suggestedClientName,
|
|
150
|
+
* }),
|
|
151
|
+
* Args.required(),
|
|
152
|
+
* );
|
|
153
|
+
*/
|
|
58
154
|
declare function prompt(inputProps: UI.TextInputProps): <E, R, CanBeInactive extends boolean>(arg: Arg<string, E, R, CanBeInactive>) => Arg<string, E | BadArgsError, R | GlobalOpts, CanBeInactive>;
|
|
155
|
+
/**
|
|
156
|
+
* Prompts for a missing boolean value.
|
|
157
|
+
*
|
|
158
|
+
* With --yes, the prompt is skipped and confirmationProps.defaultValue is used.
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* const configureWeb = yield* Args.bool(opts, 'configure-web').pipe(
|
|
162
|
+
* Args.confirm({
|
|
163
|
+
* promptText: 'Configure web redirect flow?',
|
|
164
|
+
* defaultValue: false,
|
|
165
|
+
* }),
|
|
166
|
+
* Args.required(),
|
|
167
|
+
* );
|
|
168
|
+
*/
|
|
59
169
|
declare function confirm(confirmationProps: UI.ConfirmationProps): <E, R, CanBeInactive extends boolean>(arg: Arg<boolean, E, R, CanBeInactive>) => Arg<boolean, E | BadArgsError, R | GlobalOpts, CanBeInactive>;
|
|
170
|
+
/**
|
|
171
|
+
* Validates a present value. Return an error message to fail, or undefined to
|
|
172
|
+
* accept the value. Missing and inactive args pass through unchanged.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* const projectId = yield* Args.text(opts, 'project-id').pipe(
|
|
176
|
+
* Args.prompt(firebaseProjectIdPrompt({})),
|
|
177
|
+
* Args.validate(validateFirebaseProjectId),
|
|
178
|
+
* Args.required(),
|
|
179
|
+
* );
|
|
180
|
+
*/
|
|
60
181
|
declare function validate<A>(validator: (value: A) => string | undefined): <E, R, CanBeInactive extends boolean>(arg: Arg<A, E, R, CanBeInactive>) => Arg<A, E | BadArgsError, R, CanBeInactive>;
|
|
182
|
+
/**
|
|
183
|
+
* Finishes a pipeline with a required value.
|
|
184
|
+
*
|
|
185
|
+
* Missing active args produce BadArgsError. Inactive args return undefined, so
|
|
186
|
+
* callers can skip downstream work for unavailable flags.
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* const clientId = yield* Args.text(opts, 'client-id').pipe(
|
|
190
|
+
* Args.prompt(clientIdPrompt({ providerUrl })),
|
|
191
|
+
* Args.required(),
|
|
192
|
+
* );
|
|
193
|
+
*/
|
|
61
194
|
declare function required(options?: MissingOptions): <A, E, R, CanBeInactive extends boolean>(arg: Arg<A, E, R, CanBeInactive>) => Effect.Effect<CanBeInactive extends true ? A | undefined : A, E | BadArgsError, R>;
|
|
195
|
+
/**
|
|
196
|
+
* Finishes a pipeline with an optional value.
|
|
197
|
+
*
|
|
198
|
+
* Missing and inactive args return undefined.
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(
|
|
202
|
+
* Args.prompt(optionalRedirectPrompt),
|
|
203
|
+
* Args.optional(),
|
|
204
|
+
* );
|
|
205
|
+
*/
|
|
62
206
|
declare function optional(): <A, E, R, CanBeInactive extends boolean>(arg: Arg<A, E, R, CanBeInactive>) => Effect.Effect<A | undefined, E, R>;
|
|
63
207
|
export declare const Args: {
|
|
64
208
|
text: typeof text;
|
package/dist/lib/args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/lib/args.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/lib/args.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/args.js
CHANGED
|
@@ -40,19 +40,56 @@ const makeArg = (flag, state) => {
|
|
|
40
40
|
const active = (value, provided) => ({ _tag: 'Active', provided, value });
|
|
41
41
|
const inactive = { _tag: 'Inactive' };
|
|
42
42
|
const missingMessage = (flag) => `Missing required value for ${flag}`;
|
|
43
|
+
/**
|
|
44
|
+
* Reads a value directly from opts. Prefer text/bool for values that will be
|
|
45
|
+
* validated or used in an Args pipeline.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* const rawType = Args.raw(opts, 'type');
|
|
49
|
+
*/
|
|
43
50
|
function raw(opts, key) {
|
|
44
51
|
return opts[key];
|
|
45
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* @example
|
|
55
|
+
* if (Args.has(opts, 'custom-redirect-uri')) {
|
|
56
|
+
* // The user explicitly passed --custom-redirect-uri.
|
|
57
|
+
* }
|
|
58
|
+
*/
|
|
46
59
|
function has(opts, key) {
|
|
47
60
|
return Object.prototype.hasOwnProperty.call(opts, key);
|
|
48
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* @example
|
|
64
|
+
* const configureWeb = Args.hasAny(opts, [
|
|
65
|
+
* 'team-id',
|
|
66
|
+
* 'key-id',
|
|
67
|
+
* 'private-key-file',
|
|
68
|
+
* ]);
|
|
69
|
+
*/
|
|
49
70
|
function hasAny(opts, keys) {
|
|
50
71
|
return keys.some((key) => has(opts, key));
|
|
51
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Returns true only for boolean true or the string "true".
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* const useDevCredentials = Args.isTrue(opts, 'dev-credentials');
|
|
78
|
+
*/
|
|
52
79
|
function isTrue(opts, key) {
|
|
53
80
|
const value = raw(opts, key);
|
|
54
81
|
return value === true || value === 'true';
|
|
55
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Starts a string arg pipeline. Strings are trimmed, numbers are stringified,
|
|
85
|
+
* empty values become missing values, and other types produce BadArgsError.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* const clientId = yield* Args.text(opts, 'client-id').pipe(
|
|
89
|
+
* Args.prompt(clientIdPrompt({ providerUrl })),
|
|
90
|
+
* Args.required(),
|
|
91
|
+
* );
|
|
92
|
+
*/
|
|
56
93
|
function text(opts, key, options) {
|
|
57
94
|
const flag = options?.simpleName ?? `--${key}`;
|
|
58
95
|
const provided = Object.prototype.hasOwnProperty.call(opts, key);
|
|
@@ -71,6 +108,16 @@ function readTextValue(value, flag) {
|
|
|
71
108
|
});
|
|
72
109
|
});
|
|
73
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Starts a boolean arg pipeline. Accepts booleans and the strings "true" or
|
|
113
|
+
* "false"; other supplied values produce BadArgsError.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* const configureWeb = yield* Args.bool(opts, 'configure-web').pipe(
|
|
117
|
+
* Args.confirm({ promptText: 'Configure web redirect flow?' }),
|
|
118
|
+
* Args.required(),
|
|
119
|
+
* );
|
|
120
|
+
*/
|
|
74
121
|
function bool(opts, key, options) {
|
|
75
122
|
const flag = options?.simpleName ?? `--${key}`;
|
|
76
123
|
const provided = Object.prototype.hasOwnProperty.call(opts, key);
|
|
@@ -100,6 +147,20 @@ function mapActive(wrapper, mapValue) {
|
|
|
100
147
|
return active(mapValue(state.value), state.provided);
|
|
101
148
|
}));
|
|
102
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Allows an arg only when a mode or earlier choice makes it valid.
|
|
152
|
+
*
|
|
153
|
+
* When condition is false, a supplied flag fails as incompatible. An omitted
|
|
154
|
+
* flag is ignored, even if the pipeline later calls required(), because that
|
|
155
|
+
* flag does not apply in this mode.
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* const clientSecret = yield* Args.text(opts, 'client-secret').pipe(
|
|
159
|
+
* Args.availableWhen(appType === 'web'),
|
|
160
|
+
* Args.prompt(clientSecretPrompt({ providerUrl })),
|
|
161
|
+
* Args.required(),
|
|
162
|
+
* );
|
|
163
|
+
*/
|
|
103
164
|
function availableWhen(condition, options) {
|
|
104
165
|
return function availableWhenArg(arg) {
|
|
105
166
|
return makeArg(arg.flag, Effect.gen(function* gateArgAvailability() {
|
|
@@ -116,6 +177,21 @@ function availableWhen(condition, options) {
|
|
|
116
177
|
}));
|
|
117
178
|
};
|
|
118
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Prompts for a missing text value.
|
|
182
|
+
*
|
|
183
|
+
* With --yes, the prompt is skipped. If inputProps.defaultValue is set, that
|
|
184
|
+
* value is used. Otherwise the value stays missing.
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* const clientName = yield* Args.text(opts, 'name').pipe(
|
|
188
|
+
* Args.prompt({
|
|
189
|
+
* prompt: 'Client Name:',
|
|
190
|
+
* defaultValue: suggestedClientName,
|
|
191
|
+
* }),
|
|
192
|
+
* Args.required(),
|
|
193
|
+
* );
|
|
194
|
+
*/
|
|
119
195
|
function prompt(inputProps) {
|
|
120
196
|
return function promptArg(arg) {
|
|
121
197
|
return mapActive(arg, (valueEffect) => Effect.gen(function* promptWhenMissing() {
|
|
@@ -123,14 +199,30 @@ function prompt(inputProps) {
|
|
|
123
199
|
if (value !== undefined)
|
|
124
200
|
return value;
|
|
125
201
|
const { yes } = yield* GlobalOpts;
|
|
126
|
-
|
|
202
|
+
const result = yes
|
|
203
|
+
? inputProps.defaultValue
|
|
204
|
+
: yield* runUIEffect(new UI.TextInput(inputProps)).pipe(Effect.catchTag('UIError', uiErrorToBadArgs));
|
|
205
|
+
if (result === undefined)
|
|
127
206
|
return undefined;
|
|
128
|
-
const result = yield* runUIEffect(new UI.TextInput(inputProps)).pipe(Effect.catchTag('UIError', uiErrorToBadArgs));
|
|
129
207
|
const trimmed = result.trim();
|
|
130
208
|
return trimmed.length > 0 ? trimmed : undefined;
|
|
131
209
|
}));
|
|
132
210
|
};
|
|
133
211
|
}
|
|
212
|
+
/**
|
|
213
|
+
* Prompts for a missing boolean value.
|
|
214
|
+
*
|
|
215
|
+
* With --yes, the prompt is skipped and confirmationProps.defaultValue is used.
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* const configureWeb = yield* Args.bool(opts, 'configure-web').pipe(
|
|
219
|
+
* Args.confirm({
|
|
220
|
+
* promptText: 'Configure web redirect flow?',
|
|
221
|
+
* defaultValue: false,
|
|
222
|
+
* }),
|
|
223
|
+
* Args.required(),
|
|
224
|
+
* );
|
|
225
|
+
*/
|
|
134
226
|
function confirm(confirmationProps) {
|
|
135
227
|
return function confirmArg(arg) {
|
|
136
228
|
return mapActive(arg, (valueEffect) => Effect.gen(function* confirmWhenMissing() {
|
|
@@ -144,6 +236,17 @@ function confirm(confirmationProps) {
|
|
|
144
236
|
}));
|
|
145
237
|
};
|
|
146
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* Validates a present value. Return an error message to fail, or undefined to
|
|
241
|
+
* accept the value. Missing and inactive args pass through unchanged.
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* const projectId = yield* Args.text(opts, 'project-id').pipe(
|
|
245
|
+
* Args.prompt(firebaseProjectIdPrompt({})),
|
|
246
|
+
* Args.validate(validateFirebaseProjectId),
|
|
247
|
+
* Args.required(),
|
|
248
|
+
* );
|
|
249
|
+
*/
|
|
147
250
|
function validate(validator) {
|
|
148
251
|
return function validateArg(arg) {
|
|
149
252
|
return mapActive(arg, (valueEffect) => Effect.gen(function* validateValue() {
|
|
@@ -157,6 +260,18 @@ function validate(validator) {
|
|
|
157
260
|
}));
|
|
158
261
|
};
|
|
159
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* Finishes a pipeline with a required value.
|
|
265
|
+
*
|
|
266
|
+
* Missing active args produce BadArgsError. Inactive args return undefined, so
|
|
267
|
+
* callers can skip downstream work for unavailable flags.
|
|
268
|
+
*
|
|
269
|
+
* @example
|
|
270
|
+
* const clientId = yield* Args.text(opts, 'client-id').pipe(
|
|
271
|
+
* Args.prompt(clientIdPrompt({ providerUrl })),
|
|
272
|
+
* Args.required(),
|
|
273
|
+
* );
|
|
274
|
+
*/
|
|
160
275
|
function required(options) {
|
|
161
276
|
return function requiredArg(arg) {
|
|
162
277
|
return Effect.gen(function* requireValue() {
|
|
@@ -172,6 +287,17 @@ function required(options) {
|
|
|
172
287
|
});
|
|
173
288
|
};
|
|
174
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* Finishes a pipeline with an optional value.
|
|
292
|
+
*
|
|
293
|
+
* Missing and inactive args return undefined.
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(
|
|
297
|
+
* Args.prompt(optionalRedirectPrompt),
|
|
298
|
+
* Args.optional(),
|
|
299
|
+
* );
|
|
300
|
+
*/
|
|
175
301
|
function optional() {
|
|
176
302
|
return function optionalArg(arg) {
|
|
177
303
|
return Effect.gen(function* optionalValue() {
|
package/dist/lib/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/lib/args.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Args lets commands read CLI flags as a small pipeline:\n *\n * 1. Parse a value from opts\n * 2. Gate it: when is this flag available?\n * 3. Prompt for a missing value, when interactive\n * 4. Validate and finish as required or optional\n *\n * This keeps the \"can this flag be used here?\" logic next to the value it\n * controls. For example, a Google client secret is only meaningful when using\n * custom web credentials:\n *\n * const clientSecret = yield* Args.text(opts, 'client-secret').pipe(\n * Args.availableWhen(usesCustomWebCredentials),\n * Args.prompt(clientSecretPrompt({ providerUrl })),\n * Args.required(),\n * );\n *\n * The key argument to text/bool/has is the exact opts lookup key. If the\n * user-facing flag name differs, pass simpleName for errors:\n *\n * Args.text(opts, 'customRedirectUri', { simpleName: '--custom-redirect-uri' })\n */\nimport { Effect } from 'effect';\nimport { pipeArguments, type Pipeable } from 'effect/Pipeable';\nimport { BadArgsError } from '../errors.ts';\nimport { GlobalOpts } from '../context/globalOpts.ts';\nimport { UI } from '../ui/index.ts';\nimport { runUIEffect } from './ui.ts';\n\ntype ActiveArg<A, E, R> = {\n readonly _tag: 'Active';\n readonly provided: boolean;\n readonly value: Effect.Effect<A | undefined, E, R>;\n};\n\ntype InactiveArg = {\n readonly _tag: 'Inactive';\n};\n\ntype ArgState<A, E, R, CanBeInactive extends boolean> =\n | ActiveArg<A, E, R>\n | (CanBeInactive extends true ? InactiveArg : never);\n\nexport interface Arg<\n A,\n E = never,\n R = never,\n CanBeInactive extends boolean = false,\n> extends Pipeable {\n readonly flag: string;\n readonly state: Effect.Effect<ArgState<A, E, R, CanBeInactive>, E, R>;\n}\n\nexport type ArgOptions = {\n simpleName?: string;\n};\n\nconst makeArg = <A, E, R, CanBeInactive extends boolean>(\n flag: string,\n state: Effect.Effect<ArgState<A, E, R, CanBeInactive>, E, R>,\n): Arg<A, E, R, CanBeInactive> => {\n const arg: Arg<A, E, R, CanBeInactive> = {\n flag,\n state,\n pipe() {\n return pipeArguments(this, arguments);\n },\n };\n return arg;\n};\n\nconst active = <A, E, R>(\n value: Effect.Effect<A | undefined, E, R>,\n provided: boolean,\n): ActiveArg<A, E, R> => ({ _tag: 'Active', provided, value });\n\nconst inactive: InactiveArg = { _tag: 'Inactive' };\n\nconst missingMessage = (flag: string) => `Missing required value for ${flag}`;\n\ntype MissingOptions = {\n message?: string;\n};\n\ntype UnavailableOptions = {\n message?: string;\n};\n\nfunction raw(opts: Record<string, unknown>, key: string) {\n return opts[key];\n}\n\nfunction has(opts: Record<string, unknown>, key: string) {\n return Object.prototype.hasOwnProperty.call(opts, key);\n}\n\nfunction hasAny(opts: Record<string, unknown>, keys: string[]) {\n return keys.some((key) => has(opts, key));\n}\n\nfunction isTrue(opts: Record<string, unknown>, key: string) {\n const value = raw(opts, key);\n return value === true || value === 'true';\n}\n\nfunction text(\n opts: Record<string, unknown>,\n key: string,\n options?: ArgOptions,\n): Arg<string, BadArgsError> {\n const flag = options?.simpleName ?? `--${key}`;\n const provided = Object.prototype.hasOwnProperty.call(opts, key);\n\n return makeArg(\n flag,\n Effect.succeed(active(readTextValue(opts[key], flag), provided)),\n );\n}\n\nfunction readTextValue(value: unknown, flag: string) {\n return Effect.gen(function* readTextValue() {\n if (value === undefined || value === null) return undefined;\n\n if (typeof value === 'string' || typeof value === 'number') {\n const trimmed = String(value).trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n return yield* BadArgsError.make({\n message: `Invalid value for ${flag}`,\n });\n });\n}\n\nfunction bool(\n opts: Record<string, unknown>,\n key: string,\n options?: ArgOptions,\n): Arg<boolean, BadArgsError> {\n const flag = options?.simpleName ?? `--${key}`;\n const provided = Object.prototype.hasOwnProperty.call(opts, key);\n\n return makeArg(\n flag,\n Effect.succeed(active(readBooleanValue(opts[key], flag), provided)),\n );\n}\n\nfunction readBooleanValue(value: unknown, flag: string) {\n return Effect.gen(function* readBooleanValue() {\n if (value === undefined || value === null) return undefined;\n if (value === true || value === 'true') return true;\n if (value === false || value === 'false') return false;\n\n return yield* BadArgsError.make({\n message: `Invalid value for ${flag}`,\n });\n });\n}\n\nfunction uiErrorToBadArgs(e: { message: string }) {\n return BadArgsError.make({ message: `UI error: ${e.message}` });\n}\n\nfunction mapActive<A, B, E, R, E2, R2, CanBeInactive extends boolean>(\n wrapper: Arg<A, E, R, CanBeInactive>,\n mapValue: (\n value: Effect.Effect<A | undefined, E, R>,\n ) => Effect.Effect<B | undefined, E | E2, R | R2>,\n): Arg<B, E | E2, R | R2, CanBeInactive> {\n return makeArg(\n wrapper.flag,\n Effect.gen(function* mapArgState() {\n const state = yield* wrapper.state;\n if (state._tag === 'Inactive') return inactive;\n return active(mapValue(state.value), state.provided);\n }) as Effect.Effect<\n ArgState<B, E | E2, R | R2, CanBeInactive>,\n E | E2,\n R | R2\n >,\n );\n}\n\nfunction availableWhen(condition: boolean, options?: UnavailableOptions) {\n return function availableWhenArg<A, E, R, CanBeInactive extends boolean>(\n arg: Arg<A, E, R, CanBeInactive>,\n ) {\n return makeArg<A, E | BadArgsError, R, true>(\n arg.flag,\n Effect.gen(function* gateArgAvailability() {\n const state = yield* arg.state;\n if (condition || state._tag === 'Inactive') return state;\n if (state.provided) {\n return yield* BadArgsError.make({\n message:\n options?.message ??\n `${arg.flag} is not compatible with other options`,\n });\n }\n return inactive;\n }),\n );\n };\n}\n\nfunction prompt(inputProps: UI.TextInputProps) {\n return function promptArg<E, R, CanBeInactive extends boolean>(\n arg: Arg<string, E, R, CanBeInactive>,\n ): Arg<string, E | BadArgsError, R | GlobalOpts, CanBeInactive> {\n return mapActive(arg, (valueEffect) =>\n Effect.gen(function* promptWhenMissing() {\n const value = yield* valueEffect;\n if (value !== undefined) return value;\n\n const { yes } = yield* GlobalOpts;\n if (yes) return undefined;\n\n const result = yield* runUIEffect(new UI.TextInput(inputProps)).pipe(\n Effect.catchTag('UIError', uiErrorToBadArgs),\n );\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }),\n );\n };\n}\n\nfunction confirm(confirmationProps: UI.ConfirmationProps) {\n return function confirmArg<E, R, CanBeInactive extends boolean>(\n arg: Arg<boolean, E, R, CanBeInactive>,\n ): Arg<boolean, E | BadArgsError, R | GlobalOpts, CanBeInactive> {\n return mapActive(arg, (valueEffect) =>\n Effect.gen(function* confirmWhenMissing() {\n const value = yield* valueEffect;\n if (value !== undefined) return value;\n\n const { yes } = yield* GlobalOpts;\n if (yes) return confirmationProps.defaultValue;\n\n return yield* runUIEffect(new UI.Confirmation(confirmationProps)).pipe(\n Effect.catchTag('UIError', uiErrorToBadArgs),\n );\n }),\n );\n };\n}\n\nfunction validate<A>(validator: (value: A) => string | undefined) {\n return function validateArg<E, R, CanBeInactive extends boolean>(\n arg: Arg<A, E, R, CanBeInactive>,\n ): Arg<A, E | BadArgsError, R, CanBeInactive> {\n return mapActive(arg, (valueEffect) =>\n Effect.gen(function* validateValue() {\n const value = yield* valueEffect;\n if (value === undefined) return undefined;\n\n const message = validator(value);\n if (!message) return value;\n\n return yield* BadArgsError.make({ message });\n }),\n );\n };\n}\n\nfunction required(options?: MissingOptions) {\n return function requiredArg<A, E, R, CanBeInactive extends boolean>(\n arg: Arg<A, E, R, CanBeInactive>,\n ): Effect.Effect<\n CanBeInactive extends true ? A | undefined : A,\n E | BadArgsError,\n R\n > {\n return Effect.gen(function* requireValue() {\n const state = yield* arg.state;\n if (state._tag === 'Inactive') return undefined;\n\n const value = yield* state.value;\n if (value !== undefined) return value;\n\n return yield* BadArgsError.make({\n message: options?.message ?? missingMessage(arg.flag),\n });\n }) as Effect.Effect<\n CanBeInactive extends true ? A | undefined : A,\n E | BadArgsError,\n R\n >;\n };\n}\n\nfunction optional() {\n return function optionalArg<A, E, R, CanBeInactive extends boolean>(\n arg: Arg<A, E, R, CanBeInactive>,\n ) {\n return Effect.gen(function* optionalValue() {\n const state = yield* arg.state;\n if (state._tag === 'Inactive') return undefined;\n\n return yield* state.value;\n });\n };\n}\n\nexport const Args = {\n text,\n bool,\n has,\n hasAny,\n isTrue,\n raw,\n availableWhen,\n prompt,\n confirm,\n validate,\n required,\n optional,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/lib/args.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Args lets commands read CLI flags as a small pipeline:\n *\n * 1. Parse a value from opts\n * 2. Gate it: when is this flag available?\n * 3. Prompt for a missing value, when interactive\n * 4. Validate and finish as required or optional\n *\n * This keeps the \"can this flag be used here?\" logic next to the value it\n * controls. For example, a Google client secret is only meaningful when using\n * custom web credentials:\n *\n * const clientSecret = yield* Args.text(opts, 'client-secret').pipe(\n * Args.availableWhen(usesCustomWebCredentials),\n * Args.prompt(clientSecretPrompt({ providerUrl })),\n * Args.required(),\n * );\n *\n * The key argument to text/bool/has is the exact opts lookup key. If the\n * user-facing flag name differs, pass simpleName for errors:\n *\n * Args.text(opts, 'customRedirectUri', { simpleName: '--custom-redirect-uri' })\n */\nimport { Effect } from 'effect';\nimport { pipeArguments, type Pipeable } from 'effect/Pipeable';\nimport { BadArgsError } from '../errors.ts';\nimport { GlobalOpts } from '../context/globalOpts.ts';\nimport { UI } from '../ui/index.ts';\nimport { runUIEffect } from './ui.ts';\n\ntype ActiveArg<A, E, R> = {\n readonly _tag: 'Active';\n readonly provided: boolean;\n readonly value: Effect.Effect<A | undefined, E, R>;\n};\n\ntype InactiveArg = {\n readonly _tag: 'Inactive';\n};\n\ntype ArgState<A, E, R, CanBeInactive extends boolean> =\n | ActiveArg<A, E, R>\n | (CanBeInactive extends true ? InactiveArg : never);\n\n/**\n * A parsed CLI arg that can be composed with Args helpers.\n *\n * Commands usually create one with text() or bool(), then finish with\n * required() or optional().\n *\n * @example\n * const name = yield* Args.text(opts, 'name').pipe(\n * Args.prompt({ prompt: 'Client Name:' }),\n * Args.required(),\n * );\n */\nexport interface Arg<\n A,\n E = never,\n R = never,\n CanBeInactive extends boolean = false,\n> extends Pipeable {\n readonly flag: string;\n readonly state: Effect.Effect<ArgState<A, E, R, CanBeInactive>, E, R>;\n}\n\nexport type ArgOptions = {\n /**\n * Use when the opts key is not the user-facing flag name.\n *\n * @example\n * Args.text(opts, 'customRedirectUri', {\n * simpleName: '--custom-redirect-uri',\n * })\n */\n simpleName?: string;\n};\n\nconst makeArg = <A, E, R, CanBeInactive extends boolean>(\n flag: string,\n state: Effect.Effect<ArgState<A, E, R, CanBeInactive>, E, R>,\n): Arg<A, E, R, CanBeInactive> => {\n const arg: Arg<A, E, R, CanBeInactive> = {\n flag,\n state,\n pipe() {\n return pipeArguments(this, arguments);\n },\n };\n return arg;\n};\n\nconst active = <A, E, R>(\n value: Effect.Effect<A | undefined, E, R>,\n provided: boolean,\n): ActiveArg<A, E, R> => ({ _tag: 'Active', provided, value });\n\nconst inactive: InactiveArg = { _tag: 'Inactive' };\n\nconst missingMessage = (flag: string) => `Missing required value for ${flag}`;\n\ntype MissingOptions = {\n message?: string;\n};\n\ntype UnavailableOptions = {\n message?: string;\n};\n\n/**\n * Reads a value directly from opts. Prefer text/bool for values that will be\n * validated or used in an Args pipeline.\n *\n * @example\n * const rawType = Args.raw(opts, 'type');\n */\nfunction raw(opts: Record<string, unknown>, key: string) {\n return opts[key];\n}\n\n/**\n * @example\n * if (Args.has(opts, 'custom-redirect-uri')) {\n * // The user explicitly passed --custom-redirect-uri.\n * }\n */\nfunction has(opts: Record<string, unknown>, key: string) {\n return Object.prototype.hasOwnProperty.call(opts, key);\n}\n\n/**\n * @example\n * const configureWeb = Args.hasAny(opts, [\n * 'team-id',\n * 'key-id',\n * 'private-key-file',\n * ]);\n */\nfunction hasAny(opts: Record<string, unknown>, keys: string[]) {\n return keys.some((key) => has(opts, key));\n}\n\n/**\n * Returns true only for boolean true or the string \"true\".\n *\n * @example\n * const useDevCredentials = Args.isTrue(opts, 'dev-credentials');\n */\nfunction isTrue(opts: Record<string, unknown>, key: string) {\n const value = raw(opts, key);\n return value === true || value === 'true';\n}\n\n/**\n * Starts a string arg pipeline. Strings are trimmed, numbers are stringified,\n * empty values become missing values, and other types produce BadArgsError.\n *\n * @example\n * const clientId = yield* Args.text(opts, 'client-id').pipe(\n * Args.prompt(clientIdPrompt({ providerUrl })),\n * Args.required(),\n * );\n */\nfunction text(\n opts: Record<string, unknown>,\n key: string,\n options?: ArgOptions,\n): Arg<string, BadArgsError> {\n const flag = options?.simpleName ?? `--${key}`;\n const provided = Object.prototype.hasOwnProperty.call(opts, key);\n\n return makeArg(\n flag,\n Effect.succeed(active(readTextValue(opts[key], flag), provided)),\n );\n}\n\nfunction readTextValue(value: unknown, flag: string) {\n return Effect.gen(function* readTextValue() {\n if (value === undefined || value === null) return undefined;\n\n if (typeof value === 'string' || typeof value === 'number') {\n const trimmed = String(value).trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n return yield* BadArgsError.make({\n message: `Invalid value for ${flag}`,\n });\n });\n}\n\n/**\n * Starts a boolean arg pipeline. Accepts booleans and the strings \"true\" or\n * \"false\"; other supplied values produce BadArgsError.\n *\n * @example\n * const configureWeb = yield* Args.bool(opts, 'configure-web').pipe(\n * Args.confirm({ promptText: 'Configure web redirect flow?' }),\n * Args.required(),\n * );\n */\nfunction bool(\n opts: Record<string, unknown>,\n key: string,\n options?: ArgOptions,\n): Arg<boolean, BadArgsError> {\n const flag = options?.simpleName ?? `--${key}`;\n const provided = Object.prototype.hasOwnProperty.call(opts, key);\n\n return makeArg(\n flag,\n Effect.succeed(active(readBooleanValue(opts[key], flag), provided)),\n );\n}\n\nfunction readBooleanValue(value: unknown, flag: string) {\n return Effect.gen(function* readBooleanValue() {\n if (value === undefined || value === null) return undefined;\n if (value === true || value === 'true') return true;\n if (value === false || value === 'false') return false;\n\n return yield* BadArgsError.make({\n message: `Invalid value for ${flag}`,\n });\n });\n}\n\nfunction uiErrorToBadArgs(e: { message: string }) {\n return BadArgsError.make({ message: `UI error: ${e.message}` });\n}\n\nfunction mapActive<A, B, E, R, E2, R2, CanBeInactive extends boolean>(\n wrapper: Arg<A, E, R, CanBeInactive>,\n mapValue: (\n value: Effect.Effect<A | undefined, E, R>,\n ) => Effect.Effect<B | undefined, E | E2, R | R2>,\n): Arg<B, E | E2, R | R2, CanBeInactive> {\n return makeArg(\n wrapper.flag,\n Effect.gen(function* mapArgState() {\n const state = yield* wrapper.state;\n if (state._tag === 'Inactive') return inactive;\n return active(mapValue(state.value), state.provided);\n }) as Effect.Effect<\n ArgState<B, E | E2, R | R2, CanBeInactive>,\n E | E2,\n R | R2\n >,\n );\n}\n\n/**\n * Allows an arg only when a mode or earlier choice makes it valid.\n *\n * When condition is false, a supplied flag fails as incompatible. An omitted\n * flag is ignored, even if the pipeline later calls required(), because that\n * flag does not apply in this mode.\n *\n * @example\n * const clientSecret = yield* Args.text(opts, 'client-secret').pipe(\n * Args.availableWhen(appType === 'web'),\n * Args.prompt(clientSecretPrompt({ providerUrl })),\n * Args.required(),\n * );\n */\nfunction availableWhen(condition: boolean, options?: UnavailableOptions) {\n return function availableWhenArg<A, E, R, CanBeInactive extends boolean>(\n arg: Arg<A, E, R, CanBeInactive>,\n ) {\n return makeArg<A, E | BadArgsError, R, true>(\n arg.flag,\n Effect.gen(function* gateArgAvailability() {\n const state = yield* arg.state;\n if (condition || state._tag === 'Inactive') return state;\n if (state.provided) {\n return yield* BadArgsError.make({\n message:\n options?.message ??\n `${arg.flag} is not compatible with other options`,\n });\n }\n return inactive;\n }),\n );\n };\n}\n\n/**\n * Prompts for a missing text value.\n *\n * With --yes, the prompt is skipped. If inputProps.defaultValue is set, that\n * value is used. Otherwise the value stays missing.\n *\n * @example\n * const clientName = yield* Args.text(opts, 'name').pipe(\n * Args.prompt({\n * prompt: 'Client Name:',\n * defaultValue: suggestedClientName,\n * }),\n * Args.required(),\n * );\n */\nfunction prompt(inputProps: UI.TextInputProps) {\n return function promptArg<E, R, CanBeInactive extends boolean>(\n arg: Arg<string, E, R, CanBeInactive>,\n ): Arg<string, E | BadArgsError, R | GlobalOpts, CanBeInactive> {\n return mapActive(arg, (valueEffect) =>\n Effect.gen(function* promptWhenMissing() {\n const value = yield* valueEffect;\n if (value !== undefined) return value;\n\n const { yes } = yield* GlobalOpts;\n const result = yes\n ? inputProps.defaultValue\n : yield* runUIEffect(new UI.TextInput(inputProps)).pipe(\n Effect.catchTag('UIError', uiErrorToBadArgs),\n );\n if (result === undefined) return undefined;\n\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }),\n );\n };\n}\n\n/**\n * Prompts for a missing boolean value.\n *\n * With --yes, the prompt is skipped and confirmationProps.defaultValue is used.\n *\n * @example\n * const configureWeb = yield* Args.bool(opts, 'configure-web').pipe(\n * Args.confirm({\n * promptText: 'Configure web redirect flow?',\n * defaultValue: false,\n * }),\n * Args.required(),\n * );\n */\nfunction confirm(confirmationProps: UI.ConfirmationProps) {\n return function confirmArg<E, R, CanBeInactive extends boolean>(\n arg: Arg<boolean, E, R, CanBeInactive>,\n ): Arg<boolean, E | BadArgsError, R | GlobalOpts, CanBeInactive> {\n return mapActive(arg, (valueEffect) =>\n Effect.gen(function* confirmWhenMissing() {\n const value = yield* valueEffect;\n if (value !== undefined) return value;\n\n const { yes } = yield* GlobalOpts;\n if (yes) return confirmationProps.defaultValue;\n\n return yield* runUIEffect(new UI.Confirmation(confirmationProps)).pipe(\n Effect.catchTag('UIError', uiErrorToBadArgs),\n );\n }),\n );\n };\n}\n\n/**\n * Validates a present value. Return an error message to fail, or undefined to\n * accept the value. Missing and inactive args pass through unchanged.\n *\n * @example\n * const projectId = yield* Args.text(opts, 'project-id').pipe(\n * Args.prompt(firebaseProjectIdPrompt({})),\n * Args.validate(validateFirebaseProjectId),\n * Args.required(),\n * );\n */\nfunction validate<A>(validator: (value: A) => string | undefined) {\n return function validateArg<E, R, CanBeInactive extends boolean>(\n arg: Arg<A, E, R, CanBeInactive>,\n ): Arg<A, E | BadArgsError, R, CanBeInactive> {\n return mapActive(arg, (valueEffect) =>\n Effect.gen(function* validateValue() {\n const value = yield* valueEffect;\n if (value === undefined) return undefined;\n\n const message = validator(value);\n if (!message) return value;\n\n return yield* BadArgsError.make({ message });\n }),\n );\n };\n}\n\n/**\n * Finishes a pipeline with a required value.\n *\n * Missing active args produce BadArgsError. Inactive args return undefined, so\n * callers can skip downstream work for unavailable flags.\n *\n * @example\n * const clientId = yield* Args.text(opts, 'client-id').pipe(\n * Args.prompt(clientIdPrompt({ providerUrl })),\n * Args.required(),\n * );\n */\nfunction required(options?: MissingOptions) {\n return function requiredArg<A, E, R, CanBeInactive extends boolean>(\n arg: Arg<A, E, R, CanBeInactive>,\n ): Effect.Effect<\n CanBeInactive extends true ? A | undefined : A,\n E | BadArgsError,\n R\n > {\n return Effect.gen(function* requireValue() {\n const state = yield* arg.state;\n if (state._tag === 'Inactive') return undefined;\n\n const value = yield* state.value;\n if (value !== undefined) return value;\n\n return yield* BadArgsError.make({\n message: options?.message ?? missingMessage(arg.flag),\n });\n }) as Effect.Effect<\n CanBeInactive extends true ? A | undefined : A,\n E | BadArgsError,\n R\n >;\n };\n}\n\n/**\n * Finishes a pipeline with an optional value.\n *\n * Missing and inactive args return undefined.\n *\n * @example\n * const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(\n * Args.prompt(optionalRedirectPrompt),\n * Args.optional(),\n * );\n */\nfunction optional() {\n return function optionalArg<A, E, R, CanBeInactive extends boolean>(\n arg: Arg<A, E, R, CanBeInactive>,\n ) {\n return Effect.gen(function* optionalValue() {\n const state = yield* arg.state;\n if (state._tag === 'Inactive') return undefined;\n\n return yield* state.value;\n });\n };\n}\n\nexport const Args = {\n text,\n bool,\n has,\n hasAny,\n isTrue,\n raw,\n availableWhen,\n prompt,\n confirm,\n validate,\n required,\n optional,\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "instant-cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.23-branch-codex-cli-args-combinators.
|
|
4
|
+
"version": "1.0.23-branch-codex-cli-args-combinators.25405731325.1",
|
|
5
5
|
"description": "Instant's CLI",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"homepage": "https://github.com/instantdb/instant/tree/main/client/packages/cli",
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
"strip-ansi": "^7.1.2",
|
|
51
51
|
"supports-hyperlinks": "^4.4.0",
|
|
52
52
|
"unconfig": "^7.5.0",
|
|
53
|
-
"@instantdb/core": "1.0.23-branch-codex-cli-args-combinators.
|
|
54
|
-
"@instantdb/platform": "1.0.23-branch-codex-cli-args-combinators.
|
|
55
|
-
"@instantdb/version": "1.0.23-branch-codex-cli-args-combinators.
|
|
53
|
+
"@instantdb/core": "1.0.23-branch-codex-cli-args-combinators.25405731325.1",
|
|
54
|
+
"@instantdb/platform": "1.0.23-branch-codex-cli-args-combinators.25405731325.1",
|
|
55
|
+
"@instantdb/version": "1.0.23-branch-codex-cli-args-combinators.25405731325.1"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@babel/core": "^7.17.9",
|
package/src/lib/args.ts
CHANGED
|
@@ -42,6 +42,18 @@ type ArgState<A, E, R, CanBeInactive extends boolean> =
|
|
|
42
42
|
| ActiveArg<A, E, R>
|
|
43
43
|
| (CanBeInactive extends true ? InactiveArg : never);
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* A parsed CLI arg that can be composed with Args helpers.
|
|
47
|
+
*
|
|
48
|
+
* Commands usually create one with text() or bool(), then finish with
|
|
49
|
+
* required() or optional().
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* const name = yield* Args.text(opts, 'name').pipe(
|
|
53
|
+
* Args.prompt({ prompt: 'Client Name:' }),
|
|
54
|
+
* Args.required(),
|
|
55
|
+
* );
|
|
56
|
+
*/
|
|
45
57
|
export interface Arg<
|
|
46
58
|
A,
|
|
47
59
|
E = never,
|
|
@@ -53,6 +65,14 @@ export interface Arg<
|
|
|
53
65
|
}
|
|
54
66
|
|
|
55
67
|
export type ArgOptions = {
|
|
68
|
+
/**
|
|
69
|
+
* Use when the opts key is not the user-facing flag name.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* Args.text(opts, 'customRedirectUri', {
|
|
73
|
+
* simpleName: '--custom-redirect-uri',
|
|
74
|
+
* })
|
|
75
|
+
*/
|
|
56
76
|
simpleName?: string;
|
|
57
77
|
};
|
|
58
78
|
|
|
@@ -87,23 +107,60 @@ type UnavailableOptions = {
|
|
|
87
107
|
message?: string;
|
|
88
108
|
};
|
|
89
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Reads a value directly from opts. Prefer text/bool for values that will be
|
|
112
|
+
* validated or used in an Args pipeline.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* const rawType = Args.raw(opts, 'type');
|
|
116
|
+
*/
|
|
90
117
|
function raw(opts: Record<string, unknown>, key: string) {
|
|
91
118
|
return opts[key];
|
|
92
119
|
}
|
|
93
120
|
|
|
121
|
+
/**
|
|
122
|
+
* @example
|
|
123
|
+
* if (Args.has(opts, 'custom-redirect-uri')) {
|
|
124
|
+
* // The user explicitly passed --custom-redirect-uri.
|
|
125
|
+
* }
|
|
126
|
+
*/
|
|
94
127
|
function has(opts: Record<string, unknown>, key: string) {
|
|
95
128
|
return Object.prototype.hasOwnProperty.call(opts, key);
|
|
96
129
|
}
|
|
97
130
|
|
|
131
|
+
/**
|
|
132
|
+
* @example
|
|
133
|
+
* const configureWeb = Args.hasAny(opts, [
|
|
134
|
+
* 'team-id',
|
|
135
|
+
* 'key-id',
|
|
136
|
+
* 'private-key-file',
|
|
137
|
+
* ]);
|
|
138
|
+
*/
|
|
98
139
|
function hasAny(opts: Record<string, unknown>, keys: string[]) {
|
|
99
140
|
return keys.some((key) => has(opts, key));
|
|
100
141
|
}
|
|
101
142
|
|
|
143
|
+
/**
|
|
144
|
+
* Returns true only for boolean true or the string "true".
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* const useDevCredentials = Args.isTrue(opts, 'dev-credentials');
|
|
148
|
+
*/
|
|
102
149
|
function isTrue(opts: Record<string, unknown>, key: string) {
|
|
103
150
|
const value = raw(opts, key);
|
|
104
151
|
return value === true || value === 'true';
|
|
105
152
|
}
|
|
106
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Starts a string arg pipeline. Strings are trimmed, numbers are stringified,
|
|
156
|
+
* empty values become missing values, and other types produce BadArgsError.
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* const clientId = yield* Args.text(opts, 'client-id').pipe(
|
|
160
|
+
* Args.prompt(clientIdPrompt({ providerUrl })),
|
|
161
|
+
* Args.required(),
|
|
162
|
+
* );
|
|
163
|
+
*/
|
|
107
164
|
function text(
|
|
108
165
|
opts: Record<string, unknown>,
|
|
109
166
|
key: string,
|
|
@@ -133,6 +190,16 @@ function readTextValue(value: unknown, flag: string) {
|
|
|
133
190
|
});
|
|
134
191
|
}
|
|
135
192
|
|
|
193
|
+
/**
|
|
194
|
+
* Starts a boolean arg pipeline. Accepts booleans and the strings "true" or
|
|
195
|
+
* "false"; other supplied values produce BadArgsError.
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* const configureWeb = yield* Args.bool(opts, 'configure-web').pipe(
|
|
199
|
+
* Args.confirm({ promptText: 'Configure web redirect flow?' }),
|
|
200
|
+
* Args.required(),
|
|
201
|
+
* );
|
|
202
|
+
*/
|
|
136
203
|
function bool(
|
|
137
204
|
opts: Record<string, unknown>,
|
|
138
205
|
key: string,
|
|
@@ -183,6 +250,20 @@ function mapActive<A, B, E, R, E2, R2, CanBeInactive extends boolean>(
|
|
|
183
250
|
);
|
|
184
251
|
}
|
|
185
252
|
|
|
253
|
+
/**
|
|
254
|
+
* Allows an arg only when a mode or earlier choice makes it valid.
|
|
255
|
+
*
|
|
256
|
+
* When condition is false, a supplied flag fails as incompatible. An omitted
|
|
257
|
+
* flag is ignored, even if the pipeline later calls required(), because that
|
|
258
|
+
* flag does not apply in this mode.
|
|
259
|
+
*
|
|
260
|
+
* @example
|
|
261
|
+
* const clientSecret = yield* Args.text(opts, 'client-secret').pipe(
|
|
262
|
+
* Args.availableWhen(appType === 'web'),
|
|
263
|
+
* Args.prompt(clientSecretPrompt({ providerUrl })),
|
|
264
|
+
* Args.required(),
|
|
265
|
+
* );
|
|
266
|
+
*/
|
|
186
267
|
function availableWhen(condition: boolean, options?: UnavailableOptions) {
|
|
187
268
|
return function availableWhenArg<A, E, R, CanBeInactive extends boolean>(
|
|
188
269
|
arg: Arg<A, E, R, CanBeInactive>,
|
|
@@ -205,6 +286,21 @@ function availableWhen(condition: boolean, options?: UnavailableOptions) {
|
|
|
205
286
|
};
|
|
206
287
|
}
|
|
207
288
|
|
|
289
|
+
/**
|
|
290
|
+
* Prompts for a missing text value.
|
|
291
|
+
*
|
|
292
|
+
* With --yes, the prompt is skipped. If inputProps.defaultValue is set, that
|
|
293
|
+
* value is used. Otherwise the value stays missing.
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* const clientName = yield* Args.text(opts, 'name').pipe(
|
|
297
|
+
* Args.prompt({
|
|
298
|
+
* prompt: 'Client Name:',
|
|
299
|
+
* defaultValue: suggestedClientName,
|
|
300
|
+
* }),
|
|
301
|
+
* Args.required(),
|
|
302
|
+
* );
|
|
303
|
+
*/
|
|
208
304
|
function prompt(inputProps: UI.TextInputProps) {
|
|
209
305
|
return function promptArg<E, R, CanBeInactive extends boolean>(
|
|
210
306
|
arg: Arg<string, E, R, CanBeInactive>,
|
|
@@ -215,11 +311,13 @@ function prompt(inputProps: UI.TextInputProps) {
|
|
|
215
311
|
if (value !== undefined) return value;
|
|
216
312
|
|
|
217
313
|
const { yes } = yield* GlobalOpts;
|
|
218
|
-
|
|
314
|
+
const result = yes
|
|
315
|
+
? inputProps.defaultValue
|
|
316
|
+
: yield* runUIEffect(new UI.TextInput(inputProps)).pipe(
|
|
317
|
+
Effect.catchTag('UIError', uiErrorToBadArgs),
|
|
318
|
+
);
|
|
319
|
+
if (result === undefined) return undefined;
|
|
219
320
|
|
|
220
|
-
const result = yield* runUIEffect(new UI.TextInput(inputProps)).pipe(
|
|
221
|
-
Effect.catchTag('UIError', uiErrorToBadArgs),
|
|
222
|
-
);
|
|
223
321
|
const trimmed = result.trim();
|
|
224
322
|
return trimmed.length > 0 ? trimmed : undefined;
|
|
225
323
|
}),
|
|
@@ -227,6 +325,20 @@ function prompt(inputProps: UI.TextInputProps) {
|
|
|
227
325
|
};
|
|
228
326
|
}
|
|
229
327
|
|
|
328
|
+
/**
|
|
329
|
+
* Prompts for a missing boolean value.
|
|
330
|
+
*
|
|
331
|
+
* With --yes, the prompt is skipped and confirmationProps.defaultValue is used.
|
|
332
|
+
*
|
|
333
|
+
* @example
|
|
334
|
+
* const configureWeb = yield* Args.bool(opts, 'configure-web').pipe(
|
|
335
|
+
* Args.confirm({
|
|
336
|
+
* promptText: 'Configure web redirect flow?',
|
|
337
|
+
* defaultValue: false,
|
|
338
|
+
* }),
|
|
339
|
+
* Args.required(),
|
|
340
|
+
* );
|
|
341
|
+
*/
|
|
230
342
|
function confirm(confirmationProps: UI.ConfirmationProps) {
|
|
231
343
|
return function confirmArg<E, R, CanBeInactive extends boolean>(
|
|
232
344
|
arg: Arg<boolean, E, R, CanBeInactive>,
|
|
@@ -247,6 +359,17 @@ function confirm(confirmationProps: UI.ConfirmationProps) {
|
|
|
247
359
|
};
|
|
248
360
|
}
|
|
249
361
|
|
|
362
|
+
/**
|
|
363
|
+
* Validates a present value. Return an error message to fail, or undefined to
|
|
364
|
+
* accept the value. Missing and inactive args pass through unchanged.
|
|
365
|
+
*
|
|
366
|
+
* @example
|
|
367
|
+
* const projectId = yield* Args.text(opts, 'project-id').pipe(
|
|
368
|
+
* Args.prompt(firebaseProjectIdPrompt({})),
|
|
369
|
+
* Args.validate(validateFirebaseProjectId),
|
|
370
|
+
* Args.required(),
|
|
371
|
+
* );
|
|
372
|
+
*/
|
|
250
373
|
function validate<A>(validator: (value: A) => string | undefined) {
|
|
251
374
|
return function validateArg<E, R, CanBeInactive extends boolean>(
|
|
252
375
|
arg: Arg<A, E, R, CanBeInactive>,
|
|
@@ -265,6 +388,18 @@ function validate<A>(validator: (value: A) => string | undefined) {
|
|
|
265
388
|
};
|
|
266
389
|
}
|
|
267
390
|
|
|
391
|
+
/**
|
|
392
|
+
* Finishes a pipeline with a required value.
|
|
393
|
+
*
|
|
394
|
+
* Missing active args produce BadArgsError. Inactive args return undefined, so
|
|
395
|
+
* callers can skip downstream work for unavailable flags.
|
|
396
|
+
*
|
|
397
|
+
* @example
|
|
398
|
+
* const clientId = yield* Args.text(opts, 'client-id').pipe(
|
|
399
|
+
* Args.prompt(clientIdPrompt({ providerUrl })),
|
|
400
|
+
* Args.required(),
|
|
401
|
+
* );
|
|
402
|
+
*/
|
|
268
403
|
function required(options?: MissingOptions) {
|
|
269
404
|
return function requiredArg<A, E, R, CanBeInactive extends boolean>(
|
|
270
405
|
arg: Arg<A, E, R, CanBeInactive>,
|
|
@@ -291,6 +426,17 @@ function required(options?: MissingOptions) {
|
|
|
291
426
|
};
|
|
292
427
|
}
|
|
293
428
|
|
|
429
|
+
/**
|
|
430
|
+
* Finishes a pipeline with an optional value.
|
|
431
|
+
*
|
|
432
|
+
* Missing and inactive args return undefined.
|
|
433
|
+
*
|
|
434
|
+
* @example
|
|
435
|
+
* const customRedirectUri = yield* Args.text(opts, 'custom-redirect-uri').pipe(
|
|
436
|
+
* Args.prompt(optionalRedirectPrompt),
|
|
437
|
+
* Args.optional(),
|
|
438
|
+
* );
|
|
439
|
+
*/
|
|
294
440
|
function optional() {
|
|
295
441
|
return function optionalArg<A, E, R, CanBeInactive extends boolean>(
|
|
296
442
|
arg: Arg<A, E, R, CanBeInactive>,
|