@aws-cdk/aws-imagebuilder-alpha 2.224.0-alpha.0
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/.jsii +9476 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +71 -0
- package/LICENSE +201 -0
- package/NOTICE +19 -0
- package/README.md +94 -0
- package/awslint.json +5 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +19 -0
- package/lib/infrastructure-configuration.d.ts +323 -0
- package/lib/infrastructure-configuration.js +341 -0
- package/node_modules/yaml/LICENSE +13 -0
- package/node_modules/yaml/README.md +127 -0
- package/node_modules/yaml/browser/dist/PlainValue-b8036b75.js +1275 -0
- package/node_modules/yaml/browser/dist/Schema-e94716c8.js +682 -0
- package/node_modules/yaml/browser/dist/index.js +1002 -0
- package/node_modules/yaml/browser/dist/legacy-exports.js +3 -0
- package/node_modules/yaml/browser/dist/package.json +1 -0
- package/node_modules/yaml/browser/dist/parse-cst.js +1904 -0
- package/node_modules/yaml/browser/dist/resolveSeq-492ab440.js +2419 -0
- package/node_modules/yaml/browser/dist/types.js +4 -0
- package/node_modules/yaml/browser/dist/util.js +2 -0
- package/node_modules/yaml/browser/dist/warnings-df54cb69.js +499 -0
- package/node_modules/yaml/browser/index.js +1 -0
- package/node_modules/yaml/browser/map.js +2 -0
- package/node_modules/yaml/browser/pair.js +2 -0
- package/node_modules/yaml/browser/parse-cst.js +1 -0
- package/node_modules/yaml/browser/scalar.js +2 -0
- package/node_modules/yaml/browser/schema.js +9 -0
- package/node_modules/yaml/browser/seq.js +2 -0
- package/node_modules/yaml/browser/types/binary.js +8 -0
- package/node_modules/yaml/browser/types/omap.js +3 -0
- package/node_modules/yaml/browser/types/pairs.js +3 -0
- package/node_modules/yaml/browser/types/set.js +3 -0
- package/node_modules/yaml/browser/types/timestamp.js +10 -0
- package/node_modules/yaml/browser/types.js +1 -0
- package/node_modules/yaml/browser/util.js +1 -0
- package/node_modules/yaml/dist/Document-9b4560a1.js +757 -0
- package/node_modules/yaml/dist/PlainValue-ec8e588e.js +876 -0
- package/node_modules/yaml/dist/Schema-88e323a7.js +525 -0
- package/node_modules/yaml/dist/index.js +79 -0
- package/node_modules/yaml/dist/legacy-exports.js +16 -0
- package/node_modules/yaml/dist/parse-cst.js +1753 -0
- package/node_modules/yaml/dist/resolveSeq-d03cb037.js +2161 -0
- package/node_modules/yaml/dist/test-events.js +162 -0
- package/node_modules/yaml/dist/types.js +23 -0
- package/node_modules/yaml/dist/util.js +19 -0
- package/node_modules/yaml/dist/warnings-1000a372.js +416 -0
- package/node_modules/yaml/index.d.ts +372 -0
- package/node_modules/yaml/index.js +1 -0
- package/node_modules/yaml/map.js +2 -0
- package/node_modules/yaml/package.json +106 -0
- package/node_modules/yaml/pair.js +2 -0
- package/node_modules/yaml/parse-cst.d.ts +191 -0
- package/node_modules/yaml/parse-cst.js +1 -0
- package/node_modules/yaml/scalar.js +2 -0
- package/node_modules/yaml/schema.js +9 -0
- package/node_modules/yaml/seq.js +2 -0
- package/node_modules/yaml/types/binary.js +8 -0
- package/node_modules/yaml/types/omap.js +3 -0
- package/node_modules/yaml/types/pairs.js +3 -0
- package/node_modules/yaml/types/set.js +3 -0
- package/node_modules/yaml/types/timestamp.js +10 -0
- package/node_modules/yaml/types.d.ts +407 -0
- package/node_modules/yaml/types.js +17 -0
- package/node_modules/yaml/types.mjs +17 -0
- package/node_modules/yaml/util.d.ts +86 -0
- package/node_modules/yaml/util.js +16 -0
- package/node_modules/yaml/util.mjs +18 -0
- package/package.json +122 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +25 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
3
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
4
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
5
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
6
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
7
|
+
var _, done = false;
|
|
8
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
9
|
+
var context = {};
|
|
10
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
11
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
12
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
13
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
14
|
+
if (kind === "accessor") {
|
|
15
|
+
if (result === void 0) continue;
|
|
16
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
17
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
18
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
19
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
20
|
+
}
|
|
21
|
+
else if (_ = accept(result)) {
|
|
22
|
+
if (kind === "field") initializers.unshift(_);
|
|
23
|
+
else descriptor[key] = _;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
27
|
+
done = true;
|
|
28
|
+
};
|
|
29
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
30
|
+
var useValue = arguments.length > 2;
|
|
31
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
32
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
33
|
+
}
|
|
34
|
+
return useValue ? value : void 0;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.InfrastructureConfiguration = exports.Tenancy = exports.HttpTokens = void 0;
|
|
38
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
39
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
40
|
+
const cdk = require("aws-cdk-lib");
|
|
41
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
42
|
+
const aws_imagebuilder_1 = require("aws-cdk-lib/aws-imagebuilder");
|
|
43
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
44
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
45
|
+
const INFRASTRUCTURE_CONFIGURATION_SYMBOL = Symbol.for('@aws-cdk/aws-imagebuilder-alpha.InfrastructureConfiguration');
|
|
46
|
+
/**
|
|
47
|
+
* Indicates whether a signed token header is required for instance metadata retrieval requests.
|
|
48
|
+
*
|
|
49
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/APIReference/API_InstanceMetadataOptions.html#imagebuilder-Type-InstanceMetadataOptions-httpTokens
|
|
50
|
+
*/
|
|
51
|
+
var HttpTokens;
|
|
52
|
+
(function (HttpTokens) {
|
|
53
|
+
/**
|
|
54
|
+
* Allows retrieval of instance metadata with or without a signed token header in the request
|
|
55
|
+
*/
|
|
56
|
+
HttpTokens["OPTIONAL"] = "optional";
|
|
57
|
+
/**
|
|
58
|
+
* Requires a signed token header in instance metadata retrieval requests
|
|
59
|
+
*/
|
|
60
|
+
HttpTokens["REQUIRED"] = "required";
|
|
61
|
+
})(HttpTokens || (exports.HttpTokens = HttpTokens = {}));
|
|
62
|
+
/**
|
|
63
|
+
* The tenancy to use for an instance.
|
|
64
|
+
*
|
|
65
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/APIReference/API_Placement.html#imagebuilder-Type-Placement-tenancy
|
|
66
|
+
*/
|
|
67
|
+
var Tenancy;
|
|
68
|
+
(function (Tenancy) {
|
|
69
|
+
/**
|
|
70
|
+
* Instances will be launched with default tenancy
|
|
71
|
+
*/
|
|
72
|
+
Tenancy["DEFAULT"] = "default";
|
|
73
|
+
/**
|
|
74
|
+
* Instances will be launched with dedicated tenancy
|
|
75
|
+
*/
|
|
76
|
+
Tenancy["DEDICATED"] = "dedicated";
|
|
77
|
+
/**
|
|
78
|
+
* Instances will be launched on a dedicated host
|
|
79
|
+
*/
|
|
80
|
+
Tenancy["HOST"] = "host";
|
|
81
|
+
})(Tenancy || (exports.Tenancy = Tenancy = {}));
|
|
82
|
+
/**
|
|
83
|
+
* A new or imported Infrastructure Configuration
|
|
84
|
+
*/
|
|
85
|
+
class InfrastructureConfigurationBase extends cdk.Resource {
|
|
86
|
+
/**
|
|
87
|
+
* Grant custom actions to the given grantee for the infrastructure configuration
|
|
88
|
+
*
|
|
89
|
+
* @param grantee - The principal
|
|
90
|
+
* @param actions - The list of actions
|
|
91
|
+
*/
|
|
92
|
+
grant(grantee, ...actions) {
|
|
93
|
+
return iam.Grant.addToPrincipal({
|
|
94
|
+
grantee,
|
|
95
|
+
actions,
|
|
96
|
+
resourceArns: [this.infrastructureConfigurationArn],
|
|
97
|
+
scope: this,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Grant read permissions to the given grantee for the infrastructure configuration
|
|
102
|
+
*
|
|
103
|
+
* @param grantee - The principal
|
|
104
|
+
*/
|
|
105
|
+
grantRead(grantee) {
|
|
106
|
+
return this.grant(grantee, 'imagebuilder:GetInfrastructureConfiguration');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Represents an EC2 Image Builder Infrastructure Configuration.
|
|
111
|
+
*
|
|
112
|
+
* @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-infra-config.html
|
|
113
|
+
*/
|
|
114
|
+
let InfrastructureConfiguration = (() => {
|
|
115
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
116
|
+
let _classDescriptor;
|
|
117
|
+
let _classExtraInitializers = [];
|
|
118
|
+
let _classThis;
|
|
119
|
+
let _classSuper = InfrastructureConfigurationBase;
|
|
120
|
+
var InfrastructureConfiguration = class extends _classSuper {
|
|
121
|
+
static { _classThis = this; }
|
|
122
|
+
static {
|
|
123
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
124
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
125
|
+
InfrastructureConfiguration = _classThis = _classDescriptor.value;
|
|
126
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
127
|
+
}
|
|
128
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.InfrastructureConfiguration", version: "2.224.0-alpha.0" };
|
|
129
|
+
/** Uniquely identifies this class. */
|
|
130
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-imagebuilder-alpha.InfrastructureConfiguration';
|
|
131
|
+
/**
|
|
132
|
+
* Import an existing infrastructure configuration given its ARN.
|
|
133
|
+
*/
|
|
134
|
+
static fromInfrastructureConfigurationArn(scope, id, infrastructureConfigurationArn) {
|
|
135
|
+
const infrastructureConfigurationName = cdk.Stack.of(scope).splitArn(infrastructureConfigurationArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
|
|
136
|
+
class Import extends InfrastructureConfigurationBase {
|
|
137
|
+
infrastructureConfigurationArn = infrastructureConfigurationArn;
|
|
138
|
+
infrastructureConfigurationName = infrastructureConfigurationName;
|
|
139
|
+
}
|
|
140
|
+
return new Import(scope, id);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Import an existing infrastructure configuration given its name. The provided name must be normalized by converting
|
|
144
|
+
* all alphabetical characters to lowercase, and replacing all spaces and underscores with hyphens.
|
|
145
|
+
*/
|
|
146
|
+
static fromInfrastructureConfigurationName(scope, id, infrastructureConfigurationName) {
|
|
147
|
+
return InfrastructureConfiguration.fromInfrastructureConfigurationArn(scope, id, cdk.Stack.of(scope).formatArn({
|
|
148
|
+
service: 'imagebuilder',
|
|
149
|
+
resource: 'infrastructure-configuration',
|
|
150
|
+
resourceName: infrastructureConfigurationName,
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Return whether the given object is an InfrastructureConfiguration.
|
|
155
|
+
*/
|
|
156
|
+
static isInfrastructureConfiguration(x) {
|
|
157
|
+
return x !== null && typeof x === 'object' && INFRASTRUCTURE_CONFIGURATION_SYMBOL in x;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The ARN of the infrastructure configuration
|
|
161
|
+
*/
|
|
162
|
+
infrastructureConfigurationArn;
|
|
163
|
+
/**
|
|
164
|
+
* The name of the infrastructure configuration
|
|
165
|
+
*/
|
|
166
|
+
infrastructureConfigurationName;
|
|
167
|
+
/**
|
|
168
|
+
* The EC2 instance profile to use for the build
|
|
169
|
+
*/
|
|
170
|
+
instanceProfile;
|
|
171
|
+
/**
|
|
172
|
+
* The role associated with the EC2 instance profile used for the build
|
|
173
|
+
*/
|
|
174
|
+
role;
|
|
175
|
+
/**
|
|
176
|
+
* The bucket used to upload image build logs
|
|
177
|
+
*/
|
|
178
|
+
logBucket;
|
|
179
|
+
autoGeneratedInstanceProfileRole;
|
|
180
|
+
constructor(scope, id, props = {}) {
|
|
181
|
+
super(scope, id, {
|
|
182
|
+
physicalName: props.infrastructureConfigurationName ??
|
|
183
|
+
cdk.Lazy.string({
|
|
184
|
+
produce: () => cdk.Names.uniqueResourceName(this, {
|
|
185
|
+
maxLength: 128,
|
|
186
|
+
separator: '-',
|
|
187
|
+
allowedSpecialCharacters: '-',
|
|
188
|
+
}).toLowerCase(), // Enforce lowercase for the auto-generated fallback
|
|
189
|
+
}),
|
|
190
|
+
});
|
|
191
|
+
try {
|
|
192
|
+
jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_InfrastructureConfigurationProps(props);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
196
|
+
Error.captureStackTrace(error, InfrastructureConfiguration);
|
|
197
|
+
}
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
// Enhanced CDK Analytics Telemetry
|
|
201
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
202
|
+
Object.defineProperty(this, INFRASTRUCTURE_CONFIGURATION_SYMBOL, { value: true });
|
|
203
|
+
this.validateInfrastructureConfigurationName();
|
|
204
|
+
if (props.subnetSelection && !props.vpc) {
|
|
205
|
+
throw new cdk.ValidationError('A vpc must be provided when using subnetSelection', this);
|
|
206
|
+
}
|
|
207
|
+
const selectedSubnets = props.vpc?.selectSubnets(props.subnetSelection);
|
|
208
|
+
if (props.vpc && selectedSubnets && selectedSubnets.subnetIds.length === 0) {
|
|
209
|
+
throw new cdk.ValidationError('No subnets matched the given subnetSelection for the provided VPC.', this);
|
|
210
|
+
}
|
|
211
|
+
if (props.instanceProfile && props.role) {
|
|
212
|
+
throw new cdk.ValidationError('Both an instance profile and a role cannot be provided', this);
|
|
213
|
+
}
|
|
214
|
+
if (!cdk.Token.isUnresolved(props.ec2InstanceTenancy)) {
|
|
215
|
+
if (props.ec2InstanceTenancy === Tenancy.HOST) {
|
|
216
|
+
if (props.ec2InstanceHostId === undefined && props.ec2InstanceHostResourceGroupArn === undefined) {
|
|
217
|
+
throw new cdk.ValidationError('ec2InstanceHostId or ec2InstanceHostResourceGroupArn must be specified when ec2InstanceTenancy is set to host', this);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
if (props.ec2InstanceHostId !== undefined) {
|
|
222
|
+
throw new cdk.ValidationError('ec2InstanceHostId cannot be specified unless ec2InstanceTenancy is set to host', this);
|
|
223
|
+
}
|
|
224
|
+
if (props.ec2InstanceHostResourceGroupArn !== undefined) {
|
|
225
|
+
throw new cdk.ValidationError('ec2InstanceHostResourceGroupArn cannot be specified unless ec2InstanceTenancy is set to host', this);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (props.ec2InstanceHostId !== undefined && props.ec2InstanceHostResourceGroupArn !== undefined) {
|
|
230
|
+
throw new cdk.ValidationError('ec2InstanceHostId and ec2InstanceHostResourceGroupArn cannot be used together', this);
|
|
231
|
+
}
|
|
232
|
+
if (props.httpPutResponseHopLimit !== undefined && props.httpPutResponseHopLimit < 1) {
|
|
233
|
+
throw new cdk.ValidationError('httpPutResponseHopLimit must be at least 1', this);
|
|
234
|
+
}
|
|
235
|
+
if (props.httpPutResponseHopLimit !== undefined && props.httpPutResponseHopLimit > 64) {
|
|
236
|
+
throw new cdk.ValidationError('httpPutResponseHopLimit must be at most 64', this);
|
|
237
|
+
}
|
|
238
|
+
if (!props.instanceProfile && !props.role) {
|
|
239
|
+
this.autoGeneratedInstanceProfileRole = new iam.Role(this, 'InstanceProfileRole', {
|
|
240
|
+
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
|
|
241
|
+
managedPolicies: [
|
|
242
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'),
|
|
243
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName('EC2InstanceProfileForImageBuilder'),
|
|
244
|
+
],
|
|
245
|
+
});
|
|
246
|
+
this.role = this.autoGeneratedInstanceProfileRole;
|
|
247
|
+
}
|
|
248
|
+
this.instanceProfile =
|
|
249
|
+
props.instanceProfile ||
|
|
250
|
+
new iam.InstanceProfile(this, 'InstanceProfile', { role: props.role ?? this.autoGeneratedInstanceProfileRole });
|
|
251
|
+
this.role = this.instanceProfile.role;
|
|
252
|
+
this.logBucket = props.logging?.s3Bucket;
|
|
253
|
+
if (this.logBucket && this.role) {
|
|
254
|
+
this.logBucket.grantPut(this.role, props.logging?.s3KeyPrefix ? `${props.logging.s3KeyPrefix}/*` : '*');
|
|
255
|
+
}
|
|
256
|
+
const hasPlacementOptions = props.ec2InstanceAvailabilityZone !== undefined ||
|
|
257
|
+
props.ec2InstanceHostId !== undefined ||
|
|
258
|
+
props.ec2InstanceHostResourceGroupArn !== undefined ||
|
|
259
|
+
props.ec2InstanceTenancy !== undefined;
|
|
260
|
+
const placement = hasPlacementOptions
|
|
261
|
+
? {
|
|
262
|
+
...(props.ec2InstanceAvailabilityZone !== undefined && {
|
|
263
|
+
availabilityZone: props.ec2InstanceAvailabilityZone,
|
|
264
|
+
}),
|
|
265
|
+
...(props.ec2InstanceHostId !== undefined && { hostId: props.ec2InstanceHostId }),
|
|
266
|
+
...(props.ec2InstanceHostResourceGroupArn !== undefined && {
|
|
267
|
+
hostResourceGroupArn: props.ec2InstanceHostResourceGroupArn,
|
|
268
|
+
}),
|
|
269
|
+
...(props.ec2InstanceTenancy !== undefined && { tenancy: props.ec2InstanceTenancy }),
|
|
270
|
+
}
|
|
271
|
+
: undefined;
|
|
272
|
+
const infrastructureConfiguration = new aws_imagebuilder_1.CfnInfrastructureConfiguration(this, 'Resource', {
|
|
273
|
+
name: this.physicalName,
|
|
274
|
+
instanceProfileName: this.instanceProfile.instanceProfileName,
|
|
275
|
+
description: props.description,
|
|
276
|
+
instanceMetadataOptions: {
|
|
277
|
+
httpTokens: props.httpTokens ?? HttpTokens.REQUIRED,
|
|
278
|
+
httpPutResponseHopLimit: props.httpPutResponseHopLimit ?? 2,
|
|
279
|
+
},
|
|
280
|
+
instanceTypes: props.instanceTypes?.length
|
|
281
|
+
? props.instanceTypes?.map((instanceType) => instanceType.toString())
|
|
282
|
+
: undefined,
|
|
283
|
+
keyPair: props.keyPair?.keyPairName,
|
|
284
|
+
...(props.logging && {
|
|
285
|
+
logging: {
|
|
286
|
+
s3Logs: {
|
|
287
|
+
s3BucketName: props.logging?.s3Bucket.bucketName,
|
|
288
|
+
s3KeyPrefix: props.logging?.s3KeyPrefix,
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
}),
|
|
292
|
+
...(placement && { placement }),
|
|
293
|
+
resourceTags: props.resourceTags,
|
|
294
|
+
securityGroupIds: props.securityGroups?.length
|
|
295
|
+
? props.securityGroups?.map((securityGroup) => securityGroup.securityGroupId)
|
|
296
|
+
: undefined,
|
|
297
|
+
subnetId: props.vpc?.selectSubnets(props.subnetSelection).subnetIds[0],
|
|
298
|
+
snsTopicArn: props.notificationTopic?.topicArn,
|
|
299
|
+
tags: props.tags,
|
|
300
|
+
terminateInstanceOnFailure: props.terminateInstanceOnFailure,
|
|
301
|
+
});
|
|
302
|
+
this.infrastructureConfigurationName = this.getResourceNameAttribute(infrastructureConfiguration.attrName);
|
|
303
|
+
this.infrastructureConfigurationArn = this.getResourceArnAttribute(infrastructureConfiguration.attrArn, {
|
|
304
|
+
service: 'imagebuilder',
|
|
305
|
+
resource: 'infrastructure-configuration',
|
|
306
|
+
resourceName: this.physicalName,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
validateInfrastructureConfigurationName() {
|
|
310
|
+
if (cdk.Token.isUnresolved(this.physicalName)) {
|
|
311
|
+
return; // Cannot validate unresolved tokens, given their actual value is rendered at deployment time
|
|
312
|
+
}
|
|
313
|
+
if (this.physicalName.length > 128) {
|
|
314
|
+
throw new cdk.ValidationError('The infrastructureConfigurationName cannot be longer than 128 characters', this);
|
|
315
|
+
}
|
|
316
|
+
if (this.physicalName.includes(' ')) {
|
|
317
|
+
throw new cdk.ValidationError('The infrastructureConfigurationName cannot contain spaces', this);
|
|
318
|
+
}
|
|
319
|
+
if (this.physicalName.includes('_')) {
|
|
320
|
+
throw new cdk.ValidationError('The infrastructureConfigurationName cannot contain underscores', this);
|
|
321
|
+
}
|
|
322
|
+
if (this.physicalName !== this.physicalName.toLowerCase()) {
|
|
323
|
+
throw new cdk.ValidationError('The infrastructureConfigurationName must be lowercase', this);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* @internal
|
|
328
|
+
*/
|
|
329
|
+
_bind(options) {
|
|
330
|
+
if (options.isContainerBuild) {
|
|
331
|
+
this.autoGeneratedInstanceProfileRole?.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('EC2InstanceProfileForImageBuilderECRContainerBuilds'));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
static {
|
|
335
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
return InfrastructureConfiguration = _classThis;
|
|
339
|
+
})();
|
|
340
|
+
exports.InfrastructureConfiguration = InfrastructureConfiguration;
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mcmFzdHJ1Y3R1cmUtY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluZnJhc3RydWN0dXJlLWNvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQW1DO0FBRW5DLDJDQUEyQztBQUMzQyxtRUFBOEU7QUFHOUUsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUcxRSxNQUFNLG1DQUFtQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsNkRBQTZELENBQUMsQ0FBQztBQW9DdEg7Ozs7R0FJRztBQUNILElBQVksVUFVWDtBQVZELFdBQVksVUFBVTtJQUNwQjs7T0FFRztJQUNILG1DQUFxQixDQUFBO0lBRXJCOztPQUVHO0lBQ0gsbUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVZXLFVBQVUsMEJBQVYsVUFBVSxRQVVyQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLE9BZVg7QUFmRCxXQUFZLE9BQU87SUFDakI7O09BRUc7SUFDSCw4QkFBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILGtDQUF1QixDQUFBO0lBRXZCOztPQUVHO0lBQ0gsd0JBQWEsQ0FBQTtBQUNmLENBQUMsRUFmVyxPQUFPLHVCQUFQLE9BQU8sUUFlbEI7QUFxTUQ7O0dBRUc7QUFDSCxNQUFlLCtCQUFnQyxTQUFRLEdBQUcsQ0FBQyxRQUFRO0lBVWpFOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLE9BQXVCLEVBQUUsR0FBRyxPQUFpQjtRQUN4RCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQzlCLE9BQU87WUFDUCxPQUFPO1lBQ1AsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDO1lBQ25ELEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLE9BQXVCO1FBQ3RDLE9BQU8s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QkFDbkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsMEVBQTBFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEgsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsMkRBQTJELEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkcsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsZ0VBQWdFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEcsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQzFELE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLHVEQUF1RCxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9GLENBQUM7U0FDRjtRQUVEOztXQUVHO1FBQ0ksS0FBSyxDQUFDLE9BQStDO1lBQzFELElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxnQkFBZ0IsQ0FDckQsR0FBRyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxxREFBcUQsQ0FBQyxDQUNsRyxDQUFDO1lBQ0osQ0FBQztTQUNGOztZQXRRVSx1REFBMkI7Ozs7O0FBQTNCLGtFQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBDZm5JbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaW1hZ2VidWlsZGVyJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuY29uc3QgSU5GUkFTVFJVQ1RVUkVfQ09ORklHVVJBVElPTl9TWU1CT0wgPSBTeW1ib2wuZm9yKCdAYXdzLWNkay9hd3MtaW1hZ2VidWlsZGVyLWFscGhhLkluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbicpO1xuXG4vKipcbiAqIEFuIEVDMiBJbWFnZSBCdWlsZGVyIEluZnJhc3RydWN0dXJlIENvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbiBleHRlbmRzIGNkay5JUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBpbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb25Bcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGluZnJhc3RydWN0dXJlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFudCBjdXN0b20gYWN0aW9ucyB0byB0aGUgZ2l2ZW4gZ3JhbnRlZSBmb3IgdGhlIGluZnJhc3RydWN0dXJlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBhY3Rpb25zIC0gVGhlIGxpc3Qgb2YgYWN0aW9uc1xuICAgKi9cbiAgZ3JhbnQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciBhIHNpZ25lZCB0b2tlbiBoZWFkZXIgaXMgcmVxdWlyZWQgZm9yIGluc3RhbmNlIG1ldGFkYXRhIHJldHJpZXZhbCByZXF1ZXN0cy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pbWFnZWJ1aWxkZXIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfSW5zdGFuY2VNZXRhZGF0YU9wdGlvbnMuaHRtbCNpbWFnZWJ1aWxkZXItVHlwZS1JbnN0YW5jZU1ldGFkYXRhT3B0aW9ucy1odHRwVG9rZW5zXG4gKi9cbmV4cG9ydCBlbnVtIEh0dHBUb2tlbnMge1xuICAvKipcbiAgICogQWxsb3dzIHJldHJpZXZhbCBvZiBpbnN0YW5jZSBtZXRhZGF0YSB3aXRoIG9yIHdpdGhvdXQgYSBzaWduZWQgdG9rZW4gaGVhZGVyIGluIHRoZSByZXF1ZXN0XG4gICAqL1xuICBPUFRJT05BTCA9ICdvcHRpb25hbCcsXG5cbiAgLyoqXG4gICAqIFJlcXVpcmVzIGEgc2lnbmVkIHRva2VuIGhlYWRlciBpbiBpbnN0YW5jZSBtZXRhZGF0YSByZXRyaWV2YWwgcmVxdWVzdHNcbiAgICovXG4gIFJFUVVJUkVEID0gJ3JlcXVpcmVkJyxcbn1cblxuLyoqXG4gKiBUaGUgdGVuYW5jeSB0byB1c2UgZm9yIGFuIGluc3RhbmNlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ltYWdlYnVpbGRlci9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9QbGFjZW1lbnQuaHRtbCNpbWFnZWJ1aWxkZXItVHlwZS1QbGFjZW1lbnQtdGVuYW5jeVxuICovXG5leHBvcnQgZW51bSBUZW5hbmN5IHtcbiAgLyoqXG4gICAqIEluc3RhbmNlcyB3aWxsIGJlIGxhdW5jaGVkIHdpdGggZGVmYXVsdCB0ZW5hbmN5XG4gICAqL1xuICBERUZBVUxUID0gJ2RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBJbnN0YW5jZXMgd2lsbCBiZSBsYXVuY2hlZCB3aXRoIGRlZGljYXRlZCB0ZW5hbmN5XG4gICAqL1xuICBERURJQ0FURUQgPSAnZGVkaWNhdGVkJyxcblxuICAvKipcbiAgICogSW5zdGFuY2VzIHdpbGwgYmUgbGF1bmNoZWQgb24gYSBkZWRpY2F0ZWQgaG9zdFxuICAgKi9cbiAgSE9TVCA9ICdob3N0Jyxcbn1cblxuLyoqXG4gKiBUaGUgbG9nIHNldHRpbmdzIGZvciBkZXRhaWxlZCBidWlsZCBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTG9nZ2luZyB7XG4gIC8qKlxuICAgKiBUaGUgUzMgbG9nZ2luZyBidWNrZXQgdG8gdXNlIGZvciBkZXRhaWxlZCBidWlsZCBsb2dnaW5nXG4gICAqL1xuICByZWFkb25seSBzM0J1Y2tldDogczMuSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIFMzIGxvZ2dpbmcgcHJlZml4IHRvIHVzZSBmb3IgZGV0YWlsZWQgYnVpbGQgbG9nZ2luZ1xuICAgKlxuICAgKiBAZGVmYXVsdCBObyBwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IHMzS2V5UHJlZml4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGFuIEluZnJhc3RydWN0dXJlIENvbmZpZ3VyYXRpb24gcmVzb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbi4gVGhpcyBuYW1lIG11c3QgYmUgbm9ybWFsaXplZCBieSB0cmFuc2Zvcm1pbmcgYWxsIGFscGhhYmV0aWNhbFxuICAgKiBjaGFyYWN0ZXJzIHRvIGxvd2VyY2FzZSwgYW5kIHJlcGxhY2luZyBhbGwgc3BhY2VzIGFuZCB1bmRlcnNjb3JlcyB3aXRoIGh5cGhlbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IEEgbmFtZSBpcyBnZW5lcmF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnN0YW5jZSB0eXBlcyB0byBsYXVuY2ggYnVpbGQgYW5kIHRlc3QgRUMyIGluc3RhbmNlcyB3aXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBJbWFnZSBCdWlsZGVyIHdpbGwgY2hvb3NlIGZyb20gYSBkZWZhdWx0IHNldCBvZiBpbnN0YW5jZSB0eXBlcyBjb21wYXRpYmxlIHdpdGggdGhlIEFNSVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VUeXBlcz86IGVjMi5JbnN0YW5jZVR5cGVbXTtcblxuICAvKipcbiAgICogVGhlIGluc3RhbmNlIHByb2ZpbGUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGluc3RhbmNlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBBTUkuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGFuIGluc3RhbmNlIHByb2ZpbGUgYW5kIHJvbGUgd2lsbCBiZSBjcmVhdGVkIHdpdGggbWluaW1hbCBwZXJtaXNzaW9ucyBuZWVkZWQgdG8gYnVpbGQgdGhlIGltYWdlLFxuICAgKiBhdHRhY2hlZCB0byB0aGUgRUMyIGluc3RhbmNlLlxuICAgKlxuICAgKiBJZiBhbiBTMyBsb2dnaW5nIGJ1Y2tldCBhbmQga2V5IHByZWZpeCBpcyBwcm92aWRlZCwgYW4gSUFNIGlubGluZSBwb2xpY3kgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgaW5zdGFuY2UgcHJvZmlsZSdzXG4gICAqIHJvbGUsIGFsbG93aW5nIHMzOlB1dE9iamVjdCBwZXJtaXNzaW9ucyBvbiB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBBbiBpbnN0YW5jZSBwcm9maWxlIHdpbGwgYmUgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZVByb2ZpbGU/OiBpYW0uSUluc3RhbmNlUHJvZmlsZTtcbiAgLyoqXG4gICAqIEFuIElBTSByb2xlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBpbnN0YW5jZSBwcm9maWxlIHVzZWQgYnkgSW1hZ2UgQnVpbGRlclxuICAgKlxuICAgKiBUaGUgcm9sZSBtdXN0IGJlIGFzc3VtYWJsZSBieSB0aGUgc2VydmljZSBwcmluY2lwYWwgYGVjMi5hbWF6b25hd3MuY29tYDpcbiAgICogTm90ZTogWW91IGNhbiBwcm92aWRlIGFuIGluc3RhbmNlUHJvZmlsZSBvciBhIHJvbGUsIGJ1dCBub3QgYm90aC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnTXlSb2xlJywge1xuICAgKiAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdlYzIuYW1hem9uYXdzLmNvbScpXG4gICAqIH0pO1xuICAgKlxuICAgKiBAZGVmYXVsdCBBIHJvbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQsIGl0IGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIGByb2xlYCBwcm9wZXJ0eVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGhlIFZQQyB0byBwbGFjZSB0aGUgaW5zdGFuY2UgdXNlZCB0byBjdXN0b21pemUgdGhlIEFNSS5cbiAgICpcbiAgICogQGRlZmF1bHQgVGhlIGRlZmF1bHQgVlBDIHdpbGwgYmUgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB3aGljaCBzdWJuZXQgdG8gcGxhY2UgdGhlIGluc3RhbmNlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBBTUkuIFRoZSBmaXJzdCBzdWJuZXQgdGhhdCBpcyBzZWxlY3RlZCB3aWxsIGJlIHVzZWQuXG4gICAqIFlvdSBtdXN0IHNwZWNpZnkgdGhlIFZQQyB0byBjdXN0b21pemUgdGhlIHN1Ym5ldCBzZWxlY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFRoZSBmaXJzdCBzdWJuZXQgc2VsZWN0ZWQgZnJvbSB0aGUgcHJvdmlkZWQgVlBDIHdpbGwgYmUgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0U2VsZWN0aW9uPzogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogVGhlIHNlY3VyaXR5IGdyb3VwcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgaW5zdGFuY2UgdXNlZCB0byBjdXN0b21pemUgdGhlIEFNSS5cbiAgICpcbiAgICogQGRlZmF1bHQgVGhlIGRlZmF1bHQgc2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSBWUEMgd2lsbCBiZSB1c2VkXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IGVjMi5JU2VjdXJpdHlHcm91cFtdO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHBhaXIgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBidWlsZCBhbmQgdGVzdCBFQzIgaW5zdGFuY2VzLiBUaGUga2V5IHBhaXIgY2FuIGJlIHVzZWQgdG8gbG9nIGludG8gdGhlIGJ1aWxkXG4gICAqIG9yIHRlc3QgaW5zdGFuY2VzIGZvciB0cm91Ymxlc2hvb3RpbmcgYW55IGZhaWx1cmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSBrZXlQYWlyPzogZWMyLklLZXlQYWlyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHRlcm1pbmF0ZSB0aGUgRUMyIGluc3RhbmNlIHdoZW4gdGhlIGJ1aWxkIG9yIHRlc3Qgd29ya2Zsb3cgZmFpbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHRlcm1pbmF0ZUluc3RhbmNlT25GYWlsdXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGhvcHMgdGhhdCBhbiBpbnN0YW5jZSBtZXRhZGF0YSByZXF1ZXN0IGNhbiB0cmF2ZXJzZSB0byByZWFjaCBpdHMgZGVzdGluYXRpb24uIEJ5IGRlZmF1bHQsXG4gICAqIHRoaXMgaXMgc2V0IHRvIDIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIHJlYWRvbmx5IGh0dHBQdXRSZXNwb25zZUhvcExpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhIHNpZ25lZCB0b2tlbiBoZWFkZXIgaXMgcmVxdWlyZWQgZm9yIGluc3RhbmNlIG1ldGFkYXRhIHJldHJpZXZhbCByZXF1ZXN0cy4gQnkgZGVmYXVsdCwgdGhpcyBpc1xuICAgKiBzZXQgdG8gYHJlcXVpcmVkYCB0byByZXF1aXJlIElNRFN2MiBvbiBidWlsZCBhbmQgdGVzdCBFQzIgaW5zdGFuY2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBIdHRwVG9rZW5zLlJFUVVJUkVEXG4gICAqL1xuICByZWFkb25seSBodHRwVG9rZW5zPzogSHR0cFRva2VucztcblxuICAvKipcbiAgICogVGhlIFNOUyB0b3BpYyBvbiB3aGljaCBub3RpZmljYXRpb25zIGFyZSBzZW50IHdoZW4gYW4gaW1hZ2UgYnVpbGQgY29tcGxldGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBub3RpZmljYXRpb25zIGFyZSBzZW50XG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Ub3BpYz86IHNucy5JVG9waWM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2cgc2V0dGluZ3MgZm9yIGRldGFpbGVkIGJ1aWxkIGxvZ2dpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxvZ2dpbmc/OiBJbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb25Mb2dnaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYXZhaWxhYmlsaXR5IHpvbmUgdG8gcGxhY2UgSW1hZ2UgQnVpbGRlciBidWlsZCBhbmQgdGVzdCBFQzIgaW5zdGFuY2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBFQzIgd2lsbCBzZWxlY3QgYSByYW5kb20gem9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZWMySW5zdGFuY2VBdmFpbGFiaWxpdHlab25lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIERlZGljYXRlZCBIb3N0IG9uIHdoaWNoIGJ1aWxkIGFuZCB0ZXN0IGluc3RhbmNlcyBydW4uIFRoaXMgb25seSBhcHBsaWVzIGlmIHRoZSBpbnN0YW5jZSB0ZW5hbmN5IGlzXG4gICAqIGBob3N0YC4gVGhpcyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoZSBgZWMySW5zdGFuY2VIb3N0UmVzb3VyY2VHcm91cEFybmAgcGFyYW1ldGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSBlYzJJbnN0YW5jZUhvc3RJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgaG9zdCByZXNvdXJjZSBncm91cCBvbiB3aGljaCBidWlsZCBhbmQgdGVzdCBpbnN0YW5jZXMgcnVuLiBUaGlzIG9ubHkgYXBwbGllcyBpZiB0aGUgaW5zdGFuY2UgdGVuYW5jeVxuICAgKiBpcyBgaG9zdGAuIFRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGUgYGVjMkluc3RhbmNlSG9zdElkYCBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVjMkluc3RhbmNlSG9zdFJlc291cmNlR3JvdXBBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW5hbmN5IG9mIHRoZSBpbnN0YW5jZS4gRGVkaWNhdGVkIHRlbmFuY3kgcnVucyBpbnN0YW5jZXMgb24gc2luZ2xlLXRlbmFudCBoYXJkd2FyZSwgd2hpbGUgaG9zdCB0ZW5hbmN5IHJ1bnNcbiAgICogaW5zdGFuY2VzIG9uIGEgZGVkaWNhdGVkIGhvc3QuIFNoYXJlZCB0ZW5hbmN5IGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgVGVuYW5jeS5ERUZBVUxUXG4gICAqL1xuICByZWFkb25seSBlYzJJbnN0YW5jZVRlbmFuY3k/OiBUZW5hbmN5O1xuXG4gIC8qKlxuICAgKiBUaGUgYWRkaXRpb25hbCB0YWdzIHRvIGFzc2lnbiB0byB0aGUgQW1hem9uIEVDMiBpbnN0YW5jZSB0aGF0IEltYWdlIEJ1aWxkZXIgbGF1bmNoZXMgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZVRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgdGFncyB0byBhcHBseSB0byB0aGUgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb250ZXh0IGluZm9ybWF0aW9uIHBhc3NlZCB3aGVuIGFuIEluZnJhc3RydWN0dXJlIENvbmZpZ3VyYXRpb24gaXMgYmVpbmcgY29uc3VtZWRcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb25CaW5kT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBpcyBiZWluZyBjb25zdW1lZCBpbnNpZGUgb2YgYSBjb250YWluZXIgYnVpbGRcbiAgICovXG4gIHJlYWRvbmx5IGlzQ29udGFpbmVyQnVpbGQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgbmV3IG9yIGltcG9ydGVkIEluZnJhc3RydWN0dXJlIENvbmZpZ3VyYXRpb25cbiAqL1xuYWJzdHJhY3QgY2xhc3MgSW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uQmFzZSBleHRlbmRzIGNkay5SZXNvdXJjZSBpbXBsZW1lbnRzIElJbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uQXJuOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFudCBjdXN0b20gYWN0aW9ucyB0byB0aGUgZ2l2ZW4gZ3JhbnRlZSBmb3IgdGhlIGluZnJhc3RydWN0dXJlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBhY3Rpb25zIC0gVGhlIGxpc3Qgb2YgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9ucyxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uQXJuXSxcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSBpbmZyYXN0cnVjdHVyZSBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoZ3JhbnRlZSwgJ2ltYWdlYnVpbGRlcjpHZXRJbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb24nKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gRUMyIEltYWdlIEJ1aWxkZXIgSW5mcmFzdHJ1Y3R1cmUgQ29uZmlndXJhdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pbWFnZWJ1aWxkZXIvbGF0ZXN0L3VzZXJndWlkZS9tYW5hZ2UtaW5mcmEtY29uZmlnLmh0bWxcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIEluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbiBleHRlbmRzIEluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbkJhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1pbWFnZWJ1aWxkZXItYWxwaGEuSW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uJztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGluZnJhc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24gZ2l2ZW4gaXRzIEFSTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbkFybihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uQXJuOiBzdHJpbmcsXG4gICk6IElJbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb24ge1xuICAgIGNvbnN0IGluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbk5hbWUgPSBjZGsuU3RhY2sub2Yoc2NvcGUpLnNwbGl0QXJuKFxuICAgICAgaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uQXJuLFxuICAgICAgY2RrLkFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgICkucmVzb3VyY2VOYW1lITtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbkJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbkFybiA9IGluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbkFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBpbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb25OYW1lID0gaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBpbmZyYXN0cnVjdHVyZSBjb25maWd1cmF0aW9uIGdpdmVuIGl0cyBuYW1lLiBUaGUgcHJvdmlkZWQgbmFtZSBtdXN0IGJlIG5vcm1hbGl6ZWQgYnkgY29udmVydGluZ1xuICAgKiBhbGwgYWxwaGFiZXRpY2FsIGNoYXJhY3RlcnMgdG8gbG93ZXJjYXNlLCBhbmQgcmVwbGFjaW5nIGFsbCBzcGFjZXMgYW5kIHVuZGVyc2NvcmVzIHdpdGggaHlwaGVucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbk5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbk5hbWU6IHN0cmluZyxcbiAgKTogSUluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIEluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbi5mcm9tSW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uQXJuKFxuICAgICAgc2NvcGUsXG4gICAgICBpZCxcbiAgICAgIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICAgIHJlc291cmNlOiAnaW5mcmFzdHJ1Y3R1cmUtY29uZmlndXJhdGlvbicsXG4gICAgICAgIHJlc291cmNlTmFtZTogaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTmFtZSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhbiBJbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzSW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uKHg6IGFueSk6IHggaXMgSW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4geCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgSU5GUkFTVFJVQ1RVUkVfQ09ORklHVVJBVElPTl9TWU1CT0wgaW4geDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBpbmZyYXN0cnVjdHVyZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBpbmZyYXN0cnVjdHVyZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRUMyIGluc3RhbmNlIHByb2ZpbGUgdG8gdXNlIGZvciB0aGUgYnVpbGRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnN0YW5jZVByb2ZpbGU6IGlhbS5JSW5zdGFuY2VQcm9maWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhlIEVDMiBpbnN0YW5jZSBwcm9maWxlIHVzZWQgZm9yIHRoZSBidWlsZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBidWNrZXQgdXNlZCB0byB1cGxvYWQgaW1hZ2UgYnVpbGQgbG9nc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ0J1Y2tldD86IHMzLklCdWNrZXQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvR2VuZXJhdGVkSW5zdGFuY2VQcm9maWxlUm9sZT86IGlhbS5JUm9sZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvblByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTpcbiAgICAgICAgcHJvcHMuaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTmFtZSA/P1xuICAgICAgICBjZGsuTGF6eS5zdHJpbmcoe1xuICAgICAgICAgIHByb2R1Y2U6ICgpID0+XG4gICAgICAgICAgICBjZGsuTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHtcbiAgICAgICAgICAgICAgbWF4TGVuZ3RoOiAxMjgsXG4gICAgICAgICAgICAgIHNlcGFyYXRvcjogJy0nLFxuICAgICAgICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICctJyxcbiAgICAgICAgICAgIH0pLnRvTG93ZXJDYXNlKCksIC8vIEVuZm9yY2UgbG93ZXJjYXNlIGZvciB0aGUgYXV0by1nZW5lcmF0ZWQgZmFsbGJhY2tcbiAgICAgICAgfSksXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgSU5GUkFTVFJVQ1RVUkVfQ09ORklHVVJBVElPTl9TWU1CT0wsIHsgdmFsdWU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlSW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTmFtZSgpO1xuXG4gICAgaWYgKHByb3BzLnN1Ym5ldFNlbGVjdGlvbiAmJiAhcHJvcHMudnBjKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignQSB2cGMgbXVzdCBiZSBwcm92aWRlZCB3aGVuIHVzaW5nIHN1Ym5ldFNlbGVjdGlvbicsIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkU3VibmV0cyA9IHByb3BzLnZwYz8uc2VsZWN0U3VibmV0cyhwcm9wcy5zdWJuZXRTZWxlY3Rpb24pO1xuICAgIGlmIChwcm9wcy52cGMgJiYgc2VsZWN0ZWRTdWJuZXRzICYmIHNlbGVjdGVkU3VibmV0cy5zdWJuZXRJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignTm8gc3VibmV0cyBtYXRjaGVkIHRoZSBnaXZlbiBzdWJuZXRTZWxlY3Rpb24gZm9yIHRoZSBwcm92aWRlZCBWUEMuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmluc3RhbmNlUHJvZmlsZSAmJiBwcm9wcy5yb2xlKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignQm90aCBhbiBpbnN0YW5jZSBwcm9maWxlIGFuZCBhIHJvbGUgY2Fubm90IGJlIHByb3ZpZGVkJywgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKCFjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmVjMkluc3RhbmNlVGVuYW5jeSkpIHtcbiAgICAgIGlmIChwcm9wcy5lYzJJbnN0YW5jZVRlbmFuY3kgPT09IFRlbmFuY3kuSE9TVCkge1xuICAgICAgICBpZiAocHJvcHMuZWMySW5zdGFuY2VIb3N0SWQgPT09IHVuZGVmaW5lZCAmJiBwcm9wcy5lYzJJbnN0YW5jZUhvc3RSZXNvdXJjZUdyb3VwQXJuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgICdlYzJJbnN0YW5jZUhvc3RJZCBvciBlYzJJbnN0YW5jZUhvc3RSZXNvdXJjZUdyb3VwQXJuIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gZWMySW5zdGFuY2VUZW5hbmN5IGlzIHNldCB0byBob3N0JyxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb3BzLmVjMkluc3RhbmNlSG9zdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgICdlYzJJbnN0YW5jZUhvc3RJZCBjYW5ub3QgYmUgc3BlY2lmaWVkIHVubGVzcyBlYzJJbnN0YW5jZVRlbmFuY3kgaXMgc2V0IHRvIGhvc3QnLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BzLmVjMkluc3RhbmNlSG9zdFJlc291cmNlR3JvdXBBcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgJ2VjMkluc3RhbmNlSG9zdFJlc291cmNlR3JvdXBBcm4gY2Fubm90IGJlIHNwZWNpZmllZCB1bmxlc3MgZWMySW5zdGFuY2VUZW5hbmN5IGlzIHNldCB0byBob3N0JyxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5lYzJJbnN0YW5jZUhvc3RJZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmVjMkluc3RhbmNlSG9zdFJlc291cmNlR3JvdXBBcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdlYzJJbnN0YW5jZUhvc3RJZCBhbmQgZWMySW5zdGFuY2VIb3N0UmVzb3VyY2VHcm91cEFybiBjYW5ub3QgYmUgdXNlZCB0b2dldGhlcicsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5odHRwUHV0UmVzcG9uc2VIb3BMaW1pdCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmh0dHBQdXRSZXNwb25zZUhvcExpbWl0IDwgMSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ2h0dHBQdXRSZXNwb25zZUhvcExpbWl0IG11c3QgYmUgYXQgbGVhc3QgMScsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5odHRwUHV0UmVzcG9uc2VIb3BMaW1pdCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmh0dHBQdXRSZXNwb25zZUhvcExpbWl0ID4gNjQpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdodHRwUHV0UmVzcG9uc2VIb3BMaW1pdCBtdXN0IGJlIGF0IG1vc3QgNjQnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3BzLmluc3RhbmNlUHJvZmlsZSAmJiAhcHJvcHMucm9sZSkge1xuICAgICAgdGhpcy5hdXRvR2VuZXJhdGVkSW5zdGFuY2VQcm9maWxlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnSW5zdGFuY2VQcm9maWxlUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2VjMi5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQW1hem9uU1NNTWFuYWdlZEluc3RhbmNlQ29yZScpLFxuICAgICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnRUMySW5zdGFuY2VQcm9maWxlRm9ySW1hZ2VCdWlsZGVyJyksXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMucm9sZSA9IHRoaXMuYXV0b0dlbmVyYXRlZEluc3RhbmNlUHJvZmlsZVJvbGU7XG4gICAgfVxuXG4gICAgdGhpcy5pbnN0YW5jZVByb2ZpbGUgPVxuICAgICAgcHJvcHMuaW5zdGFuY2VQcm9maWxlIHx8XG4gICAgICBuZXcgaWFtLkluc3RhbmNlUHJvZmlsZSh0aGlzLCAnSW5zdGFuY2VQcm9maWxlJywgeyByb2xlOiBwcm9wcy5yb2xlID8/IHRoaXMuYXV0b0dlbmVyYXRlZEluc3RhbmNlUHJvZmlsZVJvbGUgfSk7XG5cbiAgICB0aGlzLnJvbGUgPSB0aGlzLmluc3RhbmNlUHJvZmlsZS5yb2xlO1xuICAgIHRoaXMubG9nQnVja2V0ID0gcHJvcHMubG9nZ2luZz8uczNCdWNrZXQ7XG5cbiAgICBpZiAodGhpcy5sb2dCdWNrZXQgJiYgdGhpcy5yb2xlKSB7XG4gICAgICB0aGlzLmxvZ0J1Y2tldC5ncmFudFB1dCh0aGlzLnJvbGUsIHByb3BzLmxvZ2dpbmc/LnMzS2V5UHJlZml4ID8gYCR7cHJvcHMubG9nZ2luZy5zM0tleVByZWZpeH0vKmAgOiAnKicpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1BsYWNlbWVudE9wdGlvbnMgPVxuICAgICAgcHJvcHMuZWMySW5zdGFuY2VBdmFpbGFiaWxpdHlab25lICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHByb3BzLmVjMkluc3RhbmNlSG9zdElkICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHByb3BzLmVjMkluc3RhbmNlSG9zdFJlc291cmNlR3JvdXBBcm4gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcHJvcHMuZWMySW5zdGFuY2VUZW5hbmN5ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGxhY2VtZW50OiBDZm5JbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb24uUGxhY2VtZW50UHJvcGVydHkgfCB1bmRlZmluZWQgPSBoYXNQbGFjZW1lbnRPcHRpb25zXG4gICAgICA/IHtcbiAgICAgICAgLi4uKHByb3BzLmVjMkluc3RhbmNlQXZhaWxhYmlsaXR5Wm9uZSAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBwcm9wcy5lYzJJbnN0YW5jZUF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgIH0pLFxuICAgICAgICAuLi4ocHJvcHMuZWMySW5zdGFuY2VIb3N0SWQgIT09IHVuZGVmaW5lZCAmJiB7IGhvc3RJZDogcHJvcHMuZWMySW5zdGFuY2VIb3N0SWQgfSksXG4gICAgICAgIC4uLihwcm9wcy5lYzJJbnN0YW5jZUhvc3RSZXNvdXJjZUdyb3VwQXJuICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgIGhvc3RSZXNvdXJjZUdyb3VwQXJuOiBwcm9wcy5lYzJJbnN0YW5jZUhvc3RSZXNvdXJjZUdyb3VwQXJuLFxuICAgICAgICB9KSxcbiAgICAgICAgLi4uKHByb3BzLmVjMkluc3RhbmNlVGVuYW5jeSAhPT0gdW5kZWZpbmVkICYmIHsgdGVuYW5jeTogcHJvcHMuZWMySW5zdGFuY2VUZW5hbmN5IH0pLFxuICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBpbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb24gPSBuZXcgQ2ZuSW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgaW5zdGFuY2VQcm9maWxlTmFtZTogdGhpcy5pbnN0YW5jZVByb2ZpbGUuaW5zdGFuY2VQcm9maWxlTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGluc3RhbmNlTWV0YWRhdGFPcHRpb25zOiB7XG4gICAgICAgIGh0dHBUb2tlbnM6IHByb3BzLmh0dHBUb2tlbnMgPz8gSHR0cFRva2Vucy5SRVFVSVJFRCxcbiAgICAgICAgaHR0cFB1dFJlc3BvbnNlSG9wTGltaXQ6IHByb3BzLmh0dHBQdXRSZXNwb25zZUhvcExpbWl0ID8/IDIsXG4gICAgICB9LFxuICAgICAgaW5zdGFuY2VUeXBlczogcHJvcHMuaW5zdGFuY2VUeXBlcz8ubGVuZ3RoXG4gICAgICAgID8gcHJvcHMuaW5zdGFuY2VUeXBlcz8ubWFwKChpbnN0YW5jZVR5cGUpID0+IGluc3RhbmNlVHlwZS50b1N0cmluZygpKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGtleVBhaXI6IHByb3BzLmtleVBhaXI/LmtleVBhaXJOYW1lLFxuICAgICAgLi4uKHByb3BzLmxvZ2dpbmcgJiYge1xuICAgICAgICBsb2dnaW5nOiB7XG4gICAgICAgICAgczNMb2dzOiB7XG4gICAgICAgICAgICBzM0J1Y2tldE5hbWU6IHByb3BzLmxvZ2dpbmc/LnMzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBzM0tleVByZWZpeDogcHJvcHMubG9nZ2luZz8uczNLZXlQcmVmaXgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgLi4uKHBsYWNlbWVudCAmJiB7IHBsYWNlbWVudCB9KSxcbiAgICAgIHJlc291cmNlVGFnczogcHJvcHMucmVzb3VyY2VUYWdzLFxuICAgICAgc2VjdXJpdHlHcm91cElkczogcHJvcHMuc2VjdXJpdHlHcm91cHM/Lmxlbmd0aFxuICAgICAgICA/IHByb3BzLnNlY3VyaXR5R3JvdXBzPy5tYXAoKHNlY3VyaXR5R3JvdXApID0+IHNlY3VyaXR5R3JvdXAuc2VjdXJpdHlHcm91cElkKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHN1Ym5ldElkOiBwcm9wcy52cGM/LnNlbGVjdFN1Ym5ldHMocHJvcHMuc3VibmV0U2VsZWN0aW9uKS5zdWJuZXRJZHNbMF0sXG4gICAgICBzbnNUb3BpY0FybjogcHJvcHMubm90aWZpY2F0aW9uVG9waWM/LnRvcGljQXJuLFxuICAgICAgdGFnczogcHJvcHMudGFncyxcbiAgICAgIHRlcm1pbmF0ZUluc3RhbmNlT25GYWlsdXJlOiBwcm9wcy50ZXJtaW5hdGVJbnN0YW5jZU9uRmFpbHVyZSxcbiAgICB9KTtcblxuICAgIHRoaXMuaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKGluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbi5hdHRyTmFtZSk7XG4gICAgdGhpcy5pbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb25Bcm4gPSB0aGlzLmdldFJlc291cmNlQXJuQXR0cmlidXRlKGluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbi5hdHRyQXJuLCB7XG4gICAgICBzZXJ2aWNlOiAnaW1hZ2VidWlsZGVyJyxcbiAgICAgIHJlc291cmNlOiAnaW5mcmFzdHJ1Y3R1cmUtY29uZmlndXJhdGlvbicsXG4gICAgICByZXNvdXJjZU5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbk5hbWUoKSB7XG4gICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQodGhpcy5waHlzaWNhbE5hbWUpKSB7XG4gICAgICByZXR1cm47IC8vIENhbm5vdCB2YWxpZGF0ZSB1bnJlc29sdmVkIHRva2VucywgZ2l2ZW4gdGhlaXIgYWN0dWFsIHZhbHVlIGlzIHJlbmRlcmVkIGF0IGRlcGxveW1lbnQgdGltZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5sZW5ndGggPiAxMjgpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdUaGUgaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTmFtZSBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMTI4IGNoYXJhY3RlcnMnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUuaW5jbHVkZXMoJyAnKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ1RoZSBpbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb25OYW1lIGNhbm5vdCBjb250YWluIHNwYWNlcycsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignVGhlIGluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbk5hbWUgY2Fubm90IGNvbnRhaW4gdW5kZXJzY29yZXMnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUgIT09IHRoaXMucGh5c2ljYWxOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCdUaGUgaW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uTmFtZSBtdXN0IGJlIGxvd2VyY2FzZScsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYmluZChvcHRpb25zOiBJbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb25CaW5kT3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmlzQ29udGFpbmVyQnVpbGQpIHtcbiAgICAgIHRoaXMuYXV0b0dlbmVyYXRlZEluc3RhbmNlUHJvZmlsZVJvbGU/LmFkZE1hbmFnZWRQb2xpY3koXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnRUMySW5zdGFuY2VQcm9maWxlRm9ySW1hZ2VCdWlsZGVyRUNSQ29udGFpbmVyQnVpbGRzJyksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright 2018 Eemeli Aro <eemeli@gmail.com>
|
|
2
|
+
|
|
3
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose
|
|
4
|
+
with or without fee is hereby granted, provided that the above copyright notice
|
|
5
|
+
and this permission notice appear in all copies.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
8
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
9
|
+
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
10
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
11
|
+
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
12
|
+
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
|
13
|
+
THIS SOFTWARE.
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# YAML <a href="https://www.npmjs.com/package/yaml"><img align="right" src="https://badge.fury.io/js/yaml.svg" title="npm package" /></a>
|
|
2
|
+
|
|
3
|
+
`yaml` is a JavaScript parser and stringifier for [YAML](http://yaml.org/), a human friendly data serialization standard. It supports both parsing and stringifying data using all versions of YAML, along with all common data schemas. As a particularly distinguishing feature, `yaml` fully supports reading and writing comments and blank lines in YAML documents.
|
|
4
|
+
|
|
5
|
+
The library is released under the ISC open source license, and the code is [available on GitHub](https://github.com/eemeli/yaml/). It has no external dependencies and runs on Node.js 6 and later, and in browsers from IE 11 upwards.
|
|
6
|
+
|
|
7
|
+
For the purposes of versioning, any changes that break any of the endpoints or APIs documented here will be considered semver-major breaking changes. Undocumented library internals may change between minor versions, and previous APIs may be deprecated (but not removed).
|
|
8
|
+
|
|
9
|
+
For more information, see the project's documentation site: [**eemeli.org/yaml/v1**](https://eemeli.org/yaml/v1/)
|
|
10
|
+
|
|
11
|
+
To install:
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
npm install yaml
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Note:** This is `yaml@1`. You may also be interested in the next version, currently available as [`yaml@next`](https://www.npmjs.com/package/yaml/v/next).
|
|
18
|
+
|
|
19
|
+
## API Overview
|
|
20
|
+
|
|
21
|
+
The API provided by `yaml` has three layers, depending on how deep you need to go: [Parse & Stringify](https://eemeli.org/yaml/v1/#parse-amp-stringify), [Documents](https://eemeli.org/yaml/#documents), and the [CST Parser](https://eemeli.org/yaml/#cst-parser). The first has the simplest API and "just works", the second gets you all the bells and whistles supported by the library along with a decent [AST](https://eemeli.org/yaml/#content-nodes), and the third is the closest to YAML source, making it fast, raw, and crude.
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
import YAML from 'yaml'
|
|
25
|
+
// or
|
|
26
|
+
const YAML = require('yaml')
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Parse & Stringify
|
|
30
|
+
|
|
31
|
+
- [`YAML.parse(str, options): value`](https://eemeli.org/yaml/v1/#yaml-parse)
|
|
32
|
+
- [`YAML.stringify(value, options): string`](https://eemeli.org/yaml/v1/#yaml-stringify)
|
|
33
|
+
|
|
34
|
+
### YAML Documents
|
|
35
|
+
|
|
36
|
+
- [`YAML.createNode(value, wrapScalars, tag): Node`](https://eemeli.org/yaml/v1/#creating-nodes)
|
|
37
|
+
- [`YAML.defaultOptions`](https://eemeli.org/yaml/v1/#options)
|
|
38
|
+
- [`YAML.Document`](https://eemeli.org/yaml/v1/#yaml-documents)
|
|
39
|
+
- [`constructor(options)`](https://eemeli.org/yaml/v1/#creating-documents)
|
|
40
|
+
- [`defaults`](https://eemeli.org/yaml/v1/#options)
|
|
41
|
+
- [`#anchors`](https://eemeli.org/yaml/v1/#working-with-anchors)
|
|
42
|
+
- [`#contents`](https://eemeli.org/yaml/v1/#content-nodes)
|
|
43
|
+
- [`#errors`](https://eemeli.org/yaml/v1/#errors)
|
|
44
|
+
- [`YAML.parseAllDocuments(str, options): YAML.Document[]`](https://eemeli.org/yaml/v1/#parsing-documents)
|
|
45
|
+
- [`YAML.parseDocument(str, options): YAML.Document`](https://eemeli.org/yaml/v1/#parsing-documents)
|
|
46
|
+
|
|
47
|
+
```js
|
|
48
|
+
import { Pair, YAMLMap, YAMLSeq } from 'yaml/types'
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- [`new Pair(key, value)`](https://eemeli.org/yaml/v1/#creating-nodes)
|
|
52
|
+
- [`new YAMLMap()`](https://eemeli.org/yaml/v1/#creating-nodes)
|
|
53
|
+
- [`new YAMLSeq()`](https://eemeli.org/yaml/v1/#creating-nodes)
|
|
54
|
+
|
|
55
|
+
### CST Parser
|
|
56
|
+
|
|
57
|
+
```js
|
|
58
|
+
import parseCST from 'yaml/parse-cst'
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
- [`parseCST(str): CSTDocument[]`](https://eemeli.org/yaml/v1/#parsecst)
|
|
62
|
+
- [`YAML.parseCST(str): CSTDocument[]`](https://eemeli.org/yaml/v1/#parsecst)
|
|
63
|
+
|
|
64
|
+
## YAML.parse
|
|
65
|
+
|
|
66
|
+
```yaml
|
|
67
|
+
# file.yml
|
|
68
|
+
YAML:
|
|
69
|
+
- A human-readable data serialization language
|
|
70
|
+
- https://en.wikipedia.org/wiki/YAML
|
|
71
|
+
yaml:
|
|
72
|
+
- A complete JavaScript implementation
|
|
73
|
+
- https://www.npmjs.com/package/yaml
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
```js
|
|
77
|
+
import fs from 'fs'
|
|
78
|
+
import YAML from 'yaml'
|
|
79
|
+
|
|
80
|
+
YAML.parse('3.14159')
|
|
81
|
+
// 3.14159
|
|
82
|
+
|
|
83
|
+
YAML.parse('[ true, false, maybe, null ]\n')
|
|
84
|
+
// [ true, false, 'maybe', null ]
|
|
85
|
+
|
|
86
|
+
const file = fs.readFileSync('./file.yml', 'utf8')
|
|
87
|
+
YAML.parse(file)
|
|
88
|
+
// { YAML:
|
|
89
|
+
// [ 'A human-readable data serialization language',
|
|
90
|
+
// 'https://en.wikipedia.org/wiki/YAML' ],
|
|
91
|
+
// yaml:
|
|
92
|
+
// [ 'A complete JavaScript implementation',
|
|
93
|
+
// 'https://www.npmjs.com/package/yaml' ] }
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## YAML.stringify
|
|
97
|
+
|
|
98
|
+
```js
|
|
99
|
+
import YAML from 'yaml'
|
|
100
|
+
|
|
101
|
+
YAML.stringify(3.14159)
|
|
102
|
+
// '3.14159\n'
|
|
103
|
+
|
|
104
|
+
YAML.stringify([true, false, 'maybe', null])
|
|
105
|
+
// `- true
|
|
106
|
+
// - false
|
|
107
|
+
// - maybe
|
|
108
|
+
// - null
|
|
109
|
+
// `
|
|
110
|
+
|
|
111
|
+
YAML.stringify({ number: 3, plain: 'string', block: 'two\nlines\n' })
|
|
112
|
+
// `number: 3
|
|
113
|
+
// plain: string
|
|
114
|
+
// block: >
|
|
115
|
+
// two
|
|
116
|
+
//
|
|
117
|
+
// lines
|
|
118
|
+
// `
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
Browser testing provided by:
|
|
124
|
+
|
|
125
|
+
<a href="https://www.browserstack.com/open-source">
|
|
126
|
+
<img width=200 src="https://eemeli.org/yaml/images/browserstack.svg" />
|
|
127
|
+
</a>
|