@pipeline-builder/pipeline-core 4.4.11 → 4.4.13
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/lib/config/config-types.d.ts +0 -36
- package/lib/config/config-types.js +1 -1
- package/lib/config/infrastructure-config.js +1 -3
- package/lib/core/pipeline-helpers.d.ts +23 -3
- package/lib/core/pipeline-helpers.js +63 -132
- package/lib/core/plugin-lookup-envelope.d.ts +36 -1
- package/lib/core/plugin-lookup-envelope.js +58 -3
- package/lib/core/self-mutation.d.ts +31 -0
- package/lib/core/self-mutation.js +36 -0
- package/lib/core/step-manifest.d.ts +35 -0
- package/lib/core/step-manifest.js +8 -2
- package/lib/handlers/bundle/index.mjs +22 -22
- package/lib/index.d.ts +2 -1
- package/lib/index.js +3 -2
- package/lib/pipeline/pipeline-builder.d.ts +19 -0
- package/lib/pipeline/pipeline-builder.js +79 -22
- package/lib/pipeline/plugin-lookup.d.ts +5 -9
- package/lib/pipeline/plugin-lookup.js +8 -12
- package/lib/pipeline/stage-builder.d.ts +4 -1
- package/lib/pipeline/stage-builder.js +4 -1
- package/lib/pipeline/step-manifest-recorder.d.ts +10 -1
- package/lib/pipeline/step-manifest-recorder.js +30 -3
- package/lib/pipeline/step-types.d.ts +9 -1
- package/lib/pipeline/step-types.js +1 -1
- package/lib/testing/exports.json +9 -0
- package/package.json +3 -3
|
@@ -1,13 +1,67 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// The dependency-free plugin-catalog subpath only: the plugin-lookup Lambda
|
|
4
|
+
// bundles this module, so it must not pull in the api-core root.
|
|
5
|
+
import { TOOLCHAIN_METADATA_PREFIX, TOOLCHAIN_RESOLVED_VIA } from '@pipeline-builder/api-core/plugin-catalog';
|
|
3
6
|
/** Severities, least to most serious. */
|
|
4
7
|
export const LOOKUP_WARNING_SEVERITIES = ['info', 'warning', 'error', 'critical'];
|
|
8
|
+
/** Every tool field, keyed so a field added to api-core's `PluginToolchainSchema` fails to compile here until listed. */
|
|
9
|
+
const TOOLCHAIN_VERSION_FIELDS = {
|
|
10
|
+
pipelineManager: true, awsCdk: true, cdkAssets: true, esbuild: true, pnpm: true, node: true,
|
|
11
|
+
};
|
|
12
|
+
const TOOLCHAIN_VERSION_KEYS = Object.keys(TOOLCHAIN_VERSION_FIELDS);
|
|
13
|
+
/** Pick the string tool versions off an object (unknown keys and non-strings ignored). */
|
|
14
|
+
function pickVersions(raw) {
|
|
15
|
+
if (!raw || typeof raw !== 'object')
|
|
16
|
+
return {};
|
|
17
|
+
const out = {};
|
|
18
|
+
for (const key of TOOLCHAIN_VERSION_KEYS) {
|
|
19
|
+
const v = raw[key];
|
|
20
|
+
if (typeof v === 'string' && v.length > 0)
|
|
21
|
+
out[key] = v;
|
|
22
|
+
}
|
|
23
|
+
return out;
|
|
24
|
+
}
|
|
25
|
+
/** The tool versions a plugin row's `metadata` carries as flat `toolchain.<field>` keys. */
|
|
26
|
+
function versionsFromMetadata(metadata) {
|
|
27
|
+
if (!metadata || typeof metadata !== 'object')
|
|
28
|
+
return {};
|
|
29
|
+
const fields = {};
|
|
30
|
+
for (const [k, v] of Object.entries(metadata)) {
|
|
31
|
+
if (k.startsWith(TOOLCHAIN_METADATA_PREFIX))
|
|
32
|
+
fields[k.slice(TOOLCHAIN_METADATA_PREFIX.length)] = v;
|
|
33
|
+
}
|
|
34
|
+
return pickVersions(fields);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parse a lookup's `toolchain` block. Null unless it carries a release version
|
|
38
|
+
* and a known `resolvedVia`. Tool versions come from, lowest precedence first:
|
|
39
|
+
* the plugin row's `metadata` (`toolchain.<field>` keys, where the platform
|
|
40
|
+
* persists the bootstrap spec's `toolchain`), the record's own `toolchain`,
|
|
41
|
+
* the block's flat fields, then `toolchain.versions`.
|
|
42
|
+
*/
|
|
43
|
+
export function parseLookupToolchain(raw, plugin) {
|
|
44
|
+
if (!raw || typeof raw !== 'object')
|
|
45
|
+
return null;
|
|
46
|
+
const { releaseVersion, resolvedVia, versions } = raw;
|
|
47
|
+
if (typeof releaseVersion !== 'string' || releaseVersion.length === 0)
|
|
48
|
+
return null;
|
|
49
|
+
if (!TOOLCHAIN_RESOLVED_VIA.includes(resolvedVia))
|
|
50
|
+
return null;
|
|
51
|
+
const rec = plugin && typeof plugin === 'object' ? plugin : undefined;
|
|
52
|
+
return {
|
|
53
|
+
releaseVersion,
|
|
54
|
+
resolvedVia: resolvedVia,
|
|
55
|
+
versions: { ...versionsFromMetadata(rec?.metadata), ...pickVersions(rec?.toolchain), ...pickVersions(raw), ...pickVersions(versions) },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
5
58
|
/**
|
|
6
59
|
* Unwrap a `/plugins/lookup` answer. The platform's success envelope is
|
|
7
60
|
* `{ success, statusCode, data: { plugin, warnings } }` (note the double
|
|
8
61
|
* nesting: `data.plugin`); `{ data: Plugin }`, `{ plugin }` and a bare Plugin
|
|
9
62
|
* are tolerated too. Returns the plugin (null when absent or nameless) and the
|
|
10
|
-
* graded warnings (lifecycle, vulnerability, compliance) that ride beside it
|
|
63
|
+
* graded warnings (lifecycle, vulnerability, compliance) that ride beside it,
|
|
64
|
+
* and — for a managed toolchain name — the release it resolved to (`toolchain`).
|
|
11
65
|
*
|
|
12
66
|
* Dependency-free (type-only imports) so the plugin-lookup Lambda can bundle it.
|
|
13
67
|
*/
|
|
@@ -36,7 +90,8 @@ export function unwrapLookup(body) {
|
|
|
36
90
|
});
|
|
37
91
|
}
|
|
38
92
|
}
|
|
39
|
-
|
|
93
|
+
const toolchain = parseLookupToolchain(container.toolchain, plugin);
|
|
94
|
+
return { plugin, warnings, ...(toolchain && { toolchain }) };
|
|
40
95
|
}
|
|
41
96
|
/**
|
|
42
97
|
* One line summarizing graded warnings, most serious first —
|
|
@@ -77,4 +132,4 @@ export function exactPinNotFoundMessage(label, pin, state) {
|
|
|
77
132
|
default: return `Plugin "${label}" version ${pin} does not exist (never published, or refused by its build's vulnerability scan)`;
|
|
78
133
|
}
|
|
79
134
|
}
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBT3RDLHlDQUF5QztBQUN6QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBcUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQVVwSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBYTtJQUN4QyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDN0UsTUFBTSxLQUFLLEdBQUksSUFBMkIsQ0FBQyxJQUFJLENBQUM7SUFDaEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBNkMsQ0FBQztJQUNsSCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxTQUFTLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQVEsU0FBZ0MsQ0FBQyxJQUFJLEtBQUssUUFBUTtXQUNqSCxTQUE4QixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNsRCxDQUFDLENBQUMsU0FBbUI7UUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNULE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7SUFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3RDLEtBQUssTUFBTSxDQUFDLElBQUksU0FB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QUFFLEtBQWlDO0lBQ25HLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLFNBQVMsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcscUNBQXFDLENBQUM7UUFDN0YsS0FBSyxVQUFVLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLGNBQWMsQ0FBQztRQUN2RSxLQUFLLFFBQVEsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3BFLEtBQUssU0FBUyxFQUFFLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztRQUN6RSxTQUFTLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpRkFBaUYsQ0FBQztJQUNwSSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuXG4vKiogSG93IHNlcmlvdXMgYSBsb29rdXAgd2FybmluZyBpcyAodnVsbmVyYWJpbGl0eSBzdGF0ZSBpcyBncmFkZWQsIG5ldmVyIHJlZnVzZWQpLiAqL1xuZXhwb3J0IHR5cGUgTG9va3VwV2FybmluZ1NldmVyaXR5ID0gJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdjcml0aWNhbCc7XG5cbi8qKiBTZXZlcml0aWVzLCBsZWFzdCB0byBtb3N0IHNlcmlvdXMuICovXG5leHBvcnQgY29uc3QgTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUzogcmVhZG9ubHkgTG9va3VwV2FybmluZ1NldmVyaXR5W10gPSBbJ2luZm8nLCAnd2FybmluZycsICdlcnJvcicsICdjcml0aWNhbCddO1xuXG4vKiogT25lIHdhcm5pbmcgcmlkaW5nIGJlc2lkZSBhIHJlc29sdmVkIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwV2FybmluZyB7XG4gIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIEFic2VudCBvbiB0aGUgd2lyZSDihpIgYHdhcm5pbmdgLiAqL1xuICByZWFkb25seSBzZXZlcml0eTogTG9va3VwV2FybmluZ1NldmVyaXR5O1xufVxuXG4vKipcbiAqIFVud3JhcCBhIGAvcGx1Z2lucy9sb29rdXBgIGFuc3dlci4gVGhlIHBsYXRmb3JtJ3Mgc3VjY2VzcyBlbnZlbG9wZSBpc1xuICogYHsgc3VjY2Vzcywgc3RhdHVzQ29kZSwgZGF0YTogeyBwbHVnaW4sIHdhcm5pbmdzIH0gfWAgKG5vdGUgdGhlIGRvdWJsZVxuICogbmVzdGluZzogYGRhdGEucGx1Z2luYCk7IGB7IGRhdGE6IFBsdWdpbiB9YCwgYHsgcGx1Z2luIH1gIGFuZCBhIGJhcmUgUGx1Z2luXG4gKiBhcmUgdG9sZXJhdGVkIHRvby4gUmV0dXJucyB0aGUgcGx1Z2luIChudWxsIHdoZW4gYWJzZW50IG9yIG5hbWVsZXNzKSBhbmQgdGhlXG4gKiBncmFkZWQgd2FybmluZ3MgKGxpZmVjeWNsZSwgdnVsbmVyYWJpbGl0eSwgY29tcGxpYW5jZSkgdGhhdCByaWRlIGJlc2lkZSBpdC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgKHR5cGUtb25seSBpbXBvcnRzKSBzbyB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEgY2FuIGJ1bmRsZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcExvb2t1cChib2R5OiB1bmtub3duKTogeyBwbHVnaW46IFBsdWdpbiB8IG51bGw7IHdhcm5pbmdzOiBMb29rdXBXYXJuaW5nW10gfSB7XG4gIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gJ29iamVjdCcpIHJldHVybiB7IHBsdWdpbjogbnVsbCwgd2FybmluZ3M6IFtdIH07XG4gIGNvbnN0IGlubmVyID0gKGJvZHkgYXMgeyBkYXRhPzogdW5rbm93biB9KS5kYXRhO1xuICBjb25zdCBjb250YWluZXIgPSAoaW5uZXIgJiYgdHlwZW9mIGlubmVyID09PSAnb2JqZWN0JyA/IGlubmVyIDogYm9keSkgYXMgeyBwbHVnaW4/OiB1bmtub3duOyB3YXJuaW5ncz86IHVua25vd24gfTtcbiAgY29uc3QgY2FuZGlkYXRlID0gY29udGFpbmVyLnBsdWdpbiA/PyBjb250YWluZXI7XG4gIGNvbnN0IHBsdWdpbiA9IGNhbmRpZGF0ZSAmJiB0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGNhbmRpZGF0ZSBhcyB7IG5hbWU/OiB1bmtub3duIH0pLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgJiYgKGNhbmRpZGF0ZSBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lLmxlbmd0aCA+IDBcbiAgICA/IGNhbmRpZGF0ZSBhcyBQbHVnaW5cbiAgICA6IG51bGw7XG4gIGNvbnN0IHdhcm5pbmdzOiBMb29rdXBXYXJuaW5nW10gPSBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyLndhcm5pbmdzKSkge1xuICAgIGZvciAoY29uc3QgdyBvZiBjb250YWluZXIud2FybmluZ3MpIHtcbiAgICAgIGlmICghdyB8fCB0eXBlb2YgdyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyBjb2RlLCBtZXNzYWdlLCBzZXZlcml0eSB9ID0gdyBhcyB7IGNvZGU/OiB1bmtub3duOyBtZXNzYWdlPzogdW5rbm93bjsgc2V2ZXJpdHk/OiB1bmtub3duIH07XG4gICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8IG1lc3NhZ2UubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAuLi4odHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnID8geyBjb2RlIH0gOiB7fSksXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHNldmVyaXR5OiAoTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUyBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHNldmVyaXR5KSA/IHNldmVyaXR5IGFzIExvb2t1cFdhcm5pbmdTZXZlcml0eSA6ICd3YXJuaW5nJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBwbHVnaW4sIHdhcm5pbmdzIH07XG59XG5cbi8qKlxuICogT25lIGxpbmUgc3VtbWFyaXppbmcgZ3JhZGVkIHdhcm5pbmdzLCBtb3N0IHNlcmlvdXMgZmlyc3Qg4oCUXG4gKiBgMyBwbHVnaW4gd2FybmluZ3M6IDEgY3JpdGljYWwsIDIgZXJyb3JgLiBOdWxsIHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyh3YXJuaW5nczogcmVhZG9ubHkgUGljazxMb29rdXBXYXJuaW5nLCAnc2V2ZXJpdHknPltdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCBwYXJ0cyA9IFsuLi5MT09LVVBfV0FSTklOR19TRVZFUklUSUVTXS5yZXZlcnNlKClcbiAgICAubWFwKChzZXYpID0+IFtzZXYsIHdhcm5pbmdzLmZpbHRlcigodykgPT4gdy5zZXZlcml0eSA9PT0gc2V2KS5sZW5ndGhdIGFzIGNvbnN0KVxuICAgIC5maWx0ZXIoKFssIG5dKSA9PiBuID4gMClcbiAgICAubWFwKChbc2V2LCBuXSkgPT4gYCR7bn0gJHtzZXZ9YCk7XG4gIHJldHVybiBgJHt3YXJuaW5ncy5sZW5ndGh9IHBsdWdpbiB3YXJuaW5nJHt3YXJuaW5ncy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ306ICR7cGFydHMuam9pbignLCAnKX1gO1xufVxuXG4vKiogV2h5IGEgbG9va3VwIGZvdW5kIG5vdGhpbmcsIGFzIHRoZSBwbHVnaW4gc2VydmljZSdzIDQwNCBgZGV0YWlscy5zdGF0ZWAgcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCB0eXBlIExvb2t1cE5vdEZvdW5kU3RhdGUgPSAnZGVsZXRlZCcgfCAnaW5hY3RpdmUnIHwgJ3lhbmtlZCcgfCAnbWlzc2luZyc7XG5cbmNvbnN0IE5PVF9GT1VORF9TVEFURVM6IHJlYWRvbmx5IExvb2t1cE5vdEZvdW5kU3RhdGVbXSA9IFsnZGVsZXRlZCcsICdpbmFjdGl2ZScsICd5YW5rZWQnLCAnbWlzc2luZyddO1xuXG4vKipcbiAqIGBkZXRhaWxzLnN0YXRlYCBvZiBhIHJlZnVzZWQgbG9va3VwLCByZWFkIG9mZiBlaXRoZXIgYW4gYXhpb3Mtc3R5bGUgZXJyb3JcbiAqIChgZXJyLnJlc3BvbnNlLmRhdGFgKSBvciB0aGUgcmVzcG9uc2UgYm9keSBpdHNlbGYuIE51bGwgd2hlbiBhYnNlbnQvdW5rbm93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cE5vdEZvdW5kU3RhdGUoZXJyT3JCb2R5OiB1bmtub3duKTogTG9va3VwTm90Rm91bmRTdGF0ZSB8IG51bGwge1xuICBpZiAoIWVyck9yQm9keSB8fCB0eXBlb2YgZXJyT3JCb2R5ICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGRhdGEgPSAoZXJyT3JCb2R5IGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSkucmVzcG9uc2U/LmRhdGEgPz8gZXJyT3JCb2R5O1xuICBjb25zdCBkZXRhaWxzID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IGRldGFpbHM/OiB1bmtub3duIH0pLmRldGFpbHMgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlscyAmJiB0eXBlb2YgZGV0YWlscyA9PT0gJ29iamVjdCcgPyAoZGV0YWlscyBhcyB7IHN0YXRlPzogdW5rbm93biB9KS5zdGF0ZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgJiYgKE5PVF9GT1VORF9TVEFURVMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHN0YXRlKSA/IHN0YXRlIGFzIExvb2t1cE5vdEZvdW5kU3RhdGUgOiBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBtZXNzYWdlIGZvciBhbiBleGFjdCB2ZXJzaW9uIHBpbiB0aGF0IGRpZCBub3QgcmVzb2x2ZS4gU2hhcmVkIGJ5IHRoZVxuICogQ0xJJ3MgcHJlLXJlc29sdXRpb24gYW5kIHRoZSBkZXBsb3ktdGltZSBMYW1iZGEncyBDbG91ZEZvcm1hdGlvbiByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbDogc3RyaW5nLCBwaW46IHN0cmluZywgc3RhdGU6IExvb2t1cE5vdEZvdW5kU3RhdGUgfCBudWxsKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0ZSkge1xuICAgIGNhc2UgJ2RlbGV0ZWQnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gd2FzIGRlbGV0ZWQgZnJvbSB5b3VyIG9yZ2FuaXphdGlvbmA7XG4gICAgY2FzZSAnaW5hY3RpdmUnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gaXMgaW5hY3RpdmVgO1xuICAgIGNhc2UgJ3lhbmtlZCc6IHJldHVybiBgUGx1Z2luIFwiJHtsYWJlbH1cIiB2ZXJzaW9uICR7cGlufSB3YXMgeWFua2VkYDtcbiAgICBjYXNlICdtaXNzaW5nJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGRvZXMgbm90IGV4aXN0YDtcbiAgICBkZWZhdWx0OiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gZG9lcyBub3QgZXhpc3QgKG5ldmVyIHB1Ymxpc2hlZCwgb3IgcmVmdXNlZCBieSBpdHMgYnVpbGQncyB2dWxuZXJhYmlsaXR5IHNjYW4pYDtcbiAgfVxufVxuIl19
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLDRFQUE0RTtBQUM1RSxpRUFBaUU7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUE2QixNQUFNLDJDQUEyQyxDQUFDO0FBT3pJLHlDQUF5QztBQUN6QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBcUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQWFwSCx5SEFBeUg7QUFDekgsTUFBTSx3QkFBd0IsR0FBd0M7SUFDcEUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO0NBQzVGLENBQUM7QUFDRixNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQThCLENBQUM7QUF5QmxHLDBGQUEwRjtBQUMxRixTQUFTLFlBQVksQ0FBQyxHQUFZO0lBQ2hDLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7SUFDdkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFJLEdBQStCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRCxDQUFD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QztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEtBQWlDO0lBQ25HLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLFNBQVMsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcscUNBQXFDLENBQUM7UUFDN0YsS0FBSyxVQUFVLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLGNBQWMsQ0FBQztRQUN2RSxLQUFLLFFBQVEsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3BFLEtBQUssU0FBUyxFQUFFLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztRQUN6RSxTQUFTLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpRkFBaUYsQ0FBQztJQUNwSSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vLyBUaGUgZGVwZW5kZW5jeS1mcmVlIHBsdWdpbi1jYXRhbG9nIHN1YnBhdGggb25seTogdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhXG4vLyBidW5kbGVzIHRoaXMgbW9kdWxlLCBzbyBpdCBtdXN0IG5vdCBwdWxsIGluIHRoZSBhcGktY29yZSByb290LlxuaW1wb3J0IHsgVE9PTENIQUlOX01FVEFEQVRBX1BSRUZJWCwgVE9PTENIQUlOX1JFU09MVkVEX1ZJQSwgdHlwZSBUb29sY2hhaW5SZXNvbHZlZFZpYSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3BsdWdpbi1jYXRhbG9nJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luVG9vbGNoYWluIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhJztcblxuLyoqIEhvdyBzZXJpb3VzIGEgbG9va3VwIHdhcm5pbmcgaXMgKHZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgZ3JhZGVkLCBuZXZlciByZWZ1c2VkKS4gKi9cbmV4cG9ydCB0eXBlIExvb2t1cFdhcm5pbmdTZXZlcml0eSA9ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdlcnJvcicgfCAnY3JpdGljYWwnO1xuXG4vKiogU2V2ZXJpdGllcywgbGVhc3QgdG8gbW9zdCBzZXJpb3VzLiAqL1xuZXhwb3J0IGNvbnN0IExPT0tVUF9XQVJOSU5HX1NFVkVSSVRJRVM6IHJlYWRvbmx5IExvb2t1cFdhcm5pbmdTZXZlcml0eVtdID0gWydpbmZvJywgJ3dhcm5pbmcnLCAnZXJyb3InLCAnY3JpdGljYWwnXTtcblxuLyoqIE9uZSB3YXJuaW5nIHJpZGluZyBiZXNpZGUgYSByZXNvbHZlZCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cFdhcm5pbmcge1xuICByZWFkb25seSBjb2RlPzogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBBYnNlbnQgb24gdGhlIHdpcmUg4oaSIGB3YXJuaW5nYC4gKi9cbiAgcmVhZG9ubHkgc2V2ZXJpdHk6IExvb2t1cFdhcm5pbmdTZXZlcml0eTtcbn1cblxuLyoqIFRoZSBleGFjdCB0b29sIHZlcnNpb25zIGEgdG9vbGNoYWluIHJlbGVhc2UgY2FycmllcyAodGhlIGJvb3RzdHJhcCBzcGVjJ3MgYHRvb2xjaGFpbmApLCBhcyBmYXIgYXMgYW4gYW5zd2VyIGNhcnJpZXMgdGhlbS4gKi9cbmV4cG9ydCB0eXBlIFRvb2xjaGFpblZlcnNpb25zID0gUGFydGlhbDxSZWFkb25seTxQbHVnaW5Ub29sY2hhaW4+PjtcblxuLyoqIEV2ZXJ5IHRvb2wgZmllbGQsIGtleWVkIHNvIGEgZmllbGQgYWRkZWQgdG8gYXBpLWNvcmUncyBgUGx1Z2luVG9vbGNoYWluU2NoZW1hYCBmYWlscyB0byBjb21waWxlIGhlcmUgdW50aWwgbGlzdGVkLiAqL1xuY29uc3QgVE9PTENIQUlOX1ZFUlNJT05fRklFTERTOiBSZWNvcmQ8a2V5b2YgUGx1Z2luVG9vbGNoYWluLCB0cnVlPiA9IHtcbiAgcGlwZWxpbmVNYW5hZ2VyOiB0cnVlLCBhd3NDZGs6IHRydWUsIGNka0Fzc2V0czogdHJ1ZSwgZXNidWlsZDogdHJ1ZSwgcG5wbTogdHJ1ZSwgbm9kZTogdHJ1ZSxcbn07XG5jb25zdCBUT09MQ0hBSU5fVkVSU0lPTl9LRVlTID0gT2JqZWN0LmtleXMoVE9PTENIQUlOX1ZFUlNJT05fRklFTERTKSBhcyAoa2V5b2YgUGx1Z2luVG9vbGNoYWluKVtdO1xuXG4vKipcbiAqIFRoZSByZWxlYXNlIGEgbWFuYWdlZC1uYW1lIGxvb2t1cCAoYHBpcGVsaW5lLWJvb3RzdHJhcGAsIGBjZGstc3ludGhgKVxuICogcmVzb2x2ZWQgdG86IGBkYXRhLnRvb2xjaGFpbmAgb2YgdGhlIGAvcGx1Z2lucy9sb29rdXBgIGFuc3dlci4gYHZlcnNpb25zYFxuICogaG9sZHMgdGhlIHRvb2wgdmVyc2lvbnMgd2hlbiB0aGUgYW5zd2VyIChvciB0aGUgcGx1Z2luIHJlY29yZCkgY2FycmllcyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cFRvb2xjaGFpbiB7XG4gIHJlYWRvbmx5IHJlbGVhc2VWZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc29sdmVkVmlhOiBUb29sY2hhaW5SZXNvbHZlZFZpYTtcbiAgcmVhZG9ubHkgdmVyc2lvbnM6IFRvb2xjaGFpblZlcnNpb25zO1xufVxuXG4vKipcbiAqIFRoZSByZXNvbHZlZCBgcGlwZWxpbmUtYm9vdHN0cmFwYCBoYWxmIG9mIGEgdG9vbGNoYWluIHJlbGVhc2U6IHRoZSBwbHVnaW5cbiAqIHJlY29yZCB0aGUgZGVmYXVsdCBDb2RlQnVpbGQgaW1hZ2UgaXMgcGlubmVkIHRvIChieSBpdHMgc2lnbmVkIGRpZ2VzdCkgYW5kXG4gKiB0aGUgcmVsZWFzZSBpdCBjYW1lIGZyb20uIFByb2R1Y2VkIGJ5IGBwaXBlbGluZS1tYW5hZ2VyYCdzXG4gKiBgcmVzb2x2ZUJvb3RzdHJhcEltYWdlYCAob3IgYSBgLS10b29sY2hhaW4tZmlsZWApIGFuZCBwYXNzZWQgdG9cbiAqIGBQaXBlbGluZUJ1aWxkZXJgIGFzIGByZXNvbHZlZEJvb3RzdHJhcGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRCb290c3RyYXAge1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcbiAgcmVhZG9ubHkgdG9vbGNoYWluOiBMb29rdXBUb29sY2hhaW47XG59XG5cbi8qKiBQaWNrIHRoZSBzdHJpbmcgdG9vbCB2ZXJzaW9ucyBvZmYgYW4gb2JqZWN0ICh1bmtub3duIGtleXMgYW5kIG5vbi1zdHJpbmdzIGlnbm9yZWQpLiAqL1xuZnVuY3Rpb24gcGlja1ZlcnNpb25zKHJhdzogdW5rbm93bik6IFRvb2xjaGFpblZlcnNpb25zIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybiB7fTtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFRPT0xDSEFJTl9WRVJTSU9OX0tFWVMpIHtcbiAgICBjb25zdCB2ID0gKHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCkgb3V0W2tleV0gPSB2O1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgdG9vbCB2ZXJzaW9ucyBhIHBsdWdpbiByb3cncyBgbWV0YWRhdGFgIGNhcnJpZXMgYXMgZmxhdCBgdG9vbGNoYWluLjxmaWVsZD5gIGtleXMuICovXG5mdW5jdGlvbiB2ZXJzaW9uc0Zyb21NZXRhZGF0YShtZXRhZGF0YTogdW5rbm93bik6IFRvb2xjaGFpblZlcnNpb25zIHtcbiAgaWYgKCFtZXRhZGF0YSB8fCB0eXBlb2YgbWV0YWRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4ge307XG4gIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgaWYgKGsuc3RhcnRzV2l0aChUT09MQ0hBSU5fTUVUQURBVEFfUFJFRklYKSkgZmllbGRzW2suc2xpY2UoVE9PTENIQUlOX01FVEFEQVRBX1BSRUZJWC5sZW5ndGgpXSA9IHY7XG4gIH1cbiAgcmV0dXJuIHBpY2tWZXJzaW9ucyhmaWVsZHMpO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgbG9va3VwJ3MgYHRvb2xjaGFpbmAgYmxvY2suIE51bGwgdW5sZXNzIGl0IGNhcnJpZXMgYSByZWxlYXNlIHZlcnNpb25cbiAqIGFuZCBhIGtub3duIGByZXNvbHZlZFZpYWAuIFRvb2wgdmVyc2lvbnMgY29tZSBmcm9tLCBsb3dlc3QgcHJlY2VkZW5jZSBmaXJzdDpcbiAqIHRoZSBwbHVnaW4gcm93J3MgYG1ldGFkYXRhYCAoYHRvb2xjaGFpbi48ZmllbGQ+YCBrZXlzLCB3aGVyZSB0aGUgcGxhdGZvcm1cbiAqIHBlcnNpc3RzIHRoZSBib290c3RyYXAgc3BlYydzIGB0b29sY2hhaW5gKSwgdGhlIHJlY29yZCdzIG93biBgdG9vbGNoYWluYCxcbiAqIHRoZSBibG9jaydzIGZsYXQgZmllbGRzLCB0aGVuIGB0b29sY2hhaW4udmVyc2lvbnNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMb29rdXBUb29sY2hhaW4ocmF3OiB1bmtub3duLCBwbHVnaW4/OiB1bmtub3duKTogTG9va3VwVG9vbGNoYWluIHwgbnVsbCB7XG4gIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgeyByZWxlYXNlVmVyc2lvbiwgcmVzb2x2ZWRWaWEsIHZlcnNpb25zIH0gPSByYXcgYXMgeyByZWxlYXNlVmVyc2lvbj86IHVua25vd247IHJlc29sdmVkVmlhPzogdW5rbm93bjsgdmVyc2lvbnM/OiB1bmtub3duIH07XG4gIGlmICh0eXBlb2YgcmVsZWFzZVZlcnNpb24gIT09ICdzdHJpbmcnIHx8IHJlbGVhc2VWZXJzaW9uLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGlmICghKFRPT0xDSEFJTl9SRVNPTFZFRF9WSUEgYXMgcmVhZG9ubHkgdW5rbm93bltdKS5pbmNsdWRlcyhyZXNvbHZlZFZpYSkpIHJldHVybiBudWxsO1xuICBjb25zdCByZWMgPSBwbHVnaW4gJiYgdHlwZW9mIHBsdWdpbiA9PT0gJ29iamVjdCcgPyBwbHVnaW4gYXMgeyB0b29sY2hhaW4/OiB1bmtub3duOyBtZXRhZGF0YT86IHVua25vd24gfSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICByZWxlYXNlVmVyc2lvbixcbiAgICByZXNvbHZlZFZpYTogcmVzb2x2ZWRWaWEgYXMgVG9vbGNoYWluUmVzb2x2ZWRWaWEsXG4gICAgdmVyc2lvbnM6IHsgLi4udmVyc2lvbnNGcm9tTWV0YWRhdGEocmVjPy5tZXRhZGF0YSksIC4uLnBpY2tWZXJzaW9ucyhyZWM/LnRvb2xjaGFpbiksIC4uLnBpY2tWZXJzaW9ucyhyYXcpLCAuLi5waWNrVmVyc2lvbnModmVyc2lvbnMpIH0sXG4gIH07XG59XG5cbi8qKlxuICogVW53cmFwIGEgYC9wbHVnaW5zL2xvb2t1cGAgYW5zd2VyLiBUaGUgcGxhdGZvcm0ncyBzdWNjZXNzIGVudmVsb3BlIGlzXG4gKiBgeyBzdWNjZXNzLCBzdGF0dXNDb2RlLCBkYXRhOiB7IHBsdWdpbiwgd2FybmluZ3MgfSB9YCAobm90ZSB0aGUgZG91YmxlXG4gKiBuZXN0aW5nOiBgZGF0YS5wbHVnaW5gKTsgYHsgZGF0YTogUGx1Z2luIH1gLCBgeyBwbHVnaW4gfWAgYW5kIGEgYmFyZSBQbHVnaW5cbiAqIGFyZSB0b2xlcmF0ZWQgdG9vLiBSZXR1cm5zIHRoZSBwbHVnaW4gKG51bGwgd2hlbiBhYnNlbnQgb3IgbmFtZWxlc3MpIGFuZCB0aGVcbiAqIGdyYWRlZCB3YXJuaW5ncyAobGlmZWN5Y2xlLCB2dWxuZXJhYmlsaXR5LCBjb21wbGlhbmNlKSB0aGF0IHJpZGUgYmVzaWRlIGl0LFxuICogYW5kIOKAlCBmb3IgYSBtYW5hZ2VkIHRvb2xjaGFpbiBuYW1lIOKAlCB0aGUgcmVsZWFzZSBpdCByZXNvbHZlZCB0byAoYHRvb2xjaGFpbmApLlxuICpcbiAqIERlcGVuZGVuY3ktZnJlZSAodHlwZS1vbmx5IGltcG9ydHMpIHNvIHRoZSBwbHVnaW4tbG9va3VwIExhbWJkYSBjYW4gYnVuZGxlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwTG9va3VwKGJvZHk6IHVua25vd24pOiB7IHBsdWdpbjogUGx1Z2luIHwgbnVsbDsgd2FybmluZ3M6IExvb2t1cFdhcm5pbmdbXTsgdG9vbGNoYWluPzogTG9va3VwVG9vbGNoYWluIH0ge1xuICBpZiAoIWJvZHkgfHwgdHlwZW9mIGJvZHkgIT09ICdvYmplY3QnKSByZXR1cm4geyBwbHVnaW46IG51bGwsIHdhcm5pbmdzOiBbXSB9O1xuICBjb25zdCBpbm5lciA9IChib2R5IGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YTtcbiAgY29uc3QgY29udGFpbmVyID0gKGlubmVyICYmIHR5cGVvZiBpbm5lciA9PT0gJ29iamVjdCcgPyBpbm5lciA6IGJvZHkpIGFzIHsgcGx1Z2luPzogdW5rbm93bjsgd2FybmluZ3M/OiB1bmtub3duOyB0b29sY2hhaW4/OiB1bmtub3duIH07XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGNvbnRhaW5lci5wbHVnaW4gPz8gY29udGFpbmVyO1xuICBjb25zdCBwbHVnaW4gPSBjYW5kaWRhdGUgJiYgdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIChjYW5kaWRhdGUgYXMgeyBuYW1lPzogdW5rbm93biB9KS5uYW1lID09PSAnc3RyaW5nJ1xuICAgICYmIChjYW5kaWRhdGUgYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZS5sZW5ndGggPiAwXG4gICAgPyBjYW5kaWRhdGUgYXMgUGx1Z2luXG4gICAgOiBudWxsO1xuICBjb25zdCB3YXJuaW5nczogTG9va3VwV2FybmluZ1tdID0gW107XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lci53YXJuaW5ncykpIHtcbiAgICBmb3IgKGNvbnN0IHcgb2YgY29udGFpbmVyLndhcm5pbmdzKSB7XG4gICAgICBpZiAoIXcgfHwgdHlwZW9mIHcgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSwgc2V2ZXJpdHkgfSA9IHcgYXMgeyBjb2RlPzogdW5rbm93bjsgbWVzc2FnZT86IHVua25vd247IHNldmVyaXR5PzogdW5rbm93biB9O1xuICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJyB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgLi4uKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyA/IHsgY29kZSB9IDoge30pLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzZXZlcml0eTogKExPT0tVUF9XQVJOSU5HX1NFVkVSSVRJRVMgYXMgcmVhZG9ubHkgdW5rbm93bltdKS5pbmNsdWRlcyhzZXZlcml0eSkgPyBzZXZlcml0eSBhcyBMb29rdXBXYXJuaW5nU2V2ZXJpdHkgOiAnd2FybmluZycsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdG9vbGNoYWluID0gcGFyc2VMb29rdXBUb29sY2hhaW4oY29udGFpbmVyLnRvb2xjaGFpbiwgcGx1Z2luKTtcbiAgcmV0dXJuIHsgcGx1Z2luLCB3YXJuaW5ncywgLi4uKHRvb2xjaGFpbiAmJiB7IHRvb2xjaGFpbiB9KSB9O1xufVxuXG4vKipcbiAqIE9uZSBsaW5lIHN1bW1hcml6aW5nIGdyYWRlZCB3YXJuaW5ncywgbW9zdCBzZXJpb3VzIGZpcnN0IOKAlFxuICogYDMgcGx1Z2luIHdhcm5pbmdzOiAxIGNyaXRpY2FsLCAyIGVycm9yYC4gTnVsbCB3aGVuIHRoZXJlIGFyZSBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplTG9va3VwV2FybmluZ3Mod2FybmluZ3M6IHJlYWRvbmx5IFBpY2s8TG9va3VwV2FybmluZywgJ3NldmVyaXR5Jz5bXSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAod2FybmluZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGFydHMgPSBbLi4uTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFU10ucmV2ZXJzZSgpXG4gICAgLm1hcCgoc2V2KSA9PiBbc2V2LCB3YXJuaW5ncy5maWx0ZXIoKHcpID0+IHcuc2V2ZXJpdHkgPT09IHNldikubGVuZ3RoXSBhcyBjb25zdClcbiAgICAuZmlsdGVyKChbLCBuXSkgPT4gbiA+IDApXG4gICAgLm1hcCgoW3Nldiwgbl0pID0+IGAke259ICR7c2V2fWApO1xuICByZXR1cm4gYCR7d2FybmluZ3MubGVuZ3RofSBwbHVnaW4gd2FybmluZyR7d2FybmluZ3MubGVuZ3RoID09PSAxID8gJycgOiAncyd9OiAke3BhcnRzLmpvaW4oJywgJyl9YDtcbn1cblxuLyoqIFdoeSBhIGxvb2t1cCBmb3VuZCBub3RoaW5nLCBhcyB0aGUgcGx1Z2luIHNlcnZpY2UncyA0MDQgYGRldGFpbHMuc3RhdGVgIHJlcG9ydHMgaXQuICovXG5leHBvcnQgdHlwZSBMb29rdXBOb3RGb3VuZFN0YXRlID0gJ2RlbGV0ZWQnIHwgJ2luYWN0aXZlJyB8ICd5YW5rZWQnIHwgJ21pc3NpbmcnO1xuXG5jb25zdCBOT1RfRk9VTkRfU1RBVEVTOiByZWFkb25seSBMb29rdXBOb3RGb3VuZFN0YXRlW10gPSBbJ2RlbGV0ZWQnLCAnaW5hY3RpdmUnLCAneWFua2VkJywgJ21pc3NpbmcnXTtcblxuLyoqXG4gKiBgZGV0YWlscy5zdGF0ZWAgb2YgYSByZWZ1c2VkIGxvb2t1cCwgcmVhZCBvZmYgZWl0aGVyIGFuIGF4aW9zLXN0eWxlIGVycm9yXG4gKiAoYGVyci5yZXNwb25zZS5kYXRhYCkgb3IgdGhlIHJlc3BvbnNlIGJvZHkgaXRzZWxmLiBOdWxsIHdoZW4gYWJzZW50L3Vua25vd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb29rdXBOb3RGb3VuZFN0YXRlKGVyck9yQm9keTogdW5rbm93bik6IExvb2t1cE5vdEZvdW5kU3RhdGUgfCBudWxsIHtcbiAgaWYgKCFlcnJPckJvZHkgfHwgdHlwZW9mIGVyck9yQm9keSAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICBjb25zdCBkYXRhID0gKGVyck9yQm9keSBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0pLnJlc3BvbnNlPy5kYXRhID8/IGVyck9yQm9keTtcbiAgY29uc3QgZGV0YWlscyA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyBkZXRhaWxzPzogdW5rbm93biB9KS5kZXRhaWxzIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbHMgJiYgdHlwZW9mIGRldGFpbHMgPT09ICdvYmplY3QnID8gKGRldGFpbHMgYXMgeyBzdGF0ZT86IHVua25vd24gfSkuc3RhdGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnICYmIChOT1RfRk9VTkRfU1RBVEVTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhzdGF0ZSkgPyBzdGF0ZSBhcyBMb29rdXBOb3RGb3VuZFN0YXRlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgbWVzc2FnZSBmb3IgYW4gZXhhY3QgdmVyc2lvbiBwaW4gdGhhdCBkaWQgbm90IHJlc29sdmUuIFNoYXJlZCBieSB0aGVcbiAqIENMSSdzIHByZS1yZXNvbHV0aW9uIGFuZCB0aGUgZGVwbG95LXRpbWUgTGFtYmRhJ3MgQ2xvdWRGb3JtYXRpb24gcmVhc29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWw6IHN0cmluZywgcGluOiBzdHJpbmcsIHN0YXRlOiBMb29rdXBOb3RGb3VuZFN0YXRlIHwgbnVsbCk6IHN0cmluZyB7XG4gIHN3aXRjaCAoc3RhdGUpIHtcbiAgICBjYXNlICdkZWxldGVkJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IHdhcyBkZWxldGVkIGZyb20geW91ciBvcmdhbml6YXRpb25gO1xuICAgIGNhc2UgJ2luYWN0aXZlJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGlzIGluYWN0aXZlYDtcbiAgICBjYXNlICd5YW5rZWQnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gd2FzIHlhbmtlZGA7XG4gICAgY2FzZSAnbWlzc2luZyc6IHJldHVybiBgUGx1Z2luIFwiJHtsYWJlbH1cIiB2ZXJzaW9uICR7cGlufSBkb2VzIG5vdCBleGlzdGA7XG4gICAgZGVmYXVsdDogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGRvZXMgbm90IGV4aXN0IChuZXZlciBwdWJsaXNoZWQsIG9yIHJlZnVzZWQgYnkgaXRzIGJ1aWxkJ3MgdnVsbmVyYWJpbGl0eSBzY2FuKWA7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-mutation runtime (docs/plans/bootstrap-image-versioning.md §3, D10).
|
|
3
|
+
*
|
|
4
|
+
* Self-mutation runs on an AWS CURATED image, not the toolchain's bootstrap
|
|
5
|
+
* image, so a defective toolchain release can always be rolled back: the step
|
|
6
|
+
* that re-deploys the pipeline does not depend on the release it is replacing.
|
|
7
|
+
* It needs only Node and the CDK CLI. CDK Pipelines' SelfMutate runs
|
|
8
|
+
* `npm install -g aws-cdk@<cliVersion>` then `cdk -a <asm> deploy` (no
|
|
9
|
+
* re-synth), and `cliVersion` is always pinned to the release's `awsCdk`.
|
|
10
|
+
*
|
|
11
|
+
* The Node runtime is PINNED through `partialBuildSpec`
|
|
12
|
+
* `phases.install.runtime-versions.nodejs`, never left to the image default,
|
|
13
|
+
* and a contract test (test/self-mutation-runtime.test.ts) fails when the major
|
|
14
|
+
* falls outside the pinned CLI's `engines.node` or the image's published runtimes.
|
|
15
|
+
*
|
|
16
|
+
* CDK-free (plain data) so the root entry can export it.
|
|
17
|
+
*/
|
|
18
|
+
/** The curated CodeBuild image self-mutation runs on. */
|
|
19
|
+
export declare const CURATED_SELF_MUTATION_IMAGE = "aws/codebuild/standard:8.0";
|
|
20
|
+
/**
|
|
21
|
+
* Node.js runtime majors `aws/codebuild/standard:8.0` publishes for
|
|
22
|
+
* `runtime-versions.nodejs`.
|
|
23
|
+
*
|
|
24
|
+
* Source: https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/8.0/runtimes.yml
|
|
25
|
+
* (`runtimes.nodejs.versions`; read 2026-11-13). Re-check when the image changes.
|
|
26
|
+
*/
|
|
27
|
+
export declare const CURATED_SELF_MUTATION_NODE_RUNTIMES: readonly number[];
|
|
28
|
+
/** The Node.js major self-mutation pins (`runtime-versions.nodejs`). */
|
|
29
|
+
export declare const SELF_MUTATION_NODE_MAJOR = 24;
|
|
30
|
+
/** The `partialBuildSpec` object that pins self-mutation's Node runtime. */
|
|
31
|
+
export declare function selfMutationPartialBuildSpec(): Record<string, unknown>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Self-mutation runtime (docs/plans/bootstrap-image-versioning.md §3, D10).
|
|
5
|
+
*
|
|
6
|
+
* Self-mutation runs on an AWS CURATED image, not the toolchain's bootstrap
|
|
7
|
+
* image, so a defective toolchain release can always be rolled back: the step
|
|
8
|
+
* that re-deploys the pipeline does not depend on the release it is replacing.
|
|
9
|
+
* It needs only Node and the CDK CLI. CDK Pipelines' SelfMutate runs
|
|
10
|
+
* `npm install -g aws-cdk@<cliVersion>` then `cdk -a <asm> deploy` (no
|
|
11
|
+
* re-synth), and `cliVersion` is always pinned to the release's `awsCdk`.
|
|
12
|
+
*
|
|
13
|
+
* The Node runtime is PINNED through `partialBuildSpec`
|
|
14
|
+
* `phases.install.runtime-versions.nodejs`, never left to the image default,
|
|
15
|
+
* and a contract test (test/self-mutation-runtime.test.ts) fails when the major
|
|
16
|
+
* falls outside the pinned CLI's `engines.node` or the image's published runtimes.
|
|
17
|
+
*
|
|
18
|
+
* CDK-free (plain data) so the root entry can export it.
|
|
19
|
+
*/
|
|
20
|
+
/** The curated CodeBuild image self-mutation runs on. */
|
|
21
|
+
export const CURATED_SELF_MUTATION_IMAGE = 'aws/codebuild/standard:8.0';
|
|
22
|
+
/**
|
|
23
|
+
* Node.js runtime majors `aws/codebuild/standard:8.0` publishes for
|
|
24
|
+
* `runtime-versions.nodejs`.
|
|
25
|
+
*
|
|
26
|
+
* Source: https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/8.0/runtimes.yml
|
|
27
|
+
* (`runtimes.nodejs.versions`; read 2026-11-13). Re-check when the image changes.
|
|
28
|
+
*/
|
|
29
|
+
export const CURATED_SELF_MUTATION_NODE_RUNTIMES = [22, 24, 26];
|
|
30
|
+
/** The Node.js major self-mutation pins (`runtime-versions.nodejs`). */
|
|
31
|
+
export const SELF_MUTATION_NODE_MAJOR = 24;
|
|
32
|
+
/** The `partialBuildSpec` object that pins self-mutation's Node runtime. */
|
|
33
|
+
export function selfMutationPartialBuildSpec() {
|
|
34
|
+
return { phases: { install: { 'runtime-versions': { nodejs: String(SELF_MUTATION_NODE_MAJOR) } } } };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZi1tdXRhdGlvbi5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvc2VsZi1tdXRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLDRCQUE0QixDQUFDO0FBRXhFOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFzQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFbkYsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUUzQyw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLDRCQUE0QjtJQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUN2RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2VsZi1tdXRhdGlvbiBydW50aW1lIChkb2NzL3BsYW5zL2Jvb3RzdHJhcC1pbWFnZS12ZXJzaW9uaW5nLm1kIMKnMywgRDEwKS5cbiAqXG4gKiBTZWxmLW11dGF0aW9uIHJ1bnMgb24gYW4gQVdTIENVUkFURUQgaW1hZ2UsIG5vdCB0aGUgdG9vbGNoYWluJ3MgYm9vdHN0cmFwXG4gKiBpbWFnZSwgc28gYSBkZWZlY3RpdmUgdG9vbGNoYWluIHJlbGVhc2UgY2FuIGFsd2F5cyBiZSByb2xsZWQgYmFjazogdGhlIHN0ZXBcbiAqIHRoYXQgcmUtZGVwbG95cyB0aGUgcGlwZWxpbmUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSByZWxlYXNlIGl0IGlzIHJlcGxhY2luZy5cbiAqIEl0IG5lZWRzIG9ubHkgTm9kZSBhbmQgdGhlIENESyBDTEkuIENESyBQaXBlbGluZXMnIFNlbGZNdXRhdGUgcnVuc1xuICogYG5wbSBpbnN0YWxsIC1nIGF3cy1jZGtAPGNsaVZlcnNpb24+YCB0aGVuIGBjZGsgLWEgPGFzbT4gZGVwbG95YCAobm9cbiAqIHJlLXN5bnRoKSwgYW5kIGBjbGlWZXJzaW9uYCBpcyBhbHdheXMgcGlubmVkIHRvIHRoZSByZWxlYXNlJ3MgYGF3c0Nka2AuXG4gKlxuICogVGhlIE5vZGUgcnVudGltZSBpcyBQSU5ORUQgdGhyb3VnaCBgcGFydGlhbEJ1aWxkU3BlY2BcbiAqIGBwaGFzZXMuaW5zdGFsbC5ydW50aW1lLXZlcnNpb25zLm5vZGVqc2AsIG5ldmVyIGxlZnQgdG8gdGhlIGltYWdlIGRlZmF1bHQsXG4gKiBhbmQgYSBjb250cmFjdCB0ZXN0ICh0ZXN0L3NlbGYtbXV0YXRpb24tcnVudGltZS50ZXN0LnRzKSBmYWlscyB3aGVuIHRoZSBtYWpvclxuICogZmFsbHMgb3V0c2lkZSB0aGUgcGlubmVkIENMSSdzIGBlbmdpbmVzLm5vZGVgIG9yIHRoZSBpbWFnZSdzIHB1Ymxpc2hlZCBydW50aW1lcy5cbiAqXG4gKiBDREstZnJlZSAocGxhaW4gZGF0YSkgc28gdGhlIHJvb3QgZW50cnkgY2FuIGV4cG9ydCBpdC5cbiAqL1xuXG4vKiogVGhlIGN1cmF0ZWQgQ29kZUJ1aWxkIGltYWdlIHNlbGYtbXV0YXRpb24gcnVucyBvbi4gKi9cbmV4cG9ydCBjb25zdCBDVVJBVEVEX1NFTEZfTVVUQVRJT05fSU1BR0UgPSAnYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo4LjAnO1xuXG4vKipcbiAqIE5vZGUuanMgcnVudGltZSBtYWpvcnMgYGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6OC4wYCBwdWJsaXNoZXMgZm9yXG4gKiBgcnVudGltZS12ZXJzaW9ucy5ub2RlanNgLlxuICpcbiAqIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY29kZWJ1aWxkLWRvY2tlci1pbWFnZXMvYmxvYi9tYXN0ZXIvdWJ1bnR1L3N0YW5kYXJkLzguMC9ydW50aW1lcy55bWxcbiAqIChgcnVudGltZXMubm9kZWpzLnZlcnNpb25zYDsgcmVhZCAyMDI2LTExLTEzKS4gUmUtY2hlY2sgd2hlbiB0aGUgaW1hZ2UgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IENVUkFURURfU0VMRl9NVVRBVElPTl9OT0RFX1JVTlRJTUVTOiByZWFkb25seSBudW1iZXJbXSA9IFsyMiwgMjQsIDI2XTtcblxuLyoqIFRoZSBOb2RlLmpzIG1ham9yIHNlbGYtbXV0YXRpb24gcGlucyAoYHJ1bnRpbWUtdmVyc2lvbnMubm9kZWpzYCkuICovXG5leHBvcnQgY29uc3QgU0VMRl9NVVRBVElPTl9OT0RFX01BSk9SID0gMjQ7XG5cbi8qKiBUaGUgYHBhcnRpYWxCdWlsZFNwZWNgIG9iamVjdCB0aGF0IHBpbnMgc2VsZi1tdXRhdGlvbidzIE5vZGUgcnVudGltZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxmTXV0YXRpb25QYXJ0aWFsQnVpbGRTcGVjKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHsgcGhhc2VzOiB7IGluc3RhbGw6IHsgJ3J1bnRpbWUtdmVyc2lvbnMnOiB7IG5vZGVqczogU3RyaW5nKFNFTEZfTVVUQVRJT05fTk9ERV9NQUpPUikgfSB9IH0gfTtcbn1cbiJdfQ==
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step manifest: which plugin each CodePipeline action
|
|
3
|
+
* of a deployed pipeline runs. CDK-free half — the shapes and helpers shared by
|
|
4
|
+
* the synth (which records it, see `pipeline/step-manifest-recorder.ts`), the
|
|
5
|
+
* CLI (which ships it with the registry registration) and the pipeline service
|
|
6
|
+
* (which validates and stores it in `pipeline_step_manifests`).
|
|
7
|
+
*
|
|
8
|
+
* Event ingest joins `pipeline_events` on (pipeline_id, stage_name,
|
|
9
|
+
* action_name), so `stageName`/`actionName` here are read off the BUILT
|
|
10
|
+
* CodePipeline, never recomputed from our own ids — they are exactly the names
|
|
11
|
+
* CodePipeline state-change events report.
|
|
12
|
+
*/
|
|
13
|
+
import { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY, type ToolchainResolvedVia } from '@pipeline-builder/api-core';
|
|
14
|
+
export { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY };
|
|
1
15
|
/**
|
|
2
16
|
* File the synth app writes the manifest to, inside the cloud assembly
|
|
3
17
|
* directory (`cdk deploy --output=<dir>`). The CLI reads it back after a
|
|
@@ -35,6 +49,27 @@ export interface StepManifestEntry {
|
|
|
35
49
|
*/
|
|
36
50
|
readonly stepKey?: string;
|
|
37
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* The pipeline's BUILD IMAGE: the toolchain release's `pipeline-bootstrap` half
|
|
54
|
+
* every plugin-less action runs on (docs/plans/bootstrap-image-versioning.md §4).
|
|
55
|
+
* Not a step — it rides the manifest as a non-step entry under the
|
|
56
|
+
* `build-image` key and the sentinel (stage, action) the platform stores it
|
|
57
|
+
* under, so the deploy-reference path (in-use protection) counts the release.
|
|
58
|
+
* `pluginVersion` IS the release version (both halves share it); the platform
|
|
59
|
+
* re-reads name/version/digest from the `pluginId` row as for every entry.
|
|
60
|
+
*/
|
|
61
|
+
export interface BuildImageManifestEntry extends StepManifestEntry {
|
|
62
|
+
readonly kind: 'build-image';
|
|
63
|
+
readonly stageName: typeof BUILD_IMAGE_MANIFEST_STAGE;
|
|
64
|
+
readonly actionName: typeof BUILD_IMAGE_MANIFEST_ACTION;
|
|
65
|
+
readonly stepKey: typeof BUILD_IMAGE_STEP_KEY;
|
|
66
|
+
readonly releaseVersion: string;
|
|
67
|
+
readonly imageRepository: string | null;
|
|
68
|
+
/** How the release was chosen for this pipeline at synth. */
|
|
69
|
+
readonly resolvedVia: ToolchainResolvedVia;
|
|
70
|
+
}
|
|
71
|
+
/** Whether a manifest entry is the {@link BuildImageManifestEntry}. */
|
|
72
|
+
export declare function isBuildImageEntry(entry: StepManifestEntry): entry is BuildImageManifestEntry;
|
|
38
73
|
/** The plugin fields {@link pluginImageRepository} reads. */
|
|
39
74
|
export interface PluginImageRef {
|
|
40
75
|
readonly orgId: string;
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
* CodePipeline, never recomputed from our own ids — they are exactly the names
|
|
13
13
|
* CodePipeline state-change events report.
|
|
14
14
|
*/
|
|
15
|
-
import { SYSTEM_ORG_ID } from '@pipeline-builder/api-core';
|
|
15
|
+
import { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY, SYSTEM_ORG_ID, } from '@pipeline-builder/api-core';
|
|
16
|
+
export { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY };
|
|
16
17
|
/**
|
|
17
18
|
* File the synth app writes the manifest to, inside the cloud assembly
|
|
18
19
|
* directory (`cdk deploy --output=<dir>`). The CLI reads it back after a
|
|
@@ -25,6 +26,11 @@ export const STEP_MANIFEST_FILE = 'pb-step-manifest.json';
|
|
|
25
26
|
* synth. Never a real `plugins` row, so the step manifest never records it.
|
|
26
27
|
*/
|
|
27
28
|
export const PLACEHOLDER_PLUGIN_ID = '00000000-0000-0000-0000-000000000000';
|
|
29
|
+
/** Whether a manifest entry is the {@link BuildImageManifestEntry}. */
|
|
30
|
+
export function isBuildImageEntry(entry) {
|
|
31
|
+
return entry.kind === 'build-image'
|
|
32
|
+
|| (entry.stageName === BUILD_IMAGE_MANIFEST_STAGE && entry.actionName === BUILD_IMAGE_MANIFEST_ACTION);
|
|
33
|
+
}
|
|
28
34
|
/**
|
|
29
35
|
* Registry repository an org-owned plugin ROW's image lives at
|
|
30
36
|
* (`<namespace>/<name>`, no host, no digest): the system org's under
|
|
@@ -44,4 +50,4 @@ export function pluginImageRepository(plugin) {
|
|
|
44
50
|
}
|
|
45
51
|
/** A plugin image repository lookup may return: `public/<publisher>/<name>`, `org-<id>/<name>` or `system/<name>`. */
|
|
46
52
|
export const PLUGIN_IMAGE_REPOSITORY_RE = /^(?:public\/[a-z0-9]+(?:-[a-z0-9]+)*|org-[a-z0-9][a-z0-9-]*|system)\/[a-z0-9][a-z0-9._-]*$/;
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1tYW5pZmVzdC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvc3RlcC1tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUNMLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLGFBQWEsR0FDN0YsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztBQUV6Rjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHNDQUFzQyxDQUFDO0FBZ0Q1RSx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQXdCO0lBQ3hELE9BQVEsS0FBNEIsQ0FBQyxJQUFJLEtBQUssYUFBYTtXQUN0RCxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssMEJBQTBCLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSywyQkFBMkIsQ0FBQyxDQUFDO0FBQzVHLENBQUM7QUFTRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQXNCO0lBQzFELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxlQUFlO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEYsT0FBTyxHQUFHLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDdkMsQ0FBQztBQUVELHNIQUFzSDtBQUN0SCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0RkFBNEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFN0ZXAgbWFuaWZlc3Q6IHdoaWNoIHBsdWdpbiBlYWNoIENvZGVQaXBlbGluZSBhY3Rpb25cbiAqIG9mIGEgZGVwbG95ZWQgcGlwZWxpbmUgcnVucy4gQ0RLLWZyZWUgaGFsZiDigJQgdGhlIHNoYXBlcyBhbmQgaGVscGVycyBzaGFyZWQgYnlcbiAqIHRoZSBzeW50aCAod2hpY2ggcmVjb3JkcyBpdCwgc2VlIGBwaXBlbGluZS9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLnRzYCksIHRoZVxuICogQ0xJICh3aGljaCBzaGlwcyBpdCB3aXRoIHRoZSByZWdpc3RyeSByZWdpc3RyYXRpb24pIGFuZCB0aGUgcGlwZWxpbmUgc2VydmljZVxuICogKHdoaWNoIHZhbGlkYXRlcyBhbmQgc3RvcmVzIGl0IGluIGBwaXBlbGluZV9zdGVwX21hbmlmZXN0c2ApLlxuICpcbiAqIEV2ZW50IGluZ2VzdCBqb2lucyBgcGlwZWxpbmVfZXZlbnRzYCBvbiAocGlwZWxpbmVfaWQsIHN0YWdlX25hbWUsXG4gKiBhY3Rpb25fbmFtZSksIHNvIGBzdGFnZU5hbWVgL2BhY3Rpb25OYW1lYCBoZXJlIGFyZSByZWFkIG9mZiB0aGUgQlVJTFRcbiAqIENvZGVQaXBlbGluZSwgbmV2ZXIgcmVjb21wdXRlZCBmcm9tIG91ciBvd24gaWRzIOKAlCB0aGV5IGFyZSBleGFjdGx5IHRoZSBuYW1lc1xuICogQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgcmVwb3J0LlxuICovXG5cbmltcG9ydCB7XG4gIEJVSUxEX0lNQUdFX01BTklGRVNUX0FDVElPTiwgQlVJTERfSU1BR0VfTUFOSUZFU1RfU1RBR0UsIEJVSUxEX0lNQUdFX1NURVBfS0VZLCBTWVNURU1fT1JHX0lELCB0eXBlIFRvb2xjaGFpblJlc29sdmVkVmlhLFxufSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbmV4cG9ydCB7IEJVSUxEX0lNQUdFX01BTklGRVNUX0FDVElPTiwgQlVJTERfSU1BR0VfTUFOSUZFU1RfU1RBR0UsIEJVSUxEX0lNQUdFX1NURVBfS0VZIH07XG5cbi8qKlxuICogRmlsZSB0aGUgc3ludGggYXBwIHdyaXRlcyB0aGUgbWFuaWZlc3QgdG8sIGluc2lkZSB0aGUgY2xvdWQgYXNzZW1ibHlcbiAqIGRpcmVjdG9yeSAoYGNkayBkZXBsb3kgLS1vdXRwdXQ9PGRpcj5gKS4gVGhlIENMSSByZWFkcyBpdCBiYWNrIGFmdGVyIGFcbiAqIHN1Y2Nlc3NmdWwgZGVwbG95IGFuZCBmb3J3YXJkcyBpdCBvbiB0aGUgcmVnaXN0cnkgUE9TVC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNURVBfTUFOSUZFU1RfRklMRSA9ICdwYi1zdGVwLW1hbmlmZXN0Lmpzb24nO1xuXG4vKipcbiAqIGBpZGAgb2YgZXZlcnkgc3ludGhlc2l6ZWQgcGxhY2Vob2xkZXIgcGx1Z2luIChQbHVnaW5Mb29rdXAgYGZhbGxiYWNrKClgIC9cbiAqIGBib290c3RyYXAoKWApIOKAlCBhIHJlY29yZCBzdGFuZGluZyBpbiBmb3IgYSBsb29rdXAgdGhhdCBjb3VsZCBub3QgcmVzb2x2ZSBhdFxuICogc3ludGguIE5ldmVyIGEgcmVhbCBgcGx1Z2luc2Agcm93LCBzbyB0aGUgc3RlcCBtYW5pZmVzdCBuZXZlciByZWNvcmRzIGl0LlxuICovXG5leHBvcnQgY29uc3QgUExBQ0VIT0xERVJfUExVR0lOX0lEID0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogT25lIG1hbmlmZXN0IGVudHJ5IGFzIHRoZSBzeW50aCByZWNvcmRzIGl0LiBDYXJyaWVzIHRoZSByZXNvbHZlZCBwbHVnaW5cbiAqIHJlY29yZCdzIGlkIHNvIHRoZSBwaXBlbGluZSBzZXJ2aWNlIGNhbiByZS1yZXNvbHZlIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBuYW1lL3ZlcnNpb24vZGlnZXN0L293bmVyIGl0c2VsZiDigJQgdGhlIENMSSdzIGNsYWltIGlzIG5ldmVyIHRydXN0ZWQgZm9yXG4gKiBhbnl0aGluZyB0aGF0IGZlZWRzIGNyb3NzLW9yZyBzdGF0cyAocHVibGlzaGVyLCB2ZXJpZmllZCB1c2UpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYW5pZmVzdEVudHJ5IHtcbiAgLyoqIENvZGVQaXBlbGluZSBzdGFnZSBuYW1lLCBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQuICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogQ29kZVBpcGVsaW5lIGFjdGlvbiBuYW1lLCBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQuICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIGBwbHVnaW5zLmlkYCBvZiB0aGUgcmVzb2x2ZWQgcGx1Z2luIHJlY29yZC4gKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBTaWduZWQgaW1hZ2UgZGlnZXN0IHRoZSBzdGVwIGlzIHBpbm5lZCB0bzsgbnVsbCBmb3IgaW1hZ2UtbGVzcyBwbHVnaW5zLiAqL1xuICByZWFkb25seSBpbWFnZURpZ2VzdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBzdGVwJ3MgbGFiZWwgKGBwbHVnaW5TdGVwTGFiZWxgOiBgc3ludGhgIG9yIGA8c3RhZ2U+LzxhbGlhcyA/PyBuYW1lPmApIOKAlFxuICAgKiB3aGF0IHRoZSBDTEkgYW5kIHRoZSBsb29rdXAgTGFtYmRhIHNlbmQgYXMgbG9va3VwIGBjb250ZXh0LnN0ZXBLZXlzYCwgYW5kIHRoZVxuICAgKiBydW4tdGltZSBjaGVjayBhc2tzIGFib3V0LiBMZXRzIHRoZSBwbGF0Zm9ybSBqb2luIGxvb2t1cCB3YXJuaW5ncyB0byB0aGlzXG4gICAqIG1hbmlmZXN0IHJvdy5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZXBLZXk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBpcGVsaW5lJ3MgQlVJTEQgSU1BR0U6IHRoZSB0b29sY2hhaW4gcmVsZWFzZSdzIGBwaXBlbGluZS1ib290c3RyYXBgIGhhbGZcbiAqIGV2ZXJ5IHBsdWdpbi1sZXNzIGFjdGlvbiBydW5zIG9uIChkb2NzL3BsYW5zL2Jvb3RzdHJhcC1pbWFnZS12ZXJzaW9uaW5nLm1kIMKnNCkuXG4gKiBOb3QgYSBzdGVwIOKAlCBpdCByaWRlcyB0aGUgbWFuaWZlc3QgYXMgYSBub24tc3RlcCBlbnRyeSB1bmRlciB0aGVcbiAqIGBidWlsZC1pbWFnZWAga2V5IGFuZCB0aGUgc2VudGluZWwgKHN0YWdlLCBhY3Rpb24pIHRoZSBwbGF0Zm9ybSBzdG9yZXMgaXRcbiAqIHVuZGVyLCBzbyB0aGUgZGVwbG95LXJlZmVyZW5jZSBwYXRoIChpbi11c2UgcHJvdGVjdGlvbikgY291bnRzIHRoZSByZWxlYXNlLlxuICogYHBsdWdpblZlcnNpb25gIElTIHRoZSByZWxlYXNlIHZlcnNpb24gKGJvdGggaGFsdmVzIHNoYXJlIGl0KTsgdGhlIHBsYXRmb3JtXG4gKiByZS1yZWFkcyBuYW1lL3ZlcnNpb24vZGlnZXN0IGZyb20gdGhlIGBwbHVnaW5JZGAgcm93IGFzIGZvciBldmVyeSBlbnRyeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEltYWdlTWFuaWZlc3RFbnRyeSBleHRlbmRzIFN0ZXBNYW5pZmVzdEVudHJ5IHtcbiAgcmVhZG9ubHkga2luZDogJ2J1aWxkLWltYWdlJztcbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiB0eXBlb2YgQlVJTERfSU1BR0VfTUFOSUZFU1RfU1RBR0U7XG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHR5cGVvZiBCVUlMRF9JTUFHRV9NQU5JRkVTVF9BQ1RJT047XG4gIHJlYWRvbmx5IHN0ZXBLZXk6IHR5cGVvZiBCVUlMRF9JTUFHRV9TVEVQX0tFWTtcbiAgcmVhZG9ubHkgcmVsZWFzZVZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgaW1hZ2VSZXBvc2l0b3J5OiBzdHJpbmcgfCBudWxsO1xuICAvKiogSG93IHRoZSByZWxlYXNlIHdhcyBjaG9zZW4gZm9yIHRoaXMgcGlwZWxpbmUgYXQgc3ludGguICovXG4gIHJlYWRvbmx5IHJlc29sdmVkVmlhOiBUb29sY2hhaW5SZXNvbHZlZFZpYTtcbn1cblxuLyoqIFdoZXRoZXIgYSBtYW5pZmVzdCBlbnRyeSBpcyB0aGUge0BsaW5rIEJ1aWxkSW1hZ2VNYW5pZmVzdEVudHJ5fS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0J1aWxkSW1hZ2VFbnRyeShlbnRyeTogU3RlcE1hbmlmZXN0RW50cnkpOiBlbnRyeSBpcyBCdWlsZEltYWdlTWFuaWZlc3RFbnRyeSB7XG4gIHJldHVybiAoZW50cnkgYXMgeyBraW5kPzogdW5rbm93biB9KS5raW5kID09PSAnYnVpbGQtaW1hZ2UnXG4gICAgfHwgKGVudHJ5LnN0YWdlTmFtZSA9PT0gQlVJTERfSU1BR0VfTUFOSUZFU1RfU1RBR0UgJiYgZW50cnkuYWN0aW9uTmFtZSA9PT0gQlVJTERfSU1BR0VfTUFOSUZFU1RfQUNUSU9OKTtcbn1cblxuLyoqIFRoZSBwbHVnaW4gZmllbGRzIHtAbGluayBwbHVnaW5JbWFnZVJlcG9zaXRvcnl9IHJlYWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5JbWFnZVJlZiB7XG4gIHJlYWRvbmx5IG9yZ0lkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYnVpbGRUeXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RyeSByZXBvc2l0b3J5IGFuIG9yZy1vd25lZCBwbHVnaW4gUk9XJ3MgaW1hZ2UgbGl2ZXMgYXRcbiAqIChgPG5hbWVzcGFjZT4vPG5hbWU+YCwgbm8gaG9zdCwgbm8gZGlnZXN0KTogdGhlIHN5c3RlbSBvcmcncyB1bmRlclxuICogYHN5c3RlbS9gLCBhIHRlbmFudCdzIHVuZGVyIGBvcmctPG9yZ0lkPi9gLiBNdXN0IG1hdGNoIHRoZSBwdXNoIHNpZGVcbiAqIChhcGkvcGx1Z2luIGBwbHVnaW5VcmlgKS4gUmV0dXJucyBudWxsIGZvciBhIGBtZXRhZGF0YV9vbmx5YCBwbHVnaW4uXG4gKlxuICogT25seSBmb3Igcm93cyB0aGUgY2FsbGVyJ3Mgb3JnIHJlc29sdmVzIGFzIGl0cyBPV04gKG9yIGl0cyBwYXJlbnQncyk6IHRoZVxuICogcGx1Z2luIGxvb2t1cCBzdGFtcHMgaXQgYXMgdGhlIHJlY29yZCdzIGBpbWFnZVJlcG9zaXRvcnlgLiBBIGxpc3RlZCBwbHVnaW4nc1xuICogcmVwb3NpdG9yeSBpcyBpdHMgbGlzdGluZyB2ZXJzaW9uJ3MgYHB1YmxpYy88cHVibGlzaGVyPi88bmFtZT5gIGNvcHkg4oCUXG4gKiBzeW50aCBuZXZlciBkZXJpdmVzIGEgcmVwb3NpdG9yeSBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5JbWFnZVJlcG9zaXRvcnkocGx1Z2luOiBQbHVnaW5JbWFnZVJlZik6IHN0cmluZyB8IG51bGwge1xuICBpZiAocGx1Z2luLmJ1aWxkVHlwZSA9PT0gJ21ldGFkYXRhX29ubHknKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbmFtZXNwYWNlID0gcGx1Z2luLm9yZ0lkID09PSBTWVNURU1fT1JHX0lEID8gJ3N5c3RlbScgOiBgb3JnLSR7cGx1Z2luLm9yZ0lkfWA7XG4gIHJldHVybiBgJHtuYW1lc3BhY2V9LyR7cGx1Z2luLm5hbWV9YDtcbn1cblxuLyoqIEEgcGx1Z2luIGltYWdlIHJlcG9zaXRvcnkgbG9va3VwIG1heSByZXR1cm46IGBwdWJsaWMvPHB1Ymxpc2hlcj4vPG5hbWU+YCwgYG9yZy08aWQ+LzxuYW1lPmAgb3IgYHN5c3RlbS88bmFtZT5gLiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9JTUFHRV9SRVBPU0lUT1JZX1JFID0gL14oPzpwdWJsaWNcXC9bYS16MC05XSsoPzotW2EtejAtOV0rKSp8b3JnLVthLXowLTldW2EtejAtOS1dKnxzeXN0ZW0pXFwvW2EtejAtOV1bYS16MC05Ll8tXSokLztcbiJdfQ==
|