@pipeline-builder/pipeline-core 4.4.2 → 4.4.4
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/app-config.d.ts +1 -0
- package/lib/config/app-config.js +7 -1
- package/lib/config/config-types.d.ts +9 -0
- package/lib/config/config-types.js +1 -1
- package/lib/config/handler-constants.d.ts +7 -0
- package/lib/config/handler-constants.js +8 -1
- package/lib/config/infrastructure-config.js +2 -1
- package/lib/core/audit-correlation.d.ts +34 -0
- package/lib/core/audit-correlation.js +50 -0
- package/lib/core/pipeline-helpers.js +50 -6
- package/lib/core/pipeline-registration.d.ts +25 -0
- package/lib/core/pipeline-registration.js +28 -0
- package/lib/core/platform-tls.d.ts +43 -0
- package/lib/core/platform-tls.js +70 -0
- package/lib/core/plugin-contract.d.ts +8 -0
- package/lib/core/plugin-contract.js +15 -3
- package/lib/core/plugin-lookup-envelope.d.ts +30 -2
- package/lib/core/plugin-lookup-envelope.js +58 -7
- package/lib/core/quota-exceeded.d.ts +11 -0
- package/lib/core/quota-exceeded.js +44 -0
- package/lib/core/runtime-check.d.ts +53 -0
- package/lib/core/runtime-check.js +56 -0
- package/lib/core/security-reports.d.ts +26 -0
- package/lib/core/security-reports.js +28 -0
- package/lib/core/step-manifest.d.ts +7 -0
- package/lib/core/step-manifest.js +1 -1
- package/lib/core/synth-failure.d.ts +38 -0
- package/lib/core/synth-failure.js +63 -0
- package/lib/handlers/plugin-lookup-handler.d.ts +19 -2
- package/lib/handlers/plugin-lookup-handler.js +107 -17
- package/lib/index.d.ts +9 -2
- package/lib/index.js +10 -3
- package/lib/pipeline/pipeline-builder.js +55 -8
- package/lib/pipeline/plugin-lookup.d.ts +18 -1
- package/lib/pipeline/plugin-lookup.js +28 -7
- package/lib/pipeline/runtime-vuln-check-step.d.ts +29 -0
- package/lib/pipeline/runtime-vuln-check-step.js +36 -0
- package/lib/pipeline/stage-builder.d.ts +9 -0
- package/lib/pipeline/stage-builder.js +28 -7
- package/lib/pipeline/step-manifest-recorder.d.ts +2 -2
- package/lib/pipeline/step-manifest-recorder.js +8 -6
- package/lib/testing/exports.json +35 -0
- package/package.json +5 -4
|
@@ -137,6 +137,18 @@ function toRef(raw, path, label) {
|
|
|
137
137
|
...(filter ? { filter } : {}),
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* THE step label: `synth` for the synth step, else
|
|
142
|
+
* `<stageName>/<alias ?? [<publisher>/]name>`. Every per-step record keys on it —
|
|
143
|
+
* the lookup `context.stepKeys` synth sends (CLI pre-resolver and the deploy-time
|
|
144
|
+
* custom resource), the step manifest, the runtime check, the declared
|
|
145
|
+
* resolution rows and the pipeline security view that joins them.
|
|
146
|
+
*/
|
|
147
|
+
export function pluginStepLabel(stageName, ref) {
|
|
148
|
+
if (stageName === null)
|
|
149
|
+
return 'synth';
|
|
150
|
+
return `${stageName}/${ref.alias ?? (ref.publisher ? `${ref.publisher}/${ref.name}` : ref.name)}`;
|
|
151
|
+
}
|
|
140
152
|
/**
|
|
141
153
|
* Every plugin reference in a pipeline's props: `synth.plugin`, then each
|
|
142
154
|
* `stages[].steps[].plugin` in order. One entry per STEP (not de-duplicated) —
|
|
@@ -145,7 +157,7 @@ function toRef(raw, path, label) {
|
|
|
145
157
|
export function collectPluginSteps(props) {
|
|
146
158
|
const p = asRecord(props);
|
|
147
159
|
const out = [];
|
|
148
|
-
const synth = toRef(asRecord(p.synth).plugin, 'synth', () =>
|
|
160
|
+
const synth = toRef(asRecord(p.synth).plugin, 'synth', (name) => pluginStepLabel(null, { name }));
|
|
149
161
|
if (synth)
|
|
150
162
|
out.push(synth);
|
|
151
163
|
const stages = Array.isArray(p.stages) ? p.stages : [];
|
|
@@ -154,7 +166,7 @@ export function collectPluginSteps(props) {
|
|
|
154
166
|
const stageName = typeof s.stageName === 'string' ? s.stageName : `stage ${i + 1}`;
|
|
155
167
|
const steps = Array.isArray(s.steps) ? s.steps : [];
|
|
156
168
|
steps.forEach((step, j) => {
|
|
157
|
-
const ref = toRef(asRecord(step).plugin, `stages[${i}].steps[${j}]`, (name, alias, publisher) =>
|
|
169
|
+
const ref = toRef(asRecord(step).plugin, `stages[${i}].steps[${j}]`, (name, alias, publisher) => pluginStepLabel(stageName, { name, alias, publisher }));
|
|
158
170
|
if (ref)
|
|
159
171
|
out.push(ref);
|
|
160
172
|
});
|
|
@@ -214,4 +226,4 @@ export function pluginStepIdAlias(plugin) {
|
|
|
214
226
|
// `??`, not `||`: an explicit (even empty) alias keeps the id it always had.
|
|
215
227
|
return plugin.alias ?? (plugin.publisher ? `${sanitizePublisher(plugin.publisher)}-${plugin.name}` : plugin.name);
|
|
216
228
|
}
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFzQzlDLFNBQVMsUUFBUSxDQUFDLENBQVU7SUFDMUIsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBNEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQXlCO0lBQzdELE9BQU8sS0FBSyxDQUNWLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFpQixFQUN0QyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQWlCLEVBQzNELFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBaUIsQ0FDekQsQ0FBQztBQUNKLENBQUM7QUFFRCxvRkFBb0Y7QUFDcEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQXlCO0lBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNoRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLDhCQUE4QixDQUFDLGFBQWdEO0lBQzdGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEQs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QUFDO0lBQ3RDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQztBQUNuSCxDQUFDO0FBVUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFNBQWlCO0lBQ2pELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQXlCO0lBQ3pELDZFQUE2RTtJQUM3RSxPQUFPLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGx1Z2luIGNvbnRyYWN0IGVuZm9yY2VtZW50LiBBIHBsdWdpbiBzcGVjIGRlY2xhcmVzXG4gKiB0aGUgYHt7IHBpcGVsaW5lLm1ldGFkYXRhLlggfX1gIC8gYHt7IHBpcGVsaW5lLnZhcnMuWCB9fWAga2V5cyBhIHBpcGVsaW5lXG4gKiBtdXN0IHN1cHBseSAoYHJlcXVpcmVkTWV0YWRhdGFgIC8gYHJlcXVpcmVkVmFyc2ApIGFuZCB0aGUgY29lcmNpb24gdHlwZSBvZlxuICogZWFjaCAoYG1ldGFkYXRhVHlwZXNgIC8gYHZhcnNUeXBlc2ApLiBUaGUgdXBsb2FkIHZhbGlkYXRlcyB0aGUgc3BlYyBhZ2FpbnN0XG4gKiBpdHMgb3duIHRlbXBsYXRlczsgdGhpcyBtb2R1bGUgY2hlY2tzIGEgUElQRUxJTkUgYWdhaW5zdCB0aGUgY29udHJhY3RzIG9mXG4gKiB0aGUgcGx1Z2lucyBpdCByZWZlcmVuY2VzLlxuICpcbiAqIENESy1mcmVlOiBzaGFyZWQgYnkgdGhlIHBpcGVsaW5lIHNlcnZpY2UgKGNyZWF0ZSAvIHVwZGF0ZSDihpIgNDAwIGxpc3RpbmdcbiAqIGV2ZXJ5IHByb2JsZW0gcGVyIHN0ZXApIGFuZCB0aGUgc3ludGggKGZhaWwgZmFzdCBmb3IgYSBwaXBlbGluZSB0aGF0IG5ldmVyXG4gKiB3ZW50IHRocm91Z2ggdGhlIEFQSSwgZS5nLiBhIENMSS1hdXRob3JlZCBwcm9wcyBmaWxlKS5cbiAqXG4gKiBUaGUgY2hlY2tzIG1pcnJvciB0aGUgdGVtcGxhdGUgZXZhbHVhdG9yIChgdGVtcGxhdGUvZXZhbHVhdG9yLnRzYCkgZXhhY3RseSxcbiAqIHNvIFwicGFzc2VzIGhlcmVcIiBtZWFucyBcInJlc29sdmVzIGF0IHN5bnRoXCI6XG4gKiAgIC0gYSBrZXkgaXMgTUlTU0lORyB3aGVuIGFic2VudCwgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICh0aGUgZXZhbHVhdG9yXG4gKiAgICAgZmFsbHMgdG8gYHwgZGVmYXVsdDpgIG9yIGZhaWxzIGZvciBhbGwgdGhyZWUpO1xuICogICAtIGFuIG9iamVjdC9hcnJheSB2YWx1ZSBuZXZlciBpbnRlcnBvbGF0ZXM7XG4gKiAgIC0gYG51bWJlcmAgLyBgYm9vbGAgLyBganNvbmAgYWNjZXB0IHdoYXQgdGhlIGB8IG51bWJlcmAgLyBgfCBib29sYCAvXG4gKiAgICAgYHwganNvbmAgZmlsdGVycyBhY2NlcHQgYWZ0ZXIgc3RyaW5naWZpY2F0aW9uLlxuICovXG5cbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi9tZXRhZGF0YS1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgTWV0YURhdGFUeXBlIH0gZnJvbSAnLi9waXBlbGluZS10eXBlcy5qcyc7XG5cbi8qKiBEZWNsYXJlZCBjb2VyY2lvbiB0eXBlIG9mIGEgY29udHJhY3Qga2V5LiAqL1xuZXhwb3J0IHR5cGUgQ29udHJhY3RWYWx1ZVR5cGUgPSAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2wnIHwgJ2pzb24nO1xuXG4vKiogVGhlIGNvbnRyYWN0IGZpZWxkcyBvZiBhIHBsdWdpbiByZWNvcmQgKGFzIGBwbHVnaW5zYCBzdG9yZXMgdGhlbSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbnRyYWN0IHtcbiAgcmVhZG9ubHkgcmVxdWlyZWRNZXRhZGF0YT86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbDtcbiAgcmVhZG9ubHkgcmVxdWlyZWRWYXJzPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsO1xuICByZWFkb25seSBtZXRhZGF0YVR5cGVzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ29udHJhY3RWYWx1ZVR5cGU+PiB8IG51bGw7XG4gIHJlYWRvbmx5IHZhcnNUeXBlcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENvbnRyYWN0VmFsdWVUeXBlPj4gfCBudWxsO1xufVxuXG4vKiogV2hhdCBge3sgcGlwZWxpbmUubWV0YWRhdGEuKiB9fWAgYW5kIGB7eyBwaXBlbGluZS52YXJzLiogfX1gIHJlc29sdmUgYWdhaW5zdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RTY29wZSB7XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIHJlYWRvbmx5IHZhcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuLyoqIE9uZSB1bm1ldCBjb250cmFjdCBrZXkuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyYWN0SXNzdWUge1xuICByZWFkb25seSBraW5kOiAnbWV0YWRhdGEnIHwgJ3ZhcnMnO1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvYmxlbTogJ21pc3NpbmcnIHwgJ3R5cGUnO1xuICAvKiogVGhlIGRlY2xhcmVkIHR5cGUsIGZvciBhIGB0eXBlYCBwcm9ibGVtLiAqL1xuICByZWFkb25seSBleHBlY3RlZD86IENvbnRyYWN0VmFsdWVUeXBlO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgcGlwZWxpbmUtcHJvcHMgZmllbGRzIHRoZSBjb250cmFjdCBzY29wZSBpcyBidWlsdCBmcm9tIChCdWlsZGVyUHJvcHMgc3Vic2V0KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RTY29wZVByb3BzIHtcbiAgcmVhZG9ubHkgZ2xvYmFsPzogdW5rbm93bjtcbiAgcmVhZG9ubHkgZGVmYXVsdHM/OiB1bmtub3duO1xuICByZWFkb25seSBzeW50aD86IHVua25vd247XG4gIHJlYWRvbmx5IHZhcnM/OiB1bmtub3duO1xufVxuXG5mdW5jdGlvbiBhc1JlY29yZCh2OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodikgPyB2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IDoge307XG59XG5cbi8qKlxuICogYHBpcGVsaW5lLm1ldGFkYXRhYCBhcyBzeW50aCBidWlsZHMgaXQ6IGBnbG9iYWxgIOKGkCBgZGVmYXVsdHMubWV0YWRhdGFgIOKGkFxuICogYHN5bnRoLm1ldGFkYXRhYCAobGFzdCB3aW5zKS4gVGhlIHNpbmdsZSBkZWZpbml0aW9uIOKAlCBgUGlwZWxpbmVDb25maWd1cmF0aW9uYFxuICogdXNlcyBpdCB0b28sIHNvIHRoZSBBUEkgY2hlY2sgYW5kIHRoZSBzeW50aCBzY29wZSBjYW5ub3QgZHJpZnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaXBlbGluZVNjb3BlTWV0YWRhdGEocHJvcHM6IENvbnRyYWN0U2NvcGVQcm9wcyk6IE1ldGFEYXRhVHlwZSB7XG4gIHJldHVybiBtZXJnZShcbiAgICBhc1JlY29yZChwcm9wcy5nbG9iYWwpIGFzIE1ldGFEYXRhVHlwZSxcbiAgICBhc1JlY29yZChhc1JlY29yZChwcm9wcy5kZWZhdWx0cykubWV0YWRhdGEpIGFzIE1ldGFEYXRhVHlwZSxcbiAgICBhc1JlY29yZChhc1JlY29yZChwcm9wcy5zeW50aCkubWV0YWRhdGEpIGFzIE1ldGFEYXRhVHlwZSxcbiAgKTtcbn1cblxuLyoqIFRoZSBjb250cmFjdCBzY29wZSBvZiBhIHBpcGVsaW5lJ3MgcHJvcHMgKHNlZSB7QGxpbmsgcGlwZWxpbmVTY29wZU1ldGFkYXRhfSkuICovXG5leHBvcnQgZnVuY3Rpb24gcGlwZWxpbmVDb250cmFjdFNjb3BlKHByb3BzOiBDb250cmFjdFNjb3BlUHJvcHMpOiBDb250cmFjdFNjb3BlIHtcbiAgcmV0dXJuIHsgbWV0YWRhdGE6IHBpcGVsaW5lU2NvcGVNZXRhZGF0YShwcm9wcyksIHZhcnM6IGFzUmVjb3JkKHByb3BzLnZhcnMpIH07XG59XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IHNjb3BlIGluc2lkZSBhIHN5bnRoIHRlbXBsYXRlIHNjb3BlIChgeyBwaXBlbGluZTogeyBtZXRhZGF0YSxcbiAqIHZhcnMsIOKApiB9IH1gLCBzZWUgYFBpcGVsaW5lQ29uZmlndXJhdGlvbi5nZXRQaXBlbGluZVNjb3BlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUodGVtcGxhdGVTY29wZTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogQ29udHJhY3RTY29wZSB7XG4gIGNvbnN0IHBpcGVsaW5lID0gYXNSZWNvcmQodGVtcGxhdGVTY29wZS5waXBlbGluZSk7XG4gIHJldHVybiB7IG1ldGFkYXRhOiBhc1JlY29yZChwaXBlbGluZS5tZXRhZGF0YSksIHZhcnM6IGFzUmVjb3JkKHBpcGVsaW5lLnZhcnMpIH07XG59XG5cbi8qKiBXb3VsZCB0aGUgZXZhbHVhdG9yIHRyZWF0IGB2YWx1ZWAgYXMgYWJzZW50IChtaXNzaW5nIC8gbnVsbCAvIGVtcHR5IHN0cmluZyk/ICovXG5mdW5jdGlvbiBpc01pc3NpbmcodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnO1xufVxuXG4vKipcbiAqIERvZXMgYHZhbHVlYCBzYXRpc2Z5IHRoZSBkZWNsYXJlZCBgdHlwZWAgb25jZSBpbnRlcnBvbGF0ZWQ/IE1pcnJvcnMgdGhlXG4gKiBldmFsdWF0b3IncyBgcmVzb2x2ZU9uZWAgKG9iamVjdHMgbmV2ZXIgaW50ZXJwb2xhdGUpIGFuZCBgYXBwbHlDb2VyY2lvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRyYWN0VmFsdWVPZlR5cGUodmFsdWU6IHVua25vd24sIHR5cGU6IENvbnRyYWN0VmFsdWVUeXBlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJhdyA9IFN0cmluZyh2YWx1ZSk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShOdW1iZXIocmF3KSk7XG4gICAgY2FzZSAnYm9vbCc6XG4gICAgICByZXR1cm4gWyd0cnVlJywgJzEnLCAneWVzJywgJ2ZhbHNlJywgJzAnLCAnbm8nLCAnJ10uaW5jbHVkZXMocmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjYXNlICdqc29uJzpcbiAgICAgIHRyeSB7XG4gICAgICAgIEpTT04ucGFyc2UocmF3KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICB9XG59XG5cbi8qKiBBIHZhbHVlIHN0aWxsIGNhcnJ5aW5nIGB7eyDigKYgfX1gIGlzIHJlc29sdmVkIGxhdGVyIChwaXBlbGluZSBwYXNzIDEpLCBzbyBpdHMgdHlwZSBjYW4ndCBiZSBqdWRnZWQgeWV0LiAqL1xuZnVuY3Rpb24gaXNVbnJlc29sdmVkVGVtcGxhdGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuaW5jbHVkZXMoJ3t7Jyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrS2luZChcbiAga2luZDogJ21ldGFkYXRhJyB8ICd2YXJzJyxcbiAgcmVxdWlyZWQ6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdHlwZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENvbnRyYWN0VmFsdWVUeXBlPj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBzdXBwbGllZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuKTogQ29udHJhY3RJc3N1ZVtdIHtcbiAgY29uc3QgaXNzdWVzOiBDb250cmFjdElzc3VlW10gPSBbXTtcbiAgY29uc3Qgd2hlcmUgPSBraW5kID09PSAnbWV0YWRhdGEnID8gJ21ldGFkYXRhIChnbG9iYWwgLyBkZWZhdWx0cy5tZXRhZGF0YSAvIHN5bnRoLm1ldGFkYXRhKScgOiAndmFycyc7XG4gIGZvciAoY29uc3Qga2V5IG9mIG5ldyBTZXQocmVxdWlyZWQgPz8gW10pKSB7XG4gICAgaWYgKGlzTWlzc2luZyhzdXBwbGllZFtrZXldKSkge1xuICAgICAgaXNzdWVzLnB1c2goeyBraW5kLCBrZXksIHByb2JsZW06ICdtaXNzaW5nJywgbWVzc2FnZTogYHBpcGVsaW5lICR7d2hlcmV9IG11c3Qgc3VwcGx5ICcke2tleX0nYCB9KTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCBleHBlY3RlZF0gb2YgT2JqZWN0LmVudHJpZXModHlwZXMgPz8ge30pKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdXBwbGllZFtrZXldO1xuICAgIGlmIChpc01pc3NpbmcodmFsdWUpIHx8IGlzVW5yZXNvbHZlZFRlbXBsYXRlKHZhbHVlKSkgY29udGludWU7XG4gICAgaWYgKCFpc0NvbnRyYWN0VmFsdWVPZlR5cGUodmFsdWUsIGV4cGVjdGVkKSkge1xuICAgICAgY29uc3QgZ290ID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IChBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhbiBhcnJheScgOiAnYW4gb2JqZWN0JykgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICBpc3N1ZXMucHVzaCh7IGtpbmQsIGtleSwgcHJvYmxlbTogJ3R5cGUnLCBleHBlY3RlZCwgbWVzc2FnZTogYHBpcGVsaW5lICR7a2luZH0uJHtrZXl9IG11c3QgYmUgYSAke2V4cGVjdGVkfSwgZ290ICR7Z290fWAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpc3N1ZXM7XG59XG5cbi8qKlxuICogQ2hlY2sgb25lIHBsdWdpbidzIGNvbnRyYWN0IGFnYWluc3QgdGhlIHBpcGVsaW5lJ3Mgc2NvcGUuIFJldHVybnMgZXZlcnlcbiAqIGlzc3VlIChtaXNzaW5nIGtleXMgZmlyc3QsIHRoZW4gaWxsLXR5cGVkIG9uZXMsIG1ldGFkYXRhIGJlZm9yZSB2YXJzKTtcbiAqIGVtcHR5IHdoZW4gdGhlIGNvbnRyYWN0IGlzIG1ldC4gRGVjbGFyZWQgdHlwZXMgYXJlIGNoZWNrZWQgZm9yIGV2ZXJ5XG4gKiBTVVBQTElFRCBrZXksIHJlcXVpcmVkIG9yIG5vdCAoYW4gb3B0aW9uYWwga2V5IHdpdGggYSBgfCBkZWZhdWx0OmAgaXMgc3RpbGxcbiAqIGNvZXJjZWQgd2hlbiBpdCBpcyBzdXBwbGllZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BsdWdpbkNvbnRyYWN0KGNvbnRyYWN0OiBQbHVnaW5Db250cmFjdCwgc2NvcGU6IENvbnRyYWN0U2NvcGUpOiBDb250cmFjdElzc3VlW10ge1xuICByZXR1cm4gW1xuICAgIC4uLmNoZWNrS2luZCgnbWV0YWRhdGEnLCBjb250cmFjdC5yZXF1aXJlZE1ldGFkYXRhLCBjb250cmFjdC5tZXRhZGF0YVR5cGVzLCBzY29wZS5tZXRhZGF0YSksXG4gICAgLi4uY2hlY2tLaW5kKCd2YXJzJywgY29udHJhY3QucmVxdWlyZWRWYXJzLCBjb250cmFjdC52YXJzVHlwZXMsIHNjb3BlLnZhcnMpLFxuICBdO1xufVxuXG4vKipcbiAqIFN5bnRoLXRpbWUgZ3VhcmQ6IHRocm93IHdoZW4gYHBsdWdpbmAgKHJlc29sdmVkIGZvciBgc3RlcGApIGhhcyB1bm1ldFxuICogY29udHJhY3Qga2V5cy4gVGhlIEFQSSByZWZ1c2VzIHN1Y2ggYSBwaXBlbGluZSBhdCBjcmVhdGUvdXBkYXRlOyB0aGlzXG4gKiBjYXRjaGVzIG9uZSB0aGF0IHJlYWNoZWQgc3ludGggYW5vdGhlciB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQbHVnaW5Db250cmFjdChcbiAgcGx1Z2luOiBQbHVnaW5Db250cmFjdCAmIHsgcmVhZG9ubHkgbmFtZTogc3RyaW5nOyByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nIH0sXG4gIHNjb3BlOiBDb250cmFjdFNjb3BlLFxuICBzdGVwOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3QgaXNzdWVzID0gY2hlY2tQbHVnaW5Db250cmFjdChwbHVnaW4sIHNjb3BlKTtcbiAgaWYgKGlzc3Vlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBTdGVwIFwiJHtzdGVwfVwiIHVzZXMgcGx1Z2luIFwiJHtwbHVnaW4ubmFtZX0ke3BsdWdpbi52ZXJzaW9uID8gYEAke3BsdWdpbi52ZXJzaW9ufWAgOiAnJ31cIiB3aG9zZSBjb250cmFjdCBpcyBub3QgbWV0OlxcbmBcbiAgICArIGlzc3Vlcy5tYXAoKGkpID0+IGAgIOKAoiAke2kubWVzc2FnZX1gKS5qb2luKCdcXG4nKSxcbiAgKTtcbn1cblxuLyoqIEEgcGx1Z2luIHJlZmVyZW5jZSBpbiBwaXBlbGluZSBwcm9wcywgd2l0aCB3aGVyZSBpdCBzaXRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdGVwUmVmIHtcbiAgLyoqIEpTT04gcGF0aCBvZiB0aGUgc3RlcDogYHN5bnRoYCBvciBgc3RhZ2VzW2ldLnN0ZXBzW2pdYC4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKiogSHVtYW4gbGFiZWw6IGBzeW50aGAgb3IgYDxzdGFnZU5hbWU+LzxhbGlhcyA/PyBuYW1lPmAuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFB1Ymxpc2hlciBoYW5kbGUgb2YgYW4gaW5zdGFsbGVkIGxpc3RpbmcuICovXG4gIHJlYWRvbmx5IHB1Ymxpc2hlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZpbHRlcj86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuZnVuY3Rpb24gdG9SZWYocmF3OiB1bmtub3duLCBwYXRoOiBzdHJpbmcsIGxhYmVsOiAobmFtZTogc3RyaW5nLCBhbGlhcz86IHN0cmluZywgcHVibGlzaGVyPzogc3RyaW5nKSA9PiBzdHJpbmcpOiBQbHVnaW5TdGVwUmVmIHwgbnVsbCB7XG4gIGNvbnN0IHIgPSBhc1JlY29yZChyYXcpO1xuICBpZiAodHlwZW9mIHIubmFtZSAhPT0gJ3N0cmluZycgfHwgci5uYW1lLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFsaWFzID0gdHlwZW9mIHIuYWxpYXMgPT09ICdzdHJpbmcnID8gci5hbGlhcyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcHVibGlzaGVyID0gdHlwZW9mIHIucHVibGlzaGVyID09PSAnc3RyaW5nJyAmJiByLnB1Ymxpc2hlci5sZW5ndGggPiAwID8gci5wdWJsaXNoZXIgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbHRlciA9IHIuZmlsdGVyICYmIHR5cGVvZiByLmZpbHRlciA9PT0gJ29iamVjdCcgPyByLmZpbHRlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBwYXRoLFxuICAgIGxhYmVsOiBsYWJlbChyLm5hbWUsIGFsaWFzLCBwdWJsaXNoZXIpLFxuICAgIG5hbWU6IHIubmFtZSxcbiAgICAuLi4ocHVibGlzaGVyID8geyBwdWJsaXNoZXIgfSA6IHt9KSxcbiAgICAuLi4oYWxpYXMgPyB7IGFsaWFzIH0gOiB7fSksXG4gICAgLi4uKGZpbHRlciA/IHsgZmlsdGVyIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogRXZlcnkgcGx1Z2luIHJlZmVyZW5jZSBpbiBhIHBpcGVsaW5lJ3MgcHJvcHM6IGBzeW50aC5wbHVnaW5gLCB0aGVuIGVhY2hcbiAqIGBzdGFnZXNbXS5zdGVwc1tdLnBsdWdpbmAgaW4gb3JkZXIuIE9uZSBlbnRyeSBwZXIgU1RFUCAobm90IGRlLWR1cGxpY2F0ZWQpIOKAlFxuICogdGhlIGNvbnRyYWN0IHJlc3VsdCBpcyByZXBvcnRlZCBwZXIgc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RQbHVnaW5TdGVwcyhwcm9wczogdW5rbm93bik6IFBsdWdpblN0ZXBSZWZbXSB7XG4gIGNvbnN0IHAgPSBhc1JlY29yZChwcm9wcyk7XG4gIGNvbnN0IG91dDogUGx1Z2luU3RlcFJlZltdID0gW107XG4gIGNvbnN0IHN5bnRoID0gdG9SZWYoYXNSZWNvcmQocC5zeW50aCkucGx1Z2luLCAnc3ludGgnLCAoKSA9PiAnc3ludGgnKTtcbiAgaWYgKHN5bnRoKSBvdXQucHVzaChzeW50aCk7XG4gIGNvbnN0IHN0YWdlcyA9IEFycmF5LmlzQXJyYXkocC5zdGFnZXMpID8gcC5zdGFnZXMgOiBbXTtcbiAgc3RhZ2VzLmZvckVhY2goKHN0YWdlLCBpKSA9PiB7XG4gICAgY29uc3QgcyA9IGFzUmVjb3JkKHN0YWdlKTtcbiAgICBjb25zdCBzdGFnZU5hbWUgPSB0eXBlb2Ygcy5zdGFnZU5hbWUgPT09ICdzdHJpbmcnID8gcy5zdGFnZU5hbWUgOiBgc3RhZ2UgJHtpICsgMX1gO1xuICAgIGNvbnN0IHN0ZXBzID0gQXJyYXkuaXNBcnJheShzLnN0ZXBzKSA/IHMuc3RlcHMgOiBbXTtcbiAgICBzdGVwcy5mb3JFYWNoKChzdGVwLCBqKSA9PiB7XG4gICAgICBjb25zdCByZWYgPSB0b1JlZihhc1JlY29yZChzdGVwKS5wbHVnaW4sIGBzdGFnZXNbJHtpfV0uc3RlcHNbJHtqfV1gLFxuICAgICAgICAobmFtZSwgYWxpYXMsIHB1Ymxpc2hlcikgPT4gYCR7c3RhZ2VOYW1lfS8ke2FsaWFzID8/IChwdWJsaXNoZXIgPyBgJHtwdWJsaXNoZXJ9LyR7bmFtZX1gIDogbmFtZSl9YCk7XG4gICAgICBpZiAocmVmKSBvdXQucHVzaChyZWYpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUaGUgbG9va3VwIGZpbHRlciBzeW50aCBzZW5kcyBmb3IgYSByZWZlcmVuY2UgKHBpcGVsaW5lLW1hbmFnZXJcbiAqIGByZXNvbHZlUGx1Z2luc0ZvclByb3BzYCwgdGhlIGRlcGxveS10aW1lIGN1c3RvbSByZXNvdXJjZSwgdGhlIHBpcGVsaW5lXG4gKiBzZXJ2aWNlJ3MgY29udHJhY3QgY2hlY2spOiB0aGUgcmVmJ3MgbmFtZSDigJQgYW5kIGl0cyBgcHVibGlzaGVyYCwgd2hpY2hcbiAqIHJvdXRlcyB0aGUgbG9va3VwIHRvIHRoYXQgcHVibGlzaGVyJ3MgaW5zdGFsbGVkIGxpc3Rpbmcg4oCUIG92ZXJsYWlkIGJ5XG4gKiBhbiBleHBsaWNpdCBgZmlsdGVyYCAod2hvc2UgYG5hbWVgIHdpbnMpLCBlbHNlIHRoZSBkZWZhdWx0IGFjdGl2ZStkZWZhdWx0XG4gKiB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luTG9va3VwRmlsdGVyKHJlZjogUGljazxQbHVnaW5TdGVwUmVmLCAnbmFtZScgfCAnZmlsdGVyJyB8ICdwdWJsaXNoZXInPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiByZWYubmFtZSxcbiAgICAuLi4ocmVmLnB1Ymxpc2hlciA/IHsgcHVibGlzaGVyOiByZWYucHVibGlzaGVyIH0gOiB7fSksXG4gICAgLi4uKHJlZi5maWx0ZXIgPz8geyBpc0FjdGl2ZTogdHJ1ZSwgaXNEZWZhdWx0OiB0cnVlIH0pLFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVmZXJlbmNlIGlkZW50aXR5IChDREstZnJlZTogdGhlIENMSSwgdGhlIHBpcGVsaW5lIHNlcnZpY2UgYW5kIHN5bnRoIHNoYXJlIGl0KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUaGUgcGx1Z2luLWFsaWFzIFNFR01FTlQgb2YgYW4gYXJ0aWZhY3Qga2V5IOKAlCBhbmQgdGhlIHJlc29sdmVyJ3MgY2FjaGUga2V5OlxuICogdGhlIGV4cGxpY2l0IGFsaWFzLCBvciBgJHtuYW1lfS1hbGlhc2Agd2hlbiB0aGVyZSBpcyBub25lXG4gKiAoYCR7cHVibGlzaGVyfS0ke25hbWV9LWFsaWFzYCBmb3IgYSBxdWFsaWZpZWQgcmVmZXJlbmNlKS4gVEhFIHJ1bGUg4oCUIHRoZSBmcm9udGVuZCdzIGFydGlmYWN0IHBpY2tlclxuICogKGBmcm9udGVuZC9zcmMvbGliL2FydGlmYWN0LWtleXMudHNgKSwgdGhlIENMSSdzIHByZS1yZXNvbHZlciBhbmRcbiAqIGBQbHVnaW5Mb29rdXAubm9ybWFsaXplYCBhbGwgYnVpbGQga2V5cyB0aGlzIHdheS5cbiAqXG4gKiBUaGUgcGxhY2VzIHRoYXQgUkVHSVNURVIga2V5cyBtdXN0IHVzZSBpdCB0b286IGEgc3RhZ2Ugc3RlcCByZWdpc3RlcmluZyB0aGVcbiAqIGJhcmUgbmFtZSAoYG5vZGVqcy1idWlsZGApIG9yIGEgc3ludGggc3RlcCBzdWZmaXhpbmcgYW4gZXhwbGljaXQgYWxpYXNcbiAqIChgbXktc3ludGgtYWxpYXNgKSB3b3VsZCBmYWlsIGFueSBVSS1waWNrZWQgaW5wdXQgYXJ0aWZhY3Qgd2l0aCBcIk5vIGFydGlmYWN0XG4gKiByZWdpc3RlcmVkXCIsIGJlY2F1c2UgdGhlIGtleSBpdCBhc2tzIGZvciBpcyBuZXZlciB0aGUga2V5IHRoYXQgd2FzIHN0b3JlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpbkFydGlmYWN0QWxpYXMocGx1Z2luOiBQbHVnaW5SZWZJZGVudGl0eSk6IHN0cmluZyB7XG4gIGlmIChwbHVnaW4uYWxpYXMpIHJldHVybiBwbHVnaW4uYWxpYXM7XG4gIHJldHVybiBwbHVnaW4ucHVibGlzaGVyID8gYCR7c2FuaXRpemVQdWJsaXNoZXIocGx1Z2luLnB1Ymxpc2hlcil9LSR7cGx1Z2luLm5hbWV9LWFsaWFzYCA6IGAke3BsdWdpbi5uYW1lfS1hbGlhc2A7XG59XG5cbi8qKiBUaGUgZmllbGRzIG9mIGEgcGx1Z2luIFJFRkVSRU5DRSB0aGF0IGlkZW50aWZ5IGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5SZWZJZGVudGl0eSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG4gIC8qKiBQdWJsaXNoZXIgaGFuZGxlIG9mIGFuIGluc3RhbGxlZCBsaXN0aW5nOyBhYnNlbnQgZm9yIGFuIHVucXVhbGlmaWVkIHJlZmVyZW5jZS4gKi9cbiAgcmVhZG9ubHkgcHVibGlzaGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcHVibGlzaGVyIGhhbmRsZSBhcyBpdCBtYXkgYXBwZWFyIGluIGEgY29uc3RydWN0IGlkIG9yIGEga2V5OiBvbmx5XG4gKiBgW0EtWmEtejAtOV8tXWAgKGhhbmRsZXMgYWxyZWFkeSBhcmU7IHRoaXMgaXMgdGhlIGd1YXJhbnRlZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZVB1Ymxpc2hlcihwdWJsaXNoZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwdWJsaXNoZXIucmVwbGFjZSgvW15BLVphLXowLTlfLV0vZywgJy0nKTtcbn1cblxuLyoqXG4gKiBUaGUgY29uc3RydWN0LWlkIHNlZ21lbnQgb2YgYSBwbHVnaW4gc3RlcDogdGhlIGV4cGxpY2l0IGFsaWFzLCBlbHNlXG4gKiBgPHB1Ymxpc2hlcj4tPG5hbWU+YCBmb3IgYSBxdWFsaWZpZWQgcmVmZXJlbmNlLCBlbHNlIHRoZSBiYXJlIG5hbWUg4oCUIHNvIGFcbiAqIHN0ZXAgdXNpbmcgYGFjbWVgJ3MgYGxpbnRgIGFuZCBvbmUgdXNpbmcgdGhlIG9yZydzIG93biBgbGludGAgbmV2ZXIgY29sbGlkZSxcbiAqIHdoaWxlIGFuIHVucXVhbGlmaWVkIHN0ZXAga2VlcHMgdGhlIGlkIGl0IGFsd2F5cyBoYWQgKHJlbmFtaW5nIGl0IHdvdWxkIG1ha2VcbiAqIENsb3VkRm9ybWF0aW9uIHJlcGxhY2UgaXRzIENvZGVCdWlsZCBwcm9qZWN0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpblN0ZXBJZEFsaWFzKHBsdWdpbjogUGx1Z2luUmVmSWRlbnRpdHkpOiBzdHJpbmcge1xuICAvLyBgPz9gLCBub3QgYHx8YDogYW4gZXhwbGljaXQgKGV2ZW4gZW1wdHkpIGFsaWFzIGtlZXBzIHRoZSBpZCBpdCBhbHdheXMgaGFkLlxuICByZXR1cm4gcGx1Z2luLmFsaWFzID8/IChwbHVnaW4ucHVibGlzaGVyID8gYCR7c2FuaXRpemVQdWJsaXNoZXIocGx1Z2luLnB1Ymxpc2hlcil9LSR7cGx1Z2luLm5hbWV9YCA6IHBsdWdpbi5uYW1lKTtcbn1cbiJdfQ==
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFzQzlDLFNBQVMsUUFBUSxDQUFDLENBQVU7SUFDMUIsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBNEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQXlCO0lBQzdELE9BQU8sS0FBSyxDQUNWLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFpQixFQUN0QyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQWlCLEVBQzNELFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBaUIsQ0FDekQsQ0FBQztBQUNKLENBQUM7QUFFRCxvRkFBb0Y7QUFDcEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQXlCO0lBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNoRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLDhCQUE4QixDQUFDLGFBQWdEO0lBQzdGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEQs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QUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RELEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDdkQsQ0FBQztBQUNKLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsa0ZBQWtGO0FBQ2xGLGdGQUFnRjtBQUVoRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUF5QjtJQUMzRCxJQUFJLE1BQU0sQ0FBQyxLQUFLO1FBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3RDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQztBQUNuSCxDQUFDO0FBVUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFNBQWlCO0lBQ2pELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQXlCO0lBQ3pELDZFQUE2RTtJQUM3RSxPQUFPLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGx1Z2luIGNvbnRyYWN0IGVuZm9yY2VtZW50LiBBIHBsdWdpbiBzcGVjIGRlY2xhcmVzXG4gKiB0aGUgYHt7IHBpcGVsaW5lLm1ldGFkYXRhLlggfX1gIC8gYHt7IHBpcGVsaW5lLnZhcnMuWCB9fWAga2V5cyBhIHBpcGVsaW5lXG4gKiBtdXN0IHN1cHBseSAoYHJlcXVpcmVkTWV0YWRhdGFgIC8gYHJlcXVpcmVkVmFyc2ApIGFuZCB0aGUgY29lcmNpb24gdHlwZSBvZlxuICogZWFjaCAoYG1ldGFkYXRhVHlwZXNgIC8gYHZhcnNUeXBlc2ApLiBUaGUgdXBsb2FkIHZhbGlkYXRlcyB0aGUgc3BlYyBhZ2FpbnN0XG4gKiBpdHMgb3duIHRlbXBsYXRlczsgdGhpcyBtb2R1bGUgY2hlY2tzIGEgUElQRUxJTkUgYWdhaW5zdCB0aGUgY29udHJhY3RzIG9mXG4gKiB0aGUgcGx1Z2lucyBpdCByZWZlcmVuY2VzLlxuICpcbiAqIENESy1mcmVlOiBzaGFyZWQgYnkgdGhlIHBpcGVsaW5lIHNlcnZpY2UgKGNyZWF0ZSAvIHVwZGF0ZSDihpIgNDAwIGxpc3RpbmdcbiAqIGV2ZXJ5IHByb2JsZW0gcGVyIHN0ZXApIGFuZCB0aGUgc3ludGggKGZhaWwgZmFzdCBmb3IgYSBwaXBlbGluZSB0aGF0IG5ldmVyXG4gKiB3ZW50IHRocm91Z2ggdGhlIEFQSSwgZS5nLiBhIENMSS1hdXRob3JlZCBwcm9wcyBmaWxlKS5cbiAqXG4gKiBUaGUgY2hlY2tzIG1pcnJvciB0aGUgdGVtcGxhdGUgZXZhbHVhdG9yIChgdGVtcGxhdGUvZXZhbHVhdG9yLnRzYCkgZXhhY3RseSxcbiAqIHNvIFwicGFzc2VzIGhlcmVcIiBtZWFucyBcInJlc29sdmVzIGF0IHN5bnRoXCI6XG4gKiAgIC0gYSBrZXkgaXMgTUlTU0lORyB3aGVuIGFic2VudCwgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICh0aGUgZXZhbHVhdG9yXG4gKiAgICAgZmFsbHMgdG8gYHwgZGVmYXVsdDpgIG9yIGZhaWxzIGZvciBhbGwgdGhyZWUpO1xuICogICAtIGFuIG9iamVjdC9hcnJheSB2YWx1ZSBuZXZlciBpbnRlcnBvbGF0ZXM7XG4gKiAgIC0gYG51bWJlcmAgLyBgYm9vbGAgLyBganNvbmAgYWNjZXB0IHdoYXQgdGhlIGB8IG51bWJlcmAgLyBgfCBib29sYCAvXG4gKiAgICAgYHwganNvbmAgZmlsdGVycyBhY2NlcHQgYWZ0ZXIgc3RyaW5naWZpY2F0aW9uLlxuICovXG5cbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi9tZXRhZGF0YS1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgTWV0YURhdGFUeXBlIH0gZnJvbSAnLi9waXBlbGluZS10eXBlcy5qcyc7XG5cbi8qKiBEZWNsYXJlZCBjb2VyY2lvbiB0eXBlIG9mIGEgY29udHJhY3Qga2V5LiAqL1xuZXhwb3J0IHR5cGUgQ29udHJhY3RWYWx1ZVR5cGUgPSAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2wnIHwgJ2pzb24nO1xuXG4vKiogVGhlIGNvbnRyYWN0IGZpZWxkcyBvZiBhIHBsdWdpbiByZWNvcmQgKGFzIGBwbHVnaW5zYCBzdG9yZXMgdGhlbSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbnRyYWN0IHtcbiAgcmVhZG9ubHkgcmVxdWlyZWRNZXRhZGF0YT86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbDtcbiAgcmVhZG9ubHkgcmVxdWlyZWRWYXJzPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsO1xuICByZWFkb25seSBtZXRhZGF0YVR5cGVzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ29udHJhY3RWYWx1ZVR5cGU+PiB8IG51bGw7XG4gIHJlYWRvbmx5IHZhcnNUeXBlcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENvbnRyYWN0VmFsdWVUeXBlPj4gfCBudWxsO1xufVxuXG4vKiogV2hhdCBge3sgcGlwZWxpbmUubWV0YWRhdGEuKiB9fWAgYW5kIGB7eyBwaXBlbGluZS52YXJzLiogfX1gIHJlc29sdmUgYWdhaW5zdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RTY29wZSB7XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIHJlYWRvbmx5IHZhcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuLyoqIE9uZSB1bm1ldCBjb250cmFjdCBrZXkuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyYWN0SXNzdWUge1xuICByZWFkb25seSBraW5kOiAnbWV0YWRhdGEnIHwgJ3ZhcnMnO1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvYmxlbTogJ21pc3NpbmcnIHwgJ3R5cGUnO1xuICAvKiogVGhlIGRlY2xhcmVkIHR5cGUsIGZvciBhIGB0eXBlYCBwcm9ibGVtLiAqL1xuICByZWFkb25seSBleHBlY3RlZD86IENvbnRyYWN0VmFsdWVUeXBlO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgcGlwZWxpbmUtcHJvcHMgZmllbGRzIHRoZSBjb250cmFjdCBzY29wZSBpcyBidWlsdCBmcm9tIChCdWlsZGVyUHJvcHMgc3Vic2V0KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RTY29wZVByb3BzIHtcbiAgcmVhZG9ubHkgZ2xvYmFsPzogdW5rbm93bjtcbiAgcmVhZG9ubHkgZGVmYXVsdHM/OiB1bmtub3duO1xuICByZWFkb25seSBzeW50aD86IHVua25vd247XG4gIHJlYWRvbmx5IHZhcnM/OiB1bmtub3duO1xufVxuXG5mdW5jdGlvbiBhc1JlY29yZCh2OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodikgPyB2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IDoge307XG59XG5cbi8qKlxuICogYHBpcGVsaW5lLm1ldGFkYXRhYCBhcyBzeW50aCBidWlsZHMgaXQ6IGBnbG9iYWxgIOKGkCBgZGVmYXVsdHMubWV0YWRhdGFgIOKGkFxuICogYHN5bnRoLm1ldGFkYXRhYCAobGFzdCB3aW5zKS4gVGhlIHNpbmdsZSBkZWZpbml0aW9uIOKAlCBgUGlwZWxpbmVDb25maWd1cmF0aW9uYFxuICogdXNlcyBpdCB0b28sIHNvIHRoZSBBUEkgY2hlY2sgYW5kIHRoZSBzeW50aCBzY29wZSBjYW5ub3QgZHJpZnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaXBlbGluZVNjb3BlTWV0YWRhdGEocHJvcHM6IENvbnRyYWN0U2NvcGVQcm9wcyk6IE1ldGFEYXRhVHlwZSB7XG4gIHJldHVybiBtZXJnZShcbiAgICBhc1JlY29yZChwcm9wcy5nbG9iYWwpIGFzIE1ldGFEYXRhVHlwZSxcbiAgICBhc1JlY29yZChhc1JlY29yZChwcm9wcy5kZWZhdWx0cykubWV0YWRhdGEpIGFzIE1ldGFEYXRhVHlwZSxcbiAgICBhc1JlY29yZChhc1JlY29yZChwcm9wcy5zeW50aCkubWV0YWRhdGEpIGFzIE1ldGFEYXRhVHlwZSxcbiAgKTtcbn1cblxuLyoqIFRoZSBjb250cmFjdCBzY29wZSBvZiBhIHBpcGVsaW5lJ3MgcHJvcHMgKHNlZSB7QGxpbmsgcGlwZWxpbmVTY29wZU1ldGFkYXRhfSkuICovXG5leHBvcnQgZnVuY3Rpb24gcGlwZWxpbmVDb250cmFjdFNjb3BlKHByb3BzOiBDb250cmFjdFNjb3BlUHJvcHMpOiBDb250cmFjdFNjb3BlIHtcbiAgcmV0dXJuIHsgbWV0YWRhdGE6IHBpcGVsaW5lU2NvcGVNZXRhZGF0YShwcm9wcyksIHZhcnM6IGFzUmVjb3JkKHByb3BzLnZhcnMpIH07XG59XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IHNjb3BlIGluc2lkZSBhIHN5bnRoIHRlbXBsYXRlIHNjb3BlIChgeyBwaXBlbGluZTogeyBtZXRhZGF0YSxcbiAqIHZhcnMsIOKApiB9IH1gLCBzZWUgYFBpcGVsaW5lQ29uZmlndXJhdGlvbi5nZXRQaXBlbGluZVNjb3BlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUodGVtcGxhdGVTY29wZTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogQ29udHJhY3RTY29wZSB7XG4gIGNvbnN0IHBpcGVsaW5lID0gYXNSZWNvcmQodGVtcGxhdGVTY29wZS5waXBlbGluZSk7XG4gIHJldHVybiB7IG1ldGFkYXRhOiBhc1JlY29yZChwaXBlbGluZS5tZXRhZGF0YSksIHZhcnM6IGFzUmVjb3JkKHBpcGVsaW5lLnZhcnMpIH07XG59XG5cbi8qKiBXb3VsZCB0aGUgZXZhbHVhdG9yIHRyZWF0IGB2YWx1ZWAgYXMgYWJzZW50IChtaXNzaW5nIC8gbnVsbCAvIGVtcHR5IHN0cmluZyk/ICovXG5mdW5jdGlvbiBpc01pc3NpbmcodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnO1xufVxuXG4vKipcbiAqIERvZXMgYHZhbHVlYCBzYXRpc2Z5IHRoZSBkZWNsYXJlZCBgdHlwZWAgb25jZSBpbnRlcnBvbGF0ZWQ/IE1pcnJvcnMgdGhlXG4gKiBldmFsdWF0b3IncyBgcmVzb2x2ZU9uZWAgKG9iamVjdHMgbmV2ZXIgaW50ZXJwb2xhdGUpIGFuZCBgYXBwbHlDb2VyY2lvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRyYWN0VmFsdWVPZlR5cGUodmFsdWU6IHVua25vd24sIHR5cGU6IENvbnRyYWN0VmFsdWVUeXBlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJhdyA9IFN0cmluZyh2YWx1ZSk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShOdW1iZXIocmF3KSk7XG4gICAgY2FzZSAnYm9vbCc6XG4gICAgICByZXR1cm4gWyd0cnVlJywgJzEnLCAneWVzJywgJ2ZhbHNlJywgJzAnLCAnbm8nLCAnJ10uaW5jbHVkZXMocmF3LnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjYXNlICdqc29uJzpcbiAgICAgIHRyeSB7XG4gICAgICAgIEpTT04ucGFyc2UocmF3KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICB9XG59XG5cbi8qKiBBIHZhbHVlIHN0aWxsIGNhcnJ5aW5nIGB7eyDigKYgfX1gIGlzIHJlc29sdmVkIGxhdGVyIChwaXBlbGluZSBwYXNzIDEpLCBzbyBpdHMgdHlwZSBjYW4ndCBiZSBqdWRnZWQgeWV0LiAqL1xuZnVuY3Rpb24gaXNVbnJlc29sdmVkVGVtcGxhdGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuaW5jbHVkZXMoJ3t7Jyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrS2luZChcbiAga2luZDogJ21ldGFkYXRhJyB8ICd2YXJzJyxcbiAgcmVxdWlyZWQ6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdHlwZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENvbnRyYWN0VmFsdWVUeXBlPj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBzdXBwbGllZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuKTogQ29udHJhY3RJc3N1ZVtdIHtcbiAgY29uc3QgaXNzdWVzOiBDb250cmFjdElzc3VlW10gPSBbXTtcbiAgY29uc3Qgd2hlcmUgPSBraW5kID09PSAnbWV0YWRhdGEnID8gJ21ldGFkYXRhIChnbG9iYWwgLyBkZWZhdWx0cy5tZXRhZGF0YSAvIHN5bnRoLm1ldGFkYXRhKScgOiAndmFycyc7XG4gIGZvciAoY29uc3Qga2V5IG9mIG5ldyBTZXQocmVxdWlyZWQgPz8gW10pKSB7XG4gICAgaWYgKGlzTWlzc2luZyhzdXBwbGllZFtrZXldKSkge1xuICAgICAgaXNzdWVzLnB1c2goeyBraW5kLCBrZXksIHByb2JsZW06ICdtaXNzaW5nJywgbWVzc2FnZTogYHBpcGVsaW5lICR7d2hlcmV9IG11c3Qgc3VwcGx5ICcke2tleX0nYCB9KTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCBleHBlY3RlZF0gb2YgT2JqZWN0LmVudHJpZXModHlwZXMgPz8ge30pKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdXBwbGllZFtrZXldO1xuICAgIGlmIChpc01pc3NpbmcodmFsdWUpIHx8IGlzVW5yZXNvbHZlZFRlbXBsYXRlKHZhbHVlKSkgY29udGludWU7XG4gICAgaWYgKCFpc0NvbnRyYWN0VmFsdWVPZlR5cGUodmFsdWUsIGV4cGVjdGVkKSkge1xuICAgICAgY29uc3QgZ290ID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IChBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhbiBhcnJheScgOiAnYW4gb2JqZWN0JykgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICBpc3N1ZXMucHVzaCh7IGtpbmQsIGtleSwgcHJvYmxlbTogJ3R5cGUnLCBleHBlY3RlZCwgbWVzc2FnZTogYHBpcGVsaW5lICR7a2luZH0uJHtrZXl9IG11c3QgYmUgYSAke2V4cGVjdGVkfSwgZ290ICR7Z290fWAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpc3N1ZXM7XG59XG5cbi8qKlxuICogQ2hlY2sgb25lIHBsdWdpbidzIGNvbnRyYWN0IGFnYWluc3QgdGhlIHBpcGVsaW5lJ3Mgc2NvcGUuIFJldHVybnMgZXZlcnlcbiAqIGlzc3VlIChtaXNzaW5nIGtleXMgZmlyc3QsIHRoZW4gaWxsLXR5cGVkIG9uZXMsIG1ldGFkYXRhIGJlZm9yZSB2YXJzKTtcbiAqIGVtcHR5IHdoZW4gdGhlIGNvbnRyYWN0IGlzIG1ldC4gRGVjbGFyZWQgdHlwZXMgYXJlIGNoZWNrZWQgZm9yIGV2ZXJ5XG4gKiBTVVBQTElFRCBrZXksIHJlcXVpcmVkIG9yIG5vdCAoYW4gb3B0aW9uYWwga2V5IHdpdGggYSBgfCBkZWZhdWx0OmAgaXMgc3RpbGxcbiAqIGNvZXJjZWQgd2hlbiBpdCBpcyBzdXBwbGllZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BsdWdpbkNvbnRyYWN0KGNvbnRyYWN0OiBQbHVnaW5Db250cmFjdCwgc2NvcGU6IENvbnRyYWN0U2NvcGUpOiBDb250cmFjdElzc3VlW10ge1xuICByZXR1cm4gW1xuICAgIC4uLmNoZWNrS2luZCgnbWV0YWRhdGEnLCBjb250cmFjdC5yZXF1aXJlZE1ldGFkYXRhLCBjb250cmFjdC5tZXRhZGF0YVR5cGVzLCBzY29wZS5tZXRhZGF0YSksXG4gICAgLi4uY2hlY2tLaW5kKCd2YXJzJywgY29udHJhY3QucmVxdWlyZWRWYXJzLCBjb250cmFjdC52YXJzVHlwZXMsIHNjb3BlLnZhcnMpLFxuICBdO1xufVxuXG4vKipcbiAqIFN5bnRoLXRpbWUgZ3VhcmQ6IHRocm93IHdoZW4gYHBsdWdpbmAgKHJlc29sdmVkIGZvciBgc3RlcGApIGhhcyB1bm1ldFxuICogY29udHJhY3Qga2V5cy4gVGhlIEFQSSByZWZ1c2VzIHN1Y2ggYSBwaXBlbGluZSBhdCBjcmVhdGUvdXBkYXRlOyB0aGlzXG4gKiBjYXRjaGVzIG9uZSB0aGF0IHJlYWNoZWQgc3ludGggYW5vdGhlciB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQbHVnaW5Db250cmFjdChcbiAgcGx1Z2luOiBQbHVnaW5Db250cmFjdCAmIHsgcmVhZG9ubHkgbmFtZTogc3RyaW5nOyByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nIH0sXG4gIHNjb3BlOiBDb250cmFjdFNjb3BlLFxuICBzdGVwOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3QgaXNzdWVzID0gY2hlY2tQbHVnaW5Db250cmFjdChwbHVnaW4sIHNjb3BlKTtcbiAgaWYgKGlzc3Vlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBTdGVwIFwiJHtzdGVwfVwiIHVzZXMgcGx1Z2luIFwiJHtwbHVnaW4ubmFtZX0ke3BsdWdpbi52ZXJzaW9uID8gYEAke3BsdWdpbi52ZXJzaW9ufWAgOiAnJ31cIiB3aG9zZSBjb250cmFjdCBpcyBub3QgbWV0OlxcbmBcbiAgICArIGlzc3Vlcy5tYXAoKGkpID0+IGAgIOKAoiAke2kubWVzc2FnZX1gKS5qb2luKCdcXG4nKSxcbiAgKTtcbn1cblxuLyoqIEEgcGx1Z2luIHJlZmVyZW5jZSBpbiBwaXBlbGluZSBwcm9wcywgd2l0aCB3aGVyZSBpdCBzaXRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdGVwUmVmIHtcbiAgLyoqIEpTT04gcGF0aCBvZiB0aGUgc3RlcDogYHN5bnRoYCBvciBgc3RhZ2VzW2ldLnN0ZXBzW2pdYC4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKiogSHVtYW4gbGFiZWw6IGBzeW50aGAgb3IgYDxzdGFnZU5hbWU+LzxhbGlhcyA/PyBuYW1lPmAuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFB1Ymxpc2hlciBoYW5kbGUgb2YgYW4gaW5zdGFsbGVkIGxpc3RpbmcuICovXG4gIHJlYWRvbmx5IHB1Ymxpc2hlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZpbHRlcj86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuZnVuY3Rpb24gdG9SZWYocmF3OiB1bmtub3duLCBwYXRoOiBzdHJpbmcsIGxhYmVsOiAobmFtZTogc3RyaW5nLCBhbGlhcz86IHN0cmluZywgcHVibGlzaGVyPzogc3RyaW5nKSA9PiBzdHJpbmcpOiBQbHVnaW5TdGVwUmVmIHwgbnVsbCB7XG4gIGNvbnN0IHIgPSBhc1JlY29yZChyYXcpO1xuICBpZiAodHlwZW9mIHIubmFtZSAhPT0gJ3N0cmluZycgfHwgci5uYW1lLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFsaWFzID0gdHlwZW9mIHIuYWxpYXMgPT09ICdzdHJpbmcnID8gci5hbGlhcyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcHVibGlzaGVyID0gdHlwZW9mIHIucHVibGlzaGVyID09PSAnc3RyaW5nJyAmJiByLnB1Ymxpc2hlci5sZW5ndGggPiAwID8gci5wdWJsaXNoZXIgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbHRlciA9IHIuZmlsdGVyICYmIHR5cGVvZiByLmZpbHRlciA9PT0gJ29iamVjdCcgPyByLmZpbHRlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBwYXRoLFxuICAgIGxhYmVsOiBsYWJlbChyLm5hbWUsIGFsaWFzLCBwdWJsaXNoZXIpLFxuICAgIG5hbWU6IHIubmFtZSxcbiAgICAuLi4ocHVibGlzaGVyID8geyBwdWJsaXNoZXIgfSA6IHt9KSxcbiAgICAuLi4oYWxpYXMgPyB7IGFsaWFzIH0gOiB7fSksXG4gICAgLi4uKGZpbHRlciA/IHsgZmlsdGVyIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogVEhFIHN0ZXAgbGFiZWw6IGBzeW50aGAgZm9yIHRoZSBzeW50aCBzdGVwLCBlbHNlXG4gKiBgPHN0YWdlTmFtZT4vPGFsaWFzID8/IFs8cHVibGlzaGVyPi9dbmFtZT5gLiBFdmVyeSBwZXItc3RlcCByZWNvcmQga2V5cyBvbiBpdCDigJRcbiAqIHRoZSBsb29rdXAgYGNvbnRleHQuc3RlcEtleXNgIHN5bnRoIHNlbmRzIChDTEkgcHJlLXJlc29sdmVyIGFuZCB0aGUgZGVwbG95LXRpbWVcbiAqIGN1c3RvbSByZXNvdXJjZSksIHRoZSBzdGVwIG1hbmlmZXN0LCB0aGUgcnVudGltZSBjaGVjaywgdGhlIGRlY2xhcmVkXG4gKiByZXNvbHV0aW9uIHJvd3MgYW5kIHRoZSBwaXBlbGluZSBzZWN1cml0eSB2aWV3IHRoYXQgam9pbnMgdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpblN0ZXBMYWJlbChzdGFnZU5hbWU6IHN0cmluZyB8IG51bGwsIHJlZjogUGx1Z2luUmVmSWRlbnRpdHkpOiBzdHJpbmcge1xuICBpZiAoc3RhZ2VOYW1lID09PSBudWxsKSByZXR1cm4gJ3N5bnRoJztcbiAgcmV0dXJuIGAke3N0YWdlTmFtZX0vJHtyZWYuYWxpYXMgPz8gKHJlZi5wdWJsaXNoZXIgPyBgJHtyZWYucHVibGlzaGVyfS8ke3JlZi5uYW1lfWAgOiByZWYubmFtZSl9YDtcbn1cblxuLyoqXG4gKiBFdmVyeSBwbHVnaW4gcmVmZXJlbmNlIGluIGEgcGlwZWxpbmUncyBwcm9wczogYHN5bnRoLnBsdWdpbmAsIHRoZW4gZWFjaFxuICogYHN0YWdlc1tdLnN0ZXBzW10ucGx1Z2luYCBpbiBvcmRlci4gT25lIGVudHJ5IHBlciBTVEVQIChub3QgZGUtZHVwbGljYXRlZCkg4oCUXG4gKiB0aGUgY29udHJhY3QgcmVzdWx0IGlzIHJlcG9ydGVkIHBlciBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFBsdWdpblN0ZXBzKHByb3BzOiB1bmtub3duKTogUGx1Z2luU3RlcFJlZltdIHtcbiAgY29uc3QgcCA9IGFzUmVjb3JkKHByb3BzKTtcbiAgY29uc3Qgb3V0OiBQbHVnaW5TdGVwUmVmW10gPSBbXTtcbiAgY29uc3Qgc3ludGggPSB0b1JlZihhc1JlY29yZChwLnN5bnRoKS5wbHVnaW4sICdzeW50aCcsIChuYW1lKSA9PiBwbHVnaW5TdGVwTGFiZWwobnVsbCwgeyBuYW1lIH0pKTtcbiAgaWYgKHN5bnRoKSBvdXQucHVzaChzeW50aCk7XG4gIGNvbnN0IHN0YWdlcyA9IEFycmF5LmlzQXJyYXkocC5zdGFnZXMpID8gcC5zdGFnZXMgOiBbXTtcbiAgc3RhZ2VzLmZvckVhY2goKHN0YWdlLCBpKSA9PiB7XG4gICAgY29uc3QgcyA9IGFzUmVjb3JkKHN0YWdlKTtcbiAgICBjb25zdCBzdGFnZU5hbWUgPSB0eXBlb2Ygcy5zdGFnZU5hbWUgPT09ICdzdHJpbmcnID8gcy5zdGFnZU5hbWUgOiBgc3RhZ2UgJHtpICsgMX1gO1xuICAgIGNvbnN0IHN0ZXBzID0gQXJyYXkuaXNBcnJheShzLnN0ZXBzKSA/IHMuc3RlcHMgOiBbXTtcbiAgICBzdGVwcy5mb3JFYWNoKChzdGVwLCBqKSA9PiB7XG4gICAgICBjb25zdCByZWYgPSB0b1JlZihhc1JlY29yZChzdGVwKS5wbHVnaW4sIGBzdGFnZXNbJHtpfV0uc3RlcHNbJHtqfV1gLFxuICAgICAgICAobmFtZSwgYWxpYXMsIHB1Ymxpc2hlcikgPT4gcGx1Z2luU3RlcExhYmVsKHN0YWdlTmFtZSwgeyBuYW1lLCBhbGlhcywgcHVibGlzaGVyIH0pKTtcbiAgICAgIGlmIChyZWYpIG91dC5wdXNoKHJlZik7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRoZSBsb29rdXAgZmlsdGVyIHN5bnRoIHNlbmRzIGZvciBhIHJlZmVyZW5jZSAocGlwZWxpbmUtbWFuYWdlclxuICogYHJlc29sdmVQbHVnaW5zRm9yUHJvcHNgLCB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlLCB0aGUgcGlwZWxpbmVcbiAqIHNlcnZpY2UncyBjb250cmFjdCBjaGVjayk6IHRoZSByZWYncyBuYW1lIOKAlCBhbmQgaXRzIGBwdWJsaXNoZXJgLCB3aGljaFxuICogcm91dGVzIHRoZSBsb29rdXAgdG8gdGhhdCBwdWJsaXNoZXIncyBpbnN0YWxsZWQgbGlzdGluZyDigJQgb3ZlcmxhaWQgYnlcbiAqIGFuIGV4cGxpY2l0IGBmaWx0ZXJgICh3aG9zZSBgbmFtZWAgd2lucyksIGVsc2UgdGhlIGRlZmF1bHQgYWN0aXZlK2RlZmF1bHRcbiAqIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5Mb29rdXBGaWx0ZXIocmVmOiBQaWNrPFBsdWdpblN0ZXBSZWYsICduYW1lJyB8ICdmaWx0ZXInIHwgJ3B1Ymxpc2hlcic+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IHJlZi5uYW1lLFxuICAgIC4uLihyZWYucHVibGlzaGVyID8geyBwdWJsaXNoZXI6IHJlZi5wdWJsaXNoZXIgfSA6IHt9KSxcbiAgICAuLi4ocmVmLmZpbHRlciA/PyB7IGlzQWN0aXZlOiB0cnVlLCBpc0RlZmF1bHQ6IHRydWUgfSksXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZWZlcmVuY2UgaWRlbnRpdHkgKENESy1mcmVlOiB0aGUgQ0xJLCB0aGUgcGlwZWxpbmUgc2VydmljZSBhbmQgc3ludGggc2hhcmUgaXQpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoZSBwbHVnaW4tYWxpYXMgU0VHTUVOVCBvZiBhbiBhcnRpZmFjdCBrZXkg4oCUIGFuZCB0aGUgcmVzb2x2ZXIncyBjYWNoZSBrZXk6XG4gKiB0aGUgZXhwbGljaXQgYWxpYXMsIG9yIGAke25hbWV9LWFsaWFzYCB3aGVuIHRoZXJlIGlzIG5vbmVcbiAqIChgJHtwdWJsaXNoZXJ9LSR7bmFtZX0tYWxpYXNgIGZvciBhIHF1YWxpZmllZCByZWZlcmVuY2UpLiBUSEUgcnVsZSDigJQgdGhlIGZyb250ZW5kJ3MgYXJ0aWZhY3QgcGlja2VyXG4gKiAoYGZyb250ZW5kL3NyYy9saWIvYXJ0aWZhY3Qta2V5cy50c2ApLCB0aGUgQ0xJJ3MgcHJlLXJlc29sdmVyIGFuZFxuICogYFBsdWdpbkxvb2t1cC5ub3JtYWxpemVgIGFsbCBidWlsZCBrZXlzIHRoaXMgd2F5LlxuICpcbiAqIFRoZSBwbGFjZXMgdGhhdCBSRUdJU1RFUiBrZXlzIG11c3QgdXNlIGl0IHRvbzogYSBzdGFnZSBzdGVwIHJlZ2lzdGVyaW5nIHRoZVxuICogYmFyZSBuYW1lIChgbm9kZWpzLWJ1aWxkYCkgb3IgYSBzeW50aCBzdGVwIHN1ZmZpeGluZyBhbiBleHBsaWNpdCBhbGlhc1xuICogKGBteS1zeW50aC1hbGlhc2ApIHdvdWxkIGZhaWwgYW55IFVJLXBpY2tlZCBpbnB1dCBhcnRpZmFjdCB3aXRoIFwiTm8gYXJ0aWZhY3RcbiAqIHJlZ2lzdGVyZWRcIiwgYmVjYXVzZSB0aGUga2V5IGl0IGFza3MgZm9yIGlzIG5ldmVyIHRoZSBrZXkgdGhhdCB3YXMgc3RvcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luQXJ0aWZhY3RBbGlhcyhwbHVnaW46IFBsdWdpblJlZklkZW50aXR5KTogc3RyaW5nIHtcbiAgaWYgKHBsdWdpbi5hbGlhcykgcmV0dXJuIHBsdWdpbi5hbGlhcztcbiAgcmV0dXJuIHBsdWdpbi5wdWJsaXNoZXIgPyBgJHtzYW5pdGl6ZVB1Ymxpc2hlcihwbHVnaW4ucHVibGlzaGVyKX0tJHtwbHVnaW4ubmFtZX0tYWxpYXNgIDogYCR7cGx1Z2luLm5hbWV9LWFsaWFzYDtcbn1cblxuLyoqIFRoZSBmaWVsZHMgb2YgYSBwbHVnaW4gUkVGRVJFTkNFIHRoYXQgaWRlbnRpZnkgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblJlZklkZW50aXR5IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcbiAgLyoqIFB1Ymxpc2hlciBoYW5kbGUgb2YgYW4gaW5zdGFsbGVkIGxpc3Rpbmc7IGFic2VudCBmb3IgYW4gdW5xdWFsaWZpZWQgcmVmZXJlbmNlLiAqL1xuICByZWFkb25seSBwdWJsaXNoZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwdWJsaXNoZXIgaGFuZGxlIGFzIGl0IG1heSBhcHBlYXIgaW4gYSBjb25zdHJ1Y3QgaWQgb3IgYSBrZXk6IG9ubHlcbiAqIGBbQS1aYS16MC05Xy1dYCAoaGFuZGxlcyBhbHJlYWR5IGFyZTsgdGhpcyBpcyB0aGUgZ3VhcmFudGVlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplUHVibGlzaGVyKHB1Ymxpc2hlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHB1Ymxpc2hlci5yZXBsYWNlKC9bXkEtWmEtejAtOV8tXS9nLCAnLScpO1xufVxuXG4vKipcbiAqIFRoZSBjb25zdHJ1Y3QtaWQgc2VnbWVudCBvZiBhIHBsdWdpbiBzdGVwOiB0aGUgZXhwbGljaXQgYWxpYXMsIGVsc2VcbiAqIGA8cHVibGlzaGVyPi08bmFtZT5gIGZvciBhIHF1YWxpZmllZCByZWZlcmVuY2UsIGVsc2UgdGhlIGJhcmUgbmFtZSDigJQgc28gYVxuICogc3RlcCB1c2luZyBgYWNtZWAncyBgbGludGAgYW5kIG9uZSB1c2luZyB0aGUgb3JnJ3Mgb3duIGBsaW50YCBuZXZlciBjb2xsaWRlLFxuICogd2hpbGUgYW4gdW5xdWFsaWZpZWQgc3RlcCBrZWVwcyB0aGUgaWQgaXQgYWx3YXlzIGhhZCAocmVuYW1pbmcgaXQgd291bGQgbWFrZVxuICogQ2xvdWRGb3JtYXRpb24gcmVwbGFjZSBpdHMgQ29kZUJ1aWxkIHByb2plY3QpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luU3RlcElkQWxpYXMocGx1Z2luOiBQbHVnaW5SZWZJZGVudGl0eSk6IHN0cmluZyB7XG4gIC8vIGA/P2AsIG5vdCBgfHxgOiBhbiBleHBsaWNpdCAoZXZlbiBlbXB0eSkgYWxpYXMga2VlcHMgdGhlIGlkIGl0IGFsd2F5cyBoYWQuXG4gIHJldHVybiBwbHVnaW4uYWxpYXMgPz8gKHBsdWdpbi5wdWJsaXNoZXIgPyBgJHtzYW5pdGl6ZVB1Ymxpc2hlcihwbHVnaW4ucHVibGlzaGVyKX0tJHtwbHVnaW4ubmFtZX1gIDogcGx1Z2luLm5hbWUpO1xufVxuIl19
|
|
@@ -1,14 +1,42 @@
|
|
|
1
1
|
import type { Plugin } from '@pipeline-builder/pipeline-data';
|
|
2
|
+
/** How serious a lookup warning is (vulnerability state is graded, never refused). */
|
|
3
|
+
export type LookupWarningSeverity = 'info' | 'warning' | 'error' | 'critical';
|
|
4
|
+
/** Severities, least to most serious. */
|
|
5
|
+
export declare const LOOKUP_WARNING_SEVERITIES: readonly LookupWarningSeverity[];
|
|
6
|
+
/** One warning riding beside a resolved plugin. */
|
|
7
|
+
export interface LookupWarning {
|
|
8
|
+
readonly code?: string;
|
|
9
|
+
readonly message: string;
|
|
10
|
+
/** Absent on the wire → `warning`. */
|
|
11
|
+
readonly severity: LookupWarningSeverity;
|
|
12
|
+
}
|
|
2
13
|
/**
|
|
3
14
|
* Unwrap a `/plugins/lookup` answer. The platform's success envelope is
|
|
4
15
|
* `{ success, statusCode, data: { plugin, warnings } }` (note the double
|
|
5
16
|
* nesting: `data.plugin`); `{ data: Plugin }`, `{ plugin }` and a bare Plugin
|
|
6
17
|
* are tolerated too. Returns the plugin (null when absent or nameless) and the
|
|
7
|
-
*
|
|
18
|
+
* graded warnings (lifecycle, vulnerability, compliance) that ride beside it.
|
|
8
19
|
*
|
|
9
20
|
* Dependency-free (type-only imports) so the plugin-lookup Lambda can bundle it.
|
|
10
21
|
*/
|
|
11
22
|
export declare function unwrapLookup(body: unknown): {
|
|
12
23
|
plugin: Plugin | null;
|
|
13
|
-
warnings:
|
|
24
|
+
warnings: LookupWarning[];
|
|
14
25
|
};
|
|
26
|
+
/**
|
|
27
|
+
* One line summarizing graded warnings, most serious first —
|
|
28
|
+
* `3 plugin warnings: 1 critical, 2 error`. Null when there are none.
|
|
29
|
+
*/
|
|
30
|
+
export declare function summarizeLookupWarnings(warnings: readonly Pick<LookupWarning, 'severity'>[]): string | null;
|
|
31
|
+
/** Why a lookup found nothing, as the plugin service's 404 `details.state` reports it. */
|
|
32
|
+
export type LookupNotFoundState = 'deleted' | 'inactive' | 'yanked' | 'missing';
|
|
33
|
+
/**
|
|
34
|
+
* `details.state` of a refused lookup, read off either an axios-style error
|
|
35
|
+
* (`err.response.data`) or the response body itself. Null when absent/unknown.
|
|
36
|
+
*/
|
|
37
|
+
export declare function lookupNotFoundState(errOrBody: unknown): LookupNotFoundState | null;
|
|
38
|
+
/**
|
|
39
|
+
* The message for an exact version pin that did not resolve. Shared by the
|
|
40
|
+
* CLI's pre-resolution and the deploy-time Lambda's CloudFormation reason.
|
|
41
|
+
*/
|
|
42
|
+
export declare function exactPinNotFoundMessage(label: string, pin: string, state: LookupNotFoundState | null): string;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/** Severities, least to most serious. */
|
|
4
|
+
export const LOOKUP_WARNING_SEVERITIES = ['info', 'warning', 'error', 'critical'];
|
|
3
5
|
/**
|
|
4
6
|
* Unwrap a `/plugins/lookup` answer. The platform's success envelope is
|
|
5
7
|
* `{ success, statusCode, data: { plugin, warnings } }` (note the double
|
|
6
8
|
* nesting: `data.plugin`); `{ data: Plugin }`, `{ plugin }` and a bare Plugin
|
|
7
9
|
* are tolerated too. Returns the plugin (null when absent or nameless) and the
|
|
8
|
-
*
|
|
10
|
+
* graded warnings (lifecycle, vulnerability, compliance) that ride beside it.
|
|
9
11
|
*
|
|
10
12
|
* Dependency-free (type-only imports) so the plugin-lookup Lambda can bundle it.
|
|
11
13
|
*/
|
|
@@ -19,11 +21,60 @@ export function unwrapLookup(body) {
|
|
|
19
21
|
&& candidate.name.length > 0
|
|
20
22
|
? candidate
|
|
21
23
|
: null;
|
|
22
|
-
const warnings =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
const warnings = [];
|
|
25
|
+
if (Array.isArray(container.warnings)) {
|
|
26
|
+
for (const w of container.warnings) {
|
|
27
|
+
if (!w || typeof w !== 'object')
|
|
28
|
+
continue;
|
|
29
|
+
const { code, message, severity } = w;
|
|
30
|
+
if (typeof message !== 'string' || message.length === 0)
|
|
31
|
+
continue;
|
|
32
|
+
warnings.push({
|
|
33
|
+
...(typeof code === 'string' ? { code } : {}),
|
|
34
|
+
message,
|
|
35
|
+
severity: LOOKUP_WARNING_SEVERITIES.includes(severity) ? severity : 'warning',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
27
39
|
return { plugin, warnings };
|
|
28
40
|
}
|
|
29
|
-
|
|
41
|
+
/**
|
|
42
|
+
* One line summarizing graded warnings, most serious first —
|
|
43
|
+
* `3 plugin warnings: 1 critical, 2 error`. Null when there are none.
|
|
44
|
+
*/
|
|
45
|
+
export function summarizeLookupWarnings(warnings) {
|
|
46
|
+
if (warnings.length === 0)
|
|
47
|
+
return null;
|
|
48
|
+
const parts = [...LOOKUP_WARNING_SEVERITIES].reverse()
|
|
49
|
+
.map((sev) => [sev, warnings.filter((w) => w.severity === sev).length])
|
|
50
|
+
.filter(([, n]) => n > 0)
|
|
51
|
+
.map(([sev, n]) => `${n} ${sev}`);
|
|
52
|
+
return `${warnings.length} plugin warning${warnings.length === 1 ? '' : 's'}: ${parts.join(', ')}`;
|
|
53
|
+
}
|
|
54
|
+
const NOT_FOUND_STATES = ['deleted', 'inactive', 'yanked', 'missing'];
|
|
55
|
+
/**
|
|
56
|
+
* `details.state` of a refused lookup, read off either an axios-style error
|
|
57
|
+
* (`err.response.data`) or the response body itself. Null when absent/unknown.
|
|
58
|
+
*/
|
|
59
|
+
export function lookupNotFoundState(errOrBody) {
|
|
60
|
+
if (!errOrBody || typeof errOrBody !== 'object')
|
|
61
|
+
return null;
|
|
62
|
+
const data = errOrBody.response?.data ?? errOrBody;
|
|
63
|
+
const details = data && typeof data === 'object' ? data.details : undefined;
|
|
64
|
+
const state = details && typeof details === 'object' ? details.state : undefined;
|
|
65
|
+
return typeof state === 'string' && NOT_FOUND_STATES.includes(state) ? state : null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The message for an exact version pin that did not resolve. Shared by the
|
|
69
|
+
* CLI's pre-resolution and the deploy-time Lambda's CloudFormation reason.
|
|
70
|
+
*/
|
|
71
|
+
export function exactPinNotFoundMessage(label, pin, state) {
|
|
72
|
+
switch (state) {
|
|
73
|
+
case 'deleted': return `Plugin "${label}" version ${pin} was deleted from your organization`;
|
|
74
|
+
case 'inactive': return `Plugin "${label}" version ${pin} is inactive`;
|
|
75
|
+
case 'yanked': return `Plugin "${label}" version ${pin} was yanked`;
|
|
76
|
+
case 'missing': return `Plugin "${label}" version ${pin} does not exist`;
|
|
77
|
+
default: return `Plugin "${label}" version ${pin} does not exist (never published, or refused by its build's vulnerability scan)`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3BsdWdpbi1sb29rdXAtZW52ZWxvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQU90Qyx5Q0FBeUM7QUFDekMsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXFDLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFVcEg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQWE7SUFDeEMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzdFLE1BQU0sS0FBSyxHQUFJLElBQTJCLENBQUMsSUFBSSxDQUFDO0lBQ2hELE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQTZDLENBQUM7SUFDbEgsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFRLFNBQWdDLENBQUMsSUFBSSxLQUFLLFFBQVE7V0FDakgsU0FBOEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDbEQsQ0FBQyxDQUFDLFNBQW1CO1FBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDVCxNQUFNLFFBQVEsR0FBb0IsRUFBRSxDQUFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxLQUFLLE1B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S0FBYSxFQUFFLEdBQVcsRUFBRSxLQUFpQztJQUNuRyxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxTQUFTLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLHFDQUFxQyxDQUFDO1FBQzdGLEtBQUssVUFBVSxFQUFFLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxjQUFjLENBQUM7UUFDdkUsS0FBSyxRQUFRLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNwRSxLQUFLLFNBQVMsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsaUJBQWlCLENBQUM7UUFDekUsU0FBUyxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsaUZBQWlGLENBQUM7SUFDcEksQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhJztcblxuLyoqIEhvdyBzZXJpb3VzIGEgbG9va3VwIHdhcm5pbmcgaXMgKHZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgZ3JhZGVkLCBuZXZlciByZWZ1c2VkKS4gKi9cbmV4cG9ydCB0eXBlIExvb2t1cFdhcm5pbmdTZXZlcml0eSA9ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdlcnJvcicgfCAnY3JpdGljYWwnO1xuXG4vKiogU2V2ZXJpdGllcywgbGVhc3QgdG8gbW9zdCBzZXJpb3VzLiAqL1xuZXhwb3J0IGNvbnN0IExPT0tVUF9XQVJOSU5HX1NFVkVSSVRJRVM6IHJlYWRvbmx5IExvb2t1cFdhcm5pbmdTZXZlcml0eVtdID0gWydpbmZvJywgJ3dhcm5pbmcnLCAnZXJyb3InLCAnY3JpdGljYWwnXTtcblxuLyoqIE9uZSB3YXJuaW5nIHJpZGluZyBiZXNpZGUgYSByZXNvbHZlZCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cFdhcm5pbmcge1xuICByZWFkb25seSBjb2RlPzogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBBYnNlbnQgb24gdGhlIHdpcmUg4oaSIGB3YXJuaW5nYC4gKi9cbiAgcmVhZG9ubHkgc2V2ZXJpdHk6IExvb2t1cFdhcm5pbmdTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBVbndyYXAgYSBgL3BsdWdpbnMvbG9va3VwYCBhbnN3ZXIuIFRoZSBwbGF0Zm9ybSdzIHN1Y2Nlc3MgZW52ZWxvcGUgaXNcbiAqIGB7IHN1Y2Nlc3MsIHN0YXR1c0NvZGUsIGRhdGE6IHsgcGx1Z2luLCB3YXJuaW5ncyB9IH1gIChub3RlIHRoZSBkb3VibGVcbiAqIG5lc3Rpbmc6IGBkYXRhLnBsdWdpbmApOyBgeyBkYXRhOiBQbHVnaW4gfWAsIGB7IHBsdWdpbiB9YCBhbmQgYSBiYXJlIFBsdWdpblxuICogYXJlIHRvbGVyYXRlZCB0b28uIFJldHVybnMgdGhlIHBsdWdpbiAobnVsbCB3aGVuIGFic2VudCBvciBuYW1lbGVzcykgYW5kIHRoZVxuICogZ3JhZGVkIHdhcm5pbmdzIChsaWZlY3ljbGUsIHZ1bG5lcmFiaWxpdHksIGNvbXBsaWFuY2UpIHRoYXQgcmlkZSBiZXNpZGUgaXQuXG4gKlxuICogRGVwZW5kZW5jeS1mcmVlICh0eXBlLW9ubHkgaW1wb3J0cykgc28gdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhIGNhbiBidW5kbGUgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBMb29rdXAoYm9keTogdW5rbm93bik6IHsgcGx1Z2luOiBQbHVnaW4gfCBudWxsOyB3YXJuaW5nczogTG9va3VwV2FybmluZ1tdIH0ge1xuICBpZiAoIWJvZHkgfHwgdHlwZW9mIGJvZHkgIT09ICdvYmplY3QnKSByZXR1cm4geyBwbHVnaW46IG51bGwsIHdhcm5pbmdzOiBbXSB9O1xuICBjb25zdCBpbm5lciA9IChib2R5IGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YTtcbiAgY29uc3QgY29udGFpbmVyID0gKGlubmVyICYmIHR5cGVvZiBpbm5lciA9PT0gJ29iamVjdCcgPyBpbm5lciA6IGJvZHkpIGFzIHsgcGx1Z2luPzogdW5rbm93bjsgd2FybmluZ3M/OiB1bmtub3duIH07XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGNvbnRhaW5lci5wbHVnaW4gPz8gY29udGFpbmVyO1xuICBjb25zdCBwbHVnaW4gPSBjYW5kaWRhdGUgJiYgdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIChjYW5kaWRhdGUgYXMgeyBuYW1lPzogdW5rbm93biB9KS5uYW1lID09PSAnc3RyaW5nJ1xuICAgICYmIChjYW5kaWRhdGUgYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZS5sZW5ndGggPiAwXG4gICAgPyBjYW5kaWRhdGUgYXMgUGx1Z2luXG4gICAgOiBudWxsO1xuICBjb25zdCB3YXJuaW5nczogTG9va3VwV2FybmluZ1tdID0gW107XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lci53YXJuaW5ncykpIHtcbiAgICBmb3IgKGNvbnN0IHcgb2YgY29udGFpbmVyLndhcm5pbmdzKSB7XG4gICAgICBpZiAoIXcgfHwgdHlwZW9mIHcgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSwgc2V2ZXJpdHkgfSA9IHcgYXMgeyBjb2RlPzogdW5rbm93bjsgbWVzc2FnZT86IHVua25vd247IHNldmVyaXR5PzogdW5rbm93biB9O1xuICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJyB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgLi4uKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyA/IHsgY29kZSB9IDoge30pLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzZXZlcml0eTogKExPT0tVUF9XQVJOSU5HX1NFVkVSSVRJRVMgYXMgcmVhZG9ubHkgdW5rbm93bltdKS5pbmNsdWRlcyhzZXZlcml0eSkgPyBzZXZlcml0eSBhcyBMb29rdXBXYXJuaW5nU2V2ZXJpdHkgOiAnd2FybmluZycsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcGx1Z2luLCB3YXJuaW5ncyB9O1xufVxuXG4vKipcbiAqIE9uZSBsaW5lIHN1bW1hcml6aW5nIGdyYWRlZCB3YXJuaW5ncywgbW9zdCBzZXJpb3VzIGZpcnN0IOKAlFxuICogYDMgcGx1Z2luIHdhcm5pbmdzOiAxIGNyaXRpY2FsLCAyIGVycm9yYC4gTnVsbCB3aGVuIHRoZXJlIGFyZSBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplTG9va3VwV2FybmluZ3Mod2FybmluZ3M6IHJlYWRvbmx5IFBpY2s8TG9va3VwV2FybmluZywgJ3NldmVyaXR5Jz5bXSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAod2FybmluZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGFydHMgPSBbLi4uTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFU10ucmV2ZXJzZSgpXG4gICAgLm1hcCgoc2V2KSA9PiBbc2V2LCB3YXJuaW5ncy5maWx0ZXIoKHcpID0+IHcuc2V2ZXJpdHkgPT09IHNldikubGVuZ3RoXSBhcyBjb25zdClcbiAgICAuZmlsdGVyKChbLCBuXSkgPT4gbiA+IDApXG4gICAgLm1hcCgoW3Nldiwgbl0pID0+IGAke259ICR7c2V2fWApO1xuICByZXR1cm4gYCR7d2FybmluZ3MubGVuZ3RofSBwbHVnaW4gd2FybmluZyR7d2FybmluZ3MubGVuZ3RoID09PSAxID8gJycgOiAncyd9OiAke3BhcnRzLmpvaW4oJywgJyl9YDtcbn1cblxuLyoqIFdoeSBhIGxvb2t1cCBmb3VuZCBub3RoaW5nLCBhcyB0aGUgcGx1Z2luIHNlcnZpY2UncyA0MDQgYGRldGFpbHMuc3RhdGVgIHJlcG9ydHMgaXQuICovXG5leHBvcnQgdHlwZSBMb29rdXBOb3RGb3VuZFN0YXRlID0gJ2RlbGV0ZWQnIHwgJ2luYWN0aXZlJyB8ICd5YW5rZWQnIHwgJ21pc3NpbmcnO1xuXG5jb25zdCBOT1RfRk9VTkRfU1RBVEVTOiByZWFkb25seSBMb29rdXBOb3RGb3VuZFN0YXRlW10gPSBbJ2RlbGV0ZWQnLCAnaW5hY3RpdmUnLCAneWFua2VkJywgJ21pc3NpbmcnXTtcblxuLyoqXG4gKiBgZGV0YWlscy5zdGF0ZWAgb2YgYSByZWZ1c2VkIGxvb2t1cCwgcmVhZCBvZmYgZWl0aGVyIGFuIGF4aW9zLXN0eWxlIGVycm9yXG4gKiAoYGVyci5yZXNwb25zZS5kYXRhYCkgb3IgdGhlIHJlc3BvbnNlIGJvZHkgaXRzZWxmLiBOdWxsIHdoZW4gYWJzZW50L3Vua25vd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb29rdXBOb3RGb3VuZFN0YXRlKGVyck9yQm9keTogdW5rbm93bik6IExvb2t1cE5vdEZvdW5kU3RhdGUgfCBudWxsIHtcbiAgaWYgKCFlcnJPckJvZHkgfHwgdHlwZW9mIGVyck9yQm9keSAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICBjb25zdCBkYXRhID0gKGVyck9yQm9keSBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0pLnJlc3BvbnNlPy5kYXRhID8/IGVyck9yQm9keTtcbiAgY29uc3QgZGV0YWlscyA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyBkZXRhaWxzPzogdW5rbm93biB9KS5kZXRhaWxzIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbHMgJiYgdHlwZW9mIGRldGFpbHMgPT09ICdvYmplY3QnID8gKGRldGFpbHMgYXMgeyBzdGF0ZT86IHVua25vd24gfSkuc3RhdGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnICYmIChOT1RfRk9VTkRfU1RBVEVTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhzdGF0ZSkgPyBzdGF0ZSBhcyBMb29rdXBOb3RGb3VuZFN0YXRlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgbWVzc2FnZSBmb3IgYW4gZXhhY3QgdmVyc2lvbiBwaW4gdGhhdCBkaWQgbm90IHJlc29sdmUuIFNoYXJlZCBieSB0aGVcbiAqIENMSSdzIHByZS1yZXNvbHV0aW9uIGFuZCB0aGUgZGVwbG95LXRpbWUgTGFtYmRhJ3MgQ2xvdWRGb3JtYXRpb24gcmVhc29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWw6IHN0cmluZywgcGluOiBzdHJpbmcsIHN0YXRlOiBMb29rdXBOb3RGb3VuZFN0YXRlIHwgbnVsbCk6IHN0cmluZyB7XG4gIHN3aXRjaCAoc3RhdGUpIHtcbiAgICBjYXNlICdkZWxldGVkJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IHdhcyBkZWxldGVkIGZyb20geW91ciBvcmdhbml6YXRpb25gO1xuICAgIGNhc2UgJ2luYWN0aXZlJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGlzIGluYWN0aXZlYDtcbiAgICBjYXNlICd5YW5rZWQnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gd2FzIHlhbmtlZGA7XG4gICAgY2FzZSAnbWlzc2luZyc6IHJldHVybiBgUGx1Z2luIFwiJHtsYWJlbH1cIiB2ZXJzaW9uICR7cGlufSBkb2VzIG5vdCBleGlzdGA7XG4gICAgZGVmYXVsdDogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGRvZXMgbm90IGV4aXN0IChuZXZlciBwdWJsaXNoZWQsIG9yIHJlZnVzZWQgYnkgaXRzIGJ1aWxkJ3MgdnVsbmVyYWJpbGl0eSBzY2FuKWA7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** The error `code` api-core's `sendQuotaExceeded` answers with. */
|
|
2
|
+
export declare const QUOTA_EXCEEDED_CODE = "QUOTA_EXCEEDED";
|
|
3
|
+
/** Whether an error response body is a quota refusal (`code: 'QUOTA_EXCEEDED'`). */
|
|
4
|
+
export declare function isQuotaExceededBody(body: unknown): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* `"API call quota reached (25,000/25,000); resets 2026-11-05. Upgrade:
|
|
7
|
+
* https://pb.example.com/dashboard/billing"` for a quota refusal body, or
|
|
8
|
+
* `undefined` for anything else. `platformUrl` prefixes the RELATIVE upgrade
|
|
9
|
+
* path the server sends (the dashboard and API share an origin behind nginx).
|
|
10
|
+
*/
|
|
11
|
+
export declare function describeQuotaExceeded(body: unknown, platformUrl: string): string | undefined;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Rendering a `429 QUOTA_EXCEEDED` for a person reading a terminal or a
|
|
5
|
+
* CloudFormation event — shared by the pipeline-manager CLI and the
|
|
6
|
+
* plugin-lookup Lambda so both say the same thing.
|
|
7
|
+
*
|
|
8
|
+
* A quota refusal is NOT a rate limit: waiting a moment changes nothing, the
|
|
9
|
+
* counter only empties when the period resets (or the limit is raised). So the
|
|
10
|
+
* message names the quota, the numbers, the reset date and where to raise it,
|
|
11
|
+
* and the callers never retry it. A 429 WITHOUT this code is an ordinary rate
|
|
12
|
+
* limit (nginx, a per-org burst limiter) and keeps rate-limit wording.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately a dependency-free leaf (the label table is a side-effect-free
|
|
15
|
+
* deep import): the Lambda bundle must not pull the api-core barrel.
|
|
16
|
+
*/
|
|
17
|
+
import { QUOTA_TYPE_LABELS, QUOTA_UPGRADE_PATH } from '@pipeline-builder/api-core/lib/types/common.js';
|
|
18
|
+
/** The error `code` api-core's `sendQuotaExceeded` answers with. */
|
|
19
|
+
export const QUOTA_EXCEEDED_CODE = 'QUOTA_EXCEEDED';
|
|
20
|
+
/** Whether an error response body is a quota refusal (`code: 'QUOTA_EXCEEDED'`). */
|
|
21
|
+
export function isQuotaExceededBody(body) {
|
|
22
|
+
return !!body && typeof body === 'object' && body.code === QUOTA_EXCEEDED_CODE;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* `"API call quota reached (25,000/25,000); resets 2026-11-05. Upgrade:
|
|
26
|
+
* https://pb.example.com/dashboard/billing"` for a quota refusal body, or
|
|
27
|
+
* `undefined` for anything else. `platformUrl` prefixes the RELATIVE upgrade
|
|
28
|
+
* path the server sends (the dashboard and API share an origin behind nginx).
|
|
29
|
+
*/
|
|
30
|
+
export function describeQuotaExceeded(body, platformUrl) {
|
|
31
|
+
if (!isQuotaExceededBody(body))
|
|
32
|
+
return undefined;
|
|
33
|
+
const details = (body.details ?? {});
|
|
34
|
+
const type = typeof details.quotaType === 'string' ? details.quotaType : undefined;
|
|
35
|
+
const label = (type && QUOTA_TYPE_LABELS[type]) ?? (type ? type : 'Usage');
|
|
36
|
+
const used = typeof details.used === 'number' ? details.used.toLocaleString('en-US') : '?';
|
|
37
|
+
const limit = typeof details.limit === 'number' ? details.limit.toLocaleString('en-US') : '?';
|
|
38
|
+
const resets = typeof details.resetAt === 'string' && details.resetAt.length >= 10
|
|
39
|
+
? `resets ${details.resetAt.slice(0, 10)}`
|
|
40
|
+
: 'resets at the end of the period';
|
|
41
|
+
const path = typeof details.upgradeUrl === 'string' && details.upgradeUrl.startsWith('/') ? details.upgradeUrl : QUOTA_UPGRADE_PATH;
|
|
42
|
+
return `${label} quota reached (${used}/${limit}); ${resets}. Upgrade: ${platformUrl.replace(/\/+$/, '')}${path}`;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtZXhjZWVkZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9xdW90YS1leGNlZWRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQWtCLE1BQU0sZ0RBQWdELENBQUM7QUFFdkgsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDO0FBVXBELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFBYTtJQUMvQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFLLElBQTJCLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDO0FBQ3pHLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUFhLEVBQUUsV0FBbUI7SUFDdEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2pELE1BQU0sT0FBTyxHQUFHLENBQUUsSUFBOEIsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUF5QixDQUFDO0lBQ3hGLE1BQU0sSUFBSSxHQUFHLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNuRixNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxJQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RixNQUFNLElBQUksR0FBRyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzNGLE1BQU0sS0FBSyxHQUFHLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDOUYsTUFBTSxNQUFNLEdBQUcsT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFO1FBQ2hGLENBQUMsQ0FBQyxVQUFVLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMxQyxDQUFDLENBQUMsaUNBQWlDLENBQUM7SUFDdEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxPQUFPLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7SUFDcEksT0FBTyxHQUFHLEtBQUssbUJBQW1CLElBQUksSUFBSSxLQUFLLE1BQU0sTUFBTSxjQUFjLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ3BILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBSZW5kZXJpbmcgYSBgNDI5IFFVT1RBX0VYQ0VFREVEYCBmb3IgYSBwZXJzb24gcmVhZGluZyBhIHRlcm1pbmFsIG9yIGFcbiAqIENsb3VkRm9ybWF0aW9uIGV2ZW50IOKAlCBzaGFyZWQgYnkgdGhlIHBpcGVsaW5lLW1hbmFnZXIgQ0xJIGFuZCB0aGVcbiAqIHBsdWdpbi1sb29rdXAgTGFtYmRhIHNvIGJvdGggc2F5IHRoZSBzYW1lIHRoaW5nLlxuICpcbiAqIEEgcXVvdGEgcmVmdXNhbCBpcyBOT1QgYSByYXRlIGxpbWl0OiB3YWl0aW5nIGEgbW9tZW50IGNoYW5nZXMgbm90aGluZywgdGhlXG4gKiBjb3VudGVyIG9ubHkgZW1wdGllcyB3aGVuIHRoZSBwZXJpb2QgcmVzZXRzIChvciB0aGUgbGltaXQgaXMgcmFpc2VkKS4gU28gdGhlXG4gKiBtZXNzYWdlIG5hbWVzIHRoZSBxdW90YSwgdGhlIG51bWJlcnMsIHRoZSByZXNldCBkYXRlIGFuZCB3aGVyZSB0byByYWlzZSBpdCxcbiAqIGFuZCB0aGUgY2FsbGVycyBuZXZlciByZXRyeSBpdC4gQSA0MjkgV0lUSE9VVCB0aGlzIGNvZGUgaXMgYW4gb3JkaW5hcnkgcmF0ZVxuICogbGltaXQgKG5naW54LCBhIHBlci1vcmcgYnVyc3QgbGltaXRlcikgYW5kIGtlZXBzIHJhdGUtbGltaXQgd29yZGluZy5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgYSBkZXBlbmRlbmN5LWZyZWUgbGVhZiAodGhlIGxhYmVsIHRhYmxlIGlzIGEgc2lkZS1lZmZlY3QtZnJlZVxuICogZGVlcCBpbXBvcnQpOiB0aGUgTGFtYmRhIGJ1bmRsZSBtdXN0IG5vdCBwdWxsIHRoZSBhcGktY29yZSBiYXJyZWwuXG4gKi9cblxuaW1wb3J0IHsgUVVPVEFfVFlQRV9MQUJFTFMsIFFVT1RBX1VQR1JBREVfUEFUSCwgdHlwZSBRdW90YVR5cGUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZS9saWIvdHlwZXMvY29tbW9uLmpzJztcblxuLyoqIFRoZSBlcnJvciBgY29kZWAgYXBpLWNvcmUncyBgc2VuZFF1b3RhRXhjZWVkZWRgIGFuc3dlcnMgd2l0aC4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9FWENFRURFRF9DT0RFID0gJ1FVT1RBX0VYQ0VFREVEJztcblxuaW50ZXJmYWNlIFF1b3RhRXhjZWVkZWREZXRhaWxzIHtcbiAgcXVvdGFUeXBlPzogdW5rbm93bjtcbiAgbGltaXQ/OiB1bmtub3duO1xuICB1c2VkPzogdW5rbm93bjtcbiAgcmVzZXRBdD86IHVua25vd247XG4gIHVwZ3JhZGVVcmw/OiB1bmtub3duO1xufVxuXG4vKiogV2hldGhlciBhbiBlcnJvciByZXNwb25zZSBib2R5IGlzIGEgcXVvdGEgcmVmdXNhbCAoYGNvZGU6ICdRVU9UQV9FWENFRURFRCdgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1F1b3RhRXhjZWVkZWRCb2R5KGJvZHk6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuICEhYm9keSAmJiB0eXBlb2YgYm9keSA9PT0gJ29iamVjdCcgJiYgKGJvZHkgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlID09PSBRVU9UQV9FWENFRURFRF9DT0RFO1xufVxuXG4vKipcbiAqIGBcIkFQSSBjYWxsIHF1b3RhIHJlYWNoZWQgKDI1LDAwMC8yNSwwMDApOyByZXNldHMgMjAyNi0xMS0wNS4gVXBncmFkZTpcbiAqIGh0dHBzOi8vcGIuZXhhbXBsZS5jb20vZGFzaGJvYXJkL2JpbGxpbmdcImAgZm9yIGEgcXVvdGEgcmVmdXNhbCBib2R5LCBvclxuICogYHVuZGVmaW5lZGAgZm9yIGFueXRoaW5nIGVsc2UuIGBwbGF0Zm9ybVVybGAgcHJlZml4ZXMgdGhlIFJFTEFUSVZFIHVwZ3JhZGVcbiAqIHBhdGggdGhlIHNlcnZlciBzZW5kcyAodGhlIGRhc2hib2FyZCBhbmQgQVBJIHNoYXJlIGFuIG9yaWdpbiBiZWhpbmQgbmdpbngpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVRdW90YUV4Y2VlZGVkKGJvZHk6IHVua25vd24sIHBsYXRmb3JtVXJsOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzUXVvdGFFeGNlZWRlZEJvZHkoYm9keSkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRldGFpbHMgPSAoKGJvZHkgYXMgeyBkZXRhaWxzPzogdW5rbm93biB9KS5kZXRhaWxzID8/IHt9KSBhcyBRdW90YUV4Y2VlZGVkRGV0YWlscztcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiBkZXRhaWxzLnF1b3RhVHlwZSA9PT0gJ3N0cmluZycgPyBkZXRhaWxzLnF1b3RhVHlwZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbGFiZWwgPSAodHlwZSAmJiBRVU9UQV9UWVBFX0xBQkVMU1t0eXBlIGFzIFF1b3RhVHlwZV0pID8/ICh0eXBlID8gdHlwZSA6ICdVc2FnZScpO1xuICBjb25zdCB1c2VkID0gdHlwZW9mIGRldGFpbHMudXNlZCA9PT0gJ251bWJlcicgPyBkZXRhaWxzLnVzZWQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJykgOiAnPyc7XG4gIGNvbnN0IGxpbWl0ID0gdHlwZW9mIGRldGFpbHMubGltaXQgPT09ICdudW1iZXInID8gZGV0YWlscy5saW1pdC50b0xvY2FsZVN0cmluZygnZW4tVVMnKSA6ICc/JztcbiAgY29uc3QgcmVzZXRzID0gdHlwZW9mIGRldGFpbHMucmVzZXRBdCA9PT0gJ3N0cmluZycgJiYgZGV0YWlscy5yZXNldEF0Lmxlbmd0aCA+PSAxMFxuICAgID8gYHJlc2V0cyAke2RldGFpbHMucmVzZXRBdC5zbGljZSgwLCAxMCl9YFxuICAgIDogJ3Jlc2V0cyBhdCB0aGUgZW5kIG9mIHRoZSBwZXJpb2QnO1xuICBjb25zdCBwYXRoID0gdHlwZW9mIGRldGFpbHMudXBncmFkZVVybCA9PT0gJ3N0cmluZycgJiYgZGV0YWlscy51cGdyYWRlVXJsLnN0YXJ0c1dpdGgoJy8nKSA/IGRldGFpbHMudXBncmFkZVVybCA6IFFVT1RBX1VQR1JBREVfUEFUSDtcbiAgcmV0dXJuIGAke2xhYmVsfSBxdW90YSByZWFjaGVkICgke3VzZWR9LyR7bGltaXR9KTsgJHtyZXNldHN9LiBVcGdyYWRlOiAke3BsYXRmb3JtVXJsLnJlcGxhY2UoL1xcLyskLywgJycpfSR7cGF0aH1gO1xufVxuIl19
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run-time plugin vulnerability check — the CDK-free half.
|
|
3
|
+
*
|
|
4
|
+
* A step's image is pinned at synth. A CVE published (or a KEV listing, or an
|
|
5
|
+
* org-policy change) AFTER that synth never reaches a pipeline that is simply
|
|
6
|
+
* re-run, so a pipeline can opt in to re-asking the plugin service at run
|
|
7
|
+
* time: with {@link RUNTIME_VULN_CHECK_KEY} set, the synth adds one verify
|
|
8
|
+
* step to each stage that runs `pipeline-manager plugin verify --pipeline-id …`,
|
|
9
|
+
* which posts the stage's (stepKey, imageDigest) pairs to
|
|
10
|
+
* `POST /api/plugins/runtime-check` and prints the graded verdict into the
|
|
11
|
+
* build log (the platform also notifies on a pipeline running a vulnerable
|
|
12
|
+
* plugin). It NEVER fails the stage: vulnerability state is reported, not
|
|
13
|
+
* enforced.
|
|
14
|
+
*
|
|
15
|
+
* Dependency-free so the CLI and the synth share one shape.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Pipeline metadata flag (boolean, default false). Under `aws:cdk:` so it is
|
|
19
|
+
* never exported into a step's environment like plain metadata keys are.
|
|
20
|
+
*/
|
|
21
|
+
export declare const RUNTIME_VULN_CHECK_KEY = "aws:cdk:operations:runtimevulncheck";
|
|
22
|
+
/** Env var carrying the verify step's JSON `RuntimeCheckStep[]`. */
|
|
23
|
+
export declare const RUNTIME_CHECK_STEPS_ENV = "PB_VERIFY_STEPS";
|
|
24
|
+
/** One step the run-time check asks about. `stepKey` is the step label (`pluginStepLabel`). */
|
|
25
|
+
export interface RuntimeCheckStep {
|
|
26
|
+
readonly stepKey: string;
|
|
27
|
+
readonly imageDigest: string;
|
|
28
|
+
}
|
|
29
|
+
/** Graded verdict, least to most serious. Never a refusal. */
|
|
30
|
+
export type RuntimeCheckVerdict = 'ok' | 'info' | 'warning' | 'error' | 'critical';
|
|
31
|
+
export declare const RUNTIME_CHECK_VERDICTS: readonly RuntimeCheckVerdict[];
|
|
32
|
+
/** `POST /api/plugins/runtime-check` answer. */
|
|
33
|
+
export interface RuntimeCheckResult {
|
|
34
|
+
readonly verdict: RuntimeCheckVerdict;
|
|
35
|
+
readonly steps: ReadonlyArray<{
|
|
36
|
+
readonly stepKey: string;
|
|
37
|
+
readonly imageDigest: string;
|
|
38
|
+
readonly verdict: RuntimeCheckVerdict;
|
|
39
|
+
readonly reasons: ReadonlyArray<{
|
|
40
|
+
readonly code: string;
|
|
41
|
+
readonly message: string;
|
|
42
|
+
readonly severity?: string;
|
|
43
|
+
}>;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse a JSON `RuntimeCheckStep[]` (the env var, or a file). Throws on
|
|
48
|
+
* anything malformed: a verify step that silently checked nothing would be a
|
|
49
|
+
* false green.
|
|
50
|
+
*/
|
|
51
|
+
export declare function parseRuntimeCheckSteps(json: string): RuntimeCheckStep[];
|
|
52
|
+
/** Whether a metadata value turns the check on (`true` / `"true"`). */
|
|
53
|
+
export declare function isRuntimeVulnCheckEnabled(metadata: Record<string, unknown> | undefined): boolean;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Run-time plugin vulnerability check — the CDK-free half.
|
|
5
|
+
*
|
|
6
|
+
* A step's image is pinned at synth. A CVE published (or a KEV listing, or an
|
|
7
|
+
* org-policy change) AFTER that synth never reaches a pipeline that is simply
|
|
8
|
+
* re-run, so a pipeline can opt in to re-asking the plugin service at run
|
|
9
|
+
* time: with {@link RUNTIME_VULN_CHECK_KEY} set, the synth adds one verify
|
|
10
|
+
* step to each stage that runs `pipeline-manager plugin verify --pipeline-id …`,
|
|
11
|
+
* which posts the stage's (stepKey, imageDigest) pairs to
|
|
12
|
+
* `POST /api/plugins/runtime-check` and prints the graded verdict into the
|
|
13
|
+
* build log (the platform also notifies on a pipeline running a vulnerable
|
|
14
|
+
* plugin). It NEVER fails the stage: vulnerability state is reported, not
|
|
15
|
+
* enforced.
|
|
16
|
+
*
|
|
17
|
+
* Dependency-free so the CLI and the synth share one shape.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Pipeline metadata flag (boolean, default false). Under `aws:cdk:` so it is
|
|
21
|
+
* never exported into a step's environment like plain metadata keys are.
|
|
22
|
+
*/
|
|
23
|
+
export const RUNTIME_VULN_CHECK_KEY = 'aws:cdk:operations:runtimevulncheck';
|
|
24
|
+
/** Env var carrying the verify step's JSON `RuntimeCheckStep[]`. */
|
|
25
|
+
export const RUNTIME_CHECK_STEPS_ENV = 'PB_VERIFY_STEPS';
|
|
26
|
+
export const RUNTIME_CHECK_VERDICTS = ['ok', 'info', 'warning', 'error', 'critical'];
|
|
27
|
+
const DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
|
|
28
|
+
/**
|
|
29
|
+
* Parse a JSON `RuntimeCheckStep[]` (the env var, or a file). Throws on
|
|
30
|
+
* anything malformed: a verify step that silently checked nothing would be a
|
|
31
|
+
* false green.
|
|
32
|
+
*/
|
|
33
|
+
export function parseRuntimeCheckSteps(json) {
|
|
34
|
+
let parsed;
|
|
35
|
+
try {
|
|
36
|
+
parsed = JSON.parse(json);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new Error(`${RUNTIME_CHECK_STEPS_ENV} is not valid JSON`);
|
|
40
|
+
}
|
|
41
|
+
if (!Array.isArray(parsed))
|
|
42
|
+
throw new Error(`${RUNTIME_CHECK_STEPS_ENV} must be a JSON array of { stepKey, imageDigest }`);
|
|
43
|
+
return parsed.map((entry, i) => {
|
|
44
|
+
const e = entry;
|
|
45
|
+
if (!e || typeof e.stepKey !== 'string' || e.stepKey.length === 0 || typeof e.imageDigest !== 'string' || !DIGEST_RE.test(e.imageDigest)) {
|
|
46
|
+
throw new Error(`${RUNTIME_CHECK_STEPS_ENV}[${i}] must be { stepKey: string, imageDigest: sha256:<64 hex> }`);
|
|
47
|
+
}
|
|
48
|
+
return { stepKey: e.stepKey, imageDigest: e.imageDigest };
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/** Whether a metadata value turns the check on (`true` / `"true"`). */
|
|
52
|
+
export function isRuntimeVulnCheckEnabled(metadata) {
|
|
53
|
+
const v = metadata?.[RUNTIME_VULN_CHECK_KEY];
|
|
54
|
+
return v === true || (typeof v === 'string' && v.toLowerCase() === 'true');
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1jaGVjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtY2hlY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxxQ0FBcUMsQ0FBQztBQUU1RSxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7QUFXekQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQW1DLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBYXJILE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDO0FBRTFDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsSUFBWTtJQUNqRCxJQUFJLE1BQWUsQ0FBQztJQUNwQixJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLHVCQUF1QixvQkFBb0IsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsdUJBQXVCLG1EQUFtRCxDQUFDLENBQUM7SUFDM0gsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLEtBQXlDLENBQUM7UUFDcEQsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN6SSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsdUJBQXVCLElBQUksQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1FBQ2hILENBQUM7UUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFFBQTZDO0lBQ3JGLE1BQU0sQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDN0MsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQztBQUM3RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUnVuLXRpbWUgcGx1Z2luIHZ1bG5lcmFiaWxpdHkgY2hlY2sg4oCUIHRoZSBDREstZnJlZSBoYWxmLlxuICpcbiAqIEEgc3RlcCdzIGltYWdlIGlzIHBpbm5lZCBhdCBzeW50aC4gQSBDVkUgcHVibGlzaGVkIChvciBhIEtFViBsaXN0aW5nLCBvciBhblxuICogb3JnLXBvbGljeSBjaGFuZ2UpIEFGVEVSIHRoYXQgc3ludGggbmV2ZXIgcmVhY2hlcyBhIHBpcGVsaW5lIHRoYXQgaXMgc2ltcGx5XG4gKiByZS1ydW4sIHNvIGEgcGlwZWxpbmUgY2FuIG9wdCBpbiB0byByZS1hc2tpbmcgdGhlIHBsdWdpbiBzZXJ2aWNlIGF0IHJ1blxuICogdGltZTogd2l0aCB7QGxpbmsgUlVOVElNRV9WVUxOX0NIRUNLX0tFWX0gc2V0LCB0aGUgc3ludGggYWRkcyBvbmUgdmVyaWZ5XG4gKiBzdGVwIHRvIGVhY2ggc3RhZ2UgdGhhdCBydW5zIGBwaXBlbGluZS1tYW5hZ2VyIHBsdWdpbiB2ZXJpZnkgLS1waXBlbGluZS1pZCDigKZgLFxuICogd2hpY2ggcG9zdHMgdGhlIHN0YWdlJ3MgKHN0ZXBLZXksIGltYWdlRGlnZXN0KSBwYWlycyB0b1xuICogYFBPU1QgL2FwaS9wbHVnaW5zL3J1bnRpbWUtY2hlY2tgIGFuZCBwcmludHMgdGhlIGdyYWRlZCB2ZXJkaWN0IGludG8gdGhlXG4gKiBidWlsZCBsb2cgKHRoZSBwbGF0Zm9ybSBhbHNvIG5vdGlmaWVzIG9uIGEgcGlwZWxpbmUgcnVubmluZyBhIHZ1bG5lcmFibGVcbiAqIHBsdWdpbikuIEl0IE5FVkVSIGZhaWxzIHRoZSBzdGFnZTogdnVsbmVyYWJpbGl0eSBzdGF0ZSBpcyByZXBvcnRlZCwgbm90XG4gKiBlbmZvcmNlZC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgc28gdGhlIENMSSBhbmQgdGhlIHN5bnRoIHNoYXJlIG9uZSBzaGFwZS5cbiAqL1xuXG4vKipcbiAqIFBpcGVsaW5lIG1ldGFkYXRhIGZsYWcgKGJvb2xlYW4sIGRlZmF1bHQgZmFsc2UpLiBVbmRlciBgYXdzOmNkazpgIHNvIGl0IGlzXG4gKiBuZXZlciBleHBvcnRlZCBpbnRvIGEgc3RlcCdzIGVudmlyb25tZW50IGxpa2UgcGxhaW4gbWV0YWRhdGEga2V5cyBhcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBSVU5USU1FX1ZVTE5fQ0hFQ0tfS0VZID0gJ2F3czpjZGs6b3BlcmF0aW9uczpydW50aW1ldnVsbmNoZWNrJztcblxuLyoqIEVudiB2YXIgY2FycnlpbmcgdGhlIHZlcmlmeSBzdGVwJ3MgSlNPTiBgUnVudGltZUNoZWNrU3RlcFtdYC4gKi9cbmV4cG9ydCBjb25zdCBSVU5USU1FX0NIRUNLX1NURVBTX0VOViA9ICdQQl9WRVJJRllfU1RFUFMnO1xuXG4vKiogT25lIHN0ZXAgdGhlIHJ1bi10aW1lIGNoZWNrIGFza3MgYWJvdXQuIGBzdGVwS2V5YCBpcyB0aGUgc3RlcCBsYWJlbCAoYHBsdWdpblN0ZXBMYWJlbGApLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lQ2hlY2tTdGVwIHtcbiAgcmVhZG9ubHkgc3RlcEtleTogc3RyaW5nO1xuICByZWFkb25seSBpbWFnZURpZ2VzdDogc3RyaW5nO1xufVxuXG4vKiogR3JhZGVkIHZlcmRpY3QsIGxlYXN0IHRvIG1vc3Qgc2VyaW91cy4gTmV2ZXIgYSByZWZ1c2FsLiAqL1xuZXhwb3J0IHR5cGUgUnVudGltZUNoZWNrVmVyZGljdCA9ICdvaycgfCAnaW5mbycgfCAnd2FybmluZycgfCAnZXJyb3InIHwgJ2NyaXRpY2FsJztcblxuZXhwb3J0IGNvbnN0IFJVTlRJTUVfQ0hFQ0tfVkVSRElDVFM6IHJlYWRvbmx5IFJ1bnRpbWVDaGVja1ZlcmRpY3RbXSA9IFsnb2snLCAnaW5mbycsICd3YXJuaW5nJywgJ2Vycm9yJywgJ2NyaXRpY2FsJ107XG5cbi8qKiBgUE9TVCAvYXBpL3BsdWdpbnMvcnVudGltZS1jaGVja2AgYW5zd2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lQ2hlY2tSZXN1bHQge1xuICByZWFkb25seSB2ZXJkaWN0OiBSdW50aW1lQ2hlY2tWZXJkaWN0O1xuICByZWFkb25seSBzdGVwczogUmVhZG9ubHlBcnJheTx7XG4gICAgcmVhZG9ubHkgc3RlcEtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGltYWdlRGlnZXN0OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmVyZGljdDogUnVudGltZUNoZWNrVmVyZGljdDtcbiAgICByZWFkb25seSByZWFzb25zOiBSZWFkb25seUFycmF5PHsgcmVhZG9ubHkgY29kZTogc3RyaW5nOyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7IHJlYWRvbmx5IHNldmVyaXR5Pzogc3RyaW5nIH0+O1xuICB9Pjtcbn1cblxuY29uc3QgRElHRVNUX1JFID0gL15zaGEyNTY6WzAtOWEtZl17NjR9JC87XG5cbi8qKlxuICogUGFyc2UgYSBKU09OIGBSdW50aW1lQ2hlY2tTdGVwW11gICh0aGUgZW52IHZhciwgb3IgYSBmaWxlKS4gVGhyb3dzIG9uXG4gKiBhbnl0aGluZyBtYWxmb3JtZWQ6IGEgdmVyaWZ5IHN0ZXAgdGhhdCBzaWxlbnRseSBjaGVja2VkIG5vdGhpbmcgd291bGQgYmUgYVxuICogZmFsc2UgZ3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJ1bnRpbWVDaGVja1N0ZXBzKGpzb246IHN0cmluZyk6IFJ1bnRpbWVDaGVja1N0ZXBbXSB7XG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShqc29uKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1JVTlRJTUVfQ0hFQ0tfU1RFUFNfRU5WfSBpcyBub3QgdmFsaWQgSlNPTmApO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQpKSB0aHJvdyBuZXcgRXJyb3IoYCR7UlVOVElNRV9DSEVDS19TVEVQU19FTlZ9IG11c3QgYmUgYSBKU09OIGFycmF5IG9mIHsgc3RlcEtleSwgaW1hZ2VEaWdlc3QgfWApO1xuICByZXR1cm4gcGFyc2VkLm1hcCgoZW50cnksIGkpID0+IHtcbiAgICBjb25zdCBlID0gZW50cnkgYXMgUGFydGlhbDxSdW50aW1lQ2hlY2tTdGVwPiB8IG51bGw7XG4gICAgaWYgKCFlIHx8IHR5cGVvZiBlLnN0ZXBLZXkgIT09ICdzdHJpbmcnIHx8IGUuc3RlcEtleS5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGUuaW1hZ2VEaWdlc3QgIT09ICdzdHJpbmcnIHx8ICFESUdFU1RfUkUudGVzdChlLmltYWdlRGlnZXN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1JVTlRJTUVfQ0hFQ0tfU1RFUFNfRU5WfVske2l9XSBtdXN0IGJlIHsgc3RlcEtleTogc3RyaW5nLCBpbWFnZURpZ2VzdDogc2hhMjU2Ojw2NCBoZXg+IH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RlcEtleTogZS5zdGVwS2V5LCBpbWFnZURpZ2VzdDogZS5pbWFnZURpZ2VzdCB9O1xuICB9KTtcbn1cblxuLyoqIFdoZXRoZXIgYSBtZXRhZGF0YSB2YWx1ZSB0dXJucyB0aGUgY2hlY2sgb24gKGB0cnVlYCAvIGBcInRydWVcImApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUnVudGltZVZ1bG5DaGVja0VuYWJsZWQobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGNvbnN0IHYgPSBtZXRhZGF0YT8uW1JVTlRJTUVfVlVMTl9DSEVDS19LRVldO1xuICByZXR1cm4gdiA9PT0gdHJ1ZSB8fCAodHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploading a step's security reports (SARIF / trivy JSON / grype JSON) to
|
|
3
|
+
* `POST /api/pipelines/:id/security-reports`.
|
|
4
|
+
*
|
|
5
|
+
* A plugin step has no platform credential: plugin images don't carry
|
|
6
|
+
* `pipeline-manager`, and the org's `platform` secret is the full-privilege
|
|
7
|
+
* automation key, which a container that builds user code must not hold. So a
|
|
8
|
+
* step that opts in (`PB_UPLOAD_SECURITY_REPORTS=true` in its env, metadata or
|
|
9
|
+
* the plugin's defaults) gets the org's `reporting:ingest`-SCOPED key instead —
|
|
10
|
+
* the same least-privilege credential the events Lambda reports with, minted by
|
|
11
|
+
* `pipeline-manager infra store-token --scope reporting:ingest` — injected by
|
|
12
|
+
* CodeBuild from Secrets Manager as {@link SECURITY_REPORT_KEY_ENV}. The plugin
|
|
13
|
+
* POSTs with it as a Bearer credential. Opting in without that secret fails the
|
|
14
|
+
* build at DOWNLOAD_SOURCE (CodeBuild requires the secret) — loud, not skipped.
|
|
15
|
+
*
|
|
16
|
+
* Dependency-free so the CLI and the synth share the names.
|
|
17
|
+
*/
|
|
18
|
+
/** Step env flag that opts a step in to report upload. */
|
|
19
|
+
export declare const SECURITY_REPORT_UPLOAD_ENV = "PB_UPLOAD_SECURITY_REPORTS";
|
|
20
|
+
/** Env var the scoped upload key is injected as. */
|
|
21
|
+
export declare const SECURITY_REPORT_KEY_ENV = "PB_SECURITY_REPORT_KEY";
|
|
22
|
+
/** Secrets Manager leaf of the scoped key (`scopeSecretLeaf('reporting:ingest')`). */
|
|
23
|
+
export declare const SECURITY_REPORT_SECRET_LEAF = "reporting-ingest";
|
|
24
|
+
/** Report formats the ingest endpoint accepts. */
|
|
25
|
+
export declare const SECURITY_REPORT_FORMATS: readonly ['sarif', 'trivy-json', 'grype-json'];
|
|
26
|
+
export type SecurityReportFormat = (typeof SECURITY_REPORT_FORMATS)[number];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Uploading a step's security reports (SARIF / trivy JSON / grype JSON) to
|
|
5
|
+
* `POST /api/pipelines/:id/security-reports`.
|
|
6
|
+
*
|
|
7
|
+
* A plugin step has no platform credential: plugin images don't carry
|
|
8
|
+
* `pipeline-manager`, and the org's `platform` secret is the full-privilege
|
|
9
|
+
* automation key, which a container that builds user code must not hold. So a
|
|
10
|
+
* step that opts in (`PB_UPLOAD_SECURITY_REPORTS=true` in its env, metadata or
|
|
11
|
+
* the plugin's defaults) gets the org's `reporting:ingest`-SCOPED key instead —
|
|
12
|
+
* the same least-privilege credential the events Lambda reports with, minted by
|
|
13
|
+
* `pipeline-manager infra store-token --scope reporting:ingest` — injected by
|
|
14
|
+
* CodeBuild from Secrets Manager as {@link SECURITY_REPORT_KEY_ENV}. The plugin
|
|
15
|
+
* POSTs with it as a Bearer credential. Opting in without that secret fails the
|
|
16
|
+
* build at DOWNLOAD_SOURCE (CodeBuild requires the secret) — loud, not skipped.
|
|
17
|
+
*
|
|
18
|
+
* Dependency-free so the CLI and the synth share the names.
|
|
19
|
+
*/
|
|
20
|
+
/** Step env flag that opts a step in to report upload. */
|
|
21
|
+
export const SECURITY_REPORT_UPLOAD_ENV = 'PB_UPLOAD_SECURITY_REPORTS';
|
|
22
|
+
/** Env var the scoped upload key is injected as. */
|
|
23
|
+
export const SECURITY_REPORT_KEY_ENV = 'PB_SECURITY_REPORT_KEY';
|
|
24
|
+
/** Secrets Manager leaf of the scoped key (`scopeSecretLeaf('reporting:ingest')`). */
|
|
25
|
+
export const SECURITY_REPORT_SECRET_LEAF = 'reporting-ingest';
|
|
26
|
+
/** Report formats the ingest endpoint accepts. */
|
|
27
|
+
export const SECURITY_REPORT_FORMATS = ['sarif', 'trivy-json', 'grype-json'];
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktcmVwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3NlY3VyaXR5LXJlcG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0QkFBNEIsQ0FBQztBQUV2RSxvREFBb0Q7QUFDcEQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsd0JBQXdCLENBQUM7QUFFaEUsc0ZBQXNGO0FBQ3RGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLGtCQUFrQixDQUFDO0FBRTlELGtEQUFrRDtBQUNsRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBVcGxvYWRpbmcgYSBzdGVwJ3Mgc2VjdXJpdHkgcmVwb3J0cyAoU0FSSUYgLyB0cml2eSBKU09OIC8gZ3J5cGUgSlNPTikgdG9cbiAqIGBQT1NUIC9hcGkvcGlwZWxpbmVzLzppZC9zZWN1cml0eS1yZXBvcnRzYC5cbiAqXG4gKiBBIHBsdWdpbiBzdGVwIGhhcyBubyBwbGF0Zm9ybSBjcmVkZW50aWFsOiBwbHVnaW4gaW1hZ2VzIGRvbid0IGNhcnJ5XG4gKiBgcGlwZWxpbmUtbWFuYWdlcmAsIGFuZCB0aGUgb3JnJ3MgYHBsYXRmb3JtYCBzZWNyZXQgaXMgdGhlIGZ1bGwtcHJpdmlsZWdlXG4gKiBhdXRvbWF0aW9uIGtleSwgd2hpY2ggYSBjb250YWluZXIgdGhhdCBidWlsZHMgdXNlciBjb2RlIG11c3Qgbm90IGhvbGQuIFNvIGFcbiAqIHN0ZXAgdGhhdCBvcHRzIGluIChgUEJfVVBMT0FEX1NFQ1VSSVRZX1JFUE9SVFM9dHJ1ZWAgaW4gaXRzIGVudiwgbWV0YWRhdGEgb3JcbiAqIHRoZSBwbHVnaW4ncyBkZWZhdWx0cykgZ2V0cyB0aGUgb3JnJ3MgYHJlcG9ydGluZzppbmdlc3RgLVNDT1BFRCBrZXkgaW5zdGVhZCDigJRcbiAqIHRoZSBzYW1lIGxlYXN0LXByaXZpbGVnZSBjcmVkZW50aWFsIHRoZSBldmVudHMgTGFtYmRhIHJlcG9ydHMgd2l0aCwgbWludGVkIGJ5XG4gKiBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlcG9ydGluZzppbmdlc3RgIOKAlCBpbmplY3RlZCBieVxuICogQ29kZUJ1aWxkIGZyb20gU2VjcmV0cyBNYW5hZ2VyIGFzIHtAbGluayBTRUNVUklUWV9SRVBPUlRfS0VZX0VOVn0uIFRoZSBwbHVnaW5cbiAqIFBPU1RzIHdpdGggaXQgYXMgYSBCZWFyZXIgY3JlZGVudGlhbC4gT3B0aW5nIGluIHdpdGhvdXQgdGhhdCBzZWNyZXQgZmFpbHMgdGhlXG4gKiBidWlsZCBhdCBET1dOTE9BRF9TT1VSQ0UgKENvZGVCdWlsZCByZXF1aXJlcyB0aGUgc2VjcmV0KSDigJQgbG91ZCwgbm90IHNraXBwZWQuXG4gKlxuICogRGVwZW5kZW5jeS1mcmVlIHNvIHRoZSBDTEkgYW5kIHRoZSBzeW50aCBzaGFyZSB0aGUgbmFtZXMuXG4gKi9cblxuLyoqIFN0ZXAgZW52IGZsYWcgdGhhdCBvcHRzIGEgc3RlcCBpbiB0byByZXBvcnQgdXBsb2FkLiAqL1xuZXhwb3J0IGNvbnN0IFNFQ1VSSVRZX1JFUE9SVF9VUExPQURfRU5WID0gJ1BCX1VQTE9BRF9TRUNVUklUWV9SRVBPUlRTJztcblxuLyoqIEVudiB2YXIgdGhlIHNjb3BlZCB1cGxvYWQga2V5IGlzIGluamVjdGVkIGFzLiAqL1xuZXhwb3J0IGNvbnN0IFNFQ1VSSVRZX1JFUE9SVF9LRVlfRU5WID0gJ1BCX1NFQ1VSSVRZX1JFUE9SVF9LRVknO1xuXG4vKiogU2VjcmV0cyBNYW5hZ2VyIGxlYWYgb2YgdGhlIHNjb3BlZCBrZXkgKGBzY29wZVNlY3JldExlYWYoJ3JlcG9ydGluZzppbmdlc3QnKWApLiAqL1xuZXhwb3J0IGNvbnN0IFNFQ1VSSVRZX1JFUE9SVF9TRUNSRVRfTEVBRiA9ICdyZXBvcnRpbmctaW5nZXN0JztcblxuLyoqIFJlcG9ydCBmb3JtYXRzIHRoZSBpbmdlc3QgZW5kcG9pbnQgYWNjZXB0cy4gKi9cbmV4cG9ydCBjb25zdCBTRUNVUklUWV9SRVBPUlRfRk9STUFUUyA9IFsnc2FyaWYnLCAndHJpdnktanNvbicsICdncnlwZS1qc29uJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTZWN1cml0eVJlcG9ydEZvcm1hdCA9ICh0eXBlb2YgU0VDVVJJVFlfUkVQT1JUX0ZPUk1BVFMpW251bWJlcl07XG4iXX0=
|
|
@@ -27,6 +27,13 @@ export interface StepManifestEntry {
|
|
|
27
27
|
readonly pluginVersion: string;
|
|
28
28
|
/** Signed image digest the step is pinned to; null for image-less plugins. */
|
|
29
29
|
readonly imageDigest: string | null;
|
|
30
|
+
/**
|
|
31
|
+
* The step's label (`pluginStepLabel`: `synth` or `<stage>/<alias ?? name>`) —
|
|
32
|
+
* what the CLI and the lookup Lambda send as lookup `context.stepKeys`, and the
|
|
33
|
+
* run-time check asks about. Lets the platform join lookup warnings to this
|
|
34
|
+
* manifest row.
|
|
35
|
+
*/
|
|
36
|
+
readonly stepKey?: string;
|
|
30
37
|
}
|
|
31
38
|
/** The plugin fields {@link pluginImageRepository} reads. */
|
|
32
39
|
export interface PluginImageRef {
|