doomain 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +293 -0
  3. package/bin/dev.cmd +3 -0
  4. package/bin/dev.js +5 -0
  5. package/bin/run.cmd +3 -0
  6. package/bin/run.js +8 -0
  7. package/dist/commands/auth/logout/vercel.d.ts +9 -0
  8. package/dist/commands/auth/logout/vercel.js +35 -0
  9. package/dist/commands/auth/vercel.d.ts +10 -0
  10. package/dist/commands/auth/vercel.js +69 -0
  11. package/dist/commands/domains/list.d.ts +10 -0
  12. package/dist/commands/domains/list.js +36 -0
  13. package/dist/commands/link.d.ts +21 -0
  14. package/dist/commands/link.js +63 -0
  15. package/dist/commands/projects/list.d.ts +9 -0
  16. package/dist/commands/projects/list.js +26 -0
  17. package/dist/commands/providers/add.d.ts +1 -0
  18. package/dist/commands/providers/add.js +1 -0
  19. package/dist/commands/providers/connect.d.ts +15 -0
  20. package/dist/commands/providers/connect.js +183 -0
  21. package/dist/commands/providers/disconnect.d.ts +13 -0
  22. package/dist/commands/providers/disconnect.js +52 -0
  23. package/dist/commands/providers/list.d.ts +8 -0
  24. package/dist/commands/providers/list.js +25 -0
  25. package/dist/commands/providers/status.d.ts +9 -0
  26. package/dist/commands/providers/status.js +31 -0
  27. package/dist/commands/providers/verify.d.ts +11 -0
  28. package/dist/commands/providers/verify.js +27 -0
  29. package/dist/commands/schema.d.ts +11 -0
  30. package/dist/commands/schema.js +29 -0
  31. package/dist/commands/verify.d.ts +12 -0
  32. package/dist/commands/verify.js +36 -0
  33. package/dist/commands/wizard.d.ts +9 -0
  34. package/dist/commands/wizard.js +322 -0
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.js +1 -0
  37. package/dist/lib/command-schema.d.ts +14 -0
  38. package/dist/lib/command-schema.js +99 -0
  39. package/dist/lib/config.d.ts +34 -0
  40. package/dist/lib/config.js +49 -0
  41. package/dist/lib/errors.d.ts +7 -0
  42. package/dist/lib/errors.js +17 -0
  43. package/dist/lib/flags.d.ts +6 -0
  44. package/dist/lib/flags.js +10 -0
  45. package/dist/lib/link-domain.d.ts +47 -0
  46. package/dist/lib/link-domain.js +336 -0
  47. package/dist/lib/local-vercel.d.ts +6 -0
  48. package/dist/lib/local-vercel.js +27 -0
  49. package/dist/lib/output.d.ts +36 -0
  50. package/dist/lib/output.js +51 -0
  51. package/dist/lib/providers/cloudflare/index.d.ts +26 -0
  52. package/dist/lib/providers/cloudflare/index.js +219 -0
  53. package/dist/lib/providers/core/config.d.ts +5 -0
  54. package/dist/lib/providers/core/config.js +33 -0
  55. package/dist/lib/providers/core/errors.d.ts +6 -0
  56. package/dist/lib/providers/core/errors.js +18 -0
  57. package/dist/lib/providers/core/http.d.ts +17 -0
  58. package/dist/lib/providers/core/http.js +43 -0
  59. package/dist/lib/providers/core/pagination.d.ts +12 -0
  60. package/dist/lib/providers/core/pagination.js +15 -0
  61. package/dist/lib/providers/core/planner.d.ts +19 -0
  62. package/dist/lib/providers/core/planner.js +79 -0
  63. package/dist/lib/providers/core/types.d.ts +123 -0
  64. package/dist/lib/providers/core/types.js +1 -0
  65. package/dist/lib/providers/namecheap/index.d.ts +28 -0
  66. package/dist/lib/providers/namecheap/index.js +289 -0
  67. package/dist/lib/providers/registry.d.ts +4 -0
  68. package/dist/lib/providers/registry.js +21 -0
  69. package/dist/lib/providers/spaceship/index.d.ts +22 -0
  70. package/dist/lib/providers/spaceship/index.js +148 -0
  71. package/dist/lib/providers/status.d.ts +16 -0
  72. package/dist/lib/providers/status.js +33 -0
  73. package/dist/lib/providers/types.d.ts +1 -0
  74. package/dist/lib/providers/types.js +1 -0
  75. package/dist/lib/validate.d.ts +15 -0
  76. package/dist/lib/validate.js +62 -0
  77. package/dist/lib/vercel.d.ts +32 -0
  78. package/dist/lib/vercel.js +131 -0
  79. package/oclif.manifest.json +633 -0
  80. package/package.json +86 -0
