@pipeline-builder/pipeline-manager 0.0.1
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/LICENSE +202 -0
- package/README.md +145 -0
- package/cdk.json +91 -0
- package/config.yml +94 -0
- package/dist/agent/ai.d.ts +48 -0
- package/dist/agent/ai.d.ts.map +1 -0
- package/dist/agent/ai.js +149 -0
- package/dist/agent/bootstrap.d.ts +39 -0
- package/dist/agent/bootstrap.d.ts.map +1 -0
- package/dist/agent/bootstrap.js +66 -0
- package/dist/agent/env-file.d.ts +17 -0
- package/dist/agent/env-file.d.ts.map +1 -0
- package/dist/agent/env-file.js +47 -0
- package/dist/agent/executor.d.ts +30 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +60 -0
- package/dist/agent/health.d.ts +43 -0
- package/dist/agent/health.d.ts.map +1 -0
- package/dist/agent/health.js +109 -0
- package/dist/agent/ports.d.ts +26 -0
- package/dist/agent/ports.d.ts.map +1 -0
- package/dist/agent/ports.js +132 -0
- package/dist/agent/post-steps.d.ts +61 -0
- package/dist/agent/post-steps.d.ts.map +1 -0
- package/dist/agent/post-steps.js +131 -0
- package/dist/agent/prereqs.d.ts +26 -0
- package/dist/agent/prereqs.d.ts.map +1 -0
- package/dist/agent/prereqs.js +134 -0
- package/dist/agent/targets.d.ts +128 -0
- package/dist/agent/targets.d.ts.map +1 -0
- package/dist/agent/targets.js +265 -0
- package/dist/agent/tools.d.ts +13 -0
- package/dist/agent/tools.d.ts.map +1 -0
- package/dist/agent/tools.js +75 -0
- package/dist/agent/troubleshoot.d.ts +30 -0
- package/dist/agent/troubleshoot.d.ts.map +1 -0
- package/dist/agent/troubleshoot.js +87 -0
- package/dist/boilerplate.d.ts +3 -0
- package/dist/boilerplate.d.ts.map +1 -0
- package/dist/boilerplate.js +54 -0
- package/dist/cdk.json +91 -0
- package/dist/cli.d.ts +62 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +463 -0
- package/dist/commands/audit-stacks.d.ts +24 -0
- package/dist/commands/audit-stacks.d.ts.map +1 -0
- package/dist/commands/audit-stacks.js +182 -0
- package/dist/commands/audit-tokens.d.ts +21 -0
- package/dist/commands/audit-tokens.d.ts.map +1 -0
- package/dist/commands/audit-tokens.js +153 -0
- package/dist/commands/bootstrap.d.ts +11 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +159 -0
- package/dist/commands/create-pat.d.ts +27 -0
- package/dist/commands/create-pat.d.ts.map +1 -0
- package/dist/commands/create-pat.js +194 -0
- package/dist/commands/create-pipeline.d.ts +12 -0
- package/dist/commands/create-pipeline.d.ts.map +1 -0
- package/dist/commands/create-pipeline.js +315 -0
- package/dist/commands/deploy.d.ts +15 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +157 -0
- package/dist/commands/entity-get.d.ts +51 -0
- package/dist/commands/entity-get.d.ts.map +1 -0
- package/dist/commands/entity-get.js +69 -0
- package/dist/commands/entity-list.d.ts +39 -0
- package/dist/commands/entity-list.d.ts.map +1 -0
- package/dist/commands/entity-list.js +88 -0
- package/dist/commands/get-pipeline.d.ts +13 -0
- package/dist/commands/get-pipeline.d.ts.map +1 -0
- package/dist/commands/get-pipeline.js +49 -0
- package/dist/commands/get-plugin.d.ts +13 -0
- package/dist/commands/get-plugin.d.ts.map +1 -0
- package/dist/commands/get-plugin.js +51 -0
- package/dist/commands/instantiate-template.d.ts +20 -0
- package/dist/commands/instantiate-template.d.ts.map +1 -0
- package/dist/commands/instantiate-template.js +274 -0
- package/dist/commands/list-pipelines.d.ts +20 -0
- package/dist/commands/list-pipelines.d.ts.map +1 -0
- package/dist/commands/list-pipelines.js +99 -0
- package/dist/commands/list-plugins.d.ts +20 -0
- package/dist/commands/list-plugins.d.ts.map +1 -0
- package/dist/commands/list-plugins.js +92 -0
- package/dist/commands/login.d.ts +21 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +174 -0
- package/dist/commands/new-plugin.d.ts +12 -0
- package/dist/commands/new-plugin.d.ts.map +1 -0
- package/dist/commands/new-plugin.js +129 -0
- package/dist/commands/org-export.d.ts +25 -0
- package/dist/commands/org-export.d.ts.map +1 -0
- package/dist/commands/org-export.js +100 -0
- package/dist/commands/provision.d.ts +122 -0
- package/dist/commands/provision.d.ts.map +1 -0
- package/dist/commands/provision.js +867 -0
- package/dist/commands/redrive-events.d.ts +24 -0
- package/dist/commands/redrive-events.d.ts.map +1 -0
- package/dist/commands/redrive-events.js +127 -0
- package/dist/commands/register.d.ts +38 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +160 -0
- package/dist/commands/setup-events.d.ts +15 -0
- package/dist/commands/setup-events.d.ts.map +1 -0
- package/dist/commands/setup-events.js +168 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +81 -0
- package/dist/commands/store-token.d.ts +26 -0
- package/dist/commands/store-token.d.ts.map +1 -0
- package/dist/commands/store-token.js +305 -0
- package/dist/commands/synth.d.ts +21 -0
- package/dist/commands/synth.d.ts.map +1 -0
- package/dist/commands/synth.js +158 -0
- package/dist/commands/upload-plugin.d.ts +21 -0
- package/dist/commands/upload-plugin.d.ts.map +1 -0
- package/dist/commands/upload-plugin.js +275 -0
- package/dist/commands/validate-plugin.d.ts +12 -0
- package/dist/commands/validate-plugin.d.ts.map +1 -0
- package/dist/commands/validate-plugin.js +175 -0
- package/dist/commands/validate-templates.d.ts +11 -0
- package/dist/commands/validate-templates.d.ts.map +1 -0
- package/dist/commands/validate-templates.js +116 -0
- package/dist/commands/version.d.ts +12 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +216 -0
- package/dist/config/cli.constants.d.ts +116 -0
- package/dist/config/cli.constants.d.ts.map +1 -0
- package/dist/config/cli.constants.js +194 -0
- package/dist/config.yml +94 -0
- package/dist/lambda/token-renew-handler.d.ts +2 -0
- package/dist/lambda/token-renew-handler.d.ts.map +1 -0
- package/dist/lambda/token-renew-handler.js +125 -0
- package/dist/templates/events-stack.json +174 -0
- package/dist/templates/token-renew-stack.json +122 -0
- package/dist/types/config.d.ts +53 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +4 -0
- package/dist/types/error.d.ts +61 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +35 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/pipeline-template.d.ts +48 -0
- package/dist/types/pipeline-template.d.ts.map +1 -0
- package/dist/types/pipeline-template.js +4 -0
- package/dist/types/pipeline.d.ts +121 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +4 -0
- package/dist/types/plugin.d.ts +135 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +4 -0
- package/dist/utils/api-client.d.ts +26 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +151 -0
- package/dist/utils/audit-log.d.ts +8 -0
- package/dist/utils/audit-log.d.ts.map +1 -0
- package/dist/utils/audit-log.js +57 -0
- package/dist/utils/auth-guard.d.ts +20 -0
- package/dist/utils/auth-guard.d.ts.map +1 -0
- package/dist/utils/auth-guard.js +22 -0
- package/dist/utils/auth-utils.d.ts +68 -0
- package/dist/utils/auth-utils.d.ts.map +1 -0
- package/dist/utils/auth-utils.js +77 -0
- package/dist/utils/aws-env.d.ts +21 -0
- package/dist/utils/aws-env.d.ts.map +1 -0
- package/dist/utils/aws-env.js +34 -0
- package/dist/utils/aws-secrets.d.ts +48 -0
- package/dist/utils/aws-secrets.d.ts.map +1 -0
- package/dist/utils/aws-secrets.js +115 -0
- package/dist/utils/banner.d.ts +19 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +52 -0
- package/dist/utils/cdk-utils.d.ts +74 -0
- package/dist/utils/cdk-utils.d.ts.map +1 -0
- package/dist/utils/cdk-utils.js +152 -0
- package/dist/utils/command-utils.d.ts +75 -0
- package/dist/utils/command-utils.d.ts.map +1 -0
- package/dist/utils/command-utils.js +155 -0
- package/dist/utils/config-loader.d.ts +33 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +154 -0
- package/dist/utils/cron.d.ts +28 -0
- package/dist/utils/cron.d.ts.map +1 -0
- package/dist/utils/cron.js +119 -0
- package/dist/utils/deploy-runner.d.ts +38 -0
- package/dist/utils/deploy-runner.d.ts.map +1 -0
- package/dist/utils/deploy-runner.js +112 -0
- package/dist/utils/error-handler.d.ts +29 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +302 -0
- package/dist/utils/list-command-utils.d.ts +23 -0
- package/dist/utils/list-command-utils.d.ts.map +1 -0
- package/dist/utils/list-command-utils.js +57 -0
- package/dist/utils/output-utils.d.ts +40 -0
- package/dist/utils/output-utils.d.ts.map +1 -0
- package/dist/utils/output-utils.js +250 -0
- package/dist/utils/pipeline-config.d.ts +33 -0
- package/dist/utils/pipeline-config.d.ts.map +1 -0
- package/dist/utils/pipeline-config.js +55 -0
- package/dist/utils/platform-secret.d.ts +27 -0
- package/dist/utils/platform-secret.d.ts.map +1 -0
- package/dist/utils/platform-secret.js +92 -0
- package/dist/utils/plugin-resolver.d.ts +17 -0
- package/dist/utils/plugin-resolver.d.ts.map +1 -0
- package/dist/utils/plugin-resolver.js +101 -0
- package/dist/utils/preflight.d.ts +26 -0
- package/dist/utils/preflight.d.ts.map +1 -0
- package/dist/utils/preflight.js +59 -0
- package/dist/utils/rate-limiter.d.ts +15 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +164 -0
- package/dist/utils/registry.d.ts +86 -0
- package/dist/utils/registry.d.ts.map +1 -0
- package/dist/utils/registry.js +140 -0
- package/dist/utils/response-utils.d.ts +21 -0
- package/dist/utils/response-utils.d.ts.map +1 -0
- package/dist/utils/response-utils.js +70 -0
- package/dist/utils/tls.d.ts +52 -0
- package/dist/utils/tls.d.ts.map +1 -0
- package/dist/utils/tls.js +88 -0
- package/package.json +181 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for Secrets Manager operations.
|
|
3
|
+
*/
|
|
4
|
+
export interface SecretsOptions {
|
|
5
|
+
region?: string;
|
|
6
|
+
profile?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Create or update a secret in AWS Secrets Manager.
|
|
10
|
+
* Tries create first; if it exists, updates the value and description.
|
|
11
|
+
*/
|
|
12
|
+
export declare function upsertSecret(secretName: string, secretValue: string, description: string, options: SecretsOptions): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Get the ARN of a secret.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getSecretArn(secretName: string, options: SecretsOptions): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Get the value of a secret.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getSecretValue(secretName: string, options: SecretsOptions): Promise<string>;
|
|
21
|
+
/** Minimal secret summary returned by listSecrets. */
|
|
22
|
+
export interface SecretSummary {
|
|
23
|
+
name: string;
|
|
24
|
+
arn: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
lastChangedDate?: Date;
|
|
27
|
+
}
|
|
28
|
+
/** Result of a paginated {@link listSecrets} sweep. */
|
|
29
|
+
export interface ListSecretsResult {
|
|
30
|
+
secrets: SecretSummary[];
|
|
31
|
+
/**
|
|
32
|
+
* True when `maxPages` was hit while AWS still had a NextToken — i.e. the
|
|
33
|
+
* result is INCOMPLETE. Callers (e.g. audit-tokens) must surface this rather
|
|
34
|
+
* than silently under-reporting, since a truncated scan can miss an expiring
|
|
35
|
+
* token past the cap.
|
|
36
|
+
*/
|
|
37
|
+
truncated: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* List secrets matching a name prefix. Pages internally up to `maxPages` (default 20).
|
|
41
|
+
*
|
|
42
|
+
* @param namePrefix - Filter by `Name` prefix (case-sensitive). Falls back to
|
|
43
|
+
* listing all secrets when omitted (use sparingly).
|
|
44
|
+
* @returns the collected secrets plus a `truncated` flag signalling the cap was
|
|
45
|
+
* hit with more pages remaining.
|
|
46
|
+
*/
|
|
47
|
+
export declare function listSecrets(namePrefix: string | undefined, options: SecretsOptions, maxPages?: number): Promise<ListSecretsResult>;
|
|
48
|
+
//# sourceMappingURL=aws-secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-secrets.d.ts","sourceRoot":"","sources":["../../src/utils/aws-secrets.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,IAAI,CAAC;CACxB;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB;;;;;OAKG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,cAAc,EACvB,QAAQ,SAAK,GACZ,OAAO,CAAC,iBAAiB,CAAC,CA6B5B"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { SecretsManagerClient, CreateSecretCommand, PutSecretValueCommand, UpdateSecretCommand, DescribeSecretCommand, GetSecretValueCommand, ListSecretsCommand, } from '@aws-sdk/client-secrets-manager';
|
|
4
|
+
import { applyAwsProfile, resolveAwsRegion } from './aws-env.js';
|
|
5
|
+
import { printInfo, printSuccess } from './output-utils.js';
|
|
6
|
+
function createClient(options) {
|
|
7
|
+
// Leave `credentials` unset so the SDK's standard provider chain resolves them
|
|
8
|
+
// (env vars win, else the shared profile). See applyAwsProfile for the exact
|
|
9
|
+
// --profile precedence, and resolveAwsRegion for the region fallback.
|
|
10
|
+
applyAwsProfile(options.profile);
|
|
11
|
+
return new SecretsManagerClient({ region: resolveAwsRegion(options.region) });
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create or update a secret in AWS Secrets Manager.
|
|
15
|
+
* Tries create first; if it exists, updates the value and description.
|
|
16
|
+
*/
|
|
17
|
+
export async function upsertSecret(secretName, secretValue, description, options) {
|
|
18
|
+
const client = createClient(options);
|
|
19
|
+
try {
|
|
20
|
+
await client.send(new CreateSecretCommand({
|
|
21
|
+
Name: secretName,
|
|
22
|
+
Description: description,
|
|
23
|
+
SecretString: secretValue,
|
|
24
|
+
}));
|
|
25
|
+
printSuccess('Secret created in Secrets Manager');
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
// AWS SDK v3 carries the modeled exception type on `error.name`; `message` does
|
|
29
|
+
// NOT reliably contain it, so a message-only check would mis-classify an
|
|
30
|
+
// already-exists error as fatal and rethrow instead of updating. Prefer name.
|
|
31
|
+
const err = error;
|
|
32
|
+
const errMsg = err?.message ?? '';
|
|
33
|
+
if (err?.name === 'ResourceExistsException' || errMsg.includes('ResourceExistsException') || errMsg.includes('already exists')) {
|
|
34
|
+
printInfo('Secret already exists, updating...');
|
|
35
|
+
await client.send(new PutSecretValueCommand({
|
|
36
|
+
SecretId: secretName,
|
|
37
|
+
SecretString: secretValue,
|
|
38
|
+
}));
|
|
39
|
+
await client.send(new UpdateSecretCommand({
|
|
40
|
+
SecretId: secretName,
|
|
41
|
+
Description: description,
|
|
42
|
+
}));
|
|
43
|
+
printSuccess('Secret updated in Secrets Manager');
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the ARN of a secret.
|
|
52
|
+
*/
|
|
53
|
+
export async function getSecretArn(secretName, options) {
|
|
54
|
+
const client = createClient(options);
|
|
55
|
+
const response = await client.send(new DescribeSecretCommand({
|
|
56
|
+
SecretId: secretName,
|
|
57
|
+
}));
|
|
58
|
+
return response.ARN ?? '(unknown)';
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the value of a secret.
|
|
62
|
+
*/
|
|
63
|
+
export async function getSecretValue(secretName, options) {
|
|
64
|
+
const client = createClient(options);
|
|
65
|
+
const response = await client.send(new GetSecretValueCommand({
|
|
66
|
+
SecretId: secretName,
|
|
67
|
+
}));
|
|
68
|
+
if (!response.SecretString) {
|
|
69
|
+
throw new Error(`Secret "${secretName}" is empty`);
|
|
70
|
+
}
|
|
71
|
+
return response.SecretString;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* List secrets matching a name prefix. Pages internally up to `maxPages` (default 20).
|
|
75
|
+
*
|
|
76
|
+
* @param namePrefix - Filter by `Name` prefix (case-sensitive). Falls back to
|
|
77
|
+
* listing all secrets when omitted (use sparingly).
|
|
78
|
+
* @returns the collected secrets plus a `truncated` flag signalling the cap was
|
|
79
|
+
* hit with more pages remaining.
|
|
80
|
+
*/
|
|
81
|
+
export async function listSecrets(namePrefix, options, maxPages = 20) {
|
|
82
|
+
const client = createClient(options);
|
|
83
|
+
const out = [];
|
|
84
|
+
let nextToken;
|
|
85
|
+
let page = 0;
|
|
86
|
+
let truncated = false;
|
|
87
|
+
do {
|
|
88
|
+
const response = await client.send(new ListSecretsCommand({
|
|
89
|
+
MaxResults: 100,
|
|
90
|
+
NextToken: nextToken,
|
|
91
|
+
...(namePrefix && {
|
|
92
|
+
Filters: [{ Key: 'name', Values: [namePrefix] }],
|
|
93
|
+
}),
|
|
94
|
+
}));
|
|
95
|
+
for (const s of response.SecretList ?? []) {
|
|
96
|
+
if (!s.Name || !s.ARN)
|
|
97
|
+
continue;
|
|
98
|
+
out.push({
|
|
99
|
+
name: s.Name,
|
|
100
|
+
arn: s.ARN,
|
|
101
|
+
description: s.Description,
|
|
102
|
+
lastChangedDate: s.LastChangedDate,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
nextToken = response.NextToken;
|
|
106
|
+
page++;
|
|
107
|
+
// More pages exist but we've hit the cap — signal an incomplete sweep.
|
|
108
|
+
if (nextToken && page >= maxPages) {
|
|
109
|
+
truncated = true;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
} while (nextToken);
|
|
113
|
+
return { secrets: out, truncated };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXNlY3JldHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYXdzLXNlY3JldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsa0JBQWtCLEdBQ25CLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBVTVELFNBQVMsWUFBWSxDQUFDLE9BQXVCO0lBQzNDLCtFQUErRTtJQUMvRSw2RUFBNkU7SUFDN0Usc0VBQXNFO0lBQ3RFLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsT0FBTyxJQUFJLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxVQUFrQixFQUNsQixXQUFtQixFQUNuQixXQUFtQixFQUNuQixPQUF1QjtJQUV2QixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFckMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksbUJBQW1CLENBQUM7WUFDeEMsSUFBSSxFQUFFLFVBQVU7WUFDaEIsV0FBVyxFQUFFLFdBQVc7WUFDeEIsWUFBWSxFQUFFLFdBQVc7U0FDMUIsQ0FBQyxDQUFDLENBQUM7UUFDSixZQUFZLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJ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UUFBUSxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUFFLFNBQVM7WUFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDUCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7Z0JBQ1osR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHO2dCQUNWLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVztnQkFDMUIsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlO2FBQ25DLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMvQixJQUFJLEVBQUUsQ0FBQztRQUNQLHVFQUF1RTtRQUN2RSxJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQUMsTUFBTTtRQUFDLENBQUM7SUFDakUsQ0FBQyxRQUFRLFNBQVMsRUFBRTtJQUNwQixPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7XG4gIFNlY3JldHNNYW5hZ2VyQ2xpZW50LFxuICBDcmVhdGVTZWNyZXRDb21tYW5kLFxuICBQdXRTZWNyZXRWYWx1ZUNvbW1hbmQsXG4gIFVwZGF0ZVNlY3JldENvbW1hbmQsXG4gIERlc2NyaWJlU2VjcmV0Q29tbWFuZCxcbiAgR2V0U2VjcmV0VmFsdWVDb21tYW5kLFxuICBMaXN0U2VjcmV0c0NvbW1hbmQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zZWNyZXRzLW1hbmFnZXInO1xuaW1wb3J0IHsgYXBwbHlBd3NQcm9maWxlLCByZXNvbHZlQXdzUmVnaW9uIH0gZnJvbSAnLi9hd3MtZW52LmpzJztcbmltcG9ydCB7IHByaW50SW5mbywgcHJpbnRTdWNjZXNzIH0gZnJvbSAnLi9vdXRwdXQtdXRpbHMuanMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIFNlY3JldHMgTWFuYWdlciBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldHNPcHRpb25zIHtcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBwcm9maWxlPzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGllbnQob3B0aW9uczogU2VjcmV0c09wdGlvbnMpOiBTZWNyZXRzTWFuYWdlckNsaWVudCB7XG4gIC8vIExlYXZlIGBjcmVkZW50aWFsc2AgdW5zZXQgc28gdGhlIFNESydzIHN0YW5kYXJkIHByb3ZpZGVyIGNoYWluIHJlc29sdmVzIHRoZW1cbiAgLy8gKGVudiB2YXJzIHdpbiwgZWxzZSB0aGUgc2hhcmVkIHByb2ZpbGUpLiBTZWUgYXBwbHlBd3NQcm9maWxlIGZvciB0aGUgZXhhY3RcbiAgLy8gLS1wcm9maWxlIHByZWNlZGVuY2UsIGFuZCByZXNvbHZlQXdzUmVnaW9uIGZvciB0aGUgcmVnaW9uIGZhbGxiYWNrLlxuICBhcHBseUF3c1Byb2ZpbGUob3B0aW9ucy5wcm9maWxlKTtcbiAgcmV0dXJuIG5ldyBTZWNyZXRzTWFuYWdlckNsaWVudCh7IHJlZ2lvbjogcmVzb2x2ZUF3c1JlZ2lvbihvcHRpb25zLnJlZ2lvbikgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIG9yIHVwZGF0ZSBhIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyLlxuICogVHJpZXMgY3JlYXRlIGZpcnN0OyBpZiBpdCBleGlzdHMsIHVwZGF0ZXMgdGhlIHZhbHVlIGFuZCBkZXNjcmlwdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwc2VydFNlY3JldChcbiAgc2VjcmV0TmFtZTogc3RyaW5nLFxuICBzZWNyZXRWYWx1ZTogc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICBvcHRpb25zOiBTZWNyZXRzT3B0aW9ucyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVDbGllbnQob3B0aW9ucyk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBjbGllbnQuc2VuZChuZXcgQ3JlYXRlU2VjcmV0Q29tbWFuZCh7XG4gICAgICBOYW1lOiBzZWNyZXROYW1lLFxuICAgICAgRGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgU2VjcmV0U3RyaW5nOiBzZWNyZXRWYWx1ZSxcbiAgICB9KSk7XG4gICAgcHJpbnRTdWNjZXNzKCdTZWNyZXQgY3JlYXRlZCBpbiBTZWNyZXRzIE1hbmFnZXInKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBBV1MgU0RLIHYzIGNhcnJpZXMgdGhlIG1vZGVsZWQgZXhjZXB0aW9uIHR5cGUgb24gYGVycm9yLm5hbWVgOyBgbWVzc2FnZWAgZG9lc1xuICAgIC8vIE5PVCByZWxpYWJseSBjb250YWluIGl0LCBzbyBhIG1lc3NhZ2Utb25seSBjaGVjayB3b3VsZCBtaXMtY2xhc3NpZnkgYW5cbiAgICAvLyBhbHJlYWR5LWV4aXN0cyBlcnJvciBhcyBmYXRhbCBhbmQgcmV0aHJvdyBpbnN0ZWFkIG9mIHVwZGF0aW5nLiBQcmVmZXIgbmFtZS5cbiAgICBjb25zdCBlcnIgPSBlcnJvciBhcyB7IG5hbWU/OiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmcgfTtcbiAgICBjb25zdCBlcnJNc2cgPSBlcnI/Lm1lc3NhZ2UgPz8gJyc7XG4gICAgaWYgKGVycj8ubmFtZSA9PT0gJ1Jlc291cmNlRXhpc3RzRXhjZXB0aW9uJyB8fCBlcnJNc2cuaW5jbHVkZXMoJ1Jlc291cmNlRXhpc3RzRXhjZXB0aW9uJykgfHwgZXJyTXNnLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICBwcmludEluZm8oJ1NlY3JldCBhbHJlYWR5IGV4aXN0cywgdXBkYXRpbmcuLi4nKTtcbiAgICAgIGF3YWl0IGNsaWVudC5zZW5kKG5ldyBQdXRTZWNyZXRWYWx1ZUNvbW1hbmQoe1xuICAgICAgICBTZWNyZXRJZDogc2VjcmV0TmFtZSxcbiAgICAgICAgU2VjcmV0U3RyaW5nOiBzZWNyZXRWYWx1ZSxcbiAgICAgIH0pKTtcbiAgICAgIGF3YWl0IGNsaWVudC5zZW5kKG5ldyBVcGRhdGVTZWNyZXRDb21tYW5kKHtcbiAgICAgICAgU2VjcmV0SWQ6IHNlY3JldE5hbWUsXG4gICAgICAgIERlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgIH0pKTtcbiAgICAgIHByaW50U3VjY2VzcygnU2VjcmV0IHVwZGF0ZWQgaW4gU2VjcmV0cyBNYW5hZ2VyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgQVJOIG9mIGEgc2VjcmV0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VjcmV0QXJuKFxuICBzZWNyZXROYW1lOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFNlY3JldHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlQ2xpZW50KG9wdGlvbnMpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBEZXNjcmliZVNlY3JldENvbW1hbmQoe1xuICAgIFNlY3JldElkOiBzZWNyZXROYW1lLFxuICB9KSk7XG4gIHJldHVybiByZXNwb25zZS5BUk4gPz8gJyh1bmtub3duKSc7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBhIHNlY3JldC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlY3JldFZhbHVlKFxuICBzZWNyZXROYW1lOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFNlY3JldHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlQ2xpZW50KG9wdGlvbnMpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoe1xuICAgIFNlY3JldElkOiBzZWNyZXROYW1lLFxuICB9KSk7XG4gIGlmICghcmVzcG9uc2UuU2VjcmV0U3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTZWNyZXQgXCIke3NlY3JldE5hbWV9XCIgaXMgZW1wdHlgKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2UuU2VjcmV0U3RyaW5nO1xufVxuXG4vKiogTWluaW1hbCBzZWNyZXQgc3VtbWFyeSByZXR1cm5lZCBieSBsaXN0U2VjcmV0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjcmV0U3VtbWFyeSB7XG4gIG5hbWU6IHN0cmluZztcbiAgYXJuOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBsYXN0Q2hhbmdlZERhdGU/OiBEYXRlO1xufVxuXG4vKiogUmVzdWx0IG9mIGEgcGFnaW5hdGVkIHtAbGluayBsaXN0U2VjcmV0c30gc3dlZXAuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RTZWNyZXRzUmVzdWx0IHtcbiAgc2VjcmV0czogU2VjcmV0U3VtbWFyeVtdO1xuICAvKipcbiAgICogVHJ1ZSB3aGVuIGBtYXhQYWdlc2Agd2FzIGhpdCB3aGlsZSBBV1Mgc3RpbGwgaGFkIGEgTmV4dFRva2VuIOKAlCBpLmUuIHRoZVxuICAgKiByZXN1bHQgaXMgSU5DT01QTEVURS4gQ2FsbGVycyAoZS5nLiBhdWRpdC10b2tlbnMpIG11c3Qgc3VyZmFjZSB0aGlzIHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IHVuZGVyLXJlcG9ydGluZywgc2luY2UgYSB0cnVuY2F0ZWQgc2NhbiBjYW4gbWlzcyBhbiBleHBpcmluZ1xuICAgKiB0b2tlbiBwYXN0IHRoZSBjYXAuXG4gICAqL1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTGlzdCBzZWNyZXRzIG1hdGNoaW5nIGEgbmFtZSBwcmVmaXguIFBhZ2VzIGludGVybmFsbHkgdXAgdG8gYG1heFBhZ2VzYCAoZGVmYXVsdCAyMCkuXG4gKlxuICogQHBhcmFtIG5hbWVQcmVmaXggLSBGaWx0ZXIgYnkgYE5hbWVgIHByZWZpeCAoY2FzZS1zZW5zaXRpdmUpLiBGYWxscyBiYWNrIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgbGlzdGluZyBhbGwgc2VjcmV0cyB3aGVuIG9taXR0ZWQgKHVzZSBzcGFyaW5nbHkpLlxuICogQHJldHVybnMgdGhlIGNvbGxlY3RlZCBzZWNyZXRzIHBsdXMgYSBgdHJ1bmNhdGVkYCBmbGFnIHNpZ25hbGxpbmcgdGhlIGNhcCB3YXNcbiAqICAgICAgICAgIGhpdCB3aXRoIG1vcmUgcGFnZXMgcmVtYWluaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNlY3JldHMoXG4gIG5hbWVQcmVmaXg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogU2VjcmV0c09wdGlvbnMsXG4gIG1heFBhZ2VzID0gMjAsXG4pOiBQcm9taXNlPExpc3RTZWNyZXRzUmVzdWx0PiB7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUNsaWVudChvcHRpb25zKTtcbiAgY29uc3Qgb3V0OiBTZWNyZXRTdW1tYXJ5W10gPSBbXTtcbiAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcGFnZSA9IDA7XG4gIGxldCB0cnVuY2F0ZWQgPSBmYWxzZTtcbiAgZG8ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IExpc3RTZWNyZXRzQ29tbWFuZCh7XG4gICAgICBNYXhSZXN1bHRzOiAxMDAsXG4gICAgICBOZXh0VG9rZW46IG5leHRUb2tlbixcbiAgICAgIC4uLihuYW1lUHJlZml4ICYmIHtcbiAgICAgICAgRmlsdGVyczogW3sgS2V5OiAnbmFtZScsIFZhbHVlczogW25hbWVQcmVmaXhdIH1dLFxuICAgICAgfSksXG4gICAgfSkpO1xuICAgIGZvciAoY29uc3QgcyBvZiByZXNwb25zZS5TZWNyZXRMaXN0ID8/IFtdKSB7XG4gICAgICBpZiAoIXMuTmFtZSB8fCAhcy5BUk4pIGNvbnRpbnVlO1xuICAgICAgb3V0LnB1c2goe1xuICAgICAgICBuYW1lOiBzLk5hbWUsXG4gICAgICAgIGFybjogcy5BUk4sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzLkRlc2NyaXB0aW9uLFxuICAgICAgICBsYXN0Q2hhbmdlZERhdGU6IHMuTGFzdENoYW5nZWREYXRlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIG5leHRUb2tlbiA9IHJlc3BvbnNlLk5leHRUb2tlbjtcbiAgICBwYWdlKys7XG4gICAgLy8gTW9yZSBwYWdlcyBleGlzdCBidXQgd2UndmUgaGl0IHRoZSBjYXAg4oCUIHNpZ25hbCBhbiBpbmNvbXBsZXRlIHN3ZWVwLlxuICAgIGlmIChuZXh0VG9rZW4gJiYgcGFnZSA+PSBtYXhQYWdlcykgeyB0cnVuY2F0ZWQgPSB0cnVlOyBicmVhazsgfVxuICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuICByZXR1cm4geyBzZWNyZXRzOiBvdXQsIHRydW5jYXRlZCB9O1xufVxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Banner display options
|
|
3
|
+
*/
|
|
4
|
+
export interface BannerOptions {
|
|
5
|
+
showDescription?: boolean;
|
|
6
|
+
minimal?: boolean;
|
|
7
|
+
message?: string;
|
|
8
|
+
showTimestamp?: boolean;
|
|
9
|
+
showExecutionId?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Display CLI banner with application info
|
|
13
|
+
*/
|
|
14
|
+
export declare function banner(options?: BannerOptions): void;
|
|
15
|
+
/**
|
|
16
|
+
* Display a minimal banner (name and version only)
|
|
17
|
+
*/
|
|
18
|
+
export declare function miniBanner(): void;
|
|
19
|
+
//# sourceMappingURL=banner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,IAAI,CA8CxD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAMjC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import figlet from 'figlet';
|
|
4
|
+
import pico from 'picocolors';
|
|
5
|
+
import { APP_DESCRIPTION, APP_NAME, APP_VERSION, BANNER_OPTIONS, generateExecutionId, } from '../config/cli.constants.js';
|
|
6
|
+
const { bold, green, cyan, dim } = pico;
|
|
7
|
+
/**
|
|
8
|
+
* Display CLI banner with application info
|
|
9
|
+
*/
|
|
10
|
+
export function banner(options = {}) {
|
|
11
|
+
const { showDescription = true, minimal = false, message, showTimestamp = false, showExecutionId = false, } = options;
|
|
12
|
+
if (minimal) {
|
|
13
|
+
console.log(green(bold(`[${APP_NAME.toUpperCase()}]`)), cyan(`v${APP_VERSION}`));
|
|
14
|
+
if (message)
|
|
15
|
+
console.log(dim(message));
|
|
16
|
+
if (showExecutionId)
|
|
17
|
+
console.log(dim(`Execution ID: ${generateExecutionId()}`));
|
|
18
|
+
console.log('');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// Full banner with ASCII art
|
|
22
|
+
try {
|
|
23
|
+
const asciiArt = figlet.textSync('Pipeline Manager', BANNER_OPTIONS);
|
|
24
|
+
console.log(green(asciiArt));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
const width = BANNER_OPTIONS.getWidth();
|
|
28
|
+
console.log(green(bold('═'.repeat(width))));
|
|
29
|
+
console.log(green(bold(` ${APP_NAME.toUpperCase()}`)));
|
|
30
|
+
console.log(green(bold('═'.repeat(width))));
|
|
31
|
+
}
|
|
32
|
+
console.log(green(bold(`[${APP_NAME.toUpperCase()}]`)), cyan(`v${APP_VERSION}`));
|
|
33
|
+
if (message) {
|
|
34
|
+
console.log(dim(message));
|
|
35
|
+
}
|
|
36
|
+
else if (showDescription) {
|
|
37
|
+
console.log(dim(APP_DESCRIPTION));
|
|
38
|
+
}
|
|
39
|
+
if (showExecutionId)
|
|
40
|
+
console.log(dim(`Execution ID: ${generateExecutionId()}`));
|
|
41
|
+
if (showTimestamp)
|
|
42
|
+
console.log(dim(`Started: ${new Date().toLocaleString()}`));
|
|
43
|
+
console.log('');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Display a minimal banner (name and version only)
|
|
47
|
+
*/
|
|
48
|
+
export function miniBanner() {
|
|
49
|
+
console.log(green(bold(`[${APP_NAME.toUpperCase()}]`)), cyan(`v${APP_VERSION}`));
|
|
50
|
+
console.log('');
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2Jhbm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUNMLGVBQWUsRUFDZixRQUFRLEVBQ1IsV0FBVyxFQUNYLGNBQWMsRUFDZCxtQkFBbUIsR0FDcEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBYXhDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxPQUFPLEdBQWtCLEVBQUU7SUFDaEQsTUFBTSxFQUNKLGVBQWUsR0FBRyxJQUFJLEVBQ3RCLE9BQU8sR0FBRyxLQUFLLEVBQ2YsT0FBTyxFQUNQLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLGVBQWUsR0FBRyxLQUFLLEdBQ3hCLEdBQUcsT0FBTyxDQUFDO0lBRVosSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FBQyxHQUFHLENBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFDMUMsSUFBSSxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsQ0FDeEIsQ0FBQztRQUNGLElBQUksT0FBTztZQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdkMsSUFBSSxlQUFlO1lBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixPQUFPO0lBQ1QsQ0FBQztJQUVELDZCQUE2QjtJQUM3QixJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUMxQyxJQUFJLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUN4QixDQUFDO0lBRUYsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztTQUFNLElBQUksZUFBZSxFQUFFLENBQUM7UUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEYsSUFBSSxhQUFhO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRS9FLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVU7SUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUMxQyxJQUFJLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUN4QixDQUFDO0lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBmaWdsZXQgZnJvbSAnZmlnbGV0JztcbmltcG9ydCBwaWNvIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IHtcbiAgQVBQX0RFU0NSSVBUSU9OLFxuICBBUFBfTkFNRSxcbiAgQVBQX1ZFUlNJT04sXG4gIEJBTk5FUl9PUFRJT05TLFxuICBnZW5lcmF0ZUV4ZWN1dGlvbklkLFxufSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5cbmNvbnN0IHsgYm9sZCwgZ3JlZW4sIGN5YW4sIGRpbSB9ID0gcGljbztcblxuLyoqXG4gKiBCYW5uZXIgZGlzcGxheSBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFubmVyT3B0aW9ucyB7XG4gIHNob3dEZXNjcmlwdGlvbj86IGJvb2xlYW47XG4gIG1pbmltYWw/OiBib29sZWFuO1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICBzaG93VGltZXN0YW1wPzogYm9vbGVhbjtcbiAgc2hvd0V4ZWN1dGlvbklkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEaXNwbGF5IENMSSBiYW5uZXIgd2l0aCBhcHBsaWNhdGlvbiBpbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYW5uZXIob3B0aW9uczogQmFubmVyT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBzaG93RGVzY3JpcHRpb24gPSB0cnVlLFxuICAgIG1pbmltYWwgPSBmYWxzZSxcbiAgICBtZXNzYWdlLFxuICAgIHNob3dUaW1lc3RhbXAgPSBmYWxzZSxcbiAgICBzaG93RXhlY3V0aW9uSWQgPSBmYWxzZSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKG1pbmltYWwpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGdyZWVuKGJvbGQoYFske0FQUF9OQU1FLnRvVXBwZXJDYXNlKCl9XWApKSxcbiAgICAgIGN5YW4oYHYke0FQUF9WRVJTSU9OfWApLFxuICAgICk7XG4gICAgaWYgKG1lc3NhZ2UpIGNvbnNvbGUubG9nKGRpbShtZXNzYWdlKSk7XG4gICAgaWYgKHNob3dFeGVjdXRpb25JZCkgY29uc29sZS5sb2coZGltKGBFeGVjdXRpb24gSUQ6ICR7Z2VuZXJhdGVFeGVjdXRpb25JZCgpfWApKTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRnVsbCBiYW5uZXIgd2l0aCBBU0NJSSBhcnRcbiAgdHJ5IHtcbiAgICBjb25zdCBhc2NpaUFydCA9IGZpZ2xldC50ZXh0U3luYygnUGlwZWxpbmUgTWFuYWdlcicsIEJBTk5FUl9PUFRJT05TKTtcbiAgICBjb25zb2xlLmxvZyhncmVlbihhc2NpaUFydCkpO1xuICB9IGNhdGNoIHtcbiAgICBjb25zdCB3aWR0aCA9IEJBTk5FUl9PUFRJT05TLmdldFdpZHRoKCk7XG4gICAgY29uc29sZS5sb2coZ3JlZW4oYm9sZCgn4pWQJy5yZXBlYXQod2lkdGgpKSkpO1xuICAgIGNvbnNvbGUubG9nKGdyZWVuKGJvbGQoYCAgJHtBUFBfTkFNRS50b1VwcGVyQ2FzZSgpfWApKSk7XG4gICAgY29uc29sZS5sb2coZ3JlZW4oYm9sZCgn4pWQJy5yZXBlYXQod2lkdGgpKSkpO1xuICB9XG5cbiAgY29uc29sZS5sb2coXG4gICAgZ3JlZW4oYm9sZChgWyR7QVBQX05BTUUudG9VcHBlckNhc2UoKX1dYCkpLFxuICAgIGN5YW4oYHYke0FQUF9WRVJTSU9OfWApLFxuICApO1xuXG4gIGlmIChtZXNzYWdlKSB7XG4gICAgY29uc29sZS5sb2coZGltKG1lc3NhZ2UpKTtcbiAgfSBlbHNlIGlmIChzaG93RGVzY3JpcHRpb24pIHtcbiAgICBjb25zb2xlLmxvZyhkaW0oQVBQX0RFU0NSSVBUSU9OKSk7XG4gIH1cblxuICBpZiAoc2hvd0V4ZWN1dGlvbklkKSBjb25zb2xlLmxvZyhkaW0oYEV4ZWN1dGlvbiBJRDogJHtnZW5lcmF0ZUV4ZWN1dGlvbklkKCl9YCkpO1xuICBpZiAoc2hvd1RpbWVzdGFtcCkgY29uc29sZS5sb2coZGltKGBTdGFydGVkOiAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKX1gKSk7XG5cbiAgY29uc29sZS5sb2coJycpO1xufVxuXG4vKipcbiAqIERpc3BsYXkgYSBtaW5pbWFsIGJhbm5lciAobmFtZSBhbmQgdmVyc2lvbiBvbmx5KVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluaUJhbm5lcigpOiB2b2lkIHtcbiAgY29uc29sZS5sb2coXG4gICAgZ3JlZW4oYm9sZChgWyR7QVBQX05BTUUudG9VcHBlckNhc2UoKX1dYCkpLFxuICAgIGN5YW4oYHYke0FQUF9WRVJTSU9OfWApLFxuICApO1xuICBjb25zb2xlLmxvZygnJyk7XG59XG4iXX0=
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path to dist/boilerplate.js. tsc emits commands at dist/commands/, so
|
|
3
|
+
* boilerplate is one level up.
|
|
4
|
+
*/
|
|
5
|
+
export declare function resolveBoilerplatePath(callerDir: string): string;
|
|
6
|
+
export interface CdkInfo {
|
|
7
|
+
available: boolean;
|
|
8
|
+
version: string | null;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Checks whether a CLI tool is installed and returns its version output.
|
|
13
|
+
*
|
|
14
|
+
* Tries `<tool> <versionArg>` first. If that fails (typically because the tool
|
|
15
|
+
* is on PATH via the user's shell rc but execSync's default `/bin/sh` doesn't
|
|
16
|
+
* source it), falls back to running through the user's login+interactive shell
|
|
17
|
+
* (`$SHELL -ilc`) so node version managers like nvm/asdf and homebrew paths
|
|
18
|
+
* become visible. stdin is ignored so an interactive shell can't block on input.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getToolInfo(tool: string, versionArg?: string): CdkInfo;
|
|
21
|
+
/**
|
|
22
|
+
* Checks whether the AWS CDK CLI is installed and returns its version.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getCdkInfo(): CdkInfo;
|
|
25
|
+
/**
|
|
26
|
+
* Checks whether the AWS CDK CLI is installed and accessible on the PATH.
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkCdkAvailable(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Asserts that the AWS CDK CLI is installed; throws with a user-friendly
|
|
31
|
+
* message + install hint when it isn't. Use at the top of any command that
|
|
32
|
+
* shells out to `cdk`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function ensureCdkAvailable(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Asserts that the local toolchain CDK needs to bundle the PluginLookup Lambda
|
|
37
|
+
* is present. Synth builds that Lambda via `NodejsFunction` (esbuild); when
|
|
38
|
+
* esbuild isn't on PATH, CDK silently falls back to **Docker bundling**, which
|
|
39
|
+
* can't resolve the handler's cross-directory imports and dies with an opaque
|
|
40
|
+
* `Could not resolve "axios"` / `"../config/handler-constants.js"`. pnpm is also
|
|
41
|
+
* required because the handler's lockfile is `pnpm-lock.yaml`, so CDK drives
|
|
42
|
+
* esbuild through pnpm. Fail fast here with the fix instead of deep in a bundle.
|
|
43
|
+
*
|
|
44
|
+
* Bypass with `SKIP_BUNDLER_CHECK=1` (e.g. an environment that intentionally
|
|
45
|
+
* bundles in Docker with a working mount scope).
|
|
46
|
+
*/
|
|
47
|
+
export declare function ensureBundlerAvailable(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Options for executing a CDK shell command.
|
|
50
|
+
*/
|
|
51
|
+
export interface CdkShellOptions {
|
|
52
|
+
/** When `true`, prints the error to stderr on failure. */
|
|
53
|
+
debug?: boolean;
|
|
54
|
+
/** When `true`, inherits stdio so output streams to the terminal. Defaults to `true`. */
|
|
55
|
+
showOutput?: boolean;
|
|
56
|
+
/** Additional environment variables to inject. */
|
|
57
|
+
env?: Record<string, string>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Result of a CDK shell command execution.
|
|
61
|
+
*/
|
|
62
|
+
export interface CdkShellResult {
|
|
63
|
+
success: boolean;
|
|
64
|
+
duration: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Executes a CDK CLI command as a child process.
|
|
68
|
+
*
|
|
69
|
+
* @param command - The full CDK CLI command string (e.g., `cdk bootstrap ...`).
|
|
70
|
+
* @param options - Optional execution settings.
|
|
71
|
+
* @returns An object with `success` and `duration` in ms.
|
|
72
|
+
*/
|
|
73
|
+
export declare function executeCdkShellCommand(command: string, options?: CdkShellOptions): CdkShellResult;
|
|
74
|
+
//# sourceMappingURL=cdk-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdk-utils.d.ts","sourceRoot":"","sources":["../../src/utils/cdk-utils.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,SAAc,GAAG,OAAO,CAwB3E;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAkB7C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yFAAyF;IACzF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,eAAoB,GAC5B,cAAc,CA2ChB"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { printError } from './output-utils.js';
|
|
6
|
+
/**
|
|
7
|
+
* Path to dist/boilerplate.js. tsc emits commands at dist/commands/, so
|
|
8
|
+
* boilerplate is one level up.
|
|
9
|
+
*/
|
|
10
|
+
export function resolveBoilerplatePath(callerDir) {
|
|
11
|
+
return path.join(callerDir, '..', 'boilerplate.js');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Checks whether a CLI tool is installed and returns its version output.
|
|
15
|
+
*
|
|
16
|
+
* Tries `<tool> <versionArg>` first. If that fails (typically because the tool
|
|
17
|
+
* is on PATH via the user's shell rc but execSync's default `/bin/sh` doesn't
|
|
18
|
+
* source it), falls back to running through the user's login+interactive shell
|
|
19
|
+
* (`$SHELL -ilc`) so node version managers like nvm/asdf and homebrew paths
|
|
20
|
+
* become visible. stdin is ignored so an interactive shell can't block on input.
|
|
21
|
+
*/
|
|
22
|
+
export function getToolInfo(tool, versionArg = '--version') {
|
|
23
|
+
const cmd = `${tool} ${versionArg}`;
|
|
24
|
+
try {
|
|
25
|
+
const output = execSync(cmd, { encoding: 'utf-8', stdio: 'pipe' });
|
|
26
|
+
return { available: true, version: output.trim() };
|
|
27
|
+
}
|
|
28
|
+
catch (firstError) {
|
|
29
|
+
const userShell = process.env.SHELL;
|
|
30
|
+
if (userShell && !userShell.endsWith('/sh')) {
|
|
31
|
+
try {
|
|
32
|
+
const output = execSync(`${userShell} -ilc '${cmd}'`, {
|
|
33
|
+
encoding: 'utf-8',
|
|
34
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
35
|
+
});
|
|
36
|
+
return { available: true, version: output.trim() };
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// fall through to the original error
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
available: false,
|
|
44
|
+
version: null,
|
|
45
|
+
error: firstError instanceof Error ? firstError.message : 'Unknown error',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Checks whether the AWS CDK CLI is installed and returns its version.
|
|
51
|
+
*/
|
|
52
|
+
export function getCdkInfo() {
|
|
53
|
+
return getToolInfo('cdk');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Checks whether the AWS CDK CLI is installed and accessible on the PATH.
|
|
57
|
+
*/
|
|
58
|
+
export function checkCdkAvailable() {
|
|
59
|
+
return getCdkInfo().available;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Asserts that the AWS CDK CLI is installed; throws with a user-friendly
|
|
63
|
+
* message + install hint when it isn't. Use at the top of any command that
|
|
64
|
+
* shells out to `cdk`.
|
|
65
|
+
*/
|
|
66
|
+
export function ensureCdkAvailable() {
|
|
67
|
+
if (checkCdkAvailable())
|
|
68
|
+
return;
|
|
69
|
+
printError('AWS CDK is not installed or not accessible');
|
|
70
|
+
console.log('Install CDK with: npm install -g aws-cdk');
|
|
71
|
+
throw new Error('AWS CDK not found');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Asserts that the local toolchain CDK needs to bundle the PluginLookup Lambda
|
|
75
|
+
* is present. Synth builds that Lambda via `NodejsFunction` (esbuild); when
|
|
76
|
+
* esbuild isn't on PATH, CDK silently falls back to **Docker bundling**, which
|
|
77
|
+
* can't resolve the handler's cross-directory imports and dies with an opaque
|
|
78
|
+
* `Could not resolve "axios"` / `"../config/handler-constants.js"`. pnpm is also
|
|
79
|
+
* required because the handler's lockfile is `pnpm-lock.yaml`, so CDK drives
|
|
80
|
+
* esbuild through pnpm. Fail fast here with the fix instead of deep in a bundle.
|
|
81
|
+
*
|
|
82
|
+
* Bypass with `SKIP_BUNDLER_CHECK=1` (e.g. an environment that intentionally
|
|
83
|
+
* bundles in Docker with a working mount scope).
|
|
84
|
+
*/
|
|
85
|
+
export function ensureBundlerAvailable() {
|
|
86
|
+
if (process.env.SKIP_BUNDLER_CHECK === '1')
|
|
87
|
+
return;
|
|
88
|
+
const missing = ['esbuild', 'pnpm'].filter((tool) => !getToolInfo(tool).available);
|
|
89
|
+
if (missing.length === 0)
|
|
90
|
+
return;
|
|
91
|
+
printError(`Missing local bundling prerequisite${missing.length > 1 ? 's' : ''}: ${missing.join(', ')}`);
|
|
92
|
+
console.log('');
|
|
93
|
+
console.log('Synth bundles the PluginLookup Lambda via esbuild (CDK NodejsFunction).');
|
|
94
|
+
console.log('Without esbuild + pnpm on PATH, CDK falls back to Docker bundling, which');
|
|
95
|
+
console.log('fails with: Could not resolve "axios" / "../config/handler-constants.js".');
|
|
96
|
+
console.log('');
|
|
97
|
+
console.log('Install with:');
|
|
98
|
+
console.log(' npm install -g esbuild@0.28.1 pnpm@10.33.0');
|
|
99
|
+
console.log('');
|
|
100
|
+
console.log('Docs: pipeline-manager.md#prerequisites-for-local-pipeline-deploys');
|
|
101
|
+
console.log('(Set SKIP_BUNDLER_CHECK=1 to bypass this check.)');
|
|
102
|
+
throw new Error(`Missing bundler prerequisites: ${missing.join(', ')}`);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Executes a CDK CLI command as a child process.
|
|
106
|
+
*
|
|
107
|
+
* @param command - The full CDK CLI command string (e.g., `cdk bootstrap ...`).
|
|
108
|
+
* @param options - Optional execution settings.
|
|
109
|
+
* @returns An object with `success` and `duration` in ms.
|
|
110
|
+
*/
|
|
111
|
+
export function executeCdkShellCommand(command, options = {}) {
|
|
112
|
+
const { debug = false, showOutput = true, env: extraEnv } = options;
|
|
113
|
+
const startTime = Date.now();
|
|
114
|
+
try {
|
|
115
|
+
const env = {
|
|
116
|
+
...process.env,
|
|
117
|
+
...extraEnv,
|
|
118
|
+
};
|
|
119
|
+
execSync(command, {
|
|
120
|
+
stdio: showOutput ? ['inherit', 'inherit', 'pipe'] : 'pipe',
|
|
121
|
+
env,
|
|
122
|
+
});
|
|
123
|
+
const duration = Date.now() - startTime;
|
|
124
|
+
return {
|
|
125
|
+
success: true,
|
|
126
|
+
duration,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
const duration = Date.now() - startTime;
|
|
131
|
+
// Extract stderr/stdout from execSync error when available
|
|
132
|
+
if (error && typeof error === 'object' && 'stderr' in error) {
|
|
133
|
+
const execError = error;
|
|
134
|
+
const stderr = execError.stderr?.toString().trim();
|
|
135
|
+
const stdout = execError.stdout?.toString().trim();
|
|
136
|
+
console.error('');
|
|
137
|
+
console.error('CDK deployment failed:');
|
|
138
|
+
if (stderr)
|
|
139
|
+
console.error(stderr);
|
|
140
|
+
if (stdout)
|
|
141
|
+
console.error(stdout);
|
|
142
|
+
if (execError.status !== undefined) {
|
|
143
|
+
console.error(`Exit code: ${execError.status} (after ${duration}ms)`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else if (debug) {
|
|
147
|
+
console.error('CDK execution failed:', error);
|
|
148
|
+
}
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2Nkay11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsU0FBaUI7SUFDdEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBUUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVksRUFBRSxVQUFVLEdBQUcsV0FBVztJQUNoRSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNwQyxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUFDLE9BQU8sVUFBVSxFQUFFLENBQUM7UUFDcEIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDcEMsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLFNBQVMsVUFB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QUMsTUFBTSxDQUFDLENBQUM7WUFDbEMsSUFBSSxNQUFNO2dCQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsU0FBUyxDQUFDLE1BQU0sV0FBVyxRQUFRLEtBQUssQ0FBQyxDQUFDO1lBQ3hFLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5cbi8qKlxuICogUGF0aCB0byBkaXN0L2JvaWxlcnBsYXRlLmpzLiB0c2MgZW1pdHMgY29tbWFuZHMgYXQgZGlzdC9jb21tYW5kcy8sIHNvXG4gKiBib2lsZXJwbGF0ZSBpcyBvbmUgbGV2ZWwgdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQm9pbGVycGxhdGVQYXRoKGNhbGxlckRpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihjYWxsZXJEaXIsICcuLicsICdib2lsZXJwbGF0ZS5qcycpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0luZm8ge1xuICBhdmFpbGFibGU6IGJvb2xlYW47XG4gIHZlcnNpb246IHN0cmluZyB8IG51bGw7XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgQ0xJIHRvb2wgaXMgaW5zdGFsbGVkIGFuZCByZXR1cm5zIGl0cyB2ZXJzaW9uIG91dHB1dC5cbiAqXG4gKiBUcmllcyBgPHRvb2w+IDx2ZXJzaW9uQXJnPmAgZmlyc3QuIElmIHRoYXQgZmFpbHMgKHR5cGljYWxseSBiZWNhdXNlIHRoZSB0b29sXG4gKiBpcyBvbiBQQVRIIHZpYSB0aGUgdXNlcidzIHNoZWxsIHJjIGJ1dCBleGVjU3luYydzIGRlZmF1bHQgYC9iaW4vc2hgIGRvZXNuJ3RcbiAqIHNvdXJjZSBpdCksIGZhbGxzIGJhY2sgdG8gcnVubmluZyB0aHJvdWdoIHRoZSB1c2VyJ3MgbG9naW4raW50ZXJhY3RpdmUgc2hlbGxcbiAqIChgJFNIRUxMIC1pbGNgKSBzbyBub2RlIHZlcnNpb24gbWFuYWdlcnMgbGlrZSBudm0vYXNkZiBhbmQgaG9tZWJyZXcgcGF0aHNcbiAqIGJlY29tZSB2aXNpYmxlLiBzdGRpbiBpcyBpZ25vcmVkIHNvIGFuIGludGVyYWN0aXZlIHNoZWxsIGNhbid0IGJsb2NrIG9uIGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbEluZm8odG9vbDogc3RyaW5nLCB2ZXJzaW9uQXJnID0gJy0tdmVyc2lvbicpOiBDZGtJbmZvIHtcbiAgY29uc3QgY21kID0gYCR7dG9vbH0gJHt2ZXJzaW9uQXJnfWA7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gZXhlY1N5bmMoY21kLCB7IGVuY29kaW5nOiAndXRmLTgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICAgIHJldHVybiB7IGF2YWlsYWJsZTogdHJ1ZSwgdmVyc2lvbjogb3V0cHV0LnRyaW0oKSB9O1xuICB9IGNhdGNoIChmaXJzdEVycm9yKSB7XG4gICAgY29uc3QgdXNlclNoZWxsID0gcHJvY2Vzcy5lbnYuU0hFTEw7XG4gICAgaWYgKHVzZXJTaGVsbCAmJiAhdXNlclNoZWxsLmVuZHNXaXRoKCcvc2gnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gZXhlY1N5bmMoYCR7dXNlclNoZWxsfSAtaWxjICcke2NtZH0nYCwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmLTgnLFxuICAgICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGF2YWlsYWJsZTogdHJ1ZSwgdmVyc2lvbjogb3V0cHV0LnRyaW0oKSB9O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGF2YWlsYWJsZTogZmFsc2UsXG4gICAgICB2ZXJzaW9uOiBudWxsLFxuICAgICAgZXJyb3I6IGZpcnN0RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZpcnN0RXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIEFXUyBDREsgQ0xJIGlzIGluc3RhbGxlZCBhbmQgcmV0dXJucyBpdHMgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENka0luZm8oKTogQ2RrSW5mbyB7XG4gIHJldHVybiBnZXRUb29sSW5mbygnY2RrJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIEFXUyBDREsgQ0xJIGlzIGluc3RhbGxlZCBhbmQgYWNjZXNzaWJsZSBvbiB0aGUgUEFUSC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ2RrQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0Q2RrSW5mbygpLmF2YWlsYWJsZTtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIEFXUyBDREsgQ0xJIGlzIGluc3RhbGxlZDsgdGhyb3dzIHdpdGggYSB1c2VyLWZyaWVuZGx5XG4gKiBtZXNzYWdlICsgaW5zdGFsbCBoaW50IHdoZW4gaXQgaXNuJ3QuIFVzZSBhdCB0aGUgdG9wIG9mIGFueSBjb21tYW5kIHRoYXRcbiAqIHNoZWxscyBvdXQgdG8gYGNka2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDZGtBdmFpbGFibGUoKTogdm9pZCB7XG4gIGlmIChjaGVja0Nka0F2YWlsYWJsZSgpKSByZXR1cm47XG4gIHByaW50RXJyb3IoJ0FXUyBDREsgaXMgbm90IGluc3RhbGxlZCBvciBub3QgYWNjZXNzaWJsZScpO1xuICBjb25zb2xlLmxvZygnSW5zdGFsbCBDREsgd2l0aDogbnBtIGluc3RhbGwgLWcgYXdzLWNkaycpO1xuICB0aHJvdyBuZXcgRXJyb3IoJ0FXUyBDREsgbm90IGZvdW5kJyk7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBsb2NhbCB0b29sY2hhaW4gQ0RLIG5lZWRzIHRvIGJ1bmRsZSB0aGUgUGx1Z2luTG9va3VwIExhbWJkYVxuICogaXMgcHJlc2VudC4gU3ludGggYnVpbGRzIHRoYXQgTGFtYmRhIHZpYSBgTm9kZWpzRnVuY3Rpb25gIChlc2J1aWxkKTsgd2hlblxuICogZXNidWlsZCBpc24ndCBvbiBQQVRILCBDREsgc2lsZW50bHkgZmFsbHMgYmFjayB0byAqKkRvY2tlciBidW5kbGluZyoqLCB3aGljaFxuICogY2FuJ3QgcmVzb2x2ZSB0aGUgaGFuZGxlcidzIGNyb3NzLWRpcmVjdG9yeSBpbXBvcnRzIGFuZCBkaWVzIHdpdGggYW4gb3BhcXVlXG4gKiBgQ291bGQgbm90IHJlc29sdmUgXCJheGlvc1wiYCAvIGBcIi4uL2NvbmZpZy9oYW5kbGVyLWNvbnN0YW50cy5qc1wiYC4gcG5wbSBpcyBhbHNvXG4gKiByZXF1aXJlZCBiZWNhdXNlIHRoZSBoYW5kbGVyJ3MgbG9ja2ZpbGUgaXMgYHBucG0tbG9jay55YW1sYCwgc28gQ0RLIGRyaXZlc1xuICogZXNidWlsZCB0aHJvdWdoIHBucG0uIEZhaWwgZmFzdCBoZXJlIHdpdGggdGhlIGZpeCBpbnN0ZWFkIG9mIGRlZXAgaW4gYSBidW5kbGUuXG4gKlxuICogQnlwYXNzIHdpdGggYFNLSVBfQlVORExFUl9DSEVDSz0xYCAoZS5nLiBhbiBlbnZpcm9ubWVudCB0aGF0IGludGVudGlvbmFsbHlcbiAqIGJ1bmRsZXMgaW4gRG9ja2VyIHdpdGggYSB3b3JraW5nIG1vdW50IHNjb3BlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUJ1bmRsZXJBdmFpbGFibGUoKTogdm9pZCB7XG4gIGlmIChwcm9jZXNzLmVudi5TS0lQX0JVTkRMRVJfQ0hFQ0sgPT09ICcxJykgcmV0dXJuO1xuXG4gIGNvbnN0IG1pc3NpbmcgPSBbJ2VzYnVpbGQnLCAncG5wbSddLmZpbHRlcigodG9vbCkgPT4gIWdldFRvb2xJbmZvKHRvb2wpLmF2YWlsYWJsZSk7XG4gIGlmIChtaXNzaW5nLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIHByaW50RXJyb3IoYE1pc3NpbmcgbG9jYWwgYnVuZGxpbmcgcHJlcmVxdWlzaXRlJHttaXNzaW5nLmxlbmd0aCA+IDEgPyAncycgOiAnJ306ICR7bWlzc2luZy5qb2luKCcsICcpfWApO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKCdTeW50aCBidW5kbGVzIHRoZSBQbHVnaW5Mb29rdXAgTGFtYmRhIHZpYSBlc2J1aWxkIChDREsgTm9kZWpzRnVuY3Rpb24pLicpO1xuICBjb25zb2xlLmxvZygnV2l0aG91dCBlc2J1aWxkICsgcG5wbSBvbiBQQVRILCBDREsgZmFsbHMgYmFjayB0byBEb2NrZXIgYnVuZGxpbmcsIHdoaWNoJyk7XG4gIGNvbnNvbGUubG9nKCdmYWlscyB3aXRoOiBDb3VsZCBub3QgcmVzb2x2ZSBcImF4aW9zXCIgLyBcIi4uL2NvbmZpZy9oYW5kbGVyLWNvbnN0YW50cy5qc1wiLicpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKCdJbnN0YWxsIHdpdGg6Jyk7XG4gIGNvbnNvbGUubG9nKCcgIG5wbSBpbnN0YWxsIC1nIGVzYnVpbGRAMC4yOC4xIHBucG1AMTAuMzMuMCcpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKCdEb2NzOiBwaXBlbGluZS1tYW5hZ2VyLm1kI3ByZXJlcXVpc2l0ZXMtZm9yLWxvY2FsLXBpcGVsaW5lLWRlcGxveXMnKTtcbiAgY29uc29sZS5sb2coJyhTZXQgU0tJUF9CVU5ETEVSX0NIRUNLPTEgdG8gYnlwYXNzIHRoaXMgY2hlY2suKScpO1xuICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYnVuZGxlciBwcmVyZXF1aXNpdGVzOiAke21pc3Npbmcuam9pbignLCAnKX1gKTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBleGVjdXRpbmcgYSBDREsgc2hlbGwgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtTaGVsbE9wdGlvbnMge1xuICAvKiogV2hlbiBgdHJ1ZWAsIHByaW50cyB0aGUgZXJyb3IgdG8gc3RkZXJyIG9uIGZhaWx1cmUuICovXG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gYHRydWVgLCBpbmhlcml0cyBzdGRpbyBzbyBvdXRwdXQgc3RyZWFtcyB0byB0aGUgdGVybWluYWwuIERlZmF1bHRzIHRvIGB0cnVlYC4gKi9cbiAgc2hvd091dHB1dD86IGJvb2xlYW47XG4gIC8qKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBpbmplY3QuICovXG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgQ0RLIHNoZWxsIGNvbW1hbmQgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENka1NoZWxsUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZHVyYXRpb246IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIENESyBDTEkgY29tbWFuZCBhcyBhIGNoaWxkIHByb2Nlc3MuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgZnVsbCBDREsgQ0xJIGNvbW1hbmQgc3RyaW5nIChlLmcuLCBgY2RrIGJvb3RzdHJhcCAuLi5gKS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgZXhlY3V0aW9uIHNldHRpbmdzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYHN1Y2Nlc3NgIGFuZCBgZHVyYXRpb25gIGluIG1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZUNka1NoZWxsQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBvcHRpb25zOiBDZGtTaGVsbE9wdGlvbnMgPSB7fSxcbik6IENka1NoZWxsUmVzdWx0IHtcbiAgY29uc3QgeyBkZWJ1ZyA9IGZhbHNlLCBzaG93T3V0cHV0ID0gdHJ1ZSwgZW52OiBleHRyYUVudiB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGVudiA9IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgLi4uZXh0cmFFbnYsXG4gICAgfTtcblxuICAgIGV4ZWNTeW5jKGNvbW1hbmQsIHtcbiAgICAgIHN0ZGlvOiBzaG93T3V0cHV0ID8gWydpbmhlcml0JywgJ2luaGVyaXQnLCAncGlwZSddIDogJ3BpcGUnLFxuICAgICAgZW52LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBkdXJhdGlvbixcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgIC8vIEV4dHJhY3Qgc3RkZXJyL3N0ZG91dCBmcm9tIGV4ZWNTeW5jIGVycm9yIHdoZW4gYXZhaWxhYmxlXG4gICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ3N0ZGVycicgaW4gZXJyb3IpIHtcbiAgICAgIGNvbnN0IGV4ZWNFcnJvciA9IGVycm9yIGFzIHsgc3RkZXJyPzogQnVmZmVyIHwgc3RyaW5nOyBzdGRvdXQ/OiBCdWZmZXIgfCBzdHJpbmc7IHN0YXR1cz86IG51bWJlciB9O1xuICAgICAgY29uc3Qgc3RkZXJyID0gZXhlY0Vycm9yLnN0ZGVycj8udG9TdHJpbmcoKS50cmltKCk7XG4gICAgICBjb25zdCBzdGRvdXQgPSBleGVjRXJyb3Iuc3Rkb3V0Py50b1N0cmluZygpLnRyaW0oKTtcblxuICAgICAgY29uc29sZS5lcnJvcignJyk7XG4gICAgICBjb25zb2xlLmVycm9yKCdDREsgZGVwbG95bWVudCBmYWlsZWQ6Jyk7XG4gICAgICBpZiAoc3RkZXJyKSBjb25zb2xlLmVycm9yKHN0ZGVycik7XG4gICAgICBpZiAoc3Rkb3V0KSBjb25zb2xlLmVycm9yKHN0ZG91dCk7XG4gICAgICBpZiAoZXhlY0Vycm9yLnN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEV4aXQgY29kZTogJHtleGVjRXJyb3Iuc3RhdHVzfSAoYWZ0ZXIgJHtkdXJhdGlvbn1tcylgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRlYnVnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDREsgZXhlY3V0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type Command } from 'commander';
|
|
2
|
+
import { ApiClient } from './api-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Print command header with section title and execution ID.
|
|
5
|
+
* Returns the execution ID for use in error handlers and summaries.
|
|
6
|
+
*
|
|
7
|
+
* Pass `{ quiet: true }` to suppress the decorative output while still getting the
|
|
8
|
+
* id — used both by `--quiet` callers and by `--json` commands (so the banner
|
|
9
|
+
* doesn't land on stdout ahead of the JSON payload and break `… --json | jq`).
|
|
10
|
+
*/
|
|
11
|
+
export declare function printCommandHeader(title: string, subtitle?: string, opts?: {
|
|
12
|
+
quiet?: boolean;
|
|
13
|
+
}): string;
|
|
14
|
+
/** Attach the standard `--verify-ssl` / `--no-verify-ssl` pair. The two together
|
|
15
|
+
* give Commander an explicit tri-state `options.verifySsl` (true/false/undefined).
|
|
16
|
+
* Returns the command so it composes: `withSslOptions(program.command('x'))…`. */
|
|
17
|
+
export declare function withSslOptions<T extends Command>(cmd: T): T;
|
|
18
|
+
/** Attach the standard `--region <region>` option (one canonical description).
|
|
19
|
+
* Region resolution (flag → AWS_REGION → CDK_DEFAULT_REGION → us-east-1) lives in
|
|
20
|
+
* aws-env.resolveAwsRegion. */
|
|
21
|
+
export declare function withRegionOption<T extends Command>(cmd: T): T;
|
|
22
|
+
/** Attach the standard `--profile <profile>` option (one canonical description).
|
|
23
|
+
* No default is pinned so the AWS default credential chain (env vars, SSO, roles)
|
|
24
|
+
* works out of the box; --profile only selects a shared profile when set. */
|
|
25
|
+
export declare function withProfileOption<T extends Command>(cmd: T): T;
|
|
26
|
+
/**
|
|
27
|
+
* Print execution summary with ID, duration, and status.
|
|
28
|
+
*/
|
|
29
|
+
export declare function printExecutionSummary(executionId: string, duration: number): void;
|
|
30
|
+
/**
|
|
31
|
+
* Warn if SSL verification is disabled.
|
|
32
|
+
*/
|
|
33
|
+
export declare function printSslWarning(verifySsl?: boolean): void;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve a platform auth token using two methods (in priority order):
|
|
36
|
+
*
|
|
37
|
+
* 1. PLATFORM_TOKEN env var
|
|
38
|
+
* 2. --store-tokens flag → fetch credentials from AWS Secrets Manager, then authenticate
|
|
39
|
+
*
|
|
40
|
+
* @returns JWT token string
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveToken(options: {
|
|
43
|
+
storeTokens?: boolean;
|
|
44
|
+
verifySsl?: boolean;
|
|
45
|
+
region?: string;
|
|
46
|
+
profile?: string;
|
|
47
|
+
}): Promise<string>;
|
|
48
|
+
/**
|
|
49
|
+
* Initialize and return an authenticated API client.
|
|
50
|
+
*
|
|
51
|
+
* Supports two auth methods:
|
|
52
|
+
* 1. PLATFORM_TOKEN env var
|
|
53
|
+
* 2. --store-tokens + PLATFORM_SECRET_NAME env var → fetch token from Secrets Manager
|
|
54
|
+
*/
|
|
55
|
+
export declare function createAuthenticatedClientAsync(options: {
|
|
56
|
+
storeTokens?: boolean;
|
|
57
|
+
verifySsl?: boolean;
|
|
58
|
+
region?: string;
|
|
59
|
+
profile?: string;
|
|
60
|
+
}): Promise<ApiClient>;
|
|
61
|
+
/**
|
|
62
|
+
* Initialize and return an authenticated API client (sync — requires PLATFORM_TOKEN).
|
|
63
|
+
* Use createAuthenticatedClientAsync for --store-tokens support.
|
|
64
|
+
*/
|
|
65
|
+
export declare function createAuthenticatedClient(options: {
|
|
66
|
+
verifySsl?: boolean;
|
|
67
|
+
}): ApiClient;
|
|
68
|
+
/**
|
|
69
|
+
* Validate a required entity ID (ULID or UUID format).
|
|
70
|
+
* Returns trimmed ID.
|
|
71
|
+
*
|
|
72
|
+
* @throws Error if ID is empty
|
|
73
|
+
*/
|
|
74
|
+
export declare function validateEntityId(id: string | undefined, entityName: string): string;
|
|
75
|
+
//# sourceMappingURL=command-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-utils.d.ts","sourceRoot":"","sources":["../../src/utils/command-utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAQvG;AAED;;mFAEmF;AACnF,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAI3D;AAED;;gCAEgC;AAChC,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAE7D;AAED;;8EAE8E;AAC9E,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOjF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAKzD;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmClB;AAED;;;;;;GAMG;AACH,wBAAsB,8BAA8B,CAAC,OAAO,EAAE;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,SAAS,CAAC,CAQrB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAYrF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAiBnF"}
|