@@ -15,67 +15,78 @@ export interface CliConfig {
1515 * Load configuration.
1616 *
1717 * Resolution order:
18- * 1. ITERABLE_API_KEY env var (if set, use directly -- enables CI/scripting override )
19- * 2. Key manager active key
20- * 3. Error with guidance
18+ * 1. --key flag (specific stored key by name or ID )
19+ * 2. ITERABLE_API_KEY env var (enables CI/scripting override)
20+ * 3. Key manager active key
2121 */
22- export async function loadCliConfig ( ) : Promise < CliConfig > {
23- const baseUrlFromEnv =
24- process . env . ITERABLE_BASE_URL ?? "https://api.iterable.com" ;
22+ const DEFAULT_BASE_URL = "https://api.iterable.com" ;
23+
24+ export async function loadCliConfig ( keyNameOrId ?: string ) : Promise < CliConfig > {
25+ if ( keyNameOrId && ! isTestEnv ( ) ) {
26+ const keyManager = getKeyManager ( ) ;
27+ const keys = await keyManager . listKeys ( ) ;
28+ const keyMeta = keys . find (
29+ ( k ) => k . name === keyNameOrId || k . id === keyNameOrId
30+ ) ;
31+ if ( ! keyMeta ) {
32+ throw new CliError (
33+ `Key not found: "${ keyNameOrId } ". Run "${ COMMAND_NAME } keys list" to see available keys.` ,
34+ 2
35+ ) ;
36+ }
37+ const apiKey = await keyManager . getKey ( keyMeta . id ) ;
38+ if ( ! apiKey ) {
39+ throw new CliError (
40+ `Failed to retrieve key "${ keyNameOrId } ". Try "${ COMMAND_NAME } keys update ${ keyNameOrId } ".` ,
41+ 1
42+ ) ;
43+ }
44+ return { apiKey, baseUrl : keyMeta . baseUrl } ;
45+ }
2546
2647 if ( process . env . ITERABLE_API_KEY ) {
27- return { apiKey : process . env . ITERABLE_API_KEY , baseUrl : baseUrlFromEnv } ;
48+ return {
49+ apiKey : process . env . ITERABLE_API_KEY ,
50+ baseUrl : process . env . ITERABLE_BASE_URL ?? DEFAULT_BASE_URL ,
51+ } ;
2852 }
2953
3054 if ( ! isTestEnv ( ) ) {
3155 try {
3256 const keyManager = getKeyManager ( ) ;
33- await keyManager . initialize ( ) ;
3457
3558 if ( await keyManager . hasKeys ( ) ) {
3659 if ( ! ( await keyManager . hasActiveKey ( ) ) ) {
3760 throw new CliError (
38- `No active API key. Run "${ COMMAND_NAME } keys activate <name>" to activate one , or set ITERABLE_API_KEY environment variable .` ,
61+ `No active API key. Run "${ COMMAND_NAME } keys activate <name>", use --key <name> , or set ITERABLE_API_KEY.` ,
3962 2
4063 ) ;
4164 }
4265 const apiKey = await keyManager . getActiveKey ( ) ;
43- if ( apiKey ) {
44- let baseUrl = baseUrlFromEnv ;
45- const meta = await keyManager . getActiveKeyMetadata ( ) ;
46- if ( meta ?. baseUrl ) {
47- baseUrl = meta . baseUrl ;
48- }
49- return { apiKey, baseUrl } ;
66+ const meta = await keyManager . getActiveKeyMetadata ( ) ;
67+ if ( apiKey && meta ) {
68+ return { apiKey, baseUrl : meta . baseUrl } ;
5069 }
5170 }
5271 } catch ( error : unknown ) {
5372 if ( error instanceof CliError ) throw error ;
5473
55- const errorMessage =
56- error instanceof Error ? error . message : String ( error ) ;
57-
58- if (
59- errorMessage . includes ( "Key store not initialized" ) ||
60- errorMessage . includes ( "No API key found" )
61- ) {
62- logger . debug ( "No keys in key manager, falling back to error" ) ;
63- } else {
64- const sanitizedMessage = sanitizeString ( errorMessage ) ;
65- logger . error ( "Unexpected error loading from key manager" , {
66- error : sanitizedMessage ,
67- } ) ;
68- console . error (
69- // eslint-disable-line no-console
70- "Warning: Failed to load API key from key storage:" ,
71- sanitizedMessage
72- ) ;
73- }
74+ const sanitizedMessage = sanitizeString (
75+ error instanceof Error ? error . message : String ( error )
76+ ) ;
77+ logger . error ( "Failed to load from key manager" , {
78+ error : sanitizedMessage ,
79+ } ) ;
80+ console . error (
81+ // eslint-disable-line no-console
82+ "Warning: Failed to load API key from key storage:" ,
83+ sanitizedMessage
84+ ) ;
7485 }
7586 }
7687
7788 throw new CliError (
78- `No API key found. Run "${ COMMAND_NAME } keys add" to add one, or set ITERABLE_API_KEY environment variable .` ,
89+ `No API key found. Run "${ COMMAND_NAME } keys add" to add one, or set ITERABLE_API_KEY.` ,
7990 2
8091 ) ;
8192}
0 commit comments