@cakemail-org/cakemail-cli 1.2.0 → 1.5.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/README.md +140 -0
- package/dist/cli.js +48 -6
- package/dist/cli.js.map +1 -1
- package/dist/client.js +0 -2
- package/dist/client.js.map +1 -1
- package/dist/commands/account.d.ts +5 -0
- package/dist/commands/account.d.ts.map +1 -0
- package/dist/commands/account.js +231 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/attributes.d.ts +5 -0
- package/dist/commands/attributes.d.ts.map +1 -0
- package/dist/commands/attributes.js +126 -0
- package/dist/commands/attributes.js.map +1 -0
- package/dist/commands/campaigns.d.ts.map +1 -1
- package/dist/commands/campaigns.js +153 -19
- package/dist/commands/campaigns.js.map +1 -1
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +235 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +436 -14
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/emails.d.ts.map +1 -1
- package/dist/commands/emails.js +53 -0
- package/dist/commands/emails.js.map +1 -1
- package/dist/commands/lists.d.ts.map +1 -1
- package/dist/commands/lists.js +282 -11
- package/dist/commands/lists.js.map +1 -1
- package/dist/commands/reports.d.ts +5 -0
- package/dist/commands/reports.d.ts.map +1 -0
- package/dist/commands/reports.js +334 -0
- package/dist/commands/reports.js.map +1 -0
- package/dist/commands/segments.d.ts +5 -0
- package/dist/commands/segments.d.ts.map +1 -0
- package/dist/commands/segments.js +203 -0
- package/dist/commands/segments.js.map +1 -0
- package/dist/commands/senders.d.ts.map +1 -1
- package/dist/commands/senders.js +36 -5
- package/dist/commands/senders.js.map +1 -1
- package/dist/commands/suppressed.d.ts +5 -0
- package/dist/commands/suppressed.d.ts.map +1 -0
- package/dist/commands/suppressed.js +193 -0
- package/dist/commands/suppressed.js.map +1 -0
- package/dist/commands/templates.d.ts.map +1 -1
- package/dist/commands/templates.js +11 -3
- package/dist/commands/templates.js.map +1 -1
- package/dist/types/profile.d.ts +92 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +119 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/utils/auth.d.ts +26 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +198 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/config-file.d.ts +92 -0
- package/dist/utils/config-file.d.ts.map +1 -0
- package/dist/utils/config-file.js +244 -0
- package/dist/utils/config-file.js.map +1 -0
- package/dist/utils/config.d.ts +11 -2
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +74 -8
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/confirm.d.ts +38 -0
- package/dist/utils/confirm.d.ts.map +1 -0
- package/dist/utils/confirm.js +124 -0
- package/dist/utils/confirm.js.map +1 -0
- package/dist/utils/defaults.d.ts +39 -0
- package/dist/utils/defaults.d.ts.map +1 -0
- package/dist/utils/defaults.js +195 -0
- package/dist/utils/defaults.js.map +1 -0
- package/dist/utils/errors.d.ts +67 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +395 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/interactive.d.ts +97 -0
- package/dist/utils/interactive.d.ts.map +1 -0
- package/dist/utils/interactive.js +265 -0
- package/dist/utils/interactive.js.map +1 -0
- package/dist/utils/output.d.ts +72 -2
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +383 -37
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/progress.d.ts +139 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +216 -0
- package/dist/utils/progress.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,198 @@
|
|
|
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
|
+
*/
|
|
74
|
+
export async function testCredentials(email, password) {
|
|
75
|
+
try {
|
|
76
|
+
const sdk = new SDK({
|
|
77
|
+
email,
|
|
78
|
+
password,
|
|
79
|
+
baseURL: process.env.CAKEMAIL_API_BASE || 'https://api.cakemail.dev'
|
|
80
|
+
});
|
|
81
|
+
// Test credentials by fetching account info
|
|
82
|
+
await sdk.accountService.getSelfAccount();
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Saves credentials to .env file in current working directory
|
|
91
|
+
*/
|
|
92
|
+
export function saveCredentials(email, password, accountId) {
|
|
93
|
+
const envPath = join(process.cwd(), '.env');
|
|
94
|
+
let envContent = '';
|
|
95
|
+
// Read existing .env if it exists
|
|
96
|
+
if (existsSync(envPath)) {
|
|
97
|
+
envContent = readFileSync(envPath, 'utf-8');
|
|
98
|
+
}
|
|
99
|
+
// Parse existing env variables
|
|
100
|
+
const envLines = envContent.split('\n');
|
|
101
|
+
const envVars = {};
|
|
102
|
+
envLines.forEach(line => {
|
|
103
|
+
const match = line.match(/^([^=]+)=(.*)$/);
|
|
104
|
+
if (match) {
|
|
105
|
+
envVars[match[1].trim()] = match[2].trim();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// Update credentials
|
|
109
|
+
envVars['CAKEMAIL_EMAIL'] = email;
|
|
110
|
+
envVars['CAKEMAIL_PASSWORD'] = password;
|
|
111
|
+
if (accountId !== undefined) {
|
|
112
|
+
envVars['CAKEMAIL_CURRENT_ACCOUNT_ID'] = accountId;
|
|
113
|
+
}
|
|
114
|
+
// Rebuild .env content
|
|
115
|
+
const newEnvContent = Object.entries(envVars)
|
|
116
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
117
|
+
.join('\n') + '\n';
|
|
118
|
+
writeFileSync(envPath, newEnvContent, 'utf-8');
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Interactive authentication flow - prompts for credentials and saves them
|
|
122
|
+
*/
|
|
123
|
+
export async function authenticateInteractively() {
|
|
124
|
+
const credentials = await promptForCredentials();
|
|
125
|
+
console.log(chalk.gray('\nValidating credentials...'));
|
|
126
|
+
const isValid = await testCredentials(credentials.email, credentials.password);
|
|
127
|
+
if (!isValid) {
|
|
128
|
+
console.log(chalk.red('✗ Invalid credentials. Please try again.\n'));
|
|
129
|
+
// Retry
|
|
130
|
+
return authenticateInteractively();
|
|
131
|
+
}
|
|
132
|
+
console.log(chalk.green('✓ Authenticated'));
|
|
133
|
+
// Fetch account info to show welcome message
|
|
134
|
+
let accountId;
|
|
135
|
+
try {
|
|
136
|
+
const sdk = new SDK({
|
|
137
|
+
email: credentials.email,
|
|
138
|
+
password: credentials.password,
|
|
139
|
+
baseURL: process.env.CAKEMAIL_API_BASE || 'https://api.cakemail.dev'
|
|
140
|
+
});
|
|
141
|
+
const accountResponse = await sdk.accountService.getSelfAccount();
|
|
142
|
+
const account = accountResponse.data;
|
|
143
|
+
accountId = account.id;
|
|
144
|
+
// List all accessible accounts with count
|
|
145
|
+
const accountsResponse = await sdk.subAccountService.listAccounts({
|
|
146
|
+
partnerAccountId: parseInt(account.id),
|
|
147
|
+
recursive: true,
|
|
148
|
+
withCount: true
|
|
149
|
+
});
|
|
150
|
+
// Use actual count from pagination if available, otherwise show "X+" for first page
|
|
151
|
+
const subAccountCount = accountsResponse.pagination?.count ?? accountsResponse.data?.length ?? 0;
|
|
152
|
+
const totalAccounts = 1 + subAccountCount;
|
|
153
|
+
const hasMorePages = accountsResponse.pagination?.count === null && (accountsResponse.data?.length || 0) >= 50;
|
|
154
|
+
const accountMessage = hasMorePages
|
|
155
|
+
? `Welcome! You have access to ${totalAccounts}+ accounts.`
|
|
156
|
+
: `Welcome! You have access to ${totalAccounts} account${totalAccounts > 1 ? 's' : ''}.`;
|
|
157
|
+
console.log(chalk.cyan(`\n${accountMessage}`));
|
|
158
|
+
if (totalAccounts > 1) {
|
|
159
|
+
console.log(chalk.gray(`Use 'cakemail account list' to see all accounts.`));
|
|
160
|
+
console.log(chalk.gray(`Use 'cakemail account use <id>' to switch accounts.`));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
// If we can't fetch account info, just show basic welcome
|
|
165
|
+
console.log(chalk.cyan('\nWelcome!\n'));
|
|
166
|
+
}
|
|
167
|
+
// Check if this is first-time setup (no config file exists yet)
|
|
168
|
+
const isFirstTimeSetup = !configFileExists();
|
|
169
|
+
// Prompt for profile selection on first-time setup
|
|
170
|
+
let selectedProfile;
|
|
171
|
+
if (isFirstTimeSetup) {
|
|
172
|
+
selectedProfile = await promptForProfile();
|
|
173
|
+
console.log(chalk.green(`✓ Profile set to: ${PROFILE_DESCRIPTIONS[selectedProfile].name}`));
|
|
174
|
+
}
|
|
175
|
+
// Save to config file (preferred) or fallback to .env
|
|
176
|
+
if (isFirstTimeSetup || configFileExists()) {
|
|
177
|
+
// Save to config file
|
|
178
|
+
updateConfigFile({
|
|
179
|
+
version: '1.0',
|
|
180
|
+
profile: selectedProfile || 'balanced',
|
|
181
|
+
auth: {
|
|
182
|
+
method: 'password',
|
|
183
|
+
email: credentials.email,
|
|
184
|
+
base_url: process.env.CAKEMAIL_API_BASE || 'https://api.cakemail.dev'
|
|
185
|
+
},
|
|
186
|
+
defaults: accountId ? { account_id: accountId } : undefined
|
|
187
|
+
});
|
|
188
|
+
console.log(chalk.green('✓ Configuration saved to ~/.cakemail/config.json'));
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// Fallback to .env for backward compatibility
|
|
192
|
+
saveCredentials(credentials.email, credentials.password, accountId);
|
|
193
|
+
console.log(chalk.green('✓ Credentials saved to .env'));
|
|
194
|
+
}
|
|
195
|
+
console.log(chalk.gray('\n' + '─'.repeat(50) + '\n'));
|
|
196
|
+
return credentials;
|
|
197
|
+
}
|
|
198
|
+
//# 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,92 @@
|
|
|
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
|
+
base_url?: string;
|
|
19
|
+
};
|
|
20
|
+
profiles?: {
|
|
21
|
+
developer?: Partial<ProfileConfig>;
|
|
22
|
+
marketer?: Partial<ProfileConfig>;
|
|
23
|
+
balanced?: Partial<ProfileConfig>;
|
|
24
|
+
custom?: Partial<ProfileConfig>;
|
|
25
|
+
};
|
|
26
|
+
defaults?: {
|
|
27
|
+
list_id?: number;
|
|
28
|
+
sender_id?: number;
|
|
29
|
+
account_id?: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Ensure config directory exists
|
|
34
|
+
*/
|
|
35
|
+
export declare function ensureConfigDir(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Check if config file exists
|
|
38
|
+
*/
|
|
39
|
+
export declare function configFileExists(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Load config file
|
|
42
|
+
* Returns undefined if file doesn't exist
|
|
43
|
+
*/
|
|
44
|
+
export declare function loadConfigFile(): ConfigFile | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Save config file
|
|
47
|
+
*/
|
|
48
|
+
export declare function saveConfigFile(config: ConfigFile): void;
|
|
49
|
+
/**
|
|
50
|
+
* Update config file (merge with existing)
|
|
51
|
+
*/
|
|
52
|
+
export declare function updateConfigFile(updates: Partial<ConfigFile>): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get current profile from config file
|
|
55
|
+
*/
|
|
56
|
+
export declare function getCurrentProfile(): ProfileType;
|
|
57
|
+
/**
|
|
58
|
+
* Set current profile in config file
|
|
59
|
+
*/
|
|
60
|
+
export declare function setCurrentProfile(profile: ProfileType): void;
|
|
61
|
+
/**
|
|
62
|
+
* Get profile configuration
|
|
63
|
+
* Merges default profile with custom overrides
|
|
64
|
+
*/
|
|
65
|
+
export declare function getProfileConfig(profileType?: ProfileType): ProfileConfig;
|
|
66
|
+
/**
|
|
67
|
+
* Set a custom profile config value
|
|
68
|
+
* Example: setProfileConfigValue('output.format', 'table')
|
|
69
|
+
*/
|
|
70
|
+
export declare function setProfileConfigValue(key: string, value: any): void;
|
|
71
|
+
/**
|
|
72
|
+
* Reset custom profile config
|
|
73
|
+
*/
|
|
74
|
+
export declare function resetProfileConfig(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Migrate .env to config file
|
|
77
|
+
* This runs once when user first upgrades to profile system
|
|
78
|
+
*/
|
|
79
|
+
export declare function migrateFromEnv(): ConfigFile | undefined;
|
|
80
|
+
/**
|
|
81
|
+
* Get defaults (list_id, sender_id, account_id)
|
|
82
|
+
*/
|
|
83
|
+
export declare function getDefaults(): {
|
|
84
|
+
list_id?: number;
|
|
85
|
+
sender_id?: number;
|
|
86
|
+
account_id?: string;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Set a default value
|
|
90
|
+
*/
|
|
91
|
+
export declare function setDefault(key: 'list_id' | 'sender_id' | 'account_id', value: number | string): void;
|
|
92
|
+
//# 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,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"}
|
|
@@ -0,0 +1,244 @@
|
|
|
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
|
+
//# sourceMappingURL=config-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-file.js","sourceRoot":"","sources":["../../src/utils/config-file.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAA8B,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEpF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AA2BzD;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QACrD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB;IAC/C,eAAe,EAAE,CAAC;IAElB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA4B;IAC3D,MAAM,QAAQ,GAAG,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,cAAc,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,IAAgB,EAAE,OAA4B;IACjE,OAAO;QACL,GAAG,IAAI;QACP,GAAG,OAAO;QACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;QAClE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;QACtF,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;KACvF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,OAAO,MAAM,EAAE,OAAO,IAAI,UAAU,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IACpD,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAyB;IACxD,MAAM,OAAO,GAAG,WAAW,IAAI,iBAAiB,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAEhC,kCAAkC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,mCAAmC;IACnC,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;IAEhD,OAAO,kBAAkB,CACvB,QAAQ,EACR,gBAAgB,IAAI,EAAE,EACtB,eAAe,IAAI,EAAE,CACtB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACzB,IAAmB,EACnB,GAAG,SAAmC;IAEtC,IAAI,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAEzB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,GAAG;YACP,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE;YAChD,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE;YACtD,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE;SACpD,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,KAAU;IAC3D,MAAM,MAAM,GAAG,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAEtD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED,2CAA2C;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,GAAQ,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAExC,cAAc,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,cAAc,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,iCAAiC;IACjC,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,wBAAwB;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAe;QACzB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,UAAU,EAAE,6BAA6B;KACnD,CAAC;IAEF,iBAAiB;IACjB,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElD,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK;YAAE,SAAS;QAE7B,gBAAgB;QAChB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAErD,yBAAyB;QACzB,IAAI,GAAG,KAAK,gBAAgB,IAAI,GAAG,KAAK,mBAAmB,EAAE,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACjC,CAAC;aAAM,IAAI,GAAG,KAAK,uBAAuB,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACjC,CAAC;aAAM,IAAI,GAAG,KAAK,mBAAmB,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;QACpC,CAAC;aAAM,IAAI,GAAG,KAAK,6BAA6B,EAAE,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;QAClC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS;QACtC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;KACzC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAA2C,EAAE,KAAsB;IAC5F,MAAM,MAAM,GAAG,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAEtD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,KAAe,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAe,CAAC;IACzC,CAAC;IAED,cAAc,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
|
package/dist/utils/config.d.ts
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import { CakemailConfig } from '../client.js';
|
|
2
|
-
|
|
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;
|
|
5
9
|
}
|
|
6
|
-
export declare function getConfig(required?: boolean): FullConfig
|
|
10
|
+
export declare function getConfig(required?: boolean, interactive?: boolean): Promise<FullConfig>;
|
|
11
|
+
/**
|
|
12
|
+
* Synchronous version of getConfig for backwards compatibility
|
|
13
|
+
* Use this only when you're certain credentials are already set
|
|
14
|
+
*/
|
|
15
|
+
export declare function getConfigSync(required?: boolean): FullConfig;
|
|
7
16
|
//# 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;
|
|
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;CAC/B;AAED,wBAAsB,SAAS,CAAC,QAAQ,GAAE,OAAc,EAAE,WAAW,GAAE,OAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAqD1G;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,GAAE,OAAc,GAAG,UAAU,CAuClE"}
|