@@ -0,0 +1,183 @@
1
+ import { Args, Command, Flags } from '@oclif/core';
2
+ import * as p from '@clack/prompts';
3
+ import { getConfigPath, loadConfig, maskSecret, updateConfig } from '../../lib/config.js';
4
+ import { jsonFlag } from '../../lib/flags.js';
5
+ import { createOutput, outputError } from '../../lib/output.js';
6
+ import { getProviderDefinition, listProviderDefinitions } from '../../lib/providers/registry.js';
7
+ import { isProviderConfigured } from '../../lib/providers/status.js';
8
+ function requireString(value, message) {
9
+ if (typeof value === 'string' && value.trim())
10
+ return value.trim();
11
+ throw new Error(message);
12
+ }
13
+ function parseCredentialFlags(values) {
14
+ const credentials = {};
15
+ for (const value of values ?? []) {
16
+ const index = value.indexOf('=');
17
+ if (index <= 0)
18
+ throw new Error(`Invalid --credential value "${value}". Use key=value.`);
19
+ credentials[value.slice(0, index)] = value.slice(index + 1);
20
+ }
21
+ return credentials;
22
+ }
23
+ function legacyFlagValue(flags, credential) {
24
+ const key = credential.key.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
25
+ const value = flags[key];
26
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
27
+ }
28
+ async function fetchPublicIp() {
29
+ const controller = new AbortController();
30
+ const timeout = setTimeout(() => controller.abort(), 2000);
31
+ try {
32
+ const response = await fetch('https://api.ipify.org', { signal: controller.signal });
33
+ if (!response.ok)
34
+ return undefined;
35
+ const ip = (await response.text()).trim();
36
+ return ip || undefined;
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ finally {
42
+ clearTimeout(timeout);
43
+ }
44
+ }
45
+ function credentialInitialValue(credential, detectedPublicIp) {
46
+ if (credential.key !== 'clientIp')
47
+ return undefined;
48
+ return detectedPublicIp;
49
+ }
50
+ async function promptCredential(credential, detectedPublicIp) {
51
+ const initialValue = credential.secret ? undefined : credentialInitialValue(credential, detectedPublicIp);
52
+ const value = credential.secret
53
+ ? await p.password({ message: credential.label })
54
+ : await p.text({ message: credential.label, initialValue, placeholder: credential.placeholder ?? credential.hint });
55
+ if (p.isCancel(value)) {
56
+ p.cancel('Cancelled');
57
+ return null;
58
+ }
59
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
60
+ }
61
+ async function promptProvider() {
62
+ const config = await loadConfig();
63
+ const selected = await p.select({
64
+ message: 'Choose DNS provider',
65
+ options: listProviderDefinitions().map((definition) => ({
66
+ hint: isProviderConfigured(definition, config) ? 'Connected' : 'Not connected',
67
+ label: definition.displayName,
68
+ value: definition.id,
69
+ })),
70
+ });
71
+ if (p.isCancel(selected)) {
72
+ p.cancel('Cancelled');
73
+ return null;
74
+ }
75
+ return getProviderDefinition(selected);
76
+ }
77
+ function usesClientIp(definition) {
78
+ return definition.credentials.some((credential) => credential.key === 'clientIp');
79
+ }
80
+ function showSetupGuide(definition, detectedPublicIp) {
81
+ if (!definition.setup?.notes?.length)
82
+ return;
83
+ const notes = [...definition.setup.notes];
84
+ if (detectedPublicIp)
85
+ notes.push(`Detected public IP: ${detectedPublicIp}`);
86
+ p.note(notes.join('\n'), `${definition.displayName} setup`);
87
+ }
88
+ export default class ProvidersConnect extends Command {
89
+ static args = {
90
+ provider: Args.string({ description: 'Provider id, for example spaceship.', required: false }),
91
+ };
92
+ static description = 'Save DNS provider credentials locally.';
93
+ static flags = {
94
+ 'api-key': Flags.string({ description: 'Compatibility alias for Spaceship apiKey.' }),
95
+ 'api-secret': Flags.string({ description: 'Compatibility alias for Spaceship apiSecret.' }),
96
+ credential: Flags.string({ char: 'c', description: 'Provider credential as key=value.', multiple: true }),
97
+ json: jsonFlag,
98
+ 'no-verify': Flags.boolean({ description: 'Save credentials without verifying them first.' }),
99
+ };
100
+ async run() {
101
+ const { args, flags } = await this.parse(ProvidersConnect);
102
+ const out = createOutput({ json: flags.json });
103
+ let spinner;
104
+ try {
105
+ if (!args.provider && out.json)
106
+ throw new Error('Missing provider. Pass a provider id, for example `namecheap`.');
107
+ const definition = args.provider ? getProviderDefinition(args.provider) : await promptProvider();
108
+ if (!definition)
109
+ return;
110
+ const passedCredentials = parseCredentialFlags(flags.credential);
111
+ const credentials = {};
112
+ const detectedPublicIp = !out.json && usesClientIp(definition) ? await fetchPublicIp() : undefined;
113
+ if (!out.json)
114
+ showSetupGuide(definition, detectedPublicIp);
115
+ for (const credential of definition.credentials) {
116
+ const value = process.env[credential.env] || passedCredentials[credential.key] || legacyFlagValue(flags, credential) || undefined;
117
+ if (value) {
118
+ credentials[credential.key] = value;
119
+ continue;
120
+ }
121
+ const initialValue = credentialInitialValue(credential, detectedPublicIp);
122
+ if (initialValue) {
123
+ credentials[credential.key] = initialValue;
124
+ continue;
125
+ }
126
+ if (out.json || credential.required === false)
127
+ continue;
128
+ const prompted = await promptCredential(credential, detectedPublicIp);
129
+ if (prompted === null)
130
+ return;
131
+ credentials[credential.key] = prompted;
132
+ }
133
+ for (const credential of definition.credentials) {
134
+ if (credential.required !== false) {
135
+ credentials[credential.key] = requireString(credentials[credential.key], `Missing ${definition.displayName} ${credential.label}. Pass --credential ${credential.key}=... or set ${credential.env}.`);
136
+ }
137
+ }
138
+ let domainCount;
139
+ if (!flags['no-verify']) {
140
+ spinner = out.json ? undefined : out.spinner();
141
+ spinner?.start(`Verifying ${definition.displayName} credentials`);
142
+ const zones = await definition.create({ credentials, debug: process.env.DOOMAIN_DEBUG === '1' }).listZones();
143
+ domainCount = zones.length;
144
+ spinner?.stop(`Verified ${definition.displayName} credentials and found ${domainCount} domain${domainCount === 1 ? '' : 's'}`);
145
+ spinner = undefined;
146
+ }
147
+ let setDefault = true;
148
+ const currentConfig = await loadConfig();
149
+ if (!out.json && currentConfig.defaults?.provider && currentConfig.defaults.provider !== definition.id) {
150
+ const value = await p.confirm({
151
+ initialValue: true,
152
+ message: `Set ${definition.displayName} as the default DNS provider?`,
153
+ });
154
+ if (p.isCancel(value)) {
155
+ p.cancel('Cancelled');
156
+ return;
157
+ }
158
+ setDefault = value;
159
+ }
160
+ await updateConfig((config) => ({
161
+ ...config,
162
+ defaults: setDefault ? { ...config.defaults, provider: definition.id } : config.defaults,
163
+ providers: {
164
+ ...config.providers,
165
+ [definition.id]: { credentials },
166
+ },
167
+ }));
168
+ out.result({
169
+ configPath: getConfigPath(),
170
+ credentials: Object.fromEntries(Object.entries(credentials).map(([key, value]) => [key, maskSecret(value)])),
171
+ domainCount,
172
+ provider: definition.id,
173
+ verified: !flags['no-verify'],
174
+ });
175
+ out.success(`${definition.displayName} credentials saved to ${getConfigPath()}.`);
176
+ }
177
+ catch (error) {
178
+ spinner?.error('Provider connection failed');
179
+ outputError(out.json, error, 'MISSING_CREDENTIALS');
180
+ this.exit(1);
181
+ }
182
+ }
183
+ }
@@ -0,0 +1,13 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ProvidersDisconnect extends Command {
3
+ static aliases: string[];
4
+ static args: {
5
+ provider: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
6
+ };
7
+ static description: string;
8
+ static examples: string[];
9
+ static flags: {
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,52 @@
1
+ import { Args, Command } from '@oclif/core';
2
+ import { getConfigPath, updateConfig } from '../../lib/config.js';
3
+ import { jsonFlag } from '../../lib/flags.js';
4
+ import { createOutput, outputError } from '../../lib/output.js';
5
+ import { getProviderDefinition } from '../../lib/providers/registry.js';
6
+ function envOverrides(definition) {
7
+ return definition.credentials.flatMap((credential) => (process.env[credential.env] ? [credential.env] : []));
8
+ }
9
+ export default class ProvidersDisconnect extends Command {
10
+ static aliases = ['providers logout'];
11
+ static args = {
12
+ provider: Args.string({ description: 'Provider id, for example namecheap.', required: true }),
13
+ };
14
+ static description = 'Remove saved DNS provider credentials locally.';
15
+ static examples = [
16
+ '<%= config.bin %> <%= command.id %> namecheap',
17
+ '<%= config.bin %> <%= command.id %> cloudflare --json',
18
+ ];
19
+ static flags = {
20
+ json: jsonFlag,
21
+ };
22
+ async run() {
23
+ const { args, flags } = await this.parse(ProvidersDisconnect);
24
+ const out = createOutput({ json: flags.json });
25
+ try {
26
+ const definition = getProviderDefinition(args.provider);
27
+ let removed = false;
28
+ await updateConfig((config) => {
29
+ const providers = { ...config.providers };
30
+ removed = providers[definition.id] !== undefined;
31
+ delete providers[definition.id];
32
+ const defaults = { ...config.defaults };
33
+ if (defaults.provider === definition.id)
34
+ delete defaults.provider;
35
+ return {
36
+ ...config,
37
+ defaults: Object.keys(defaults).length > 0 ? defaults : undefined,
38
+ providers: Object.keys(providers).length > 0 ? providers : undefined,
39
+ };
40
+ });
41
+ const overrides = envOverrides(definition);
42
+ out.result({ configPath: getConfigPath(), environmentOverrides: overrides, provider: definition.id, removed });
43
+ if (overrides.length > 0)
44
+ out.warn(`${definition.displayName} environment credentials are still set: ${overrides.join(', ')}.`);
45
+ out.success(removed ? `${definition.displayName} credentials removed from ${getConfigPath()}.` : `${definition.displayName} was not connected.`);
46
+ }
47
+ catch (error) {
48
+ outputError(out.json, error, 'PROVIDER_NOT_FOUND');
49
+ this.exit(1);
50
+ }
51
+ }
52
+ }
@@ -0,0 +1,8 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ProvidersList extends Command {
3
+ static description: string;
4
+ static flags: {
5
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
6
+ };
7
+ run(): Promise<void>;
8
+ }
@@ -0,0 +1,25 @@
1
+ import { Command } from '@oclif/core';
2
+ import { jsonFlag } from '../../lib/flags.js';
3
+ import { listProviderDefinitions } from '../../lib/providers/registry.js';
4
+ import { createOutput } from '../../lib/output.js';
5
+ export default class ProvidersList extends Command {
6
+ static description = 'List supported DNS providers.';
7
+ static flags = {
8
+ json: jsonFlag,
9
+ };
10
+ async run() {
11
+ const { flags } = await this.parse(ProvidersList);
12
+ const out = createOutput({ json: flags.json });
13
+ const providers = listProviderDefinitions().map((provider) => ({
14
+ capabilities: provider.capabilities,
15
+ credentials: provider.credentials,
16
+ docsUrl: provider.docsUrl,
17
+ id: provider.id,
18
+ displayName: provider.displayName,
19
+ name: provider.name,
20
+ }));
21
+ for (const provider of providers)
22
+ out.info(`${provider.id} - ${provider.displayName}`);
23
+ out.result({ providers });
24
+ }
25
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ProvidersStatus extends Command {
3
+ static description: string;
4
+ static flags: {
5
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
6
+ 'no-verify': import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
@@ -0,0 +1,31 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import { jsonFlag } from '../../lib/flags.js';
3
+ import { createOutput } from '../../lib/output.js';
4
+ import { listProviderStatuses } from '../../lib/providers/status.js';
5
+ function formatStatus(provider) {
6
+ if (!provider.configured)
7
+ return 'not connected';
8
+ if (provider.verified === undefined)
9
+ return 'configured';
10
+ if (!provider.verified)
11
+ return `failed: ${provider.error}`;
12
+ return `verified${provider.domainCount === undefined ? '' : `, ${provider.domainCount} domains`}`;
13
+ }
14
+ export default class ProvidersStatus extends Command {
15
+ static description = 'Show configured DNS providers and credential health.';
16
+ static flags = {
17
+ json: jsonFlag,
18
+ 'no-verify': Flags.boolean({ description: 'Skip provider API calls and only show local configuration status.' }),
19
+ };
20
+ async run() {
21
+ const { flags } = await this.parse(ProvidersStatus);
22
+ const out = createOutput({ json: flags.json });
23
+ const spinner = out.json || flags['no-verify'] ? undefined : out.spinner();
24
+ spinner?.start('Checking DNS providers');
25
+ const providers = await listProviderStatuses({ verify: !flags['no-verify'] });
26
+ spinner?.stop('Checked DNS providers');
27
+ for (const provider of providers)
28
+ out.info(`${provider.displayName} (${provider.id}) - ${formatStatus(provider)}${provider.default ? ' [default]' : ''}`);
29
+ out.result({ providers });
30
+ }
31
+ }
@@ -0,0 +1,11 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ProvidersVerify extends Command {
3
+ static args: {
4
+ provider: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
5
+ };
6
+ static description: string;
7
+ static flags: {
8
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ };
10
+ run(): Promise<void>;
11
+ }
@@ -0,0 +1,27 @@
1
+ import { Args, Command } from '@oclif/core';
2
+ import { jsonFlag } from '../../lib/flags.js';
3
+ import { createOutput, outputError } from '../../lib/output.js';
4
+ import { createProvider } from '../../lib/providers/registry.js';
5
+ export default class ProvidersVerify extends Command {
6
+ static args = {
7
+ provider: Args.string({ description: 'Provider id, for example spaceship.', required: true }),
8
+ };
9
+ static description = 'Verify saved DNS provider credentials.';
10
+ static flags = {
11
+ json: jsonFlag,
12
+ };
13
+ async run() {
14
+ const { args, flags } = await this.parse(ProvidersVerify);
15
+ const out = createOutput({ json: flags.json });
16
+ try {
17
+ const provider = await createProvider(args.provider);
18
+ const health = await provider.verifyCredentials();
19
+ out.result({ health, provider: provider.id });
20
+ out.success(`${provider.name} credentials verified.`);
21
+ }
22
+ catch (error) {
23
+ outputError(out.json, error, 'PROVIDER_AUTH_FAILED');
24
+ this.exit(1);
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,11 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Schema extends Command {
3
+ static args: {
4
+ command: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
5
+ };
6
+ static description: string;
7
+ static flags: {
8
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ };
10
+ run(): Promise<void>;
11
+ }
@@ -0,0 +1,29 @@
1
+ import { Args, Command } from '@oclif/core';
2
+ import { getCommandSchema } from '../lib/command-schema.js';
3
+ import { jsonFlag } from '../lib/flags.js';
4
+ import { createOutput, outputError } from '../lib/output.js';
5
+ export default class Schema extends Command {
6
+ static args = {
7
+ command: Args.string({ description: 'Command name to inspect, for example link.', required: false }),
8
+ };
9
+ static description = 'Print machine-readable command schemas for agents.';
10
+ static flags = {
11
+ json: jsonFlag,
12
+ };
13
+ async run() {
14
+ const { args, flags } = await this.parse(Schema);
15
+ const out = createOutput({ json: flags.json });
16
+ try {
17
+ const schema = getCommandSchema(args.command);
18
+ if (!schema)
19
+ throw new Error(`Unknown command schema: ${args.command}`);
20
+ if (!out.json)
21
+ out.info(JSON.stringify(schema, null, 2));
22
+ out.result(schema);
23
+ }
24
+ catch (error) {
25
+ outputError(out.json, error, 'INVALID_INPUT');
26
+ this.exit(1);
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,12 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Verify extends Command {
3
+ static description: string;
4
+ static flags: {
5
+ apex: import("@oclif/core/interfaces").BooleanFlag<boolean>;
6
+ domain: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ subdomain: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
@@ -0,0 +1,36 @@
1
+ import { Command } from '@oclif/core';
2
+ import { apexFlag, domainFlag, jsonFlag, projectFlag, subdomainFlag } from '../lib/flags.js';
3
+ import { detectLocalVercelProject } from '../lib/local-vercel.js';
4
+ import { createOutput, outputError } from '../lib/output.js';
5
+ import { resolveDomainTarget } from '../lib/validate.js';
6
+ import { createVercelClient, resolveVercelConfig } from '../lib/vercel.js';
7
+ export default class Verify extends Command {
8
+ static description = 'Ask Vercel to verify a project domain.';
9
+ static flags = {
10
+ apex: apexFlag,
11
+ domain: domainFlag,
12
+ json: jsonFlag,
13
+ project: projectFlag,
14
+ subdomain: subdomainFlag,
15
+ };
16
+ async run() {
17
+ const { flags } = await this.parse(Verify);
18
+ const out = createOutput({ json: flags.json });
19
+ try {
20
+ if (!flags.domain)
21
+ throw new Error('Missing --domain.');
22
+ const target = resolveDomainTarget({ domain: flags.domain, subdomain: flags.subdomain, apex: flags.apex });
23
+ const project = flags.project ?? detectLocalVercelProject()?.projectId;
24
+ if (!project)
25
+ throw new Error('Missing --project and no local .vercel/project.json was found.');
26
+ const vercel = createVercelClient(await resolveVercelConfig());
27
+ const result = await vercel.verifyProjectDomain(project, target.fullDomain);
28
+ out.result({ project, domain: target.fullDomain, vercel: result });
29
+ out.success(`Verification requested for ${target.fullDomain}.`);
30
+ }
31
+ catch (error) {
32
+ outputError(out.json, error, 'DOMAIN_VERIFY_FAILED');
33
+ this.exit(1);
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Wizard extends Command {
3
+ static description: string;
4
+ static hidden: boolean;
5
+ static flags: {
6
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
8
+ run(): Promise<void>;
9
+ }