@pipeline-builder/pipeline-core 0.0.1
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/LICENSE +202 -0
- package/README.md +69 -0
- package/lib/cdk.d.ts +38 -0
- package/lib/cdk.js +44 -0
- package/lib/config/app-config.d.ts +109 -0
- package/lib/config/app-config.js +197 -0
- package/lib/config/aws-config-cdk.d.ts +49 -0
- package/lib/config/aws-config-cdk.js +65 -0
- package/lib/config/billing-config.d.ts +24 -0
- package/lib/config/billing-config.js +497 -0
- package/lib/config/config-types.d.ts +346 -0
- package/lib/config/config-types.js +4 -0
- package/lib/config/entitlements.d.ts +23 -0
- package/lib/config/entitlements.js +46 -0
- package/lib/config/handler-constants.d.ts +10 -0
- package/lib/config/handler-constants.js +39 -0
- package/lib/config/infrastructure-config.d.ts +66 -0
- package/lib/config/infrastructure-config.js +197 -0
- package/lib/config/server-config.d.ts +53 -0
- package/lib/config/server-config.js +175 -0
- package/lib/config/service-client.d.ts +13 -0
- package/lib/config/service-client.js +20 -0
- package/lib/core/artifact-manager.d.ts +62 -0
- package/lib/core/artifact-manager.js +83 -0
- package/lib/core/id-generator.d.ts +50 -0
- package/lib/core/id-generator.js +50 -0
- package/lib/core/metadata-builder.d.ts +48 -0
- package/lib/core/metadata-builder.js +278 -0
- package/lib/core/metadata-helpers.d.ts +31 -0
- package/lib/core/metadata-helpers.js +55 -0
- package/lib/core/network-types.d.ts +200 -0
- package/lib/core/network-types.js +4 -0
- package/lib/core/network.d.ts +33 -0
- package/lib/core/network.js +112 -0
- package/lib/core/pipeline-helpers.d.ts +61 -0
- package/lib/core/pipeline-helpers.js +563 -0
- package/lib/core/pipeline-types.d.ts +118 -0
- package/lib/core/pipeline-types.js +131 -0
- package/lib/core/role-types.d.ts +254 -0
- package/lib/core/role-types.js +4 -0
- package/lib/core/role.d.ts +14 -0
- package/lib/core/role.js +117 -0
- package/lib/core/security-group-types.d.ts +84 -0
- package/lib/core/security-group-types.js +4 -0
- package/lib/core/security-group.d.ts +14 -0
- package/lib/core/security-group.js +33 -0
- package/lib/handlers/plugin-lookup-handler.d.ts +32 -0
- package/lib/handlers/plugin-lookup-handler.js +292 -0
- package/lib/handlers/pnpm-lock.yaml +12 -0
- package/lib/index.d.ts +45 -0
- package/lib/index.js +53 -0
- package/lib/pipeline/pipeline-builder.d.ts +123 -0
- package/lib/pipeline/pipeline-builder.js +476 -0
- package/lib/pipeline/pipeline-configuration.d.ts +81 -0
- package/lib/pipeline/pipeline-configuration.js +214 -0
- package/lib/pipeline/plugin-lookup.d.ts +131 -0
- package/lib/pipeline/plugin-lookup.js +316 -0
- package/lib/pipeline/plugin-spec.d.ts +138 -0
- package/lib/pipeline/plugin-spec.js +4 -0
- package/lib/pipeline/source-builder.d.ts +62 -0
- package/lib/pipeline/source-builder.js +164 -0
- package/lib/pipeline/source-types.d.ts +221 -0
- package/lib/pipeline/source-types.js +4 -0
- package/lib/pipeline/stage-builder.d.ts +78 -0
- package/lib/pipeline/stage-builder.js +129 -0
- package/lib/pipeline/step-types.d.ts +222 -0
- package/lib/pipeline/step-types.js +4 -0
- package/lib/template/evaluator.d.ts +42 -0
- package/lib/template/evaluator.js +164 -0
- package/lib/template/index.d.ts +34 -0
- package/lib/template/index.js +118 -0
- package/lib/template/metrics.d.ts +10 -0
- package/lib/template/metrics.js +43 -0
- package/lib/template/plugin-resolver.d.ts +8 -0
- package/lib/template/plugin-resolver.js +48 -0
- package/lib/template/tokenizer.d.ts +49 -0
- package/lib/template/tokenizer.js +233 -0
- package/lib/template/topo-sort.d.ts +17 -0
- package/lib/template/topo-sort.js +88 -0
- package/lib/template/validate.d.ts +45 -0
- package/lib/template/validate.js +96 -0
- package/lib/template/walker.d.ts +34 -0
- package/lib/template/walker.js +83 -0
- package/package.json +184 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { CodePipeline } from 'aws-cdk-lib/pipelines';
|
|
4
|
+
import { Construct } from 'constructs';
|
|
5
|
+
import { PluginLookup } from './plugin-lookup.js';
|
|
6
|
+
import { UniqueId } from '../core/id-generator.js';
|
|
7
|
+
import { merge, resolveFailureBehavior } from '../core/metadata-helpers.js';
|
|
8
|
+
import { createCodeBuildStep } from '../core/pipeline-helpers.js';
|
|
9
|
+
/**
|
|
10
|
+
* Builds and adds pipeline stages (waves) to a CodePipeline.
|
|
11
|
+
*
|
|
12
|
+
* Each stage is resolved from high-level configuration (plugin names)
|
|
13
|
+
* into CDK CodeBuild steps via PluginLookup, then added as a wave.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const stageBuilder = new StageBuilder({
|
|
18
|
+
* scope: this,
|
|
19
|
+
* pluginLookup,
|
|
20
|
+
* uniqueId,
|
|
21
|
+
* globalMetadata: mergedMetadata,
|
|
22
|
+
* });
|
|
23
|
+
* stageBuilder.addStage(pipeline, {
|
|
24
|
+
* stageName: 'Integration Tests',
|
|
25
|
+
* alias: 'integration',
|
|
26
|
+
* steps: [
|
|
27
|
+
* { plugin: { name: 'jest-integration' } },
|
|
28
|
+
* { plugin: { name: 'e2e-tests', alias: 'cypress' } },
|
|
29
|
+
* ],
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export class StageBuilder {
|
|
34
|
+
scope;
|
|
35
|
+
pluginLookup;
|
|
36
|
+
uniqueId;
|
|
37
|
+
globalMetadata;
|
|
38
|
+
defaultComputeType;
|
|
39
|
+
artifactManager;
|
|
40
|
+
orgId;
|
|
41
|
+
pipelineScope;
|
|
42
|
+
constructor(props) {
|
|
43
|
+
this.scope = props.scope;
|
|
44
|
+
this.pluginLookup = props.pluginLookup;
|
|
45
|
+
this.uniqueId = props.uniqueId;
|
|
46
|
+
this.globalMetadata = props.globalMetadata;
|
|
47
|
+
this.defaultComputeType = props.defaultComputeType;
|
|
48
|
+
this.artifactManager = props.artifactManager;
|
|
49
|
+
this.orgId = props.orgId;
|
|
50
|
+
this.pipelineScope = props.pipelineScope;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Resolves a stage's plugin-based step configs into CodeBuild steps
|
|
54
|
+
* and adds them as a wave to the pipeline.
|
|
55
|
+
*/
|
|
56
|
+
addStage(pipeline, stage) {
|
|
57
|
+
const stageAlias = stage.alias ?? `${stage.stageName}-alias`;
|
|
58
|
+
const preSteps = stage.steps
|
|
59
|
+
.filter(s => (s.position ?? 'pre') === 'pre')
|
|
60
|
+
.map(s => this.resolveStep(s, stage.stageName, stageAlias));
|
|
61
|
+
const postSteps = stage.steps
|
|
62
|
+
.filter(s => s.position === 'post')
|
|
63
|
+
.map(s => this.resolveStep(s, stage.stageName, stageAlias));
|
|
64
|
+
pipeline.addWave(stageAlias, {
|
|
65
|
+
...(preSteps.length > 0 && { pre: preSteps }),
|
|
66
|
+
...(postSteps.length > 0 && { post: postSteps }),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
resolveStep(stepConfig, stageName, stageAlias) {
|
|
70
|
+
const plugin = this.pluginLookup.plugin(stepConfig.plugin);
|
|
71
|
+
// Per-step plugin config lives on the plugin reference (`plugin.metadata` —
|
|
72
|
+
// e.g. JAVA_VERSION/KOTLIN_VERSION/computetype overrides). pluginLookup.plugin()
|
|
73
|
+
// returns the resolved CATALOG plugin and drops the reference metadata in the
|
|
74
|
+
// pre-resolved path, so merge it here too — otherwise per-step overrides are
|
|
75
|
+
// silently ignored and the build falls back to plugin defaults.
|
|
76
|
+
// Order (last wins): global < plugin-ref metadata < step-level metadata.
|
|
77
|
+
const stepMetadata = merge(this.globalMetadata, stepConfig.plugin.metadata ?? {}, stepConfig.metadata ?? {});
|
|
78
|
+
const pluginAlias = stepConfig.plugin.alias ?? stepConfig.plugin.name;
|
|
79
|
+
if (stepConfig.inputArtifact && !this.artifactManager) {
|
|
80
|
+
throw new Error(`Step "${pluginAlias}" requires inputArtifact but no artifactManager is configured.`);
|
|
81
|
+
}
|
|
82
|
+
if (stepConfig.additionalInputArtifacts?.length && !this.artifactManager) {
|
|
83
|
+
throw new Error(`Step "${pluginAlias}" requires additionalInputArtifacts but no artifactManager is configured.`);
|
|
84
|
+
}
|
|
85
|
+
const input = stepConfig.inputArtifact && this.artifactManager
|
|
86
|
+
? this.artifactManager.getOutput(stepConfig.inputArtifact)
|
|
87
|
+
: undefined;
|
|
88
|
+
const additionalInputs = stepConfig.additionalInputArtifacts?.length && this.artifactManager
|
|
89
|
+
? Object.fromEntries(stepConfig.additionalInputArtifacts.map(({ artifact, directory }) => [
|
|
90
|
+
directory || artifact.outputDirectory,
|
|
91
|
+
this.artifactManager.getOutput(artifact),
|
|
92
|
+
]))
|
|
93
|
+
: undefined;
|
|
94
|
+
return createCodeBuildStep({
|
|
95
|
+
id: this.uniqueId.generate(`stage:${stageAlias}:${pluginAlias}`),
|
|
96
|
+
uniqueId: this.uniqueId,
|
|
97
|
+
plugin,
|
|
98
|
+
metadata: stepMetadata,
|
|
99
|
+
network: stepConfig.network,
|
|
100
|
+
scope: this.scope,
|
|
101
|
+
defaultComputeType: this.defaultComputeType,
|
|
102
|
+
input,
|
|
103
|
+
additionalInputs,
|
|
104
|
+
artifactManager: this.artifactManager,
|
|
105
|
+
stageName,
|
|
106
|
+
stageAlias,
|
|
107
|
+
pluginAlias,
|
|
108
|
+
preInstallCommands: stepConfig.preInstallCommands,
|
|
109
|
+
postInstallCommands: stepConfig.postInstallCommands,
|
|
110
|
+
preCommands: stepConfig.preCommands,
|
|
111
|
+
postCommands: stepConfig.postCommands,
|
|
112
|
+
env: stepConfig.env,
|
|
113
|
+
timeout: stepConfig.timeout ?? plugin.timeout ?? undefined,
|
|
114
|
+
// A scan/security-category plugin can never be downgraded from 'fail' — see resolveFailureBehavior.
|
|
115
|
+
failureBehavior: resolveFailureBehavior(plugin.category, stepConfig.failureBehavior ?? plugin.failureBehavior),
|
|
116
|
+
orgId: this.orgId,
|
|
117
|
+
pipelineScope: this.pipelineScope,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resolves and adds multiple stages as waves to the pipeline, in order.
|
|
122
|
+
*/
|
|
123
|
+
addStages(pipeline, stages) {
|
|
124
|
+
for (const stage of stages) {
|
|
125
|
+
this.addStage(pipeline, stage);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2UtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZS9zdGFnZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFHdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFvQ2xFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQ04sS0FBSyxDQUFZO0lBQ2pCLFlBQVksQ0FBZTtJQUMzQixRQUFRLENBQVc7SUFDbkIsY0FBYyxDQUFlO0lBQzdCLGtCQUFrQixDQUFrQjtJQUNwQyxlQUFlLENBQW1CO0lBQ2xDLEtBQUssQ0FBVTtJQUNmLGFBQWEsQ0FBMEI7SUFFeEQsWUFBWSxLQUF3QjtRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDM0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztRQUNuRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFl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QUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLFFBQXNCLEVBQUUsTUFBc0I7UUFDdEQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgQ29tcHV0ZVR5cGUgYXMgQ2RrQ29tcHV0ZVR5cGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkJztcbmltcG9ydCB7IENvZGVQaXBlbGluZSB9IGZyb20gJ2F3cy1jZGstbGliL3BpcGVsaW5lcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFBsdWdpbkxvb2t1cCB9IGZyb20gJy4vcGx1Z2luLWxvb2t1cC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlT3B0aW9ucyB9IGZyb20gJy4vc3RlcC10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEFydGlmYWN0TWFuYWdlciB9IGZyb20gJy4uL2NvcmUvYXJ0aWZhY3QtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBVbmlxdWVJZCB9IGZyb20gJy4uL2NvcmUvaWQtZ2VuZXJhdG9yLmpzJztcbmltcG9ydCB7IG1lcmdlLCByZXNvbHZlRmFpbHVyZUJlaGF2aW9yIH0gZnJvbSAnLi4vY29yZS9tZXRhZGF0YS1oZWxwZXJzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUNvZGVCdWlsZFN0ZXAgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLWhlbHBlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRhRGF0YVR5cGUgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBTdGFnZUJ1aWxkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnZUJ1aWxkZXJQcm9wcyB7XG4gIC8qKiBDREsgY29uc3RydWN0IHNjb3BlIGZvciBjcmVhdGluZyBjaGlsZCBjb25zdHJ1Y3RzICovXG4gIHJlYWRvbmx5IHNjb3BlOiBDb25zdHJ1Y3Q7XG5cbiAgLyoqIFBsdWdpbiBsb29rdXAgc2VydmljZSBmb3IgcmVzb2x2aW5nIHBsdWdpbiByZWZlcmVuY2VzIHRvIENESyBjb25zdHJ1Y3RzICovXG4gIHJlYWRvbmx5IHBsdWdpbkxvb2t1cDogUGx1Z2luTG9va3VwO1xuXG4gIC8qKiBVbmlxdWUgSUQgZ2VuZXJhdG9yIGZvciBjcmVhdGluZyBkZXRlcm1pbmlzdGljIGNvbnN0cnVjdCBJRHMgKi9cbiAgcmVhZG9ubHkgdW5pcXVlSWQ6IFVuaXF1ZUlkO1xuXG4gIC8qKiBHbG9iYWwgbWV0YWRhdGEgaW5oZXJpdGVkIGJ5IGFsbCBzdGFnZSBzdGVwcyAqL1xuICByZWFkb25seSBnbG9iYWxNZXRhZGF0YTogTWV0YURhdGFUeXBlO1xuXG4gIC8qKiBEZWZhdWx0IENvZGVCdWlsZCBjb21wdXRlIHR5cGUgZm9yIHN0ZXBzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBvbmUgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdENvbXB1dGVUeXBlPzogQ2RrQ29tcHV0ZVR5cGU7XG5cbiAgLyoqIEFydGlmYWN0IG1hbmFnZXIgZm9yIHJlc29sdmluZyBpbnB1dCBhcnRpZmFjdCBrZXlzIHRvIEZpbGVTZXRzICovXG4gIHJlYWRvbmx5IGFydGlmYWN0TWFuYWdlcj86IEFydGlmYWN0TWFuYWdlcjtcblxuICAvKiogVGVuYW50IGlkZW50aWZpZXIgZm9yIHJlc29sdmluZyBwZXItb3JnIHNlY3JldHMgZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyICovXG4gIHJlYWRvbmx5IG9yZ0lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZS1sZXZlbCBzY29wZSB1c2VkIHRvIHJlc29sdmUgYHt7IHBpcGVsaW5lLiogfX1gIHRlbXBsYXRlIHRva2Vuc1xuICAgKiBpbnNpZGUgcGx1Z2luIHNwZWNzLiBSZXF1aXJlZCDigJQgcGFzc2VkIHRocm91Z2ggdG8gYGNyZWF0ZUNvZGVCdWlsZFN0ZXBgXG4gICAqIG9uIGV2ZXJ5IHN0ZXAuXG4gICAqL1xuICByZWFkb25seSBwaXBlbGluZVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW5kIGFkZHMgcGlwZWxpbmUgc3RhZ2VzICh3YXZlcykgdG8gYSBDb2RlUGlwZWxpbmUuXG4gKlxuICogRWFjaCBzdGFnZSBpcyByZXNvbHZlZCBmcm9tIGhpZ2gtbGV2ZWwgY29uZmlndXJhdGlvbiAocGx1Z2luIG5hbWVzKVxuICogaW50byBDREsgQ29kZUJ1aWxkIHN0ZXBzIHZpYSBQbHVnaW5Mb29rdXAsIHRoZW4gYWRkZWQgYXMgYSB3YXZlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzdGFnZUJ1aWxkZXIgPSBuZXcgU3RhZ2VCdWlsZGVyKHtcbiAqICAgc2NvcGU6IHRoaXMsXG4gKiAgIHBsdWdpbkxvb2t1cCxcbiAqICAgdW5pcXVlSWQsXG4gKiAgIGdsb2JhbE1ldGFkYXRhOiBtZXJnZWRNZXRhZGF0YSxcbiAqIH0pO1xuICogc3RhZ2VCdWlsZGVyLmFkZFN0YWdlKHBpcGVsaW5lLCB7XG4gKiAgIHN0YWdlTmFtZTogJ0ludGVncmF0aW9uIFRlc3RzJyxcbiAqICAgYWxpYXM6ICdpbnRlZ3JhdGlvbicsXG4gKiAgIHN0ZXBzOiBbXG4gKiAgICAgeyBwbHVnaW46IHsgbmFtZTogJ2plc3QtaW50ZWdyYXRpb24nIH0gfSxcbiAqICAgICB7IHBsdWdpbjogeyBuYW1lOiAnZTJlLXRlc3RzJywgYWxpYXM6ICdjeXByZXNzJyB9IH0sXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU3RhZ2VCdWlsZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzY29wZTogQ29uc3RydWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbkxvb2t1cDogUGx1Z2luTG9va3VwO1xuICBwcml2YXRlIHJlYWRvbmx5IHVuaXF1ZUlkOiBVbmlxdWVJZDtcbiAgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxNZXRhZGF0YTogTWV0YURhdGFUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRDb21wdXRlVHlwZT86IENka0NvbXB1dGVUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IGFydGlmYWN0TWFuYWdlcj86IEFydGlmYWN0TWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBvcmdJZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwaXBlbGluZVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogU3RhZ2VCdWlsZGVyUHJvcHMpIHtcbiAgICB0aGlzLnNjb3BlID0gcHJvcHMuc2NvcGU7XG4gICAgdGhpcy5wbHVnaW5Mb29rdXAgPSBwcm9wcy5wbHVnaW5Mb29rdXA7XG4gICAgdGhpcy51bmlxdWVJZCA9IHByb3BzLnVuaXF1ZUlkO1xuICAgIHRoaXMuZ2xvYmFsTWV0YWRhdGEgPSBwcm9wcy5nbG9iYWxNZXRhZGF0YTtcbiAgICB0aGlzLmRlZmF1bHRDb21wdXRlVHlwZSA9IHByb3BzLmRlZmF1bHRDb21wdXRlVHlwZTtcbiAgICB0aGlzLmFydGlmYWN0TWFuYWdlciA9IHByb3BzLmFydGlmYWN0TWFuYWdlcjtcbiAgICB0aGlzLm9yZ0lkID0gcHJvcHMub3JnSWQ7XG4gICAgdGhpcy5waXBlbGluZVNjb3BlID0gcHJvcHMucGlwZWxpbmVTY29wZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHN0YWdlJ3MgcGx1Z2luLWJhc2VkIHN0ZXAgY29uZmlncyBpbnRvIENvZGVCdWlsZCBzdGVwc1xuICAgKiBhbmQgYWRkcyB0aGVtIGFzIGEgd2F2ZSB0byB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBhZGRTdGFnZShwaXBlbGluZTogQ29kZVBpcGVsaW5lLCBzdGFnZTogU3RhZ2VPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhZ2VBbGlhcyA9IHN0YWdlLmFsaWFzID8/IGAke3N0YWdlLnN0YWdlTmFtZX0tYWxpYXNgO1xuXG4gICAgY29uc3QgcHJlU3RlcHMgPSBzdGFnZS5zdGVwc1xuICAgICAgLmZpbHRlcihzID0+IChzLnBvc2l0aW9uID8/ICdwcmUnKSA9PT0gJ3ByZScpXG4gICAgICAubWFwKHMgPT4gdGhpcy5yZXNvbHZlU3RlcChzLCBzdGFnZS5zdGFnZU5hbWUsIHN0YWdlQWxpYXMpKTtcbiAgICBjb25zdCBwb3N0U3RlcHMgPSBzdGFnZS5zdGVwc1xuICAgICAgLmZpbHRlcihzID0+IHMucG9zaXRpb24gPT09ICdwb3N0JylcbiAgICAgIC5tYXAocyA9PiB0aGlzLnJlc29sdmVTdGVwKHMsIHN0YWdlLnN0YWdlTmFtZSwgc3RhZ2VBbGlhcykpO1xuXG4gICAgcGlwZWxpbmUuYWRkV2F2ZShzdGFnZUFsaWFzLCB7XG4gICAgICAuLi4ocHJlU3RlcHMubGVuZ3RoID4gMCAmJiB7IHByZTogcHJlU3RlcHMgfSksXG4gICAgICAuLi4ocG9zdFN0ZXBzLmxlbmd0aCA+IDAgJiYgeyBwb3N0OiBwb3N0U3RlcHMgfSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTdGVwKHN0ZXBDb25maWc6IFN0YWdlT3B0aW9uc1snc3RlcHMnXVtudW1iZXJdLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VBbGlhczogc3RyaW5nKSB7XG4gICAgY29uc3QgcGx1Z2luID0gdGhpcy5wbHVnaW5Mb29rdXAucGx1Z2luKHN0ZXBDb25maWcucGx1Z2luKTtcbiAgICAvLyBQZXItc3RlcCBwbHVnaW4gY29uZmlnIGxpdmVzIG9uIHRoZSBwbHVnaW4gcmVmZXJlbmNlIChgcGx1Z2luLm1ldGFkYXRhYCDigJRcbiAgICAvLyBlLmcuIEpBVkFfVkVSU0lPTi9LT1RMSU5fVkVSU0lPTi9jb21wdXRldHlwZSBvdmVycmlkZXMpLiBwbHVnaW5Mb29rdXAucGx1Z2luKClcbiAgICAvLyByZXR1cm5zIHRoZSByZXNvbHZlZCBDQVRBTE9HIHBsdWdpbiBhbmQgZHJvcHMgdGhlIHJlZmVyZW5jZSBtZXRhZGF0YSBpbiB0aGVcbiAgICAvLyBwcmUtcmVzb2x2ZWQgcGF0aCwgc28gbWVyZ2UgaXQgaGVyZSB0b28g4oCUIG90aGVyd2lzZSBwZXItc3RlcCBvdmVycmlkZXMgYXJlXG4gICAgLy8gc2lsZW50bHkgaWdub3JlZCBhbmQgdGhlIGJ1aWxkIGZhbGxzIGJhY2sgdG8gcGx1Z2luIGRlZmF1bHRzLlxuICAgIC8vIE9yZGVyIChsYXN0IHdpbnMpOiBnbG9iYWwgPCBwbHVnaW4tcmVmIG1ldGFkYXRhIDwgc3RlcC1sZXZlbCBtZXRhZGF0YS5cbiAgICBjb25zdCBzdGVwTWV0YWRhdGEgPSBtZXJnZSh0aGlzLmdsb2JhbE1ldGFkYXRhLCBzdGVwQ29uZmlnLnBsdWdpbi5tZXRhZGF0YSA/PyB7fSwgc3RlcENvbmZpZy5tZXRhZGF0YSA/PyB7fSk7XG4gICAgY29uc3QgcGx1Z2luQWxpYXMgPSBzdGVwQ29uZmlnLnBsdWdpbi5hbGlhcyA/PyBzdGVwQ29uZmlnLnBsdWdpbi5uYW1lO1xuXG4gICAgaWYgKHN0ZXBDb25maWcuaW5wdXRBcnRpZmFjdCAmJiAhdGhpcy5hcnRpZmFjdE1hbmFnZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFN0ZXAgXCIke3BsdWdpbkFsaWFzfVwiIHJlcXVpcmVzIGlucHV0QXJ0aWZhY3QgYnV0IG5vIGFydGlmYWN0TWFuYWdlciBpcyBjb25maWd1cmVkLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc3RlcENvbmZpZy5hZGRpdGlvbmFsSW5wdXRBcnRpZmFjdHM/Lmxlbmd0aCAmJiAhdGhpcy5hcnRpZmFjdE1hbmFnZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFN0ZXAgXCIke3BsdWdpbkFsaWFzfVwiIHJlcXVpcmVzIGFkZGl0aW9uYWxJbnB1dEFydGlmYWN0cyBidXQgbm8gYXJ0aWZhY3RNYW5hZ2VyIGlzIGNvbmZpZ3VyZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSBzdGVwQ29uZmlnLmlucHV0QXJ0aWZhY3QgJiYgdGhpcy5hcnRpZmFjdE1hbmFnZXJcbiAgICAgID8gdGhpcy5hcnRpZmFjdE1hbmFnZXIuZ2V0T3V0cHV0KHN0ZXBDb25maWcuaW5wdXRBcnRpZmFjdClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYWRkaXRpb25hbElucHV0cyA9IHN0ZXBDb25maWcuYWRkaXRpb25hbElucHV0QXJ0aWZhY3RzPy5sZW5ndGggJiYgdGhpcy5hcnRpZmFjdE1hbmFnZXJcbiAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBzdGVwQ29uZmlnLmFkZGl0aW9uYWxJbnB1dEFydGlmYWN0cy5tYXAoKHsgYXJ0aWZhY3QsIGRpcmVjdG9yeSB9KSA9PiBbXG4gICAgICAgICAgZGlyZWN0b3J5IHx8IGFydGlmYWN0Lm91dHB1dERpcmVjdG9yeSxcbiAgICAgICAgICB0aGlzLmFydGlmYWN0TWFuYWdlciEuZ2V0T3V0cHV0KGFydGlmYWN0KSxcbiAgICAgICAgXSksXG4gICAgICApXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiBjcmVhdGVDb2RlQnVpbGRTdGVwKHtcbiAgICAgIGlkOiB0aGlzLnVuaXF1ZUlkLmdlbmVyYXRlKGBzdGFnZToke3N0YWdlQWxpYXN9OiR7cGx1Z2luQWxpYXN9YCksXG4gICAgICB1bmlxdWVJZDogdGhpcy51bmlxdWVJZCxcbiAgICAgIHBsdWdpbixcbiAgICAgIG1ldGFkYXRhOiBzdGVwTWV0YWRhdGEsXG4gICAgICBuZXR3b3JrOiBzdGVwQ29uZmlnLm5ldHdvcmssXG4gICAgICBzY29wZTogdGhpcy5zY29wZSxcbiAgICAgIGRlZmF1bHRDb21wdXRlVHlwZTogdGhpcy5kZWZhdWx0Q29tcHV0ZVR5cGUsXG4gICAgICBpbnB1dCxcbiAgICAgIGFkZGl0aW9uYWxJbnB1dHMsXG4gICAgICBhcnRpZmFjdE1hbmFnZXI6IHRoaXMuYXJ0aWZhY3RNYW5hZ2VyLFxuICAgICAgc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VBbGlhcyxcbiAgICAgIHBsdWdpbkFsaWFzLFxuICAgICAgcHJlSW5zdGFsbENvbW1hbmRzOiBzdGVwQ29uZmlnLnByZUluc3RhbGxDb21tYW5kcyxcbiAgICAgIHBvc3RJbnN0YWxsQ29tbWFuZHM6IHN0ZXBDb25maWcucG9zdEluc3RhbGxDb21tYW5kcyxcbiAgICAgIHByZUNvbW1hbmRzOiBzdGVwQ29uZmlnLnByZUNvbW1hbmRzLFxuICAgICAgcG9zdENvbW1hbmRzOiBzdGVwQ29uZmlnLnBvc3RDb21tYW5kcyxcbiAgICAgIGVudjogc3RlcENvbmZpZy5lbnYsXG4gICAgICB0aW1lb3V0OiBzdGVwQ29uZmlnLnRpbWVvdXQgPz8gcGx1Z2luLnRpbWVvdXQgPz8gdW5kZWZpbmVkLFxuICAgICAgLy8gQSBzY2FuL3NlY3VyaXR5LWNhdGVnb3J5IHBsdWdpbiBjYW4gbmV2ZXIgYmUgZG93bmdyYWRlZCBmcm9tICdmYWlsJyDigJQgc2VlIHJlc29sdmVGYWlsdXJlQmVoYXZpb3IuXG4gICAgICBmYWlsdXJlQmVoYXZpb3I6IHJlc29sdmVGYWlsdXJlQmVoYXZpb3IocGx1Z2luLmNhdGVnb3J5LCBzdGVwQ29uZmlnLmZhaWx1cmVCZWhhdmlvciA/PyBwbHVnaW4uZmFpbHVyZUJlaGF2aW9yKSxcbiAgICAgIG9yZ0lkOiB0aGlzLm9yZ0lkLFxuICAgICAgcGlwZWxpbmVTY29wZTogdGhpcy5waXBlbGluZVNjb3BlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuZCBhZGRzIG11bHRpcGxlIHN0YWdlcyBhcyB3YXZlcyB0byB0aGUgcGlwZWxpbmUsIGluIG9yZGVyLlxuICAgKi9cbiAgYWRkU3RhZ2VzKHBpcGVsaW5lOiBDb2RlUGlwZWxpbmUsIHN0YWdlczogU3RhZ2VPcHRpb25zW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcykge1xuICAgICAgdGhpcy5hZGRTdGFnZShwaXBlbGluZSwgc3RhZ2UpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import type { PluginFilter, Plugin } from '@pipeline-builder/pipeline-data';
|
|
2
|
+
import type { ComputeType as CdkComputeType } from 'aws-cdk-lib/aws-codebuild';
|
|
3
|
+
import type { IFileSetProducer } from 'aws-cdk-lib/pipelines';
|
|
4
|
+
import type { Construct } from 'constructs';
|
|
5
|
+
import type { SourceType } from './source-types.js';
|
|
6
|
+
import type { ArtifactKey, ArtifactManager } from '../core/artifact-manager.js';
|
|
7
|
+
import type { UniqueId } from '../core/id-generator.js';
|
|
8
|
+
import type { NetworkConfig } from '../core/network-types.js';
|
|
9
|
+
import type { MetaDataType } from '../core/pipeline-types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Options for selecting and configuring a plugin
|
|
12
|
+
*/
|
|
13
|
+
export interface PluginOptions {
|
|
14
|
+
/**
|
|
15
|
+
* Name of the plugin to use
|
|
16
|
+
* Must match a registered plugin in the database
|
|
17
|
+
*/
|
|
18
|
+
readonly name: string;
|
|
19
|
+
/**
|
|
20
|
+
* Optional alias for the plugin instance
|
|
21
|
+
* Useful when using the same plugin multiple times with different configurations
|
|
22
|
+
*/
|
|
23
|
+
readonly alias?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Optional filter criteria for plugin selection
|
|
26
|
+
* Can be used to select specific plugin versions or variants
|
|
27
|
+
*/
|
|
28
|
+
readonly filter?: PluginFilter;
|
|
29
|
+
/**
|
|
30
|
+
* Additional metadata to merge with plugin's default metadata
|
|
31
|
+
* This metadata will be available to the plugin during execution
|
|
32
|
+
*/
|
|
33
|
+
readonly metadata?: MetaDataType;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Synthesis step configuration combining source and plugin.
|
|
37
|
+
* Extends StepCustomization to support injecting custom commands and env vars
|
|
38
|
+
* into the synth CodeBuild step (same hooks available as stage steps).
|
|
39
|
+
*/
|
|
40
|
+
export interface SynthOptions extends StepCustomization {
|
|
41
|
+
/**
|
|
42
|
+
* Source configuration (S3, GitHub, or CodeStar)
|
|
43
|
+
*/
|
|
44
|
+
readonly source: SourceType;
|
|
45
|
+
/**
|
|
46
|
+
* Plugin to use for synthesis
|
|
47
|
+
*/
|
|
48
|
+
readonly plugin: PluginOptions;
|
|
49
|
+
/**
|
|
50
|
+
* Additional metadata for the synthesis step
|
|
51
|
+
* This will be merged with global metadata and plugin metadata
|
|
52
|
+
*/
|
|
53
|
+
readonly metadata?: MetaDataType;
|
|
54
|
+
/**
|
|
55
|
+
* Step-level network configuration applied only to the synth CodeBuild step.
|
|
56
|
+
* Overrides the pipeline-level `defaults.network` when both are provided.
|
|
57
|
+
*/
|
|
58
|
+
readonly network?: NetworkConfig;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Per-step customization options for commands and environment variables.
|
|
62
|
+
* Custom commands are injected before/after the plugin's commands.
|
|
63
|
+
* Custom env vars are merged on top of the plugin's defaults.
|
|
64
|
+
*/
|
|
65
|
+
export interface StepCustomization {
|
|
66
|
+
/** Commands to run before the plugin's install commands */
|
|
67
|
+
readonly preInstallCommands?: string[];
|
|
68
|
+
/** Commands to run after the plugin's install commands */
|
|
69
|
+
readonly postInstallCommands?: string[];
|
|
70
|
+
/** Commands to run before the plugin's build commands */
|
|
71
|
+
readonly preCommands?: string[];
|
|
72
|
+
/** Commands to run after the plugin's build commands */
|
|
73
|
+
readonly postCommands?: string[];
|
|
74
|
+
/** Custom environment variables merged on top of the plugin's env */
|
|
75
|
+
readonly env?: Record<string, string>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* An additional input artifact with an optional mount directory.
|
|
79
|
+
* When directory is omitted, defaults to the artifact's outputDirectory.
|
|
80
|
+
*/
|
|
81
|
+
export interface AdditionalInputArtifactConfig {
|
|
82
|
+
/** Artifact key identifying the source step's output */
|
|
83
|
+
readonly artifact: ArtifactKey;
|
|
84
|
+
/** Directory to mount the input at. Defaults to artifact.outputDirectory when omitted. */
|
|
85
|
+
readonly directory?: string;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Configuration for a single step within a pipeline stage.
|
|
89
|
+
* Uses PluginOptions for name-based plugin selection (resolved at build time).
|
|
90
|
+
*/
|
|
91
|
+
export interface StageStepOptions extends StepCustomization {
|
|
92
|
+
/** Plugin to use for this step */
|
|
93
|
+
readonly plugin: PluginOptions;
|
|
94
|
+
/** Step-level metadata merged with stage and global metadata */
|
|
95
|
+
readonly metadata?: MetaDataType;
|
|
96
|
+
/** Optional network configuration for this step's CodeBuild action */
|
|
97
|
+
readonly network?: NetworkConfig;
|
|
98
|
+
/**
|
|
99
|
+
* CodeBuild timeout in minutes.
|
|
100
|
+
* @default 60 (AWS CodeBuild default)
|
|
101
|
+
*/
|
|
102
|
+
readonly timeout?: number;
|
|
103
|
+
/**
|
|
104
|
+
* Position of this step within the pipeline wave.
|
|
105
|
+
* - 'pre': Runs before the stage deployment (default)
|
|
106
|
+
* - 'post': Runs after the stage deployment
|
|
107
|
+
* @default 'pre'
|
|
108
|
+
*/
|
|
109
|
+
readonly position?: 'pre' | 'post';
|
|
110
|
+
/** Artifact key for this step's primary input (resolved via ArtifactManager) */
|
|
111
|
+
readonly inputArtifact?: ArtifactKey;
|
|
112
|
+
/** Additional input artifacts for this step. Each entry specifies an artifact and an optional mount directory. */
|
|
113
|
+
readonly additionalInputArtifacts?: AdditionalInputArtifactConfig[];
|
|
114
|
+
/** Override the plugin's failure behavior for this step. */
|
|
115
|
+
readonly failureBehavior?: 'fail' | 'warn' | 'ignore';
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* A pipeline stage containing one or more build steps.
|
|
119
|
+
* Each stage maps to a CDK Pipeline wave, with steps executing within the wave.
|
|
120
|
+
*/
|
|
121
|
+
export interface StageOptions {
|
|
122
|
+
/** Display name for this stage */
|
|
123
|
+
readonly stageName: string;
|
|
124
|
+
/** Optional alias used for wave/construct ID generation. Defaults to stageName. */
|
|
125
|
+
readonly alias?: string;
|
|
126
|
+
/** Build steps to execute within this stage */
|
|
127
|
+
readonly steps: StageStepOptions[];
|
|
128
|
+
/**
|
|
129
|
+
* Deploy environment this stage targets (e.g. `production`, `staging`).
|
|
130
|
+
* Declaring it marks the stage as a **deploy** for DORA metrics: pipeline-core
|
|
131
|
+
* lists every such stage in the `pb.deploys` tag as `<stageName>:<environment>`
|
|
132
|
+
* so the events Lambda can attribute deployments per environment. Omit it and
|
|
133
|
+
* the stage is not treated as a deploy.
|
|
134
|
+
*/
|
|
135
|
+
readonly environment?: string;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Options for creating a CodeBuild step in the pipeline
|
|
139
|
+
*/
|
|
140
|
+
export interface CodeBuildStepOptions extends StepCustomization {
|
|
141
|
+
/**
|
|
142
|
+
* Unique identifier for this CodeBuild step
|
|
143
|
+
* Should be descriptive and unique within the pipeline
|
|
144
|
+
* @example 'my-org-my-project-synth'
|
|
145
|
+
*/
|
|
146
|
+
readonly id: string;
|
|
147
|
+
/**
|
|
148
|
+
* UniqueId instance for generating unique construct IDs
|
|
149
|
+
* Used for network resource lookups (VPC, subnets, security groups)
|
|
150
|
+
*/
|
|
151
|
+
readonly uniqueId: UniqueId;
|
|
152
|
+
/**
|
|
153
|
+
* Plugin configuration from the database
|
|
154
|
+
* Contains all the plugin's spec data and runtime information
|
|
155
|
+
*/
|
|
156
|
+
readonly plugin: Plugin;
|
|
157
|
+
/**
|
|
158
|
+
* CDK scope used to create constructs (VPC/subnet/security-group lookups).
|
|
159
|
+
*/
|
|
160
|
+
readonly scope: Construct;
|
|
161
|
+
/**
|
|
162
|
+
* Input source for this step
|
|
163
|
+
* Typically the output from a previous step or the pipeline source
|
|
164
|
+
*/
|
|
165
|
+
readonly input?: IFileSetProducer;
|
|
166
|
+
/**
|
|
167
|
+
* Additional metadata to merge with plugin metadata
|
|
168
|
+
* Will override conflicting keys from plugin metadata
|
|
169
|
+
*/
|
|
170
|
+
readonly metadata?: MetaDataType;
|
|
171
|
+
/**
|
|
172
|
+
* Optional network configuration for the CodeBuild step.
|
|
173
|
+
* When provided, resolves VPC, subnet selection, and security groups
|
|
174
|
+
* so the build runs inside the specified network.
|
|
175
|
+
*/
|
|
176
|
+
readonly network?: NetworkConfig;
|
|
177
|
+
/**
|
|
178
|
+
* Fallback CodeBuild compute type when the plugin doesn't specify one.
|
|
179
|
+
* @default ComputeType.SMALL
|
|
180
|
+
*/
|
|
181
|
+
readonly defaultComputeType?: CdkComputeType;
|
|
182
|
+
/**
|
|
183
|
+
* CodeBuild timeout in minutes.
|
|
184
|
+
* @default 60 (AWS CodeBuild default)
|
|
185
|
+
*/
|
|
186
|
+
readonly timeout?: number;
|
|
187
|
+
/** Additional inputs mapped by directory path (resolved FileSets) */
|
|
188
|
+
readonly additionalInputs?: Record<string, IFileSetProducer>;
|
|
189
|
+
/**
|
|
190
|
+
* Optional artifact manager for tracking build outputs
|
|
191
|
+
* When provided and primaryOutputDirectory is set, the step will be registered
|
|
192
|
+
*/
|
|
193
|
+
readonly artifactManager?: ArtifactManager;
|
|
194
|
+
/**
|
|
195
|
+
* Stage name for artifact key generation
|
|
196
|
+
*/
|
|
197
|
+
readonly stageName?: string;
|
|
198
|
+
/**
|
|
199
|
+
* Stage alias for artifact key generation
|
|
200
|
+
*/
|
|
201
|
+
readonly stageAlias?: string;
|
|
202
|
+
/**
|
|
203
|
+
* Plugin alias for artifact key generation
|
|
204
|
+
*/
|
|
205
|
+
readonly pluginAlias?: string;
|
|
206
|
+
/**
|
|
207
|
+
* Failure behavior for this step's build commands.
|
|
208
|
+
* Applied at shell level: 'fail' = default, 'warn' = log + continue, 'ignore' = || true.
|
|
209
|
+
*/
|
|
210
|
+
readonly failureBehavior?: 'fail' | 'warn' | 'ignore';
|
|
211
|
+
/** Tenant identifier for resolving per-org secrets from AWS Secrets Manager */
|
|
212
|
+
readonly orgId?: string;
|
|
213
|
+
/**
|
|
214
|
+
* Pipeline-level config used as the `pipeline.*` scope when resolving
|
|
215
|
+
* template tokens inside plugin specs. Required — every `{{ pipeline.* }}`
|
|
216
|
+
* reference in a plugin spec is evaluated against this object at synth time.
|
|
217
|
+
*
|
|
218
|
+
* Callers constructing a step directly must provide the pipeline identity
|
|
219
|
+
* + metadata + vars so template resolution is never silently skipped.
|
|
220
|
+
*/
|
|
221
|
+
readonly pipelineScope: Record<string, unknown>;
|
|
222
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
export {};
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZS9zdGVwLXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBQbHVnaW5GaWx0ZXIsIFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHR5cGUgeyBDb21wdXRlVHlwZSBhcyBDZGtDb21wdXRlVHlwZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0IHR5cGUgeyBJRmlsZVNldFByb2R1Y2VyIH0gZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZVR5cGUgfSBmcm9tICcuL3NvdXJjZS10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEFydGlmYWN0S2V5LCBBcnRpZmFjdE1hbmFnZXIgfSBmcm9tICcuLi9jb3JlL2FydGlmYWN0LW1hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBVbmlxdWVJZCB9IGZyb20gJy4uL2NvcmUvaWQtZ2VuZXJhdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgTmV0d29ya0NvbmZpZyB9IGZyb20gJy4uL2NvcmUvbmV0d29yay10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGFEYXRhVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNlbGVjdGluZyBhbmQgY29uZmlndXJpbmcgYSBwbHVnaW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBsdWdpbiB0byB1c2VcbiAgICogTXVzdCBtYXRjaCBhIHJlZ2lzdGVyZWQgcGx1Z2luIGluIHRoZSBkYXRhYmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIHBsdWdpbiBpbnN0YW5jZVxuICAgKiBVc2VmdWwgd2hlbiB1c2luZyB0aGUgc2FtZSBwbHVnaW4gbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBmaWx0ZXIgY3JpdGVyaWEgZm9yIHBsdWdpbiBzZWxlY3Rpb25cbiAgICogQ2FuIGJlIHVzZWQgdG8gc2VsZWN0IHNwZWNpZmljIHBsdWdpbiB2ZXJzaW9ucyBvciB2YXJpYW50c1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyPzogUGx1Z2luRmlsdGVyO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG1ldGFkYXRhIHRvIG1lcmdlIHdpdGggcGx1Z2luJ3MgZGVmYXVsdCBtZXRhZGF0YVxuICAgKiBUaGlzIG1ldGFkYXRhIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBwbHVnaW4gZHVyaW5nIGV4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YWRhdGE/OiBNZXRhRGF0YVR5cGU7XG59XG5cbi8qKlxuICogU3ludGhlc2lzIHN0ZXAgY29uZmlndXJhdGlvbiBjb21iaW5pbmcgc291cmNlIGFuZCBwbHVnaW4uXG4gKiBFeHRlbmRzIFN0ZXBDdXN0b21pemF0aW9uIHRvIHN1cHBvcnQgaW5qZWN0aW5nIGN1c3RvbSBjb21tYW5kcyBhbmQgZW52IHZhcnNcbiAqIGludG8gdGhlIHN5bnRoIENvZGVCdWlsZCBzdGVwIChzYW1lIGhvb2tzIGF2YWlsYWJsZSBhcyBzdGFnZSBzdGVwcykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhPcHRpb25zIGV4dGVuZHMgU3RlcEN1c3RvbWl6YXRpb24ge1xuICAvKipcbiAgICogU291cmNlIGNvbmZpZ3VyYXRpb24gKFMzLCBHaXRIdWIsIG9yIENvZGVTdGFyKVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBTb3VyY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gdG8gdXNlIGZvciBzeW50aGVzaXNcbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luT3B0aW9ucztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgdGhlIHN5bnRoZXNpcyBzdGVwXG4gICAqIFRoaXMgd2lsbCBiZSBtZXJnZWQgd2l0aCBnbG9iYWwgbWV0YWRhdGEgYW5kIHBsdWdpbiBtZXRhZGF0YVxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YWRhdGE/OiBNZXRhRGF0YVR5cGU7XG5cbiAgLyoqXG4gICAqIFN0ZXAtbGV2ZWwgbmV0d29yayBjb25maWd1cmF0aW9uIGFwcGxpZWQgb25seSB0byB0aGUgc3ludGggQ29kZUJ1aWxkIHN0ZXAuXG4gICAqIE92ZXJyaWRlcyB0aGUgcGlwZWxpbmUtbGV2ZWwgYGRlZmF1bHRzLm5ldHdvcmtgIHdoZW4gYm90aCBhcmUgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrPzogTmV0d29ya0NvbmZpZztcbn1cblxuLyoqXG4gKiBQZXItc3RlcCBjdXN0b21pemF0aW9uIG9wdGlvbnMgZm9yIGNvbW1hbmRzIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiBDdXN0b20gY29tbWFuZHMgYXJlIGluamVjdGVkIGJlZm9yZS9hZnRlciB0aGUgcGx1Z2luJ3MgY29tbWFuZHMuXG4gKiBDdXN0b20gZW52IHZhcnMgYXJlIG1lcmdlZCBvbiB0b3Agb2YgdGhlIHBsdWdpbidzIGRlZmF1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBDdXN0b21pemF0aW9uIHtcbiAgLyoqIENvbW1hbmRzIHRvIHJ1biBiZWZvcmUgdGhlIHBsdWdpbidzIGluc3RhbGwgY29tbWFuZHMgKi9cbiAgcmVhZG9ubHkgcHJlSW5zdGFsbENvbW1hbmRzPzogc3RyaW5nW107XG5cbiAgLyoqIENvbW1hbmRzIHRvIHJ1biBhZnRlciB0aGUgcGx1Z2luJ3MgaW5zdGFsbCBjb21tYW5kcyAqL1xuICByZWFkb25seSBwb3N0SW5zdGFsbENvbW1hbmRzPzogc3RyaW5nW107XG5cbiAgLyoqIENvbW1hbmRzIHRvIHJ1biBiZWZvcmUgdGhlIHBsdWdpbidzIGJ1aWxkIGNvbW1hbmRzICovXG4gIHJlYWRvbmx5IHByZUNvbW1hbmRzPzogc3RyaW5nW107XG5cbiAgLyoqIENvbW1hbmRzIHRvIHJ1biBhZnRlciB0aGUgcGx1Z2luJ3MgYnVpbGQgY29tbWFuZHMgKi9cbiAgcmVhZG9ubHkgcG9zdENvbW1hbmRzPzogc3RyaW5nW107XG5cbiAgLyoqIEN1c3RvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWVyZ2VkIG9uIHRvcCBvZiB0aGUgcGx1Z2luJ3MgZW52ICovXG4gIHJlYWRvbmx5IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogQW4gYWRkaXRpb25hbCBpbnB1dCBhcnRpZmFjdCB3aXRoIGFuIG9wdGlvbmFsIG1vdW50IGRpcmVjdG9yeS5cbiAqIFdoZW4gZGlyZWN0b3J5IGlzIG9taXR0ZWQsIGRlZmF1bHRzIHRvIHRoZSBhcnRpZmFjdCdzIG91dHB1dERpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRpdGlvbmFsSW5wdXRBcnRpZmFjdENvbmZpZyB7XG4gIC8qKiBBcnRpZmFjdCBrZXkgaWRlbnRpZnlpbmcgdGhlIHNvdXJjZSBzdGVwJ3Mgb3V0cHV0ICovXG4gIHJlYWRvbmx5IGFydGlmYWN0OiBBcnRpZmFjdEtleTtcblxuICAvKiogRGlyZWN0b3J5IHRvIG1vdW50IHRoZSBpbnB1dCBhdC4gRGVmYXVsdHMgdG8gYXJ0aWZhY3Qub3V0cHV0RGlyZWN0b3J5IHdoZW4gb21pdHRlZC4gKi9cbiAgcmVhZG9ubHkgZGlyZWN0b3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc2luZ2xlIHN0ZXAgd2l0aGluIGEgcGlwZWxpbmUgc3RhZ2UuXG4gKiBVc2VzIFBsdWdpbk9wdGlvbnMgZm9yIG5hbWUtYmFzZWQgcGx1Z2luIHNlbGVjdGlvbiAocmVzb2x2ZWQgYXQgYnVpbGQgdGltZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VTdGVwT3B0aW9ucyBleHRlbmRzIFN0ZXBDdXN0b21pemF0aW9uIHtcbiAgLyoqIFBsdWdpbiB0byB1c2UgZm9yIHRoaXMgc3RlcCAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbk9wdGlvbnM7XG5cbiAgLyoqIFN0ZXAtbGV2ZWwgbWV0YWRhdGEgbWVyZ2VkIHdpdGggc3RhZ2UgYW5kIGdsb2JhbCBtZXRhZGF0YSAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IE1ldGFEYXRhVHlwZTtcblxuICAvKiogT3B0aW9uYWwgbmV0d29yayBjb25maWd1cmF0aW9uIGZvciB0aGlzIHN0ZXAncyBDb2RlQnVpbGQgYWN0aW9uICovXG4gIHJlYWRvbmx5IG5ldHdvcms/OiBOZXR3b3JrQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBDb2RlQnVpbGQgdGltZW91dCBpbiBtaW51dGVzLlxuICAgKiBAZGVmYXVsdCA2MCAoQVdTIENvZGVCdWlsZCBkZWZhdWx0KVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogUG9zaXRpb24gb2YgdGhpcyBzdGVwIHdpdGhpbiB0aGUgcGlwZWxpbmUgd2F2ZS5cbiAgICogLSAncHJlJzogUnVucyBiZWZvcmUgdGhlIHN0YWdlIGRlcGxveW1lbnQgKGRlZmF1bHQpXG4gICAqIC0gJ3Bvc3QnOiBSdW5zIGFmdGVyIHRoZSBzdGFnZSBkZXBsb3ltZW50XG4gICAqIEBkZWZhdWx0ICdwcmUnXG4gICAqL1xuICByZWFkb25seSBwb3NpdGlvbj86ICdwcmUnIHwgJ3Bvc3QnO1xuXG4gIC8qKiBBcnRpZmFjdCBrZXkgZm9yIHRoaXMgc3RlcCdzIHByaW1hcnkgaW5wdXQgKHJlc29sdmVkIHZpYSBBcnRpZmFjdE1hbmFnZXIpICovXG4gIHJlYWRvbmx5IGlucHV0QXJ0aWZhY3Q/OiBBcnRpZmFjdEtleTtcblxuICAvKiogQWRkaXRpb25hbCBpbnB1dCBhcnRpZmFjdHMgZm9yIHRoaXMgc3RlcC4gRWFjaCBlbnRyeSBzcGVjaWZpZXMgYW4gYXJ0aWZhY3QgYW5kIGFuIG9wdGlvbmFsIG1vdW50IGRpcmVjdG9yeS4gKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbElucHV0QXJ0aWZhY3RzPzogQWRkaXRpb25hbElucHV0QXJ0aWZhY3RDb25maWdbXTtcblxuICAvKiogT3ZlcnJpZGUgdGhlIHBsdWdpbidzIGZhaWx1cmUgYmVoYXZpb3IgZm9yIHRoaXMgc3RlcC4gKi9cbiAgcmVhZG9ubHkgZmFpbHVyZUJlaGF2aW9yPzogJ2ZhaWwnIHwgJ3dhcm4nIHwgJ2lnbm9yZSc7XG59XG5cbi8qKlxuICogQSBwaXBlbGluZSBzdGFnZSBjb250YWluaW5nIG9uZSBvciBtb3JlIGJ1aWxkIHN0ZXBzLlxuICogRWFjaCBzdGFnZSBtYXBzIHRvIGEgQ0RLIFBpcGVsaW5lIHdhdmUsIHdpdGggc3RlcHMgZXhlY3V0aW5nIHdpdGhpbiB0aGUgd2F2ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnZU9wdGlvbnMge1xuICAvKiogRGlzcGxheSBuYW1lIGZvciB0aGlzIHN0YWdlICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBPcHRpb25hbCBhbGlhcyB1c2VkIGZvciB3YXZlL2NvbnN0cnVjdCBJRCBnZW5lcmF0aW9uLiBEZWZhdWx0cyB0byBzdGFnZU5hbWUuICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKiBCdWlsZCBzdGVwcyB0byBleGVjdXRlIHdpdGhpbiB0aGlzIHN0YWdlICovXG4gIHJlYWRvbmx5IHN0ZXBzOiBTdGFnZVN0ZXBPcHRpb25zW107XG5cbiAgLyoqXG4gICAqIERlcGxveSBlbnZpcm9ubWVudCB0aGlzIHN0YWdlIHRhcmdldHMgKGUuZy4gYHByb2R1Y3Rpb25gLCBgc3RhZ2luZ2ApLlxuICAgKiBEZWNsYXJpbmcgaXQgbWFya3MgdGhlIHN0YWdlIGFzIGEgKipkZXBsb3kqKiBmb3IgRE9SQSBtZXRyaWNzOiBwaXBlbGluZS1jb3JlXG4gICAqIGxpc3RzIGV2ZXJ5IHN1Y2ggc3RhZ2UgaW4gdGhlIGBwYi5kZXBsb3lzYCB0YWcgYXMgYDxzdGFnZU5hbWU+OjxlbnZpcm9ubWVudD5gXG4gICAqIHNvIHRoZSBldmVudHMgTGFtYmRhIGNhbiBhdHRyaWJ1dGUgZGVwbG95bWVudHMgcGVyIGVudmlyb25tZW50LiBPbWl0IGl0IGFuZFxuICAgKiB0aGUgc3RhZ2UgaXMgbm90IHRyZWF0ZWQgYXMgYSBkZXBsb3kuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhIENvZGVCdWlsZCBzdGVwIGluIHRoZSBwaXBlbGluZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCdWlsZFN0ZXBPcHRpb25zIGV4dGVuZHMgU3RlcEN1c3RvbWl6YXRpb24ge1xuICAvKipcbiAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgQ29kZUJ1aWxkIHN0ZXBcbiAgICogU2hvdWxkIGJlIGRlc2NyaXB0aXZlIGFuZCB1bmlxdWUgd2l0aGluIHRoZSBwaXBlbGluZVxuICAgKiBAZXhhbXBsZSAnbXktb3JnLW15LXByb2plY3Qtc3ludGgnXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVbmlxdWVJZCBpbnN0YW5jZSBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgY29uc3RydWN0IElEc1xuICAgKiBVc2VkIGZvciBuZXR3b3JrIHJlc291cmNlIGxvb2t1cHMgKFZQQywgc3VibmV0cywgc2VjdXJpdHkgZ3JvdXBzKVxuICAgKi9cbiAgcmVhZG9ubHkgdW5pcXVlSWQ6IFVuaXF1ZUlkO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBDb250YWlucyBhbGwgdGhlIHBsdWdpbidzIHNwZWMgZGF0YSBhbmQgcnVudGltZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG5cbiAgLyoqXG4gICAqIENESyBzY29wZSB1c2VkIHRvIGNyZWF0ZSBjb25zdHJ1Y3RzIChWUEMvc3VibmV0L3NlY3VyaXR5LWdyb3VwIGxvb2t1cHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcblxuICAvKipcbiAgICogSW5wdXQgc291cmNlIGZvciB0aGlzIHN0ZXBcbiAgICogVHlwaWNhbGx5IHRoZSBvdXRwdXQgZnJvbSBhIHByZXZpb3VzIHN0ZXAgb3IgdGhlIHBpcGVsaW5lIHNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBJRmlsZVNldFByb2R1Y2VyO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG1ldGFkYXRhIHRvIG1lcmdlIHdpdGggcGx1Z2luIG1ldGFkYXRhXG4gICAqIFdpbGwgb3ZlcnJpZGUgY29uZmxpY3Rpbmcga2V5cyBmcm9tIHBsdWdpbiBtZXRhZGF0YVxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YWRhdGE/OiBNZXRhRGF0YVR5cGU7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIG5ldHdvcmsgY29uZmlndXJhdGlvbiBmb3IgdGhlIENvZGVCdWlsZCBzdGVwLlxuICAgKiBXaGVuIHByb3ZpZGVkLCByZXNvbHZlcyBWUEMsIHN1Ym5ldCBzZWxlY3Rpb24sIGFuZCBzZWN1cml0eSBncm91cHNcbiAgICogc28gdGhlIGJ1aWxkIHJ1bnMgaW5zaWRlIHRoZSBzcGVjaWZpZWQgbmV0d29yay5cbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcms/OiBOZXR3b3JrQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBGYWxsYmFjayBDb2RlQnVpbGQgY29tcHV0ZSB0eXBlIHdoZW4gdGhlIHBsdWdpbiBkb2Vzbid0IHNwZWNpZnkgb25lLlxuICAgKiBAZGVmYXVsdCBDb21wdXRlVHlwZS5TTUFMTFxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdENvbXB1dGVUeXBlPzogQ2RrQ29tcHV0ZVR5cGU7XG5cbiAgLyoqXG4gICAqIENvZGVCdWlsZCB0aW1lb3V0IGluIG1pbnV0ZXMuXG4gICAqIEBkZWZhdWx0IDYwIChBV1MgQ29kZUJ1aWxkIGRlZmF1bHQpXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogbnVtYmVyO1xuXG4gIC8qKiBBZGRpdGlvbmFsIGlucHV0cyBtYXBwZWQgYnkgZGlyZWN0b3J5IHBhdGggKHJlc29sdmVkIEZpbGVTZXRzKSAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsSW5wdXRzPzogUmVjb3JkPHN0cmluZywgSUZpbGVTZXRQcm9kdWNlcj47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGFydGlmYWN0IG1hbmFnZXIgZm9yIHRyYWNraW5nIGJ1aWxkIG91dHB1dHNcbiAgICogV2hlbiBwcm92aWRlZCBhbmQgcHJpbWFyeU91dHB1dERpcmVjdG9yeSBpcyBzZXQsIHRoZSBzdGVwIHdpbGwgYmUgcmVnaXN0ZXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgYXJ0aWZhY3RNYW5hZ2VyPzogQXJ0aWZhY3RNYW5hZ2VyO1xuXG4gIC8qKlxuICAgKiBTdGFnZSBuYW1lIGZvciBhcnRpZmFjdCBrZXkgZ2VuZXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdGFnZSBhbGlhcyBmb3IgYXJ0aWZhY3Qga2V5IGdlbmVyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHN0YWdlQWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsdWdpbiBhbGlhcyBmb3IgYXJ0aWZhY3Qga2V5IGdlbmVyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbkFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGYWlsdXJlIGJlaGF2aW9yIGZvciB0aGlzIHN0ZXAncyBidWlsZCBjb21tYW5kcy5cbiAgICogQXBwbGllZCBhdCBzaGVsbCBsZXZlbDogJ2ZhaWwnID0gZGVmYXVsdCwgJ3dhcm4nID0gbG9nICsgY29udGludWUsICdpZ25vcmUnID0gfHwgdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGZhaWx1cmVCZWhhdmlvcj86ICdmYWlsJyB8ICd3YXJuJyB8ICdpZ25vcmUnO1xuXG4gIC8qKiBUZW5hbnQgaWRlbnRpZmllciBmb3IgcmVzb2x2aW5nIHBlci1vcmcgc2VjcmV0cyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIgKi9cbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lLWxldmVsIGNvbmZpZyB1c2VkIGFzIHRoZSBgcGlwZWxpbmUuKmAgc2NvcGUgd2hlbiByZXNvbHZpbmdcbiAgICogdGVtcGxhdGUgdG9rZW5zIGluc2lkZSBwbHVnaW4gc3BlY3MuIFJlcXVpcmVkIOKAlCBldmVyeSBge3sgcGlwZWxpbmUuKiB9fWBcbiAgICogcmVmZXJlbmNlIGluIGEgcGx1Z2luIHNwZWMgaXMgZXZhbHVhdGVkIGFnYWluc3QgdGhpcyBvYmplY3QgYXQgc3ludGggdGltZS5cbiAgICpcbiAgICogQ2FsbGVycyBjb25zdHJ1Y3RpbmcgYSBzdGVwIGRpcmVjdGx5IG11c3QgcHJvdmlkZSB0aGUgcGlwZWxpbmUgaWRlbnRpdHlcbiAgICogKyBtZXRhZGF0YSArIHZhcnMgc28gdGVtcGxhdGUgcmVzb2x1dGlvbiBpcyBuZXZlciBzaWxlbnRseSBza2lwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVTY29wZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG4iXX0=
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ErrorCode } from '@pipeline-builder/api-core';
|
|
2
|
+
import type { SourcePosition, Token } from './tokenizer.js';
|
|
3
|
+
export type Scope = Record<string, unknown>;
|
|
4
|
+
export interface EvalError {
|
|
5
|
+
code: ErrorCode;
|
|
6
|
+
message: string;
|
|
7
|
+
field?: string;
|
|
8
|
+
path?: string;
|
|
9
|
+
pos?: SourcePosition;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Look up a dot-separated path inside a scope object. Returns `undefined`
|
|
13
|
+
* if any intermediate segment is missing or not an object.
|
|
14
|
+
*
|
|
15
|
+
* Only OWN enumerable-or-not-inherited properties are traversed: a segment is
|
|
16
|
+
* resolved via `Object.prototype.hasOwnProperty.call` so inherited members of
|
|
17
|
+
* the prototype chain (`constructor`, `toString`, `valueOf`, `hasOwnProperty`,
|
|
18
|
+
* the `__proto__` accessor, …) never resolve — they return `undefined` and thus
|
|
19
|
+
* fall through to the caller's normal unknown-path handling (a `| default:`
|
|
20
|
+
* fallback or a `TEMPLATE_UNKNOWN_PATH` error). Applied at every level,
|
|
21
|
+
* including the root segment, this also makes the scope's own top-level keys
|
|
22
|
+
* the effective root allow-list, so an unknown/prototype root is rejected even
|
|
23
|
+
* on the synth path that skips `validateTemplates`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function lookupPath(scope: Scope, path: string[]): unknown;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve a token stream against a scope. Returns the resolved string.
|
|
28
|
+
* Throws `EvalError` when an unresolved path has no default filter.
|
|
29
|
+
*
|
|
30
|
+
* Coercion filters (`| number`, `| bool`, `| json`) only take effect
|
|
31
|
+
* when the template expression is the entire field — e.g.
|
|
32
|
+
* `replicas: "{{ vars.count | number }}"` yields `3` (number) while
|
|
33
|
+
* `replicas: "count={{ vars.count | number }}"` yields `"count=3"`
|
|
34
|
+
* (string, because the template is embedded in surrounding literals).
|
|
35
|
+
* Mixed-literal fields always return a string.
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolve(tokens: Token[], scope: Scope, field?: string): string | number | boolean | null | unknown[] | Record<string, unknown>;
|
|
38
|
+
/**
|
|
39
|
+
* Extract dependency paths from a token stream. Used by the topological
|
|
40
|
+
* sort pass to order resolution of self-referencing documents.
|
|
41
|
+
*/
|
|
42
|
+
export declare function dependencies(tokens: Token[]): string[];
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { ErrorCode } from '@pipeline-builder/api-core';
|
|
4
|
+
const RESERVED_ROOT_PATHS = new Set(['secrets']);
|
|
5
|
+
/**
|
|
6
|
+
* Look up a dot-separated path inside a scope object. Returns `undefined`
|
|
7
|
+
* if any intermediate segment is missing or not an object.
|
|
8
|
+
*
|
|
9
|
+
* Only OWN enumerable-or-not-inherited properties are traversed: a segment is
|
|
10
|
+
* resolved via `Object.prototype.hasOwnProperty.call` so inherited members of
|
|
11
|
+
* the prototype chain (`constructor`, `toString`, `valueOf`, `hasOwnProperty`,
|
|
12
|
+
* the `__proto__` accessor, …) never resolve — they return `undefined` and thus
|
|
13
|
+
* fall through to the caller's normal unknown-path handling (a `| default:`
|
|
14
|
+
* fallback or a `TEMPLATE_UNKNOWN_PATH` error). Applied at every level,
|
|
15
|
+
* including the root segment, this also makes the scope's own top-level keys
|
|
16
|
+
* the effective root allow-list, so an unknown/prototype root is rejected even
|
|
17
|
+
* on the synth path that skips `validateTemplates`.
|
|
18
|
+
*/
|
|
19
|
+
export function lookupPath(scope, path) {
|
|
20
|
+
let cur = scope;
|
|
21
|
+
for (const segment of path) {
|
|
22
|
+
if (cur == null || typeof cur !== 'object')
|
|
23
|
+
return undefined;
|
|
24
|
+
if (!Object.prototype.hasOwnProperty.call(cur, segment))
|
|
25
|
+
return undefined;
|
|
26
|
+
cur = cur[segment];
|
|
27
|
+
}
|
|
28
|
+
return cur;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve a token stream against a scope. Returns the resolved string.
|
|
32
|
+
* Throws `EvalError` when an unresolved path has no default filter.
|
|
33
|
+
*
|
|
34
|
+
* Coercion filters (`| number`, `| bool`, `| json`) only take effect
|
|
35
|
+
* when the template expression is the entire field — e.g.
|
|
36
|
+
* `replicas: "{{ vars.count | number }}"` yields `3` (number) while
|
|
37
|
+
* `replicas: "count={{ vars.count | number }}"` yields `"count=3"`
|
|
38
|
+
* (string, because the template is embedded in surrounding literals).
|
|
39
|
+
* Mixed-literal fields always return a string.
|
|
40
|
+
*/
|
|
41
|
+
export function resolve(tokens, scope, field) {
|
|
42
|
+
// Whole-field coercion shortcut: only apply coercion when the entire field
|
|
43
|
+
// is a single expression (no surrounding literal text).
|
|
44
|
+
if (tokens.length === 1 && tokens[0].kind === 'expr' && tokens[0].coerce) {
|
|
45
|
+
const tok = tokens[0];
|
|
46
|
+
const raw = resolveOne(tok, scope, field);
|
|
47
|
+
return applyCoercion(raw, tok.coerce, tok, field);
|
|
48
|
+
}
|
|
49
|
+
const parts = [];
|
|
50
|
+
for (const tok of tokens) {
|
|
51
|
+
if (tok.kind === 'literal') {
|
|
52
|
+
parts.push(tok.value);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const raw = resolveOne(tok, scope, field);
|
|
56
|
+
parts.push(typeof raw === 'string' ? raw : String(raw));
|
|
57
|
+
}
|
|
58
|
+
return parts.join('');
|
|
59
|
+
}
|
|
60
|
+
/** Resolve a single expression token to its string form (no coercion). */
|
|
61
|
+
function resolveOne(tok, scope, field) {
|
|
62
|
+
const root = tok.path[0];
|
|
63
|
+
if (RESERVED_ROOT_PATHS.has(root)) {
|
|
64
|
+
throw makeEvalError({
|
|
65
|
+
code: ErrorCode.TEMPLATE_SECRETS_RESERVED,
|
|
66
|
+
message: `'${root}' is a reserved scope — use the plugin's 'secrets:' field instead`,
|
|
67
|
+
field,
|
|
68
|
+
path: tok.path.join('.'),
|
|
69
|
+
pos: tok.pos,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const value = lookupPath(scope, tok.path);
|
|
73
|
+
// A missing path OR an empty string falls to the default (intended, tested):
|
|
74
|
+
// an unset/blank value is treated as "provide a default or fail".
|
|
75
|
+
if (value == null || value === '') {
|
|
76
|
+
if (tok.defaultValue !== undefined)
|
|
77
|
+
return tok.defaultValue;
|
|
78
|
+
throw makeEvalError({
|
|
79
|
+
code: ErrorCode.TEMPLATE_UNKNOWN_PATH,
|
|
80
|
+
message: `Template references unknown path '${tok.path.join('.')}' and no default provided`,
|
|
81
|
+
field,
|
|
82
|
+
path: tok.path.join('.'),
|
|
83
|
+
pos: tok.pos,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (typeof value === 'object') {
|
|
87
|
+
throw makeEvalError({
|
|
88
|
+
code: ErrorCode.TEMPLATE_TYPE_MISMATCH,
|
|
89
|
+
message: `Template path '${tok.path.join('.')}' resolved to an object; only strings/numbers/booleans are interpolatable`,
|
|
90
|
+
field,
|
|
91
|
+
path: tok.path.join('.'),
|
|
92
|
+
pos: tok.pos,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return String(value);
|
|
96
|
+
}
|
|
97
|
+
/** Apply a whole-field coercion filter to a resolved string value. */
|
|
98
|
+
function applyCoercion(raw, kind, tok, field) {
|
|
99
|
+
switch (kind) {
|
|
100
|
+
case 'number': {
|
|
101
|
+
const n = Number(raw);
|
|
102
|
+
if (!Number.isFinite(n)) {
|
|
103
|
+
throw makeEvalError({
|
|
104
|
+
code: ErrorCode.TEMPLATE_TYPE_MISMATCH,
|
|
105
|
+
message: `'${raw}' cannot be coerced to number at path '${tok.path.join('.')}'`,
|
|
106
|
+
field,
|
|
107
|
+
path: tok.path.join('.'),
|
|
108
|
+
pos: tok.pos,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return n;
|
|
112
|
+
}
|
|
113
|
+
case 'bool': {
|
|
114
|
+
const v = raw.trim().toLowerCase();
|
|
115
|
+
if (v === 'true' || v === '1' || v === 'yes')
|
|
116
|
+
return true;
|
|
117
|
+
if (v === 'false' || v === '0' || v === 'no' || v === '')
|
|
118
|
+
return false;
|
|
119
|
+
throw makeEvalError({
|
|
120
|
+
code: ErrorCode.TEMPLATE_TYPE_MISMATCH,
|
|
121
|
+
message: `'${raw}' cannot be coerced to bool at path '${tok.path.join('.')}'`,
|
|
122
|
+
field,
|
|
123
|
+
path: tok.path.join('.'),
|
|
124
|
+
pos: tok.pos,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
case 'json': {
|
|
128
|
+
try {
|
|
129
|
+
return JSON.parse(raw);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
throw makeEvalError({
|
|
133
|
+
code: ErrorCode.TEMPLATE_TYPE_MISMATCH,
|
|
134
|
+
message: `'${raw}' is not valid JSON at path '${tok.path.join('.')}': ${err.message}`,
|
|
135
|
+
field,
|
|
136
|
+
path: tok.path.join('.'),
|
|
137
|
+
pos: tok.pos,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Extract dependency paths from a token stream. Used by the topological
|
|
145
|
+
* sort pass to order resolution of self-referencing documents.
|
|
146
|
+
*/
|
|
147
|
+
export function dependencies(tokens) {
|
|
148
|
+
const out = [];
|
|
149
|
+
for (const tok of tokens) {
|
|
150
|
+
if (tok.kind === 'expr')
|
|
151
|
+
out.push(tok.path.join('.'));
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
function makeEvalError(e) {
|
|
156
|
+
const err = new Error(e.message);
|
|
157
|
+
err.name = 'TemplateEvalError';
|
|
158
|
+
err.code = e.code;
|
|
159
|
+
err.field = e.field;
|
|
160
|
+
err.path = e.path;
|
|
161
|
+
err.pos = e.pos;
|
|
162
|
+
return err;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL2V2YWx1YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQWF2RCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUVqRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFZLEVBQUUsSUFBYztJQUNyRCxJQUFJLEdBQUcsR0FBWSxLQUFLLENBQUM7SUFDekIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzFFLEdBQUcsR0FBSSxHQUErQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FDckIsTUFBZSxFQUNmLEtBQVksRUFDWixLQUFjO0lBRWQsMkVBQTJFO0lBQzNFLHdEQUF3RDtJQUN4RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFzQyxD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RCxHQUFHLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDO0lBQy9CLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNsQixHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDcEIsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNoQixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBDb2VyY2VLaW5kLCBTb3VyY2VQb3NpdGlvbiwgVG9rZW4gfSBmcm9tICcuL3Rva2VuaXplci5qcyc7XG5cbmV4cG9ydCB0eXBlIFNjb3BlID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbEVycm9yIHtcbiAgY29kZTogRXJyb3JDb2RlO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwb3M/OiBTb3VyY2VQb3NpdGlvbjtcbn1cblxuY29uc3QgUkVTRVJWRURfUk9PVF9QQVRIUyA9IG5ldyBTZXQoWydzZWNyZXRzJ10pO1xuXG4vKipcbiAqIExvb2sgdXAgYSBkb3Qtc2VwYXJhdGVkIHBhdGggaW5zaWRlIGEgc2NvcGUgb2JqZWN0LiBSZXR1cm5zIGB1bmRlZmluZWRgXG4gKiBpZiBhbnkgaW50ZXJtZWRpYXRlIHNlZ21lbnQgaXMgbWlzc2luZyBvciBub3QgYW4gb2JqZWN0LlxuICpcbiAqIE9ubHkgT1dOIGVudW1lcmFibGUtb3Itbm90LWluaGVyaXRlZCBwcm9wZXJ0aWVzIGFyZSB0cmF2ZXJzZWQ6IGEgc2VnbWVudCBpc1xuICogcmVzb2x2ZWQgdmlhIGBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxgIHNvIGluaGVyaXRlZCBtZW1iZXJzIG9mXG4gKiB0aGUgcHJvdG90eXBlIGNoYWluIChgY29uc3RydWN0b3JgLCBgdG9TdHJpbmdgLCBgdmFsdWVPZmAsIGBoYXNPd25Qcm9wZXJ0eWAsXG4gKiB0aGUgYF9fcHJvdG9fX2AgYWNjZXNzb3IsIOKApikgbmV2ZXIgcmVzb2x2ZSDigJQgdGhleSByZXR1cm4gYHVuZGVmaW5lZGAgYW5kIHRodXNcbiAqIGZhbGwgdGhyb3VnaCB0byB0aGUgY2FsbGVyJ3Mgbm9ybWFsIHVua25vd24tcGF0aCBoYW5kbGluZyAoYSBgfCBkZWZhdWx0OmBcbiAqIGZhbGxiYWNrIG9yIGEgYFRFTVBMQVRFX1VOS05PV05fUEFUSGAgZXJyb3IpLiBBcHBsaWVkIGF0IGV2ZXJ5IGxldmVsLFxuICogaW5jbHVkaW5nIHRoZSByb290IHNlZ21lbnQsIHRoaXMgYWxzbyBtYWtlcyB0aGUgc2NvcGUncyBvd24gdG9wLWxldmVsIGtleXNcbiAqIHRoZSBlZmZlY3RpdmUgcm9vdCBhbGxvdy1saXN0LCBzbyBhbiB1bmtub3duL3Byb3RvdHlwZSByb290IGlzIHJlamVjdGVkIGV2ZW5cbiAqIG9uIHRoZSBzeW50aCBwYXRoIHRoYXQgc2tpcHMgYHZhbGlkYXRlVGVtcGxhdGVzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cFBhdGgoc2NvcGU6IFNjb3BlLCBwYXRoOiBzdHJpbmdbXSk6IHVua25vd24ge1xuICBsZXQgY3VyOiB1bmtub3duID0gc2NvcGU7XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBwYXRoKSB7XG4gICAgaWYgKGN1ciA9PSBudWxsIHx8IHR5cGVvZiBjdXIgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1ciwgc2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3VyID0gKGN1ciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbc2VnbWVudF07XG4gIH1cbiAgcmV0dXJuIGN1cjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgdG9rZW4gc3RyZWFtIGFnYWluc3QgYSBzY29wZS4gUmV0dXJucyB0aGUgcmVzb2x2ZWQgc3RyaW5nLlxuICogVGhyb3dzIGBFdmFsRXJyb3JgIHdoZW4gYW4gdW5yZXNvbHZlZCBwYXRoIGhhcyBubyBkZWZhdWx0IGZpbHRlci5cbiAqXG4gKiBDb2VyY2lvbiBmaWx0ZXJzIChgfCBudW1iZXJgLCBgfCBib29sYCwgYHwganNvbmApIG9ubHkgdGFrZSBlZmZlY3RcbiAqIHdoZW4gdGhlIHRlbXBsYXRlIGV4cHJlc3Npb24gaXMgdGhlIGVudGlyZSBmaWVsZCDigJQgZS5nLlxuICogYHJlcGxpY2FzOiBcInt7IHZhcnMuY291bnQgfCBudW1iZXIgfX1cImAgeWllbGRzIGAzYCAobnVtYmVyKSB3aGlsZVxuICogYHJlcGxpY2FzOiBcImNvdW50PXt7IHZhcnMuY291bnQgfCBudW1iZXIgfX1cImAgeWllbGRzIGBcImNvdW50PTNcImBcbiAqIChzdHJpbmcsIGJlY2F1c2UgdGhlIHRlbXBsYXRlIGlzIGVtYmVkZGVkIGluIHN1cnJvdW5kaW5nIGxpdGVyYWxzKS5cbiAqIE1peGVkLWxpdGVyYWwgZmllbGRzIGFsd2F5cyByZXR1cm4gYSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKFxuICB0b2tlbnM6IFRva2VuW10sXG4gIHNjb3BlOiBTY29wZSxcbiAgZmllbGQ/OiBzdHJpbmcsXG4pOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVua25vd25bXSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgLy8gV2hvbGUtZmllbGQgY29lcmNpb24gc2hvcnRjdXQ6IG9ubHkgYXBwbHkgY29lcmNpb24gd2hlbiB0aGUgZW50aXJlIGZpZWxkXG4gIC8vIGlzIGEgc2luZ2xlIGV4cHJlc3Npb24gKG5vIHN1cnJvdW5kaW5nIGxpdGVyYWwgdGV4dCkuXG4gIGlmICh0b2tlbnMubGVuZ3RoID09PSAxICYmIHRva2Vuc1swXSEua2luZCA9PT0gJ2V4cHInICYmIHRva2Vuc1swXSEuY29lcmNlKSB7XG4gICAgY29uc3QgdG9rID0gdG9rZW5zWzBdISBhcyBFeHRyYWN0PFRva2VuLCB7IGtpbmQ6ICdleHByJyB9PjtcbiAgICBjb25zdCByYXcgPSByZXNvbHZlT25lKHRvaywgc2NvcGUsIGZpZWxkKTtcbiAgICByZXR1cm4gYXBwbHlDb2VyY2lvbihyYXcsIHRvay5jb2VyY2UhLCB0b2ssIGZpZWxkKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHRvayBvZiB0b2tlbnMpIHtcbiAgICBpZiAodG9rLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgcGFydHMucHVzaCh0b2sudmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJhdyA9IHJlc29sdmVPbmUodG9rLCBzY29wZSwgZmllbGQpO1xuICAgIHBhcnRzLnB1c2godHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgPyByYXcgOiBTdHJpbmcocmF3KSk7XG4gIH1cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpO1xufVxuXG4vKiogUmVzb2x2ZSBhIHNpbmdsZSBleHByZXNzaW9uIHRva2VuIHRvIGl0cyBzdHJpbmcgZm9ybSAobm8gY29lcmNpb24pLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU9uZSh0b2s6IEV4dHJhY3Q8VG9rZW4sIHsga2luZDogJ2V4cHInIH0+LCBzY29wZTogU2NvcGUsIGZpZWxkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IHRvay5wYXRoWzBdITtcbiAgaWYgKFJFU0VSVkVEX1JPT1RfUEFUSFMuaGFzKHJvb3QpKSB7XG4gICAgdGhyb3cgbWFrZUV2YWxFcnJvcih7XG4gICAgICBjb2RlOiBFcnJvckNvZGUuVEVNUExBVEVfU0VDUkVUU19SRVNFUlZFRCxcbiAgICAgIG1lc3NhZ2U6IGAnJHtyb290fScgaXMgYSByZXNlcnZlZCBzY29wZSDigJQgdXNlIHRoZSBwbHVnaW4ncyAnc2VjcmV0czonIGZpZWxkIGluc3RlYWRgLFxuICAgICAgZmllbGQsXG4gICAgICBwYXRoOiB0b2sucGF0aC5qb2luKCcuJyksXG4gICAgICBwb3M6IHRvay5wb3MsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBsb29rdXBQYXRoKHNjb3BlLCB0b2sucGF0aCk7XG4gIC8vIEEgbWlzc2luZyBwYXRoIE9SIGFuIGVtcHR5IHN0cmluZyBmYWxscyB0byB0aGUgZGVmYXVsdCAoaW50ZW5kZWQsIHRlc3RlZCk6XG4gIC8vIGFuIHVuc2V0L2JsYW5rIHZhbHVlIGlzIHRyZWF0ZWQgYXMgXCJwcm92aWRlIGEgZGVmYXVsdCBvciBmYWlsXCIuXG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykge1xuICAgIGlmICh0b2suZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHJldHVybiB0b2suZGVmYXVsdFZhbHVlO1xuICAgIHRocm93IG1ha2VFdmFsRXJyb3Ioe1xuICAgICAgY29kZTogRXJyb3JDb2RlLlRFTVBMQVRFX1VOS05PV05fUEFUSCxcbiAgICAgIG1lc3NhZ2U6IGBUZW1wbGF0ZSByZWZlcmVuY2VzIHVua25vd24gcGF0aCAnJHt0b2sucGF0aC5qb2luKCcuJyl9JyBhbmQgbm8gZGVmYXVsdCBwcm92aWRlZGAsXG4gICAgICBmaWVsZCxcbiAgICAgIHBhdGg6IHRvay5wYXRoLmpvaW4oJy4nKSxcbiAgICAgIHBvczogdG9rLnBvcyxcbiAgICB9KTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG1ha2VFdmFsRXJyb3Ioe1xuICAgICAgY29kZTogRXJyb3JDb2RlLlRFTVBMQVRFX1RZUEVfTUlTTUFUQ0gsXG4gICAgICBtZXNzYWdlOiBgVGVtcGxhdGUgcGF0aCAnJHt0b2sucGF0aC5qb2luKCcuJyl9JyByZXNvbHZlZCB0byBhbiBvYmplY3Q7IG9ubHkgc3RyaW5ncy9udW1iZXJzL2Jvb2xlYW5zIGFyZSBpbnRlcnBvbGF0YWJsZWAsXG4gICAgICBmaWVsZCxcbiAgICAgIHBhdGg6IHRvay5wYXRoLmpvaW4oJy4nKSxcbiAgICAgIHBvczogdG9rLnBvcyxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxuLyoqIEFwcGx5IGEgd2hvbGUtZmllbGQgY29lcmNpb24gZmlsdGVyIHRvIGEgcmVzb2x2ZWQgc3RyaW5nIHZhbHVlLiAqL1xuZnVuY3Rpb24gYXBwbHlDb2VyY2lvbihcbiAgcmF3OiBzdHJpbmcsXG4gIGtpbmQ6IENvZXJjZUtpbmQsXG4gIHRvazogRXh0cmFjdDxUb2tlbiwgeyBraW5kOiAnZXhwcicgfT4sXG4gIGZpZWxkPzogc3RyaW5nLFxuKTogbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCBzdHJpbmcgfCB1bmtub3duW10gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgIGNvbnN0IG4gPSBOdW1iZXIocmF3KTtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG4pKSB7XG4gICAgICAgIHRocm93IG1ha2VFdmFsRXJyb3Ioe1xuICAgICAgICAgIGNvZGU6IEVycm9yQ29kZS5URU1QTEFURV9UWVBFX01JU01BVENILFxuICAgICAgICAgIG1lc3NhZ2U6IGAnJHtyYXd9JyBjYW5ub3QgYmUgY29lcmNlZCB0byBudW1iZXIgYXQgcGF0aCAnJHt0b2sucGF0aC5qb2luKCcuJyl9J2AsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgcGF0aDogdG9rLnBhdGguam9pbignLicpLFxuICAgICAgICAgIHBvczogdG9rLnBvcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgY2FzZSAnYm9vbCc6IHtcbiAgICAgIGNvbnN0IHYgPSByYXcudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodiA9PT0gJ3RydWUnIHx8IHYgPT09ICcxJyB8fCB2ID09PSAneWVzJykgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodiA9PT0gJ2ZhbHNlJyB8fCB2ID09PSAnMCcgfHwgdiA9PT0gJ25vJyB8fCB2ID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhyb3cgbWFrZUV2YWxFcnJvcih7XG4gICAgICAgIGNvZGU6IEVycm9yQ29kZS5URU1QTEFURV9UWVBFX01JU01BVENILFxuICAgICAgICBtZXNzYWdlOiBgJyR7cmF3fScgY2Fubm90IGJlIGNvZXJjZWQgdG8gYm9vbCBhdCBwYXRoICcke3Rvay5wYXRoLmpvaW4oJy4nKX0nYCxcbiAgICAgICAgZmllbGQsXG4gICAgICAgIHBhdGg6IHRvay5wYXRoLmpvaW4oJy4nKSxcbiAgICAgICAgcG9zOiB0b2sucG9zLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgJ2pzb24nOiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgdW5rbm93bltdIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbWFrZUV2YWxFcnJvcih7XG4gICAgICAgICAgY29kZTogRXJyb3JDb2RlLlRFTVBMQVRFX1RZUEVfTUlTTUFUQ0gsXG4gICAgICAgICAgbWVzc2FnZTogYCcke3Jhd30nIGlzIG5vdCB2YWxpZCBKU09OIGF0IHBhdGggJyR7dG9rLnBhdGguam9pbignLicpfSc6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gLFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIHBhdGg6IHRvay5wYXRoLmpvaW4oJy4nKSxcbiAgICAgICAgICBwb3M6IHRvay5wb3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgZGVwZW5kZW5jeSBwYXRocyBmcm9tIGEgdG9rZW4gc3RyZWFtLiBVc2VkIGJ5IHRoZSB0b3BvbG9naWNhbFxuICogc29ydCBwYXNzIHRvIG9yZGVyIHJlc29sdXRpb24gb2Ygc2VsZi1yZWZlcmVuY2luZyBkb2N1bWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXBlbmRlbmNpZXModG9rZW5zOiBUb2tlbltdKTogc3RyaW5nW10ge1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgdG9rIG9mIHRva2Vucykge1xuICAgIGlmICh0b2sua2luZCA9PT0gJ2V4cHInKSBvdXQucHVzaCh0b2sucGF0aC5qb2luKCcuJykpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VFdmFsRXJyb3IoZTogRXZhbEVycm9yKTogRXJyb3IgJiBFdmFsRXJyb3Ige1xuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoZS5tZXNzYWdlKSBhcyBFcnJvciAmIEV2YWxFcnJvcjtcbiAgZXJyLm5hbWUgPSAnVGVtcGxhdGVFdmFsRXJyb3InO1xuICBlcnIuY29kZSA9IGUuY29kZTtcbiAgZXJyLmZpZWxkID0gZS5maWVsZDtcbiAgZXJyLnBhdGggPSBlLnBhdGg7XG4gIGVyci5wb3MgPSBlLnBvcztcbiAgcmV0dXJuIGVycjtcbn1cbiJdfQ==
|