@pipeline-builder/pipeline-core 4.4.11 → 4.4.12
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 +26 -3
- package/lib/core/pipeline-helpers.js +62 -131
- package/lib/core/plugin-lookup-envelope.d.ts +44 -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 +36 -0
- package/lib/core/step-manifest.js +8 -2
- package/lib/handlers/bundle/index.mjs +20 -20
- 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 +67 -21
- package/lib/pipeline/plugin-lookup.d.ts +5 -9
- package/lib/pipeline/plugin-lookup.js +6 -10
- 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 +10 -0
- package/package.json +3 -3
|
@@ -2,12 +2,66 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
/** Severities, least to most serious. */
|
|
4
4
|
export const LOOKUP_WARNING_SEVERITIES = ['info', 'warning', 'error', 'critical'];
|
|
5
|
+
export const TOOLCHAIN_RESOLVED_VIA = ['pin', 'org-default', 'canary', 'default'];
|
|
6
|
+
const TOOLCHAIN_VERSION_KEYS = ['pipelineManager', 'awsCdk', 'cdkAssets', 'esbuild', 'pnpm', 'node'];
|
|
7
|
+
/** Pick the string tool versions off an object (unknown keys and non-strings ignored). */
|
|
8
|
+
function pickVersions(raw) {
|
|
9
|
+
if (!raw || typeof raw !== 'object')
|
|
10
|
+
return {};
|
|
11
|
+
const out = {};
|
|
12
|
+
for (const key of TOOLCHAIN_VERSION_KEYS) {
|
|
13
|
+
const v = raw[key];
|
|
14
|
+
if (typeof v === 'string' && v.length > 0)
|
|
15
|
+
out[key] = v;
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The flat `metadata` key prefix the platform persists a build image's
|
|
21
|
+
* `toolchain` under (`toolchain.awsCdk`, …; api-core `TOOLCHAIN_METADATA_PREFIX`,
|
|
22
|
+
* repeated here so this module stays dependency-free).
|
|
23
|
+
*/
|
|
24
|
+
const TOOLCHAIN_METADATA_PREFIX = 'toolchain.';
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBT3RDLHlDQUF5QztBQUN6QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBcUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQWFwSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBb0MsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQVluSCxNQUFNLHNCQUFzQixHQUF5QyxDQUFDLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQXlCM0ksMEZBQTBGO0FBQzFGLFNBQVMsWUFBWSxDQUFDLEdBQVk7SUFDaEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDL0MsTUFBTSxHQUFHLEdBQTJCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLEdBQUksR0FBK0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxZQUFZLENBQUM7QUFFL0MsNEZBQTRGO0FBQzVGLFNBQVMsb0JBQW9CLENBQUMsUUFBaUI7SUFDN0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDekQsTUFBTSxNQUFNLEdBQTRCLEVBQUUsQ0FBQztJQUMzQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFtQyxDQUFDLEVBQUUsQ0FBQztRQUN6RSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUM7WUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxHQUFZLEVBQUUsTUFBZ0I7SUFDakUsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakQsTUFBTSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBOEUsQ0FBQztJQUNqSSxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNuRixJQUFJLENBQUUsc0JBQTZDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQXFELENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNySCxPQUFPO1FBQ0wsY0FBYztRQUNkLFdBQVcsRUFBRSxXQUFtQztRQUNoRCxRQUFRLEVBQUUsRUFBRSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUU7S0FDdkksQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQWE7SUFDeEMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzdFLE1BQU0sS0FBSyxHQUFJLElBQTJCLENBQUMsSUFBSSxDQUFDO0lBQ2hELE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQWtFLENBQUM7SUFDdkksTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFRLFNBQWdDLENBQUMsSUFBSSxLQUFLLFFBQVE7V0FDakgsU0FBOEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDbEQsQ0FBQyxDQUFDLFNBQW1CO1FBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDVCxNQUFNLFFBQVEsR0FBb0IsRUFBRSxDQUFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7Z0JBQUUsU0FBUztZQUMxQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUE4RCxDQUFDO1lBQ25HLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxTQUFTO1lBQ2xFLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1osR0FBRyxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxPQUFPO2dCQUNQLFFBQVEsRUFBRyx5QkFBZ0QsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQWlDLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDL0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDL0QsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxRQUFvRDtJQUMxRixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZDLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLE9BQU8sRUFBRTtTQUNuRCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFVLENBQUM7U0FDL0UsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxrQkFBa0IsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNyRyxDQUFDO0FBS0QsTUFBTSxnQkFBZ0IsR0FBbUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUV0Rzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsU0FBa0I7SUFDcEQsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDN0QsTUFBTSxJQUFJLEdBQUksU0FBK0MsQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztJQUMxRixNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxJQUE4QixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZHLE1BQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFFLE9BQStCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDMUcsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUssZ0JBQXNDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUE0QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEksQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEtBQWlDO0lBQ25HLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLFNBQVMsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcscUNBQXFDLENBQUM7UUFDN0YsS0FBSyxVQUFVLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLGNBQWMsQ0FBQztRQUN2RSxLQUFLLFFBQVEsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3BFLEtBQUssU0FBUyxFQUFFLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztRQUN6RSxTQUFTLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpRkFBaUYsQ0FBQztJQUNwSSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuXG4vKiogSG93IHNlcmlvdXMgYSBsb29rdXAgd2FybmluZyBpcyAodnVsbmVyYWJpbGl0eSBzdGF0ZSBpcyBncmFkZWQsIG5ldmVyIHJlZnVzZWQpLiAqL1xuZXhwb3J0IHR5cGUgTG9va3VwV2FybmluZ1NldmVyaXR5ID0gJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdjcml0aWNhbCc7XG5cbi8qKiBTZXZlcml0aWVzLCBsZWFzdCB0byBtb3N0IHNlcmlvdXMuICovXG5leHBvcnQgY29uc3QgTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUzogcmVhZG9ubHkgTG9va3VwV2FybmluZ1NldmVyaXR5W10gPSBbJ2luZm8nLCAnd2FybmluZycsICdlcnJvcicsICdjcml0aWNhbCddO1xuXG4vKiogT25lIHdhcm5pbmcgcmlkaW5nIGJlc2lkZSBhIHJlc29sdmVkIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwV2FybmluZyB7XG4gIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIEFic2VudCBvbiB0aGUgd2lyZSDihpIgYHdhcm5pbmdgLiAqL1xuICByZWFkb25seSBzZXZlcml0eTogTG9va3VwV2FybmluZ1NldmVyaXR5O1xufVxuXG4vKiogSG93IGEgbWFuYWdlZCB0b29sY2hhaW4gcmVsZWFzZSB3YXMgY2hvc2VuIGZvciB0aGUgY2FsbGVyIChuZXZlciBhbnl0aGluZyBhYm91dCBvdGhlciBvcmdzKS4gKi9cbmV4cG9ydCB0eXBlIFRvb2xjaGFpblJlc29sdmVkVmlhID0gJ3BpbicgfCAnb3JnLWRlZmF1bHQnIHwgJ2NhbmFyeScgfCAnZGVmYXVsdCc7XG5cbmV4cG9ydCBjb25zdCBUT09MQ0hBSU5fUkVTT0xWRURfVklBOiByZWFkb25seSBUb29sY2hhaW5SZXNvbHZlZFZpYVtdID0gWydwaW4nLCAnb3JnLWRlZmF1bHQnLCAnY2FuYXJ5JywgJ2RlZmF1bHQnXTtcblxuLyoqIFRoZSBleGFjdCB0b29sIHZlcnNpb25zIGEgdG9vbGNoYWluIHJlbGVhc2UgY2FycmllcyAodGhlIGJvb3RzdHJhcCBzcGVjJ3MgYHRvb2xjaGFpbmApLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sY2hhaW5WZXJzaW9ucyB7XG4gIHJlYWRvbmx5IHBpcGVsaW5lTWFuYWdlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgYXdzQ2RrPzogc3RyaW5nO1xuICByZWFkb25seSBjZGtBc3NldHM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVzYnVpbGQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBucG0/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5vZGU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IFRPT0xDSEFJTl9WRVJTSU9OX0tFWVM6IHJlYWRvbmx5IChrZXlvZiBUb29sY2hhaW5WZXJzaW9ucylbXSA9IFsncGlwZWxpbmVNYW5hZ2VyJywgJ2F3c0NkaycsICdjZGtBc3NldHMnLCAnZXNidWlsZCcsICdwbnBtJywgJ25vZGUnXTtcblxuLyoqXG4gKiBUaGUgcmVsZWFzZSBhIG1hbmFnZWQtbmFtZSBsb29rdXAgKGBwaXBlbGluZS1ib290c3RyYXBgLCBgY2RrLXN5bnRoYClcbiAqIHJlc29sdmVkIHRvOiBgZGF0YS50b29sY2hhaW5gIG9mIHRoZSBgL3BsdWdpbnMvbG9va3VwYCBhbnN3ZXIuIGB2ZXJzaW9uc2BcbiAqIGhvbGRzIHRoZSB0b29sIHZlcnNpb25zIHdoZW4gdGhlIGFuc3dlciAob3IgdGhlIHBsdWdpbiByZWNvcmQpIGNhcnJpZXMgdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb29rdXBUb29sY2hhaW4ge1xuICByZWFkb25seSByZWxlYXNlVmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSByZXNvbHZlZFZpYTogVG9vbGNoYWluUmVzb2x2ZWRWaWE7XG4gIHJlYWRvbmx5IHZlcnNpb25zOiBUb29sY2hhaW5WZXJzaW9ucztcbn1cblxuLyoqXG4gKiBUaGUgcmVzb2x2ZWQgYHBpcGVsaW5lLWJvb3RzdHJhcGAgaGFsZiBvZiBhIHRvb2xjaGFpbiByZWxlYXNlOiB0aGUgcGx1Z2luXG4gKiByZWNvcmQgdGhlIGRlZmF1bHQgQ29kZUJ1aWxkIGltYWdlIGlzIHBpbm5lZCB0byAoYnkgaXRzIHNpZ25lZCBkaWdlc3QpIGFuZFxuICogdGhlIHJlbGVhc2UgaXQgY2FtZSBmcm9tLiBQcm9kdWNlZCBieSBgcGlwZWxpbmUtbWFuYWdlcmAnc1xuICogYHJlc29sdmVCb290c3RyYXBJbWFnZWAgKG9yIGEgYC0tdG9vbGNoYWluLWZpbGVgKSBhbmQgcGFzc2VkIHRvXG4gKiBgUGlwZWxpbmVCdWlsZGVyYCBhcyBgcmVzb2x2ZWRCb290c3RyYXBgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQm9vdHN0cmFwIHtcbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG4gIHJlYWRvbmx5IHRvb2xjaGFpbjogTG9va3VwVG9vbGNoYWluO1xufVxuXG4vKiogUGljayB0aGUgc3RyaW5nIHRvb2wgdmVyc2lvbnMgb2ZmIGFuIG9iamVjdCAodW5rbm93biBrZXlzIGFuZCBub24tc3RyaW5ncyBpZ25vcmVkKS4gKi9cbmZ1bmN0aW9uIHBpY2tWZXJzaW9ucyhyYXc6IHVua25vd24pOiBUb29sY2hhaW5WZXJzaW9ucyB7XG4gIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSByZXR1cm4ge307XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBUT09MQ0hBSU5fVkVSU0lPTl9LRVlTKSB7XG4gICAgY29uc3QgdiA9IChyYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA+IDApIG91dFtrZXldID0gdjtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRoZSBmbGF0IGBtZXRhZGF0YWAga2V5IHByZWZpeCB0aGUgcGxhdGZvcm0gcGVyc2lzdHMgYSBidWlsZCBpbWFnZSdzXG4gKiBgdG9vbGNoYWluYCB1bmRlciAoYHRvb2xjaGFpbi5hd3NDZGtgLCDigKY7IGFwaS1jb3JlIGBUT09MQ0hBSU5fTUVUQURBVEFfUFJFRklYYCxcbiAqIHJlcGVhdGVkIGhlcmUgc28gdGhpcyBtb2R1bGUgc3RheXMgZGVwZW5kZW5jeS1mcmVlKS5cbiAqL1xuY29uc3QgVE9PTENIQUlOX01FVEFEQVRBX1BSRUZJWCA9ICd0b29sY2hhaW4uJztcblxuLyoqIFRoZSB0b29sIHZlcnNpb25zIGEgcGx1Z2luIHJvdydzIGBtZXRhZGF0YWAgY2FycmllcyBhcyBmbGF0IGB0b29sY2hhaW4uPGZpZWxkPmAga2V5cy4gKi9cbmZ1bmN0aW9uIHZlcnNpb25zRnJvbU1ldGFkYXRhKG1ldGFkYXRhOiB1bmtub3duKTogVG9vbGNoYWluVmVyc2lvbnMge1xuICBpZiAoIW1ldGFkYXRhIHx8IHR5cGVvZiBtZXRhZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiB7fTtcbiAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICBpZiAoay5zdGFydHNXaXRoKFRPT0xDSEFJTl9NRVRBREFUQV9QUkVGSVgpKSBmaWVsZHNbay5zbGljZShUT09MQ0hBSU5fTUVUQURBVEFfUFJFRklYLmxlbmd0aCldID0gdjtcbiAgfVxuICByZXR1cm4gcGlja1ZlcnNpb25zKGZpZWxkcyk7XG59XG5cbi8qKlxuICogUGFyc2UgYSBsb29rdXAncyBgdG9vbGNoYWluYCBibG9jay4gTnVsbCB1bmxlc3MgaXQgY2FycmllcyBhIHJlbGVhc2UgdmVyc2lvblxuICogYW5kIGEga25vd24gYHJlc29sdmVkVmlhYC4gVG9vbCB2ZXJzaW9ucyBjb21lIGZyb20sIGxvd2VzdCBwcmVjZWRlbmNlIGZpcnN0OlxuICogdGhlIHBsdWdpbiByb3cncyBgbWV0YWRhdGFgIChgdG9vbGNoYWluLjxmaWVsZD5gIGtleXMsIHdoZXJlIHRoZSBwbGF0Zm9ybVxuICogcGVyc2lzdHMgdGhlIGJvb3RzdHJhcCBzcGVjJ3MgYHRvb2xjaGFpbmApLCB0aGUgcmVjb3JkJ3Mgb3duIGB0b29sY2hhaW5gLFxuICogdGhlIGJsb2NrJ3MgZmxhdCBmaWVsZHMsIHRoZW4gYHRvb2xjaGFpbi52ZXJzaW9uc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxvb2t1cFRvb2xjaGFpbihyYXc6IHVua25vd24sIHBsdWdpbj86IHVua25vd24pOiBMb29rdXBUb29sY2hhaW4gfCBudWxsIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICBjb25zdCB7IHJlbGVhc2VWZXJzaW9uLCByZXNvbHZlZFZpYSwgdmVyc2lvbnMgfSA9IHJhdyBhcyB7IHJlbGVhc2VWZXJzaW9uPzogdW5rbm93bjsgcmVzb2x2ZWRWaWE/OiB1bmtub3duOyB2ZXJzaW9ucz86IHVua25vd24gfTtcbiAgaWYgKHR5cGVvZiByZWxlYXNlVmVyc2lvbiAhPT0gJ3N0cmluZycgfHwgcmVsZWFzZVZlcnNpb24ubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKCEoVE9PTENIQUlOX1JFU09MVkVEX1ZJQSBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHJlc29sdmVkVmlhKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJlYyA9IHBsdWdpbiAmJiB0eXBlb2YgcGx1Z2luID09PSAnb2JqZWN0JyA/IHBsdWdpbiBhcyB7IHRvb2xjaGFpbj86IHVua25vd247IG1ldGFkYXRhPzogdW5rbm93biB9IDogdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIHJlbGVhc2VWZXJzaW9uLFxuICAgIHJlc29sdmVkVmlhOiByZXNvbHZlZFZpYSBhcyBUb29sY2hhaW5SZXNvbHZlZFZpYSxcbiAgICB2ZXJzaW9uczogeyAuLi52ZXJzaW9uc0Zyb21NZXRhZGF0YShyZWM/Lm1ldGFkYXRhKSwgLi4ucGlja1ZlcnNpb25zKHJlYz8udG9vbGNoYWluKSwgLi4ucGlja1ZlcnNpb25zKHJhdyksIC4uLnBpY2tWZXJzaW9ucyh2ZXJzaW9ucykgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBVbndyYXAgYSBgL3BsdWdpbnMvbG9va3VwYCBhbnN3ZXIuIFRoZSBwbGF0Zm9ybSdzIHN1Y2Nlc3MgZW52ZWxvcGUgaXNcbiAqIGB7IHN1Y2Nlc3MsIHN0YXR1c0NvZGUsIGRhdGE6IHsgcGx1Z2luLCB3YXJuaW5ncyB9IH1gIChub3RlIHRoZSBkb3VibGVcbiAqIG5lc3Rpbmc6IGBkYXRhLnBsdWdpbmApOyBgeyBkYXRhOiBQbHVnaW4gfWAsIGB7IHBsdWdpbiB9YCBhbmQgYSBiYXJlIFBsdWdpblxuICogYXJlIHRvbGVyYXRlZCB0b28uIFJldHVybnMgdGhlIHBsdWdpbiAobnVsbCB3aGVuIGFic2VudCBvciBuYW1lbGVzcykgYW5kIHRoZVxuICogZ3JhZGVkIHdhcm5pbmdzIChsaWZlY3ljbGUsIHZ1bG5lcmFiaWxpdHksIGNvbXBsaWFuY2UpIHRoYXQgcmlkZSBiZXNpZGUgaXQsXG4gKiBhbmQg4oCUIGZvciBhIG1hbmFnZWQgdG9vbGNoYWluIG5hbWUg4oCUIHRoZSByZWxlYXNlIGl0IHJlc29sdmVkIHRvIChgdG9vbGNoYWluYCkuXG4gKlxuICogRGVwZW5kZW5jeS1mcmVlICh0eXBlLW9ubHkgaW1wb3J0cykgc28gdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhIGNhbiBidW5kbGUgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBMb29rdXAoYm9keTogdW5rbm93bik6IHsgcGx1Z2luOiBQbHVnaW4gfCBudWxsOyB3YXJuaW5nczogTG9va3VwV2FybmluZ1tdOyB0b29sY2hhaW4/OiBMb29rdXBUb29sY2hhaW4gfSB7XG4gIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gJ29iamVjdCcpIHJldHVybiB7IHBsdWdpbjogbnVsbCwgd2FybmluZ3M6IFtdIH07XG4gIGNvbnN0IGlubmVyID0gKGJvZHkgYXMgeyBkYXRhPzogdW5rbm93biB9KS5kYXRhO1xuICBjb25zdCBjb250YWluZXIgPSAoaW5uZXIgJiYgdHlwZW9mIGlubmVyID09PSAnb2JqZWN0JyA/IGlubmVyIDogYm9keSkgYXMgeyBwbHVnaW4/OiB1bmtub3duOyB3YXJuaW5ncz86IHVua25vd247IHRvb2xjaGFpbj86IHVua25vd24gfTtcbiAgY29uc3QgY2FuZGlkYXRlID0gY29udGFpbmVyLnBsdWdpbiA/PyBjb250YWluZXI7XG4gIGNvbnN0IHBsdWdpbiA9IGNhbmRpZGF0ZSAmJiB0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGNhbmRpZGF0ZSBhcyB7IG5hbWU/OiB1bmtub3duIH0pLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgJiYgKGNhbmRpZGF0ZSBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lLmxlbmd0aCA+IDBcbiAgICA/IGNhbmRpZGF0ZSBhcyBQbHVnaW5cbiAgICA6IG51bGw7XG4gIGNvbnN0IHdhcm5pbmdzOiBMb29rdXBXYXJuaW5nW10gPSBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyLndhcm5pbmdzKSkge1xuICAgIGZvciAoY29uc3QgdyBvZiBjb250YWluZXIud2FybmluZ3MpIHtcbiAgICAgIGlmICghdyB8fCB0eXBlb2YgdyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyBjb2RlLCBtZXNzYWdlLCBzZXZlcml0eSB9ID0gdyBhcyB7IGNvZGU/OiB1bmtub3duOyBtZXNzYWdlPzogdW5rbm93bjsgc2V2ZXJpdHk/OiB1bmtub3duIH07XG4gICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8IG1lc3NhZ2UubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAuLi4odHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnID8geyBjb2RlIH0gOiB7fSksXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHNldmVyaXR5OiAoTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUyBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHNldmVyaXR5KSA/IHNldmVyaXR5IGFzIExvb2t1cFdhcm5pbmdTZXZlcml0eSA6ICd3YXJuaW5nJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb25zdCB0b29sY2hhaW4gPSBwYXJzZUxvb2t1cFRvb2xjaGFpbihjb250YWluZXIudG9vbGNoYWluLCBwbHVnaW4pO1xuICByZXR1cm4geyBwbHVnaW4sIHdhcm5pbmdzLCAuLi4odG9vbGNoYWluICYmIHsgdG9vbGNoYWluIH0pIH07XG59XG5cbi8qKlxuICogT25lIGxpbmUgc3VtbWFyaXppbmcgZ3JhZGVkIHdhcm5pbmdzLCBtb3N0IHNlcmlvdXMgZmlyc3Qg4oCUXG4gKiBgMyBwbHVnaW4gd2FybmluZ3M6IDEgY3JpdGljYWwsIDIgZXJyb3JgLiBOdWxsIHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyh3YXJuaW5nczogcmVhZG9ubHkgUGljazxMb29rdXBXYXJuaW5nLCAnc2V2ZXJpdHknPltdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCBwYXJ0cyA9IFsuLi5MT09LVVBfV0FSTklOR19TRVZFUklUSUVTXS5yZXZlcnNlKClcbiAgICAubWFwKChzZXYpID0+IFtzZXYsIHdhcm5pbmdzLmZpbHRlcigodykgPT4gdy5zZXZlcml0eSA9PT0gc2V2KS5sZW5ndGhdIGFzIGNvbnN0KVxuICAgIC5maWx0ZXIoKFssIG5dKSA9PiBuID4gMClcbiAgICAubWFwKChbc2V2LCBuXSkgPT4gYCR7bn0gJHtzZXZ9YCk7XG4gIHJldHVybiBgJHt3YXJuaW5ncy5sZW5ndGh9IHBsdWdpbiB3YXJuaW5nJHt3YXJuaW5ncy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ306ICR7cGFydHMuam9pbignLCAnKX1gO1xufVxuXG4vKiogV2h5IGEgbG9va3VwIGZvdW5kIG5vdGhpbmcsIGFzIHRoZSBwbHVnaW4gc2VydmljZSdzIDQwNCBgZGV0YWlscy5zdGF0ZWAgcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCB0eXBlIExvb2t1cE5vdEZvdW5kU3RhdGUgPSAnZGVsZXRlZCcgfCAnaW5hY3RpdmUnIHwgJ3lhbmtlZCcgfCAnbWlzc2luZyc7XG5cbmNvbnN0IE5PVF9GT1VORF9TVEFURVM6IHJlYWRvbmx5IExvb2t1cE5vdEZvdW5kU3RhdGVbXSA9IFsnZGVsZXRlZCcsICdpbmFjdGl2ZScsICd5YW5rZWQnLCAnbWlzc2luZyddO1xuXG4vKipcbiAqIGBkZXRhaWxzLnN0YXRlYCBvZiBhIHJlZnVzZWQgbG9va3VwLCByZWFkIG9mZiBlaXRoZXIgYW4gYXhpb3Mtc3R5bGUgZXJyb3JcbiAqIChgZXJyLnJlc3BvbnNlLmRhdGFgKSBvciB0aGUgcmVzcG9uc2UgYm9keSBpdHNlbGYuIE51bGwgd2hlbiBhYnNlbnQvdW5rbm93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cE5vdEZvdW5kU3RhdGUoZXJyT3JCb2R5OiB1bmtub3duKTogTG9va3VwTm90Rm91bmRTdGF0ZSB8IG51bGwge1xuICBpZiAoIWVyck9yQm9keSB8fCB0eXBlb2YgZXJyT3JCb2R5ICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGRhdGEgPSAoZXJyT3JCb2R5IGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSkucmVzcG9uc2U/LmRhdGEgPz8gZXJyT3JCb2R5O1xuICBjb25zdCBkZXRhaWxzID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IGRldGFpbHM/OiB1bmtub3duIH0pLmRldGFpbHMgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlscyAmJiB0eXBlb2YgZGV0YWlscyA9PT0gJ29iamVjdCcgPyAoZGV0YWlscyBhcyB7IHN0YXRlPzogdW5rbm93biB9KS5zdGF0ZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgJiYgKE5PVF9GT1VORF9TVEFURVMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHN0YXRlKSA/IHN0YXRlIGFzIExvb2t1cE5vdEZvdW5kU3RhdGUgOiBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBtZXNzYWdlIGZvciBhbiBleGFjdCB2ZXJzaW9uIHBpbiB0aGF0IGRpZCBub3QgcmVzb2x2ZS4gU2hhcmVkIGJ5IHRoZVxuICogQ0xJJ3MgcHJlLXJlc29sdXRpb24gYW5kIHRoZSBkZXBsb3ktdGltZSBMYW1iZGEncyBDbG91ZEZvcm1hdGlvbiByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbDogc3RyaW5nLCBwaW46IHN0cmluZywgc3RhdGU6IExvb2t1cE5vdEZvdW5kU3RhdGUgfCBudWxsKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0ZSkge1xuICAgIGNhc2UgJ2RlbGV0ZWQnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gd2FzIGRlbGV0ZWQgZnJvbSB5b3VyIG9yZ2FuaXphdGlvbmA7XG4gICAgY2FzZSAnaW5hY3RpdmUnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gaXMgaW5hY3RpdmVgO1xuICAgIGNhc2UgJ3lhbmtlZCc6IHJldHVybiBgUGx1Z2luIFwiJHtsYWJlbH1cIiB2ZXJzaW9uICR7cGlufSB3YXMgeWFua2VkYDtcbiAgICBjYXNlICdtaXNzaW5nJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGRvZXMgbm90IGV4aXN0YDtcbiAgICBkZWZhdWx0OiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gZG9lcyBub3QgZXhpc3QgKG5ldmVyIHB1Ymxpc2hlZCwgb3IgcmVmdXNlZCBieSBpdHMgYnVpbGQncyB2dWxuZXJhYmlsaXR5IHNjYW4pYDtcbiAgfVxufVxuIl19
|
|
@@ -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,18 @@
|
|
|
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 } from '@pipeline-builder/api-core';
|
|
14
|
+
import type { ToolchainResolvedVia } from './plugin-lookup-envelope.js';
|
|
15
|
+
export { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY };
|
|
1
16
|
/**
|
|
2
17
|
* File the synth app writes the manifest to, inside the cloud assembly
|
|
3
18
|
* directory (`cdk deploy --output=<dir>`). The CLI reads it back after a
|
|
@@ -35,6 +50,27 @@ export interface StepManifestEntry {
|
|
|
35
50
|
*/
|
|
36
51
|
readonly stepKey?: string;
|
|
37
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* The pipeline's BUILD IMAGE: the toolchain release's `pipeline-bootstrap` half
|
|
55
|
+
* every plugin-less action runs on (docs/plans/bootstrap-image-versioning.md §4).
|
|
56
|
+
* Not a step — it rides the manifest as a non-step entry under the
|
|
57
|
+
* `build-image` key and the sentinel (stage, action) the platform stores it
|
|
58
|
+
* under, so the deploy-reference path (in-use protection) counts the release.
|
|
59
|
+
* `pluginVersion` IS the release version (both halves share it); the platform
|
|
60
|
+
* re-reads name/version/digest from the `pluginId` row as for every entry.
|
|
61
|
+
*/
|
|
62
|
+
export interface BuildImageManifestEntry extends StepManifestEntry {
|
|
63
|
+
readonly kind: 'build-image';
|
|
64
|
+
readonly stageName: typeof BUILD_IMAGE_MANIFEST_STAGE;
|
|
65
|
+
readonly actionName: typeof BUILD_IMAGE_MANIFEST_ACTION;
|
|
66
|
+
readonly stepKey: typeof BUILD_IMAGE_STEP_KEY;
|
|
67
|
+
readonly releaseVersion: string;
|
|
68
|
+
readonly imageRepository: string | null;
|
|
69
|
+
/** How the release was chosen for this pipeline at synth. */
|
|
70
|
+
readonly resolvedVia: ToolchainResolvedVia;
|
|
71
|
+
}
|
|
72
|
+
/** Whether a manifest entry is the {@link BuildImageManifestEntry}. */
|
|
73
|
+
export declare function isBuildImageEntry(entry: StepManifestEntry): entry is BuildImageManifestEntry;
|
|
38
74
|
/** The plugin fields {@link pluginImageRepository} reads. */
|
|
39
75
|
export interface PluginImageRef {
|
|
40
76
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1tYW5pZmVzdC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvc3RlcC1tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUNMLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLGFBQWEsR0FDN0YsTUFBTSw0QkFBNEIsQ0FBQztBQUdwQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztBQUV6Rjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHNDQUFzQyxDQUFDO0FBZ0Q1RSx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQXdCO0lBQ3hELE9BQVEsS0FBNEIsQ0FBQyxJQUFJLEtBQUssYUFBYTtXQUN0RCxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssMEJBQTBCLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSywyQkFBMkIsQ0FBQyxDQUFDO0FBQzVHLENBQUM7QUFTRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQXNCO0lBQzFELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxlQUFlO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEYsT0FBTyxHQUFHLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDdkMsQ0FBQztBQUVELHNIQUFzSDtBQUN0SCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0RkFBNEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFN0ZXAgbWFuaWZlc3Q6IHdoaWNoIHBsdWdpbiBlYWNoIENvZGVQaXBlbGluZSBhY3Rpb25cbiAqIG9mIGEgZGVwbG95ZWQgcGlwZWxpbmUgcnVucy4gQ0RLLWZyZWUgaGFsZiDigJQgdGhlIHNoYXBlcyBhbmQgaGVscGVycyBzaGFyZWQgYnlcbiAqIHRoZSBzeW50aCAod2hpY2ggcmVjb3JkcyBpdCwgc2VlIGBwaXBlbGluZS9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLnRzYCksIHRoZVxuICogQ0xJICh3aGljaCBzaGlwcyBpdCB3aXRoIHRoZSByZWdpc3RyeSByZWdpc3RyYXRpb24pIGFuZCB0aGUgcGlwZWxpbmUgc2VydmljZVxuICogKHdoaWNoIHZhbGlkYXRlcyBhbmQgc3RvcmVzIGl0IGluIGBwaXBlbGluZV9zdGVwX21hbmlmZXN0c2ApLlxuICpcbiAqIEV2ZW50IGluZ2VzdCBqb2lucyBgcGlwZWxpbmVfZXZlbnRzYCBvbiAocGlwZWxpbmVfaWQsIHN0YWdlX25hbWUsXG4gKiBhY3Rpb25fbmFtZSksIHNvIGBzdGFnZU5hbWVgL2BhY3Rpb25OYW1lYCBoZXJlIGFyZSByZWFkIG9mZiB0aGUgQlVJTFRcbiAqIENvZGVQaXBlbGluZSwgbmV2ZXIgcmVjb21wdXRlZCBmcm9tIG91ciBvd24gaWRzIOKAlCB0aGV5IGFyZSBleGFjdGx5IHRoZSBuYW1lc1xuICogQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgcmVwb3J0LlxuICovXG5cbmltcG9ydCB7XG4gIEJVSUxEX0lNQUdFX01BTklGRVNUX0FDVElPTiwgQlVJTERfSU1BR0VfTUFOSUZFU1RfU1RBR0UsIEJVSUxEX0lNQUdFX1NURVBfS0VZLCBTWVNURU1fT1JHX0lELFxufSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFRvb2xjaGFpblJlc29sdmVkVmlhIH0gZnJvbSAnLi9wbHVnaW4tbG9va3VwLWVudmVsb3BlLmpzJztcblxuZXhwb3J0IHsgQlVJTERfSU1BR0VfTUFOSUZFU1RfQUNUSU9OLCBCVUlMRF9JTUFHRV9NQU5JRkVTVF9TVEFHRSwgQlVJTERfSU1BR0VfU1RFUF9LRVkgfTtcblxuLyoqXG4gKiBGaWxlIHRoZSBzeW50aCBhcHAgd3JpdGVzIHRoZSBtYW5pZmVzdCB0bywgaW5zaWRlIHRoZSBjbG91ZCBhc3NlbWJseVxuICogZGlyZWN0b3J5IChgY2RrIGRlcGxveSAtLW91dHB1dD08ZGlyPmApLiBUaGUgQ0xJIHJlYWRzIGl0IGJhY2sgYWZ0ZXIgYVxuICogc3VjY2Vzc2Z1bCBkZXBsb3kgYW5kIGZvcndhcmRzIGl0IG9uIHRoZSByZWdpc3RyeSBQT1NULlxuICovXG5leHBvcnQgY29uc3QgU1RFUF9NQU5JRkVTVF9GSUxFID0gJ3BiLXN0ZXAtbWFuaWZlc3QuanNvbic7XG5cbi8qKlxuICogYGlkYCBvZiBldmVyeSBzeW50aGVzaXplZCBwbGFjZWhvbGRlciBwbHVnaW4gKFBsdWdpbkxvb2t1cCBgZmFsbGJhY2soKWAgL1xuICogYGJvb3RzdHJhcCgpYCkg4oCUIGEgcmVjb3JkIHN0YW5kaW5nIGluIGZvciBhIGxvb2t1cCB0aGF0IGNvdWxkIG5vdCByZXNvbHZlIGF0XG4gKiBzeW50aC4gTmV2ZXIgYSByZWFsIGBwbHVnaW5zYCByb3csIHNvIHRoZSBzdGVwIG1hbmlmZXN0IG5ldmVyIHJlY29yZHMgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFDRUhPTERFUl9QTFVHSU5fSUQgPSAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBPbmUgbWFuaWZlc3QgZW50cnkgYXMgdGhlIHN5bnRoIHJlY29yZHMgaXQuIENhcnJpZXMgdGhlIHJlc29sdmVkIHBsdWdpblxuICogcmVjb3JkJ3MgaWQgc28gdGhlIHBpcGVsaW5lIHNlcnZpY2UgY2FuIHJlLXJlc29sdmUgdGhlIGF1dGhvcml0YXRpdmVcbiAqIG5hbWUvdmVyc2lvbi9kaWdlc3Qvb3duZXIgaXRzZWxmIOKAlCB0aGUgQ0xJJ3MgY2xhaW0gaXMgbmV2ZXIgdHJ1c3RlZCBmb3JcbiAqIGFueXRoaW5nIHRoYXQgZmVlZHMgY3Jvc3Mtb3JnIHN0YXRzIChwdWJsaXNoZXIsIHZlcmlmaWVkIHVzZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcE1hbmlmZXN0RW50cnkge1xuICAvKiogQ29kZVBpcGVsaW5lIHN0YWdlIG5hbWUsIGFzIHRoZSBidWlsdCBwaXBlbGluZSBuYW1lcyBpdC4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBDb2RlUGlwZWxpbmUgYWN0aW9uIG5hbWUsIGFzIHRoZSBidWlsdCBwaXBlbGluZSBuYW1lcyBpdC4gKi9cbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nO1xuICAvKiogYHBsdWdpbnMuaWRgIG9mIHRoZSByZXNvbHZlZCBwbHVnaW4gcmVjb3JkLiAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpblZlcnNpb246IHN0cmluZztcbiAgLyoqIFNpZ25lZCBpbWFnZSBkaWdlc3QgdGhlIHN0ZXAgaXMgcGlubmVkIHRvOyBudWxsIGZvciBpbWFnZS1sZXNzIHBsdWdpbnMuICovXG4gIHJlYWRvbmx5IGltYWdlRGlnZXN0OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHN0ZXAncyBsYWJlbCAoYHBsdWdpblN0ZXBMYWJlbGA6IGBzeW50aGAgb3IgYDxzdGFnZT4vPGFsaWFzID8/IG5hbWU+YCkg4oCUXG4gICAqIHdoYXQgdGhlIENMSSBhbmQgdGhlIGxvb2t1cCBMYW1iZGEgc2VuZCBhcyBsb29rdXAgYGNvbnRleHQuc3RlcEtleXNgLCBhbmQgdGhlXG4gICAqIHJ1bi10aW1lIGNoZWNrIGFza3MgYWJvdXQuIExldHMgdGhlIHBsYXRmb3JtIGpvaW4gbG9va3VwIHdhcm5pbmdzIHRvIHRoaXNcbiAgICogbWFuaWZlc3Qgcm93LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcEtleT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGlwZWxpbmUncyBCVUlMRCBJTUFHRTogdGhlIHRvb2xjaGFpbiByZWxlYXNlJ3MgYHBpcGVsaW5lLWJvb3RzdHJhcGAgaGFsZlxuICogZXZlcnkgcGx1Z2luLWxlc3MgYWN0aW9uIHJ1bnMgb24gKGRvY3MvcGxhbnMvYm9vdHN0cmFwLWltYWdlLXZlcnNpb25pbmcubWQgwqc0KS5cbiAqIE5vdCBhIHN0ZXAg4oCUIGl0IHJpZGVzIHRoZSBtYW5pZmVzdCBhcyBhIG5vbi1zdGVwIGVudHJ5IHVuZGVyIHRoZVxuICogYGJ1aWxkLWltYWdlYCBrZXkgYW5kIHRoZSBzZW50aW5lbCAoc3RhZ2UsIGFjdGlvbikgdGhlIHBsYXRmb3JtIHN0b3JlcyBpdFxuICogdW5kZXIsIHNvIHRoZSBkZXBsb3ktcmVmZXJlbmNlIHBhdGggKGluLXVzZSBwcm90ZWN0aW9uKSBjb3VudHMgdGhlIHJlbGVhc2UuXG4gKiBgcGx1Z2luVmVyc2lvbmAgSVMgdGhlIHJlbGVhc2UgdmVyc2lvbiAoYm90aCBoYWx2ZXMgc2hhcmUgaXQpOyB0aGUgcGxhdGZvcm1cbiAqIHJlLXJlYWRzIG5hbWUvdmVyc2lvbi9kaWdlc3QgZnJvbSB0aGUgYHBsdWdpbklkYCByb3cgYXMgZm9yIGV2ZXJ5IGVudHJ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkSW1hZ2VNYW5pZmVzdEVudHJ5IGV4dGVuZHMgU3RlcE1hbmlmZXN0RW50cnkge1xuICByZWFkb25seSBraW5kOiAnYnVpbGQtaW1hZ2UnO1xuICByZWFkb25seSBzdGFnZU5hbWU6IHR5cGVvZiBCVUlMRF9JTUFHRV9NQU5JRkVTVF9TVEFHRTtcbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogdHlwZW9mIEJVSUxEX0lNQUdFX01BTklGRVNUX0FDVElPTjtcbiAgcmVhZG9ubHkgc3RlcEtleTogdHlwZW9mIEJVSUxEX0lNQUdFX1NURVBfS0VZO1xuICByZWFkb25seSByZWxlYXNlVmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBpbWFnZVJlcG9zaXRvcnk6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBIb3cgdGhlIHJlbGVhc2Ugd2FzIGNob3NlbiBmb3IgdGhpcyBwaXBlbGluZSBhdCBzeW50aC4gKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRWaWE6IFRvb2xjaGFpblJlc29sdmVkVmlhO1xufVxuXG4vKiogV2hldGhlciBhIG1hbmlmZXN0IGVudHJ5IGlzIHRoZSB7QGxpbmsgQnVpbGRJbWFnZU1hbmlmZXN0RW50cnl9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnVpbGRJbWFnZUVudHJ5KGVudHJ5OiBTdGVwTWFuaWZlc3RFbnRyeSk6IGVudHJ5IGlzIEJ1aWxkSW1hZ2VNYW5pZmVzdEVudHJ5IHtcbiAgcmV0dXJuIChlbnRyeSBhcyB7IGtpbmQ/OiB1bmtub3duIH0pLmtpbmQgPT09ICdidWlsZC1pbWFnZSdcbiAgICB8fCAoZW50cnkuc3RhZ2VOYW1lID09PSBCVUlMRF9JTUFHRV9NQU5JRkVTVF9TVEFHRSAmJiBlbnRyeS5hY3Rpb25OYW1lID09PSBCVUlMRF9JTUFHRV9NQU5JRkVTVF9BQ1RJT04pO1xufVxuXG4vKiogVGhlIHBsdWdpbiBmaWVsZHMge0BsaW5rIHBsdWdpbkltYWdlUmVwb3NpdG9yeX0gcmVhZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkltYWdlUmVmIHtcbiAgcmVhZG9ubHkgb3JnSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBidWlsZFR5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIFJlZ2lzdHJ5IHJlcG9zaXRvcnkgYW4gb3JnLW93bmVkIHBsdWdpbiBST1cncyBpbWFnZSBsaXZlcyBhdFxuICogKGA8bmFtZXNwYWNlPi88bmFtZT5gLCBubyBob3N0LCBubyBkaWdlc3QpOiB0aGUgc3lzdGVtIG9yZydzIHVuZGVyXG4gKiBgc3lzdGVtL2AsIGEgdGVuYW50J3MgdW5kZXIgYG9yZy08b3JnSWQ+L2AuIE11c3QgbWF0Y2ggdGhlIHB1c2ggc2lkZVxuICogKGFwaS9wbHVnaW4gYHBsdWdpblVyaWApLiBSZXR1cm5zIG51bGwgZm9yIGEgYG1ldGFkYXRhX29ubHlgIHBsdWdpbi5cbiAqXG4gKiBPbmx5IGZvciByb3dzIHRoZSBjYWxsZXIncyBvcmcgcmVzb2x2ZXMgYXMgaXRzIE9XTiAob3IgaXRzIHBhcmVudCdzKTogdGhlXG4gKiBwbHVnaW4gbG9va3VwIHN0YW1wcyBpdCBhcyB0aGUgcmVjb3JkJ3MgYGltYWdlUmVwb3NpdG9yeWAuIEEgbGlzdGVkIHBsdWdpbidzXG4gKiByZXBvc2l0b3J5IGlzIGl0cyBsaXN0aW5nIHZlcnNpb24ncyBgcHVibGljLzxwdWJsaXNoZXI+LzxuYW1lPmAgY29weSDigJRcbiAqIHN5bnRoIG5ldmVyIGRlcml2ZXMgYSByZXBvc2l0b3J5IGl0c2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpbkltYWdlUmVwb3NpdG9yeShwbHVnaW46IFBsdWdpbkltYWdlUmVmKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChwbHVnaW4uYnVpbGRUeXBlID09PSAnbWV0YWRhdGFfb25seScpIHJldHVybiBudWxsO1xuICBjb25zdCBuYW1lc3BhY2UgPSBwbHVnaW4ub3JnSWQgPT09IFNZU1RFTV9PUkdfSUQgPyAnc3lzdGVtJyA6IGBvcmctJHtwbHVnaW4ub3JnSWR9YDtcbiAgcmV0dXJuIGAke25hbWVzcGFjZX0vJHtwbHVnaW4ubmFtZX1gO1xufVxuXG4vKiogQSBwbHVnaW4gaW1hZ2UgcmVwb3NpdG9yeSBsb29rdXAgbWF5IHJldHVybjogYHB1YmxpYy88cHVibGlzaGVyPi88bmFtZT5gLCBgb3JnLTxpZD4vPG5hbWU+YCBvciBgc3lzdGVtLzxuYW1lPmAuICovXG5leHBvcnQgY29uc3QgUExVR0lOX0lNQUdFX1JFUE9TSVRPUllfUkUgPSAvXig/OnB1YmxpY1xcL1thLXowLTldKyg/Oi1bYS16MC05XSspKnxvcmctW2EtejAtOV1bYS16MC05LV0qfHN5c3RlbSlcXC9bYS16MC05XVthLXowLTkuXy1dKiQvO1xuIl19
|