@copado/agentia-cli 0.5.0-alpha.0 → 0.7.0-alpha.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 +1106 -83
- package/dist/commands/auth/get.d.ts +23 -0
- package/dist/commands/auth/get.js +73 -0
- package/dist/commands/auth/get.js.map +1 -0
- package/dist/commands/auth/set.d.ts +21 -0
- package/dist/commands/auth/set.js +113 -0
- package/dist/commands/auth/set.js.map +1 -0
- package/dist/commands/environment/auth/status.d.ts +13 -0
- package/dist/commands/environment/auth/status.js +36 -0
- package/dist/commands/environment/auth/status.js.map +1 -0
- package/dist/commands/environment/auth/web/login.d.ts +15 -0
- package/dist/commands/environment/auth/web/login.js +55 -0
- package/dist/commands/environment/auth/web/login.js.map +1 -0
- package/dist/commands/environment/create.d.ts +22 -0
- package/dist/commands/environment/create.js +41 -0
- package/dist/commands/environment/create.js.map +1 -0
- package/dist/commands/environment/get.d.ts +10 -0
- package/dist/commands/environment/get.js +30 -0
- package/dist/commands/environment/get.js.map +1 -0
- package/dist/commands/environment/list.d.ts +17 -0
- package/dist/commands/environment/list.js +69 -0
- package/dist/commands/environment/list.js.map +1 -0
- package/dist/commands/environment/update.d.ts +23 -0
- package/dist/commands/environment/update.js +70 -0
- package/dist/commands/environment/update.js.map +1 -0
- package/dist/commands/job/get.d.ts +14 -0
- package/dist/commands/job/get.js +33 -0
- package/dist/commands/job/get.js.map +1 -0
- package/dist/commands/job/kill.d.ts +14 -0
- package/dist/commands/job/kill.js +34 -0
- package/dist/commands/job/kill.js.map +1 -0
- package/dist/commands/job/list.d.ts +18 -0
- package/dist/commands/job/list.js +68 -0
- package/dist/commands/job/list.js.map +1 -0
- package/dist/commands/job/pause.d.ts +14 -0
- package/dist/commands/job/pause.js +34 -0
- package/dist/commands/job/pause.js.map +1 -0
- package/dist/commands/job/resume.d.ts +14 -0
- package/dist/commands/job/resume.js +34 -0
- package/dist/commands/job/resume.js.map +1 -0
- package/dist/commands/job/run.d.ts +15 -0
- package/dist/commands/job/run.js +40 -0
- package/dist/commands/job/run.js.map +1 -0
- package/dist/commands/mcp/start.d.ts +7 -0
- package/dist/commands/mcp/start.js +15 -0
- package/dist/commands/mcp/start.js.map +1 -0
- package/dist/commands/metadata/content/compare.d.ts +40 -0
- package/dist/commands/metadata/content/compare.js +127 -0
- package/dist/commands/metadata/content/compare.js.map +1 -0
- package/dist/commands/metadata/content/get.d.ts +39 -0
- package/dist/commands/metadata/content/get.js +158 -0
- package/dist/commands/metadata/content/get.js.map +1 -0
- package/dist/commands/metadata/dependency/list.d.ts +49 -0
- package/dist/commands/metadata/dependency/list.js +216 -0
- package/dist/commands/metadata/dependency/list.js.map +1 -0
- package/dist/commands/metadata/index/compare.d.ts +34 -0
- package/dist/commands/metadata/index/compare.js +100 -0
- package/dist/commands/metadata/index/compare.js.map +1 -0
- package/dist/commands/metadata/list.d.ts +56 -0
- package/dist/commands/metadata/list.js +133 -0
- package/dist/commands/metadata/list.js.map +1 -0
- package/dist/commands/metadata/refresh/deleted.d.ts +15 -0
- package/dist/commands/metadata/refresh/deleted.js +55 -0
- package/dist/commands/metadata/refresh/deleted.js.map +1 -0
- package/dist/commands/metadata/refresh/run.d.ts +23 -0
- package/dist/commands/metadata/refresh/run.js +95 -0
- package/dist/commands/metadata/refresh/run.js.map +1 -0
- package/dist/commands/metadata/refresh/status.d.ts +14 -0
- package/dist/commands/metadata/refresh/status.js +49 -0
- package/dist/commands/metadata/refresh/status.js.map +1 -0
- package/dist/commands/pipeline/connection/list.d.ts +12 -0
- package/dist/commands/pipeline/connection/list.js +39 -0
- package/dist/commands/pipeline/connection/list.js.map +1 -0
- package/dist/commands/pipeline/get.d.ts +14 -0
- package/dist/commands/pipeline/get.js +33 -0
- package/dist/commands/pipeline/get.js.map +1 -0
- package/dist/commands/pipeline/list.d.ts +11 -0
- package/dist/commands/pipeline/list.js +30 -0
- package/dist/commands/pipeline/list.js.map +1 -0
- package/dist/commands/project/default/get.d.ts +21 -0
- package/dist/commands/project/default/get.js +44 -0
- package/dist/commands/project/default/get.js.map +1 -0
- package/dist/commands/project/default/set.d.ts +21 -0
- package/dist/commands/project/default/set.js +55 -0
- package/dist/commands/project/default/set.js.map +1 -0
- package/dist/commands/project/default/unset.d.ts +21 -0
- package/dist/commands/project/default/unset.js +45 -0
- package/dist/commands/project/default/unset.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agentia-command.d.ts +7 -0
- package/dist/lib/agentia-command.js +28 -0
- package/dist/lib/agentia-command.js.map +1 -0
- package/dist/lib/agentia-oauth-error-codes.d.ts +17 -0
- package/dist/lib/agentia-oauth-error-codes.js +30 -0
- package/dist/lib/agentia-oauth-error-codes.js.map +1 -0
- package/dist/lib/assert.d.ts +1 -0
- package/dist/lib/assert.js +7 -0
- package/dist/lib/assert.js.map +1 -0
- package/dist/lib/cicd-gateway.d.ts +57 -0
- package/dist/lib/cicd-gateway.js +221 -0
- package/dist/lib/cicd-gateway.js.map +1 -0
- package/dist/lib/cicd-region.d.ts +4 -0
- package/dist/lib/cicd-region.js +8 -0
- package/dist/lib/cicd-region.js.map +1 -0
- package/dist/lib/credential-store.d.ts +18 -0
- package/dist/lib/credential-store.js +43 -0
- package/dist/lib/credential-store.js.map +1 -0
- package/dist/lib/defaults-store.d.ts +12 -0
- package/dist/lib/defaults-store.js +142 -0
- package/dist/lib/defaults-store.js.map +1 -0
- package/dist/lib/dependency-from-changes.d.ts +6 -0
- package/dist/lib/dependency-from-changes.js +97 -0
- package/dist/lib/dependency-from-changes.js.map +1 -0
- package/dist/lib/environment-auth-status.d.ts +18 -0
- package/dist/lib/environment-auth-status.js +74 -0
- package/dist/lib/environment-auth-status.js.map +1 -0
- package/dist/lib/environment-auth.d.ts +26 -0
- package/dist/lib/environment-auth.js +150 -0
- package/dist/lib/environment-auth.js.map +1 -0
- package/dist/lib/environment-credential-selection.d.ts +14 -0
- package/dist/lib/environment-credential-selection.js +60 -0
- package/dist/lib/environment-credential-selection.js.map +1 -0
- package/dist/lib/environment-flags.d.ts +81 -0
- package/dist/lib/environment-flags.js +134 -0
- package/dist/lib/environment-flags.js.map +1 -0
- package/dist/lib/environment-types.d.ts +84 -0
- package/dist/lib/environment-types.js +52 -0
- package/dist/lib/environment-types.js.map +1 -0
- package/dist/lib/format.d.ts +5 -0
- package/dist/lib/format.js +8 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/job-types.d.ts +85 -0
- package/dist/lib/job-types.js +115 -0
- package/dist/lib/job-types.js.map +1 -0
- package/dist/lib/loopback-callback-server.d.ts +35 -0
- package/dist/lib/loopback-callback-server.js +162 -0
- package/dist/lib/loopback-callback-server.js.map +1 -0
- package/dist/lib/mcp/redaction.d.ts +2 -0
- package/dist/lib/mcp/redaction.js +24 -0
- package/dist/lib/mcp/redaction.js.map +1 -0
- package/dist/lib/mcp/result.d.ts +37 -0
- package/dist/lib/mcp/result.js +39 -0
- package/dist/lib/mcp/result.js.map +1 -0
- package/dist/lib/mcp/server.d.ts +5 -0
- package/dist/lib/mcp/server.js +24 -0
- package/dist/lib/mcp/server.js.map +1 -0
- package/dist/lib/mcp/tools.d.ts +235 -0
- package/dist/lib/mcp/tools.js +683 -0
- package/dist/lib/mcp/tools.js.map +1 -0
- package/dist/lib/metadata-common.d.ts +159 -0
- package/dist/lib/metadata-common.js +234 -0
- package/dist/lib/metadata-common.js.map +1 -0
- package/dist/lib/metadata-refresh.d.ts +68 -0
- package/dist/lib/metadata-refresh.js +104 -0
- package/dist/lib/metadata-refresh.js.map +1 -0
- package/dist/lib/open-browser.d.ts +8 -0
- package/dist/lib/open-browser.js +40 -0
- package/dist/lib/open-browser.js.map +1 -0
- package/dist/lib/pipeline-flags.d.ts +10 -0
- package/dist/lib/pipeline-flags.js +18 -0
- package/dist/lib/pipeline-flags.js.map +1 -0
- package/dist/lib/pipeline-types.d.ts +84 -0
- package/dist/lib/pipeline-types.js +67 -0
- package/dist/lib/pipeline-types.js.map +1 -0
- package/dist/lib/project-default-flags.d.ts +41 -0
- package/dist/lib/project-default-flags.js +82 -0
- package/dist/lib/project-default-flags.js.map +1 -0
- package/dist/lib/project-defaults.d.ts +23 -0
- package/dist/lib/project-defaults.js +51 -0
- package/dist/lib/project-defaults.js.map +1 -0
- package/dist/lib/user-context-types.d.ts +12 -0
- package/dist/lib/user-context-types.js +2 -0
- package/dist/lib/user-context-types.js.map +1 -0
- package/oclif.manifest.json +2315 -2
- package/package.json +5 -2
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { CicdGateway } from './cicd-gateway.js';
|
|
2
|
+
import { selectEnvironmentCredential } from './environment-credential-selection.js';
|
|
3
|
+
import { environmentCredentialValidateEndpoint, environmentEndpoint, } from './environment-types.js';
|
|
4
|
+
import { USER_CONTEXT_ENDPOINT } from './user-context-types.js';
|
|
5
|
+
let testDeps;
|
|
6
|
+
// Test-only hook
|
|
7
|
+
export function setEnvironmentAuthStatusDepsForTests(deps) {
|
|
8
|
+
testDeps = deps;
|
|
9
|
+
}
|
|
10
|
+
// Test-only hook
|
|
11
|
+
export function resetEnvironmentAuthStatusDepsForTests() {
|
|
12
|
+
testDeps = undefined;
|
|
13
|
+
}
|
|
14
|
+
function resolveCredentialName(credential) {
|
|
15
|
+
const name = credential.name?.trim();
|
|
16
|
+
if (name !== undefined && name.length > 0) {
|
|
17
|
+
return name;
|
|
18
|
+
}
|
|
19
|
+
return credential.id;
|
|
20
|
+
}
|
|
21
|
+
function normalizeValidationMessage(message) {
|
|
22
|
+
if (typeof message !== 'string') {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const trimmed = message.trim();
|
|
26
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
27
|
+
}
|
|
28
|
+
async function fetchUserContext(gatewayCall) {
|
|
29
|
+
return gatewayCall({
|
|
30
|
+
endpoint: USER_CONTEXT_ENDPOINT,
|
|
31
|
+
method: 'GET',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async function fetchEnvironment(gatewayCall, environmentId) {
|
|
35
|
+
return gatewayCall({
|
|
36
|
+
endpoint: environmentEndpoint(environmentId),
|
|
37
|
+
method: 'GET',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async function validateCredential(gatewayCall, environmentId, credentialId) {
|
|
41
|
+
return gatewayCall({
|
|
42
|
+
endpoint: environmentCredentialValidateEndpoint(environmentId, credentialId),
|
|
43
|
+
method: 'POST',
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export async function runEnvironmentAuthStatus(options, deps = {}) {
|
|
47
|
+
const environmentId = options.environmentId.trim();
|
|
48
|
+
if (environmentId.length === 0) {
|
|
49
|
+
throw new Error('Missing required argument: environment ID');
|
|
50
|
+
}
|
|
51
|
+
const gatewayCall = deps.gatewayCall ?? testDeps?.gatewayCall ?? CicdGateway.call.bind(CicdGateway);
|
|
52
|
+
const [userContext, environment] = await Promise.all([
|
|
53
|
+
fetchUserContext(gatewayCall),
|
|
54
|
+
fetchEnvironment(gatewayCall, environmentId),
|
|
55
|
+
]);
|
|
56
|
+
const selection = selectEnvironmentCredential({
|
|
57
|
+
credentialId: options.credentialId,
|
|
58
|
+
credentials: environment.credentials ?? [],
|
|
59
|
+
userFullName: userContext.fullName ?? '',
|
|
60
|
+
});
|
|
61
|
+
if (!selection.ok) {
|
|
62
|
+
throw new Error(selection.message);
|
|
63
|
+
}
|
|
64
|
+
const { credential } = selection;
|
|
65
|
+
const validation = await validateCredential(gatewayCall, environmentId, credential.id);
|
|
66
|
+
return {
|
|
67
|
+
credentialId: credential.id,
|
|
68
|
+
credentialName: resolveCredentialName(credential),
|
|
69
|
+
environmentId,
|
|
70
|
+
message: normalizeValidationMessage(validation.message),
|
|
71
|
+
validated: validation.validated === true,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=environment-auth-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-auth-status.js","sourceRoot":"","sources":["../../src/lib/environment-auth-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CicdGateway } from './cicd-gateway.js';
|
|
2
|
+
import { createLoopbackCallbackServer } from './loopback-callback-server.js';
|
|
3
|
+
export declare const DEFAULT_AUTH_TIMEOUT_SECONDS = 300;
|
|
4
|
+
export type EnvironmentWebLoginOptions = {
|
|
5
|
+
credentialId?: string;
|
|
6
|
+
environmentId: string;
|
|
7
|
+
port?: number;
|
|
8
|
+
quiet?: boolean;
|
|
9
|
+
timeoutSeconds?: number;
|
|
10
|
+
};
|
|
11
|
+
export type EnvironmentWebLoginResult = {
|
|
12
|
+
callbackUrl: string;
|
|
13
|
+
credentialId: string;
|
|
14
|
+
credentialName: string;
|
|
15
|
+
environmentId: string;
|
|
16
|
+
};
|
|
17
|
+
export type EnvironmentWebLoginDeps = {
|
|
18
|
+
createLoopbackServer?: typeof createLoopbackCallbackServer;
|
|
19
|
+
gatewayCall?: typeof CicdGateway.call;
|
|
20
|
+
isHeadless?: () => boolean;
|
|
21
|
+
openUrl?: (url: string) => Promise<void>;
|
|
22
|
+
promptContinue?: () => Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
export declare function setEnvironmentWebLoginDepsForTests(deps: EnvironmentWebLoginDeps | undefined): void;
|
|
25
|
+
export declare function resetEnvironmentWebLoginDepsForTests(): void;
|
|
26
|
+
export declare function runEnvironmentWebLogin(options: EnvironmentWebLoginOptions, deps?: EnvironmentWebLoginDeps): Promise<EnvironmentWebLoginResult>;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { formatAgentiaOAuthError } from './agentia-oauth-error-codes.js';
|
|
2
|
+
import { CicdGateway } from './cicd-gateway.js';
|
|
3
|
+
import { selectEnvironmentCredential } from './environment-credential-selection.js';
|
|
4
|
+
import { environmentCredentialAuthUrlEndpoint, environmentEndpoint, } from './environment-types.js';
|
|
5
|
+
import { createLoopbackCallbackServer, } from './loopback-callback-server.js';
|
|
6
|
+
import { isHeadlessEnvironment, openUrl } from './open-browser.js';
|
|
7
|
+
import { USER_CONTEXT_ENDPOINT } from './user-context-types.js';
|
|
8
|
+
export const DEFAULT_AUTH_TIMEOUT_SECONDS = 300;
|
|
9
|
+
let testDeps;
|
|
10
|
+
// Test-only hook
|
|
11
|
+
export function setEnvironmentWebLoginDepsForTests(deps) {
|
|
12
|
+
testDeps = deps;
|
|
13
|
+
}
|
|
14
|
+
// Test-only hook
|
|
15
|
+
export function resetEnvironmentWebLoginDepsForTests() {
|
|
16
|
+
testDeps = undefined;
|
|
17
|
+
}
|
|
18
|
+
function extractAuthUrl(response) {
|
|
19
|
+
if (typeof response === 'string' && response.trim().length > 0) {
|
|
20
|
+
return response.trim();
|
|
21
|
+
}
|
|
22
|
+
if (response && typeof response === 'object' && 'data' in response) {
|
|
23
|
+
const { data } = response;
|
|
24
|
+
if (typeof data === 'string' && data.trim().length > 0) {
|
|
25
|
+
return data.trim();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
throw new Error('Auth URL missing or empty in server response.');
|
|
29
|
+
}
|
|
30
|
+
async function fetchUserContext(gatewayCall) {
|
|
31
|
+
return gatewayCall({
|
|
32
|
+
endpoint: USER_CONTEXT_ENDPOINT,
|
|
33
|
+
method: 'GET',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async function fetchEnvironment(gatewayCall, environmentId) {
|
|
37
|
+
return gatewayCall({
|
|
38
|
+
endpoint: environmentEndpoint(environmentId),
|
|
39
|
+
method: 'GET',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async function fetchAuthUrl(gatewayCall, environmentId, credentialId, redirectUrl) {
|
|
43
|
+
const response = await gatewayCall({
|
|
44
|
+
endpoint: environmentCredentialAuthUrlEndpoint(environmentId, credentialId, redirectUrl),
|
|
45
|
+
method: 'GET',
|
|
46
|
+
});
|
|
47
|
+
return extractAuthUrl(response);
|
|
48
|
+
}
|
|
49
|
+
function formatTimeoutMessage(timeoutSeconds) {
|
|
50
|
+
const minutes = Math.max(1, Math.round(timeoutSeconds / 60));
|
|
51
|
+
return `Authentication timed out after ${minutes} minute${minutes === 1 ? '' : 's'}.`;
|
|
52
|
+
}
|
|
53
|
+
function resolveCredentialName(credential) {
|
|
54
|
+
return credential.name?.trim() || credential.id;
|
|
55
|
+
}
|
|
56
|
+
async function launchBrowserForAuth(authUrl, options, resolvedDeps) {
|
|
57
|
+
const headless = resolvedDeps.isHeadless?.() ?? isHeadlessEnvironment();
|
|
58
|
+
if (headless) {
|
|
59
|
+
if (!options.quiet) {
|
|
60
|
+
process.stdout.write('Headless environment detected. Open this URL in a browser:\n');
|
|
61
|
+
process.stdout.write(`${authUrl}\n`);
|
|
62
|
+
}
|
|
63
|
+
if (resolvedDeps.promptContinue) {
|
|
64
|
+
await resolvedDeps.promptContinue();
|
|
65
|
+
}
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
await (resolvedDeps.openUrl ?? openUrl)(authUrl);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const message = error instanceof Error ? error.message : 'Failed to open browser';
|
|
73
|
+
if (!options.quiet) {
|
|
74
|
+
process.stderr.write(`${message}\nOpen this URL manually:\n${authUrl}\n`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function waitForAuthCallback(server, timeoutMs, timeoutSeconds) {
|
|
79
|
+
let callbackResult;
|
|
80
|
+
try {
|
|
81
|
+
callbackResult = await server.waitForCallback({ timeoutMs });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
const code = error instanceof Error ? error.code : undefined;
|
|
85
|
+
if (code === 'ETIMEDOUT' || (error instanceof Error && error.message.includes('timed out'))) {
|
|
86
|
+
const timeoutError = new Error(formatTimeoutMessage(timeoutSeconds));
|
|
87
|
+
timeoutError.exitCode = 130;
|
|
88
|
+
throw timeoutError;
|
|
89
|
+
}
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
if (!callbackResult.ok) {
|
|
93
|
+
throw new Error(formatAgentiaOAuthError(callbackResult.errorCode ?? 'UNKNOWN', callbackResult.errorDescription));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function resolveLoopbackBindingError(port) {
|
|
97
|
+
if (port !== undefined) {
|
|
98
|
+
return new Error(`Could not bind to port ${port}. Choose another port with --port.`);
|
|
99
|
+
}
|
|
100
|
+
return new Error('Could not find an available port between 8080 and 8090. Use --port to specify one.');
|
|
101
|
+
}
|
|
102
|
+
export async function runEnvironmentWebLogin(options, deps = {}) {
|
|
103
|
+
const environmentId = options.environmentId.trim();
|
|
104
|
+
if (environmentId.length === 0) {
|
|
105
|
+
throw new Error('Missing required argument: environment ID');
|
|
106
|
+
}
|
|
107
|
+
const gatewayCall = deps.gatewayCall ?? testDeps?.gatewayCall ?? CicdGateway.call.bind(CicdGateway);
|
|
108
|
+
const createLoopback = deps.createLoopbackServer ?? testDeps?.createLoopbackServer ?? createLoopbackCallbackServer;
|
|
109
|
+
const timeoutSeconds = options.timeoutSeconds ?? DEFAULT_AUTH_TIMEOUT_SECONDS;
|
|
110
|
+
const timeoutMs = timeoutSeconds * 1000;
|
|
111
|
+
const resolvedDeps = { ...testDeps, ...deps };
|
|
112
|
+
const [userContext, environment] = await Promise.all([
|
|
113
|
+
fetchUserContext(gatewayCall),
|
|
114
|
+
fetchEnvironment(gatewayCall, environmentId),
|
|
115
|
+
]);
|
|
116
|
+
const credentials = environment.credentials ?? [];
|
|
117
|
+
const selection = selectEnvironmentCredential({
|
|
118
|
+
credentialId: options.credentialId,
|
|
119
|
+
credentials,
|
|
120
|
+
userFullName: userContext.fullName ?? '',
|
|
121
|
+
});
|
|
122
|
+
if (!selection.ok) {
|
|
123
|
+
throw new Error(selection.message);
|
|
124
|
+
}
|
|
125
|
+
const { credential } = selection;
|
|
126
|
+
let server = null;
|
|
127
|
+
try {
|
|
128
|
+
server = await createLoopback({
|
|
129
|
+
port: options.port,
|
|
130
|
+
});
|
|
131
|
+
if (server === null) {
|
|
132
|
+
throw resolveLoopbackBindingError(options.port);
|
|
133
|
+
}
|
|
134
|
+
const authUrl = await fetchAuthUrl(gatewayCall, environmentId, credential.id, server.callbackUrl);
|
|
135
|
+
await launchBrowserForAuth(authUrl, options, resolvedDeps);
|
|
136
|
+
await waitForAuthCallback(server, timeoutMs, timeoutSeconds);
|
|
137
|
+
return {
|
|
138
|
+
callbackUrl: server.callbackUrl,
|
|
139
|
+
credentialId: credential.id,
|
|
140
|
+
credentialName: resolveCredentialName(credential),
|
|
141
|
+
environmentId,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
if (server) {
|
|
146
|
+
await server.close().catch(() => { });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=environment-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-auth.js","sourceRoot":"","sources":["../../src/lib/environment-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EnvironmentCredential } from './environment-types.js';
|
|
2
|
+
export type CredentialSelectionInput = {
|
|
3
|
+
credentialId?: string;
|
|
4
|
+
credentials: EnvironmentCredential[];
|
|
5
|
+
userFullName: string;
|
|
6
|
+
};
|
|
7
|
+
export type CredentialSelectionResult = {
|
|
8
|
+
credential: EnvironmentCredential;
|
|
9
|
+
ok: true;
|
|
10
|
+
} | {
|
|
11
|
+
message: string;
|
|
12
|
+
ok: false;
|
|
13
|
+
};
|
|
14
|
+
export declare function selectEnvironmentCredential(input: CredentialSelectionInput): CredentialSelectionResult;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
function normalizeName(value) {
|
|
2
|
+
return value?.trim() ?? '';
|
|
3
|
+
}
|
|
4
|
+
function isOwnedByUser(credential, userFullName) {
|
|
5
|
+
return normalizeName(credential.createdBy) === normalizeName(userFullName);
|
|
6
|
+
}
|
|
7
|
+
function findCredentialById(credentials, credentialId) {
|
|
8
|
+
return credentials.find((credential) => credential.id === credentialId);
|
|
9
|
+
}
|
|
10
|
+
export function selectEnvironmentCredential(input) {
|
|
11
|
+
const { credentialId, credentials, userFullName } = input;
|
|
12
|
+
if (credentialId !== undefined) {
|
|
13
|
+
const credential = findCredentialById(credentials, credentialId);
|
|
14
|
+
if (credential === undefined) {
|
|
15
|
+
return {
|
|
16
|
+
message: `Credential "${credentialId}" was not found on this environment.`,
|
|
17
|
+
ok: false,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return { credential, ok: true };
|
|
21
|
+
}
|
|
22
|
+
if (credentials.length === 0) {
|
|
23
|
+
return {
|
|
24
|
+
message: 'No credentials exist for this environment.',
|
|
25
|
+
ok: false,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const ownedCredentials = credentials.filter((credential) => isOwnedByUser(credential, userFullName));
|
|
29
|
+
if (ownedCredentials.length === 1) {
|
|
30
|
+
return { credential: ownedCredentials[0], ok: true };
|
|
31
|
+
}
|
|
32
|
+
if (ownedCredentials.length > 1) {
|
|
33
|
+
const ownedDefault = ownedCredentials.find((credential) => credential.defaultCredential === true);
|
|
34
|
+
if (ownedDefault !== undefined) {
|
|
35
|
+
return { credential: ownedDefault, ok: true };
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
message: 'Multiple credentials are owned by the current user and none is marked as default. Specify one with --credentialid.',
|
|
39
|
+
ok: false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (credentials.length === 1) {
|
|
43
|
+
return {
|
|
44
|
+
message: 'The only credential on this environment is not owned by the current user. Specify one with --credentialid.',
|
|
45
|
+
ok: false,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const environmentDefault = credentials.find((credential) => credential.defaultCredential === true);
|
|
49
|
+
if (environmentDefault !== undefined) {
|
|
50
|
+
return {
|
|
51
|
+
message: 'The default credential on this environment is not owned by the current user. Specify one with --credentialid.',
|
|
52
|
+
ok: false,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
message: 'No credentials owned by the current user were found on this environment. Specify one with --credentialid.',
|
|
57
|
+
ok: false,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=environment-credential-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-credential-selection.js","sourceRoot":"","sources":["../../src/lib/environment-credential-selection.ts"],"names":[],"mappings":"AAkBA,SAAS,aAAa,CAAC,KAAyB;IAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AAC5B,CAAC;AAED,SAAS,aAAa,CAAC,UAAiC,EAAE,YAAoB;IAC5E,OAAO,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,aAAa,CAAC,YAAY,CAAC,CAAA;AAC5E,CAAC;AAED,SAAS,kBAAkB,CACzB,WAAoC,EACpC,YAAoB;IAEpB,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,YAAY,CAAC,CAAA;AACzE,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAA+B;IACzE,MAAM,EAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAC,GAAG,KAAK,CAAA;IAEvD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;QAEhE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,eAAe,YAAY,sCAAsC;gBAC1E,EAAE,EAAE,KAAK;aACV,CAAA;QACH,CAAC;QAED,OAAO,EAAC,UAAU,EAAE,EAAE,EAAE,IAAI,EAAC,CAAA;IAC/B,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,4CAA4C;YACrD,EAAE,EAAE,KAAK;SACV,CAAA;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAA;IAEpG,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,EAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAC,CAAA;IACpD,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAA;QAEjG,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,EAAC,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAC,CAAA;QAC7C,CAAC;QAED,OAAO;YACL,OAAO,EACL,oHAAoH;YACtH,EAAE,EAAE,KAAK;SACV,CAAA;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EACL,4GAA4G;YAC9G,EAAE,EAAE,KAAK;SACV,CAAA;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAA;IAElG,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EACL,+GAA+G;YACjH,EAAE,EAAE,KAAK;SACV,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,EACL,2GAA2G;QAC7G,EAAE,EAAE,KAAK;KACV,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { type EnvironmentMutationPayload } from './environment-types.js';
|
|
2
|
+
export declare const environmentPlatformFlag: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
3
|
+
export declare const environmentTypeFlag: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
4
|
+
export declare const environmentCreateTypeFlag: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
5
|
+
export declare const environmentMutationStringFlags: {
|
|
6
|
+
readonly 'apex-test-level': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
readonly name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
readonly namespace: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
readonly platform: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
readonly 'promotion-default-credential': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
readonly 'run-specified-tests': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
readonly type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
readonly 'validation-promotion-default-credential': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
export declare const environmentMutationBooleanFlags: {
|
|
16
|
+
readonly 'enable-rollback': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
17
|
+
readonly 'index-back-promotion-metadata': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
+
readonly 'run-local-tests': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
19
|
+
};
|
|
20
|
+
declare const ENVIRONMENT_MUTATION_FLAG_TO_PAYLOAD_KEY: {
|
|
21
|
+
readonly 'apex-test-level': "apexTestLevel";
|
|
22
|
+
readonly 'enable-rollback': "enableRollback";
|
|
23
|
+
readonly 'index-back-promotion-metadata': "indexBackPromotionMetadata";
|
|
24
|
+
readonly name: "name";
|
|
25
|
+
readonly namespace: "namespace";
|
|
26
|
+
readonly platform: "platform";
|
|
27
|
+
readonly 'promotion-default-credential': "promotionDefaultCredential";
|
|
28
|
+
readonly 'run-local-tests': "runLocalTests";
|
|
29
|
+
readonly 'run-specified-tests': "runSpecifiedTests";
|
|
30
|
+
readonly type: "type";
|
|
31
|
+
readonly 'validation-promotion-default-credential': "validationPromotionDefaultCredential";
|
|
32
|
+
};
|
|
33
|
+
type MutationStringFlagValues = {
|
|
34
|
+
[K in keyof typeof environmentMutationStringFlags]?: string;
|
|
35
|
+
};
|
|
36
|
+
type MutationBooleanFlagValues = {
|
|
37
|
+
[K in keyof typeof environmentMutationBooleanFlags]?: boolean;
|
|
38
|
+
};
|
|
39
|
+
export type EnvironmentMutationFlagValues = MutationBooleanFlagValues & MutationStringFlagValues;
|
|
40
|
+
export type EnvironmentMutationFlagKey = keyof typeof ENVIRONMENT_MUTATION_FLAG_TO_PAYLOAD_KEY;
|
|
41
|
+
export declare const ENVIRONMENT_STRING_VALIDATION_KEYS: readonly ["name", "namespace", "runSpecifiedTests", "promotionDefaultCredential", "validationPromotionDefaultCredential", "apexTestLevel", "platform"];
|
|
42
|
+
export declare function collectMutationFlagKeys(flags: EnvironmentMutationFlagValues): EnvironmentMutationFlagKey[];
|
|
43
|
+
export declare function buildMutationPayload(flags: EnvironmentMutationFlagValues): EnvironmentMutationPayload;
|
|
44
|
+
export declare const environmentCreateStringFlags: {
|
|
45
|
+
readonly 'apex-test-level': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
46
|
+
readonly namespace: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
47
|
+
readonly 'promotion-default-credential': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
48
|
+
readonly 'run-specified-tests': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
49
|
+
readonly 'validation-promotion-default-credential': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
50
|
+
};
|
|
51
|
+
export declare const environmentUpdateFlags: {
|
|
52
|
+
readonly 'apex-test-level': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
53
|
+
readonly name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
54
|
+
readonly namespace: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
55
|
+
readonly platform: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
56
|
+
readonly 'promotion-default-credential': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
57
|
+
readonly 'run-specified-tests': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
58
|
+
readonly type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
59
|
+
readonly 'validation-promotion-default-credential': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
60
|
+
readonly 'enable-rollback': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
61
|
+
readonly 'index-back-promotion-metadata': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
62
|
+
readonly 'run-local-tests': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
63
|
+
};
|
|
64
|
+
export declare const environmentCreateFlags: {
|
|
65
|
+
readonly platform: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
66
|
+
readonly type: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
67
|
+
readonly 'apex-test-level': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
68
|
+
readonly namespace: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
69
|
+
readonly 'promotion-default-credential': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
70
|
+
readonly 'run-specified-tests': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
71
|
+
readonly 'validation-promotion-default-credential': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
72
|
+
readonly 'enable-rollback': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
73
|
+
readonly 'index-back-promotion-metadata': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
74
|
+
readonly 'run-local-tests': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
75
|
+
};
|
|
76
|
+
export declare function buildCreatePayload(name: string, flags: EnvironmentMutationFlagValues & {
|
|
77
|
+
platform?: string;
|
|
78
|
+
}): EnvironmentMutationPayload;
|
|
79
|
+
export declare function formatMutationFlagName(key: EnvironmentMutationFlagKey): string;
|
|
80
|
+
export declare function validateNonEmptyStringFields(payload: EnvironmentMutationPayload, keys: readonly (keyof EnvironmentMutationPayload)[]): string | undefined;
|
|
81
|
+
export {};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { DEFAULT_ENVIRONMENT_PLATFORM, DEFAULT_ENVIRONMENT_TYPE, ENVIRONMENT_TYPES, } from './environment-types.js';
|
|
3
|
+
export const environmentPlatformFlag = Flags.string({
|
|
4
|
+
default: DEFAULT_ENVIRONMENT_PLATFORM,
|
|
5
|
+
description: 'Environment platform',
|
|
6
|
+
});
|
|
7
|
+
export const environmentTypeFlag = Flags.string({
|
|
8
|
+
description: 'Environment type',
|
|
9
|
+
options: [...ENVIRONMENT_TYPES],
|
|
10
|
+
});
|
|
11
|
+
export const environmentCreateTypeFlag = Flags.string({
|
|
12
|
+
default: DEFAULT_ENVIRONMENT_TYPE,
|
|
13
|
+
description: 'Environment type',
|
|
14
|
+
options: [...ENVIRONMENT_TYPES],
|
|
15
|
+
});
|
|
16
|
+
export const environmentMutationStringFlags = {
|
|
17
|
+
'apex-test-level': Flags.string({
|
|
18
|
+
description: 'Apex test level',
|
|
19
|
+
}),
|
|
20
|
+
name: Flags.string({
|
|
21
|
+
description: 'Environment name',
|
|
22
|
+
}),
|
|
23
|
+
namespace: Flags.string({
|
|
24
|
+
description: 'Environment namespace',
|
|
25
|
+
}),
|
|
26
|
+
platform: Flags.string({
|
|
27
|
+
description: 'Environment platform',
|
|
28
|
+
}),
|
|
29
|
+
'promotion-default-credential': Flags.string({
|
|
30
|
+
description: 'Default credential for promotions',
|
|
31
|
+
}),
|
|
32
|
+
'run-specified-tests': Flags.string({
|
|
33
|
+
description: 'Specified tests to run',
|
|
34
|
+
}),
|
|
35
|
+
type: environmentTypeFlag,
|
|
36
|
+
'validation-promotion-default-credential': Flags.string({
|
|
37
|
+
description: 'Default credential for validation promotions',
|
|
38
|
+
}),
|
|
39
|
+
};
|
|
40
|
+
export const environmentMutationBooleanFlags = {
|
|
41
|
+
'enable-rollback': Flags.boolean({
|
|
42
|
+
allowNo: true,
|
|
43
|
+
description: 'Enable rollback',
|
|
44
|
+
}),
|
|
45
|
+
'index-back-promotion-metadata': Flags.boolean({
|
|
46
|
+
allowNo: true,
|
|
47
|
+
description: 'Index back promotion metadata',
|
|
48
|
+
}),
|
|
49
|
+
'run-local-tests': Flags.boolean({
|
|
50
|
+
allowNo: true,
|
|
51
|
+
description: 'Run local tests',
|
|
52
|
+
}),
|
|
53
|
+
};
|
|
54
|
+
const ENVIRONMENT_MUTATION_FLAG_TO_PAYLOAD_KEY = {
|
|
55
|
+
'apex-test-level': 'apexTestLevel',
|
|
56
|
+
'enable-rollback': 'enableRollback',
|
|
57
|
+
'index-back-promotion-metadata': 'indexBackPromotionMetadata',
|
|
58
|
+
name: 'name',
|
|
59
|
+
namespace: 'namespace',
|
|
60
|
+
platform: 'platform',
|
|
61
|
+
'promotion-default-credential': 'promotionDefaultCredential',
|
|
62
|
+
'run-local-tests': 'runLocalTests',
|
|
63
|
+
'run-specified-tests': 'runSpecifiedTests',
|
|
64
|
+
type: 'type',
|
|
65
|
+
'validation-promotion-default-credential': 'validationPromotionDefaultCredential',
|
|
66
|
+
};
|
|
67
|
+
const MUTATION_FLAG_KEYS = Object.keys(ENVIRONMENT_MUTATION_FLAG_TO_PAYLOAD_KEY);
|
|
68
|
+
export const ENVIRONMENT_STRING_VALIDATION_KEYS = [
|
|
69
|
+
'name',
|
|
70
|
+
'namespace',
|
|
71
|
+
'runSpecifiedTests',
|
|
72
|
+
'promotionDefaultCredential',
|
|
73
|
+
'validationPromotionDefaultCredential',
|
|
74
|
+
'apexTestLevel',
|
|
75
|
+
'platform',
|
|
76
|
+
];
|
|
77
|
+
export function collectMutationFlagKeys(flags) {
|
|
78
|
+
const selected = [];
|
|
79
|
+
for (const key of MUTATION_FLAG_KEYS) {
|
|
80
|
+
if (flags[key] !== undefined) {
|
|
81
|
+
selected.push(key);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return selected;
|
|
85
|
+
}
|
|
86
|
+
export function buildMutationPayload(flags) {
|
|
87
|
+
const payload = {};
|
|
88
|
+
for (const flagKey of MUTATION_FLAG_KEYS) {
|
|
89
|
+
const value = flags[flagKey];
|
|
90
|
+
if (value !== undefined) {
|
|
91
|
+
const payloadKey = ENVIRONMENT_MUTATION_FLAG_TO_PAYLOAD_KEY[flagKey];
|
|
92
|
+
Object.assign(payload, { [payloadKey]: value });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return payload;
|
|
96
|
+
}
|
|
97
|
+
export const environmentCreateStringFlags = {
|
|
98
|
+
'apex-test-level': environmentMutationStringFlags['apex-test-level'],
|
|
99
|
+
namespace: environmentMutationStringFlags.namespace,
|
|
100
|
+
'promotion-default-credential': environmentMutationStringFlags['promotion-default-credential'],
|
|
101
|
+
'run-specified-tests': environmentMutationStringFlags['run-specified-tests'],
|
|
102
|
+
'validation-promotion-default-credential': environmentMutationStringFlags['validation-promotion-default-credential'],
|
|
103
|
+
};
|
|
104
|
+
export const environmentUpdateFlags = {
|
|
105
|
+
...environmentMutationBooleanFlags,
|
|
106
|
+
...environmentMutationStringFlags,
|
|
107
|
+
};
|
|
108
|
+
export const environmentCreateFlags = {
|
|
109
|
+
...environmentMutationBooleanFlags,
|
|
110
|
+
...environmentCreateStringFlags,
|
|
111
|
+
platform: environmentPlatformFlag,
|
|
112
|
+
type: environmentCreateTypeFlag,
|
|
113
|
+
};
|
|
114
|
+
export function buildCreatePayload(name, flags) {
|
|
115
|
+
return {
|
|
116
|
+
...buildMutationPayload(flags),
|
|
117
|
+
name,
|
|
118
|
+
platform: flags.platform ?? DEFAULT_ENVIRONMENT_PLATFORM,
|
|
119
|
+
type: flags.type ?? DEFAULT_ENVIRONMENT_TYPE,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function formatMutationFlagName(key) {
|
|
123
|
+
return `--${key}`;
|
|
124
|
+
}
|
|
125
|
+
export function validateNonEmptyStringFields(payload, keys) {
|
|
126
|
+
for (const key of keys) {
|
|
127
|
+
const value = payload[key];
|
|
128
|
+
if (typeof value === 'string' && value.trim().length === 0) {
|
|
129
|
+
return `${key} value cannot be empty`;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=environment-flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-flags.js","sourceRoot":"","sources":["../../src/lib/environment-flags.ts"],"names":[],"mappings":"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"}
|