@sfdxy/anypoint-connect 0.15.0 → 0.16.2
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 +32 -14
- package/dist/analysis/LogAnalyzer.d.ts +9 -3
- package/dist/analysis/LogAnalyzer.d.ts.map +1 -1
- package/dist/analysis/LogAnalyzer.js +28 -17
- package/dist/analysis/LogAnalyzer.js.map +1 -1
- package/dist/analysis/error-context.d.ts +2 -0
- package/dist/analysis/error-context.d.ts.map +1 -1
- package/dist/analysis/error-context.js +2 -1
- package/dist/analysis/error-context.js.map +1 -1
- package/dist/analysis/filter.d.ts +54 -0
- package/dist/analysis/filter.d.ts.map +1 -0
- package/dist/analysis/filter.js +100 -0
- package/dist/analysis/filter.js.map +1 -0
- package/dist/analysis/parser.d.ts.map +1 -1
- package/dist/analysis/parser.js +31 -14
- package/dist/analysis/parser.js.map +1 -1
- package/dist/analysis/stats.d.ts +25 -0
- package/dist/analysis/stats.d.ts.map +1 -1
- package/dist/analysis/stats.js +34 -0
- package/dist/analysis/stats.js.map +1 -1
- package/dist/analysis/summary.d.ts +51 -0
- package/dist/analysis/summary.d.ts.map +1 -0
- package/dist/analysis/summary.js +47 -0
- package/dist/analysis/summary.js.map +1 -0
- package/dist/analysis/types.d.ts +14 -0
- package/dist/analysis/types.d.ts.map +1 -1
- package/dist/api/ApiManagerApi.d.ts +53 -0
- package/dist/api/ApiManagerApi.d.ts.map +1 -1
- package/dist/api/ApiManagerApi.js +53 -2
- package/dist/api/ApiManagerApi.js.map +1 -1
- package/dist/api/CloudHub2Api.d.ts +24 -4
- package/dist/api/CloudHub2Api.d.ts.map +1 -1
- package/dist/api/CloudHub2Api.js +10 -22
- package/dist/api/CloudHub2Api.js.map +1 -1
- package/dist/api/ExchangeApi.d.ts +15 -0
- package/dist/api/ExchangeApi.d.ts.map +1 -1
- package/dist/api/ExchangeApi.js +51 -0
- package/dist/api/ExchangeApi.js.map +1 -1
- package/dist/api/LogsApi.d.ts +50 -18
- package/dist/api/LogsApi.d.ts.map +1 -1
- package/dist/api/LogsApi.js +69 -98
- package/dist/api/LogsApi.js.map +1 -1
- package/dist/api/RuntimesApi.d.ts +56 -0
- package/dist/api/RuntimesApi.d.ts.map +1 -0
- package/dist/api/RuntimesApi.js +58 -0
- package/dist/api/RuntimesApi.js.map +1 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/client/AnypointClient.d.ts +2 -0
- package/dist/client/AnypointClient.d.ts.map +1 -1
- package/dist/client/AnypointClient.js +3 -0
- package/dist/client/AnypointClient.js.map +1 -1
- package/dist/client/smoke-test.d.ts +111 -0
- package/dist/client/smoke-test.d.ts.map +1 -0
- package/dist/client/smoke-test.js +275 -0
- package/dist/client/smoke-test.js.map +1 -0
- package/dist/commands/api.d.ts +1 -1
- package/dist/commands/api.d.ts.map +1 -1
- package/dist/commands/api.js +147 -10
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/app-change-cli.d.ts +52 -0
- package/dist/commands/app-change-cli.d.ts.map +1 -0
- package/dist/commands/app-change-cli.js +149 -0
- package/dist/commands/app-change-cli.js.map +1 -0
- package/dist/commands/apps.d.ts +1 -1
- package/dist/commands/apps.d.ts.map +1 -1
- package/dist/commands/apps.js +198 -17
- package/dist/commands/apps.js.map +1 -1
- package/dist/commands/compare.d.ts +8 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +104 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/deploy.d.ts +4 -3
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +59 -33
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/logs.d.ts +3 -2
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +142 -17
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/runtimes.d.ts +7 -0
- package/dist/commands/runtimes.d.ts.map +1 -0
- package/dist/commands/runtimes.js +66 -0
- package/dist/commands/runtimes.js.map +1 -0
- package/dist/config/profiles.d.ts +8 -0
- package/dist/config/profiles.d.ts.map +1 -1
- package/dist/config/profiles.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/analysis.d.ts.map +1 -1
- package/dist/mcp/tools/analysis.js +74 -30
- package/dist/mcp/tools/analysis.js.map +1 -1
- package/dist/mcp/tools/anypoint-mq.d.ts.map +1 -1
- package/dist/mcp/tools/anypoint-mq.js +5 -2
- package/dist/mcp/tools/anypoint-mq.js.map +1 -1
- package/dist/mcp/tools/api-manager.d.ts +2 -1
- package/dist/mcp/tools/api-manager.d.ts.map +1 -1
- package/dist/mcp/tools/api-manager.js +127 -38
- package/dist/mcp/tools/api-manager.js.map +1 -1
- package/dist/mcp/tools/app-inputs.d.ts +92 -0
- package/dist/mcp/tools/app-inputs.d.ts.map +1 -0
- package/dist/mcp/tools/app-inputs.js +142 -0
- package/dist/mcp/tools/app-inputs.js.map +1 -0
- package/dist/mcp/tools/apps-deploy.d.ts +6 -1
- package/dist/mcp/tools/apps-deploy.d.ts.map +1 -1
- package/dist/mcp/tools/apps-deploy.js +279 -307
- package/dist/mcp/tools/apps-deploy.js.map +1 -1
- package/dist/mcp/tools/apps-lifecycle.d.ts +3 -0
- package/dist/mcp/tools/apps-lifecycle.d.ts.map +1 -1
- package/dist/mcp/tools/apps-lifecycle.js +105 -136
- package/dist/mcp/tools/apps-lifecycle.js.map +1 -1
- package/dist/mcp/tools/apps-read.d.ts +2 -1
- package/dist/mcp/tools/apps-read.d.ts.map +1 -1
- package/dist/mcp/tools/apps-read.js +177 -14
- package/dist/mcp/tools/apps-read.js.map +1 -1
- package/dist/mcp/tools/artifacts.d.ts +8 -0
- package/dist/mcp/tools/artifacts.d.ts.map +1 -0
- package/dist/mcp/tools/artifacts.js +81 -0
- package/dist/mcp/tools/artifacts.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +1 -0
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +1 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/logs.d.ts +48 -2
- package/dist/mcp/tools/logs.d.ts.map +1 -1
- package/dist/mcp/tools/logs.js +205 -38
- package/dist/mcp/tools/logs.js.map +1 -1
- package/dist/mcp/tools/shared.d.ts +27 -0
- package/dist/mcp/tools/shared.d.ts.map +1 -1
- package/dist/mcp/tools/shared.js +42 -0
- package/dist/mcp/tools/shared.js.map +1 -1
- package/dist/safety/deployment.d.ts +47 -2
- package/dist/safety/deployment.d.ts.map +1 -1
- package/dist/safety/deployment.js +139 -6
- package/dist/safety/deployment.js.map +1 -1
- package/dist/safety/paths.d.ts +29 -0
- package/dist/safety/paths.d.ts.map +1 -0
- package/dist/safety/paths.js +76 -0
- package/dist/safety/paths.js.map +1 -0
- package/dist/safety/runtime.d.ts +24 -0
- package/dist/safety/runtime.d.ts.map +1 -0
- package/dist/safety/runtime.js +59 -0
- package/dist/safety/runtime.js.map +1 -0
- package/dist/safety/secret-sources.d.ts +51 -0
- package/dist/safety/secret-sources.d.ts.map +1 -0
- package/dist/safety/secret-sources.js +124 -0
- package/dist/safety/secret-sources.js.map +1 -0
- package/dist/safety/secrets.d.ts +32 -0
- package/dist/safety/secrets.d.ts.map +1 -0
- package/dist/safety/secrets.js +91 -0
- package/dist/safety/secrets.js.map +1 -0
- package/dist/utils/errors.d.ts +2 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +5 -3
- package/dist/utils/errors.js.map +1 -1
- package/dist/workflows/app-change.d.ts +124 -0
- package/dist/workflows/app-change.d.ts.map +1 -0
- package/dist/workflows/app-change.js +305 -0
- package/dist/workflows/app-change.js.map +1 -0
- package/dist/workflows/app-state.d.ts +60 -0
- package/dist/workflows/app-state.d.ts.map +1 -0
- package/dist/workflows/app-state.js +95 -0
- package/dist/workflows/app-state.js.map +1 -0
- package/dist/workflows/artifact-compare.d.ts +134 -0
- package/dist/workflows/artifact-compare.d.ts.map +1 -0
- package/dist/workflows/artifact-compare.js +419 -0
- package/dist/workflows/artifact-compare.js.map +1 -0
- package/dist/workflows/asset-naming.d.ts +72 -0
- package/dist/workflows/asset-naming.d.ts.map +1 -0
- package/dist/workflows/asset-naming.js +116 -0
- package/dist/workflows/asset-naming.js.map +1 -0
- package/dist/workflows/jar-deployment.d.ts +76 -39
- package/dist/workflows/jar-deployment.d.ts.map +1 -1
- package/dist/workflows/jar-deployment.js +125 -64
- package/dist/workflows/jar-deployment.js.map +1 -1
- package/package.json +3 -3
package/dist/commands/deploy.js
CHANGED
|
@@ -1,40 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Deploy CLI Command
|
|
3
3
|
* anc deploy <jarPath> --app <name> --env <envName> [--runtime <version>] [--replicas <n>] [--region <target>]
|
|
4
|
-
* [--vcores <size>] [--asset-id <id>] [--asset-version <v>] [--group-id <id>] [
|
|
4
|
+
* [--vcores <size>] [--asset-id <id>] [--asset-version <v>] [--group-id <id>] [settings flags]
|
|
5
|
+
* [--stop-start] [--update-strategy <s>] [--no-wait] [--dry-run] [--force]
|
|
5
6
|
*
|
|
6
|
-
* Publishes the JAR to Exchange
|
|
7
|
-
*
|
|
7
|
+
* Publishes the JAR to Exchange, then creates the deployment or, for an existing app, applies the
|
|
8
|
+
* artifact change (plus any runtime or settings change) as one update.
|
|
8
9
|
*/
|
|
9
10
|
import { Command } from 'commander';
|
|
10
|
-
import ora from 'ora';
|
|
11
11
|
import chalk from 'chalk';
|
|
12
12
|
import { log } from '../utils/logger.js';
|
|
13
13
|
import { errorMessage } from '../utils/errors.js';
|
|
14
14
|
import { isProductionEnv, buildDeploySummary, confirmProductionDeploy } from '../safety/guards.js';
|
|
15
15
|
import { DEFAULT_REGION, DEFAULT_RUNTIME, DEFAULT_VCORES, VALID_VCORES } from '../safety/deployment.js';
|
|
16
|
+
import { redactText } from '../safety/secrets.js';
|
|
16
17
|
import { describeJarDeployment, executeJarDeployment, planJarDeployment } from '../workflows/jar-deployment.js';
|
|
18
|
+
import { addRolloutOptions, addRuntimeOptions, addSettingsOptions, printAppChange, rolloutFromOptions, rolloutSpinner, runtimeFromOptions, settingsFromOptions, } from './app-change-cli.js';
|
|
17
19
|
import { createClient } from './shared.js';
|
|
18
20
|
export function createDeployCommand() {
|
|
19
|
-
|
|
21
|
+
const command = new Command('deploy')
|
|
20
22
|
.description('Publish a Mule application JAR to Exchange and deploy it to CloudHub 2.0')
|
|
21
23
|
.argument('<jarPath>', 'Path to the built application JAR')
|
|
22
24
|
.requiredOption('-a, --app <name>', 'Application name')
|
|
23
25
|
.requiredOption('-e, --env <name>', 'Target environment')
|
|
24
|
-
.option('--asset-id <id>',
|
|
25
|
-
.option('--asset-version <v>',
|
|
26
|
+
.option('--asset-id <id>', "Exchange asset ID (default: naming convention, else the JAR's Maven artifactId)")
|
|
27
|
+
.option('--asset-version <v>', "Exchange asset version (default: naming convention, else the JAR's Maven version)")
|
|
26
28
|
.option('--group-id <id>', 'Exchange group ID (default: the organization ID)')
|
|
27
|
-
.option('-r, --runtime <version>', `[new app only] Mule runtime version (default: ${DEFAULT_RUNTIME})`)
|
|
28
29
|
.option('--replicas <n>', '[new app only] Number of replicas (default: 1)')
|
|
29
30
|
.option('--vcores <size>', `[new app only] vCore size: ${VALID_VCORES.join(', ')} (default: ${DEFAULT_VCORES})`)
|
|
30
|
-
.option('--region <target>', `[new app only] CloudHub 2.0 target (default: ${DEFAULT_REGION})`)
|
|
31
|
+
.option('--region <target>', `[new app only] CloudHub 2.0 target (default: ${DEFAULT_REGION})`);
|
|
32
|
+
addRuntimeOptions(command, `(new app default: ${DEFAULT_RUNTIME}) `);
|
|
33
|
+
addSettingsOptions(command);
|
|
34
|
+
addRolloutOptions(command);
|
|
35
|
+
return command
|
|
31
36
|
.option('--dry-run', 'Show what would be published and deployed, then stop', false)
|
|
32
37
|
.option('--force', 'Skip the production confirmation prompt', false)
|
|
33
38
|
.action(async (jarPath, opts) => {
|
|
39
|
+
let secretValues = [];
|
|
34
40
|
try {
|
|
35
41
|
const client = createClient();
|
|
36
42
|
const orgId = await client.getDefaultOrgId();
|
|
37
43
|
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
44
|
+
const rollout = rolloutFromOptions(opts);
|
|
38
45
|
const plan = await planJarDeployment(client, {
|
|
39
46
|
jarPath,
|
|
40
47
|
appName: opts.app,
|
|
@@ -43,26 +50,42 @@ export function createDeployCommand() {
|
|
|
43
50
|
assetId: opts.assetId,
|
|
44
51
|
assetVersion: opts.assetVersion,
|
|
45
52
|
groupId: opts.groupId,
|
|
46
|
-
runtime: opts
|
|
53
|
+
runtime: runtimeFromOptions(opts),
|
|
47
54
|
replicas: opts.replicas ? parseInt(opts.replicas, 10) : undefined,
|
|
48
55
|
region: opts.region,
|
|
49
56
|
vcores: opts.vcores,
|
|
57
|
+
settings: settingsFromOptions(opts),
|
|
58
|
+
mode: rollout.mode,
|
|
59
|
+
updateStrategy: rollout.updateStrategy,
|
|
50
60
|
});
|
|
61
|
+
secretValues = plan.secretValues;
|
|
51
62
|
if (plan.rejectedSettings.length > 0) {
|
|
52
|
-
throw new Error(`"${opts.app}" already exists in ${env.name};
|
|
53
|
-
`Drop ${plan.rejectedSettings.map((s) => `--${s}`).join(', ')}
|
|
63
|
+
throw new Error(`"${opts.app}" already exists in ${env.name}; region, vCores and replicas apply only to a new app. ` +
|
|
64
|
+
`Drop ${plan.rejectedSettings.map((s) => `--${s}`).join(', ')}.`);
|
|
54
65
|
}
|
|
55
66
|
const summary = describeJarDeployment(plan);
|
|
56
67
|
console.log(buildDeploySummary(opts.app, env.name, plan.existing, plan.ref.version, env.isProduction));
|
|
57
68
|
log.kv('Artifact', `${plan.ref.groupId}:${plan.ref.artifactId}:${plan.ref.version}`);
|
|
69
|
+
log.kv('Naming', `asset ID from ${summary.publish.naming.assetId}, version from ${summary.publish.naming.version}`);
|
|
70
|
+
if (plan.naming.deployedPattern) {
|
|
71
|
+
log.dim(` The deployed asset follows ${plan.naming.deployedPattern.assetId} @ ${plan.naming.deployedPattern.assetVersion}; set it as a project convention or pass --asset-id/--asset-version to use it.`);
|
|
72
|
+
}
|
|
58
73
|
log.kv('SHA-256', plan.artifact.sha256);
|
|
59
|
-
|
|
60
|
-
if (
|
|
74
|
+
let ok = true;
|
|
75
|
+
if (plan.change) {
|
|
76
|
+
ok = printAppChange(plan.change);
|
|
77
|
+
}
|
|
78
|
+
else if (summary.deploy.action === 'create') {
|
|
79
|
+
log.kv('Mode', 'create deployment');
|
|
61
80
|
log.kv('Runtime', summary.deploy.runtime);
|
|
62
|
-
log.kv('Target', `${summary.deploy.region}, ${summary.deploy.vcores} vCores
|
|
81
|
+
log.kv('Target', `${summary.deploy.region}, ${summary.deploy.vcores} vCores x ${summary.deploy.replicas}`);
|
|
82
|
+
}
|
|
83
|
+
if (!ok) {
|
|
84
|
+
process.exitCode = 1;
|
|
85
|
+
return;
|
|
63
86
|
}
|
|
64
87
|
if (opts.dryRun) {
|
|
65
|
-
log.info('Dry run
|
|
88
|
+
log.info('Dry run: nothing was published or deployed.');
|
|
66
89
|
return;
|
|
67
90
|
}
|
|
68
91
|
if (isProductionEnv(env.name, env.isProduction) && !opts.force) {
|
|
@@ -71,27 +94,30 @@ export function createDeployCommand() {
|
|
|
71
94
|
return;
|
|
72
95
|
}
|
|
73
96
|
}
|
|
74
|
-
const spinner =
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
});
|
|
82
|
-
|
|
97
|
+
const { spinner, onStatus } = rolloutSpinner('Publishing to Exchange and deploying...');
|
|
98
|
+
const result = await executeJarDeployment(client, plan, {
|
|
99
|
+
wait: rollout.wait,
|
|
100
|
+
timeoutMs: rollout.timeoutMs,
|
|
101
|
+
onStatus,
|
|
102
|
+
});
|
|
103
|
+
if (!rollout.wait) {
|
|
104
|
+
spinner.succeed(`Published ${result.published.assetId} v${result.published.version}; change accepted`);
|
|
105
|
+
log.dim(` Follow it: anc apps status ${opts.app} --env ${opts.env} --wait`);
|
|
106
|
+
return;
|
|
83
107
|
}
|
|
84
|
-
|
|
85
|
-
spinner.
|
|
86
|
-
|
|
87
|
-
log.dim(` Check status: anc apps status ${opts.app} --env ${opts.env}`);
|
|
88
|
-
if (plan.existing) {
|
|
89
|
-
log.dim(` Previous version: ${plan.existing.application?.ref?.version || 'unknown'}`);
|
|
90
|
-
}
|
|
108
|
+
if (result.snapshot?.settled) {
|
|
109
|
+
spinner.succeed(`Deployed ${chalk.bold(opts.app)} v${plan.ref.version}: ${chalk.green(result.snapshot.phase)}`);
|
|
110
|
+
return;
|
|
91
111
|
}
|
|
112
|
+
spinner.fail(`Deployment did not settle: ${result.snapshot?.phase ?? 'unknown'}${result.timedOut ? ' (timed out)' : ''}${result.snapshot?.reason ? ` - ${result.snapshot.reason}` : ''}`);
|
|
113
|
+
log.dim(` Deployment ID: ${result.deployment.id}`);
|
|
114
|
+
log.dim(` Check status: anc apps status ${opts.app} --env ${opts.env}`);
|
|
115
|
+
if (plan.existing)
|
|
116
|
+
log.dim(` Previous version: ${plan.existing.application?.ref?.version || 'unknown'}`);
|
|
117
|
+
process.exitCode = 1;
|
|
92
118
|
}
|
|
93
119
|
catch (error) {
|
|
94
|
-
log.error(`Deploy failed: ${errorMessage(error)}`);
|
|
120
|
+
log.error(`Deploy failed: ${redactText(errorMessage(error), secretValues)}`);
|
|
95
121
|
process.exit(1);
|
|
96
122
|
}
|
|
97
123
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -7,4 +7,5 @@ export { createMonitorCommand } from './monitor.js';
|
|
|
7
7
|
export { createExchangeCommand } from './exchange.js';
|
|
8
8
|
export { createApiCommand } from './api.js';
|
|
9
9
|
export { createDesignCenterCommand } from './design-center.js';
|
|
10
|
+
export { createRuntimesCommand } from './runtimes.js';
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -7,4 +7,5 @@ export { createMonitorCommand } from './monitor.js';
|
|
|
7
7
|
export { createExchangeCommand } from './exchange.js';
|
|
8
8
|
export { createApiCommand } from './api.js';
|
|
9
9
|
export { createDesignCenterCommand } from './design-center.js';
|
|
10
|
+
export { createRuntimesCommand } from './runtimes.js';
|
|
10
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/commands/logs.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Logs CLI Commands
|
|
3
|
-
* anc logs tail <appName> --env <envName> [--level <level>]
|
|
4
|
-
* anc logs
|
|
3
|
+
* anc logs tail <appName> --env <envName> [--level <level>] [--search <text>]
|
|
4
|
+
* anc logs search <appName> --env <envName> [--grep <text>] [--regex] [--logger <name>] [--since <1h|ISO>]
|
|
5
|
+
* anc logs download <appName> --env <envName> --from <date> [--to <date>] [--grep <text>] [--summary] [--output <path>]
|
|
5
6
|
*/
|
|
6
7
|
import { Command } from 'commander';
|
|
7
8
|
export declare function createLogsCommand(): Command;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiFpC,wBAAgB,iBAAiB,IAAI,OAAO,CA6J3C"}
|
package/dist/commands/logs.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Logs CLI Commands
|
|
3
|
-
* anc logs tail <appName> --env <envName> [--level <level>]
|
|
4
|
-
* anc logs
|
|
3
|
+
* anc logs tail <appName> --env <envName> [--level <level>] [--search <text>]
|
|
4
|
+
* anc logs search <appName> --env <envName> [--grep <text>] [--regex] [--logger <name>] [--since <1h|ISO>]
|
|
5
|
+
* anc logs download <appName> --env <envName> --from <date> [--to <date>] [--grep <text>] [--summary] [--output <path>]
|
|
5
6
|
*/
|
|
6
7
|
import { Command } from 'commander';
|
|
7
8
|
import * as fs from 'fs';
|
|
@@ -9,15 +10,68 @@ import chalk from 'chalk';
|
|
|
9
10
|
import { log } from '../utils/logger.js';
|
|
10
11
|
import { errorMessage } from '../utils/errors.js';
|
|
11
12
|
import { parseDate } from '../utils/dates.js';
|
|
13
|
+
import { printTable } from '../utils/formatter.js';
|
|
14
|
+
import { MAX_LOG_LINES } from '../analysis/filter.js';
|
|
15
|
+
import { BUCKETS } from '../analysis/stats.js';
|
|
16
|
+
import { formatEntries, summarizeEntries } from '../analysis/summary.js';
|
|
12
17
|
import { createClient } from './shared.js';
|
|
18
|
+
function parseLimit(value) {
|
|
19
|
+
const n = Number(value);
|
|
20
|
+
if (!Number.isInteger(n) || n < 1 || n > MAX_LOG_LINES) {
|
|
21
|
+
throw new Error(`--limit must be a whole number from 1 to ${MAX_LOG_LINES}`);
|
|
22
|
+
}
|
|
23
|
+
return n;
|
|
24
|
+
}
|
|
25
|
+
function parseBucket(value) {
|
|
26
|
+
if (!(value in BUCKETS))
|
|
27
|
+
throw new Error(`--bucket must be one of ${Object.keys(BUCKETS).join(', ')}`);
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
function warnFallback(source) {
|
|
31
|
+
if (source.fallbackFromSpecId) {
|
|
32
|
+
log.warn(`Spec ${source.fallbackFromSpecId} has no log lines yet; showing the last successful spec ${source.specId}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function printEntry(entry) {
|
|
36
|
+
const ts = new Date(entry.timestamp).toISOString();
|
|
37
|
+
const logger = entry.loggerName ? chalk.dim(`${entry.loggerName} - `) : '';
|
|
38
|
+
log.logLine(entry.priority, `${logger}${entry.message ?? ''}`, ts);
|
|
39
|
+
if (entry.stackTrace)
|
|
40
|
+
log.dim(entry.stackTrace);
|
|
41
|
+
}
|
|
42
|
+
function printSummary(summary) {
|
|
43
|
+
log.header('Summary');
|
|
44
|
+
log.kv('Entries', summary.totalEntries);
|
|
45
|
+
if (summary.totalEntries === 0)
|
|
46
|
+
return;
|
|
47
|
+
log.kv('Time range', `${summary.timeRange.start} → ${summary.timeRange.end}`);
|
|
48
|
+
log.kv('Error rate', `${summary.errorRate}%`);
|
|
49
|
+
log.header('By level');
|
|
50
|
+
printTable(['Level', 'Count'], Object.entries(summary.byLevel)
|
|
51
|
+
.sort((a, b) => b[1] - a[1])
|
|
52
|
+
.map(([level, count]) => [level, String(count)]));
|
|
53
|
+
log.header(`Top loggers (${summary.loggerCount} in total)`);
|
|
54
|
+
printTable(['Logger', 'Count'], summary.byLogger.map(({ name, count }) => [name, String(count)]));
|
|
55
|
+
log.header(`By time (${summary.histogram.bucket} buckets)`);
|
|
56
|
+
printTable(['Bucket start', 'Total', 'ERROR', 'WARN'], summary.histogram.rows.map((row) => [
|
|
57
|
+
row.start,
|
|
58
|
+
String(row.total),
|
|
59
|
+
String(row.byLevel.ERROR ?? 0),
|
|
60
|
+
String(row.byLevel.WARN ?? 0),
|
|
61
|
+
]));
|
|
62
|
+
log.header('Top message templates');
|
|
63
|
+
printTable(['Count', 'Level', 'Template'], summary.topTemplates.map((t) => [String(t.count), t.level, t.template]));
|
|
64
|
+
}
|
|
13
65
|
export function createLogsCommand() {
|
|
14
|
-
const logs = new Command('logs').description('View and download application logs');
|
|
66
|
+
const logs = new Command('logs').description('View, search and download application logs');
|
|
15
67
|
logs.command('tail')
|
|
16
68
|
.description('Stream logs in real-time')
|
|
17
69
|
.argument('<appName>', 'Application name')
|
|
18
70
|
.requiredOption('-e, --env <name>', 'Environment name')
|
|
19
|
-
.option('-l, --level <level>', '
|
|
71
|
+
.option('-l, --level <level>', 'Minimum log level (TRACE, DEBUG, INFO, WARN, ERROR, FATAL)')
|
|
20
72
|
.option('-s, --search <text>', 'Search filter')
|
|
73
|
+
.option('--regex', 'Treat --search as a regular expression')
|
|
74
|
+
.option('--logger <name>', 'Only entries whose logger name contains this text')
|
|
21
75
|
.action(async (appName, opts) => {
|
|
22
76
|
try {
|
|
23
77
|
const client = createClient();
|
|
@@ -28,6 +82,8 @@ export function createLogsCommand() {
|
|
|
28
82
|
for await (const entries of client.logs.tailLogs(orgId, env.id, appName, {
|
|
29
83
|
level: opts.level,
|
|
30
84
|
search: opts.search,
|
|
85
|
+
regex: opts.regex,
|
|
86
|
+
logger: opts.logger,
|
|
31
87
|
})) {
|
|
32
88
|
for (const entry of entries) {
|
|
33
89
|
const ts = new Date(entry.timestamp).toLocaleTimeString('en-US', { hour12: false });
|
|
@@ -44,40 +100,109 @@ export function createLogsCommand() {
|
|
|
44
100
|
process.exit(1);
|
|
45
101
|
}
|
|
46
102
|
});
|
|
103
|
+
logs.command('search')
|
|
104
|
+
.description('Search recent log entries; multi-line entries are matched and shown whole')
|
|
105
|
+
.argument('<appName>', 'Application name')
|
|
106
|
+
.requiredOption('-e, --env <name>', 'Environment name')
|
|
107
|
+
.option('-g, --grep <text>', 'Text to find in the message, logger, thread, stack trace or JSON payload')
|
|
108
|
+
.option('--regex', 'Treat --grep as a case-insensitive regular expression')
|
|
109
|
+
.option('--logger <name>', 'Only entries whose logger name contains this text')
|
|
110
|
+
.option('-l, --level <level>', 'Minimum log level (TRACE, DEBUG, INFO, WARN, ERROR, FATAL)')
|
|
111
|
+
.option('--since <date>', 'Only entries since this time (ISO date or relative: 30m, 1h, 2d)')
|
|
112
|
+
.option('--until <date>', 'Only entries until this time (ISO date or relative)')
|
|
113
|
+
.option('-n, --limit <n>', `Most recent matching entries to show (max ${MAX_LOG_LINES})`, '100')
|
|
114
|
+
.option('--json', 'Print the result as JSON')
|
|
115
|
+
.action(async (appName, opts) => {
|
|
116
|
+
try {
|
|
117
|
+
const limit = parseLimit(opts.limit);
|
|
118
|
+
const startTime = opts.since ? parseDate(opts.since) : undefined;
|
|
119
|
+
const endTime = opts.until ? parseDate(opts.until) : undefined;
|
|
120
|
+
const client = createClient();
|
|
121
|
+
const orgId = await client.getDefaultOrgId();
|
|
122
|
+
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
123
|
+
const result = await client.logs.searchLogs(orgId, env.id, appName, {
|
|
124
|
+
search: opts.grep,
|
|
125
|
+
regex: opts.regex,
|
|
126
|
+
logger: opts.logger,
|
|
127
|
+
level: opts.level,
|
|
128
|
+
startTime,
|
|
129
|
+
endTime,
|
|
130
|
+
limit,
|
|
131
|
+
});
|
|
132
|
+
if (opts.json) {
|
|
133
|
+
console.log(JSON.stringify(result, null, 2));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
warnFallback(result.source);
|
|
137
|
+
if (result.total === 0) {
|
|
138
|
+
log.warn(`No matching log entries for ${appName} in ${env.name}`);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Oldest first reads naturally in a terminal.
|
|
142
|
+
for (const entry of [...result.entries].reverse())
|
|
143
|
+
printEntry(entry);
|
|
144
|
+
const shown = result.truncated
|
|
145
|
+
? `Showing the newest ${result.returned} of ${result.total} matching entries`
|
|
146
|
+
: `${result.total} matching entries`;
|
|
147
|
+
log.info(`${shown} (spec ${result.source.specId})`);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
log.error(`Log search failed: ${errorMessage(error)}`);
|
|
151
|
+
process.exitCode = 1;
|
|
152
|
+
}
|
|
153
|
+
});
|
|
47
154
|
logs.command('download')
|
|
48
|
-
.description('Download logs for a time period')
|
|
155
|
+
.description('Download logs for a time period, or summarize them')
|
|
49
156
|
.argument('<appName>', 'Application name')
|
|
50
157
|
.requiredOption('-e, --env <name>', 'Environment name')
|
|
51
158
|
.requiredOption('--from <date>', 'Start time (ISO date or relative: 1h, 30m, 2d)')
|
|
52
159
|
.option('--to <date>', 'End time (default: now)')
|
|
53
|
-
.option('-l, --level <level>', '
|
|
54
|
-
.option('-
|
|
160
|
+
.option('-l, --level <level>', 'Minimum log level')
|
|
161
|
+
.option('-g, --grep <text>', 'Only entries containing this text')
|
|
162
|
+
.option('--regex', 'Treat --grep as a case-insensitive regular expression')
|
|
163
|
+
.option('--logger <name>', 'Only entries whose logger name contains this text')
|
|
164
|
+
.option('--summary', 'Print counts by level, logger and time, and the top message templates, instead of lines')
|
|
165
|
+
.option('--bucket <size>', 'Time bucket for --summary: 5m, 15m or 1h', '1h')
|
|
166
|
+
.option('-o, --output <path>', 'Output file path (with --summary, writes the summary as JSON)')
|
|
55
167
|
.action(async (appName, opts) => {
|
|
56
168
|
try {
|
|
169
|
+
const bucket = parseBucket(opts.bucket);
|
|
170
|
+
const from = parseDate(opts.from);
|
|
171
|
+
const to = opts.to ? parseDate(opts.to) : Date.now();
|
|
57
172
|
const client = createClient();
|
|
58
173
|
const orgId = await client.getDefaultOrgId();
|
|
59
174
|
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
60
|
-
const from = parseDate(opts.from);
|
|
61
|
-
const to = opts.to ? parseDate(opts.to) : Date.now();
|
|
62
175
|
log.info(`Downloading logs for ${chalk.bold(appName)} in ${env.name}`);
|
|
63
176
|
log.kv('Period', `${new Date(from).toISOString()} → ${new Date(to).toISOString()}`);
|
|
64
|
-
const entries = await client.logs.
|
|
177
|
+
const { entries, source } = await client.logs.queryLogs(orgId, env.id, appName, {
|
|
178
|
+
startTime: from,
|
|
179
|
+
endTime: to,
|
|
180
|
+
level: opts.level,
|
|
181
|
+
search: opts.grep,
|
|
182
|
+
regex: opts.regex,
|
|
183
|
+
logger: opts.logger,
|
|
184
|
+
});
|
|
185
|
+
warnFallback(source);
|
|
186
|
+
if (opts.summary) {
|
|
187
|
+
const summary = summarizeEntries(entries, { bucket });
|
|
188
|
+
printSummary(summary);
|
|
189
|
+
if (opts.output) {
|
|
190
|
+
fs.writeFileSync(opts.output, JSON.stringify(summary, null, 2), 'utf-8');
|
|
191
|
+
log.success(`Summary written → ${chalk.bold(opts.output)}`);
|
|
192
|
+
}
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
65
195
|
if (entries.length === 0) {
|
|
66
196
|
log.warn('No log entries found for the specified period');
|
|
67
197
|
return;
|
|
68
198
|
}
|
|
69
|
-
// Format log lines
|
|
70
|
-
const lines = entries.map((e) => {
|
|
71
|
-
const ts = new Date(e.timestamp).toISOString();
|
|
72
|
-
return `${ts} [${e.priority}] ${e.message}`;
|
|
73
|
-
});
|
|
74
199
|
const output = opts.output || `${appName}-logs-${new Date().toISOString().split('T')[0]}.log`;
|
|
75
|
-
fs.writeFileSync(output,
|
|
200
|
+
fs.writeFileSync(output, formatEntries(entries) + '\n', 'utf-8');
|
|
76
201
|
log.success(`Downloaded ${entries.length} log entries → ${chalk.bold(output)}`);
|
|
77
202
|
}
|
|
78
203
|
catch (error) {
|
|
79
204
|
log.error(`Log download failed: ${errorMessage(error)}`);
|
|
80
|
-
process.
|
|
205
|
+
process.exitCode = 1;
|
|
81
206
|
}
|
|
82
207
|
});
|
|
83
208
|
return logs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimes.d.ts","sourceRoot":"","sources":["../../src/commands/runtimes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,IAAI,OAAO,CA4D/C"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtimes CLI Command
|
|
3
|
+
* anc runtimes list -e <env> [--app <name> | --target <id>]
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { log } from '../utils/logger.js';
|
|
7
|
+
import { errorMessage } from '../utils/errors.js';
|
|
8
|
+
import { printTable } from '../utils/formatter.js';
|
|
9
|
+
import { compareVersions, parseRuntimeString, resolveRuntime, suggestRuntimes } from '../safety/runtime.js';
|
|
10
|
+
import { createClient } from './shared.js';
|
|
11
|
+
export function createRuntimesCommand() {
|
|
12
|
+
const runtimes = new Command('runtimes').description('Mule runtime versions a deployment target accepts');
|
|
13
|
+
runtimes
|
|
14
|
+
.command('list')
|
|
15
|
+
.description("List runtime versions for an app's target or a given target")
|
|
16
|
+
.requiredOption('-e, --env <name>', 'Environment name or ID')
|
|
17
|
+
.option('-a, --app <name>', "Use this app's target and check its current runtime")
|
|
18
|
+
.option('--target <id>', 'Target ID, e.g. cloudhub-us-east-2 or a private space ID')
|
|
19
|
+
.action(async (opts) => {
|
|
20
|
+
try {
|
|
21
|
+
const client = createClient();
|
|
22
|
+
const orgId = await client.getDefaultOrgId();
|
|
23
|
+
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
24
|
+
const app = opts.app ? await client.cloudHub2.findDetailByName(orgId, env.id, opts.app) : null;
|
|
25
|
+
if (opts.app && !app) {
|
|
26
|
+
log.error(`Application "${opts.app}" not found in ${env.name}`);
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const targetId = opts.target ?? app?.target?.targetId;
|
|
31
|
+
if (!targetId) {
|
|
32
|
+
const targets = await client.runtimes.getTargets(orgId);
|
|
33
|
+
printTable(['Target', 'Name', 'Type', 'Versions'], targets.map((t) => [t.id, t.name ?? '-', t.type ?? '-', String(t.runtimes.length)]));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const target = await client.runtimes.getTarget(orgId, targetId);
|
|
37
|
+
if (!target) {
|
|
38
|
+
log.error(`Target "${targetId}" is not in the organization's runtime catalog`);
|
|
39
|
+
process.exitCode = 1;
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
log.header(`Runtimes on ${target.name ?? target.id}`);
|
|
43
|
+
printTable(['Version', 'Channel', 'Java', 'Tag'], [...target.runtimes]
|
|
44
|
+
.sort((a, b) => compareVersions(b.version, a.version))
|
|
45
|
+
.map((v) => [v.version, v.releaseChannel ?? '-', v.java.join(', ') || '-', v.tag ?? '-']));
|
|
46
|
+
const runtime = app?.target?.deploymentSettings?.runtime;
|
|
47
|
+
if (runtime) {
|
|
48
|
+
const current = parseRuntimeString(runtime.version, runtime.java);
|
|
49
|
+
if (resolveRuntime(target.runtimes, current)) {
|
|
50
|
+
log.success(`${app?.name} runs ${runtime.version}, which this target still offers`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
log.warn(`${app?.name} runs ${runtime.version}, which this target no longer offers`);
|
|
54
|
+
log.info(`Nearest supported: ${suggestRuntimes(target.runtimes, current).join('; ')}`);
|
|
55
|
+
log.dim(` anc apps update ${app?.name} -e ${opts.env} --runtime <version> --dry-run`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
log.error(`Failed to list runtimes: ${errorMessage(error)}`);
|
|
61
|
+
process.exitCode = 1;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return runtimes;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=runtimes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimes.js","sourceRoot":"","sources":["../../src/commands/runtimes.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,14 @@ export declare function getProfileDir(profile?: string): string;
|
|
|
41
41
|
export declare function migrateIfNeeded(): void;
|
|
42
42
|
export interface ProjectConfig {
|
|
43
43
|
profile: string;
|
|
44
|
+
/** Naming conventions for assets this project publishes. */
|
|
45
|
+
conventions?: {
|
|
46
|
+
/** Asset ID template, e.g. "{app}-{pomVersion}-{timestamp}". Tokens: {app}, {artifactId}, {pomVersion}, {timestamp}, {gitShort}. */
|
|
47
|
+
assetId?: string;
|
|
48
|
+
/** Asset version, fixed ("1.0.0") or a template ("{pomVersion}"). */
|
|
49
|
+
assetVersion?: string;
|
|
50
|
+
groupId?: string;
|
|
51
|
+
};
|
|
44
52
|
}
|
|
45
53
|
/**
|
|
46
54
|
* Walk up from startDir to find .anypoint-connect.json.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAcH,+DAA+D;AAC/D,eAAO,MAAM,oBAAoB,uCAAuC,CAAC;AAIzE;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,MAAwB,GAAG,MAAM,CAMvE;AAQD;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAwBtC;AAID,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAcH,+DAA+D;AAC/D,eAAO,MAAM,oBAAoB,uCAAuC,CAAC;AAIzE;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,MAAwB,GAAG,MAAM,CAMvE;AAQD;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAwBtC;AAID,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,WAAW,CAAC,EAAE;QACV,oIAAoI;QACpI,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,qEAAqE;QACrE,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACL;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAkB7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAMxE;AAID,MAAM,WAAW,eAAe;IAC5B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,cAAc,GAAG,SAAS,CAAC;CACvD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,eAAe,CAgB3F;AAID;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAcvC;AAID,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAcpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAI5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAW9F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAGxD;AAID,MAAM,WAAW,MAAM;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC7B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CA0C5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|