@macedon-technologies/batman 1.26.1 → 1.28.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 +12 -12
- package/API.md +4 -2
- package/lib/ApiConstructFile.js +2 -2
- package/lib/Application.js +5 -1
- package/lib/BatmanProject.js +2 -3
- package/lib/BootcampApplication.js +5 -1
- package/lib/BootcampProject.js +2 -3
- package/lib/CodeOwnersFile.js +1 -1
- package/lib/ProductionDeployWorkflow.js +1 -1
- package/lib/SecretConstructFile.d.ts +10 -0
- package/lib/SecretConstructFile.js +68 -0
- package/lib/SecretHandlerFiles.d.ts +11 -0
- package/lib/SecretHandlerFiles.js +189 -0
- package/lib/SoftwareFactoryBootstrap.d.ts +10 -0
- package/lib/SoftwareFactoryBootstrap.js +101 -0
- package/lib/SoftwareFactoryFiles.d.ts +4 -2
- package/lib/SoftwareFactoryFiles.js +10 -8
- package/lib/StagingDeployWorkflow.js +1 -1
- package/lib/ViteReactProject.js +471 -74
- package/lib/WorkflowAutoDiscover.js +1 -1
- package/lib/utils.js +26 -10
- package/package.json +1 -1
- package/swamp-bootstrap/pull-extensions.ts +68 -0
- package/swamp-bootstrap/tsconfig.json +13 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SecretHandlerFiles = void 0;
|
|
4
|
+
const projen_1 = require("projen");
|
|
5
|
+
/**
|
|
6
|
+
* Scaffolds the Lambda handler sources used by the generated Secret construct
|
|
7
|
+
* (src/constructs/Secret.ts). Copied from @matthewbonig/secret (MIT).
|
|
8
|
+
*
|
|
9
|
+
* The entry file is deliberately not named *.lambda.ts, so projen's lambda
|
|
10
|
+
* auto-discovery does not generate a second function class for it.
|
|
11
|
+
*/
|
|
12
|
+
class SecretHandlerFiles {
|
|
13
|
+
constructor(project) {
|
|
14
|
+
new projen_1.SampleFile(project, 'src/constructs/handler/Secret.Function.ts', {
|
|
15
|
+
contents: `// Copied from @matthewbonig/secret (MIT, https://github.com/mbonig/secret).
|
|
16
|
+
// This file is generated by Batman and is yours to modify.
|
|
17
|
+
import { createSecretValue } from './secret/createSecretValue';
|
|
18
|
+
import { updateSecretValue } from './secret/updateSecretValue';
|
|
19
|
+
|
|
20
|
+
interface CustomResource {
|
|
21
|
+
RequestType: 'Create' | 'Update' | 'Delete';
|
|
22
|
+
LogicalResourceId: string;
|
|
23
|
+
ResourceProperties: any;
|
|
24
|
+
OldResourceProperties?: any;
|
|
25
|
+
PhysicalResourceId?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const handler = async (event: CustomResource) => {
|
|
29
|
+
console.log('Received event:', JSON.stringify(event, null, 2));
|
|
30
|
+
|
|
31
|
+
switch (event.RequestType) {
|
|
32
|
+
case 'Create':
|
|
33
|
+
console.log(\`Create secret value for secret \${event.LogicalResourceId};\`);
|
|
34
|
+
await createSecretValue({
|
|
35
|
+
secretArn: event.ResourceProperties.Secret,
|
|
36
|
+
generateSecretString: event.ResourceProperties.GenerateSecretString,
|
|
37
|
+
});
|
|
38
|
+
break;
|
|
39
|
+
case 'Update':
|
|
40
|
+
console.log('Updating secret with physical id:', event.PhysicalResourceId);
|
|
41
|
+
await updateSecretValue({
|
|
42
|
+
secretArn: event.ResourceProperties.Secret,
|
|
43
|
+
generateSecretString: event.ResourceProperties.GenerateSecretString,
|
|
44
|
+
oldGenerateSecretString: event.OldResourceProperties.GenerateSecretString,
|
|
45
|
+
});
|
|
46
|
+
break;
|
|
47
|
+
case 'Delete':
|
|
48
|
+
console.log('Deleting secret with physical id:', event.PhysicalResourceId);
|
|
49
|
+
console.log('Doing nothing. deleting secrets requires no work at all.');
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
`,
|
|
54
|
+
});
|
|
55
|
+
new projen_1.SampleFile(project, 'src/constructs/handler/secret/client.ts', {
|
|
56
|
+
contents: `// Copied from @matthewbonig/secret (MIT, https://github.com/mbonig/secret).
|
|
57
|
+
// This file is generated by Batman and is yours to modify.
|
|
58
|
+
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
|
|
59
|
+
|
|
60
|
+
export const client = new SecretsManager({});
|
|
61
|
+
`,
|
|
62
|
+
});
|
|
63
|
+
new projen_1.SampleFile(project, 'src/constructs/handler/secret/createSecretValue.ts', {
|
|
64
|
+
contents: `// Copied from @matthewbonig/secret (MIT, https://github.com/mbonig/secret).
|
|
65
|
+
// This file is generated by Batman and is yours to modify.
|
|
66
|
+
import { GetRandomPasswordCommand, PutSecretValueCommand } from '@aws-sdk/client-secrets-manager';
|
|
67
|
+
import { client } from './client';
|
|
68
|
+
|
|
69
|
+
export async function createSecretValue({ generateSecretString, secretArn }: {
|
|
70
|
+
secretArn: any;
|
|
71
|
+
generateSecretString: any;
|
|
72
|
+
}) {
|
|
73
|
+
// since this is a create, we can just write the value as-is...
|
|
74
|
+
const secretValue = JSON.parse(generateSecretString.secretStringTemplate);
|
|
75
|
+
if (generateSecretString.generateStringKey) {
|
|
76
|
+
const randomValue = await client.send(new GetRandomPasswordCommand({
|
|
77
|
+
ExcludeCharacters: generateSecretString.excludeCharacters,
|
|
78
|
+
ExcludeLowercase: generateSecretString.excludeLowercase,
|
|
79
|
+
ExcludeNumbers: generateSecretString.excludeNumbers,
|
|
80
|
+
ExcludePunctuation: generateSecretString.excludePunctuation,
|
|
81
|
+
ExcludeUppercase: generateSecretString.excludeUppercase,
|
|
82
|
+
IncludeSpace: generateSecretString.includeSpace,
|
|
83
|
+
PasswordLength: generateSecretString.passwordLength,
|
|
84
|
+
RequireEachIncludedType: generateSecretString.requireEachIncludedType,
|
|
85
|
+
}));
|
|
86
|
+
secretValue[generateSecretString.generateStringKey] = randomValue.RandomPassword;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
await client.send(new PutSecretValueCommand({
|
|
90
|
+
SecretId: secretArn,
|
|
91
|
+
SecretString: JSON.stringify(secretValue),
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
`,
|
|
95
|
+
});
|
|
96
|
+
new projen_1.SampleFile(project, 'src/constructs/handler/secret/didRandomPropertiesChange.ts', {
|
|
97
|
+
contents: `// Copied from @matthewbonig/secret (MIT, https://github.com/mbonig/secret).
|
|
98
|
+
// This file is generated by Batman and is yours to modify.
|
|
99
|
+
export function didRandomPropertiesChange(oldGenerateSecretString: any, generateSecretString: any) {
|
|
100
|
+
return oldGenerateSecretString.excludeCharacters !== generateSecretString.excludeCharacters ||
|
|
101
|
+
oldGenerateSecretString.excludeLowercase !== generateSecretString.excludeLowercase ||
|
|
102
|
+
oldGenerateSecretString.excludeNumbers !== generateSecretString.excludeNumbers ||
|
|
103
|
+
oldGenerateSecretString.excludePunctuation !== generateSecretString.excludePunctuation ||
|
|
104
|
+
oldGenerateSecretString.excludeUppercase !== generateSecretString.excludeUppercase ||
|
|
105
|
+
oldGenerateSecretString.includeSpace !== generateSecretString.includeSpace ||
|
|
106
|
+
oldGenerateSecretString.passwordLength !== generateSecretString.passwordLength ||
|
|
107
|
+
oldGenerateSecretString.requireEachIncludedType !== generateSecretString.requireEachIncludedType;
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
`,
|
|
111
|
+
});
|
|
112
|
+
new projen_1.SampleFile(project, 'src/constructs/handler/secret/updateSecretValue.ts', {
|
|
113
|
+
contents: `// Copied from @matthewbonig/secret (MIT, https://github.com/mbonig/secret).
|
|
114
|
+
// This file is generated by Batman and is yours to modify.
|
|
115
|
+
import {
|
|
116
|
+
GetRandomPasswordCommand,
|
|
117
|
+
GetSecretValueCommand,
|
|
118
|
+
PutSecretValueCommand,
|
|
119
|
+
} from '@aws-sdk/client-secrets-manager';
|
|
120
|
+
import { client } from './client';
|
|
121
|
+
import { didRandomPropertiesChange } from './didRandomPropertiesChange';
|
|
122
|
+
|
|
123
|
+
export async function updateSecretValue({ oldGenerateSecretString, generateSecretString, secretArn }: {
|
|
124
|
+
secretArn: any;
|
|
125
|
+
generateSecretString: any;
|
|
126
|
+
oldGenerateSecretString: any;
|
|
127
|
+
}) {
|
|
128
|
+
// let's get the existing value
|
|
129
|
+
const existingSecretValue = await client.send(new GetSecretValueCommand({
|
|
130
|
+
SecretId: secretArn,
|
|
131
|
+
}));
|
|
132
|
+
// and parse the existing value
|
|
133
|
+
let parsedValue: any = {};
|
|
134
|
+
|
|
135
|
+
try {
|
|
136
|
+
parsedValue = JSON.parse(existingSecretValue.SecretString!);
|
|
137
|
+
} catch (err) {
|
|
138
|
+
// the existing value couldn't be parsed, it was probably a random string.
|
|
139
|
+
// let's go ahead and just start fresh then,
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// now let's check what properties have changed
|
|
143
|
+
const newSecretStringTemplate = JSON.parse(generateSecretString.secretStringTemplate);
|
|
144
|
+
const oldSecretStringTemplate = JSON.parse(oldGenerateSecretString.secretStringTemplate);
|
|
145
|
+
for (const key in newSecretStringTemplate) {
|
|
146
|
+
if (oldSecretStringTemplate[key] === undefined) {
|
|
147
|
+
// ok, so here's something to add...
|
|
148
|
+
parsedValue[key] = newSecretStringTemplate[key];
|
|
149
|
+
}
|
|
150
|
+
if (oldSecretStringTemplate[key] !== newSecretStringTemplate[key]) {
|
|
151
|
+
// ok, so here's something to update...
|
|
152
|
+
parsedValue[key] = newSecretStringTemplate[key];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const key in oldSecretStringTemplate) {
|
|
156
|
+
if (newSecretStringTemplate[key] === undefined) {
|
|
157
|
+
// ok, so here's something to remove...
|
|
158
|
+
delete parsedValue[key];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// did anything around the GenerateStringKey change?
|
|
163
|
+
if (didRandomPropertiesChange(oldGenerateSecretString, generateSecretString)
|
|
164
|
+
|| generateSecretString.generateStringKey !== oldGenerateSecretString.generateStringKey) {
|
|
165
|
+
const { RandomPassword: newRandomValue } = await client.send(new GetRandomPasswordCommand({
|
|
166
|
+
ExcludeLowercase: generateSecretString.excludeLowercase === 'true',
|
|
167
|
+
ExcludeNumbers: generateSecretString.excludeNumbers === 'true',
|
|
168
|
+
ExcludePunctuation: generateSecretString.excludePunctuation === 'true',
|
|
169
|
+
ExcludeUppercase: generateSecretString.excludeUppercase === 'true',
|
|
170
|
+
IncludeSpace: generateSecretString.includeSpace === 'true',
|
|
171
|
+
PasswordLength: +generateSecretString.passwordLength,
|
|
172
|
+
RequireEachIncludedType: generateSecretString.requireEachIncludedType === 'true',
|
|
173
|
+
}));
|
|
174
|
+
parsedValue[generateSecretString.generateStringKey] = newRandomValue;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// update the secret in AWS
|
|
178
|
+
await client.send(new PutSecretValueCommand({
|
|
179
|
+
SecretId: secretArn,
|
|
180
|
+
SecretString: JSON.stringify(parsedValue),
|
|
181
|
+
}));
|
|
182
|
+
|
|
183
|
+
}
|
|
184
|
+
`,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.SecretHandlerFiles = SecretHandlerFiles;
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjcmV0SGFuZGxlckZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NlY3JldEhhbmRsZXJGaWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFHcEM7Ozs7OztHQU1HO0FBQ0gsTUFBYSxrQkFBa0I7SUFDN0IsWUFBWSxPQUE0QjtRQUN0QyxJQUFJLG1CQUFVLENBQUMsT0FBTyxFQUFFLDJDQUEyQyxFQUFFO1lBQ25FLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FzQ2Y7U0FDSSxDQUFDLENBQUM7UUFFSCxJQUFJLG1CQUFVLENBQUMsT0FBTyxFQUFFLHlDQUF5QyxFQUFFO1lBQ2pFLFFBQVEsRUFBRTs7Ozs7Q0FLZjtTQUNJLENBQUMsQ0FBQztRQUVILElBQUksbUJBQVUsQ0FBQyxPQUFPLEVBQUUsb0RBQW9ELEVBQUU7WUFDNUUsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4QmY7U0FDSSxDQUFDLENBQUM7UUFFSCxJQUFJLG1CQUFVLENBQUMsT0FBTyxFQUFFLDREQUE0RCxFQUFFO1lBQ3BGLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7OztDQWFmO1NBQ0ksQ0FBQyxDQUFDO1FBRUgsSUFBSSxtQkFBVSxDQUFDLE9BQU8sRUFBRSxvREFBb0QsRUFBRTtZQUM1RSxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdUVmO1NBQ0ksQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBbkxELGdEQW1MQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhbXBsZUZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuLyoqXG4gKiBTY2FmZm9sZHMgdGhlIExhbWJkYSBoYW5kbGVyIHNvdXJjZXMgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIFNlY3JldCBjb25zdHJ1Y3RcbiAqIChzcmMvY29uc3RydWN0cy9TZWNyZXQudHMpLiBDb3BpZWQgZnJvbSBAbWF0dGhld2JvbmlnL3NlY3JldCAoTUlUKS5cbiAqXG4gKiBUaGUgZW50cnkgZmlsZSBpcyBkZWxpYmVyYXRlbHkgbm90IG5hbWVkICoubGFtYmRhLnRzLCBzbyBwcm9qZW4ncyBsYW1iZGFcbiAqIGF1dG8tZGlzY292ZXJ5IGRvZXMgbm90IGdlbmVyYXRlIGEgc2Vjb25kIGZ1bmN0aW9uIGNsYXNzIGZvciBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3JldEhhbmRsZXJGaWxlcyB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHApIHtcbiAgICBuZXcgU2FtcGxlRmlsZShwcm9qZWN0LCAnc3JjL2NvbnN0cnVjdHMvaGFuZGxlci9TZWNyZXQuRnVuY3Rpb24udHMnLCB7XG4gICAgICBjb250ZW50czogYC8vIENvcGllZCBmcm9tIEBtYXR0aGV3Ym9uaWcvc2VjcmV0IChNSVQsIGh0dHBzOi8vZ2l0aHViLmNvbS9tYm9uaWcvc2VjcmV0KS5cbi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgQmF0bWFuIGFuZCBpcyB5b3VycyB0byBtb2RpZnkuXG5pbXBvcnQgeyBjcmVhdGVTZWNyZXRWYWx1ZSB9IGZyb20gJy4vc2VjcmV0L2NyZWF0ZVNlY3JldFZhbHVlJztcbmltcG9ydCB7IHVwZGF0ZVNlY3JldFZhbHVlIH0gZnJvbSAnLi9zZWNyZXQvdXBkYXRlU2VjcmV0VmFsdWUnO1xuXG5pbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2Uge1xuICBSZXF1ZXN0VHlwZTogJ0NyZWF0ZScgfCAnVXBkYXRlJyB8ICdEZWxldGUnO1xuICBMb2dpY2FsUmVzb3VyY2VJZDogc3RyaW5nO1xuICBSZXNvdXJjZVByb3BlcnRpZXM6IGFueTtcbiAgT2xkUmVzb3VyY2VQcm9wZXJ0aWVzPzogYW55O1xuICBQaHlzaWNhbFJlc291cmNlSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBDdXN0b21SZXNvdXJjZSkgPT4ge1xuICBjb25zb2xlLmxvZygnUmVjZWl2ZWQgZXZlbnQ6JywgSlNPTi5zdHJpbmdpZnkoZXZlbnQsIG51bGwsIDIpKTtcblxuICBzd2l0Y2ggKGV2ZW50LlJlcXVlc3RUeXBlKSB7XG4gICAgY2FzZSAnQ3JlYXRlJzpcbiAgICAgIGNvbnNvbGUubG9nKFxcYENyZWF0ZSBzZWNyZXQgdmFsdWUgZm9yIHNlY3JldCBcXCR7ZXZlbnQuTG9naWNhbFJlc291cmNlSWR9O1xcYCk7XG4gICAgICBhd2FpdCBjcmVhdGVTZWNyZXRWYWx1ZSh7XG4gICAgICAgIHNlY3JldEFybjogZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLlNlY3JldCxcbiAgICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5HZW5lcmF0ZVNlY3JldFN0cmluZyxcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnVXBkYXRlJzpcbiAgICAgIGNvbnNvbGUubG9nKCdVcGRhdGluZyBzZWNyZXQgd2l0aCBwaHlzaWNhbCBpZDonLCBldmVudC5QaHlzaWNhbFJlc291cmNlSWQpO1xuICAgICAgYXdhaXQgdXBkYXRlU2VjcmV0VmFsdWUoe1xuICAgICAgICBzZWNyZXRBcm46IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5TZWNyZXQsXG4gICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuR2VuZXJhdGVTZWNyZXRTdHJpbmcsXG4gICAgICAgIG9sZEdlbmVyYXRlU2VjcmV0U3RyaW5nOiBldmVudC5PbGRSZXNvdXJjZVByb3BlcnRpZXMuR2VuZXJhdGVTZWNyZXRTdHJpbmcsXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RlbGV0ZSc6XG4gICAgICBjb25zb2xlLmxvZygnRGVsZXRpbmcgc2VjcmV0IHdpdGggcGh5c2ljYWwgaWQ6JywgZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkKTtcbiAgICAgIGNvbnNvbGUubG9nKCdEb2luZyBub3RoaW5nLiBkZWxldGluZyBzZWNyZXRzIHJlcXVpcmVzIG5vIHdvcmsgYXQgYWxsLicpO1xuICAgICAgYnJlYWs7XG4gIH1cbn07XG5gLFxuICAgIH0pO1xuXG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgJ3NyYy9jb25zdHJ1Y3RzL2hhbmRsZXIvc2VjcmV0L2NsaWVudC50cycsIHtcbiAgICAgIGNvbnRlbnRzOiBgLy8gQ29waWVkIGZyb20gQG1hdHRoZXdib25pZy9zZWNyZXQgKE1JVCwgaHR0cHM6Ly9naXRodWIuY29tL21ib25pZy9zZWNyZXQpLlxuLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBCYXRtYW4gYW5kIGlzIHlvdXJzIHRvIG1vZGlmeS5cbmltcG9ydCB7IFNlY3JldHNNYW5hZ2VyIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5cbmV4cG9ydCBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXIoe30pO1xuYCxcbiAgICB9KTtcblxuICAgIG5ldyBTYW1wbGVGaWxlKHByb2plY3QsICdzcmMvY29uc3RydWN0cy9oYW5kbGVyL3NlY3JldC9jcmVhdGVTZWNyZXRWYWx1ZS50cycsIHtcbiAgICAgIGNvbnRlbnRzOiBgLy8gQ29waWVkIGZyb20gQG1hdHRoZXdib25pZy9zZWNyZXQgKE1JVCwgaHR0cHM6Ly9naXRodWIuY29tL21ib25pZy9zZWNyZXQpLlxuLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBCYXRtYW4gYW5kIGlzIHlvdXJzIHRvIG1vZGlmeS5cbmltcG9ydCB7IEdldFJhbmRvbVBhc3N3b3JkQ29tbWFuZCwgUHV0U2VjcmV0VmFsdWVDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgeyBjbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZWNyZXRWYWx1ZSh7IGdlbmVyYXRlU2VjcmV0U3RyaW5nLCBzZWNyZXRBcm4gfToge1xuICBzZWNyZXRBcm46IGFueTtcbiAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IGFueTtcbn0pIHtcbiAgLy8gc2luY2UgdGhpcyBpcyBhIGNyZWF0ZSwgd2UgY2FuIGp1c3Qgd3JpdGUgdGhlIHZhbHVlIGFzLWlzLi4uXG4gIGNvbnN0IHNlY3JldFZhbHVlID0gSlNPTi5wYXJzZShnZW5lcmF0ZVNlY3JldFN0cmluZy5zZWNyZXRTdHJpbmdUZW1wbGF0ZSk7XG4gIGlmIChnZW5lcmF0ZVNlY3JldFN0cmluZy5nZW5lcmF0ZVN0cmluZ0tleSkge1xuICAgIGNvbnN0IHJhbmRvbVZhbHVlID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IEdldFJhbmRvbVBhc3N3b3JkQ29tbWFuZCh7XG4gICAgICBFeGNsdWRlQ2hhcmFjdGVyczogZ2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZUNoYXJhY3RlcnMsXG4gICAgICBFeGNsdWRlTG93ZXJjYXNlOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlTG93ZXJjYXNlLFxuICAgICAgRXhjbHVkZU51bWJlcnM6IGdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVOdW1iZXJzLFxuICAgICAgRXhjbHVkZVB1bmN0dWF0aW9uOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlUHVuY3R1YXRpb24sXG4gICAgICBFeGNsdWRlVXBwZXJjYXNlOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlVXBwZXJjYXNlLFxuICAgICAgSW5jbHVkZVNwYWNlOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5pbmNsdWRlU3BhY2UsXG4gICAgICBQYXNzd29yZExlbmd0aDogZ2VuZXJhdGVTZWNyZXRTdHJpbmcucGFzc3dvcmRMZW5ndGgsXG4gICAgICBSZXF1aXJlRWFjaEluY2x1ZGVkVHlwZTogZ2VuZXJhdGVTZWNyZXRTdHJpbmcucmVxdWlyZUVhY2hJbmNsdWRlZFR5cGUsXG4gICAgfSkpO1xuICAgIHNlY3JldFZhbHVlW2dlbmVyYXRlU2VjcmV0U3RyaW5nLmdlbmVyYXRlU3RyaW5nS2V5XSA9IHJhbmRvbVZhbHVlLlJhbmRvbVBhc3N3b3JkO1xuICB9XG5cbiAgYXdhaXQgY2xpZW50LnNlbmQobmV3IFB1dFNlY3JldFZhbHVlQ29tbWFuZCh7XG4gICAgU2VjcmV0SWQ6IHNlY3JldEFybixcbiAgICBTZWNyZXRTdHJpbmc6IEpTT04uc3RyaW5naWZ5KHNlY3JldFZhbHVlKSxcbiAgfSkpO1xufVxuYCxcbiAgICB9KTtcblxuICAgIG5ldyBTYW1wbGVGaWxlKHByb2plY3QsICdzcmMvY29uc3RydWN0cy9oYW5kbGVyL3NlY3JldC9kaWRSYW5kb21Qcm9wZXJ0aWVzQ2hhbmdlLnRzJywge1xuICAgICAgY29udGVudHM6IGAvLyBDb3BpZWQgZnJvbSBAbWF0dGhld2JvbmlnL3NlY3JldCAoTUlULCBodHRwczovL2dpdGh1Yi5jb20vbWJvbmlnL3NlY3JldCkuXG4vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IEJhdG1hbiBhbmQgaXMgeW91cnMgdG8gbW9kaWZ5LlxuZXhwb3J0IGZ1bmN0aW9uIGRpZFJhbmRvbVByb3BlcnRpZXNDaGFuZ2Uob2xkR2VuZXJhdGVTZWNyZXRTdHJpbmc6IGFueSwgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IGFueSkge1xuICByZXR1cm4gb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZUNoYXJhY3RlcnMgIT09IGdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVDaGFyYWN0ZXJzIHx8XG4gICAgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZUxvd2VyY2FzZSAhPT0gZ2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZUxvd2VyY2FzZSB8fFxuICAgIG9sZEdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVOdW1iZXJzICE9PSBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlTnVtYmVycyB8fFxuICAgIG9sZEdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVQdW5jdHVhdGlvbiAhPT0gZ2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZVB1bmN0dWF0aW9uIHx8XG4gICAgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZVVwcGVyY2FzZSAhPT0gZ2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZVVwcGVyY2FzZSB8fFxuICAgIG9sZEdlbmVyYXRlU2VjcmV0U3RyaW5nLmluY2x1ZGVTcGFjZSAhPT0gZ2VuZXJhdGVTZWNyZXRTdHJpbmcuaW5jbHVkZVNwYWNlIHx8XG4gICAgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcucGFzc3dvcmRMZW5ndGggIT09IGdlbmVyYXRlU2VjcmV0U3RyaW5nLnBhc3N3b3JkTGVuZ3RoIHx8XG4gICAgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcucmVxdWlyZUVhY2hJbmNsdWRlZFR5cGUgIT09IGdlbmVyYXRlU2VjcmV0U3RyaW5nLnJlcXVpcmVFYWNoSW5jbHVkZWRUeXBlO1xuXG59XG5gLFxuICAgIH0pO1xuXG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgJ3NyYy9jb25zdHJ1Y3RzL2hhbmRsZXIvc2VjcmV0L3VwZGF0ZVNlY3JldFZhbHVlLnRzJywge1xuICAgICAgY29udGVudHM6IGAvLyBDb3BpZWQgZnJvbSBAbWF0dGhld2JvbmlnL3NlY3JldCAoTUlULCBodHRwczovL2dpdGh1Yi5jb20vbWJvbmlnL3NlY3JldCkuXG4vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IEJhdG1hbiBhbmQgaXMgeW91cnMgdG8gbW9kaWZ5LlxuaW1wb3J0IHtcbiAgR2V0UmFuZG9tUGFzc3dvcmRDb21tYW5kLFxuICBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsXG4gIFB1dFNlY3JldFZhbHVlQ29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgeyBjbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5pbXBvcnQgeyBkaWRSYW5kb21Qcm9wZXJ0aWVzQ2hhbmdlIH0gZnJvbSAnLi9kaWRSYW5kb21Qcm9wZXJ0aWVzQ2hhbmdlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNlY3JldFZhbHVlKHsgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcsIGdlbmVyYXRlU2VjcmV0U3RyaW5nLCBzZWNyZXRBcm4gfToge1xuICBzZWNyZXRBcm46IGFueTtcbiAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IGFueTtcbiAgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmc6IGFueTtcbn0pIHtcbiAgLy8gbGV0J3MgZ2V0IHRoZSBleGlzdGluZyB2YWx1ZVxuICBjb25zdCBleGlzdGluZ1NlY3JldFZhbHVlID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IEdldFNlY3JldFZhbHVlQ29tbWFuZCh7XG4gICAgU2VjcmV0SWQ6IHNlY3JldEFybixcbiAgfSkpO1xuICAvLyBhbmQgcGFyc2UgdGhlIGV4aXN0aW5nIHZhbHVlXG4gIGxldCBwYXJzZWRWYWx1ZTogYW55ID0ge307XG5cbiAgdHJ5IHtcbiAgICBwYXJzZWRWYWx1ZSA9IEpTT04ucGFyc2UoZXhpc3RpbmdTZWNyZXRWYWx1ZS5TZWNyZXRTdHJpbmchKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gdGhlIGV4aXN0aW5nIHZhbHVlIGNvdWxkbid0IGJlIHBhcnNlZCwgaXQgd2FzIHByb2JhYmx5IGEgcmFuZG9tIHN0cmluZy5cbiAgICAvLyBsZXQncyBnbyBhaGVhZCBhbmQganVzdCBzdGFydCBmcmVzaCB0aGVuLFxuICB9XG5cbiAgLy8gbm93IGxldCdzIGNoZWNrIHdoYXQgcHJvcGVydGllcyBoYXZlIGNoYW5nZWRcbiAgY29uc3QgbmV3U2VjcmV0U3RyaW5nVGVtcGxhdGUgPSBKU09OLnBhcnNlKGdlbmVyYXRlU2VjcmV0U3RyaW5nLnNlY3JldFN0cmluZ1RlbXBsYXRlKTtcbiAgY29uc3Qgb2xkU2VjcmV0U3RyaW5nVGVtcGxhdGUgPSBKU09OLnBhcnNlKG9sZEdlbmVyYXRlU2VjcmV0U3RyaW5nLnNlY3JldFN0cmluZ1RlbXBsYXRlKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gbmV3U2VjcmV0U3RyaW5nVGVtcGxhdGUpIHtcbiAgICBpZiAob2xkU2VjcmV0U3RyaW5nVGVtcGxhdGVba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBvaywgc28gaGVyZSdzIHNvbWV0aGluZyB0byBhZGQuLi5cbiAgICAgIHBhcnNlZFZhbHVlW2tleV0gPSBuZXdTZWNyZXRTdHJpbmdUZW1wbGF0ZVtrZXldO1xuICAgIH1cbiAgICBpZiAob2xkU2VjcmV0U3RyaW5nVGVtcGxhdGVba2V5XSAhPT0gbmV3U2VjcmV0U3RyaW5nVGVtcGxhdGVba2V5XSkge1xuICAgICAgLy8gb2ssIHNvIGhlcmUncyBzb21ldGhpbmcgdG8gdXBkYXRlLi4uXG4gICAgICBwYXJzZWRWYWx1ZVtrZXldID0gbmV3U2VjcmV0U3RyaW5nVGVtcGxhdGVba2V5XTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gb2xkU2VjcmV0U3RyaW5nVGVtcGxhdGUpIHtcbiAgICBpZiAobmV3U2VjcmV0U3RyaW5nVGVtcGxhdGVba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBvaywgc28gaGVyZSdzIHNvbWV0aGluZyB0byByZW1vdmUuLi5cbiAgICAgIGRlbGV0ZSBwYXJzZWRWYWx1ZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRpZCBhbnl0aGluZyBhcm91bmQgdGhlIEdlbmVyYXRlU3RyaW5nS2V5IGNoYW5nZT9cbiAgaWYgKGRpZFJhbmRvbVByb3BlcnRpZXNDaGFuZ2Uob2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcsIGdlbmVyYXRlU2VjcmV0U3RyaW5nKVxuICAgIHx8IGdlbmVyYXRlU2VjcmV0U3RyaW5nLmdlbmVyYXRlU3RyaW5nS2V5ICE9PSBvbGRHZW5lcmF0ZVNlY3JldFN0cmluZy5nZW5lcmF0ZVN0cmluZ0tleSkge1xuICAgIGNvbnN0IHsgUmFuZG9tUGFzc3dvcmQ6IG5ld1JhbmRvbVZhbHVlIH0gPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgR2V0UmFuZG9tUGFzc3dvcmRDb21tYW5kKHtcbiAgICAgIEV4Y2x1ZGVMb3dlcmNhc2U6IGdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVMb3dlcmNhc2UgPT09ICd0cnVlJyxcbiAgICAgIEV4Y2x1ZGVOdW1iZXJzOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlTnVtYmVycyA9PT0gJ3RydWUnLFxuICAgICAgRXhjbHVkZVB1bmN0dWF0aW9uOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlUHVuY3R1YXRpb24gPT09ICd0cnVlJyxcbiAgICAgIEV4Y2x1ZGVVcHBlcmNhc2U6IGdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVVcHBlcmNhc2UgPT09ICd0cnVlJyxcbiAgICAgIEluY2x1ZGVTcGFjZTogZ2VuZXJhdGVTZWNyZXRTdHJpbmcuaW5jbHVkZVNwYWNlID09PSAndHJ1ZScsXG4gICAgICBQYXNzd29yZExlbmd0aDogK2dlbmVyYXRlU2VjcmV0U3RyaW5nLnBhc3N3b3JkTGVuZ3RoLFxuICAgICAgUmVxdWlyZUVhY2hJbmNsdWRlZFR5cGU6IGdlbmVyYXRlU2VjcmV0U3RyaW5nLnJlcXVpcmVFYWNoSW5jbHVkZWRUeXBlID09PSAndHJ1ZScsXG4gICAgfSkpO1xuICAgIHBhcnNlZFZhbHVlW2dlbmVyYXRlU2VjcmV0U3RyaW5nLmdlbmVyYXRlU3RyaW5nS2V5XSA9IG5ld1JhbmRvbVZhbHVlO1xuICB9XG5cbiAgLy8gdXBkYXRlIHRoZSBzZWNyZXQgaW4gQVdTXG4gIGF3YWl0IGNsaWVudC5zZW5kKG5ldyBQdXRTZWNyZXRWYWx1ZUNvbW1hbmQoe1xuICAgIFNlY3JldElkOiBzZWNyZXRBcm4sXG4gICAgU2VjcmV0U3RyaW5nOiBKU09OLnN0cmluZ2lmeShwYXJzZWRWYWx1ZSksXG4gIH0pKTtcblxufVxuYCxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { NodeProject } from 'projen/lib/javascript';
|
|
2
|
+
/**
|
|
3
|
+
* The extension step of `swamp:bootstrap`: a Node script, so it runs the same
|
|
4
|
+
* under projen's PowerShell 5.1 task shell on Windows as under bash/sh, that
|
|
5
|
+
* pulls every extension at the version pinned in the repo's swamp lockfile.
|
|
6
|
+
* Fully generic — no per-repo parameterization.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SoftwareFactoryBootstrap {
|
|
9
|
+
constructor(project: NodeProject);
|
|
10
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SoftwareFactoryBootstrap = void 0;
|
|
4
|
+
const projen_1 = require("projen");
|
|
5
|
+
/**
|
|
6
|
+
* The extension step of `swamp:bootstrap`: a Node script, so it runs the same
|
|
7
|
+
* under projen's PowerShell 5.1 task shell on Windows as under bash/sh, that
|
|
8
|
+
* pulls every extension at the version pinned in the repo's swamp lockfile.
|
|
9
|
+
* Fully generic — no per-repo parameterization.
|
|
10
|
+
*/
|
|
11
|
+
class SoftwareFactoryBootstrap {
|
|
12
|
+
constructor(project) {
|
|
13
|
+
new projen_1.TextFile(project, 'swamp-bootstrap/pull-extensions.ts', {
|
|
14
|
+
marker: true,
|
|
15
|
+
lines: [
|
|
16
|
+
'/**',
|
|
17
|
+
' * Pulls each swamp extension at the version pinned in',
|
|
18
|
+
' * extensions/models/upstream_extensions.json, so a fresh clone runs the',
|
|
19
|
+
' * same extensions as the rest of the team, including any the repo added',
|
|
20
|
+
' * itself. A repo with no lockfile yet pulls DEFAULT_EXTENSIONS at their',
|
|
21
|
+
' * latest stable versions, which creates the lockfile.',
|
|
22
|
+
' *',
|
|
23
|
+
' * A pull rewrites the lockfile even at an identical version, and on Windows',
|
|
24
|
+
' * it writes backslash paths and deletes the committed files it tracks (e.g.',
|
|
25
|
+
' * .claude/skills/software-factory/). So afterwards the lockfile and every',
|
|
26
|
+
' * git-tracked file it lists are restored from git.',
|
|
27
|
+
' */',
|
|
28
|
+
"import { execFileSync } from 'node:child_process';",
|
|
29
|
+
"import { existsSync, readFileSync } from 'node:fs';",
|
|
30
|
+
'',
|
|
31
|
+
"const LOCKFILE = 'extensions/models/upstream_extensions.json';",
|
|
32
|
+
"const DEFAULT_EXTENSIONS = ['@swamp/software-factory', '@webframp/github', '@goodcraft/github'];",
|
|
33
|
+
'',
|
|
34
|
+
'interface LockfileEntry {',
|
|
35
|
+
' version: string;',
|
|
36
|
+
' files?: string[];',
|
|
37
|
+
'}',
|
|
38
|
+
'',
|
|
39
|
+
'function readLockfile(): Record<string, LockfileEntry> | undefined {',
|
|
40
|
+
' if (!existsSync(LOCKFILE)) {',
|
|
41
|
+
' return undefined;',
|
|
42
|
+
' }',
|
|
43
|
+
" return JSON.parse(readFileSync(LOCKFILE, 'utf8')) as Record<string, LockfileEntry>;",
|
|
44
|
+
'}',
|
|
45
|
+
'',
|
|
46
|
+
'function run(command: string, args: string[]): string {',
|
|
47
|
+
" return execFileSync(command, args, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'inherit'] });",
|
|
48
|
+
'}',
|
|
49
|
+
'',
|
|
50
|
+
'function pull(extension: string): void {',
|
|
51
|
+
' console.log(`swamp extension pull ${extension} --force`);',
|
|
52
|
+
" execFileSync('swamp', ['extension', 'pull', extension, '--force'], { stdio: 'inherit' });",
|
|
53
|
+
'}',
|
|
54
|
+
'',
|
|
55
|
+
'function restoreTrackedFiles(lockfile: Record<string, LockfileEntry>): void {',
|
|
56
|
+
' const listed = Object.values(lockfile)',
|
|
57
|
+
' .flatMap((entry) => entry.files ?? [])',
|
|
58
|
+
" .map((file) => file.replace(/\\\\/g, '/'))",
|
|
59
|
+
" .filter((file) => !file.startsWith('.swamp/'));",
|
|
60
|
+
" const tracked = run('git', ['ls-files', '-z', '--', LOCKFILE, ...listed])",
|
|
61
|
+
" .split('\\0')",
|
|
62
|
+
' .filter(Boolean);',
|
|
63
|
+
' if (tracked.length > 0) {',
|
|
64
|
+
" run('git', ['checkout', '--', ...tracked]);",
|
|
65
|
+
' console.log(`Restored ${tracked.length} tracked file(s) from git`);',
|
|
66
|
+
' }',
|
|
67
|
+
'}',
|
|
68
|
+
'',
|
|
69
|
+
'function main(): void {',
|
|
70
|
+
' const lockfile = readLockfile();',
|
|
71
|
+
' if (!lockfile) {',
|
|
72
|
+
' console.log(`No ${LOCKFILE} yet: pulling the latest stable software-factory extensions`);',
|
|
73
|
+
' DEFAULT_EXTENSIONS.forEach(pull);',
|
|
74
|
+
' return;',
|
|
75
|
+
' }',
|
|
76
|
+
'',
|
|
77
|
+
' for (const [name, entry] of Object.entries(lockfile)) {',
|
|
78
|
+
' pull(`${name}@${entry.version}`);',
|
|
79
|
+
' }',
|
|
80
|
+
' restoreTrackedFiles(lockfile);',
|
|
81
|
+
'}',
|
|
82
|
+
'',
|
|
83
|
+
'main();',
|
|
84
|
+
],
|
|
85
|
+
});
|
|
86
|
+
new projen_1.JsonFile(project, 'swamp-bootstrap/tsconfig.json', {
|
|
87
|
+
marker: false,
|
|
88
|
+
obj: {
|
|
89
|
+
extends: '../tsconfig.json',
|
|
90
|
+
compilerOptions: {
|
|
91
|
+
noEmit: true,
|
|
92
|
+
rootDir: '.',
|
|
93
|
+
},
|
|
94
|
+
include: ['*.ts'],
|
|
95
|
+
exclude: ['node_modules'],
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.SoftwareFactoryBootstrap = SoftwareFactoryBootstrap;
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdHdhcmVGYWN0b3J5Qm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NvZnR3YXJlRmFjdG9yeUJvb3RzdHJhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBNEM7QUFHNUM7Ozs7O0dBS0c7QUFDSCxNQUFhLHdCQUF3QjtJQUNuQyxZQUFZLE9BQW9CO1FBQzlCLElBQUksaUJBQVEsQ0FBQyxPQUFPLEVBQUUsb0NBQW9DLEVBQUU7WUFDMUQsTUFBTSxFQUFFLElBQUk7WUFDWixLQUFLLEVBQUU7Z0JBQ0wsS0FBSztnQkFDTCx3REFBd0Q7Z0JBQ3hELDBFQUEwRTtnQkFDMUUsMEVBQTBFO2dCQUMxRSwwRUFBMEU7Z0JBQzFFLHdEQUF3RDtnQkFDeEQsSUFBSTtnQkFDSiw4RUFBOEU7Z0JBQzlFLDhFQUE4RTtnQkFDOUUsNEVBQTRFO2dCQUM1RSxxREFBcUQ7Z0JBQ3JELEtBQUs7Z0JBQ0wsb0RBQW9EO2dCQUNwRCxxREFBcUQ7Z0JBQ3JELEVBQUU7Z0JBQ0YsZ0VBQWdFO2dCQUNoRSxrR0FBa0c7Z0JBQ2xHLEVBQUU7Z0JBQ0YsMkJBQTJCO2dCQUMzQixvQkFBb0I7Z0JBQ3BCLHFCQUFxQjtnQkFDckIsR0FBRztnQkFDSCxFQUFFO2dCQUNGLHNFQUFzRTtnQkFDdEUsZ0NBQWdDO2dCQUNoQyx1QkFBdUI7Z0JBQ3ZCLEtBQUs7Z0JBQ0wsdUZBQXVGO2dCQUN2RixHQUFHO2dCQUNILEVBQUU7Z0JBQ0YseURBQXlEO2dCQUN6RCxtR0FBbUc7Z0JBQ25HLEdBQUc7Z0JBQ0gsRUFBRTtnQkFDRiwwQ0FBMEM7Z0JBQzFDLDZEQUE2RDtnQkFDN0QsNkZBQTZGO2dCQUM3RixHQUFHO2dCQUNILEVBQUU7Z0JBQ0YsK0VBQStFO2dCQUMvRSwwQ0FBMEM7Z0JBQzFDLDRDQUE0QztnQkFDNUMsZ0RBQWdEO2dCQUNoRCxxREFBcUQ7Z0JBQ3JELDZFQUE2RTtnQkFDN0UsbUJBQW1CO2dCQUNuQix1QkFBdUI7Z0JBQ3ZCLDZCQUE2QjtnQkFDN0IsaURBQWlEO2dCQUNqRCx5RUFBeUU7Z0JBQ3pFLEtBQUs7Z0JBQ0wsR0FBRztnQkFDSCxFQUFFO2dCQUNGLHlCQUF5QjtnQkFDekIsb0NBQW9DO2dCQUNwQyxvQkFBb0I7Z0JBQ3BCLCtGQUErRjtnQkFDL0YsdUNBQXVDO2dCQUN2QyxhQUFhO2dCQUNiLEtBQUs7Z0JBQ0wsRUFBRTtnQkFDRiwyREFBMkQ7Z0JBQzNELHVDQUF1QztnQkFDdkMsS0FBSztnQkFDTCxrQ0FBa0M7Z0JBQ2xDLEdBQUc7Z0JBQ0gsRUFBRTtnQkFDRixTQUFTO2FBQ1Y7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLGlCQUFRLENBQUMsT0FBTyxFQUFFLCtCQUErQixFQUFFO1lBQ3JELE1BQU0sRUFBRSxLQUFLO1lBQ2IsR0FBRyxFQUFFO2dCQUNILE9BQU8sRUFBRSxrQkFBa0I7Z0JBQzNCLGVBQWUsRUFBRTtvQkFDZixNQUFNLEVBQUUsSUFBSTtvQkFDWixPQUFPLEVBQUUsR0FBRztpQkFDYjtnQkFDRCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2pCLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUMxQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXpGRCw0REF5RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKc29uRmlsZSwgVGV4dEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgTm9kZVByb2plY3QgfSBmcm9tICdwcm9qZW4vbGliL2phdmFzY3JpcHQnO1xuXG4vKipcbiAqIFRoZSBleHRlbnNpb24gc3RlcCBvZiBgc3dhbXA6Ym9vdHN0cmFwYDogYSBOb2RlIHNjcmlwdCwgc28gaXQgcnVucyB0aGUgc2FtZVxuICogdW5kZXIgcHJvamVuJ3MgUG93ZXJTaGVsbCA1LjEgdGFzayBzaGVsbCBvbiBXaW5kb3dzIGFzIHVuZGVyIGJhc2gvc2gsIHRoYXRcbiAqIHB1bGxzIGV2ZXJ5IGV4dGVuc2lvbiBhdCB0aGUgdmVyc2lvbiBwaW5uZWQgaW4gdGhlIHJlcG8ncyBzd2FtcCBsb2NrZmlsZS5cbiAqIEZ1bGx5IGdlbmVyaWMg4oCUIG5vIHBlci1yZXBvIHBhcmFtZXRlcml6YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2Z0d2FyZUZhY3RvcnlCb290c3RyYXAge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBOb2RlUHJvamVjdCkge1xuICAgIG5ldyBUZXh0RmlsZShwcm9qZWN0LCAnc3dhbXAtYm9vdHN0cmFwL3B1bGwtZXh0ZW5zaW9ucy50cycsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgICcvKionLFxuICAgICAgICAnICogUHVsbHMgZWFjaCBzd2FtcCBleHRlbnNpb24gYXQgdGhlIHZlcnNpb24gcGlubmVkIGluJyxcbiAgICAgICAgJyAqIGV4dGVuc2lvbnMvbW9kZWxzL3Vwc3RyZWFtX2V4dGVuc2lvbnMuanNvbiwgc28gYSBmcmVzaCBjbG9uZSBydW5zIHRoZScsXG4gICAgICAgICcgKiBzYW1lIGV4dGVuc2lvbnMgYXMgdGhlIHJlc3Qgb2YgdGhlIHRlYW0sIGluY2x1ZGluZyBhbnkgdGhlIHJlcG8gYWRkZWQnLFxuICAgICAgICAnICogaXRzZWxmLiBBIHJlcG8gd2l0aCBubyBsb2NrZmlsZSB5ZXQgcHVsbHMgREVGQVVMVF9FWFRFTlNJT05TIGF0IHRoZWlyJyxcbiAgICAgICAgJyAqIGxhdGVzdCBzdGFibGUgdmVyc2lvbnMsIHdoaWNoIGNyZWF0ZXMgdGhlIGxvY2tmaWxlLicsXG4gICAgICAgICcgKicsXG4gICAgICAgICcgKiBBIHB1bGwgcmV3cml0ZXMgdGhlIGxvY2tmaWxlIGV2ZW4gYXQgYW4gaWRlbnRpY2FsIHZlcnNpb24sIGFuZCBvbiBXaW5kb3dzJyxcbiAgICAgICAgJyAqIGl0IHdyaXRlcyBiYWNrc2xhc2ggcGF0aHMgYW5kIGRlbGV0ZXMgdGhlIGNvbW1pdHRlZCBmaWxlcyBpdCB0cmFja3MgKGUuZy4nLFxuICAgICAgICAnICogLmNsYXVkZS9za2lsbHMvc29mdHdhcmUtZmFjdG9yeS8pLiBTbyBhZnRlcndhcmRzIHRoZSBsb2NrZmlsZSBhbmQgZXZlcnknLFxuICAgICAgICAnICogZ2l0LXRyYWNrZWQgZmlsZSBpdCBsaXN0cyBhcmUgcmVzdG9yZWQgZnJvbSBnaXQuJyxcbiAgICAgICAgJyAqLycsXG4gICAgICAgIFwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcIixcbiAgICAgICAgXCJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tICdub2RlOmZzJztcIixcbiAgICAgICAgJycsXG4gICAgICAgIFwiY29uc3QgTE9DS0ZJTEUgPSAnZXh0ZW5zaW9ucy9tb2RlbHMvdXBzdHJlYW1fZXh0ZW5zaW9ucy5qc29uJztcIixcbiAgICAgICAgXCJjb25zdCBERUZBVUxUX0VYVEVOU0lPTlMgPSBbJ0Bzd2FtcC9zb2Z0d2FyZS1mYWN0b3J5JywgJ0B3ZWJmcmFtcC9naXRodWInLCAnQGdvb2RjcmFmdC9naXRodWInXTtcIixcbiAgICAgICAgJycsXG4gICAgICAgICdpbnRlcmZhY2UgTG9ja2ZpbGVFbnRyeSB7JyxcbiAgICAgICAgJyAgdmVyc2lvbjogc3RyaW5nOycsXG4gICAgICAgICcgIGZpbGVzPzogc3RyaW5nW107JyxcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2Z1bmN0aW9uIHJlYWRMb2NrZmlsZSgpOiBSZWNvcmQ8c3RyaW5nLCBMb2NrZmlsZUVudHJ5PiB8IHVuZGVmaW5lZCB7JyxcbiAgICAgICAgJyAgaWYgKCFleGlzdHNTeW5jKExPQ0tGSUxFKSkgeycsXG4gICAgICAgICcgICAgcmV0dXJuIHVuZGVmaW5lZDsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgXCIgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhMT0NLRklMRSwgJ3V0ZjgnKSkgYXMgUmVjb3JkPHN0cmluZywgTG9ja2ZpbGVFbnRyeT47XCIsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICdmdW5jdGlvbiBydW4oY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7JyxcbiAgICAgICAgXCIgIHJldHVybiBleGVjRmlsZVN5bmMoY29tbWFuZCwgYXJncywgeyBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpbmhlcml0J10gfSk7XCIsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICdmdW5jdGlvbiBwdWxsKGV4dGVuc2lvbjogc3RyaW5nKTogdm9pZCB7JyxcbiAgICAgICAgJyAgY29uc29sZS5sb2coYHN3YW1wIGV4dGVuc2lvbiBwdWxsICR7ZXh0ZW5zaW9ufSAtLWZvcmNlYCk7JyxcbiAgICAgICAgXCIgIGV4ZWNGaWxlU3luYygnc3dhbXAnLCBbJ2V4dGVuc2lvbicsICdwdWxsJywgZXh0ZW5zaW9uLCAnLS1mb3JjZSddLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XCIsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICdmdW5jdGlvbiByZXN0b3JlVHJhY2tlZEZpbGVzKGxvY2tmaWxlOiBSZWNvcmQ8c3RyaW5nLCBMb2NrZmlsZUVudHJ5Pik6IHZvaWQgeycsXG4gICAgICAgICcgIGNvbnN0IGxpc3RlZCA9IE9iamVjdC52YWx1ZXMobG9ja2ZpbGUpJyxcbiAgICAgICAgJyAgICAuZmxhdE1hcCgoZW50cnkpID0+IGVudHJ5LmZpbGVzID8/IFtdKScsXG4gICAgICAgIFwiICAgIC5tYXAoKGZpbGUpID0+IGZpbGUucmVwbGFjZSgvXFxcXFxcXFwvZywgJy8nKSlcIixcbiAgICAgICAgXCIgICAgLmZpbHRlcigoZmlsZSkgPT4gIWZpbGUuc3RhcnRzV2l0aCgnLnN3YW1wLycpKTtcIixcbiAgICAgICAgXCIgIGNvbnN0IHRyYWNrZWQgPSBydW4oJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLXonLCAnLS0nLCBMT0NLRklMRSwgLi4ubGlzdGVkXSlcIixcbiAgICAgICAgXCIgICAgLnNwbGl0KCdcXFxcMCcpXCIsXG4gICAgICAgICcgICAgLmZpbHRlcihCb29sZWFuKTsnLFxuICAgICAgICAnICBpZiAodHJhY2tlZC5sZW5ndGggPiAwKSB7JyxcbiAgICAgICAgXCIgICAgcnVuKCdnaXQnLCBbJ2NoZWNrb3V0JywgJy0tJywgLi4udHJhY2tlZF0pO1wiLFxuICAgICAgICAnICAgIGNvbnNvbGUubG9nKGBSZXN0b3JlZCAke3RyYWNrZWQubGVuZ3RofSB0cmFja2VkIGZpbGUocykgZnJvbSBnaXRgKTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2Z1bmN0aW9uIG1haW4oKTogdm9pZCB7JyxcbiAgICAgICAgJyAgY29uc3QgbG9ja2ZpbGUgPSByZWFkTG9ja2ZpbGUoKTsnLFxuICAgICAgICAnICBpZiAoIWxvY2tmaWxlKSB7JyxcbiAgICAgICAgJyAgICBjb25zb2xlLmxvZyhgTm8gJHtMT0NLRklMRX0geWV0OiBwdWxsaW5nIHRoZSBsYXRlc3Qgc3RhYmxlIHNvZnR3YXJlLWZhY3RvcnkgZXh0ZW5zaW9uc2ApOycsXG4gICAgICAgICcgICAgREVGQVVMVF9FWFRFTlNJT05TLmZvckVhY2gocHVsbCk7JyxcbiAgICAgICAgJyAgICByZXR1cm47JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMobG9ja2ZpbGUpKSB7JyxcbiAgICAgICAgJyAgICBwdWxsKGAke25hbWV9QCR7ZW50cnkudmVyc2lvbn1gKTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJyAgcmVzdG9yZVRyYWNrZWRGaWxlcyhsb2NrZmlsZSk7JyxcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJ21haW4oKTsnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIG5ldyBKc29uRmlsZShwcm9qZWN0LCAnc3dhbXAtYm9vdHN0cmFwL3RzY29uZmlnLmpzb24nLCB7XG4gICAgICBtYXJrZXI6IGZhbHNlLFxuICAgICAgb2JqOiB7XG4gICAgICAgIGV4dGVuZHM6ICcuLi90c2NvbmZpZy5qc29uJyxcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgbm9FbWl0OiB0cnVlLFxuICAgICAgICAgIHJvb3REaXI6ICcuJyxcbiAgICAgICAgfSxcbiAgICAgICAgaW5jbHVkZTogWycqLnRzJ10sXG4gICAgICAgIGV4Y2x1ZGU6IFsnbm9kZV9tb2R1bGVzJ10sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -39,11 +39,13 @@ export interface SoftwareFactoryFilesOptions {
|
|
|
39
39
|
* the repo is already initialized), so it's wired into the project's
|
|
40
40
|
* `install`/`install:ci` tasks and runs automatically on every install,
|
|
41
41
|
* guarded so it's a silent no-op on a machine without `swamp` on PATH (e.g.
|
|
42
|
-
* CI). The extension pulls
|
|
42
|
+
* CI). The extension pulls (at the versions pinned in the repo's
|
|
43
|
+
* `extensions/models/upstream_extensions.json`) and vault creation are one-time, not idempotent
|
|
43
44
|
* in a way that's safe to repeat on every install, so they stay in the
|
|
44
45
|
* `swamp:bootstrap` task this construct adds. Only exman's own authored
|
|
45
46
|
* config (the factory's state machine, the architecture-rule engine, the
|
|
46
|
-
* attestation mechanism, the OpenSpec task-completion gate,
|
|
47
|
+
* attestation mechanism, the OpenSpec task-completion gate, the lockfile-driven
|
|
48
|
+
* extension pull, and the 3 swamp
|
|
47
49
|
* workflows that wire them together) is templated.
|
|
48
50
|
*/
|
|
49
51
|
export declare class SoftwareFactoryFiles {
|
|
@@ -4,6 +4,7 @@ exports.SoftwareFactoryFiles = void 0;
|
|
|
4
4
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
5
5
|
const SoftwareFactoryArchitectureRules_1 = require("./SoftwareFactoryArchitectureRules");
|
|
6
6
|
const SoftwareFactoryAttestation_1 = require("./SoftwareFactoryAttestation");
|
|
7
|
+
const SoftwareFactoryBootstrap_1 = require("./SoftwareFactoryBootstrap");
|
|
7
8
|
const SoftwareFactoryModels_1 = require("./SoftwareFactoryModels");
|
|
8
9
|
const SoftwareFactoryOpenSpecGates_1 = require("./SoftwareFactoryOpenSpecGates");
|
|
9
10
|
const SoftwareFactoryWorkflows_1 = require("./SoftwareFactoryWorkflows");
|
|
@@ -23,15 +24,17 @@ const DEFAULT_GITHUB_OWNER = 'macedon-technologies';
|
|
|
23
24
|
* the repo is already initialized), so it's wired into the project's
|
|
24
25
|
* `install`/`install:ci` tasks and runs automatically on every install,
|
|
25
26
|
* guarded so it's a silent no-op on a machine without `swamp` on PATH (e.g.
|
|
26
|
-
* CI). The extension pulls
|
|
27
|
+
* CI). The extension pulls (at the versions pinned in the repo's
|
|
28
|
+
* `extensions/models/upstream_extensions.json`) and vault creation are one-time, not idempotent
|
|
27
29
|
* in a way that's safe to repeat on every install, so they stay in the
|
|
28
30
|
* `swamp:bootstrap` task this construct adds. Only exman's own authored
|
|
29
31
|
* config (the factory's state machine, the architecture-rule engine, the
|
|
30
|
-
* attestation mechanism, the OpenSpec task-completion gate,
|
|
32
|
+
* attestation mechanism, the OpenSpec task-completion gate, the lockfile-driven
|
|
33
|
+
* extension pull, and the 3 swamp
|
|
31
34
|
* workflows that wire them together) is templated.
|
|
32
35
|
*/
|
|
33
36
|
class SoftwareFactoryFiles {
|
|
34
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.SoftwareFactoryFiles", version: "1.
|
|
37
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.SoftwareFactoryFiles", version: "1.28.0" };
|
|
35
38
|
constructor(project, options) {
|
|
36
39
|
const { repoName, actionVersions } = options;
|
|
37
40
|
const githubOwner = options.githubOwner || DEFAULT_GITHUB_OWNER;
|
|
@@ -51,6 +54,7 @@ class SoftwareFactoryFiles {
|
|
|
51
54
|
new SoftwareFactoryAttestation_1.SoftwareFactoryAttestation(project, { repoName });
|
|
52
55
|
new SoftwareFactoryOpenSpecGates_1.SoftwareFactoryOpenSpecGates(project);
|
|
53
56
|
new SoftwareFactoryWorkflows_1.SoftwareFactoryWorkflows(project, { repoName, actionVersions });
|
|
57
|
+
new SoftwareFactoryBootstrap_1.SoftwareFactoryBootstrap(project);
|
|
54
58
|
project.addTask('validate:architecture', {
|
|
55
59
|
description: 'Run the architecture rule registry (architecture-rules/rules.json) against the repo',
|
|
56
60
|
exec: 'ts-node --project architecture-rules/tsconfig.json architecture-rules/check.ts',
|
|
@@ -70,11 +74,9 @@ class SoftwareFactoryFiles {
|
|
|
70
74
|
receiveArgs: true,
|
|
71
75
|
});
|
|
72
76
|
project.addTask('swamp:bootstrap', {
|
|
73
|
-
description: 'One-time setup: pull the
|
|
77
|
+
description: 'One-time setup: pull the swamp extensions at the versions pinned in extensions/models/upstream_extensions.json and create the secrets vault (swamp init itself already runs on every install)',
|
|
74
78
|
steps: [
|
|
75
|
-
{ exec: '
|
|
76
|
-
{ exec: 'swamp extension pull @webframp/github' },
|
|
77
|
-
{ exec: 'swamp extension pull @goodcraft/github' },
|
|
79
|
+
{ exec: 'ts-node --project swamp-bootstrap/tsconfig.json swamp-bootstrap/pull-extensions.ts' },
|
|
78
80
|
{ exec: `swamp vault create local_encryption ${secretsVault}` },
|
|
79
81
|
{
|
|
80
82
|
exec: `echo "Next: swamp vault put ${secretsVault} GITHUB_TOKEN --refresh-from 'gh auth token'"`,
|
|
@@ -100,4 +102,4 @@ class SoftwareFactoryFiles {
|
|
|
100
102
|
}
|
|
101
103
|
}
|
|
102
104
|
exports.SoftwareFactoryFiles = SoftwareFactoryFiles;
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdHdhcmVGYWN0b3J5RmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU29mdHdhcmVGYWN0b3J5RmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLHlGQUFzRjtBQUN0Riw2RUFBMEU7QUFDMUUsbUVBQWdFO0FBQ2hFLGlGQUE4RTtBQUM5RSx5RUFBc0U7QUFHdEUsTUFBTSxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQztBQThCcEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQWEsb0JBQW9COztJQUMvQixZQUFZLE9BQW9CLEVBQUUsT0FBb0M7UUFDcEUsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0MsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxvQkFBb0IsQ0FBQztRQUNoRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztRQUNoRCxNQUFNLFlBQVksR0FBRyxHQUFHLFFBQVEsVUFBVSxDQUFDO1FBQzNDLHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsdUVBQXVFO1FBQ3ZFLHlFQUF5RTtRQUN6RSxNQUFNLGFBQWEsR0FBRyxpRUFBaUUsQ0FBQztRQUV4RixJQUFJLDZDQUFxQixDQUFDLE9BQU8sRUFBRTtZQUNqQyxRQUFRO1lBQ1IsV0FBVztZQUNYLFVBQVU7U0FDWCxDQUFDLENBQUM7UUFFSCxJQUFJLG1FQUFnQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlDLElBQUksdURBQTBCLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV0RCxJQUFJLDJEQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFDLElBQUksbURBQXdCLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFFcEUsT0FBTyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRTtZQUN2QyxXQUFXLEVBQUUscUZBQXFGO1lBQ2xHLElBQUksRUFBRSxnRkFBZ0Y7U0FDdkYsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsRUFBRTtZQUMvQyxXQUFXLEVBQUUsMkZBQTJGO1lBQ3hHLElBQUksRUFBRSx1RkFBdUY7WUFDN0YsV0FBVyxFQUFFLElBQUk7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRTtZQUN0QyxXQUFXLEVBQUUsd0dBQXdHO1lBQ3JILElBQUksRUFBRSxxRUFBcUU7U0FDNUUsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRTtZQUNwQyxXQUFXLEVBQUUseUhBQXlIO1lBQ3RJLElBQUksRUFBRSxtRUFBbUU7WUFDekUsV0FBVyxFQUFFLElBQUk7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtZQUNqQyxXQUFXLEVBQUUsNElBQTRJO1lBQ3pKLEtBQUssRUFBRTtnQkFDTCxFQUFFLElBQUksRUFBRSw4Q0FBOEMsRUFBRTtnQkFDeEQsRUFBRSxJQUFJLEVBQUUsdUNBQXVDLEVBQUU7Z0JBQ2pELEVBQUUsSUFBSSxFQUFFLHdDQUF3QyxFQUFFO2dCQUNsRCxFQUFFLElBQUksRUFBRSx1Q0FBdUMsWUFBWSxFQUFFLEVBQUU7Z0JBQy9EO29CQUNFLElBQUksRUFBRSwrQkFBK0IsWUFBWSwrQ0FBK0M7aUJBQ2pHO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCx3RUFBd0U7UUFDeEUsd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWxELHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLG1FQUFtRTtRQUNuRSxvREFBb0Q7UUFDcEQsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNwRCxPQUFPLENBQUMsWUFBWSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLFlBQVksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7O0FBOUVILG9EQStFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vZGVQcm9qZWN0IH0gZnJvbSAncHJvamVuL2xpYi9qYXZhc2NyaXB0JztcbmltcG9ydCB7IFNvZnR3YXJlRmFjdG9yeUFyY2hpdGVjdHVyZVJ1bGVzIH0gZnJvbSAnLi9Tb2Z0d2FyZUZhY3RvcnlBcmNoaXRlY3R1cmVSdWxlcyc7XG5pbXBvcnQgeyBTb2Z0d2FyZUZhY3RvcnlBdHRlc3RhdGlvbiB9IGZyb20gJy4vU29mdHdhcmVGYWN0b3J5QXR0ZXN0YXRpb24nO1xuaW1wb3J0IHsgU29mdHdhcmVGYWN0b3J5TW9kZWxzIH0gZnJvbSAnLi9Tb2Z0d2FyZUZhY3RvcnlNb2RlbHMnO1xuaW1wb3J0IHsgU29mdHdhcmVGYWN0b3J5T3BlblNwZWNHYXRlcyB9IGZyb20gJy4vU29mdHdhcmVGYWN0b3J5T3BlblNwZWNHYXRlcyc7XG5pbXBvcnQgeyBTb2Z0d2FyZUZhY3RvcnlXb3JrZmxvd3MgfSBmcm9tICcuL1NvZnR3YXJlRmFjdG9yeVdvcmtmbG93cyc7XG5pbXBvcnQgeyBXb3JrZmxvd0FjdGlvblZlcnNpb25zIH0gZnJvbSAnLi9Xb3JrZmxvd0FjdGlvblZlcnNpb25zJztcblxuY29uc3QgREVGQVVMVF9HSVRIVUJfT1dORVIgPSAnbWFjZWRvbi10ZWNobm9sb2dpZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvZnR3YXJlRmFjdG9yeUZpbGVzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYmFyZSByZXBvIG5hbWUgKGUuZy4gYGV4cGVuc2UtdHJhY2tlcmApLCB1c2VkIHRvIGRlcml2ZSB0aGUgZmFjdG9yeSdzXG4gICAqIG1vZGVsIG5hbWVzIChgPHJlcG9OYW1lPi1mYWN0b3J5YCwgYDxyZXBvTmFtZT4taXNzdWVzYCwgYDxyZXBvTmFtZT4tcHJgLFxuICAgKiBgPHJlcG9OYW1lPi1zaGVsbCpgKSBhbmQgdmF1bHQgbmFtZSAoYDxyZXBvTmFtZT4tc2VjcmV0c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEdpdEh1YiBvcmcvdXNlciB0aGUgcmVwbyBsaXZlcyBpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgJ21hY2Vkb24tdGVjaG5vbG9naWVzJ1xuICAgKi9cbiAgcmVhZG9ubHkgZ2l0aHViT3duZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBicmFuY2ggdGhlIGZhY3Rvcnkgb3BlbnMgcHVsbCByZXF1ZXN0cyBhZ2FpbnN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAnbWFpbidcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VCcmFuY2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyBmb3IgdGhlIHBpbm5lZCBhY3Rpb24gdmVyc2lvbnMgdXNlZCBieSBgdmVyaWZ5LWF0dGVzdGF0aW9uLnltbGAuXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25WZXJzaW9ucz86IFdvcmtmbG93QWN0aW9uVmVyc2lvbnM7XG59XG5cbi8qKlxuICogQmFja3BvcnRzIGV4bWFuJ3Mgc3dhbXAgXCJzb2Z0d2FyZSBmYWN0b3J5XCIgcGF0dGVyblxuICogKG1hY2Vkb24tdGVjaG5vbG9naWVzL2V4bWFuIzEzKSBhcyBnZW5lcmF0ZWQgc2NhZmZvbGRpbmc6IGFcbiAqIGBAc3dhbXAvc29mdHdhcmUtZmFjdG9yeWAgc3RhdGUgbWFjaGluZSB0aGF0IGRyaXZlcyBhIEdpdEh1YiBpc3N1ZSBmcm9tXG4gKiBpbnRha2UgdGhyb3VnaCBhbiBvcGVuZWQgUFIsIGVuZm9yY2luZyBPcGVuU3BlYyB1c2FnZSwgYW4gYXJjaGl0ZWN0dXJlXG4gKiBydWxlIHJlZ2lzdHJ5LCBhbmQgYSBwcmUtUFIgdmVyaWZpY2F0aW9uIGdhdGUgd2hvc2UgYXR0ZXN0YXRpb24gaXNcbiAqIHJlLWNoZWNrZWQgYXQgbWVyZ2UgdGltZS5cbiAqXG4gKiBXaGF0IHN3YW1wIGl0c2VsZiB3b3VsZCBnZW5lcmF0ZSAoZXh0ZW5zaW9uIGRvY3MgcHVsbGVkIHZpYVxuICogYHN3YW1wIGV4dGVuc2lvbiBwdWxsYCwgYC5zd2FtcC55YW1sYCwgdGhlIHZhdWx0LCBhbmQgdGhlIFwic3dhbXAgbWFuYWdlZFxuICogc2VjdGlvblwiIGluIENMQVVERS5tZCkgaXMgZGVsaWJlcmF0ZWx5IE5PVCBoYW5kLXRlbXBsYXRlZCBoZXJlIOKAlCB0aG9zZSBhcmVcbiAqIHByb2R1Y2VkIGJ5IHRoZSByZWFsIGBzd2FtcGAgQ0xJLiBgc3dhbXAgaW5pdGAgaXMgaWRlbXBvdGVudCAoYSBuby1vcCBpZlxuICogdGhlIHJlcG8gaXMgYWxyZWFkeSBpbml0aWFsaXplZCksIHNvIGl0J3Mgd2lyZWQgaW50byB0aGUgcHJvamVjdCdzXG4gKiBgaW5zdGFsbGAvYGluc3RhbGw6Y2lgIHRhc2tzIGFuZCBydW5zIGF1dG9tYXRpY2FsbHkgb24gZXZlcnkgaW5zdGFsbCxcbiAqIGd1YXJkZWQgc28gaXQncyBhIHNpbGVudCBuby1vcCBvbiBhIG1hY2hpbmUgd2l0aG91dCBgc3dhbXBgIG9uIFBBVEggKGUuZy5cbiAqIENJKS4gVGhlIGV4dGVuc2lvbiBwdWxscyBhbmQgdmF1bHQgY3JlYXRpb24gYXJlIG9uZS10aW1lLCBub3QgaWRlbXBvdGVudFxuICogaW4gYSB3YXkgdGhhdCdzIHNhZmUgdG8gcmVwZWF0IG9uIGV2ZXJ5IGluc3RhbGwsIHNvIHRoZXkgc3RheSBpbiB0aGVcbiAqIGBzd2FtcDpib290c3RyYXBgIHRhc2sgdGhpcyBjb25zdHJ1Y3QgYWRkcy4gT25seSBleG1hbidzIG93biBhdXRob3JlZFxuICogY29uZmlnICh0aGUgZmFjdG9yeSdzIHN0YXRlIG1hY2hpbmUsIHRoZSBhcmNoaXRlY3R1cmUtcnVsZSBlbmdpbmUsIHRoZVxuICogYXR0ZXN0YXRpb24gbWVjaGFuaXNtLCB0aGUgT3BlblNwZWMgdGFzay1jb21wbGV0aW9uIGdhdGUsIGFuZCB0aGUgMyBzd2FtcFxuICogd29ya2Zsb3dzIHRoYXQgd2lyZSB0aGVtIHRvZ2V0aGVyKSBpcyB0ZW1wbGF0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2Z0d2FyZUZhY3RvcnlGaWxlcyB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IE5vZGVQcm9qZWN0LCBvcHRpb25zOiBTb2Z0d2FyZUZhY3RvcnlGaWxlc09wdGlvbnMpIHtcbiAgICBjb25zdCB7IHJlcG9OYW1lLCBhY3Rpb25WZXJzaW9ucyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBnaXRodWJPd25lciA9IG9wdGlvbnMuZ2l0aHViT3duZXIgfHwgREVGQVVMVF9HSVRIVUJfT1dORVI7XG4gICAgY29uc3QgYmFzZUJyYW5jaCA9IG9wdGlvbnMuYmFzZUJyYW5jaCB8fCAnbWFpbic7XG4gICAgY29uc3Qgc2VjcmV0c1ZhdWx0ID0gYCR7cmVwb05hbWV9LXNlY3JldHNgO1xuICAgIC8vIEEgc2luZ2xlIHJlZGlyZWN0IG9ubHk6IHByb2plbidzIGJ1aWx0LWluIGNyb3NzLXBsYXRmb3JtIHRhc2sgc2hlbGxcbiAgICAvLyAoZGF4KSByZWplY3RzIGEgY29tbWFuZCB3aXRoIG1vcmUgdGhhbiBvbmUgcmVkaXJlY3QgKGUuZy4gY29tYmluaW5nXG4gICAgLy8gYD4vZGV2L251bGxgIHdpdGggYDI+JjFgKSB3aXRoIFwiTXVsdGlwbGUgcmVkaXJlY3RzIGFyZSBjdXJyZW50bHkgbm90XG4gICAgLy8gc3VwcG9ydGVkXCIg4oCUIGNvbmZpcm1lZCBieSBkb2dmb29kaW5nIHRoaXMgY29uc3RydWN0IG9uIHRoaXMgdmVyeSByZXBvLlxuICAgIGNvbnN0IHN3YW1wSW5pdFN0ZXAgPSAnY29tbWFuZCAtdiBzd2FtcCA+L2Rldi9udWxsICYmIHN3YW1wIGluaXQgLS10b29sIGNsYXVkZSB8fCB0cnVlJztcblxuICAgIG5ldyBTb2Z0d2FyZUZhY3RvcnlNb2RlbHMocHJvamVjdCwge1xuICAgICAgcmVwb05hbWUsXG4gICAgICBnaXRodWJPd25lcixcbiAgICAgIGJhc2VCcmFuY2gsXG4gICAgfSk7XG5cbiAgICBuZXcgU29mdHdhcmVGYWN0b3J5QXJjaGl0ZWN0dXJlUnVsZXMocHJvamVjdCk7XG5cbiAgICBuZXcgU29mdHdhcmVGYWN0b3J5QXR0ZXN0YXRpb24ocHJvamVjdCwgeyByZXBvTmFtZSB9KTtcblxuICAgIG5ldyBTb2Z0d2FyZUZhY3RvcnlPcGVuU3BlY0dhdGVzKHByb2plY3QpO1xuXG4gICAgbmV3IFNvZnR3YXJlRmFjdG9yeVdvcmtmbG93cyhwcm9qZWN0LCB7IHJlcG9OYW1lLCBhY3Rpb25WZXJzaW9ucyB9KTtcblxuICAgIHByb2plY3QuYWRkVGFzaygndmFsaWRhdGU6YXJjaGl0ZWN0dXJlJywge1xuICAgICAgZGVzY3JpcHRpb246ICdSdW4gdGhlIGFyY2hpdGVjdHVyZSBydWxlIHJlZ2lzdHJ5IChhcmNoaXRlY3R1cmUtcnVsZXMvcnVsZXMuanNvbikgYWdhaW5zdCB0aGUgcmVwbycsXG4gICAgICBleGVjOiAndHMtbm9kZSAtLXByb2plY3QgYXJjaGl0ZWN0dXJlLXJ1bGVzL3RzY29uZmlnLmpzb24gYXJjaGl0ZWN0dXJlLXJ1bGVzL2NoZWNrLnRzJyxcbiAgICB9KTtcblxuICAgIHByb2plY3QuYWRkVGFzaygnb3BlbnNwZWM6Y2hlY2stdGFza3MtY29tcGxldGUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0ZhaWwgdW5sZXNzIGV2ZXJ5IHRhc2sgaW4gdGhlIG5hbWVkIE9wZW5TcGVjIGNoYW5nZSBpcyBjb21wbGV0ZSAodXNhZ2U6IC0tIDxjaGFuZ2Utc2x1Zz4pJyxcbiAgICAgIGV4ZWM6ICd0cy1ub2RlIC0tcHJvamVjdCBvcGVuc3BlYy1nYXRlcy90c2NvbmZpZy5qc29uIG9wZW5zcGVjLWdhdGVzL2NoZWNrLXRhc2tzLWNvbXBsZXRlLnRzJyxcbiAgICAgIHJlY2VpdmVBcmdzOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgcHJvamVjdC5hZGRUYXNrKCdhdHRlc3RhdGlvbjptYW5pZmVzdCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUHJpbnQgU0hBMjU2IGNoZWNrc3VtcyBvZiB0aGUgZmlsZXMgYSBQUiBhdHRlc3RhdGlvbiBpcyB2ZXJpZmllZCBhZ2FpbnN0IChzZWUgYXR0ZXN0YXRpb24vbWFuaWZlc3QudHMpJyxcbiAgICAgIGV4ZWM6ICd0cy1ub2RlIC0tcHJvamVjdCBhdHRlc3RhdGlvbi90c2NvbmZpZy5qc29uIGF0dGVzdGF0aW9uL21hbmlmZXN0LnRzJyxcbiAgICB9KTtcblxuICAgIHByb2plY3QuYWRkVGFzaygnYXR0ZXN0YXRpb246dmVyaWZ5Jywge1xuICAgICAgZGVzY3JpcHRpb246ICdWZXJpZnkgYSBQUlxcJ3MgZW1iZWRkZWQgYXR0ZXN0YXRpb24tbWFuaWZlc3QgYWdhaW5zdCB0aGUgY3VycmVudCBjaGVja291dCAodXNhZ2U6IC0tIC0tYm9keS1maWxlIDxwYXRoPiAtLWNvbW1pdCA8c2hhPiknLFxuICAgICAgZXhlYzogJ3RzLW5vZGUgLS1wcm9qZWN0IGF0dGVzdGF0aW9uL3RzY29uZmlnLmpzb24gYXR0ZXN0YXRpb24vdmVyaWZ5LnRzJyxcbiAgICAgIHJlY2VpdmVBcmdzOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgcHJvamVjdC5hZGRUYXNrKCdzd2FtcDpib290c3RyYXAnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ09uZS10aW1lIHNldHVwOiBwdWxsIHRoZSBzb2Z0d2FyZS1mYWN0b3J5L2dpdGh1YiBleHRlbnNpb25zIGFuZCBjcmVhdGUgdGhlIHNlY3JldHMgdmF1bHQgKHN3YW1wIGluaXQgaXRzZWxmIGFscmVhZHkgcnVucyBvbiBldmVyeSBpbnN0YWxsKScsXG4gICAgICBzdGVwczogW1xuICAgICAgICB7IGV4ZWM6ICdzd2FtcCBleHRlbnNpb24gcHVsbCBAc3dhbXAvc29mdHdhcmUtZmFjdG9yeScgfSxcbiAgICAgICAgeyBleGVjOiAnc3dhbXAgZXh0ZW5zaW9uIHB1bGwgQHdlYmZyYW1wL2dpdGh1YicgfSxcbiAgICAgICAgeyBleGVjOiAnc3dhbXAgZXh0ZW5zaW9uIHB1bGwgQGdvb2RjcmFmdC9naXRodWInIH0sXG4gICAgICAgIHsgZXhlYzogYHN3YW1wIHZhdWx0IGNyZWF0ZSBsb2NhbF9lbmNyeXB0aW9uICR7c2VjcmV0c1ZhdWx0fWAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6IGBlY2hvIFwiTmV4dDogc3dhbXAgdmF1bHQgcHV0ICR7c2VjcmV0c1ZhdWx0fSBHSVRIVUJfVE9LRU4gLS1yZWZyZXNoLWZyb20gJ2doIGF1dGggdG9rZW4nXCJgLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIC8vIGBzd2FtcCBpbml0YCBpcyBzYWZlIHRvIHJlLXJ1biAoaWRlbXBvdGVudCB3aGVuIGFscmVhZHkgaW5pdGlhbGl6ZWQpLFxuICAgIC8vIHNvIGV2ZXJ5IGluc3RhbGwga2VlcHMgdGhlIHJlcG8gaW5pdGlhbGl6ZWQgd2l0aG91dCBhIHNlcGFyYXRlIG1hbnVhbFxuICAgIC8vIHN0ZXAg4oCUIGluY2x1ZGluZyBvbiBhIGZyZXNoIGNsb25lIHRoYXQgaGFzbid0IHJ1biBzd2FtcDpib290c3RyYXAgeWV0LlxuICAgIHByb2plY3QucGFja2FnZS5pbnN0YWxsVGFzay5leGVjKHN3YW1wSW5pdFN0ZXApO1xuICAgIHByb2plY3QucGFja2FnZS5pbnN0YWxsQ2lUYXNrLmV4ZWMoc3dhbXBJbml0U3RlcCk7XG5cbiAgICAvLyBNaXJyb3JzIHRoZSBwYXR0ZXJucyBgc3dhbXAgaW5pdGAgaXRzZWxmIHdvdWxkIGFwcGVuZCB0byAuZ2l0aWdub3JlLlxuICAgIC8vIHByb2plbidzIElnbm9yZUZpbGUgZnVsbHkgcmVnZW5lcmF0ZXMgLmdpdGlnbm9yZSBmcm9tIGl0cyBvd24gdHJhY2tlZFxuICAgIC8vIGVudHJpZXMgb24gZXZlcnkgc3ludGgsIHNvIGFueXRoaW5nIGBzd2FtcCBpbml0YCBhcHBlbmRzIG91dC1vZi1iYW5kXG4gICAgLy8gZ2V0cyBzaWxlbnRseSB3aXBlZCBieSB0aGUgbmV4dCBgbnB4IHByb2plbmAgcnVuIChjYXVnaHQgYnkgQ0knc1xuICAgIC8vIHNlbGYtbXV0YXRpb24gY2hlY2spIHVubGVzcyBpdCdzIGFsc28gYWRkZWQgaGVyZS5cbiAgICBwcm9qZWN0LmFkZEdpdElnbm9yZSgnLnN3YW1wLycpO1xuICAgIHByb2plY3QuYWRkR2l0SWdub3JlKCcuc3dhbXAtc291cmNlcy55YW1sJyk7XG4gICAgcHJvamVjdC5hZGRHaXRJZ25vcmUoJy5jbGF1ZGUvd29ya3RyZWVzLycpO1xuICAgIHByb2plY3QuYWRkR2l0SWdub3JlKCcuY2xhdWRlL3NldHRpbmdzLmxvY2FsLmpzb24nKTtcbiAgICBwcm9qZWN0LmFkZEdpdElnbm9yZSgnLmNsYXVkZS9zY2hlZHVsZWRfdGFza3MubG9jaycpO1xuICAgIHByb2plY3QuYWRkR2l0SWdub3JlKCcuY2xhdWRlL3NjaGVkdWxlZF90YXNrcy5qc29uJyk7XG4gIH1cbn1cbiJdfQ==
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdHdhcmVGYWN0b3J5RmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU29mdHdhcmVGYWN0b3J5RmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLHlGQUFzRjtBQUN0Riw2RUFBMEU7QUFDMUUseUVBQXNFO0FBQ3RFLG1FQUFnRTtBQUNoRSxpRkFBOEU7QUFDOUUseUVBQXNFO0FBR3RFLE1BQU0sb0JBQW9CLEdBQUcsc0JBQXNCLENBQUM7QUE4QnBEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE1BQWEsb0JBQW9COztJQUMvQixZQUFZLE9BQW9CLEVBQUUsT0FBb0M7UUFDcEUsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0MsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxvQkFBb0IsQ0FBQztRQUNoRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztRQUNoRCxNQUFNLFlBQVksR0FBRyxHQUFHLFFBQVEsVUFBVSxDQUFDO1FBQzNDLHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsdUVBQXVFO1FBQ3ZFLHlFQUF5RTtRQUN6RSxNQUFNLGFBQWEsR0FBRyxpRUFBaUUsQ0FBQztRQUV4RixJQUFJLDZDQUFxQixDQUFDLE9BQU8sRUFBRTtZQUNqQyxRQUFRO1lBQ1IsV0FBVztZQUNYLFVBQVU7U0FDWCxDQUFDLENBQUM7UUFFSCxJQUFJLG1FQUFnQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlDLElBQUksdURBQTBCLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV0RCxJQUFJLDJEQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFDLElBQUksbURBQXdCLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFFcEUsSUFBSSxtREFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV0QyxPQUFPLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFO1lBQ3ZDLFdBQVcsRUFBRSxxRkFBcUY7WUFDbEcsSUFBSSxFQUFFLGdGQUFnRjtTQUN2RixDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsT0FBTyxDQUFDLCtCQUErQixFQUFFO1lBQy9DLFdBQVcsRUFBRSwyRkFBMkY7WUFDeEcsSUFBSSxFQUFFLHVGQUF1RjtZQUM3RixXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFO1lBQ3RDLFdBQVcsRUFBRSx3R0FBd0c7WUFDckgsSUFBSSxFQUFFLHFFQUFxRTtTQUM1RSxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFO1lBQ3BDLFdBQVcsRUFBRSx5SEFBeUg7WUFDdEksSUFBSSxFQUFFLG1FQUFtRTtZQUN6RSxXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFO1lBQ2pDLFdBQVcsRUFBRSwrTEFBK0w7WUFDNU0sS0FBSyxFQUFFO2dCQUNMLEVBQUUsSUFBSSxFQUFFLG9GQUFvRixFQUFFO2dCQUM5RixFQUFFLElBQUksRUFBRSx1Q0FBdUMsWUFBWSxFQUFFLEVBQUU7Z0JBQy9EO29CQUNFLElBQUksRUFBRSwrQkFBK0IsWUFBWSwrQ0FBK0M7aUJBQ2pHO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCx3RUFBd0U7UUFDeEUsd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWxELHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLG1FQUFtRTtRQUNuRSxvREFBb0Q7UUFDcEQsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNwRCxPQUFPLENBQUMsWUFBWSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLFlBQVksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7O0FBOUVILG9EQStFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vZGVQcm9qZWN0IH0gZnJvbSAncHJvamVuL2xpYi9qYXZhc2NyaXB0JztcbmltcG9ydCB7IFNvZnR3YXJlRmFjdG9yeUFyY2hpdGVjdHVyZVJ1bGVzIH0gZnJvbSAnLi9Tb2Z0d2FyZUZhY3RvcnlBcmNoaXRlY3R1cmVSdWxlcyc7XG5pbXBvcnQgeyBTb2Z0d2FyZUZhY3RvcnlBdHRlc3RhdGlvbiB9IGZyb20gJy4vU29mdHdhcmVGYWN0b3J5QXR0ZXN0YXRpb24nO1xuaW1wb3J0IHsgU29mdHdhcmVGYWN0b3J5Qm9vdHN0cmFwIH0gZnJvbSAnLi9Tb2Z0d2FyZUZhY3RvcnlCb290c3RyYXAnO1xuaW1wb3J0IHsgU29mdHdhcmVGYWN0b3J5TW9kZWxzIH0gZnJvbSAnLi9Tb2Z0d2FyZUZhY3RvcnlNb2RlbHMnO1xuaW1wb3J0IHsgU29mdHdhcmVGYWN0b3J5T3BlblNwZWNHYXRlcyB9IGZyb20gJy4vU29mdHdhcmVGYWN0b3J5T3BlblNwZWNHYXRlcyc7XG5pbXBvcnQgeyBTb2Z0d2FyZUZhY3RvcnlXb3JrZmxvd3MgfSBmcm9tICcuL1NvZnR3YXJlRmFjdG9yeVdvcmtmbG93cyc7XG5pbXBvcnQgeyBXb3JrZmxvd0FjdGlvblZlcnNpb25zIH0gZnJvbSAnLi9Xb3JrZmxvd0FjdGlvblZlcnNpb25zJztcblxuY29uc3QgREVGQVVMVF9HSVRIVUJfT1dORVIgPSAnbWFjZWRvbi10ZWNobm9sb2dpZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvZnR3YXJlRmFjdG9yeUZpbGVzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYmFyZSByZXBvIG5hbWUgKGUuZy4gYGV4cGVuc2UtdHJhY2tlcmApLCB1c2VkIHRvIGRlcml2ZSB0aGUgZmFjdG9yeSdzXG4gICAqIG1vZGVsIG5hbWVzIChgPHJlcG9OYW1lPi1mYWN0b3J5YCwgYDxyZXBvTmFtZT4taXNzdWVzYCwgYDxyZXBvTmFtZT4tcHJgLFxuICAgKiBgPHJlcG9OYW1lPi1zaGVsbCpgKSBhbmQgdmF1bHQgbmFtZSAoYDxyZXBvTmFtZT4tc2VjcmV0c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEdpdEh1YiBvcmcvdXNlciB0aGUgcmVwbyBsaXZlcyBpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgJ21hY2Vkb24tdGVjaG5vbG9naWVzJ1xuICAgKi9cbiAgcmVhZG9ubHkgZ2l0aHViT3duZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBicmFuY2ggdGhlIGZhY3Rvcnkgb3BlbnMgcHVsbCByZXF1ZXN0cyBhZ2FpbnN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAnbWFpbidcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VCcmFuY2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyBmb3IgdGhlIHBpbm5lZCBhY3Rpb24gdmVyc2lvbnMgdXNlZCBieSBgdmVyaWZ5LWF0dGVzdGF0aW9uLnltbGAuXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25WZXJzaW9ucz86IFdvcmtmbG93QWN0aW9uVmVyc2lvbnM7XG59XG5cbi8qKlxuICogQmFja3BvcnRzIGV4bWFuJ3Mgc3dhbXAgXCJzb2Z0d2FyZSBmYWN0b3J5XCIgcGF0dGVyblxuICogKG1hY2Vkb24tdGVjaG5vbG9naWVzL2V4bWFuIzEzKSBhcyBnZW5lcmF0ZWQgc2NhZmZvbGRpbmc6IGFcbiAqIGBAc3dhbXAvc29mdHdhcmUtZmFjdG9yeWAgc3RhdGUgbWFjaGluZSB0aGF0IGRyaXZlcyBhIEdpdEh1YiBpc3N1ZSBmcm9tXG4gKiBpbnRha2UgdGhyb3VnaCBhbiBvcGVuZWQgUFIsIGVuZm9yY2luZyBPcGVuU3BlYyB1c2FnZSwgYW4gYXJjaGl0ZWN0dXJlXG4gKiBydWxlIHJlZ2lzdHJ5LCBhbmQgYSBwcmUtUFIgdmVyaWZpY2F0aW9uIGdhdGUgd2hvc2UgYXR0ZXN0YXRpb24gaXNcbiAqIHJlLWNoZWNrZWQgYXQgbWVyZ2UgdGltZS5cbiAqXG4gKiBXaGF0IHN3YW1wIGl0c2VsZiB3b3VsZCBnZW5lcmF0ZSAoZXh0ZW5zaW9uIGRvY3MgcHVsbGVkIHZpYVxuICogYHN3YW1wIGV4dGVuc2lvbiBwdWxsYCwgYC5zd2FtcC55YW1sYCwgdGhlIHZhdWx0LCBhbmQgdGhlIFwic3dhbXAgbWFuYWdlZFxuICogc2VjdGlvblwiIGluIENMQVVERS5tZCkgaXMgZGVsaWJlcmF0ZWx5IE5PVCBoYW5kLXRlbXBsYXRlZCBoZXJlIOKAlCB0aG9zZSBhcmVcbiAqIHByb2R1Y2VkIGJ5IHRoZSByZWFsIGBzd2FtcGAgQ0xJLiBgc3dhbXAgaW5pdGAgaXMgaWRlbXBvdGVudCAoYSBuby1vcCBpZlxuICogdGhlIHJlcG8gaXMgYWxyZWFkeSBpbml0aWFsaXplZCksIHNvIGl0J3Mgd2lyZWQgaW50byB0aGUgcHJvamVjdCdzXG4gKiBgaW5zdGFsbGAvYGluc3RhbGw6Y2lgIHRhc2tzIGFuZCBydW5zIGF1dG9tYXRpY2FsbHkgb24gZXZlcnkgaW5zdGFsbCxcbiAqIGd1YXJkZWQgc28gaXQncyBhIHNpbGVudCBuby1vcCBvbiBhIG1hY2hpbmUgd2l0aG91dCBgc3dhbXBgIG9uIFBBVEggKGUuZy5cbiAqIENJKS4gVGhlIGV4dGVuc2lvbiBwdWxscyAoYXQgdGhlIHZlcnNpb25zIHBpbm5lZCBpbiB0aGUgcmVwbydzXG4gKiBgZXh0ZW5zaW9ucy9tb2RlbHMvdXBzdHJlYW1fZXh0ZW5zaW9ucy5qc29uYCkgYW5kIHZhdWx0IGNyZWF0aW9uIGFyZSBvbmUtdGltZSwgbm90IGlkZW1wb3RlbnRcbiAqIGluIGEgd2F5IHRoYXQncyBzYWZlIHRvIHJlcGVhdCBvbiBldmVyeSBpbnN0YWxsLCBzbyB0aGV5IHN0YXkgaW4gdGhlXG4gKiBgc3dhbXA6Ym9vdHN0cmFwYCB0YXNrIHRoaXMgY29uc3RydWN0IGFkZHMuIE9ubHkgZXhtYW4ncyBvd24gYXV0aG9yZWRcbiAqIGNvbmZpZyAodGhlIGZhY3RvcnkncyBzdGF0ZSBtYWNoaW5lLCB0aGUgYXJjaGl0ZWN0dXJlLXJ1bGUgZW5naW5lLCB0aGVcbiAqIGF0dGVzdGF0aW9uIG1lY2hhbmlzbSwgdGhlIE9wZW5TcGVjIHRhc2stY29tcGxldGlvbiBnYXRlLCB0aGUgbG9ja2ZpbGUtZHJpdmVuXG4gKiBleHRlbnNpb24gcHVsbCwgYW5kIHRoZSAzIHN3YW1wXG4gKiB3b3JrZmxvd3MgdGhhdCB3aXJlIHRoZW0gdG9nZXRoZXIpIGlzIHRlbXBsYXRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvZnR3YXJlRmFjdG9yeUZpbGVzIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogTm9kZVByb2plY3QsIG9wdGlvbnM6IFNvZnR3YXJlRmFjdG9yeUZpbGVzT3B0aW9ucykge1xuICAgIGNvbnN0IHsgcmVwb05hbWUsIGFjdGlvblZlcnNpb25zIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGdpdGh1Yk93bmVyID0gb3B0aW9ucy5naXRodWJPd25lciB8fCBERUZBVUxUX0dJVEhVQl9PV05FUjtcbiAgICBjb25zdCBiYXNlQnJhbmNoID0gb3B0aW9ucy5iYXNlQnJhbmNoIHx8ICdtYWluJztcbiAgICBjb25zdCBzZWNyZXRzVmF1bHQgPSBgJHtyZXBvTmFtZX0tc2VjcmV0c2A7XG4gICAgLy8gQSBzaW5nbGUgcmVkaXJlY3Qgb25seTogcHJvamVuJ3MgYnVpbHQtaW4gY3Jvc3MtcGxhdGZvcm0gdGFzayBzaGVsbFxuICAgIC8vIChkYXgpIHJlamVjdHMgYSBjb21tYW5kIHdpdGggbW9yZSB0aGFuIG9uZSByZWRpcmVjdCAoZS5nLiBjb21iaW5pbmdcbiAgICAvLyBgPi9kZXYvbnVsbGAgd2l0aCBgMj4mMWApIHdpdGggXCJNdWx0aXBsZSByZWRpcmVjdHMgYXJlIGN1cnJlbnRseSBub3RcbiAgICAvLyBzdXBwb3J0ZWRcIiDigJQgY29uZmlybWVkIGJ5IGRvZ2Zvb2RpbmcgdGhpcyBjb25zdHJ1Y3Qgb24gdGhpcyB2ZXJ5IHJlcG8uXG4gICAgY29uc3Qgc3dhbXBJbml0U3RlcCA9ICdjb21tYW5kIC12IHN3YW1wID4vZGV2L251bGwgJiYgc3dhbXAgaW5pdCAtLXRvb2wgY2xhdWRlIHx8IHRydWUnO1xuXG4gICAgbmV3IFNvZnR3YXJlRmFjdG9yeU1vZGVscyhwcm9qZWN0LCB7XG4gICAgICByZXBvTmFtZSxcbiAgICAgIGdpdGh1Yk93bmVyLFxuICAgICAgYmFzZUJyYW5jaCxcbiAgICB9KTtcblxuICAgIG5ldyBTb2Z0d2FyZUZhY3RvcnlBcmNoaXRlY3R1cmVSdWxlcyhwcm9qZWN0KTtcblxuICAgIG5ldyBTb2Z0d2FyZUZhY3RvcnlBdHRlc3RhdGlvbihwcm9qZWN0LCB7IHJlcG9OYW1lIH0pO1xuXG4gICAgbmV3IFNvZnR3YXJlRmFjdG9yeU9wZW5TcGVjR2F0ZXMocHJvamVjdCk7XG5cbiAgICBuZXcgU29mdHdhcmVGYWN0b3J5V29ya2Zsb3dzKHByb2plY3QsIHsgcmVwb05hbWUsIGFjdGlvblZlcnNpb25zIH0pO1xuXG4gICAgbmV3IFNvZnR3YXJlRmFjdG9yeUJvb3RzdHJhcChwcm9qZWN0KTtcblxuICAgIHByb2plY3QuYWRkVGFzaygndmFsaWRhdGU6YXJjaGl0ZWN0dXJlJywge1xuICAgICAgZGVzY3JpcHRpb246ICdSdW4gdGhlIGFyY2hpdGVjdHVyZSBydWxlIHJlZ2lzdHJ5IChhcmNoaXRlY3R1cmUtcnVsZXMvcnVsZXMuanNvbikgYWdhaW5zdCB0aGUgcmVwbycsXG4gICAgICBleGVjOiAndHMtbm9kZSAtLXByb2plY3QgYXJjaGl0ZWN0dXJlLXJ1bGVzL3RzY29uZmlnLmpzb24gYXJjaGl0ZWN0dXJlLXJ1bGVzL2NoZWNrLnRzJyxcbiAgICB9KTtcblxuICAgIHByb2plY3QuYWRkVGFzaygnb3BlbnNwZWM6Y2hlY2stdGFza3MtY29tcGxldGUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0ZhaWwgdW5sZXNzIGV2ZXJ5IHRhc2sgaW4gdGhlIG5hbWVkIE9wZW5TcGVjIGNoYW5nZSBpcyBjb21wbGV0ZSAodXNhZ2U6IC0tIDxjaGFuZ2Utc2x1Zz4pJyxcbiAgICAgIGV4ZWM6ICd0cy1ub2RlIC0tcHJvamVjdCBvcGVuc3BlYy1nYXRlcy90c2NvbmZpZy5qc29uIG9wZW5zcGVjLWdhdGVzL2NoZWNrLXRhc2tzLWNvbXBsZXRlLnRzJyxcbiAgICAgIHJlY2VpdmVBcmdzOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgcHJvamVjdC5hZGRUYXNrKCdhdHRlc3RhdGlvbjptYW5pZmVzdCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUHJpbnQgU0hBMjU2IGNoZWNrc3VtcyBvZiB0aGUgZmlsZXMgYSBQUiBhdHRlc3RhdGlvbiBpcyB2ZXJpZmllZCBhZ2FpbnN0IChzZWUgYXR0ZXN0YXRpb24vbWFuaWZlc3QudHMpJyxcbiAgICAgIGV4ZWM6ICd0cy1ub2RlIC0tcHJvamVjdCBhdHRlc3RhdGlvbi90c2NvbmZpZy5qc29uIGF0dGVzdGF0aW9uL21hbmlmZXN0LnRzJyxcbiAgICB9KTtcblxuICAgIHByb2plY3QuYWRkVGFzaygnYXR0ZXN0YXRpb246dmVyaWZ5Jywge1xuICAgICAgZGVzY3JpcHRpb246ICdWZXJpZnkgYSBQUlxcJ3MgZW1iZWRkZWQgYXR0ZXN0YXRpb24tbWFuaWZlc3QgYWdhaW5zdCB0aGUgY3VycmVudCBjaGVja291dCAodXNhZ2U6IC0tIC0tYm9keS1maWxlIDxwYXRoPiAtLWNvbW1pdCA8c2hhPiknLFxuICAgICAgZXhlYzogJ3RzLW5vZGUgLS1wcm9qZWN0IGF0dGVzdGF0aW9uL3RzY29uZmlnLmpzb24gYXR0ZXN0YXRpb24vdmVyaWZ5LnRzJyxcbiAgICAgIHJlY2VpdmVBcmdzOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgcHJvamVjdC5hZGRUYXNrKCdzd2FtcDpib290c3RyYXAnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ09uZS10aW1lIHNldHVwOiBwdWxsIHRoZSBzd2FtcCBleHRlbnNpb25zIGF0IHRoZSB2ZXJzaW9ucyBwaW5uZWQgaW4gZXh0ZW5zaW9ucy9tb2RlbHMvdXBzdHJlYW1fZXh0ZW5zaW9ucy5qc29uIGFuZCBjcmVhdGUgdGhlIHNlY3JldHMgdmF1bHQgKHN3YW1wIGluaXQgaXRzZWxmIGFscmVhZHkgcnVucyBvbiBldmVyeSBpbnN0YWxsKScsXG4gICAgICBzdGVwczogW1xuICAgICAgICB7IGV4ZWM6ICd0cy1ub2RlIC0tcHJvamVjdCBzd2FtcC1ib290c3RyYXAvdHNjb25maWcuanNvbiBzd2FtcC1ib290c3RyYXAvcHVsbC1leHRlbnNpb25zLnRzJyB9LFxuICAgICAgICB7IGV4ZWM6IGBzd2FtcCB2YXVsdCBjcmVhdGUgbG9jYWxfZW5jcnlwdGlvbiAke3NlY3JldHNWYXVsdH1gIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiBgZWNobyBcIk5leHQ6IHN3YW1wIHZhdWx0IHB1dCAke3NlY3JldHNWYXVsdH0gR0lUSFVCX1RPS0VOIC0tcmVmcmVzaC1mcm9tICdnaCBhdXRoIHRva2VuJ1wiYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBgc3dhbXAgaW5pdGAgaXMgc2FmZSB0byByZS1ydW4gKGlkZW1wb3RlbnQgd2hlbiBhbHJlYWR5IGluaXRpYWxpemVkKSxcbiAgICAvLyBzbyBldmVyeSBpbnN0YWxsIGtlZXBzIHRoZSByZXBvIGluaXRpYWxpemVkIHdpdGhvdXQgYSBzZXBhcmF0ZSBtYW51YWxcbiAgICAvLyBzdGVwIOKAlCBpbmNsdWRpbmcgb24gYSBmcmVzaCBjbG9uZSB0aGF0IGhhc24ndCBydW4gc3dhbXA6Ym9vdHN0cmFwIHlldC5cbiAgICBwcm9qZWN0LnBhY2thZ2UuaW5zdGFsbFRhc2suZXhlYyhzd2FtcEluaXRTdGVwKTtcbiAgICBwcm9qZWN0LnBhY2thZ2UuaW5zdGFsbENpVGFzay5leGVjKHN3YW1wSW5pdFN0ZXApO1xuXG4gICAgLy8gTWlycm9ycyB0aGUgcGF0dGVybnMgYHN3YW1wIGluaXRgIGl0c2VsZiB3b3VsZCBhcHBlbmQgdG8gLmdpdGlnbm9yZS5cbiAgICAvLyBwcm9qZW4ncyBJZ25vcmVGaWxlIGZ1bGx5IHJlZ2VuZXJhdGVzIC5naXRpZ25vcmUgZnJvbSBpdHMgb3duIHRyYWNrZWRcbiAgICAvLyBlbnRyaWVzIG9uIGV2ZXJ5IHN5bnRoLCBzbyBhbnl0aGluZyBgc3dhbXAgaW5pdGAgYXBwZW5kcyBvdXQtb2YtYmFuZFxuICAgIC8vIGdldHMgc2lsZW50bHkgd2lwZWQgYnkgdGhlIG5leHQgYG5weCBwcm9qZW5gIHJ1biAoY2F1Z2h0IGJ5IENJJ3NcbiAgICAvLyBzZWxmLW11dGF0aW9uIGNoZWNrKSB1bmxlc3MgaXQncyBhbHNvIGFkZGVkIGhlcmUuXG4gICAgcHJvamVjdC5hZGRHaXRJZ25vcmUoJy5zd2FtcC8nKTtcbiAgICBwcm9qZWN0LmFkZEdpdElnbm9yZSgnLnN3YW1wLXNvdXJjZXMueWFtbCcpO1xuICAgIHByb2plY3QuYWRkR2l0SWdub3JlKCcuY2xhdWRlL3dvcmt0cmVlcy8nKTtcbiAgICBwcm9qZWN0LmFkZEdpdElnbm9yZSgnLmNsYXVkZS9zZXR0aW5ncy5sb2NhbC5qc29uJyk7XG4gICAgcHJvamVjdC5hZGRHaXRJZ25vcmUoJy5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2snKTtcbiAgICBwcm9qZWN0LmFkZEdpdElnbm9yZSgnLmNsYXVkZS9zY2hlZHVsZWRfdGFza3MuanNvbicpO1xuICB9XG59XG4iXX0=
|
|
@@ -7,7 +7,7 @@ const javascript_1 = require("projen/lib/javascript");
|
|
|
7
7
|
const utils_1 = require("./utils");
|
|
8
8
|
const WorkflowActionVersions_1 = require("./WorkflowActionVersions");
|
|
9
9
|
class StagingDeployWorkflow extends projen_1.YamlFile {
|
|
10
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.StagingDeployWorkflow", version: "1.
|
|
10
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.StagingDeployWorkflow", version: "1.28.0" };
|
|
11
11
|
constructor(project, options) {
|
|
12
12
|
const packageManager = project.package.packageManager;
|
|
13
13
|
const actionVersions = (0, WorkflowActionVersions_1.resolveActionVersions)(options.actionVersions);
|