@cakemail-org/cakemail-cli 1.3.0 → 1.7.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 (103) hide show
  1. package/README.md +312 -12
  2. package/dist/cli.js +59 -8
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client.d.ts +2 -0
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +15 -7
  7. package/dist/client.js.map +1 -1
  8. package/dist/commands/account.d.ts +5 -0
  9. package/dist/commands/account.d.ts.map +1 -0
  10. package/dist/commands/account.js +231 -0
  11. package/dist/commands/account.js.map +1 -0
  12. package/dist/commands/attributes.d.ts.map +1 -1
  13. package/dist/commands/attributes.js +43 -15
  14. package/dist/commands/attributes.js.map +1 -1
  15. package/dist/commands/campaigns.d.ts.map +1 -1
  16. package/dist/commands/campaigns.js +255 -26
  17. package/dist/commands/campaigns.js.map +1 -1
  18. package/dist/commands/config.d.ts +8 -0
  19. package/dist/commands/config.d.ts.map +1 -0
  20. package/dist/commands/config.js +294 -0
  21. package/dist/commands/config.js.map +1 -0
  22. package/dist/commands/contacts.d.ts.map +1 -1
  23. package/dist/commands/contacts.js +321 -47
  24. package/dist/commands/contacts.js.map +1 -1
  25. package/dist/commands/interests.d.ts +5 -0
  26. package/dist/commands/interests.d.ts.map +1 -0
  27. package/dist/commands/interests.js +172 -0
  28. package/dist/commands/interests.js.map +1 -0
  29. package/dist/commands/lists.d.ts.map +1 -1
  30. package/dist/commands/lists.js +165 -30
  31. package/dist/commands/lists.js.map +1 -1
  32. package/dist/commands/logs.d.ts +5 -0
  33. package/dist/commands/logs.d.ts.map +1 -0
  34. package/dist/commands/logs.js +237 -0
  35. package/dist/commands/logs.js.map +1 -0
  36. package/dist/commands/reports.d.ts.map +1 -1
  37. package/dist/commands/reports.js +90 -13
  38. package/dist/commands/reports.js.map +1 -1
  39. package/dist/commands/segments.d.ts.map +1 -1
  40. package/dist/commands/segments.js +59 -21
  41. package/dist/commands/segments.js.map +1 -1
  42. package/dist/commands/senders.d.ts.map +1 -1
  43. package/dist/commands/senders.js +46 -12
  44. package/dist/commands/senders.js.map +1 -1
  45. package/dist/commands/suppressed.d.ts.map +1 -1
  46. package/dist/commands/suppressed.js +20 -6
  47. package/dist/commands/suppressed.js.map +1 -1
  48. package/dist/commands/tags.d.ts +5 -0
  49. package/dist/commands/tags.d.ts.map +1 -0
  50. package/dist/commands/tags.js +124 -0
  51. package/dist/commands/tags.js.map +1 -0
  52. package/dist/commands/templates.d.ts.map +1 -1
  53. package/dist/commands/templates.js +11 -3
  54. package/dist/commands/templates.js.map +1 -1
  55. package/dist/commands/transactional-templates.d.ts +5 -0
  56. package/dist/commands/transactional-templates.d.ts.map +1 -0
  57. package/dist/commands/transactional-templates.js +354 -0
  58. package/dist/commands/transactional-templates.js.map +1 -0
  59. package/dist/types/profile.d.ts +92 -0
  60. package/dist/types/profile.d.ts.map +1 -0
  61. package/dist/types/profile.js +119 -0
  62. package/dist/types/profile.js.map +1 -0
  63. package/dist/utils/auth.d.ts +33 -0
  64. package/dist/utils/auth.d.ts.map +1 -0
  65. package/dist/utils/auth.js +226 -0
  66. package/dist/utils/auth.js.map +1 -0
  67. package/dist/utils/config-file.d.ts +99 -0
  68. package/dist/utils/config-file.d.ts.map +1 -0
  69. package/dist/utils/config-file.js +259 -0
  70. package/dist/utils/config-file.js.map +1 -0
  71. package/dist/utils/config.d.ts +13 -2
  72. package/dist/utils/config.d.ts.map +1 -1
  73. package/dist/utils/config.js +82 -8
  74. package/dist/utils/config.js.map +1 -1
  75. package/dist/utils/confirm.d.ts +38 -0
  76. package/dist/utils/confirm.d.ts.map +1 -0
  77. package/dist/utils/confirm.js +124 -0
  78. package/dist/utils/confirm.js.map +1 -0
  79. package/dist/utils/defaults.d.ts +39 -0
  80. package/dist/utils/defaults.d.ts.map +1 -0
  81. package/dist/utils/defaults.js +195 -0
  82. package/dist/utils/defaults.js.map +1 -0
  83. package/dist/utils/errors.d.ts +67 -0
  84. package/dist/utils/errors.d.ts.map +1 -0
  85. package/dist/utils/errors.js +395 -0
  86. package/dist/utils/errors.js.map +1 -0
  87. package/dist/utils/interactive.d.ts +97 -0
  88. package/dist/utils/interactive.d.ts.map +1 -0
  89. package/dist/utils/interactive.js +265 -0
  90. package/dist/utils/interactive.js.map +1 -0
  91. package/dist/utils/list-defaults.d.ts +33 -0
  92. package/dist/utils/list-defaults.d.ts.map +1 -0
  93. package/dist/utils/list-defaults.js +52 -0
  94. package/dist/utils/list-defaults.js.map +1 -0
  95. package/dist/utils/output.d.ts +72 -2
  96. package/dist/utils/output.d.ts.map +1 -1
  97. package/dist/utils/output.js +407 -38
  98. package/dist/utils/output.js.map +1 -1
  99. package/dist/utils/progress.d.ts +139 -0
  100. package/dist/utils/progress.d.ts.map +1 -0
  101. package/dist/utils/progress.js +216 -0
  102. package/dist/utils/progress.js.map +1 -0
  103. package/package.json +19 -3
