@cakemail-org/cakemail-cli 1.5.0 → 2.0.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.
- package/.claude/settings.local.json +12 -0
- package/.env.example +40 -0
- package/.env.test.example +45 -0
- package/CHANGELOG.md +1031 -0
- package/README.md +319 -15
- package/audit-formats.js +128 -0
- package/cakemail.rb +20 -0
- package/dist/cli.js +27 -10
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +16 -6
- package/dist/client.js.map +1 -1
- package/dist/commands/account.js +1 -1
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/attributes.js +1 -1
- package/dist/commands/attributes.js.map +1 -1
- package/dist/commands/campaigns.d.ts.map +1 -1
- package/dist/commands/campaigns.js +103 -8
- package/dist/commands/campaigns.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +63 -4
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +91 -12
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/emails.js +1 -1
- package/dist/commands/emails.js.map +1 -1
- package/dist/commands/interests.d.ts +5 -0
- package/dist/commands/interests.d.ts.map +1 -0
- package/dist/commands/interests.js +172 -0
- package/dist/commands/interests.js.map +1 -0
- package/dist/commands/lists.d.ts.map +1 -1
- package/dist/commands/lists.js +6 -8
- package/dist/commands/lists.js.map +1 -1
- package/dist/commands/logs.d.ts +5 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +237 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/reports.js +1 -1
- package/dist/commands/reports.js.map +1 -1
- package/dist/commands/segments.js +1 -1
- package/dist/commands/segments.js.map +1 -1
- package/dist/commands/senders.d.ts.map +1 -1
- package/dist/commands/senders.js +11 -8
- package/dist/commands/senders.js.map +1 -1
- package/dist/commands/suppressed.js +1 -1
- package/dist/commands/suppressed.js.map +1 -1
- package/dist/commands/tags.d.ts +5 -0
- package/dist/commands/tags.d.ts.map +1 -0
- package/dist/commands/tags.js +124 -0
- package/dist/commands/tags.js.map +1 -0
- package/dist/commands/templates.js +1 -1
- package/dist/commands/templates.js.map +1 -1
- package/dist/commands/transactional-templates.d.ts +5 -0
- package/dist/commands/transactional-templates.d.ts.map +1 -0
- package/dist/commands/transactional-templates.js +354 -0
- package/dist/commands/transactional-templates.js.map +1 -0
- package/dist/commands/webhooks.js +1 -1
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/utils/auth.d.ts +8 -1
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +39 -11
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/config-file.d.ts +7 -0
- package/dist/utils/config-file.d.ts.map +1 -1
- package/dist/utils/config-file.js +15 -0
- package/dist/utils/config-file.js.map +1 -1
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +12 -4
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/errors.js +1 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/list-defaults.d.ts +33 -0
- package/dist/utils/list-defaults.d.ts.map +1 -0
- package/dist/utils/list-defaults.js +52 -0
- package/dist/utils/list-defaults.js.map +1 -0
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +36 -13
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/progress.d.ts.map +1 -1
- package/dist/utils/progress.js +32 -4
- package/dist/utils/progress.js.map +1 -1
- package/dist/utils/spinner.d.ts +17 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +43 -0
- package/dist/utils/spinner.js.map +1 -0
- package/docs/DOCUMENTATION-STANDARD.md +1068 -0
- package/docs/README.md +161 -0
- package/docs/developer/ARCHITECTURE.md +516 -0
- package/docs/developer/AUTH.md +204 -0
- package/docs/developer/CONTRIBUTING.md +227 -0
- package/docs/developer/DOCUMENTATION_SUMMARY.md +346 -0
- package/docs/developer/PROJECT_INDEX.md +365 -0
- package/docs/planning/API_COVERAGE.md +1045 -0
- package/docs/planning/BACKLOG.md +1159 -0
- package/docs/planning/PROFILE_SYSTEM_TASKS.md +287 -0
- package/docs/planning/UX_IMPLEMENTATION_PLAN.md +691 -0
- package/docs/planning/archive/RELEASE_CHECKLIST_v1.3.0.md +332 -0
- package/docs/planning/archive/RELEASE_v1.3.0.md +428 -0
- package/docs/planning/archive/cakemail-cli-ux-improvements.md +438 -0
- package/docs/planning/cakemail-profile-system-plan.md +1121 -0
- package/docs/testing/AI_USER_SIMULATION_DESIGN.md +1342 -0
- package/docs/testing/KENOGAMI_BIDIRECTIONAL_FLOW.md +1517 -0
- package/docs/testing/KENOGAMI_TRUTH_RECONCILIATION_SYSTEM.md +1369 -0
- package/docs/user-manual/.obsidian/app.json +1 -0
- package/docs/user-manual/.obsidian/appearance.json +1 -0
- package/docs/user-manual/.obsidian/core-plugins.json +33 -0
- package/docs/user-manual/.obsidian/workspace.json +167 -0
- package/docs/user-manual/01-getting-started/01-installation.md +214 -0
- package/docs/user-manual/01-getting-started/02-quick-start.md +432 -0
- package/docs/user-manual/01-getting-started/03-authentication.md +448 -0
- package/docs/user-manual/01-getting-started/04-configuration.md +430 -0
- package/docs/user-manual/01-getting-started/05-output-formats.md +447 -0
- package/docs/user-manual/02-core-concepts/01-accounts.md +514 -0
- package/docs/user-manual/02-core-concepts/02-profile-system.md +771 -0
- package/docs/user-manual/02-core-concepts/03-smart-defaults.md +485 -0
- package/docs/user-manual/02-core-concepts/04-authentication-methods.md +435 -0
- package/docs/user-manual/02-core-concepts/05-pagination-filtering.md +600 -0
- package/docs/user-manual/02-core-concepts/06-error-handling.md +718 -0
- package/docs/user-manual/02-core-concepts/07-api-coverage.md +483 -0
- package/docs/user-manual/03-email-operations/01-senders.md +490 -0
- package/docs/user-manual/03-email-operations/02-templates.md +444 -0
- package/docs/user-manual/03-email-operations/03-transactional-emails.md +706 -0
- package/docs/user-manual/03-email-operations/04-email-tracking.md +407 -0
- package/docs/user-manual/04-campaign-management/01-campaigns-basics.md +394 -0
- package/docs/user-manual/04-campaign-management/02-campaign-scheduling.md +630 -0
- package/docs/user-manual/04-campaign-management/03-campaign-testing.md +997 -0
- package/docs/user-manual/04-campaign-management/04-campaign-lifecycle.md +709 -0
- package/docs/user-manual/04-campaign-management/05-campaign-links.md +934 -0
- package/docs/user-manual/05-contact-management/01-lists.md +836 -0
- package/docs/user-manual/05-contact-management/02-contacts.md +1035 -0
- package/docs/user-manual/05-contact-management/03-custom-attributes.md +788 -0
- package/docs/user-manual/05-contact-management/04-segments.md +1028 -0
- package/docs/user-manual/05-contact-management/05-contact-import-export.md +1031 -0
- package/docs/user-manual/06-analytics-reporting/01-campaign-analytics.md +867 -0
- package/docs/user-manual/06-analytics-reporting/02-account-reports.md +227 -0
- package/docs/user-manual/07-integrations/01-webhooks-integration.md +259 -0
- package/docs/user-manual/07-integrations/02-automation.md +326 -0
- package/docs/user-manual/08-advanced-usage/01-scripting-patterns.md +672 -0
- package/docs/user-manual/08-advanced-usage/02-bulk-operations.md +932 -0
- package/docs/user-manual/08-advanced-usage/03-ci-cd-integration.md +892 -0
- package/docs/user-manual/08-advanced-usage/04-performance-optimization.md +766 -0
- package/docs/user-manual/09-command-reference/01-config.md +776 -0
- package/docs/user-manual/09-command-reference/02-account.md +652 -0
- package/docs/user-manual/09-command-reference/03-lists.md +958 -0
- package/docs/user-manual/09-command-reference/04-contacts.md +1408 -0
- package/docs/user-manual/09-command-reference/05-attributes.md +617 -0
- package/docs/user-manual/09-command-reference/06-segments.md +894 -0
- package/docs/user-manual/09-command-reference/07-senders.md +803 -0
- package/docs/user-manual/09-command-reference/08-templates.md +818 -0
- package/docs/user-manual/09-command-reference/09-campaigns.md +1250 -0
- package/docs/user-manual/09-command-reference/10-emails.md +807 -0
- package/docs/user-manual/09-command-reference/11-reports.md +1135 -0
- package/docs/user-manual/09-command-reference/12-webhooks.md +773 -0
- package/docs/user-manual/09-command-reference/13-suppressed.md +797 -0
- package/docs/user-manual/09-command-reference/14-interests.md +630 -0
- package/docs/user-manual/09-command-reference/15-tags.md +584 -0
- package/docs/user-manual/09-command-reference/16-logs.md +656 -0
- package/docs/user-manual/09-command-reference/17-transactional-templates.md +850 -0
- package/docs/user-manual/10-troubleshooting/01-common-errors.md +457 -0
- package/docs/user-manual/10-troubleshooting/02-authentication-issues.md +558 -0
- package/docs/user-manual/10-troubleshooting/03-connection-problems.md +634 -0
- package/docs/user-manual/10-troubleshooting/04-debugging.md +725 -0
- package/docs/user-manual/11-appendix/04-faq.md +484 -0
- package/docs/user-manual/11-appendix/05-glossary.md +250 -0
- package/docs/user-manual/README.md +0 -0
- package/package.json +13 -47
- package/src/cli.ts +125 -0
- package/src/client.ts +16 -0
- package/src/commands/account.ts +267 -0
- package/src/commands/accounts.ts +78 -0
- package/src/commands/actions.ts +249 -0
- package/src/commands/attributes.ts +139 -0
- package/src/commands/campaign-blueprints.ts +106 -0
- package/src/commands/campaigns.ts +469 -0
- package/src/commands/config.ts +77 -0
- package/src/commands/contacts.ts +612 -0
- package/src/commands/custom-attributes.ts +127 -0
- package/src/commands/dkims.ts +117 -0
- package/src/commands/domains.ts +82 -0
- package/src/commands/email-apis.ts +569 -0
- package/src/commands/emails.ts +197 -0
- package/src/commands/forms.ts +283 -0
- package/src/commands/interests.ts +155 -0
- package/src/commands/links.ts +38 -0
- package/src/commands/lists.ts +406 -0
- package/src/commands/logos.ts +71 -0
- package/src/commands/logs.ts +386 -0
- package/src/commands/reports.ts +306 -0
- package/src/commands/segments.ts +158 -0
- package/src/commands/senders.ts +204 -0
- package/src/commands/sub-accounts.ts +271 -0
- package/src/commands/suppressed-emails.ts +234 -0
- package/src/commands/suppressed.ts +198 -0
- package/src/commands/system-emails.ts +85 -0
- package/src/commands/tags.ts +146 -0
- package/src/commands/tasks.ts +116 -0
- package/src/commands/templates.ts +189 -0
- package/src/commands/tokens.ts +83 -0
- package/src/commands/transactional-emails.ts +374 -0
- package/src/commands/transactional-templates.ts +385 -0
- package/src/commands/users.ts +506 -0
- package/src/commands/webhooks.ts +172 -0
- package/src/commands/workflow-blueprints.ts +123 -0
- package/src/commands/workflows.ts +265 -0
- package/src/types/profile.ts +93 -0
- package/src/utils/auth.ts +272 -0
- package/src/utils/config-file.ts +96 -0
- package/src/utils/config.ts +134 -0
- package/src/utils/confirm.ts +32 -0
- package/src/utils/defaults.ts +99 -0
- package/src/utils/errors.ts +116 -0
- package/src/utils/interactive.ts +91 -0
- package/src/utils/list-defaults.ts +74 -0
- package/src/utils/output.ts +190 -0
- package/src/utils/progress.ts +320 -0
- package/src/utils/spinner.ts +22 -0
- package/tests/IMPLEMENTATION_STATUS.md +258 -0
- package/tests/PTY_SETUP.md +118 -0
- package/tests/PTY_TESTING_GUIDE.md +507 -0
- package/tests/README.md +244 -0
- package/tests/fixtures/api-responses/campaigns.json +34 -0
- package/tests/fixtures/test-config.json +13 -0
- package/tests/helpers/cli-runner.ts +128 -0
- package/tests/helpers/mock-server.ts +301 -0
- package/tests/helpers/pty-runner.ts +181 -0
- package/tests/integration/campaigns-real-api.test.ts +196 -0
- package/tests/integration/setup-integration.ts +50 -0
- package/tests/pty/campaigns.test.ts +241 -0
- package/tests/setup.ts +34 -0
- package/tsconfig.json +15 -0
- package/vitest.config.ts +28 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// ABOUTME: CLI commands for Custom Attribute.
|
|
2
|
+
// ABOUTME: Generated by api-kit from the OpenAPI spec.
|
|
3
|
+
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { createSpinner } from '../utils/spinner.js';
|
|
6
|
+
import { confirmDelete } from '../utils/confirm.js';
|
|
7
|
+
|
|
8
|
+
export function createCustomAttributesCommand(
|
|
9
|
+
client: any,
|
|
10
|
+
formatter: any
|
|
11
|
+
): Command {
|
|
12
|
+
const cmd = new Command('custom-attributes')
|
|
13
|
+
.description('Define custom data fields for contacts. Custom attributes extend the contact model with account-specific fields (e.g. company name, purchase date) that can be used in segmentation and merge tags.');
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
cmd
|
|
17
|
+
.command('list-custom-attributes <list-id>')
|
|
18
|
+
.description('Show all custom attributes')
|
|
19
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
20
|
+
.option('--page <value>', 'page')
|
|
21
|
+
.option('--per-page <value>', 'per_page')
|
|
22
|
+
.option('--with-count <value>', 'Include count in the response')
|
|
23
|
+
.action(async (list_id, options) => {
|
|
24
|
+
const spinner = createSpinner('Fetching custom attribute...').start();
|
|
25
|
+
try {
|
|
26
|
+
const data = await client.listCustomAttributes({
|
|
27
|
+
list_id: Number(list_id),
|
|
28
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
29
|
+
page: options.page != null ? Number(options.page) : undefined,
|
|
30
|
+
perPage: options.perPage != null ? Number(options.perPage) : undefined,
|
|
31
|
+
withCount: options.withCount,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
spinner.stop();
|
|
35
|
+
formatter.output(data);
|
|
36
|
+
} catch (error: any) {
|
|
37
|
+
spinner.stop();
|
|
38
|
+
formatter.error(error.message);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
cmd
|
|
45
|
+
.command('create-custom-attribute <list-id>')
|
|
46
|
+
.description('Create a custom attribute')
|
|
47
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
48
|
+
.requiredOption('--name <value>', 'Cannot be one of the reserved terms: id, email, status, registered, bounce_type, bounce_count, tags, _tags')
|
|
49
|
+
.requiredOption('--type <value>', 'type')
|
|
50
|
+
.action(async (list_id, options) => {
|
|
51
|
+
const spinner = createSpinner('Creating custom attribute...').start();
|
|
52
|
+
try {
|
|
53
|
+
const data = await client.createCustomAttribute({
|
|
54
|
+
list_id: Number(list_id),
|
|
55
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
56
|
+
name: options.name,
|
|
57
|
+
type: options.type,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
spinner.stop();
|
|
61
|
+
formatter.success('Custom Attribute created successfully');
|
|
62
|
+
formatter.output(data);
|
|
63
|
+
} catch (error: any) {
|
|
64
|
+
spinner.stop();
|
|
65
|
+
formatter.error(error.message);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
cmd
|
|
72
|
+
.command('get-custom-attribute <list-id> <name>')
|
|
73
|
+
.description('Show a custom attribute')
|
|
74
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
75
|
+
.action(async (list_id, name, options) => {
|
|
76
|
+
const spinner = createSpinner('Fetching custom attribute...').start();
|
|
77
|
+
try {
|
|
78
|
+
const data = await client.getCustomAttribute({
|
|
79
|
+
list_id: Number(list_id),
|
|
80
|
+
name,
|
|
81
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
spinner.stop();
|
|
85
|
+
formatter.output(data);
|
|
86
|
+
} catch (error: any) {
|
|
87
|
+
spinner.stop();
|
|
88
|
+
formatter.error(error.message);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
cmd
|
|
95
|
+
.command('delete-custom-attribute <list-id> <name>')
|
|
96
|
+
.description('Delete a custom attribute')
|
|
97
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
98
|
+
.option('-f, --force', 'Skip confirmation prompt')
|
|
99
|
+
.action(async (list_id, name, options) => {
|
|
100
|
+
if (!options.force) {
|
|
101
|
+
const confirmed = await confirmDelete('custom attribute', list_id);
|
|
102
|
+
if (!confirmed) {
|
|
103
|
+
formatter.info('Deletion cancelled');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const spinner = createSpinner('Deleting custom attribute...').start();
|
|
109
|
+
try {
|
|
110
|
+
const data = await client.deleteCustomAttribute({
|
|
111
|
+
list_id: Number(list_id),
|
|
112
|
+
name,
|
|
113
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
spinner.stop();
|
|
117
|
+
formatter.success('Custom Attribute deleted successfully');
|
|
118
|
+
} catch (error: any) {
|
|
119
|
+
spinner.stop();
|
|
120
|
+
formatter.error(error.message);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
return cmd;
|
|
127
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// ABOUTME: CLI commands for DKIM.
|
|
2
|
+
// ABOUTME: Generated by api-kit from the OpenAPI spec.
|
|
3
|
+
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { createSpinner } from '../utils/spinner.js';
|
|
6
|
+
import { confirmDelete } from '../utils/confirm.js';
|
|
7
|
+
|
|
8
|
+
export function createDkimsCommand(
|
|
9
|
+
client: any,
|
|
10
|
+
formatter: any
|
|
11
|
+
): Command {
|
|
12
|
+
const cmd = new Command('dkims')
|
|
13
|
+
.description('Manage DKIM (DomainKeys Identified Mail) keys for email authentication. DKIM signing improves deliverability and prevents email spoofing.');
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
cmd
|
|
17
|
+
.command('list-dkim-keys-brands-default-dkim-get')
|
|
18
|
+
.description('List Dkim Keys')
|
|
19
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
20
|
+
.action(async (options) => {
|
|
21
|
+
const spinner = createSpinner('Fetching dkim...').start();
|
|
22
|
+
try {
|
|
23
|
+
const data = await client.list_dkim_keys_brands_default_dkim_get({
|
|
24
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
spinner.stop();
|
|
28
|
+
formatter.output(data);
|
|
29
|
+
} catch (error: any) {
|
|
30
|
+
spinner.stop();
|
|
31
|
+
formatter.error(error.message);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
cmd
|
|
38
|
+
.command('create-dkim-key-brands-default-dkim-post')
|
|
39
|
+
.description('Create Dkim Key')
|
|
40
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
41
|
+
.option('--selector <value>', 'selector')
|
|
42
|
+
.requiredOption('--domain <value>', 'domain')
|
|
43
|
+
.action(async (options) => {
|
|
44
|
+
const spinner = createSpinner('Creating dkim...').start();
|
|
45
|
+
try {
|
|
46
|
+
const data = await client.create_dkim_key_brands_default_dkim_post({
|
|
47
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
48
|
+
selector: options.selector,
|
|
49
|
+
domain: options.domain,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
spinner.stop();
|
|
53
|
+
formatter.success('DKIM created successfully');
|
|
54
|
+
formatter.output(data);
|
|
55
|
+
} catch (error: any) {
|
|
56
|
+
spinner.stop();
|
|
57
|
+
formatter.error(error.message);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
cmd
|
|
64
|
+
.command('get-dkim-key-brands-default-dkim-id-get <id>')
|
|
65
|
+
.description('Get Dkim Key')
|
|
66
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
67
|
+
.action(async (id, options) => {
|
|
68
|
+
const spinner = createSpinner('Fetching dkim...').start();
|
|
69
|
+
try {
|
|
70
|
+
const data = await client.get_dkim_key_brands_default_dkim__id__get({
|
|
71
|
+
id: Number(id),
|
|
72
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
spinner.stop();
|
|
76
|
+
formatter.output(data);
|
|
77
|
+
} catch (error: any) {
|
|
78
|
+
spinner.stop();
|
|
79
|
+
formatter.error(error.message);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
cmd
|
|
86
|
+
.command('delete-dkim-key-brands-default-dkim-id-delete <id>')
|
|
87
|
+
.description('Delete Dkim Key')
|
|
88
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
89
|
+
.option('-f, --force', 'Skip confirmation prompt')
|
|
90
|
+
.action(async (id, options) => {
|
|
91
|
+
if (!options.force) {
|
|
92
|
+
const confirmed = await confirmDelete('dkim', id);
|
|
93
|
+
if (!confirmed) {
|
|
94
|
+
formatter.info('Deletion cancelled');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const spinner = createSpinner('Deleting dkim...').start();
|
|
100
|
+
try {
|
|
101
|
+
const data = await client.delete_dkim_key_brands_default_dkim__id__delete({
|
|
102
|
+
id: Number(id),
|
|
103
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
spinner.stop();
|
|
107
|
+
formatter.success('DKIM deleted successfully');
|
|
108
|
+
} catch (error: any) {
|
|
109
|
+
spinner.stop();
|
|
110
|
+
formatter.error(error.message);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
return cmd;
|
|
117
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// ABOUTME: CLI commands for Domain.
|
|
2
|
+
// ABOUTME: Generated by api-kit from the OpenAPI spec.
|
|
3
|
+
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { createSpinner } from '../utils/spinner.js';
|
|
6
|
+
|
|
7
|
+
export function createDomainsCommand(
|
|
8
|
+
client: any,
|
|
9
|
+
formatter: any
|
|
10
|
+
): Command {
|
|
11
|
+
const cmd = new Command('domains')
|
|
12
|
+
.description('Configure custom tracking and bounce domains. Custom domains replace default platform URLs in email links and bounce handling with your own branded domains.');
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
cmd
|
|
16
|
+
.command('show')
|
|
17
|
+
.description('Show domains')
|
|
18
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
const spinner = createSpinner('Fetching domain...').start();
|
|
21
|
+
try {
|
|
22
|
+
const data = await client.showDomains({
|
|
23
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
spinner.stop();
|
|
27
|
+
formatter.output(data);
|
|
28
|
+
} catch (error: any) {
|
|
29
|
+
spinner.stop();
|
|
30
|
+
formatter.error(error.message);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
cmd
|
|
37
|
+
.command('patch')
|
|
38
|
+
.description('Change domains')
|
|
39
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
40
|
+
.requiredOption('--domains <value>', 'Custom domain configuration')
|
|
41
|
+
.action(async (options) => {
|
|
42
|
+
const spinner = createSpinner('Updating domain...').start();
|
|
43
|
+
try {
|
|
44
|
+
const data = await client.patchDomains({
|
|
45
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
46
|
+
domains: options.domains,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
spinner.stop();
|
|
50
|
+
formatter.success('Domain updated successfully');
|
|
51
|
+
formatter.output(data);
|
|
52
|
+
} catch (error: any) {
|
|
53
|
+
spinner.stop();
|
|
54
|
+
formatter.error(error.message);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
cmd
|
|
61
|
+
.command('validate')
|
|
62
|
+
.description('Validate domains')
|
|
63
|
+
.option('--account-id <value>', 'Optional Account ID to be used for the request')
|
|
64
|
+
.action(async (options) => {
|
|
65
|
+
const spinner = createSpinner('Fetching domain...').start();
|
|
66
|
+
try {
|
|
67
|
+
const data = await client.validateDomains({
|
|
68
|
+
accountId: options.accountId != null ? Number(options.accountId) : undefined,
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
spinner.stop();
|
|
72
|
+
formatter.output(data);
|
|
73
|
+
} catch (error: any) {
|
|
74
|
+
spinner.stop();
|
|
75
|
+
formatter.error(error.message);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
return cmd;
|
|
82
|
+
}
|