@sfdxy/anypoint-connect 0.15.0 → 0.16.3
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 +72 -19
- package/dist/api/LogsApi.d.ts.map +1 -1
- package/dist/api/LogsApi.js +116 -99
- 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 +5 -1
- 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 +158 -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 +50 -2
- package/dist/mcp/tools/logs.d.ts.map +1 -1
- package/dist/mcp/tools/logs.js +221 -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 +148 -14
- 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
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployed artifact comparison
|
|
3
|
+
* Compares a Mule application jar with another jar or with a git checkout of its source.
|
|
4
|
+
* Only names, sizes, versions and hashes are reported, never file contents.
|
|
5
|
+
*/
|
|
6
|
+
import { execFile } from 'node:child_process';
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import { promisify } from 'node:util';
|
|
11
|
+
import { strFromU8, unzipSync } from 'fflate';
|
|
12
|
+
const execFileAsync = promisify(execFile);
|
|
13
|
+
/** Ceiling on the uncompressed size of the indexed entries, against zip bombs. */
|
|
14
|
+
const MAX_UNCOMPRESSED_BYTES = 512 * 1024 * 1024;
|
|
15
|
+
/** Longest list of paths returned per category; the summary keeps the full counts. */
|
|
16
|
+
const MAX_LISTED = 200;
|
|
17
|
+
/** Repo directories that end up in the jar. */
|
|
18
|
+
const MULE_DIR = 'src/main/mule/';
|
|
19
|
+
const RESOURCES_DIR = 'src/main/resources/';
|
|
20
|
+
/** Git blob object ID: SHA-1 over `blob <len>\0` followed by the bytes. */
|
|
21
|
+
export function gitBlobSha1(bytes) {
|
|
22
|
+
return createHash('sha1').update(`blob ${bytes.length}\0`).update(bytes).digest('hex');
|
|
23
|
+
}
|
|
24
|
+
/** Refuse refs that git could read as an option, or that hold unexpected characters. */
|
|
25
|
+
export function validateGitRef(ref) {
|
|
26
|
+
if (!ref || ref.startsWith('-') || ref.length > 200 || !/^[A-Za-z0-9._/@{}~^+-]+$/.test(ref)) {
|
|
27
|
+
throw new Error(`Invalid git ref: ${JSON.stringify(ref)}`);
|
|
28
|
+
}
|
|
29
|
+
return ref;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Where a jar entry comes from in a Mule 4 project, most likely first:
|
|
33
|
+
* - `META-INF/maven/<g>/<a>/pom.xml` comes from `pom.xml`;
|
|
34
|
+
* - other `META-INF/**` entries and compiled `*.class` files are generated, so they map nowhere;
|
|
35
|
+
* - an `*.xml` entry comes from `src/main/mule/`, or else `src/main/resources/` (e.g. log4j2.xml);
|
|
36
|
+
* - anything else (`api/**`, `*.properties`, `*.yaml`, `*.json`, `*.dwl`, ...) comes from `src/main/resources/`.
|
|
37
|
+
*/
|
|
38
|
+
export function jarEntryToRepoCandidates(entry) {
|
|
39
|
+
if (!entry || entry.endsWith('/') || entry.startsWith('repository/'))
|
|
40
|
+
return [];
|
|
41
|
+
if (/^META-INF\/maven\/[^/]+\/[^/]+\/pom\.xml$/.test(entry))
|
|
42
|
+
return ['pom.xml'];
|
|
43
|
+
if (entry.startsWith('META-INF/') || entry.endsWith('.class'))
|
|
44
|
+
return [];
|
|
45
|
+
if (entry.toLowerCase().endsWith('.xml'))
|
|
46
|
+
return [`${MULE_DIR}${entry}`, `${RESOURCES_DIR}${entry}`];
|
|
47
|
+
return [`${RESOURCES_DIR}${entry}`];
|
|
48
|
+
}
|
|
49
|
+
/** True for a repo path that the build copies into the jar. */
|
|
50
|
+
function isPackagedRepoPath(file) {
|
|
51
|
+
return file === 'pom.xml' || file.startsWith(MULE_DIR) || file.startsWith(RESOURCES_DIR);
|
|
52
|
+
}
|
|
53
|
+
function stripBlocks(xml, tags) {
|
|
54
|
+
let result = xml;
|
|
55
|
+
for (const tag of tags)
|
|
56
|
+
result = result.replace(new RegExp(`<${tag}>[\\s\\S]*?</${tag}>`, 'g'), '');
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
function firstTag(xml, tag) {
|
|
60
|
+
return new RegExp(`<${tag}>\\s*([^<]*?)\\s*</${tag}>`).exec(xml)?.[1];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Read a pom's own coordinates and its declared dependencies. `${...}` placeholders are
|
|
64
|
+
* resolved from `<properties>` and the project coordinates; anything else is left as is.
|
|
65
|
+
*/
|
|
66
|
+
export function parsePom(xml) {
|
|
67
|
+
const clean = xml.replace(/<!--[\s\S]*?-->/g, '');
|
|
68
|
+
const properties = {};
|
|
69
|
+
const propertiesBlock = /<properties>([\s\S]*?)<\/properties>/.exec(clean)?.[1] ?? '';
|
|
70
|
+
for (const match of propertiesBlock.matchAll(/<([\w.-]+)>\s*([^<]*?)\s*<\/\1>/g))
|
|
71
|
+
properties[match[1]] = match[2];
|
|
72
|
+
const parent = /<parent>([\s\S]*?)<\/parent>/.exec(clean)?.[1] ?? '';
|
|
73
|
+
const top = stripBlocks(clean, [
|
|
74
|
+
'parent',
|
|
75
|
+
'dependencyManagement',
|
|
76
|
+
'build',
|
|
77
|
+
'profiles',
|
|
78
|
+
'reporting',
|
|
79
|
+
'pluginRepositories',
|
|
80
|
+
'repositories',
|
|
81
|
+
'distributionManagement',
|
|
82
|
+
]);
|
|
83
|
+
const own = stripBlocks(top, ['dependencies', 'properties']);
|
|
84
|
+
const groupId = firstTag(own, 'groupId') ?? firstTag(parent, 'groupId');
|
|
85
|
+
const artifactId = firstTag(own, 'artifactId');
|
|
86
|
+
const rawVersion = firstTag(own, 'version') ?? firstTag(parent, 'version');
|
|
87
|
+
const resolve = (value) => value?.replace(/\$\{([^}]+)\}/g, (placeholder, name) => {
|
|
88
|
+
if (name === 'project.version' || name === 'version')
|
|
89
|
+
return rawVersion ?? placeholder;
|
|
90
|
+
if (name === 'project.groupId' || name === 'groupId')
|
|
91
|
+
return groupId ?? placeholder;
|
|
92
|
+
if (name === 'project.artifactId' || name === 'artifactId')
|
|
93
|
+
return artifactId ?? placeholder;
|
|
94
|
+
return properties[name] ?? placeholder;
|
|
95
|
+
});
|
|
96
|
+
const dependencies = [];
|
|
97
|
+
const dependenciesBlock = /<dependencies>([\s\S]*?)<\/dependencies>/.exec(top)?.[1] ?? '';
|
|
98
|
+
for (const match of dependenciesBlock.matchAll(/<dependency>([\s\S]*?)<\/dependency>/g)) {
|
|
99
|
+
const body = stripBlocks(match[1], ['exclusions']);
|
|
100
|
+
if (firstTag(body, 'scope') === 'test')
|
|
101
|
+
continue;
|
|
102
|
+
const g = resolve(firstTag(body, 'groupId'));
|
|
103
|
+
const a = resolve(firstTag(body, 'artifactId'));
|
|
104
|
+
if (!g || !a)
|
|
105
|
+
continue;
|
|
106
|
+
dependencies.push(`${g}:${a}:${resolve(firstTag(body, 'version')) ?? 'managed'}`);
|
|
107
|
+
}
|
|
108
|
+
return { groupId: resolve(groupId), artifactId: resolve(artifactId), version: resolve(rawVersion), dependencies };
|
|
109
|
+
}
|
|
110
|
+
function parseClassloaderModel(text) {
|
|
111
|
+
try {
|
|
112
|
+
const model = JSON.parse(text);
|
|
113
|
+
return (model.dependencies ?? [])
|
|
114
|
+
.map((d) => d.artifactCoordinates)
|
|
115
|
+
.filter((c) => Boolean(c?.groupId && c.artifactId))
|
|
116
|
+
.map((c) => `${c.groupId}:${c.artifactId}:${c.version ?? '?'}`);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Index a Mule application jar: hashes per entry, the pom and the resolved dependencies. */
|
|
123
|
+
export function indexJar(bytes, options = {}) {
|
|
124
|
+
const limit = options.maxUncompressedBytes ?? MAX_UNCOMPRESSED_BYTES;
|
|
125
|
+
const skipped = { repository: 0, directories: 0 };
|
|
126
|
+
let total = 0;
|
|
127
|
+
const files = unzipSync(bytes, {
|
|
128
|
+
filter(entry) {
|
|
129
|
+
if (entry.name.startsWith('repository/')) {
|
|
130
|
+
skipped.repository++;
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
if (entry.name.endsWith('/')) {
|
|
134
|
+
skipped.directories++;
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
total += entry.originalSize;
|
|
138
|
+
if (total > limit)
|
|
139
|
+
throw new Error(`Jar content exceeds ${limit} bytes uncompressed`);
|
|
140
|
+
return true;
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
const entries = new Map();
|
|
144
|
+
for (const [name, content] of Object.entries(files)) {
|
|
145
|
+
entries.set(name, {
|
|
146
|
+
size: content.length,
|
|
147
|
+
sha256: createHash('sha256').update(content).digest('hex'),
|
|
148
|
+
gitSha1: gitBlobSha1(content),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const pomXmlName = Object.keys(files).find((name) => /^META-INF\/maven\/[^/]+\/[^/]+\/pom\.xml$/.test(name));
|
|
152
|
+
const pomPropsName = Object.keys(files).find((name) => /^META-INF\/maven\/[^/]+\/[^/]+\/pom\.properties$/.test(name));
|
|
153
|
+
const pom = pomXmlName ? parsePom(strFromU8(files[pomXmlName])) : undefined;
|
|
154
|
+
const propsVersion = pomPropsName
|
|
155
|
+
? /^\s*version\s*[=:]\s*(\S+)\s*$/m.exec(strFromU8(files[pomPropsName]))?.[1]
|
|
156
|
+
: undefined;
|
|
157
|
+
const model = files['META-INF/mule-artifact/classloader-model.json'];
|
|
158
|
+
return {
|
|
159
|
+
sha256: createHash('sha256').update(bytes).digest('hex'),
|
|
160
|
+
size: bytes.length,
|
|
161
|
+
entries,
|
|
162
|
+
pom,
|
|
163
|
+
pomVersion: propsVersion ?? pom?.version,
|
|
164
|
+
resolvedDependencies: model ? parseClassloaderModel(strFromU8(model)) : undefined,
|
|
165
|
+
skipped,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function splitCoordinate(coordinate) {
|
|
169
|
+
const parts = coordinate.split(':');
|
|
170
|
+
return { key: parts.slice(0, 2).join(':'), version: parts.slice(2).join(':') };
|
|
171
|
+
}
|
|
172
|
+
/** Compare two dependency lists by `group:artifact`, reporting version changes and one-sided entries. */
|
|
173
|
+
export function diffDependencies(deployed = [], repo = []) {
|
|
174
|
+
const left = new Map(deployed.map((d) => [splitCoordinate(d).key, splitCoordinate(d).version]));
|
|
175
|
+
const right = new Map(repo.map((d) => [splitCoordinate(d).key, splitCoordinate(d).version]));
|
|
176
|
+
const result = { changed: [], missingInRepo: [], extraInRepo: [] };
|
|
177
|
+
for (const [key, version] of left) {
|
|
178
|
+
if (!right.has(key))
|
|
179
|
+
result.missingInRepo.push(`${key}:${version}`);
|
|
180
|
+
else if (right.get(key) !== version)
|
|
181
|
+
result.changed.push({ dependency: key, deployed: version, repo: right.get(key) });
|
|
182
|
+
}
|
|
183
|
+
for (const [key, version] of right)
|
|
184
|
+
if (!left.has(key))
|
|
185
|
+
result.extraInRepo.push(`${key}:${version}`);
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
function hasDependencyDifferences(diff) {
|
|
189
|
+
return diff.changed.length + diff.missingInRepo.length + diff.extraInRepo.length > 0;
|
|
190
|
+
}
|
|
191
|
+
function finish(base, lists, counts) {
|
|
192
|
+
const byPath = (a, b) => a.path.localeCompare(b.path);
|
|
193
|
+
const differs = lists.changed.length + lists.missingInRepo.length + lists.extraInRepo.length > 0 ||
|
|
194
|
+
hasDependencyDifferences(base.dependencies) ||
|
|
195
|
+
Boolean(base.pomVersion.deployed && base.pomVersion.repo && base.pomVersion.deployed !== base.pomVersion.repo);
|
|
196
|
+
const notes = [...base.notes];
|
|
197
|
+
for (const [name, list] of Object.entries(lists)) {
|
|
198
|
+
if (list.length > MAX_LISTED)
|
|
199
|
+
notes.push(`${name} lists the first ${MAX_LISTED} of ${list.length} paths`);
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
verdict: differs ? 'differs' : 'identical',
|
|
203
|
+
...base,
|
|
204
|
+
summary: {
|
|
205
|
+
compared: counts.compared,
|
|
206
|
+
changed: lists.changed.length,
|
|
207
|
+
missingInRepo: lists.missingInRepo.length,
|
|
208
|
+
extraInRepo: lists.extraInRepo.length,
|
|
209
|
+
unmapped: counts.unmapped,
|
|
210
|
+
skippedRepositoryEntries: counts.skippedRepositoryEntries,
|
|
211
|
+
},
|
|
212
|
+
changed: lists.changed.sort(byPath).slice(0, MAX_LISTED),
|
|
213
|
+
missingInRepo: lists.missingInRepo.sort(byPath).slice(0, MAX_LISTED),
|
|
214
|
+
extraInRepo: lists.extraInRepo.sort(byPath).slice(0, MAX_LISTED),
|
|
215
|
+
notes,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Compare the deployed jar with a local jar. "Repo" in the output means the local jar.
|
|
220
|
+
* Equal SHA-256 short-circuits; otherwise every entry outside `repository/` is compared,
|
|
221
|
+
* so a rebuild that only changed timestamps still counts as identical.
|
|
222
|
+
*/
|
|
223
|
+
export function compareJarToJar(deployedBytes, localBytes, localLabel = 'local jar') {
|
|
224
|
+
const deployed = indexJar(deployedBytes);
|
|
225
|
+
const local = deployedBytes === localBytes ? deployed : indexJar(localBytes);
|
|
226
|
+
const changed = [];
|
|
227
|
+
const missingInRepo = [];
|
|
228
|
+
const extraInRepo = [];
|
|
229
|
+
if (deployed.sha256 !== local.sha256) {
|
|
230
|
+
for (const [name, entry] of deployed.entries) {
|
|
231
|
+
const other = local.entries.get(name);
|
|
232
|
+
if (!other)
|
|
233
|
+
missingInRepo.push({ path: name, deployedSize: entry.size });
|
|
234
|
+
else if (other.sha256 !== entry.sha256)
|
|
235
|
+
changed.push({ path: name, deployedSize: entry.size, repoSize: other.size });
|
|
236
|
+
}
|
|
237
|
+
for (const [name, entry] of local.entries) {
|
|
238
|
+
if (!deployed.entries.has(name))
|
|
239
|
+
extraInRepo.push({ path: name, repoSize: entry.size });
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const notes = [];
|
|
243
|
+
if (!deployed.resolvedDependencies || !local.resolvedDependencies) {
|
|
244
|
+
notes.push('A jar has no classloader-model.json; dependencies compared from the declared pom dependencies');
|
|
245
|
+
}
|
|
246
|
+
const dependencies = deployed.resolvedDependencies && local.resolvedDependencies
|
|
247
|
+
? diffDependencies(deployed.resolvedDependencies, local.resolvedDependencies)
|
|
248
|
+
: diffDependencies(deployed.pom?.dependencies, local.pom?.dependencies);
|
|
249
|
+
return finish({
|
|
250
|
+
against: { type: 'jar', path: localLabel, size: local.size },
|
|
251
|
+
sha256: { deployed: deployed.sha256, repo: local.sha256, match: deployed.sha256 === local.sha256 },
|
|
252
|
+
pomVersion: { deployed: deployed.pomVersion, repo: local.pomVersion },
|
|
253
|
+
dependencies,
|
|
254
|
+
notes,
|
|
255
|
+
}, { changed, missingInRepo, extraInRepo }, {
|
|
256
|
+
compared: deployed.entries.size,
|
|
257
|
+
unmapped: 0,
|
|
258
|
+
skippedRepositoryEntries: deployed.skipped.repository,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
async function git(repoPath, args) {
|
|
262
|
+
try {
|
|
263
|
+
const { stdout } = await execFileAsync('git', ['-C', repoPath, ...args], {
|
|
264
|
+
encoding: 'utf8',
|
|
265
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
266
|
+
env: { ...process.env, GIT_OPTIONAL_LOCKS: '0', GIT_TERMINAL_PROMPT: '0' },
|
|
267
|
+
});
|
|
268
|
+
return stdout;
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
const stderr = error.stderr?.trim();
|
|
272
|
+
throw new Error(`git ${args[0]} failed${stderr ? `: ${stderr.split('\n')[0]}` : ''}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/** List packaged files at a ref, relative to the project directory, without reading their contents. */
|
|
276
|
+
async function listTree(repoPath, ref) {
|
|
277
|
+
const out = await git(repoPath, ['ls-tree', '-r', '-l', '-z', ref, '--', 'pom.xml', MULE_DIR, RESOURCES_DIR]);
|
|
278
|
+
const entries = new Map();
|
|
279
|
+
for (const record of out.split('\0')) {
|
|
280
|
+
const tab = record.indexOf('\t');
|
|
281
|
+
if (tab < 0)
|
|
282
|
+
continue;
|
|
283
|
+
const [, type, oid, size] = record.slice(0, tab).split(/\s+/);
|
|
284
|
+
if (type !== 'blob')
|
|
285
|
+
continue;
|
|
286
|
+
entries.set(record.slice(tab + 1), { oid, size: Number(size) });
|
|
287
|
+
}
|
|
288
|
+
return entries;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Overlay uncommitted and untracked changes in the packaged paths onto a tree listing. Changed
|
|
292
|
+
* files are hashed as git blobs in place; their contents are never returned.
|
|
293
|
+
*/
|
|
294
|
+
async function overlayWorkingTree(repoPath, entries) {
|
|
295
|
+
const prefix = (await git(repoPath, ['rev-parse', '--show-prefix'])).trim();
|
|
296
|
+
const out = await git(repoPath, [
|
|
297
|
+
'status',
|
|
298
|
+
'--porcelain=v1',
|
|
299
|
+
'-z',
|
|
300
|
+
'--untracked-files=all',
|
|
301
|
+
'--',
|
|
302
|
+
'pom.xml',
|
|
303
|
+
MULE_DIR,
|
|
304
|
+
RESOURCES_DIR,
|
|
305
|
+
]);
|
|
306
|
+
const records = out.split('\0').filter(Boolean);
|
|
307
|
+
const changes = [];
|
|
308
|
+
const touched = [];
|
|
309
|
+
for (let i = 0; i < records.length; i++) {
|
|
310
|
+
const status = records[i].slice(0, 2);
|
|
311
|
+
const file = records[i].slice(3);
|
|
312
|
+
if (status[0] === 'R' || status[0] === 'C')
|
|
313
|
+
touched.push(records[++i]);
|
|
314
|
+
touched.push(file);
|
|
315
|
+
const relative = file.startsWith(prefix) ? file.slice(prefix.length) : file;
|
|
316
|
+
changes.push({ path: relative, status: status.trim() });
|
|
317
|
+
}
|
|
318
|
+
for (const file of touched) {
|
|
319
|
+
if (!file.startsWith(prefix))
|
|
320
|
+
continue;
|
|
321
|
+
const relative = file.slice(prefix.length);
|
|
322
|
+
const absolute = path.join(repoPath, relative);
|
|
323
|
+
let stat;
|
|
324
|
+
try {
|
|
325
|
+
stat = fs.lstatSync(absolute);
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
entries.delete(relative);
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
const bytes = stat.isSymbolicLink()
|
|
332
|
+
? Buffer.from(fs.readlinkSync(absolute))
|
|
333
|
+
: stat.isFile()
|
|
334
|
+
? fs.readFileSync(absolute)
|
|
335
|
+
: undefined;
|
|
336
|
+
if (!bytes)
|
|
337
|
+
continue;
|
|
338
|
+
entries.set(relative, { oid: gitBlobSha1(bytes), size: bytes.length });
|
|
339
|
+
}
|
|
340
|
+
return changes;
|
|
341
|
+
}
|
|
342
|
+
function readRepoPom(repoPath, ref, workingTree) {
|
|
343
|
+
if (workingTree) {
|
|
344
|
+
const file = path.join(repoPath, 'pom.xml');
|
|
345
|
+
return Promise.resolve(fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : undefined);
|
|
346
|
+
}
|
|
347
|
+
return git(repoPath, ['show', `${ref}:./pom.xml`]).catch(() => undefined);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Compare the deployed jar with a git checkout of its source, by git blob ID. `repoPath` is the
|
|
351
|
+
* Mule project directory (it may be a subdirectory of a larger repository).
|
|
352
|
+
*/
|
|
353
|
+
export async function compareJarToGit(deployedBytes, options) {
|
|
354
|
+
const ref = validateGitRef(options.gitRef ?? 'HEAD');
|
|
355
|
+
if (options.includeWorkingTree && ref !== 'HEAD') {
|
|
356
|
+
throw new Error('includeWorkingTree compares the working tree, which is based on HEAD; omit gitRef');
|
|
357
|
+
}
|
|
358
|
+
const repoPath = path.resolve(options.repoPath);
|
|
359
|
+
const deployed = indexJar(deployedBytes);
|
|
360
|
+
const repo = await listTree(repoPath, ref);
|
|
361
|
+
const workingTreeChanges = options.includeWorkingTree ? await overlayWorkingTree(repoPath, repo) : undefined;
|
|
362
|
+
const changed = [];
|
|
363
|
+
const missingInRepo = [];
|
|
364
|
+
const claimed = new Set();
|
|
365
|
+
let compared = 0;
|
|
366
|
+
let unmapped = 0;
|
|
367
|
+
for (const [name, entry] of deployed.entries) {
|
|
368
|
+
const candidates = jarEntryToRepoCandidates(name);
|
|
369
|
+
if (candidates.length === 0) {
|
|
370
|
+
unmapped++;
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
compared++;
|
|
374
|
+
const match = candidates.find((candidate) => repo.has(candidate));
|
|
375
|
+
if (!match) {
|
|
376
|
+
missingInRepo.push({ path: candidates[0], jarPath: name, deployedSize: entry.size });
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
claimed.add(match);
|
|
380
|
+
const repoEntry = repo.get(match);
|
|
381
|
+
if (repoEntry.oid !== entry.gitSha1) {
|
|
382
|
+
changed.push({ path: match, jarPath: name, deployedSize: entry.size, repoSize: repoEntry.size });
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
const extraInRepo = [...repo.entries()]
|
|
386
|
+
.filter(([file]) => isPackagedRepoPath(file) && !claimed.has(file))
|
|
387
|
+
.map(([file, entry]) => ({ path: file, repoSize: entry.size }));
|
|
388
|
+
const pomText = await readRepoPom(repoPath, ref, Boolean(options.includeWorkingTree));
|
|
389
|
+
const repoPom = pomText ? parsePom(pomText) : undefined;
|
|
390
|
+
const notes = [
|
|
391
|
+
'Compiled classes and generated META-INF files are not compared',
|
|
392
|
+
'Resources changed by Maven filtering at build time show as changed',
|
|
393
|
+
];
|
|
394
|
+
if (!repoPom)
|
|
395
|
+
notes.push('No pom.xml found in the repo');
|
|
396
|
+
return finish({
|
|
397
|
+
against: {
|
|
398
|
+
type: 'git',
|
|
399
|
+
repoPath,
|
|
400
|
+
gitRef: ref,
|
|
401
|
+
includeWorkingTree: Boolean(options.includeWorkingTree),
|
|
402
|
+
},
|
|
403
|
+
sha256: { deployed: deployed.sha256 },
|
|
404
|
+
pomVersion: { deployed: deployed.pomVersion, repo: repoPom?.version },
|
|
405
|
+
dependencies: diffDependencies(deployed.pom?.dependencies, repoPom?.dependencies),
|
|
406
|
+
notes,
|
|
407
|
+
...(workingTreeChanges ? { workingTreeChanges } : {}),
|
|
408
|
+
}, { changed, missingInRepo, extraInRepo }, { compared, unmapped, skippedRepositoryEntries: deployed.skipped.repository });
|
|
409
|
+
}
|
|
410
|
+
/** Fetch the jar an application currently runs, from Exchange, bounded by `maxBytes`. */
|
|
411
|
+
export async function fetchDeployedJar(client, orgId, env, appName, options = {}) {
|
|
412
|
+
const deployment = await client.cloudHub2.findDetailByName(orgId, env.id, appName);
|
|
413
|
+
if (!deployment)
|
|
414
|
+
throw new Error(`Application "${appName}" not found in ${env.name}`);
|
|
415
|
+
const { groupId, artifactId, version } = deployment.application.ref;
|
|
416
|
+
const jar = await client.exchange.downloadAppJar(orgId, groupId, artifactId, version, options);
|
|
417
|
+
return { ref: { groupId, artifactId, version }, ...jar };
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=artifact-compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-compare.js","sourceRoot":"","sources":["../../src/workflows/artifact-compare.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset naming conventions
|
|
3
|
+
* Choose Exchange coordinates for a published application JAR. Explicit values win, then the
|
|
4
|
+
* project's convention (.anypoint-connect.json), then the JAR's own Maven identity. The pattern of
|
|
5
|
+
* the app's deployed asset is detected and reported so it can be adopted as a convention; it is
|
|
6
|
+
* applied only when a caller asks for it.
|
|
7
|
+
*/
|
|
8
|
+
import type { ArtifactRef } from '../api/CloudHub2Api.js';
|
|
9
|
+
import type { ArtifactCoordinates } from '../safety/artifact.js';
|
|
10
|
+
export interface AssetConvention {
|
|
11
|
+
/** Template for the asset ID, e.g. "{app}-{pomVersion}-{timestamp}". */
|
|
12
|
+
assetId?: string;
|
|
13
|
+
/** Template or fixed value for the asset version, e.g. "1.0.0" or "{pomVersion}". */
|
|
14
|
+
assetVersion?: string;
|
|
15
|
+
groupId?: string;
|
|
16
|
+
}
|
|
17
|
+
export type NamingRule = 'explicit' | 'convention' | 'inferred' | 'jar';
|
|
18
|
+
export interface AssetSuggestion {
|
|
19
|
+
groupId: string;
|
|
20
|
+
assetId: string;
|
|
21
|
+
version: string;
|
|
22
|
+
rules: {
|
|
23
|
+
groupId: NamingRule | 'organization';
|
|
24
|
+
assetId: NamingRule;
|
|
25
|
+
version: NamingRule;
|
|
26
|
+
};
|
|
27
|
+
/** The convention that produced the result, when one applied. */
|
|
28
|
+
convention?: AssetConvention;
|
|
29
|
+
/** The pattern of the deployed asset, reported but not applied. Adopt it as a project convention to use it. */
|
|
30
|
+
deployedPattern?: AssetConvention;
|
|
31
|
+
}
|
|
32
|
+
export interface NamingVariables {
|
|
33
|
+
app: string;
|
|
34
|
+
artifactId?: string;
|
|
35
|
+
pomVersion?: string;
|
|
36
|
+
timestamp: string;
|
|
37
|
+
gitShort?: string;
|
|
38
|
+
}
|
|
39
|
+
/** UTC timestamp as yyyyMMddHHmmss. */
|
|
40
|
+
export declare function namingTimestamp(date?: Date): string;
|
|
41
|
+
/** The short commit hash of the project, when it is a git checkout. */
|
|
42
|
+
export declare function gitShortHash(cwd?: string): string | undefined;
|
|
43
|
+
/** Fill a template. Throws when a token has no value or the result is not a valid Maven identifier. */
|
|
44
|
+
export declare function renderTemplate(template: string, vars: NamingVariables): string;
|
|
45
|
+
/**
|
|
46
|
+
* Infer a convention from the asset the app currently runs. For example an app "orders-sapi"
|
|
47
|
+
* running "orders-sapi-1.4.0-20260101120000" at version 1.0.0 implies
|
|
48
|
+
* "{app}-{pomVersion}-{timestamp}" at a fixed "1.0.0".
|
|
49
|
+
*/
|
|
50
|
+
export declare function inferConvention(app: string, ref: ArtifactRef): AssetConvention | undefined;
|
|
51
|
+
export interface SuggestInput {
|
|
52
|
+
app: string;
|
|
53
|
+
orgId: string;
|
|
54
|
+
jar?: ArtifactCoordinates;
|
|
55
|
+
existingRef?: ArtifactRef;
|
|
56
|
+
convention?: AssetConvention;
|
|
57
|
+
explicit?: {
|
|
58
|
+
assetId?: string;
|
|
59
|
+
assetVersion?: string;
|
|
60
|
+
groupId?: string;
|
|
61
|
+
};
|
|
62
|
+
now?: Date;
|
|
63
|
+
gitShort?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Apply the pattern inferred from the deployed asset. Off by default: publication never picks
|
|
66
|
+
* coordinates the caller did not ask for, so the inferred pattern is only reported.
|
|
67
|
+
*/
|
|
68
|
+
applyInferred?: boolean;
|
|
69
|
+
}
|
|
70
|
+
/** Pick the Exchange coordinates and report which rule chose each one. */
|
|
71
|
+
export declare function suggestAssetCoordinates(input: SuggestInput): AssetSuggestion;
|
|
72
|
+
//# sourceMappingURL=asset-naming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-naming.d.ts","sourceRoot":"","sources":["../../src/workflows/asset-naming.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC5B,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,GAAG,KAAK,CAAC;AAExE,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QAAE,OAAO,EAAE,UAAU,GAAG,cAAc,CAAC;QAAC,OAAO,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,UAAU,CAAA;KAAE,CAAC;IAC1F,iEAAiE;IACjE,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,+GAA+G;IAC/G,eAAe,CAAC,EAAE,eAAe,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,uCAAuC;AACvC,wBAAgB,eAAe,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAE/D;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,SAAS,CAY5E;AAED,uGAAuG;AACvG,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAS9E;AAKD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,CAe1F;AAED,MAAM,WAAW,YAAY;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,mBAAmB,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,0EAA0E;AAC1E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,CAmE5E"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset naming conventions
|
|
3
|
+
* Choose Exchange coordinates for a published application JAR. Explicit values win, then the
|
|
4
|
+
* project's convention (.anypoint-connect.json), then the JAR's own Maven identity. The pattern of
|
|
5
|
+
* the app's deployed asset is detected and reported so it can be adopted as a convention; it is
|
|
6
|
+
* applied only when a caller asks for it.
|
|
7
|
+
*/
|
|
8
|
+
import { execFileSync } from 'node:child_process';
|
|
9
|
+
const TOKEN = /\{(app|artifactId|pomVersion|timestamp|gitShort)\}/g;
|
|
10
|
+
const VALID_ID = /^[A-Za-z0-9][A-Za-z0-9._+-]*$/;
|
|
11
|
+
/** UTC timestamp as yyyyMMddHHmmss. */
|
|
12
|
+
export function namingTimestamp(date = new Date()) {
|
|
13
|
+
return date.toISOString().replace(/[-:T]/g, '').slice(0, 14);
|
|
14
|
+
}
|
|
15
|
+
/** The short commit hash of the project, when it is a git checkout. */
|
|
16
|
+
export function gitShortHash(cwd = process.cwd()) {
|
|
17
|
+
try {
|
|
18
|
+
return (execFileSync('git', ['rev-parse', '--short', 'HEAD'], {
|
|
19
|
+
cwd,
|
|
20
|
+
encoding: 'utf8',
|
|
21
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
22
|
+
}).trim() || undefined);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Fill a template. Throws when a token has no value or the result is not a valid Maven identifier. */
|
|
29
|
+
export function renderTemplate(template, vars) {
|
|
30
|
+
const value = template.replace(TOKEN, (_, token) => {
|
|
31
|
+
const replacement = vars[token];
|
|
32
|
+
if (!replacement)
|
|
33
|
+
throw new Error(`Naming template "${template}" uses {${token}}, which has no value here`);
|
|
34
|
+
return replacement;
|
|
35
|
+
});
|
|
36
|
+
if (!VALID_ID.test(value))
|
|
37
|
+
throw new Error(`Naming template "${template}" produced an invalid identifier "${value}"`);
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
const SEMVER = /\d+\.\d+\.\d+(?:-[A-Za-z0-9.]+)?/;
|
|
41
|
+
const STAMP = /(?<!\d)\d{14}(?!\d)/;
|
|
42
|
+
/**
|
|
43
|
+
* Infer a convention from the asset the app currently runs. For example an app "orders-sapi"
|
|
44
|
+
* running "orders-sapi-1.4.0-20260101120000" at version 1.0.0 implies
|
|
45
|
+
* "{app}-{pomVersion}-{timestamp}" at a fixed "1.0.0".
|
|
46
|
+
*/
|
|
47
|
+
export function inferConvention(app, ref) {
|
|
48
|
+
const id = ref.artifactId;
|
|
49
|
+
if (!id.toLowerCase().startsWith(app.toLowerCase()))
|
|
50
|
+
return undefined;
|
|
51
|
+
let rest = id.slice(app.length);
|
|
52
|
+
const hasStamp = STAMP.test(rest);
|
|
53
|
+
rest = rest.replace(STAMP, '{timestamp}');
|
|
54
|
+
const hasVersion = SEMVER.test(rest);
|
|
55
|
+
rest = rest.replace(SEMVER, '{pomVersion}');
|
|
56
|
+
if (!hasStamp && !hasVersion)
|
|
57
|
+
return rest === '' ? { assetId: '{app}', assetVersion: '{pomVersion}' } : undefined;
|
|
58
|
+
if (/\d/.test(rest.replace(/\{\w+\}/g, '')))
|
|
59
|
+
return undefined;
|
|
60
|
+
return {
|
|
61
|
+
assetId: `{app}${rest}`,
|
|
62
|
+
// A timestamped asset ID usually pairs with a fixed version; otherwise the version follows the pom.
|
|
63
|
+
assetVersion: hasStamp ? ref.version : '{pomVersion}',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Pick the Exchange coordinates and report which rule chose each one. */
|
|
67
|
+
export function suggestAssetCoordinates(input) {
|
|
68
|
+
const vars = {
|
|
69
|
+
app: input.app,
|
|
70
|
+
artifactId: input.jar?.artifactId,
|
|
71
|
+
pomVersion: input.jar?.version,
|
|
72
|
+
timestamp: namingTimestamp(input.now),
|
|
73
|
+
gitShort: input.gitShort,
|
|
74
|
+
};
|
|
75
|
+
const detected = input.existingRef ? inferConvention(input.app, input.existingRef) : undefined;
|
|
76
|
+
const inferred = input.applyInferred ? detected : undefined;
|
|
77
|
+
const render = (value) => (value.includes('{') ? renderTemplate(value, vars) : value);
|
|
78
|
+
const pick = (explicit, convention, inferredValue, jarValue, field) => {
|
|
79
|
+
if (explicit)
|
|
80
|
+
return { value: explicit, rule: 'explicit' };
|
|
81
|
+
if (convention)
|
|
82
|
+
return { value: render(convention), rule: 'convention' };
|
|
83
|
+
if (inferredValue) {
|
|
84
|
+
try {
|
|
85
|
+
return { value: render(inferredValue), rule: 'inferred' };
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// The inferred pattern needs a value this JAR lacks; fall through to the JAR identity.
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (jarValue)
|
|
92
|
+
return { value: jarValue, rule: 'jar' };
|
|
93
|
+
throw new Error(`Cannot determine the asset ${field}; pass it explicitly or set a naming convention`);
|
|
94
|
+
};
|
|
95
|
+
const assetId = pick(input.explicit?.assetId, input.convention?.assetId, inferred?.assetId, input.jar?.artifactId, 'ID');
|
|
96
|
+
const version = pick(input.explicit?.assetVersion, input.convention?.assetVersion, inferred?.assetVersion, input.jar?.version, 'version');
|
|
97
|
+
const groupId = input.explicit?.groupId
|
|
98
|
+
? { value: input.explicit.groupId, rule: 'explicit' }
|
|
99
|
+
: input.convention?.groupId
|
|
100
|
+
? { value: input.convention.groupId, rule: 'convention' }
|
|
101
|
+
: { value: input.orgId, rule: 'organization' };
|
|
102
|
+
const usedConvention = assetId.rule === 'convention' || version.rule === 'convention'
|
|
103
|
+
? input.convention
|
|
104
|
+
: assetId.rule === 'inferred' || version.rule === 'inferred'
|
|
105
|
+
? inferred
|
|
106
|
+
: undefined;
|
|
107
|
+
return {
|
|
108
|
+
groupId: groupId.value,
|
|
109
|
+
assetId: assetId.value,
|
|
110
|
+
version: version.value,
|
|
111
|
+
rules: { groupId: groupId.rule, assetId: assetId.rule, version: version.rule },
|
|
112
|
+
...(usedConvention ? { convention: usedConvention } : {}),
|
|
113
|
+
...(detected && !input.applyInferred ? { deployedPattern: detected } : {}),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=asset-naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-naming.js","sourceRoot":"","sources":["../../src/workflows/asset-naming.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiClD,MAAM,KAAK,GAAG,qDAAqD,CAAC;AACpE,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AAEjD,uCAAuC;AACvC,MAAM,UAAU,eAAe,CAAC,OAAa,IAAI,IAAI,EAAE;IACnD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACpD,IAAI,CAAC;QACD,OAAO,CACH,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE;YAClD,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACtC,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CACzB,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,IAAqB;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,KAA4B,EAAE,EAAE;QACtE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,WAAW,KAAK,4BAA4B,CAAC,CAAC;QAC5G,OAAO,WAAW,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,qCAAqC,KAAK,GAAG,CAAC,CAAC;IAC/F,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,MAAM,GAAG,kCAAkC,CAAC;AAClD,MAAM,KAAK,GAAG,qBAAqB,CAAC;AAEpC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,GAAgB;IACzD,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;IAC1B,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,IAAI,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAClH,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO;QACH,OAAO,EAAE,QAAQ,IAAI,EAAE;QACvB,oGAAoG;QACpG,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc;KACxD,CAAC;AACN,CAAC;AAkBD,0EAA0E;AAC1E,MAAM,UAAU,uBAAuB,CAAC,KAAmB;IACvD,MAAM,IAAI,GAAoB;QAC1B,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,UAAU;QACjC,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO;QAC9B,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC;QACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ;KAC3B,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAE9F,MAAM,IAAI,GAAG,CACT,QAA4B,EAC5B,UAA8B,EAC9B,aAAiC,EACjC,QAA4B,EAC5B,KAAa,EACsB,EAAE;QACrC,IAAI,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC3D,IAAI,UAAU;YAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QACzE,IAAI,aAAa,EAAE,CAAC;YAChB,IAAI,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACL,uFAAuF;YAC3F,CAAC;QACL,CAAC;QACD,IAAI,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,iDAAiD,CAAC,CAAC;IAC1G,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAChB,KAAK,CAAC,QAAQ,EAAE,OAAO,EACvB,KAAK,CAAC,UAAU,EAAE,OAAO,EACzB,QAAQ,EAAE,OAAO,EACjB,KAAK,CAAC,GAAG,EAAE,UAAU,EACrB,IAAI,CACP,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAChB,KAAK,CAAC,QAAQ,EAAE,YAAY,EAC5B,KAAK,CAAC,UAAU,EAAE,YAAY,EAC9B,QAAQ,EAAE,YAAY,EACtB,KAAK,CAAC,GAAG,EAAE,OAAO,EAClB,SAAS,CACZ,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,OAAO;QACnC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,UAAmB,EAAE;QAC9D,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO;YACzB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,YAAqB,EAAE;YAClE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,cAAuB,EAAE,CAAC;IAE9D,MAAM,cAAc,GAChB,OAAO,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY;QAC1D,CAAC,CAAC,KAAK,CAAC,UAAU;QAClB,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU;YAC1D,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,SAAS,CAAC;IAEtB,OAAO;QACH,OAAO,EAAE,OAAO,CAAC,KAAK;QACtB,OAAO,EAAE,OAAO,CAAC,KAAK;QACtB,OAAO,EAAE,OAAO,CAAC,KAAK;QACtB,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;QAC9E,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7E,CAAC;AACN,CAAC"}
|