@@ -0,0 +1,226 @@
1
+ import inquirer from 'inquirer';
2
+ import { writeFileSync, readFileSync, existsSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { CakemailClient as SDK } from '@cakemail-org/cakemail-sdk';
5
+ import chalk from 'chalk';
6
+ import { PROFILE_DESCRIPTIONS } from '../types/profile.js';
7
+ import { updateConfigFile, configFileExists } from './config-file.js';
8
+ /**
9
+ * Prompts the user to select their profile type
10
+ */
11
+ export async function promptForProfile() {
12
+ console.log(chalk.cyan('\n✨ One more thing - let\'s personalize your experience!\n'));
13
+ console.log(chalk.white('What best describes how you\'ll use Cakemail CLI?\n'));
14
+ // Build choices from profile descriptions
15
+ const choices = Object.entries(PROFILE_DESCRIPTIONS).map(([key, info], index) => {
16
+ const description = info.description.map(d => ` ${chalk.gray('•')} ${d}`).join('\n');
17
+ return {
18
+ name: `${index + 1}. ${info.name}\n${description}\n`,
19
+ value: key,
20
+ short: info.name
21
+ };
22
+ });
23
+ const answer = await inquirer.prompt([
24
+ {
25
+ type: 'list',
26
+ name: 'profile',
27
+ message: 'Choose your profile:',
28
+ choices,
29
+ pageSize: 10
30
+ }
31
+ ]);
32
+ console.log(chalk.gray(`\n💡 You can change this anytime with: ${chalk.cyan('cakemail config profile <type>')}\n`));
33
+ return answer.profile;
34
+ }
35
+ /**
36
+ * Prompts the user for their Cakemail credentials
37
+ */
38
+ export async function promptForCredentials() {
39
+ console.log(chalk.yellow('⚠ Not authenticated'));
40
+ console.log(chalk.gray('Please enter your Cakemail credentials:\n'));
41
+ const answers = await inquirer.prompt([
42
+ {
43
+ type: 'input',
44
+ name: 'email',
45
+ message: 'Email:',
46
+ validate: (input) => {
47
+ if (!input || !input.includes('@')) {
48
+ return 'Please enter a valid email address';
49
+ }
50
+ return true;
51
+ }
52
+ },
53
+ {
54
+ type: 'password',
55
+ name: 'password',
56
+ message: 'Password:',
57
+ mask: '*',
58
+ validate: (input) => {
59
+ if (!input || input.length < 1) {
60
+ return 'Please enter your password';
61
+ }
62
+ return true;
63
+ }
64
+ }
65
+ ]);
66
+ return {
67
+ email: answers.email,
68
+ password: answers.password
69
+ };
70
+ }
71
+ /**
72
+ * Tests credentials by attempting to authenticate with the API
73
+ * Returns token information if successful
74
+ */
75
+ export async function testCredentials(email, password) {
76
+ try {
77
+ const sdk = new SDK({
78
+ email,
79
+ password,
80
+ baseURL: process.env.CAKEMAIL_API_BASE || 'https://api.cakemail.dev'
81
+ });
82
+ // Get tokens using the TokenService
83
+ const tokenResponse = await sdk.tokenService.createToken({
84
+ formData: {
85
+ grant_type: 'password',
86
+ username: email,
87
+ password: password
88
+ }
89
+ });
90
+ // Handle potential MFA challenge
91
+ if ('challenge' in tokenResponse) {
92
+ // MFA is enabled - for now we'll return false
93
+ // TODO: Implement MFA flow
94
+ console.log(chalk.yellow('⚠ Multi-factor authentication is enabled on this account'));
95
+ console.log(chalk.gray('MFA support is coming soon. Please disable MFA temporarily.'));
96
+ return { valid: false };
97
+ }
98
+ return {
99
+ valid: true,
100
+ accessToken: tokenResponse.access_token,
101
+ refreshToken: tokenResponse.refresh_token,
102
+ expiresIn: tokenResponse.expires_in,
103
+ accounts: tokenResponse.accounts
104
+ };
105
+ }
106
+ catch (error) {
107
+ return { valid: false };
108
+ }
109
+ }
110
+ /**
111
+ * Saves credentials to .env file in current working directory
112
+ */
113
+ export function saveCredentials(email, password, accountId) {
114
+ const envPath = join(process.cwd(), '.env');
115
+ let envContent = '';
116
+ // Read existing .env if it exists
117
+ if (existsSync(envPath)) {
118
+ envContent = readFileSync(envPath, 'utf-8');
119
+ }
120
+ // Parse existing env variables
121
+ const envLines = envContent.split('\n');
122
+ const envVars = {};
123
+ envLines.forEach(line => {
124
+ const match = line.match(/^([^=]+)=(.*)$/);
125
+ if (match) {
126
+ envVars[match[1].trim()] = match[2].trim();
127
+ }
128
+ });
129
+ // Update credentials
130
+ envVars['CAKEMAIL_EMAIL'] = email;
131
+ envVars['CAKEMAIL_PASSWORD'] = password;
132
+ if (accountId !== undefined) {
133
+ envVars['CAKEMAIL_CURRENT_ACCOUNT_ID'] = accountId;
134
+ }
135
+ // Rebuild .env content
136
+ const newEnvContent = Object.entries(envVars)
137
+ .map(([key, value]) => `${key}=${value}`)
138
+ .join('\n') + '\n';
139
+ writeFileSync(envPath, newEnvContent, 'utf-8');
140
+ }
141
+ /**
142
+ * Interactive authentication flow - prompts for credentials and saves them
143
+ */
144
+ export async function authenticateInteractively() {
145
+ const credentials = await promptForCredentials();
146
+ console.log(chalk.gray('\nValidating credentials...'));
147
+ const authResult = await testCredentials(credentials.email, credentials.password);
148
+ if (!authResult.valid) {
149
+ console.log(chalk.red('✗ Invalid credentials. Please try again.\n'));
150
+ // Retry
151
+ return authenticateInteractively();
152
+ }
153
+ console.log(chalk.green('✓ Authenticated'));
154
+ // Fetch account info to show welcome message
155
+ let accountId;
156
+ try {
157
+ const sdk = new SDK({
158
+ email: credentials.email,
159
+ password: credentials.password,
160
+ baseURL: process.env.CAKEMAIL_API_BASE || 'https://api.cakemail.dev'
161
+ });
162
+ const accountResponse = await sdk.accountService.getSelfAccount();
163
+ const account = accountResponse.data;
164
+ accountId = account.id;
165
+ // List all accessible accounts with count
166
+ const accountsResponse = await sdk.subAccountService.listAccounts({
167
+ partnerAccountId: parseInt(account.id),
168
+ recursive: true,
169
+ withCount: true
170
+ });
171
+ // Use actual count from pagination if available, otherwise show "X+" for first page
172
+ const subAccountCount = accountsResponse.pagination?.count ?? accountsResponse.data?.length ?? 0;
173
+ const totalAccounts = 1 + subAccountCount;
174
+ const hasMorePages = accountsResponse.pagination?.count === null && (accountsResponse.data?.length || 0) >= 50;
175
+ const accountMessage = hasMorePages
176
+ ? `Welcome! You have access to ${totalAccounts}+ accounts.`
177
+ : `Welcome! You have access to ${totalAccounts} account${totalAccounts > 1 ? 's' : ''}.`;
178
+ console.log(chalk.cyan(`\n${accountMessage}`));
179
+ if (totalAccounts > 1) {
180
+ console.log(chalk.gray(`Use 'cakemail account list' to see all accounts.`));
181
+ console.log(chalk.gray(`Use 'cakemail account use <id>' to switch accounts.`));
182
+ }
183
+ }
184
+ catch (error) {
185
+ // If we can't fetch account info, just show basic welcome
186
+ console.log(chalk.cyan('\nWelcome!\n'));
187
+ }
188
+ // Check if this is first-time setup (no config file exists yet)
189
+ const isFirstTimeSetup = !configFileExists();
190
+ // Prompt for profile selection on first-time setup
191
+ let selectedProfile;
192
+ if (isFirstTimeSetup) {
193
+ selectedProfile = await promptForProfile();
194
+ console.log(chalk.green(`✓ Profile set to: ${PROFILE_DESCRIPTIONS[selectedProfile].name}`));
195
+ }
196
+ // Save to config file (preferred) or fallback to .env
197
+ if (isFirstTimeSetup || configFileExists()) {
198
+ // Save to config file with tokens
199
+ const configUpdate = {
200
+ version: '1.0',
201
+ auth: {
202
+ method: 'token',
203
+ access_token: authResult.accessToken,
204
+ refresh_token: authResult.refreshToken,
205
+ expires_in: authResult.expiresIn,
206
+ email: credentials.email,
207
+ base_url: process.env.CAKEMAIL_API_BASE || 'https://api.cakemail.dev'
208
+ },
209
+ defaults: accountId ? { account_id: accountId } : undefined
210
+ };
211
+ // Only set profile during first-time setup to avoid overwriting user's profile choice
212
+ if (isFirstTimeSetup) {
213
+ configUpdate.profile = selectedProfile || 'balanced';
214
+ }
215
+ updateConfigFile(configUpdate);
216
+ console.log(chalk.green('✓ Configuration saved to ~/.cakemail/config.json'));
217
+ }
218
+ else {
219
+ // Fallback to .env for backward compatibility
220
+ saveCredentials(credentials.email, credentials.password, accountId);
221
+ console.log(chalk.green('✓ Credentials saved to .env'));
222
+ }
223
+ console.log(chalk.gray('\n' + '─'.repeat(50) + '\n'));
224
+ return credentials;
225
+ }
226
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Configuration File Management
3
+ *
4
+ * Handles reading/writing ~/.cakemail/config.json
5
+ * Supports migration from .env to config file
6
+ */
7
+ import { ProfileType, ProfileConfig } from '../types/profile.js';
8
+ /**
9
+ * Complete configuration file schema
10
+ */
11
+ export interface ConfigFile {
12
+ version: string;
13
+ profile?: ProfileType;
14
+ auth?: {
15
+ method?: 'password' | 'token';
16
+ email?: string;
17
+ token?: string;
18
+ access_token?: string;
19
+ refresh_token?: string;
20
+ expires_in?: number;
21
+ base_url?: string;
22
+ };
23
+ profiles?: {
24
+ developer?: Partial<ProfileConfig>;
25
+ marketer?: Partial<ProfileConfig>;
26
+ balanced?: Partial<ProfileConfig>;
27
+ custom?: Partial<ProfileConfig>;
28
+ };
29
+ defaults?: {
30
+ list_id?: number;
31
+ sender_id?: number;
32
+ account_id?: string;
33
+ };
34
+ }
35
+ /**
36
+ * Ensure config directory exists
37
+ */
38
+ export declare function ensureConfigDir(): void;
39
+ /**
40
+ * Check if config file exists
41
+ */
42
+ export declare function configFileExists(): boolean;
43
+ /**
44
+ * Load config file
45
+ * Returns undefined if file doesn't exist
46
+ */
47
+ export declare function loadConfigFile(): ConfigFile | undefined;
48
+ /**
49
+ * Save config file
50
+ */
51
+ export declare function saveConfigFile(config: ConfigFile): void;
52
+ /**
53
+ * Update config file (merge with existing)
54
+ */
55
+ export declare function updateConfigFile(updates: Partial<ConfigFile>): void;
56
+ /**
57
+ * Get current profile from config file
58
+ */
59
+ export declare function getCurrentProfile(): ProfileType;
60
+ /**
61
+ * Set current profile in config file
62
+ */
63
+ export declare function setCurrentProfile(profile: ProfileType): void;
64
+ /**
65
+ * Get profile configuration
66
+ * Merges default profile with custom overrides
67
+ */
68
+ export declare function getProfileConfig(profileType?: ProfileType): ProfileConfig;
69
+ /**
70
+ * Set a custom profile config value
71
+ * Example: setProfileConfigValue('output.format', 'table')
72
+ */
73
+ export declare function setProfileConfigValue(key: string, value: any): void;
74
+ /**
75
+ * Reset custom profile config
76
+ */
77
+ export declare function resetProfileConfig(): void;
78
+ /**
79
+ * Migrate .env to config file
80
+ * This runs once when user first upgrades to profile system
81
+ */
82
+ export declare function migrateFromEnv(): ConfigFile | undefined;
83
+ /**
84
+ * Get defaults (list_id, sender_id, account_id)
85
+ */
86
+ export declare function getDefaults(): {
87
+ list_id?: number;
88
+ sender_id?: number;
89
+ account_id?: string;
90
+ };
91
+ /**
92
+ * Set a default value
93
+ */
94
+ export declare function setDefault(key: 'list_id' | 'sender_id' | 'account_id', value: number | string): void;
95
+ /**
96
+ * Delete the configuration file (logout)
97
+ */
98
+ export declare function deleteConfigFile(): boolean;
99
+ //# sourceMappingURL=config-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-file.d.ts","sourceRoot":"","sources":["../../src/utils/config-file.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AAKpF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QACnC,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAClC,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;KACjC,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,UAAU,GAAG,SAAS,CAYvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CASvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAInE;AAeD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAG/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAE5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,aAAa,CAmBzE;AAsBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CA0BnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CASzC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,UAAU,GAAG,SAAS,CAsDvD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAO3F;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,SAAS,GAAG,WAAW,GAAG,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcpG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAW1C"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Configuration File Management
3
+ *
4
+ * Handles reading/writing ~/.cakemail/config.json
5
+ * Supports migration from .env to config file
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import { getDefaultProfile } from '../types/profile.js';
11
+ const CONFIG_DIR = path.join(os.homedir(), '.cakemail');
12
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
13
+ /**
14
+ * Ensure config directory exists
15
+ */
16
+ export function ensureConfigDir() {
17
+ if (!fs.existsSync(CONFIG_DIR)) {
18
+ fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
19
+ }
20
+ }
21
+ /**
22
+ * Check if config file exists
23
+ */
24
+ export function configFileExists() {
25
+ return fs.existsSync(CONFIG_FILE);
26
+ }
27
+ /**
28
+ * Load config file
29
+ * Returns undefined if file doesn't exist
30
+ */
31
+ export function loadConfigFile() {
32
+ if (!configFileExists()) {
33
+ return undefined;
34
+ }
35
+ try {
36
+ const content = fs.readFileSync(CONFIG_FILE, 'utf-8');
37
+ return JSON.parse(content);
38
+ }
39
+ catch (error) {
40
+ console.error(`Error reading config file: ${error}`);
41
+ return undefined;
42
+ }
43
+ }
44
+ /**
45
+ * Save config file
46
+ */
47
+ export function saveConfigFile(config) {
48
+ ensureConfigDir();
49
+ try {
50
+ const content = JSON.stringify(config, null, 2);
51
+ fs.writeFileSync(CONFIG_FILE, content, { mode: 0o600 });
52
+ }
53
+ catch (error) {
54
+ throw new Error(`Failed to save config file: ${error}`);
55
+ }
56
+ }
57
+ /**
58
+ * Update config file (merge with existing)
59
+ */
60
+ export function updateConfigFile(updates) {
61
+ const existing = loadConfigFile() || { version: '1.0' };
62
+ const merged = mergeConfig(existing, updates);
63
+ saveConfigFile(merged);
64
+ }
65
+ /**
66
+ * Deep merge two config objects
67
+ */
68
+ function mergeConfig(base, updates) {
69
+ return {
70
+ ...base,
71
+ ...updates,
72
+ auth: updates.auth ? { ...base.auth, ...updates.auth } : base.auth,
73
+ profiles: updates.profiles ? { ...base.profiles, ...updates.profiles } : base.profiles,
74
+ defaults: updates.defaults ? { ...base.defaults, ...updates.defaults } : base.defaults,
75
+ };
76
+ }
77
+ /**
78
+ * Get current profile from config file
79
+ */
80
+ export function getCurrentProfile() {
81
+ const config = loadConfigFile();
82
+ return config?.profile || 'balanced';
83
+ }
84
+ /**
85
+ * Set current profile in config file
86
+ */
87
+ export function setCurrentProfile(profile) {
88
+ updateConfigFile({ profile });
89
+ }
90
+ /**
91
+ * Get profile configuration
92
+ * Merges default profile with custom overrides
93
+ */
94
+ export function getProfileConfig(profileType) {
95
+ const profile = profileType || getCurrentProfile();
96
+ const defaults = getDefaultProfile(profile);
97
+ const config = loadConfigFile();
98
+ // No config file, return defaults
99
+ if (!config) {
100
+ return defaults;
101
+ }
102
+ // Merge profile-specific overrides
103
+ const profileOverrides = config.profiles?.[profile];
104
+ const customOverrides = config.profiles?.custom;
105
+ return mergeProfileConfig(defaults, profileOverrides || {}, customOverrides || {});
106
+ }
107
+ /**
108
+ * Deep merge profile configurations
109
+ */
110
+ function mergeProfileConfig(base, ...overrides) {
111
+ let result = { ...base };
112
+ for (const override of overrides) {
113
+ result = {
114
+ output: { ...result.output, ...override.output },
115
+ behavior: { ...result.behavior, ...override.behavior },
116
+ display: { ...result.display, ...override.display },
117
+ };
118
+ }
119
+ return result;
120
+ }
121
+ /**
122
+ * Set a custom profile config value
123
+ * Example: setProfileConfigValue('output.format', 'table')
124
+ */
125
+ export function setProfileConfigValue(key, value) {
126
+ const config = loadConfigFile() || { version: '1.0' };
127
+ if (!config.profiles) {
128
+ config.profiles = {};
129
+ }
130
+ if (!config.profiles.custom) {
131
+ config.profiles.custom = {};
132
+ }
133
+ // Parse nested key (e.g., "output.format")
134
+ const parts = key.split('.');
135
+ let target = config.profiles.custom;
136
+ for (let i = 0; i < parts.length - 1; i++) {
137
+ const part = parts[i];
138
+ if (!target[part]) {
139
+ target[part] = {};
140
+ }
141
+ target = target[part];
142
+ }
143
+ target[parts[parts.length - 1]] = value;
144
+ saveConfigFile(config);
145
+ }
146
+ /**
147
+ * Reset custom profile config
148
+ */
149
+ export function resetProfileConfig() {
150
+ const config = loadConfigFile();
151
+ if (!config)
152
+ return;
153
+ if (config.profiles) {
154
+ delete config.profiles.custom;
155
+ }
156
+ saveConfigFile(config);
157
+ }
158
+ /**
159
+ * Migrate .env to config file
160
+ * This runs once when user first upgrades to profile system
161
+ */
162
+ export function migrateFromEnv() {
163
+ // Check if config already exists
164
+ if (configFileExists()) {
165
+ return loadConfigFile();
166
+ }
167
+ // Try to read from .env
168
+ const envPath = path.join(process.cwd(), '.env');
169
+ if (!fs.existsSync(envPath)) {
170
+ return undefined;
171
+ }
172
+ const config = {
173
+ version: '1.0',
174
+ profile: 'balanced', // Default for existing users
175
+ };
176
+ // Read .env file
177
+ const envContent = fs.readFileSync(envPath, 'utf-8');
178
+ const lines = envContent.split('\n');
179
+ for (const line of lines) {
180
+ const trimmed = line.trim();
181
+ if (!trimmed || trimmed.startsWith('#'))
182
+ continue;
183
+ const [key, value] = trimmed.split('=').map(s => s.trim());
184
+ if (!key || !value)
185
+ continue;
186
+ // Remove quotes
187
+ const cleanValue = value.replace(/^["']|["']$/g, '');
188
+ // Map env vars to config
189
+ if (key === 'CAKEMAIL_EMAIL' || key === 'CAKEMAIL_USERNAME') {
190
+ if (!config.auth)
191
+ config.auth = {};
192
+ config.auth.email = cleanValue;
193
+ }
194
+ else if (key === 'CAKEMAIL_ACCESS_TOKEN') {
195
+ if (!config.auth)
196
+ config.auth = {};
197
+ config.auth.token = cleanValue;
198
+ }
199
+ else if (key === 'CAKEMAIL_API_BASE') {
200
+ if (!config.auth)
201
+ config.auth = {};
202
+ config.auth.base_url = cleanValue;
203
+ }
204
+ else if (key === 'CAKEMAIL_CURRENT_ACCOUNT_ID') {
205
+ if (!config.defaults)
206
+ config.defaults = {};
207
+ config.defaults.account_id = cleanValue;
208
+ }
209
+ }
210
+ // Save migrated config
211
+ if (config.auth) {
212
+ saveConfigFile(config);
213
+ return config;
214
+ }
215
+ return undefined;
216
+ }
217
+ /**
218
+ * Get defaults (list_id, sender_id, account_id)
219
+ */
220
+ export function getDefaults() {
221
+ const config = loadConfigFile();
222
+ return {
223
+ list_id: config?.defaults?.list_id,
224
+ sender_id: config?.defaults?.sender_id,
225
+ account_id: config?.defaults?.account_id,
226
+ };
227
+ }
228
+ /**
229
+ * Set a default value
230
+ */
231
+ export function setDefault(key, value) {
232
+ const config = loadConfigFile() || { version: '1.0' };
233
+ if (!config.defaults) {
234
+ config.defaults = {};
235
+ }
236
+ if (key === 'account_id') {
237
+ config.defaults.account_id = value;
238
+ }
239
+ else {
240
+ config.defaults[key] = value;
241
+ }
242
+ saveConfigFile(config);
243
+ }
244
+ /**
245
+ * Delete the configuration file (logout)
246
+ */
247
+ export function deleteConfigFile() {
248
+ if (!configFileExists()) {
249
+ return false;
250
+ }
251
+ try {
252
+ fs.unlinkSync(CONFIG_FILE);
253
+ return true;
254
+ }
255
+ catch (error) {
256
+ throw new Error(`Failed to delete config file: ${error}`);
257
+ }
258
+ }
259
+ //# sourceMappingURL=config-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-file.js","sourceRoot":"","sources":["../../src/utils/config-file.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,18 @@
1
1
  import { CakemailConfig } from '../client.js';
2
- export type OutputFormat = 'json' | 'table' | 'compact';
2
+ import { ProfileType, ProfileConfig, OutputFormat } from '../types/profile.js';
3
+ export type { OutputFormat, ProfileType, ProfileConfig };
3
4
  export interface FullConfig extends CakemailConfig {
4
5
  outputFormat?: OutputFormat;
6
+ currentAccountId?: string;
7
+ profile?: ProfileType;
8
+ profileConfig?: ProfileConfig;
9
+ refreshToken?: string;
10
+ expiresIn?: number;
5
11
  }
6
- export declare function getConfig(required?: boolean): FullConfig;
12
+ export declare function getConfig(required?: boolean, interactive?: boolean): Promise<FullConfig>;
13
+ /**
14
+ * Synchronous version of getConfig for backwards compatibility
15
+ * Use this only when you're certain credentials are already set
16
+ */
17
+ export declare function getConfigSync(required?: boolean): FullConfig;
7
18
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAK9C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,wBAAgB,SAAS,CAAC,QAAQ,GAAE,OAAc,GAAG,UAAU,CAoB9D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAa/E,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAEzD,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,SAAS,CAAC,QAAQ,GAAE,OAAc,EAAE,WAAW,GAAE,OAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAyD1G;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,GAAE,OAAc,GAAG,UAAU,CA2ClE"}