@macedon-technologies/batman 1.32.1 → 1.34.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 +2 -2
- package/lib/BatmanProject.js +1 -1
- package/lib/BootcampProject.js +1 -1
- package/lib/CodeOwnersFile.js +1 -1
- package/lib/DataDogAspectFile.js +5 -18
- package/lib/PrAutoMergeWorkflow.js +1 -1
- package/lib/ProductionDeployWorkflow.js +1 -1
- package/lib/SecretConstructFile.js +4 -54
- package/lib/SecretHandlerFiles.js +6 -173
- package/lib/SoftwareFactoryFiles.js +1 -1
- package/lib/StagingDeployWorkflow.js +1 -1
- package/lib/templates.d.ts +16 -0
- package/lib/templates.js +104 -0
- package/package.json +2 -1
- package/templates/app/architecture-rules/README.md +97 -0
- package/templates/app/architecture-rules/check.ts +218 -0
- package/templates/app/architecture-rules/rules.json +3 -0
- package/templates/app/architecture-rules/tsconfig.json +14 -0
- package/templates/app/openspec-gates/check-tasks-complete.ts +44 -0
- package/templates/app/openspec-gates/tsconfig.json +13 -0
- package/templates/app/package.json +74 -0
- package/templates/app/pnpm-lock.yaml +3888 -0
- package/templates/app/pnpm-workspace.yaml +7 -0
- package/templates/app/src/aspects/DataDogAspect.ts +14 -0
- package/templates/app/src/constructs/Secret.ts +50 -0
- package/templates/app/src/constructs/handler/Secret.Function.ts +38 -0
- package/templates/app/src/constructs/handler/secret/client.ts +5 -0
- package/templates/app/src/constructs/handler/secret/createSecretValue.ts +30 -0
- package/templates/app/src/constructs/handler/secret/didRandomPropertiesChange.ts +13 -0
- package/templates/app/src/constructs/handler/secret/updateSecretValue.ts +71 -0
- package/templates/app/swamp-bootstrap/pull-extensions.ts +68 -0
- package/templates/app/swamp-bootstrap/tsconfig.json +13 -0
- package/templates/app/test/DataDogAspect.test.ts +31 -0
- package/templates/app/test/Secret.test.ts +40 -0
- package/templates/app/test/didRandomPropertiesChange.test.ts +19 -0
- package/templates/app/test/tsconfig.json +13 -0
- package/templates/app/tsconfig.json +50 -0
package/.jsii
CHANGED
|
@@ -1393,6 +1393,6 @@
|
|
|
1393
1393
|
"symbolId": "src/WorkflowActionVersions:WorkflowActionVersions"
|
|
1394
1394
|
}
|
|
1395
1395
|
},
|
|
1396
|
-
"version": "1.
|
|
1397
|
-
"fingerprint": "
|
|
1396
|
+
"version": "1.34.0",
|
|
1397
|
+
"fingerprint": "KieBAE1cnDi5Foi2STefR2reOrUwymxBEaGz+TLqRIw="
|
|
1398
1398
|
}
|
package/lib/BatmanProject.js
CHANGED
|
@@ -12,7 +12,7 @@ const SoftwareFactoryFiles_1 = require("./SoftwareFactoryFiles");
|
|
|
12
12
|
const utils_1 = require("./utils");
|
|
13
13
|
const ViteReactProject_1 = require("./ViteReactProject");
|
|
14
14
|
class BatmanProject extends awscdk_1.AwsCdkTypeScriptApp {
|
|
15
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.BatmanProject", version: "1.
|
|
15
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.BatmanProject", version: "1.34.0" };
|
|
16
16
|
constructor(options) {
|
|
17
17
|
super({
|
|
18
18
|
...options,
|
package/lib/BootcampProject.js
CHANGED
|
@@ -12,7 +12,7 @@ const SoftwareFactoryFiles_1 = require("./SoftwareFactoryFiles");
|
|
|
12
12
|
const utils_1 = require("./utils");
|
|
13
13
|
const ViteReactProject_1 = require("./ViteReactProject");
|
|
14
14
|
class BootcampProject extends awscdk_1.AwsCdkTypeScriptApp {
|
|
15
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.BootcampProject", version: "1.
|
|
15
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.BootcampProject", version: "1.34.0" };
|
|
16
16
|
constructor(options) {
|
|
17
17
|
super({
|
|
18
18
|
...options,
|
package/lib/CodeOwnersFile.js
CHANGED
|
@@ -4,7 +4,7 @@ exports.CodeOwnersFile = void 0;
|
|
|
4
4
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
5
5
|
const projen_1 = require("projen");
|
|
6
6
|
class CodeOwnersFile extends projen_1.TextFile {
|
|
7
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.CodeOwnersFile", version: "1.
|
|
7
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.CodeOwnersFile", version: "1.34.0" };
|
|
8
8
|
constructor(project, options = {}) {
|
|
9
9
|
const defaultOwners = ['* @macedon-technologies/platform', '* @macedon-technologies/ai-development-team'];
|
|
10
10
|
const allOwners = [...defaultOwners, ...(options.additionalOwners || [])];
|
package/lib/DataDogAspectFile.js
CHANGED
|
@@ -2,28 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DataDogAspectFile = void 0;
|
|
4
4
|
const projen_1 = require("projen");
|
|
5
|
+
const templates_1 = require("./templates");
|
|
6
|
+
const DATADOG_ASPECT_PATH = 'src/aspects/DataDogAspect.ts';
|
|
5
7
|
class DataDogAspectFile extends projen_1.TextFile {
|
|
6
8
|
constructor(project) {
|
|
7
|
-
super(project,
|
|
8
|
-
lines:
|
|
9
|
-
"import { IAspect } from 'aws-cdk-lib';",
|
|
10
|
-
"import { Function } from 'aws-cdk-lib/aws-lambda';",
|
|
11
|
-
"import { IConstruct } from 'constructs';",
|
|
12
|
-
"import { DatadogLambda } from 'datadog-cdk-constructs-v2'; // or v1",
|
|
13
|
-
'',
|
|
14
|
-
'export class DataDogAspect implements IAspect {',
|
|
15
|
-
' constructor(private props: { datadog: DatadogLambda }) {}',
|
|
16
|
-
'',
|
|
17
|
-
' visit(node: IConstruct): void {',
|
|
18
|
-
' if (node instanceof Function) {',
|
|
19
|
-
' this.props.datadog.addLambdaFunctions([node]);',
|
|
20
|
-
' }',
|
|
21
|
-
' }',
|
|
22
|
-
'}',
|
|
23
|
-
],
|
|
9
|
+
super(project, DATADOG_ASPECT_PATH, {
|
|
10
|
+
lines: (0, templates_1.templateLines)(project, DATADOG_ASPECT_PATH),
|
|
24
11
|
marker: true,
|
|
25
12
|
});
|
|
26
13
|
}
|
|
27
14
|
}
|
|
28
15
|
exports.DataDogAspectFile = DataDogAspectFile;
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YURvZ0FzcGVjdEZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvRGF0YURvZ0FzcGVjdEZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWtDO0FBRWxDLDJDQUE0QztBQUU1QyxNQUFNLG1CQUFtQixHQUFHLDhCQUE4QixDQUFDO0FBRTNELE1BQWEsaUJBQWtCLFNBQVEsaUJBQVE7SUFDN0MsWUFBWSxPQUE0QjtRQUN0QyxLQUFLLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFO1lBQ2xDLEtBQUssRUFBRSxJQUFBLHlCQUFhLEVBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDO1lBQ2xELE1BQU0sRUFBRSxJQUFJO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBUEQsOENBT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuaW1wb3J0IHsgdGVtcGxhdGVMaW5lcyB9IGZyb20gJy4vdGVtcGxhdGVzJztcblxuY29uc3QgREFUQURPR19BU1BFQ1RfUEFUSCA9ICdzcmMvYXNwZWN0cy9EYXRhRG9nQXNwZWN0LnRzJztcblxuZXhwb3J0IGNsYXNzIERhdGFEb2dBc3BlY3RGaWxlIGV4dGVuZHMgVGV4dEZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwKSB7XG4gICAgc3VwZXIocHJvamVjdCwgREFUQURPR19BU1BFQ1RfUEFUSCwge1xuICAgICAgbGluZXM6IHRlbXBsYXRlTGluZXMocHJvamVjdCwgREFUQURPR19BU1BFQ1RfUEFUSCksXG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -14,7 +14,7 @@ const PR_AUTO_MERGE_README_URL = 'https://github.com/macedon-technologies/platfo
|
|
|
14
14
|
* workflows from pull request branches can't read the key. The job never checks out pull request code.
|
|
15
15
|
*/
|
|
16
16
|
class PrAutoMergeWorkflow extends projen_1.YamlFile {
|
|
17
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.PrAutoMergeWorkflow", version: "1.
|
|
17
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.PrAutoMergeWorkflow", version: "1.34.0" };
|
|
18
18
|
constructor(project, options = {}) {
|
|
19
19
|
const actionVersions = (0, WorkflowActionVersions_1.resolveActionVersions)(options.actionVersions);
|
|
20
20
|
super(project, '.github/workflows/pr-auto-merge.yml', {
|
|
@@ -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 ProductionDeployWorkflow extends projen_1.YamlFile {
|
|
10
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.ProductionDeployWorkflow", version: "1.
|
|
10
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.ProductionDeployWorkflow", version: "1.34.0" };
|
|
11
11
|
constructor(project, options) {
|
|
12
12
|
const packageManager = project.package.packageManager;
|
|
13
13
|
const actionVersions = (0, WorkflowActionVersions_1.resolveActionVersions)(options.actionVersions);
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SecretConstructFile = void 0;
|
|
4
4
|
const projen_1 = require("projen");
|
|
5
|
+
const templates_1 = require("./templates");
|
|
6
|
+
const SECRET_CONSTRUCT_PATH = 'src/constructs/Secret.ts';
|
|
5
7
|
/**
|
|
6
8
|
* Scaffolds src/constructs/Secret.ts: a Secrets Manager secret that keeps
|
|
7
9
|
* manually changed values across deploys. Copied from @matthewbonig/secret (MIT),
|
|
@@ -9,60 +11,8 @@ const projen_1 = require("projen");
|
|
|
9
11
|
*/
|
|
10
12
|
class SecretConstructFile extends projen_1.SampleFile {
|
|
11
13
|
constructor(project) {
|
|
12
|
-
super(project,
|
|
13
|
-
contents: `// Copied from @matthewbonig/secret (MIT, https://github.com/mbonig/secret).
|
|
14
|
-
// This file is generated by Batman and is yours to modify.
|
|
15
|
-
import { join } from 'path';
|
|
16
|
-
import { CustomResource } from 'aws-cdk-lib';
|
|
17
|
-
import { Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam';
|
|
18
|
-
import { Runtime } from 'aws-cdk-lib/aws-lambda';
|
|
19
|
-
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
20
|
-
import { Secret as AWSSecret, SecretProps, SecretStringGenerator } from 'aws-cdk-lib/aws-secretsmanager';
|
|
21
|
-
import { Provider } from 'aws-cdk-lib/custom-resources';
|
|
22
|
-
import { Construct } from 'constructs';
|
|
23
|
-
|
|
24
|
-
export class Secret extends AWSSecret {
|
|
25
|
-
constructor(scope: Construct, id: string, props: SecretProps) {
|
|
26
|
-
super(scope, id, {
|
|
27
|
-
...props,
|
|
28
|
-
generateSecretString: undefined, // explicitly set this to undefined so that we never use the built-in functionality
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
if (props.generateSecretString?.secretStringTemplate) {
|
|
32
|
-
// now we're going to use a custom resource for this instead
|
|
33
|
-
this.createCustomResource(props.generateSecretString);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
private createCustomResource(generateSecretString: SecretStringGenerator) {
|
|
38
|
-
const eventHandler = new NodejsFunction(this, 'EventHandlerFunction', {
|
|
39
|
-
runtime: Runtime.NODEJS_24_X,
|
|
40
|
-
entry: join(__dirname, 'handler/Secret.Function.ts'),
|
|
41
|
-
});
|
|
42
|
-
this.grantWrite(eventHandler);
|
|
43
|
-
this.grantRead(eventHandler);
|
|
44
|
-
eventHandler.addToRolePolicy(new PolicyStatement({
|
|
45
|
-
effect: Effect.ALLOW,
|
|
46
|
-
resources: ['*'],
|
|
47
|
-
actions: ['secretsmanager:GetRandomPassword'],
|
|
48
|
-
}));
|
|
49
|
-
const provider = new Provider(this, 'CustomResourceProvider', {
|
|
50
|
-
onEventHandler: eventHandler,
|
|
51
|
-
});
|
|
52
|
-
const customResource = new CustomResource(this, 'GenerateSecretStringCR', {
|
|
53
|
-
resourceType: 'Custom::GenerateSecretString',
|
|
54
|
-
serviceToken: provider.serviceToken,
|
|
55
|
-
properties: {
|
|
56
|
-
Secret: this.secretArn,
|
|
57
|
-
GenerateSecretString: generateSecretString,
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
customResource.node.addDependency(this);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
`,
|
|
64
|
-
});
|
|
14
|
+
super(project, SECRET_CONSTRUCT_PATH, (0, templates_1.templateFileOptions)(project, SECRET_CONSTRUCT_PATH));
|
|
65
15
|
}
|
|
66
16
|
}
|
|
67
17
|
exports.SecretConstructFile = SecretConstructFile;
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjcmV0Q29uc3RydWN0RmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TZWNyZXRDb25zdHJ1Y3RGaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFvQztBQUVwQywyQ0FBa0Q7QUFFbEQsTUFBTSxxQkFBcUIsR0FBRywwQkFBMEIsQ0FBQztBQUV6RDs7OztHQUlHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxtQkFBVTtJQUNqRCxZQUFZLE9BQTRCO1FBQ3RDLEtBQUssQ0FBQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsSUFBQSwrQkFBbUIsRUFBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDO0lBQzdGLENBQUM7Q0FDRjtBQUpELGtEQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2FtcGxlRmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuaW1wb3J0IHsgdGVtcGxhdGVGaWxlT3B0aW9ucyB9IGZyb20gJy4vdGVtcGxhdGVzJztcblxuY29uc3QgU0VDUkVUX0NPTlNUUlVDVF9QQVRIID0gJ3NyYy9jb25zdHJ1Y3RzL1NlY3JldC50cyc7XG5cbi8qKlxuICogU2NhZmZvbGRzIHNyYy9jb25zdHJ1Y3RzL1NlY3JldC50czogYSBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IHRoYXQga2VlcHNcbiAqIG1hbnVhbGx5IGNoYW5nZWQgdmFsdWVzIGFjcm9zcyBkZXBsb3lzLiBDb3BpZWQgZnJvbSBAbWF0dGhld2JvbmlnL3NlY3JldCAoTUlUKSxcbiAqIHdpdGggdGhlIGhhbmRsZXIgTGFtYmRhIG9uIE5vZGUuanMgMjQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWNyZXRDb25zdHJ1Y3RGaWxlIGV4dGVuZHMgU2FtcGxlRmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHApIHtcbiAgICBzdXBlcihwcm9qZWN0LCBTRUNSRVRfQ09OU1RSVUNUX1BBVEgsIHRlbXBsYXRlRmlsZU9wdGlvbnMocHJvamVjdCwgU0VDUkVUX0NPTlNUUlVDVF9QQVRIKSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SecretHandlerFiles = void 0;
|
|
4
4
|
const projen_1 = require("projen");
|
|
5
|
+
const templates_1 = require("./templates");
|
|
6
|
+
const HANDLER_ENTRY_PATH = 'src/constructs/handler/Secret.Function.ts';
|
|
7
|
+
const HANDLER_DIR = 'src/constructs/handler/secret';
|
|
5
8
|
/**
|
|
6
9
|
* Scaffolds the Lambda handler sources used by the generated Secret construct
|
|
7
10
|
* (src/constructs/Secret.ts). Copied from @matthewbonig/secret (MIT).
|
|
@@ -11,179 +14,9 @@ const projen_1 = require("projen");
|
|
|
11
14
|
*/
|
|
12
15
|
class SecretHandlerFiles {
|
|
13
16
|
constructor(project) {
|
|
14
|
-
new projen_1.SampleFile(project,
|
|
15
|
-
|
|
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
|
-
});
|
|
17
|
+
new projen_1.SampleFile(project, HANDLER_ENTRY_PATH, (0, templates_1.templateFileOptions)(project, HANDLER_ENTRY_PATH));
|
|
18
|
+
new projen_1.SampleDir(project, HANDLER_DIR, (0, templates_1.templateDirOptions)(project, HANDLER_DIR));
|
|
186
19
|
}
|
|
187
20
|
}
|
|
188
21
|
exports.SecretHandlerFiles = SecretHandlerFiles;
|
|
189
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjcmV0SGFuZGxlckZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NlY3JldEhhbmRsZXJGaWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFHcEM7Ozs7OztHQU1HO0FBQ0gsTUFBYSxrQkFBa0I7SUFDN0IsWUFBWSxPQUE0QjtRQUN0QyxJQUFJLG1CQUFVLENBQUMsT0FBTyxFQUFFLDJDQUEyQyxFQUFFO1lBQ25FLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FzQ2Y7U0FDSSxDQUFDLENBQUM7UUFFSCxJQUFJLG1CQUFVLENBQUMsT0FBTyxFQUFFLHlDQUF5QyxFQUFFO1lBQ2pFLFFBQVEsRUFBRTs7Ozs7Q0FLZjtTQUNJLENBQUMsQ0FBQztRQUVILElBQUksbUJBQVUsQ0FBQyxPQUFPLEVBQUUsb0RBQW9ELEVBQUU7WUFDNUUsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4QmY7U0FDSSxDQUFDLENBQUM7UUFFSCxJQUFJLG1CQUFVLENBQUMsT0FBTyxFQUFFLDREQUE0RCxFQUFFO1lBQ3BGLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7OztDQWFmO1NBQ0ksQ0FBQyxDQUFDO1FBRUgsSUFBSSxtQkFBVSxDQUFDLE9BQU8sRUFBRSxvREFBb0QsRUFBRTtZQUM1RSxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdUVmO1NBQ0ksQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBbkxELGdEQW1MQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhbXBsZUZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuLyoqXG4gKiBTY2FmZm9sZHMgdGhlIExhbWJkYSBoYW5kbGVyIHNvdXJjZXMgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIFNlY3JldCBjb25zdHJ1Y3RcbiAqIChzcmMvY29uc3RydWN0cy9TZWNyZXQudHMpLiBDb3BpZWQgZnJvbSBAbWF0dGhld2JvbmlnL3NlY3JldCAoTUlUKS5cbiAqXG4gKiBUaGUgZW50cnkgZmlsZSBpcyBkZWxpYmVyYXRlbHkgbm90IG5hbWVkICoubGFtYmRhLnRzLCBzbyBwcm9qZW4ncyBsYW1iZGFcbiAqIGF1dG8tZGlzY292ZXJ5IGRvZXMgbm90IGdlbmVyYXRlIGEgc2Vjb25kIGZ1bmN0aW9uIGNsYXNzIGZvciBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3JldEhhbmRsZXJGaWxlcyB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHApIHtcbiAgICBuZXcgU2FtcGxlRmlsZShwcm9qZWN0LCAnc3JjL2NvbnN0cnVjdHMvaGFuZGxlci9TZWNyZXQuRnVuY3Rpb24udHMnLCB7XG4gICAgICBjb250ZW50czogYC8vIENvcGllZCBmcm9tIEBtYXR0aGV3Ym9uaWcvc2VjcmV0IChNSVQsIGh0dHBzOi8vZ2l0aHViLmNvbS9tYm9uaWcvc2VjcmV0KS5cbi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgQmF0bWFuIGFuZCBpcyB5b3VycyB0byBtb2RpZnkuXG5pbXBvcnQgeyBjcmVhdGVTZWNyZXRWYWx1ZSB9IGZyb20gJy4vc2VjcmV0L2NyZWF0ZVNlY3JldFZhbHVlJztcbmltcG9ydCB7IHVwZGF0ZVNlY3JldFZhbHVlIH0gZnJvbSAnLi9zZWNyZXQvdXBkYXRlU2VjcmV0VmFsdWUnO1xuXG5pbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2Uge1xuICBSZXF1ZXN0VHlwZTogJ0NyZWF0ZScgfCAnVXBkYXRlJyB8ICdEZWxldGUnO1xuICBMb2dpY2FsUmVzb3VyY2VJZDogc3RyaW5nO1xuICBSZXNvdXJjZVByb3BlcnRpZXM6IGFueTtcbiAgT2xkUmVzb3VyY2VQcm9wZXJ0aWVzPzogYW55O1xuICBQaHlzaWNhbFJlc291cmNlSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBDdXN0b21SZXNvdXJjZSkgPT4ge1xuICBjb25zb2xlLmxvZygnUmVjZWl2ZWQgZXZlbnQ6JywgSlNPTi5zdHJpbmdpZnkoZXZlbnQsIG51bGwsIDIpKTtcblxuICBzd2l0Y2ggKGV2ZW50LlJlcXVlc3RUeXBlKSB7XG4gICAgY2FzZSAnQ3JlYXRlJzpcbiAgICAgIGNvbnNvbGUubG9nKFxcYENyZWF0ZSBzZWNyZXQgdmFsdWUgZm9yIHNlY3JldCBcXCR7ZXZlbnQuTG9naWNhbFJlc291cmNlSWR9O1xcYCk7XG4gICAgICBhd2FpdCBjcmVhdGVTZWNyZXRWYWx1ZSh7XG4gICAgICAgIHNlY3JldEFybjogZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLlNlY3JldCxcbiAgICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5HZW5lcmF0ZVNlY3JldFN0cmluZyxcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnVXBkYXRlJzpcbiAgICAgIGNvbnNvbGUubG9nKCdVcGRhdGluZyBzZWNyZXQgd2l0aCBwaHlzaWNhbCBpZDonLCBldmVudC5QaHlzaWNhbFJlc291cmNlSWQpO1xuICAgICAgYXdhaXQgdXBkYXRlU2VjcmV0VmFsdWUoe1xuICAgICAgICBzZWNyZXRBcm46IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5TZWNyZXQsXG4gICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuR2VuZXJhdGVTZWNyZXRTdHJpbmcsXG4gICAgICAgIG9sZEdlbmVyYXRlU2VjcmV0U3RyaW5nOiBldmVudC5PbGRSZXNvdXJjZVByb3BlcnRpZXMuR2VuZXJhdGVTZWNyZXRTdHJpbmcsXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RlbGV0ZSc6XG4gICAgICBjb25zb2xlLmxvZygnRGVsZXRpbmcgc2VjcmV0IHdpdGggcGh5c2ljYWwgaWQ6JywgZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkKTtcbiAgICAgIGNvbnNvbGUubG9nKCdEb2luZyBub3RoaW5nLiBkZWxldGluZyBzZWNyZXRzIHJlcXVpcmVzIG5vIHdvcmsgYXQgYWxsLicpO1xuICAgICAgYnJlYWs7XG4gIH1cbn07XG5gLFxuICAgIH0pO1xuXG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgJ3NyYy9jb25zdHJ1Y3RzL2hhbmRsZXIvc2VjcmV0L2NsaWVudC50cycsIHtcbiAgICAgIGNvbnRlbnRzOiBgLy8gQ29waWVkIGZyb20gQG1hdHRoZXdib25pZy9zZWNyZXQgKE1JVCwgaHR0cHM6Ly9naXRodWIuY29tL21ib25pZy9zZWNyZXQpLlxuLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBCYXRtYW4gYW5kIGlzIHlvdXJzIHRvIG1vZGlmeS5cbmltcG9ydCB7IFNlY3JldHNNYW5hZ2VyIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5cbmV4cG9ydCBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXIoe30pO1xuYCxcbiAgICB9KTtcblxuICAgIG5ldyBTYW1wbGVGaWxlKHByb2plY3QsICdzcmMvY29uc3RydWN0cy9oYW5kbGVyL3NlY3JldC9jcmVhdGVTZWNyZXRWYWx1ZS50cycsIHtcbiAgICAgIGNvbnRlbnRzOiBgLy8gQ29waWVkIGZyb20gQG1hdHRoZXdib25pZy9zZWNyZXQgKE1JVCwgaHR0cHM6Ly9naXRodWIuY29tL21ib25pZy9zZWNyZXQpLlxuLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBCYXRtYW4gYW5kIGlzIHlvdXJzIHRvIG1vZGlmeS5cbmltcG9ydCB7IEdldFJhbmRvbVBhc3N3b3JkQ29tbWFuZCwgUHV0U2VjcmV0VmFsdWVDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgeyBjbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZWNyZXRWYWx1ZSh7IGdlbmVyYXRlU2VjcmV0U3RyaW5nLCBzZWNyZXRBcm4gfToge1xuICBzZWNyZXRBcm46IGFueTtcbiAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IGFueTtcbn0pIHtcbiAgLy8gc2luY2UgdGhpcyBpcyBhIGNyZWF0ZSwgd2UgY2FuIGp1c3Qgd3JpdGUgdGhlIHZhbHVlIGFzLWlzLi4uXG4gIGNvbnN0IHNlY3JldFZhbHVlID0gSlNPTi5wYXJzZShnZW5lcmF0ZVNlY3JldFN0cmluZy5zZWNyZXRTdHJpbmdUZW1wbGF0ZSk7XG4gIGlmIChnZW5lcmF0ZVNlY3JldFN0cmluZy5nZW5lcmF0ZVN0cmluZ0tleSkge1xuICAgIGNvbnN0IHJhbmRvbVZhbHVlID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IEdldFJhbmRvbVBhc3N3b3JkQ29tbWFuZCh7XG4gICAgICBFeGNsdWRlQ2hhcmFjdGVyczogZ2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZUNoYXJhY3RlcnMsXG4gICAgICBFeGNsdWRlTG93ZXJjYXNlOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlTG93ZXJjYXNlLFxuICAgICAgRXhjbHVkZU51bWJlcnM6IGdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVOdW1iZXJzLFxuICAgICAgRXhjbHVkZVB1bmN0dWF0aW9uOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlUHVuY3R1YXRpb24sXG4gICAgICBFeGNsdWRlVXBwZXJjYXNlOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlVXBwZXJjYXNlLFxuICAgICAgSW5jbHVkZVNwYWNlOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5pbmNsdWRlU3BhY2UsXG4gICAgICBQYXNzd29yZExlbmd0aDogZ2VuZXJhdGVTZWNyZXRTdHJpbmcucGFzc3dvcmRMZW5ndGgsXG4gICAgICBSZXF1aXJlRWFjaEluY2x1ZGVkVHlwZTogZ2VuZXJhdGVTZWNyZXRTdHJpbmcucmVxdWlyZUVhY2hJbmNsdWRlZFR5cGUsXG4gICAgfSkpO1xuICAgIHNlY3JldFZhbHVlW2dlbmVyYXRlU2VjcmV0U3RyaW5nLmdlbmVyYXRlU3RyaW5nS2V5XSA9IHJhbmRvbVZhbHVlLlJhbmRvbVBhc3N3b3JkO1xuICB9XG5cbiAgYXdhaXQgY2xpZW50LnNlbmQobmV3IFB1dFNlY3JldFZhbHVlQ29tbWFuZCh7XG4gICAgU2VjcmV0SWQ6IHNlY3JldEFybixcbiAgICBTZWNyZXRTdHJpbmc6IEpTT04uc3RyaW5naWZ5KHNlY3JldFZhbHVlKSxcbiAgfSkpO1xufVxuYCxcbiAgICB9KTtcblxuICAgIG5ldyBTYW1wbGVGaWxlKHByb2plY3QsICdzcmMvY29uc3RydWN0cy9oYW5kbGVyL3NlY3JldC9kaWRSYW5kb21Qcm9wZXJ0aWVzQ2hhbmdlLnRzJywge1xuICAgICAgY29udGVudHM6IGAvLyBDb3BpZWQgZnJvbSBAbWF0dGhld2JvbmlnL3NlY3JldCAoTUlULCBodHRwczovL2dpdGh1Yi5jb20vbWJvbmlnL3NlY3JldCkuXG4vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IEJhdG1hbiBhbmQgaXMgeW91cnMgdG8gbW9kaWZ5LlxuZXhwb3J0IGZ1bmN0aW9uIGRpZFJhbmRvbVByb3BlcnRpZXNDaGFuZ2Uob2xkR2VuZXJhdGVTZWNyZXRTdHJpbmc6IGFueSwgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IGFueSkge1xuICByZXR1cm4gb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZUNoYXJhY3RlcnMgIT09IGdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVDaGFyYWN0ZXJzIHx8XG4gICAgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZUxvd2VyY2FzZSAhPT0gZ2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZUxvd2VyY2FzZSB8fFxuICAgIG9sZEdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVOdW1iZXJzICE9PSBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlTnVtYmVycyB8fFxuICAgIG9sZEdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVQdW5jdHVhdGlvbiAhPT0gZ2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZVB1bmN0dWF0aW9uIHx8XG4gICAgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZVVwcGVyY2FzZSAhPT0gZ2VuZXJhdGVTZWNyZXRTdHJpbmcuZXhjbHVkZVVwcGVyY2FzZSB8fFxuICAgIG9sZEdlbmVyYXRlU2VjcmV0U3RyaW5nLmluY2x1ZGVTcGFjZSAhPT0gZ2VuZXJhdGVTZWNyZXRTdHJpbmcuaW5jbHVkZVNwYWNlIHx8XG4gICAgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcucGFzc3dvcmRMZW5ndGggIT09IGdlbmVyYXRlU2VjcmV0U3RyaW5nLnBhc3N3b3JkTGVuZ3RoIHx8XG4gICAgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcucmVxdWlyZUVhY2hJbmNsdWRlZFR5cGUgIT09IGdlbmVyYXRlU2VjcmV0U3RyaW5nLnJlcXVpcmVFYWNoSW5jbHVkZWRUeXBlO1xuXG59XG5gLFxuICAgIH0pO1xuXG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgJ3NyYy9jb25zdHJ1Y3RzL2hhbmRsZXIvc2VjcmV0L3VwZGF0ZVNlY3JldFZhbHVlLnRzJywge1xuICAgICAgY29udGVudHM6IGAvLyBDb3BpZWQgZnJvbSBAbWF0dGhld2JvbmlnL3NlY3JldCAoTUlULCBodHRwczovL2dpdGh1Yi5jb20vbWJvbmlnL3NlY3JldCkuXG4vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IEJhdG1hbiBhbmQgaXMgeW91cnMgdG8gbW9kaWZ5LlxuaW1wb3J0IHtcbiAgR2V0UmFuZG9tUGFzc3dvcmRDb21tYW5kLFxuICBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsXG4gIFB1dFNlY3JldFZhbHVlQ29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgeyBjbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5pbXBvcnQgeyBkaWRSYW5kb21Qcm9wZXJ0aWVzQ2hhbmdlIH0gZnJvbSAnLi9kaWRSYW5kb21Qcm9wZXJ0aWVzQ2hhbmdlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNlY3JldFZhbHVlKHsgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcsIGdlbmVyYXRlU2VjcmV0U3RyaW5nLCBzZWNyZXRBcm4gfToge1xuICBzZWNyZXRBcm46IGFueTtcbiAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IGFueTtcbiAgb2xkR2VuZXJhdGVTZWNyZXRTdHJpbmc6IGFueTtcbn0pIHtcbiAgLy8gbGV0J3MgZ2V0IHRoZSBleGlzdGluZyB2YWx1ZVxuICBjb25zdCBleGlzdGluZ1NlY3JldFZhbHVlID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IEdldFNlY3JldFZhbHVlQ29tbWFuZCh7XG4gICAgU2VjcmV0SWQ6IHNlY3JldEFybixcbiAgfSkpO1xuICAvLyBhbmQgcGFyc2UgdGhlIGV4aXN0aW5nIHZhbHVlXG4gIGxldCBwYXJzZWRWYWx1ZTogYW55ID0ge307XG5cbiAgdHJ5IHtcbiAgICBwYXJzZWRWYWx1ZSA9IEpTT04ucGFyc2UoZXhpc3RpbmdTZWNyZXRWYWx1ZS5TZWNyZXRTdHJpbmchKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gdGhlIGV4aXN0aW5nIHZhbHVlIGNvdWxkbid0IGJlIHBhcnNlZCwgaXQgd2FzIHByb2JhYmx5IGEgcmFuZG9tIHN0cmluZy5cbiAgICAvLyBsZXQncyBnbyBhaGVhZCBhbmQganVzdCBzdGFydCBmcmVzaCB0aGVuLFxuICB9XG5cbiAgLy8gbm93IGxldCdzIGNoZWNrIHdoYXQgcHJvcGVydGllcyBoYXZlIGNoYW5nZWRcbiAgY29uc3QgbmV3U2VjcmV0U3RyaW5nVGVtcGxhdGUgPSBKU09OLnBhcnNlKGdlbmVyYXRlU2VjcmV0U3RyaW5nLnNlY3JldFN0cmluZ1RlbXBsYXRlKTtcbiAgY29uc3Qgb2xkU2VjcmV0U3RyaW5nVGVtcGxhdGUgPSBKU09OLnBhcnNlKG9sZEdlbmVyYXRlU2VjcmV0U3RyaW5nLnNlY3JldFN0cmluZ1RlbXBsYXRlKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gbmV3U2VjcmV0U3RyaW5nVGVtcGxhdGUpIHtcbiAgICBpZiAob2xkU2VjcmV0U3RyaW5nVGVtcGxhdGVba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBvaywgc28gaGVyZSdzIHNvbWV0aGluZyB0byBhZGQuLi5cbiAgICAgIHBhcnNlZFZhbHVlW2tleV0gPSBuZXdTZWNyZXRTdHJpbmdUZW1wbGF0ZVtrZXldO1xuICAgIH1cbiAgICBpZiAob2xkU2VjcmV0U3RyaW5nVGVtcGxhdGVba2V5XSAhPT0gbmV3U2VjcmV0U3RyaW5nVGVtcGxhdGVba2V5XSkge1xuICAgICAgLy8gb2ssIHNvIGhlcmUncyBzb21ldGhpbmcgdG8gdXBkYXRlLi4uXG4gICAgICBwYXJzZWRWYWx1ZVtrZXldID0gbmV3U2VjcmV0U3RyaW5nVGVtcGxhdGVba2V5XTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gb2xkU2VjcmV0U3RyaW5nVGVtcGxhdGUpIHtcbiAgICBpZiAobmV3U2VjcmV0U3RyaW5nVGVtcGxhdGVba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBvaywgc28gaGVyZSdzIHNvbWV0aGluZyB0byByZW1vdmUuLi5cbiAgICAgIGRlbGV0ZSBwYXJzZWRWYWx1ZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRpZCBhbnl0aGluZyBhcm91bmQgdGhlIEdlbmVyYXRlU3RyaW5nS2V5IGNoYW5nZT9cbiAgaWYgKGRpZFJhbmRvbVByb3BlcnRpZXNDaGFuZ2Uob2xkR2VuZXJhdGVTZWNyZXRTdHJpbmcsIGdlbmVyYXRlU2VjcmV0U3RyaW5nKVxuICAgIHx8IGdlbmVyYXRlU2VjcmV0U3RyaW5nLmdlbmVyYXRlU3RyaW5nS2V5ICE9PSBvbGRHZW5lcmF0ZVNlY3JldFN0cmluZy5nZW5lcmF0ZVN0cmluZ0tleSkge1xuICAgIGNvbnN0IHsgUmFuZG9tUGFzc3dvcmQ6IG5ld1JhbmRvbVZhbHVlIH0gPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgR2V0UmFuZG9tUGFzc3dvcmRDb21tYW5kKHtcbiAgICAgIEV4Y2x1ZGVMb3dlcmNhc2U6IGdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVMb3dlcmNhc2UgPT09ICd0cnVlJyxcbiAgICAgIEV4Y2x1ZGVOdW1iZXJzOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlTnVtYmVycyA9PT0gJ3RydWUnLFxuICAgICAgRXhjbHVkZVB1bmN0dWF0aW9uOiBnZW5lcmF0ZVNlY3JldFN0cmluZy5leGNsdWRlUHVuY3R1YXRpb24gPT09ICd0cnVlJyxcbiAgICAgIEV4Y2x1ZGVVcHBlcmNhc2U6IGdlbmVyYXRlU2VjcmV0U3RyaW5nLmV4Y2x1ZGVVcHBlcmNhc2UgPT09ICd0cnVlJyxcbiAgICAgIEluY2x1ZGVTcGFjZTogZ2VuZXJhdGVTZWNyZXRTdHJpbmcuaW5jbHVkZVNwYWNlID09PSAndHJ1ZScsXG4gICAgICBQYXNzd29yZExlbmd0aDogK2dlbmVyYXRlU2VjcmV0U3RyaW5nLnBhc3N3b3JkTGVuZ3RoLFxuICAgICAgUmVxdWlyZUVhY2hJbmNsdWRlZFR5cGU6IGdlbmVyYXRlU2VjcmV0U3RyaW5nLnJlcXVpcmVFYWNoSW5jbHVkZWRUeXBlID09PSAndHJ1ZScsXG4gICAgfSkpO1xuICAgIHBhcnNlZFZhbHVlW2dlbmVyYXRlU2VjcmV0U3RyaW5nLmdlbmVyYXRlU3RyaW5nS2V5XSA9IG5ld1JhbmRvbVZhbHVlO1xuICB9XG5cbiAgLy8gdXBkYXRlIHRoZSBzZWNyZXQgaW4gQVdTXG4gIGF3YWl0IGNsaWVudC5zZW5kKG5ldyBQdXRTZWNyZXRWYWx1ZUNvbW1hbmQoe1xuICAgIFNlY3JldElkOiBzZWNyZXRBcm4sXG4gICAgU2VjcmV0U3RyaW5nOiBKU09OLnN0cmluZ2lmeShwYXJzZWRWYWx1ZSksXG4gIH0pKTtcblxufVxuYCxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjcmV0SGFuZGxlckZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NlY3JldEhhbmRsZXJGaWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBK0M7QUFFL0MsMkNBQXNFO0FBRXRFLE1BQU0sa0JBQWtCLEdBQUcsMkNBQTJDLENBQUM7QUFDdkUsTUFBTSxXQUFXLEdBQUcsK0JBQStCLENBQUM7QUFFcEQ7Ozs7OztHQU1HO0FBQ0gsTUFBYSxrQkFBa0I7SUFDN0IsWUFBWSxPQUE0QjtRQUN0QyxJQUFJLG1CQUFVLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLElBQUEsK0JBQW1CLEVBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUM5RixJQUFJLGtCQUFTLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFBLDhCQUFrQixFQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7Q0FDRjtBQUxELGdEQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2FtcGxlRGlyLCBTYW1wbGVGaWxlIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEF3c0Nka1R5cGVTY3JpcHRBcHAgfSBmcm9tICdwcm9qZW4vbGliL2F3c2Nkayc7XG5pbXBvcnQgeyB0ZW1wbGF0ZURpck9wdGlvbnMsIHRlbXBsYXRlRmlsZU9wdGlvbnMgfSBmcm9tICcuL3RlbXBsYXRlcyc7XG5cbmNvbnN0IEhBTkRMRVJfRU5UUllfUEFUSCA9ICdzcmMvY29uc3RydWN0cy9oYW5kbGVyL1NlY3JldC5GdW5jdGlvbi50cyc7XG5jb25zdCBIQU5ETEVSX0RJUiA9ICdzcmMvY29uc3RydWN0cy9oYW5kbGVyL3NlY3JldCc7XG5cbi8qKlxuICogU2NhZmZvbGRzIHRoZSBMYW1iZGEgaGFuZGxlciBzb3VyY2VzIHVzZWQgYnkgdGhlIGdlbmVyYXRlZCBTZWNyZXQgY29uc3RydWN0XG4gKiAoc3JjL2NvbnN0cnVjdHMvU2VjcmV0LnRzKS4gQ29waWVkIGZyb20gQG1hdHRoZXdib25pZy9zZWNyZXQgKE1JVCkuXG4gKlxuICogVGhlIGVudHJ5IGZpbGUgaXMgZGVsaWJlcmF0ZWx5IG5vdCBuYW1lZCAqLmxhbWJkYS50cywgc28gcHJvamVuJ3MgbGFtYmRhXG4gKiBhdXRvLWRpc2NvdmVyeSBkb2VzIG5vdCBnZW5lcmF0ZSBhIHNlY29uZCBmdW5jdGlvbiBjbGFzcyBmb3IgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWNyZXRIYW5kbGVyRmlsZXMge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwKSB7XG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgSEFORExFUl9FTlRSWV9QQVRILCB0ZW1wbGF0ZUZpbGVPcHRpb25zKHByb2plY3QsIEhBTkRMRVJfRU5UUllfUEFUSCkpO1xuICAgIG5ldyBTYW1wbGVEaXIocHJvamVjdCwgSEFORExFUl9ESVIsIHRlbXBsYXRlRGlyT3B0aW9ucyhwcm9qZWN0LCBIQU5ETEVSX0RJUikpO1xuICB9XG59XG4iXX0=
|
|
@@ -35,7 +35,7 @@ const DEFAULT_GITHUB_OWNER = 'macedon-technologies';
|
|
|
35
35
|
* workflows that wire them together) is templated.
|
|
36
36
|
*/
|
|
37
37
|
class SoftwareFactoryFiles {
|
|
38
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.SoftwareFactoryFiles", version: "1.
|
|
38
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.SoftwareFactoryFiles", version: "1.34.0" };
|
|
39
39
|
constructor(project, options) {
|
|
40
40
|
const { repoName, actionVersions, attestationFiles } = options;
|
|
41
41
|
const githubOwner = options.githubOwner || DEFAULT_GITHUB_OWNER;
|
|
@@ -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.34.0" };
|
|
11
11
|
constructor(project, options) {
|
|
12
12
|
const packageManager = project.package.packageManager;
|
|
13
13
|
const actionVersions = (0, WorkflowActionVersions_1.resolveActionVersions)(options.actionVersions);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Project, SampleDirOptions, SampleFileOptions } from 'projen';
|
|
2
|
+
export declare const TEMPLATE_APP_DIR: string;
|
|
3
|
+
/**
|
|
4
|
+
* Options for a bootstrapped `SampleFile` copied from the template app file at
|
|
5
|
+
* the same path.
|
|
6
|
+
*/
|
|
7
|
+
export declare function templateFileOptions(project: Project, filePath: string, templateRoot?: string): SampleFileOptions;
|
|
8
|
+
/**
|
|
9
|
+
* Options for a bootstrapped `SampleDir` copied from the template app
|
|
10
|
+
* directory at the same path.
|
|
11
|
+
*/
|
|
12
|
+
export declare function templateDirOptions(project: Project, dir: string, templateRoot?: string): SampleDirOptions;
|
|
13
|
+
/**
|
|
14
|
+
* Lines of the template app file at the same path, for a generated `TextFile`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function templateLines(project: Project, filePath: string, templateRoot?: string): string[];
|
package/lib/templates.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.TEMPLATE_APP_DIR = void 0;
|
|
37
|
+
exports.templateFileOptions = templateFileOptions;
|
|
38
|
+
exports.templateDirOptions = templateDirOptions;
|
|
39
|
+
exports.templateLines = templateLines;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
exports.TEMPLATE_APP_DIR = path.join(__dirname, '..', 'templates', 'app');
|
|
43
|
+
const PROJECT_NAME_PLACEHOLDER = '__PROJECT_NAME__';
|
|
44
|
+
const PLACEHOLDER_EXTENSIONS = new Set(['.json', '.yaml', '.yml']);
|
|
45
|
+
function templatePath(templateRoot, relativePath, kind) {
|
|
46
|
+
const source = path.join(templateRoot, relativePath);
|
|
47
|
+
const stat = fs.statSync(source, { throwIfNoEntry: false });
|
|
48
|
+
if (!stat) {
|
|
49
|
+
throw new Error(`Batman template not found: ${source}`);
|
|
50
|
+
}
|
|
51
|
+
if (kind === 'file' ? !stat.isFile() : !stat.isDirectory()) {
|
|
52
|
+
throw new Error(`Batman template is not a ${kind}: ${source}`);
|
|
53
|
+
}
|
|
54
|
+
return source;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The template's text, with `__PROJECT_NAME__` replaced by the project name.
|
|
58
|
+
* Throws when a template other than JSON or YAML contains the placeholder.
|
|
59
|
+
*/
|
|
60
|
+
function templateText(project, source) {
|
|
61
|
+
const text = fs.readFileSync(source, 'utf8');
|
|
62
|
+
if (!text.includes(PROJECT_NAME_PLACEHOLDER)) {
|
|
63
|
+
return { text, substituted: false };
|
|
64
|
+
}
|
|
65
|
+
if (!PLACEHOLDER_EXTENSIONS.has(path.extname(source).toLowerCase())) {
|
|
66
|
+
throw new Error(`${PROJECT_NAME_PLACEHOLDER} is only allowed in JSON and YAML templates, found in ${source}`);
|
|
67
|
+
}
|
|
68
|
+
return { text: text.split(PROJECT_NAME_PLACEHOLDER).join(project.name), substituted: true };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Options for a bootstrapped `SampleFile` copied from the template app file at
|
|
72
|
+
* the same path.
|
|
73
|
+
*/
|
|
74
|
+
function templateFileOptions(project, filePath, templateRoot = exports.TEMPLATE_APP_DIR) {
|
|
75
|
+
const source = templatePath(templateRoot, filePath, 'file');
|
|
76
|
+
const { text, substituted } = templateText(project, source);
|
|
77
|
+
return substituted ? { contents: text } : { sourcePath: source };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Options for a bootstrapped `SampleDir` copied from the template app
|
|
81
|
+
* directory at the same path.
|
|
82
|
+
*/
|
|
83
|
+
function templateDirOptions(project, dir, templateRoot = exports.TEMPLATE_APP_DIR) {
|
|
84
|
+
const sourceDir = templatePath(templateRoot, dir, 'directory');
|
|
85
|
+
const files = {};
|
|
86
|
+
for (const entry of fs.readdirSync(sourceDir, { recursive: true, withFileTypes: true })) {
|
|
87
|
+
if (!entry.isFile()) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const source = path.join(entry.parentPath, entry.name);
|
|
91
|
+
const { text, substituted } = templateText(project, source);
|
|
92
|
+
if (substituted) {
|
|
93
|
+
files[path.relative(sourceDir, source).split(path.sep).join('/')] = text;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return Object.keys(files).length > 0 ? { sourceDir, files } : { sourceDir };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Lines of the template app file at the same path, for a generated `TextFile`.
|
|
100
|
+
*/
|
|
101
|
+
function templateLines(project, filePath, templateRoot = exports.TEMPLATE_APP_DIR) {
|
|
102
|
+
return templateText(project, templatePath(templateRoot, filePath, 'file')).text.split('\n');
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlbXBsYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQ0Esa0RBUUM7QUFNRCxnREFrQkM7QUFLRCxzQ0FNQztBQXRGRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBR2hCLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUUvRSxNQUFNLHdCQUF3QixHQUFHLGtCQUFrQixDQUFDO0FBRXBELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFFbkUsU0FBUyxZQUFZLENBQUMsWUFBb0IsRUFBRSxZQUFvQixFQUFFLElBQTBCO0lBQzFGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JELE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUMzRCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixJQUFJLEtBQUssTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0Qs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QUFnQjtJQUV2QyxPQUFPLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUHJvamVjdCwgU2FtcGxlRGlyT3B0aW9ucywgU2FtcGxlRmlsZU9wdGlvbnMgfSBmcm9tICdwcm9qZW4nO1xuXG5leHBvcnQgY29uc3QgVEVNUExBVEVfQVBQX0RJUiA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICd0ZW1wbGF0ZXMnLCAnYXBwJyk7XG5cbmNvbnN0IFBST0pFQ1RfTkFNRV9QTEFDRUhPTERFUiA9ICdfX1BST0pFQ1RfTkFNRV9fJztcblxuY29uc3QgUExBQ0VIT0xERVJfRVhURU5TSU9OUyA9IG5ldyBTZXQoWycuanNvbicsICcueWFtbCcsICcueW1sJ10pO1xuXG5mdW5jdGlvbiB0ZW1wbGF0ZVBhdGgodGVtcGxhdGVSb290OiBzdHJpbmcsIHJlbGF0aXZlUGF0aDogc3RyaW5nLCBraW5kOiAnZmlsZScgfCAnZGlyZWN0b3J5Jyk6IHN0cmluZyB7XG4gIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbih0ZW1wbGF0ZVJvb3QsIHJlbGF0aXZlUGF0aCk7XG4gIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhzb3VyY2UsIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pO1xuICBpZiAoIXN0YXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEJhdG1hbiB0ZW1wbGF0ZSBub3QgZm91bmQ6ICR7c291cmNlfWApO1xuICB9XG4gIGlmIChraW5kID09PSAnZmlsZScgPyAhc3RhdC5pc0ZpbGUoKSA6ICFzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEJhdG1hbiB0ZW1wbGF0ZSBpcyBub3QgYSAke2tpbmR9OiAke3NvdXJjZX1gKTtcbiAgfVxuICByZXR1cm4gc291cmNlO1xufVxuXG4vKipcbiAqIFRoZSB0ZW1wbGF0ZSdzIHRleHQsIHdpdGggYF9fUFJPSkVDVF9OQU1FX19gIHJlcGxhY2VkIGJ5IHRoZSBwcm9qZWN0IG5hbWUuXG4gKiBUaHJvd3Mgd2hlbiBhIHRlbXBsYXRlIG90aGVyIHRoYW4gSlNPTiBvciBZQU1MIGNvbnRhaW5zIHRoZSBwbGFjZWhvbGRlci5cbiAqL1xuZnVuY3Rpb24gdGVtcGxhdGVUZXh0KHByb2plY3Q6IFByb2plY3QsIHNvdXJjZTogc3RyaW5nKTogeyB0ZXh0OiBzdHJpbmc7IHN1YnN0aXR1dGVkOiBib29sZWFuIH0ge1xuICBjb25zdCB0ZXh0ID0gZnMucmVhZEZpbGVTeW5jKHNvdXJjZSwgJ3V0ZjgnKTtcbiAgaWYgKCF0ZXh0LmluY2x1ZGVzKFBST0pFQ1RfTkFNRV9QTEFDRUhPTERFUikpIHtcbiAgICByZXR1cm4geyB0ZXh0LCBzdWJzdGl0dXRlZDogZmFsc2UgfTtcbiAgfVxuICBpZiAoIVBMQUNFSE9MREVSX0VYVEVOU0lPTlMuaGFzKHBhdGguZXh0bmFtZShzb3VyY2UpLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7UFJPSkVDVF9OQU1FX1BMQUNFSE9MREVSfSBpcyBvbmx5IGFsbG93ZWQgaW4gSlNPTiBhbmQgWUFNTCB0ZW1wbGF0ZXMsIGZvdW5kIGluICR7c291cmNlfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4geyB0ZXh0OiB0ZXh0LnNwbGl0KFBST0pFQ1RfTkFNRV9QTEFDRUhPTERFUikuam9pbihwcm9qZWN0Lm5hbWUpLCBzdWJzdGl0dXRlZDogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgYm9vdHN0cmFwcGVkIGBTYW1wbGVGaWxlYCBjb3BpZWQgZnJvbSB0aGUgdGVtcGxhdGUgYXBwIGZpbGUgYXRcbiAqIHRoZSBzYW1lIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZUZpbGVPcHRpb25zKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICB0ZW1wbGF0ZVJvb3Q6IHN0cmluZyA9IFRFTVBMQVRFX0FQUF9ESVIsXG4pOiBTYW1wbGVGaWxlT3B0aW9ucyB7XG4gIGNvbnN0IHNvdXJjZSA9IHRlbXBsYXRlUGF0aCh0ZW1wbGF0ZVJvb3QsIGZpbGVQYXRoLCAnZmlsZScpO1xuICBjb25zdCB7IHRleHQsIHN1YnN0aXR1dGVkIH0gPSB0ZW1wbGF0ZVRleHQocHJvamVjdCwgc291cmNlKTtcbiAgcmV0dXJuIHN1YnN0aXR1dGVkID8geyBjb250ZW50czogdGV4dCB9IDogeyBzb3VyY2VQYXRoOiBzb3VyY2UgfTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIGJvb3RzdHJhcHBlZCBgU2FtcGxlRGlyYCBjb3BpZWQgZnJvbSB0aGUgdGVtcGxhdGUgYXBwXG4gKiBkaXJlY3RvcnkgYXQgdGhlIHNhbWUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlRGlyT3B0aW9ucyhcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgZGlyOiBzdHJpbmcsXG4gIHRlbXBsYXRlUm9vdDogc3RyaW5nID0gVEVNUExBVEVfQVBQX0RJUixcbik6IFNhbXBsZURpck9wdGlvbnMge1xuICBjb25zdCBzb3VyY2VEaXIgPSB0ZW1wbGF0ZVBhdGgodGVtcGxhdGVSb290LCBkaXIsICdkaXJlY3RvcnknKTtcbiAgY29uc3QgZmlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBmcy5yZWFkZGlyU3luYyhzb3VyY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCB7IHRleHQsIHN1YnN0aXR1dGVkIH0gPSB0ZW1wbGF0ZVRleHQocHJvamVjdCwgc291cmNlKTtcbiAgICBpZiAoc3Vic3RpdHV0ZWQpIHtcbiAgICAgIGZpbGVzW3BhdGgucmVsYXRpdmUoc291cmNlRGlyLCBzb3VyY2UpLnNwbGl0KHBhdGguc2VwKS5qb2luKCcvJyldID0gdGV4dDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKGZpbGVzKS5sZW5ndGggPiAwID8geyBzb3VyY2VEaXIsIGZpbGVzIH0gOiB7IHNvdXJjZURpciB9O1xufVxuXG4vKipcbiAqIExpbmVzIG9mIHRoZSB0ZW1wbGF0ZSBhcHAgZmlsZSBhdCB0aGUgc2FtZSBwYXRoLCBmb3IgYSBnZW5lcmF0ZWQgYFRleHRGaWxlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlTGluZXMoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHRlbXBsYXRlUm9vdDogc3RyaW5nID0gVEVNUExBVEVfQVBQX0RJUixcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHRlbXBsYXRlVGV4dChwcm9qZWN0LCB0ZW1wbGF0ZVBhdGgodGVtcGxhdGVSb290LCBmaWxlUGF0aCwgJ2ZpbGUnKSkudGV4dC5zcGxpdCgnXFxuJyk7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"main": "lib/index.js",
|
|
50
50
|
"license": "Apache-2.0",
|
|
51
51
|
"stability": "stable",
|
|
52
|
-
"version": "1.
|
|
52
|
+
"version": "1.34.0",
|
|
53
53
|
"jest": {
|
|
54
54
|
"coverageProvider": "v8",
|
|
55
55
|
"testMatch": [
|
|
@@ -126,6 +126,7 @@
|
|
|
126
126
|
"release": "projen release",
|
|
127
127
|
"swamp:bootstrap": "projen swamp:bootstrap",
|
|
128
128
|
"test": "projen test",
|
|
129
|
+
"test:templates": "projen test:templates",
|
|
129
130
|
"test:watch": "projen test:watch",
|
|
130
131
|
"unbump": "projen unbump",
|
|
131
132
|
"upgrade": "projen upgrade",
|