@norrix/cli 0.0.50 → 0.0.51
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/dist/lib/ascii-art.d.ts +8 -0
- package/dist/lib/ascii-art.js +219 -0
- package/dist/lib/ascii-art.js.map +1 -0
- package/dist/lib/commands.js +595 -334
- package/dist/lib/commands.js.map +1 -1
- package/dist/lib/config-tracker.d.ts +41 -0
- package/dist/lib/config-tracker.js +58 -0
- package/dist/lib/config-tracker.js.map +1 -0
- package/dist/lib/config.d.ts +8 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/org-env-helper.d.ts +30 -0
- package/dist/lib/org-env-helper.js +78 -0
- package/dist/lib/org-env-helper.js.map +1 -0
- package/dist/lib/smart-prompt.d.ts +79 -0
- package/dist/lib/smart-prompt.js +131 -0
- package/dist/lib/smart-prompt.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ValueSource } from './smart-prompt.js';
|
|
2
|
+
/**
|
|
3
|
+
* Tracks which credential values were manually provided by the user
|
|
4
|
+
* (not from org env vars or config file) so we can offer to save them
|
|
5
|
+
* to norrix.config.ts after the command completes.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ConfigValueTracker {
|
|
8
|
+
private userProvidedValues;
|
|
9
|
+
/**
|
|
10
|
+
* Track a credential value and its source.
|
|
11
|
+
* Only stores values that came from user input.
|
|
12
|
+
*
|
|
13
|
+
* @param name - Field name (e.g., 'ascApiKeyId')
|
|
14
|
+
* @param value - The value (or undefined if using org env var)
|
|
15
|
+
* @param source - Where the value came from
|
|
16
|
+
*/
|
|
17
|
+
track(name: string, value: string | undefined, source: ValueSource): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get all user-provided values as a plain object.
|
|
20
|
+
* Useful for saving to norrix.config.ts.
|
|
21
|
+
*
|
|
22
|
+
* @returns Object mapping field names to values
|
|
23
|
+
*/
|
|
24
|
+
getUserProvidedValues(): Record<string, string>;
|
|
25
|
+
/**
|
|
26
|
+
* Check if there are any user-provided values worth saving.
|
|
27
|
+
*
|
|
28
|
+
* @returns true if we should offer to save values to config
|
|
29
|
+
*/
|
|
30
|
+
shouldOfferToSave(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Get the count of user-provided values.
|
|
33
|
+
*
|
|
34
|
+
* @returns Number of values tracked
|
|
35
|
+
*/
|
|
36
|
+
getCount(): number;
|
|
37
|
+
/**
|
|
38
|
+
* Clear all tracked values.
|
|
39
|
+
*/
|
|
40
|
+
clear(): void;
|
|
41
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks which credential values were manually provided by the user
|
|
3
|
+
* (not from org env vars or config file) so we can offer to save them
|
|
4
|
+
* to norrix.config.ts after the command completes.
|
|
5
|
+
*/
|
|
6
|
+
export class ConfigValueTracker {
|
|
7
|
+
userProvidedValues = new Map();
|
|
8
|
+
/**
|
|
9
|
+
* Track a credential value and its source.
|
|
10
|
+
* Only stores values that came from user input.
|
|
11
|
+
*
|
|
12
|
+
* @param name - Field name (e.g., 'ascApiKeyId')
|
|
13
|
+
* @param value - The value (or undefined if using org env var)
|
|
14
|
+
* @param source - Where the value came from
|
|
15
|
+
*/
|
|
16
|
+
track(name, value, source) {
|
|
17
|
+
// Only track user-provided values
|
|
18
|
+
if (source === 'user-input' && value !== undefined) {
|
|
19
|
+
this.userProvidedValues.set(name, value);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get all user-provided values as a plain object.
|
|
24
|
+
* Useful for saving to norrix.config.ts.
|
|
25
|
+
*
|
|
26
|
+
* @returns Object mapping field names to values
|
|
27
|
+
*/
|
|
28
|
+
getUserProvidedValues() {
|
|
29
|
+
const result = {};
|
|
30
|
+
for (const [name, value] of this.userProvidedValues.entries()) {
|
|
31
|
+
result[name] = value;
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if there are any user-provided values worth saving.
|
|
37
|
+
*
|
|
38
|
+
* @returns true if we should offer to save values to config
|
|
39
|
+
*/
|
|
40
|
+
shouldOfferToSave() {
|
|
41
|
+
return this.userProvidedValues.size > 0;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the count of user-provided values.
|
|
45
|
+
*
|
|
46
|
+
* @returns Number of values tracked
|
|
47
|
+
*/
|
|
48
|
+
getCount() {
|
|
49
|
+
return this.userProvidedValues.size;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Clear all tracked values.
|
|
53
|
+
*/
|
|
54
|
+
clear() {
|
|
55
|
+
this.userProvidedValues.clear();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=config-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-tracker.js","sourceRoot":"","sources":["../../src/lib/config-tracker.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IACrB,kBAAkB,GAAwB,IAAI,GAAG,EAAE,CAAC;IAE5D;;;;;;;OAOG;IACH,KAAK,CAAC,IAAY,EAAE,KAAyB,EAAE,MAAmB;QAChE,kCAAkC;QAClC,IAAI,MAAM,KAAK,YAAY,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACnD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,qBAAqB;QACnB,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;CACF"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -50,6 +50,14 @@ export interface NorrixIosConfig {
|
|
|
50
50
|
* Used for auto-provisioning with Fastlane Match.
|
|
51
51
|
*/
|
|
52
52
|
ascPrivateKeyPath?: string;
|
|
53
|
+
/**
|
|
54
|
+
* TestFlight external tester group names for beta distribution.
|
|
55
|
+
* Used when submitting to external testing (Beta App Review).
|
|
56
|
+
* Groups must be created in App Store Connect before use.
|
|
57
|
+
* @default ["External Testers"]
|
|
58
|
+
* @example ["External Testers", "Beta Testers"]
|
|
59
|
+
*/
|
|
60
|
+
testflightGroups?: string[];
|
|
53
61
|
}
|
|
54
62
|
/**
|
|
55
63
|
* Android-specific build configuration
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mapping of credential fields to org environment variable names.
|
|
3
|
+
* Each field can have multiple variants that will be checked.
|
|
4
|
+
*/
|
|
5
|
+
export declare const ORG_ENV_VAR_MAPPINGS: Record<string, string[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Fetch the names of all environment variables configured for the current organization.
|
|
8
|
+
* This includes both string variables and file-based variables.
|
|
9
|
+
*
|
|
10
|
+
* @param apiUrl - The API base URL
|
|
11
|
+
* @param headers - Authentication headers (from getAuthHeaders)
|
|
12
|
+
* @param verbose - Whether to log verbose output
|
|
13
|
+
* @returns Array of environment variable names
|
|
14
|
+
*/
|
|
15
|
+
export declare function fetchOrgEnvVarNames(apiUrl: string, headers: Record<string, string>, verbose?: boolean): Promise<string[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if any of the given environment variable names exist in the available org env vars.
|
|
18
|
+
*
|
|
19
|
+
* @param variantNames - Array of possible env var names to check (e.g., ['KEYSTORE_ALIAS_PASSWORD', 'KEY_PASSWORD'])
|
|
20
|
+
* @param availableOrgEnvVars - Array of env var names configured in the org
|
|
21
|
+
* @returns The first matching env var name, or null if none found
|
|
22
|
+
*/
|
|
23
|
+
export declare function hasOrgEnvVar(variantNames: string[], availableOrgEnvVars: string[]): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Get the org env var names that should be checked for a given credential field.
|
|
26
|
+
*
|
|
27
|
+
* @param fieldName - The credential field name (e.g., 'ascApiKeyId')
|
|
28
|
+
* @returns Array of env var names to check, or empty array if not mapped
|
|
29
|
+
*/
|
|
30
|
+
export declare function getOrgEnvVarNamesForField(fieldName: string): string[];
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
/**
|
|
3
|
+
* Mapping of credential fields to org environment variable names.
|
|
4
|
+
* Each field can have multiple variants that will be checked.
|
|
5
|
+
*/
|
|
6
|
+
export const ORG_ENV_VAR_MAPPINGS = {
|
|
7
|
+
// iOS credentials
|
|
8
|
+
teamId: ['APPLE_TEAM_ID'],
|
|
9
|
+
ascApiKeyId: ['ASC_API_KEY_ID'],
|
|
10
|
+
ascIssuerId: ['ASC_ISSUER_ID'],
|
|
11
|
+
ascPrivateKeyPath: ['ASC_PRIVATE_KEY'],
|
|
12
|
+
p12Path: ['P12_PATH'],
|
|
13
|
+
p12Password: ['P12_PASSWORD'],
|
|
14
|
+
provisioningProfilePath: ['PROVISIONING_PROFILE_PATH'],
|
|
15
|
+
// Android credentials
|
|
16
|
+
keystorePath: ['ANDROID_KEYSTORE', 'KEYSTORE_PATH'],
|
|
17
|
+
keystorePassword: ['KEYSTORE_PASSWORD'],
|
|
18
|
+
keyAlias: ['KEYSTORE_ALIAS'],
|
|
19
|
+
keyPassword: ['KEYSTORE_ALIAS_PASSWORD', 'KEY_PASSWORD'],
|
|
20
|
+
playServiceAccountJsonPath: ['PLAY_SERVICE_ACCOUNT_JSON_PATH'],
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Fetch the names of all environment variables configured for the current organization.
|
|
24
|
+
* This includes both string variables and file-based variables.
|
|
25
|
+
*
|
|
26
|
+
* @param apiUrl - The API base URL
|
|
27
|
+
* @param headers - Authentication headers (from getAuthHeaders)
|
|
28
|
+
* @param verbose - Whether to log verbose output
|
|
29
|
+
* @returns Array of environment variable names
|
|
30
|
+
*/
|
|
31
|
+
export async function fetchOrgEnvVarNames(apiUrl, headers, verbose = false) {
|
|
32
|
+
try {
|
|
33
|
+
const res = await axios.get(`${apiUrl}/env`, { headers });
|
|
34
|
+
// Extract variable names from response
|
|
35
|
+
const variables = res.data.variables || [];
|
|
36
|
+
const files = res.data.files || [];
|
|
37
|
+
const varNames = [
|
|
38
|
+
...variables.map((v) => v.name),
|
|
39
|
+
...files.map((f) => f.name),
|
|
40
|
+
];
|
|
41
|
+
if (verbose) {
|
|
42
|
+
console.log(`Fetched ${varNames.length} org environment variable(s): ${varNames.join(', ')}`);
|
|
43
|
+
}
|
|
44
|
+
return varNames;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (verbose) {
|
|
48
|
+
console.warn('Failed to fetch org environment variables:', error.message);
|
|
49
|
+
}
|
|
50
|
+
// Graceful fallback: return empty array if API call fails
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if any of the given environment variable names exist in the available org env vars.
|
|
56
|
+
*
|
|
57
|
+
* @param variantNames - Array of possible env var names to check (e.g., ['KEYSTORE_ALIAS_PASSWORD', 'KEY_PASSWORD'])
|
|
58
|
+
* @param availableOrgEnvVars - Array of env var names configured in the org
|
|
59
|
+
* @returns The first matching env var name, or null if none found
|
|
60
|
+
*/
|
|
61
|
+
export function hasOrgEnvVar(variantNames, availableOrgEnvVars) {
|
|
62
|
+
for (const varName of variantNames) {
|
|
63
|
+
if (availableOrgEnvVars.includes(varName)) {
|
|
64
|
+
return varName; // Return the matched name
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get the org env var names that should be checked for a given credential field.
|
|
71
|
+
*
|
|
72
|
+
* @param fieldName - The credential field name (e.g., 'ascApiKeyId')
|
|
73
|
+
* @returns Array of env var names to check, or empty array if not mapped
|
|
74
|
+
*/
|
|
75
|
+
export function getOrgEnvVarNamesForField(fieldName) {
|
|
76
|
+
return ORG_ENV_VAR_MAPPINGS[fieldName] || [];
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=org-env-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-env-helper.js","sourceRoot":"","sources":["../../src/lib/org-env-helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA6B;IAC5D,kBAAkB;IAClB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,WAAW,EAAE,CAAC,gBAAgB,CAAC;IAC/B,WAAW,EAAE,CAAC,eAAe,CAAC;IAC9B,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;IACtC,OAAO,EAAE,CAAC,UAAU,CAAC;IACrB,WAAW,EAAE,CAAC,cAAc,CAAC;IAC7B,uBAAuB,EAAE,CAAC,2BAA2B,CAAC;IAEtD,sBAAsB;IACtB,YAAY,EAAE,CAAC,kBAAkB,EAAE,eAAe,CAAC;IACnD,gBAAgB,EAAE,CAAC,mBAAmB,CAAC;IACvC,QAAQ,EAAE,CAAC,gBAAgB,CAAC;IAC5B,WAAW,EAAE,CAAC,yBAAyB,EAAE,cAAc,CAAC;IACxD,0BAA0B,EAAE,CAAC,gCAAgC,CAAC;CAC/D,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,OAA+B,EAC/B,OAAO,GAAG,KAAK;IAEf,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAE1D,uCAAuC;QACvC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAEnC,MAAM,QAAQ,GAAG;YACf,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACpC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACjC,CAAC;QAEF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CACT,WAAW,QAAQ,CAAC,MAAM,iCAAiC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjF,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CACV,4CAA4C,EAC5C,KAAK,CAAC,OAAO,CACd,CAAC;QACJ,CAAC;QACD,0DAA0D;QAC1D,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC1B,YAAsB,EACtB,mBAA6B;IAE7B,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC,CAAC,0BAA0B;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,OAAO,oBAAoB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export type ValueSource = 'cli' | 'org-env' | 'config' | 'process-env' | 'user-input' | 'skipped';
|
|
2
|
+
export interface SmartPromptResult {
|
|
3
|
+
/**
|
|
4
|
+
* The resolved value.
|
|
5
|
+
* - undefined = use org env var (don't send this field to API, CI will inject it)
|
|
6
|
+
* - string = value to send to API
|
|
7
|
+
*/
|
|
8
|
+
value: string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Source of the value (for tracking and debugging)
|
|
11
|
+
*/
|
|
12
|
+
source: ValueSource;
|
|
13
|
+
}
|
|
14
|
+
export interface SmartPromptOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Field name for internal tracking (e.g., 'ascApiKeyId')
|
|
17
|
+
*/
|
|
18
|
+
name: string;
|
|
19
|
+
/**
|
|
20
|
+
* Prompt message to show user (e.g., 'App Store Connect API Key ID:')
|
|
21
|
+
*/
|
|
22
|
+
message: string;
|
|
23
|
+
/**
|
|
24
|
+
* Inquirer prompt type (default: 'input')
|
|
25
|
+
*/
|
|
26
|
+
type?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Value from CLI argument (highest priority)
|
|
29
|
+
*/
|
|
30
|
+
cliValue?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Value from norrix.config.ts
|
|
33
|
+
*/
|
|
34
|
+
configValue?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Org env var names to check (e.g., ['ASC_API_KEY_ID'])
|
|
37
|
+
*/
|
|
38
|
+
orgEnvVarNames: string[];
|
|
39
|
+
/**
|
|
40
|
+
* List of all env var names the org has configured
|
|
41
|
+
*/
|
|
42
|
+
availableOrgEnvVars: string[];
|
|
43
|
+
/**
|
|
44
|
+
* Process env var names to check (e.g., ['ASC_API_KEY_ID'])
|
|
45
|
+
*/
|
|
46
|
+
processEnvNames?: string[];
|
|
47
|
+
/**
|
|
48
|
+
* Whether in non-interactive mode
|
|
49
|
+
*/
|
|
50
|
+
nonInteractive?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Whether to mask the input (for passwords)
|
|
53
|
+
*/
|
|
54
|
+
mask?: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Validation function for user input
|
|
57
|
+
*/
|
|
58
|
+
validate?: (value: string) => boolean | string;
|
|
59
|
+
/**
|
|
60
|
+
* Whether this field is required
|
|
61
|
+
*/
|
|
62
|
+
required?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Default value if no other source provides one
|
|
65
|
+
*/
|
|
66
|
+
default?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Smart prompt that checks multiple sources in priority order:
|
|
70
|
+
* 1. CLI arguments
|
|
71
|
+
* 2. Org environment variables (with user confirmation)
|
|
72
|
+
* 3. Config file (with user confirmation)
|
|
73
|
+
* 4. Process environment variables
|
|
74
|
+
* 5. User input
|
|
75
|
+
*
|
|
76
|
+
* When org env var is used, returns undefined to signal that the field should be
|
|
77
|
+
* omitted from API request (CI will inject it).
|
|
78
|
+
*/
|
|
79
|
+
export declare function smartPrompt(options: SmartPromptOptions): Promise<SmartPromptResult>;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import { hasOrgEnvVar } from './org-env-helper.js';
|
|
3
|
+
/**
|
|
4
|
+
* Smart prompt that checks multiple sources in priority order:
|
|
5
|
+
* 1. CLI arguments
|
|
6
|
+
* 2. Org environment variables (with user confirmation)
|
|
7
|
+
* 3. Config file (with user confirmation)
|
|
8
|
+
* 4. Process environment variables
|
|
9
|
+
* 5. User input
|
|
10
|
+
*
|
|
11
|
+
* When org env var is used, returns undefined to signal that the field should be
|
|
12
|
+
* omitted from API request (CI will inject it).
|
|
13
|
+
*/
|
|
14
|
+
export async function smartPrompt(options) {
|
|
15
|
+
const { name, message, type = 'input', cliValue, configValue, orgEnvVarNames, availableOrgEnvVars, processEnvNames = [], nonInteractive = false, mask = false, validate, required = false, } = options;
|
|
16
|
+
// Helper to trim and normalize values
|
|
17
|
+
const trimString = (val) => {
|
|
18
|
+
if (!val)
|
|
19
|
+
return undefined;
|
|
20
|
+
const trimmed = val.toString().trim();
|
|
21
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
22
|
+
};
|
|
23
|
+
// 1. CLI value takes highest priority
|
|
24
|
+
const normalizedCliValue = trimString(cliValue);
|
|
25
|
+
if (normalizedCliValue) {
|
|
26
|
+
return { value: normalizedCliValue, source: 'cli' };
|
|
27
|
+
}
|
|
28
|
+
// 2. Check org environment variables
|
|
29
|
+
const matchedOrgEnvVar = hasOrgEnvVar(orgEnvVarNames, availableOrgEnvVars);
|
|
30
|
+
if (matchedOrgEnvVar) {
|
|
31
|
+
if (nonInteractive) {
|
|
32
|
+
// In non-interactive mode, automatically use org env var
|
|
33
|
+
return { value: undefined, source: 'org-env' };
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// In interactive mode, ask user for confirmation
|
|
37
|
+
const { useOrgEnv } = await inquirer.prompt([
|
|
38
|
+
{
|
|
39
|
+
type: 'confirm',
|
|
40
|
+
name: 'useOrgEnv',
|
|
41
|
+
message: `Use my organization's value for ${matchedOrgEnvVar}? (*****)`,
|
|
42
|
+
default: true,
|
|
43
|
+
},
|
|
44
|
+
]);
|
|
45
|
+
if (useOrgEnv) {
|
|
46
|
+
return { value: undefined, source: 'org-env' };
|
|
47
|
+
}
|
|
48
|
+
// User declined, continue to next source
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// 3. Check config file value
|
|
52
|
+
const normalizedConfigValue = trimString(configValue);
|
|
53
|
+
if (normalizedConfigValue) {
|
|
54
|
+
if (nonInteractive) {
|
|
55
|
+
// In non-interactive mode, automatically use config value
|
|
56
|
+
return { value: normalizedConfigValue, source: 'config' };
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// In interactive mode, ask user for confirmation
|
|
60
|
+
const displayValue = normalizedConfigValue.length > 40
|
|
61
|
+
? normalizedConfigValue.substring(0, 37) + '...'
|
|
62
|
+
: normalizedConfigValue;
|
|
63
|
+
// Convert camelCase name to readable format (e.g., 'teamId' -> 'Team ID')
|
|
64
|
+
let fieldLabel = name
|
|
65
|
+
.replace(/([A-Z])/g, ' $1')
|
|
66
|
+
.replace(/^./, (str) => str.toUpperCase())
|
|
67
|
+
.trim();
|
|
68
|
+
// Expand ASC to "App Store Connect (ASC)" for clarity
|
|
69
|
+
fieldLabel = fieldLabel.replace(/\bAsc\b/g, 'App Store Connect (ASC)');
|
|
70
|
+
const { useConfig } = await inquirer.prompt([
|
|
71
|
+
{
|
|
72
|
+
type: 'confirm',
|
|
73
|
+
name: 'useConfig',
|
|
74
|
+
message: `Use saved ${fieldLabel} '${displayValue}' from norrix.config.ts?`,
|
|
75
|
+
default: true,
|
|
76
|
+
},
|
|
77
|
+
]);
|
|
78
|
+
if (useConfig) {
|
|
79
|
+
return { value: normalizedConfigValue, source: 'config' };
|
|
80
|
+
}
|
|
81
|
+
// User declined, continue to next source
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// 4. Check process environment variables
|
|
85
|
+
for (const envVarName of processEnvNames) {
|
|
86
|
+
const envValue = trimString(process.env[envVarName]);
|
|
87
|
+
if (envValue) {
|
|
88
|
+
return { value: envValue, source: 'process-env' };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// 5. Non-interactive mode: use default or fail if required
|
|
92
|
+
if (nonInteractive) {
|
|
93
|
+
const defaultValue = trimString(options.default);
|
|
94
|
+
if (defaultValue) {
|
|
95
|
+
return { value: defaultValue, source: 'user-input' };
|
|
96
|
+
}
|
|
97
|
+
if (required) {
|
|
98
|
+
throw new Error(`${name} is required but not provided in non-interactive mode. ` +
|
|
99
|
+
`Please provide via CLI argument, org env var, config file, or process env var.`);
|
|
100
|
+
}
|
|
101
|
+
// Not required and no value available
|
|
102
|
+
return { value: undefined, source: 'skipped' };
|
|
103
|
+
}
|
|
104
|
+
// 6. Interactive prompt for user input
|
|
105
|
+
const promptType = mask ? 'password' : type;
|
|
106
|
+
const promptConfig = {
|
|
107
|
+
type: promptType,
|
|
108
|
+
name: 'userInput',
|
|
109
|
+
message,
|
|
110
|
+
};
|
|
111
|
+
if (options.default !== undefined) {
|
|
112
|
+
promptConfig.default = options.default;
|
|
113
|
+
}
|
|
114
|
+
if (validate) {
|
|
115
|
+
promptConfig.validate = (value) => {
|
|
116
|
+
if (!required && !value)
|
|
117
|
+
return true; // Allow empty if not required
|
|
118
|
+
return validate(value);
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const { userInput } = await inquirer.prompt([promptConfig]);
|
|
122
|
+
const normalizedUserInput = trimString(userInput);
|
|
123
|
+
if (!normalizedUserInput && required) {
|
|
124
|
+
throw new Error(`${name} is required but no value was provided.`);
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
value: normalizedUserInput,
|
|
128
|
+
source: 'user-input',
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=smart-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-prompt.js","sourceRoot":"","sources":["../../src/lib/smart-prompt.ts"],"names":[],"mappings":"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"}
|